diff --git a/include/kernel-5.19 b/include/kernel-5.19 deleted file mode 100644 index d026c5352..000000000 --- a/include/kernel-5.19 +++ /dev/null @@ -1,2 +0,0 @@ -LINUX_VERSION-5.19 = .16 -LINUX_KERNEL_HASH-5.19.16 = a1ebaf667e1059ae2d72aa6374a4d6e2febc0b8ccda6a124687acc2ea961e08d diff --git a/package/kernel/linux/modules/fs.mk b/package/kernel/linux/modules/fs.mk index 9e1c00551..77c61283e 100644 --- a/package/kernel/linux/modules/fs.mk +++ b/package/kernel/linux/modules/fs.mk @@ -109,9 +109,9 @@ define KernelPackage/fs-cifs +kmod-crypto-ccm \ +kmod-crypto-ecb \ +kmod-crypto-des \ - +(LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-asn1-decoder \ - +(LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-oid-registry \ - +(LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-dnsresolver + +(LINUX_5_15||LINUX_6_0):kmod-asn1-decoder \ + +(LINUX_5_15||LINUX_6_0):kmod-oid-registry \ + +(LINUX_5_15||LINUX_6_0):kmod-dnsresolver endef define KernelPackage/fs-cifs/description @@ -530,7 +530,7 @@ $(eval $(call KernelPackage,fs-ntfs)) define KernelPackage/fs-ntfs3 SUBMENU:=$(FS_MENU) TITLE:=NTFS3 Read-Write file system support - DEPENDS:=@(LINUX_5_4||LINUX_5_10||LINUX_5_15||LINUX_5_19||LINUX_6_0) +kmod-nls-base + DEPENDS:=@(LINUX_5_4||LINUX_5_10||LINUX_5_15||LINUX_6_0) +kmod-nls-base KCONFIG:= \ CONFIG_NTFS3_FS \ CONFIG_NTFS3_64BIT_CLUSTER=y \ diff --git a/package/kernel/linux/modules/netdevices.mk b/package/kernel/linux/modules/netdevices.mk index e3e11722e..ad11c76a0 100644 --- a/package/kernel/linux/modules/netdevices.mk +++ b/package/kernel/linux/modules/netdevices.mk @@ -142,7 +142,7 @@ $(eval $(call KernelPackage,mii)) define KernelPackage/mdio-devres SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Supports MDIO device registration - DEPENDS:=@(LINUX_5_10||LINUX_5_15||LINUX_5_19||LINUX_6_0) +kmod-libphy +(TARGET_armvirt||TARGET_bcm27xx_bcm2708||TARGET_tegra):kmod-of-mdio + DEPENDS:=@(LINUX_5_10||LINUX_5_15||LINUX_6_0) +kmod-libphy +(TARGET_armvirt||TARGET_bcm27xx_bcm2708||TARGET_tegra):kmod-of-mdio KCONFIG:=CONFIG_MDIO_DEVRES HIDDEN:=1 FILES:=$(LINUX_DIR)/drivers/net/phy/mdio_devres.ko @@ -563,7 +563,7 @@ $(eval $(call KernelPackage,8139cp)) define KernelPackage/r8169 SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=RealTek RTL-8169 PCI Gigabit Ethernet Adapter kernel support - DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek +(LINUX_5_10||LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-mdio-devres + DEPENDS:=@PCI_SUPPORT +kmod-mii +r8169-firmware +kmod-phy-realtek +(LINUX_5_10||LINUX_5_15||LINUX_6_0):kmod-mdio-devres KCONFIG:= \ CONFIG_R8169 \ CONFIG_R8169_NAPI=y \ @@ -689,7 +689,7 @@ $(eval $(call KernelPackage,igbvf)) define KernelPackage/ixgbe SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=Intel(R) 82598/82599 PCI-Express 10 Gigabit Ethernet support - DEPENDS:=@PCI_SUPPORT +kmod-mdio +kmod-ptp +kmod-hwmon-core +kmod-libphy +(LINUX_5_10||LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-mdio-devres + DEPENDS:=@PCI_SUPPORT +kmod-mdio +kmod-ptp +kmod-hwmon-core +kmod-libphy +(LINUX_5_10||LINUX_5_15||LINUX_6_0):kmod-mdio-devres KCONFIG:=CONFIG_IXGBE \ CONFIG_IXGBE_VXLAN=n \ CONFIG_IXGBE_HWMON=y \ diff --git a/package/kernel/linux/modules/netsupport.mk b/package/kernel/linux/modules/netsupport.mk index 24cd0857c..c4741328b 100644 --- a/package/kernel/linux/modules/netsupport.mk +++ b/package/kernel/linux/modules/netsupport.mk @@ -1334,7 +1334,7 @@ define KernelPackage/qrtr SUBMENU:=$(NETWORK_SUPPORT_MENU) TITLE:=Qualcomm IPC Router support HIDDEN:=1 - DEPENDS:=@(LINUX_5_15||LINUX_5_19) + DEPENDS:=@(LINUX_5_15||LINUX_6_0) KCONFIG:=CONFIG_QRTR FILES:= \ $(LINUX_DIR)/net/qrtr/qrtr.ko \ diff --git a/package/kernel/linux/modules/other.mk b/package/kernel/linux/modules/other.mk index c2603cea5..311048b28 100644 --- a/package/kernel/linux/modules/other.mk +++ b/package/kernel/linux/modules/other.mk @@ -1136,8 +1136,8 @@ $(eval $(call KernelPackage,keys-trusted)) define KernelPackage/tpm SUBMENU:=$(OTHER_MENU) TITLE:=TPM Hardware Support - DEPENDS:= +kmod-random-core +(LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-asn1-decoder \ - +(LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-asn1-encoder +(LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-oid-registry + DEPENDS:= +kmod-random-core +(LINUX_5_15||LINUX_6_0):kmod-asn1-decoder \ + +(LINUX_5_15||LINUX_6_0):kmod-asn1-encoder +(LINUX_5_15||LINUX_6_0):kmod-oid-registry KCONFIG:= CONFIG_TCG_TPM FILES:= $(LINUX_DIR)/drivers/char/tpm/tpm.ko AUTOLOAD:=$(call AutoLoad,10,tpm,1) @@ -1283,7 +1283,7 @@ $(eval $(call KernelPackage,qcom-qmi-helpers)) define KernelPackage/mhi SUBMENU:=$(OTHER_MENU) TITLE:=Modem Host Interface (MHI) bus - DEPENDS:=@(LINUX_5_15||LINUX_5_19||LINUX_6_0) + DEPENDS:=@(LINUX_5_15||LINUX_6_0) KCONFIG:=CONFIG_MHI_BUS \ CONFIG_MHI_BUS_DEBUG=y \ CONFIG_MHI_BUS_PCI_GENERIC=n \ diff --git a/package/kernel/linux/modules/usb.mk b/package/kernel/linux/modules/usb.mk index 1f0296e53..0116350b9 100644 --- a/package/kernel/linux/modules/usb.mk +++ b/package/kernel/linux/modules/usb.mk @@ -1138,7 +1138,7 @@ $(eval $(call KernelPackage,usb-net-aqc111)) define KernelPackage/usb-net-asix TITLE:=Kernel module for USB-to-Ethernet Asix convertors - DEPENDS:=+kmod-libphy +(LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-mdio-devres + DEPENDS:=+kmod-libphy +(LINUX_5_15||LINUX_6_0):kmod-mdio-devres KCONFIG:=CONFIG_USB_NET_AX8817X FILES:= \ $(LINUX_DIR)/drivers/$(USBNET_DIR)/asix.ko \ diff --git a/package/kernel/linux/modules/video.mk b/package/kernel/linux/modules/video.mk index 975b3c5cd..c73ddb1e9 100644 --- a/package/kernel/linux/modules/video.mk +++ b/package/kernel/linux/modules/video.mk @@ -244,7 +244,7 @@ define KernelPackage/drm TITLE:=Direct Rendering Manager (DRM) support HIDDEN:=1 DEPENDS:=+kmod-dma-buf +kmod-i2c-core +kmod-i2c-algo-bit +PACKAGE_kmod-backlight:kmod-backlight \ - +(LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-fb + +(LINUX_5_15||LINUX_6_0):kmod-fb KCONFIG:= \ CONFIG_DRM \ CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y \ @@ -266,7 +266,7 @@ $(eval $(call KernelPackage,drm)) define KernelPackage/drm-buddy SUBMENU:=$(VIDEO_MENU) TITLE:=A page based buddy allocator - DEPENDS:=@TARGET_x86 @DISPLAY_SUPPORT +kmod-drm @(LINUX_5_19||LINUX_6_0) + DEPENDS:=@TARGET_x86 @DISPLAY_SUPPORT +kmod-drm @LINUX_6_0 KCONFIG:=CONFIG_DRM_BUDDY FILES:= $(LINUX_DIR)/drivers/gpu/drm/drm_buddy.ko AUTOLOAD:=$(call AutoProbe,drm_buddy) @@ -311,7 +311,7 @@ $(eval $(call KernelPackage,drm-kms-helper)) define KernelPackage/drm-display-helper SUBMENU:=$(VIDEO_MENU) TITLE:=DRM helpers for display adapters drivers - DEPENDS:=@DISPLAY_SUPPORT +kmod-drm +TARGET_x86:kmod-drm-buddy @(LINUX_5_19||LINUX_6_0) + DEPENDS:=@DISPLAY_SUPPORT +kmod-drm +TARGET_x86:kmod-drm-buddy @LINUX_6_0 KCONFIG:=CONFIG_DRM_DISPLAY_HELPER FILES:=$(LINUX_DIR)/drivers/gpu/drm/display/drm_display_helper.ko AUTOLOAD:=$(call AutoProbe,drm_display_helper) @@ -328,7 +328,7 @@ define KernelPackage/drm-amdgpu TITLE:=AMDGPU DRM support DEPENDS:=@TARGET_x86 @DISPLAY_SUPPORT +kmod-backlight +kmod-drm-ttm \ +kmod-drm-kms-helper +kmod-i2c-algo-bit +amdgpu-firmware \ - +(LINUX_5_19||LINUX_6_0):kmod-drm-display-helper + +LINUX_6_0:kmod-drm-display-helper KCONFIG:=CONFIG_DRM_AMDGPU \ CONFIG_DRM_AMDGPU_SI=y \ CONFIG_DRM_AMDGPU_CIK=y \ @@ -1103,7 +1103,7 @@ define KernelPackage/drm-i915 SUBMENU:=$(VIDEO_MENU) TITLE:=Intel GPU drm support DEPENDS:=@TARGET_x86 +kmod-drm-ttm +kmod-drm-kms-helper +i915-firmware \ - +(LINUX_5_19||LINUX_6_0):kmod-drm-display-helper + +LINUX_6_0:kmod-drm-display-helper KCONFIG:= \ CONFIG_INTEL_GTT \ CONFIG_DRM_I915 \ diff --git a/package/kernel/mac80211/ath.mk b/package/kernel/mac80211/ath.mk index 169c51d6e..95a45ac49 100644 --- a/package/kernel/mac80211/ath.mk +++ b/package/kernel/mac80211/ath.mk @@ -346,7 +346,7 @@ define KernelPackage/ath11k-ahb $(call KernelPackage/mac80211/Default) TITLE:=Qualcomm 802.11ax AHB wireless chipset support URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k - DEPENDS+= @(TARGET_ipq60xx||TARGET_ipq807x) +kmod-ath11k +(LINUX_5_15||LINUX_5_19):kmod-qrtr-smd + DEPENDS+= @(TARGET_ipq60xx||TARGET_ipq807x) +kmod-ath11k +LINUX_5_15:kmod-qrtr-smd FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k_ahb.ko AUTOLOAD:=$(call AutoProbe,ath11k_ahb) endef @@ -360,7 +360,7 @@ define KernelPackage/ath11k-pci $(call KernelPackage/mac80211/Default) TITLE:=Qualcomm 802.11ax PCI wireless chipset support URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath11k - DEPENDS+= @PCI_SUPPORT +(LINUX_5_15||LINUX_5_19):kmod-qrtr-mhi +kmod-ath11k + DEPENDS+= @PCI_SUPPORT +LINUX_5_15:kmod-qrtr-mhi +kmod-ath11k FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath11k/ath11k_pci.ko AUTOLOAD:=$(call AutoProbe,ath11k_pci) endef diff --git a/target/linux/generic/backport-5.19/001-CONFIG_INITRAMFS_PRESERVE_MTIME.patch b/target/linux/generic/backport-5.19/001-CONFIG_INITRAMFS_PRESERVE_MTIME.patch deleted file mode 100644 index cbada68b4..000000000 --- a/target/linux/generic/backport-5.19/001-CONFIG_INITRAMFS_PRESERVE_MTIME.patch +++ /dev/null @@ -1,75 +0,0 @@ ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -1380,16 +1380,6 @@ config BOOT_CONFIG_EMBED_FILE - This bootconfig will be used if there is no initrd or no other - bootconfig in the initrd. - --config INITRAMFS_PRESERVE_MTIME -- bool "Preserve cpio archive mtimes in initramfs" -- default y -- help -- Each entry in an initramfs cpio archive carries an mtime value. When -- enabled, extracted cpio items take this mtime, with directory mtime -- setting deferred until after creation of any child entries. -- -- If unsure, say Y. -- - choice - prompt "Compiler optimization level" - default CC_OPTIMIZE_FOR_PERFORMANCE ---- a/init/initramfs.c -+++ b/init/initramfs.c -@@ -127,17 +127,15 @@ static void __init free_hash(void) - } - } - --#ifdef CONFIG_INITRAMFS_PRESERVE_MTIME --static void __init do_utime(char *filename, time64_t mtime) -+static long __init do_utime(char *filename, time64_t mtime) - { -- struct timespec64 t[2] = { { .tv_sec = mtime }, { .tv_sec = mtime } }; -- init_utimes(filename, t); --} -+ struct timespec64 t[2]; - --static void __init do_utime_path(const struct path *path, time64_t mtime) --{ -- struct timespec64 t[2] = { { .tv_sec = mtime }, { .tv_sec = mtime } }; -- vfs_utimes(path, t); -+ t[0].tv_sec = mtime; -+ t[0].tv_nsec = 0; -+ t[1].tv_sec = mtime; -+ t[1].tv_nsec = 0; -+ return init_utimes(filename, t); - } - - static __initdata LIST_HEAD(dir_list); -@@ -170,12 +168,6 @@ static void __init dir_utime(void) - kfree(de); - } - } --#else --static void __init do_utime(char *filename, time64_t mtime) {} --static void __init do_utime_path(const struct path *path, time64_t mtime) {} --static void __init dir_add(const char *name, time64_t mtime) {} --static void __init dir_utime(void) {} --#endif - - static __initdata time64_t mtime; - -@@ -407,10 +399,14 @@ static int __init do_name(void) - static int __init do_copy(void) - { - if (byte_count >= body_len) { -+ struct timespec64 t[2] = { }; - if (xwrite(wfile, victim, body_len, &wfile_pos) != body_len) - error("write error"); - -- do_utime_path(&wfile->f_path, mtime); -+ t[0].tv_sec = mtime; -+ t[1].tv_sec = mtime; -+ vfs_utimes(&wfile->f_path, t); -+ - fput(wfile); - if (csum_present && io_csum != hdr_csum) - error("bad data checksum"); diff --git a/target/linux/generic/backport-5.19/002-struct-net_device.patch b/target/linux/generic/backport-5.19/002-struct-net_device.patch deleted file mode 100644 index 869d14d91..000000000 --- a/target/linux/generic/backport-5.19/002-struct-net_device.patch +++ /dev/null @@ -1,122 +0,0 @@ ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -2133,8 +2133,6 @@ struct net_device { - - /* Protocol-specific pointers */ - -- struct in_device __rcu *ip_ptr; -- struct inet6_dev __rcu *ip6_ptr; - #if IS_ENABLED(CONFIG_VLAN_8021Q) - struct vlan_info __rcu *vlan_info; - #endif -@@ -2147,18 +2145,16 @@ struct net_device { - #if IS_ENABLED(CONFIG_ATALK) - void *atalk_ptr; - #endif -+ struct in_device __rcu *ip_ptr; - #if IS_ENABLED(CONFIG_DECNET) - struct dn_dev __rcu *dn_ptr; - #endif -+ struct inet6_dev __rcu *ip6_ptr; - #if IS_ENABLED(CONFIG_AX25) - void *ax25_ptr; - #endif --#if IS_ENABLED(CONFIG_CFG80211) - struct wireless_dev *ieee80211_ptr; --#endif --#if IS_ENABLED(CONFIG_IEEE802154) || IS_ENABLED(CONFIG_6LOWPAN) - struct wpan_dev *ieee802154_ptr; --#endif - #if IS_ENABLED(CONFIG_MPLS_ROUTING) - struct mpls_dev __rcu *mpls_ptr; - #endif ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -8085,9 +8085,7 @@ int cfg80211_register_netdevice(struct n - */ - static inline void cfg80211_unregister_netdevice(struct net_device *dev) - { --#if IS_ENABLED(CONFIG_CFG80211) - cfg80211_unregister_wdev(dev->ieee80211_ptr); --#endif - } - - /** ---- a/include/net/cfg802154.h -+++ b/include/net/cfg802154.h -@@ -373,7 +373,6 @@ struct wpan_dev { - - #define to_phy(_dev) container_of(_dev, struct wpan_phy, dev) - --#if IS_ENABLED(CONFIG_IEEE802154) || IS_ENABLED(CONFIG_6LOWPAN) - static inline int - wpan_dev_hard_header(struct sk_buff *skb, struct net_device *dev, - const struct ieee802154_addr *daddr, -@@ -384,7 +383,6 @@ wpan_dev_hard_header(struct sk_buff *skb - - return wpan_dev->header_ops->create(skb, dev, daddr, saddr, len); - } --#endif - - struct wpan_phy * - wpan_phy_new(const struct cfg802154_ops *ops, size_t priv_size); ---- a/net/batman-adv/hard-interface.c -+++ b/net/batman-adv/hard-interface.c -@@ -308,11 +308,9 @@ static bool batadv_is_cfg80211_netdev(st - if (!net_device) - return false; - --#if IS_ENABLED(CONFIG_CFG80211) - /* cfg80211 drivers have to set ieee80211_ptr */ - if (net_device->ieee80211_ptr) - return true; --#endif - - return false; - } ---- a/net/core/net-sysfs.c -+++ b/net/core/net-sysfs.c -@@ -747,6 +747,7 @@ static const struct attribute_group nets - .attrs = netstat_attrs, - }; - -+#if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211) - static struct attribute *wireless_attrs[] = { - NULL - }; -@@ -755,19 +756,7 @@ static const struct attribute_group wire - .name = "wireless", - .attrs = wireless_attrs, - }; -- --static bool wireless_group_needed(struct net_device *ndev) --{ --#if IS_ENABLED(CONFIG_CFG80211) -- if (ndev->ieee80211_ptr) -- return true; - #endif --#if IS_ENABLED(CONFIG_WIRELESS_EXT) -- if (ndev->wireless_handlers) -- return true; --#endif -- return false; --} - - #else /* CONFIG_SYSFS */ - #define net_class_groups NULL -@@ -2008,8 +1997,14 @@ int netdev_register_kobject(struct net_d - - *groups++ = &netstat_group; - -- if (wireless_group_needed(ndev)) -+#if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211) -+ if (ndev->ieee80211_ptr) -+ *groups++ = &wireless_group; -+#if IS_ENABLED(CONFIG_WIRELESS_EXT) -+ else if (ndev->wireless_handlers) - *groups++ = &wireless_group; -+#endif -+#endif - #endif /* CONFIG_SYSFS */ - - error = device_add(dev); diff --git a/target/linux/generic/backport-5.19/011-kbuild-export-SUBARCH.patch b/target/linux/generic/backport-5.19/011-kbuild-export-SUBARCH.patch deleted file mode 100644 index 120b6e4cf..000000000 --- a/target/linux/generic/backport-5.19/011-kbuild-export-SUBARCH.patch +++ /dev/null @@ -1,21 +0,0 @@ -From 173019b66dcc9d68ad9333aa744dad1e369b5aa8 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sun, 9 Jul 2017 00:26:53 +0200 -Subject: [PATCH 34/34] kernel: add compile fix for linux 4.9 on x86 - -Signed-off-by: Felix Fietkau ---- - Makefile | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/Makefile -+++ b/Makefile -@@ -534,7 +534,7 @@ KBUILD_LDFLAGS_MODULE := - KBUILD_LDFLAGS := - CLANG_FLAGS := - --export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC HOSTPKG_CONFIG -+export ARCH SRCARCH SUBARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC HOSTPKG_CONFIG - export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL - export PERL PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX - export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD diff --git a/target/linux/generic/backport-5.19/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch b/target/linux/generic/backport-5.19/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch deleted file mode 100644 index 826e0185e..000000000 --- a/target/linux/generic/backport-5.19/343-netfilter-nft_flow_offload-handle-netdevice-events-f.patch +++ /dev/null @@ -1,106 +0,0 @@ -From: Pablo Neira Ayuso -Date: Thu, 25 Jan 2018 12:58:55 +0100 -Subject: [PATCH] netfilter: nft_flow_offload: handle netdevice events from - nf_flow_table - -Move the code that deals with device events to the core. - -Signed-off-by: Pablo Neira Ayuso ---- - ---- a/net/netfilter/nf_flow_table_core.c -+++ b/net/netfilter/nf_flow_table_core.c -@@ -619,13 +619,41 @@ void nf_flow_table_free(struct nf_flowta - } - EXPORT_SYMBOL_GPL(nf_flow_table_free); - -+static int nf_flow_table_netdev_event(struct notifier_block *this, -+ unsigned long event, void *ptr) -+{ -+ struct net_device *dev = netdev_notifier_info_to_dev(ptr); -+ -+ if (event != NETDEV_DOWN) -+ return NOTIFY_DONE; -+ -+ nf_flow_table_cleanup(dev); -+ -+ return NOTIFY_DONE; -+} -+ -+static struct notifier_block flow_offload_netdev_notifier = { -+ .notifier_call = nf_flow_table_netdev_event, -+}; -+ - static int __init nf_flow_table_module_init(void) - { -- return nf_flow_table_offload_init(); -+ int ret; -+ -+ ret = nf_flow_table_offload_init(); -+ if (ret) -+ return ret; -+ -+ ret = register_netdevice_notifier(&flow_offload_netdev_notifier); -+ if (ret) -+ nf_flow_table_offload_exit(); -+ -+ return ret; - } - - static void __exit nf_flow_table_module_exit(void) - { -+ unregister_netdevice_notifier(&flow_offload_netdev_notifier); - nf_flow_table_offload_exit(); - } - ---- a/net/netfilter/nft_flow_offload.c -+++ b/net/netfilter/nft_flow_offload.c -@@ -468,47 +468,14 @@ static struct nft_expr_type nft_flow_off - .owner = THIS_MODULE, - }; - --static int flow_offload_netdev_event(struct notifier_block *this, -- unsigned long event, void *ptr) --{ -- struct net_device *dev = netdev_notifier_info_to_dev(ptr); -- -- if (event != NETDEV_DOWN) -- return NOTIFY_DONE; -- -- nf_flow_table_cleanup(dev); -- -- return NOTIFY_DONE; --} -- --static struct notifier_block flow_offload_netdev_notifier = { -- .notifier_call = flow_offload_netdev_event, --}; -- - static int __init nft_flow_offload_module_init(void) - { -- int err; -- -- err = register_netdevice_notifier(&flow_offload_netdev_notifier); -- if (err) -- goto err; -- -- err = nft_register_expr(&nft_flow_offload_type); -- if (err < 0) -- goto register_expr; -- -- return 0; -- --register_expr: -- unregister_netdevice_notifier(&flow_offload_netdev_notifier); --err: -- return err; -+ return nft_register_expr(&nft_flow_offload_type); - } - - static void __exit nft_flow_offload_module_exit(void) - { - nft_unregister_expr(&nft_flow_offload_type); -- unregister_netdevice_notifier(&flow_offload_netdev_notifier); - } - - module_init(nft_flow_offload_module_init); diff --git a/target/linux/generic/config-5.19 b/target/linux/generic/config-5.19 deleted file mode 100644 index 6c543c5ad..000000000 --- a/target/linux/generic/config-5.19 +++ /dev/null @@ -1,7488 +0,0 @@ -# CONFIG_104_QUAD_8 is not set -CONFIG_32BIT=y -CONFIG_64BIT_TIME=y -# CONFIG_6LOWPAN is not set -# CONFIG_6LOWPAN_DEBUGFS is not set -# CONFIG_6PACK is not set -# CONFIG_8139CP is not set -# CONFIG_8139TOO is not set -# CONFIG_9P_FS is not set -# CONFIG_AB3100_CORE is not set -# CONFIG_AB8500_CORE is not set -# CONFIG_ABP060MG is not set -# CONFIG_ABX500_CORE is not set -# CONFIG_ACCESSIBILITY is not set -# CONFIG_ACENIC is not set -# CONFIG_ACERHDF is not set -# CONFIG_ACER_WIRELESS is not set -# CONFIG_ACORN_PARTITION is not set -# CONFIG_ACPI_ALS is not set -# CONFIG_ACPI_APEI is not set -# CONFIG_ACPI_BUTTON is not set -# CONFIG_ACPI_CONFIGFS is not set -# CONFIG_ACPI_CUSTOM_METHOD is not set -# CONFIG_ACPI_EXTLOG is not set -# CONFIG_ACPI_HED is not set -# CONFIG_ACPI_NFIT is not set -# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set -# CONFIG_ACPI_TABLE_UPGRADE is not set -# CONFIG_ACPI_VIDEO is not set -# CONFIG_AD2S1200 is not set -# CONFIG_AD2S1210 is not set -# CONFIG_AD2S90 is not set -# CONFIG_AD5064 is not set -# CONFIG_AD525X_DPOT is not set -# CONFIG_AD5272 is not set -# CONFIG_AD5360 is not set -# CONFIG_AD5380 is not set -# CONFIG_AD5421 is not set -# CONFIG_AD5446 is not set -# CONFIG_AD5449 is not set -# CONFIG_AD5504 is not set -# CONFIG_AD5592R is not set -# CONFIG_AD5593R is not set -# CONFIG_AD5624R_SPI is not set -# CONFIG_AD5686 is not set -# CONFIG_AD5686_SPI is not set -# CONFIG_AD5696_I2C is not set -# CONFIG_AD5755 is not set -# CONFIG_AD5758 is not set -# CONFIG_AD5761 is not set -# CONFIG_AD5764 is not set -# CONFIG_AD5766 is not set -# CONFIG_AD5770R is not set -# CONFIG_AD5791 is not set -# CONFIG_AD5933 is not set -# CONFIG_AD7091R5 is not set -# CONFIG_AD7124 is not set -# CONFIG_AD7150 is not set -# CONFIG_AD7152 is not set -# CONFIG_AD7192 is not set -# CONFIG_AD7266 is not set -# CONFIG_AD7280 is not set -# CONFIG_AD7291 is not set -# CONFIG_AD7292 is not set -# CONFIG_AD7298 is not set -# CONFIG_AD7303 is not set -# CONFIG_AD7476 is not set -# CONFIG_AD7606 is not set -# CONFIG_AD7606_IFACE_PARALLEL is not set -# CONFIG_AD7606_IFACE_SPI is not set -# CONFIG_AD7746 is not set -# CONFIG_AD7766 is not set -# CONFIG_AD7768_1 is not set -# CONFIG_AD7780 is not set -# CONFIG_AD7791 is not set -# CONFIG_AD7793 is not set -# CONFIG_AD7816 is not set -# CONFIG_AD7887 is not set -# CONFIG_AD7923 is not set -# CONFIG_AD7949 is not set -# CONFIG_AD799X is not set -# CONFIG_AD8366 is not set -# CONFIG_AD8801 is not set -# CONFIG_AD9467 is not set -# CONFIG_AD9523 is not set -# CONFIG_AD9832 is not set -# CONFIG_AD9834 is not set -# CONFIG_ADAPTEC_STARFIRE is not set -# CONFIG_ADE7854 is not set -# CONFIG_ADF4350 is not set -# CONFIG_ADF4371 is not set -# CONFIG_ADFS_FS is not set -# CONFIG_ADIN1100_PHY is not set -# CONFIG_ADIN_PHY is not set -# CONFIG_ADIS16080 is not set -# CONFIG_ADIS16130 is not set -# CONFIG_ADIS16136 is not set -# CONFIG_ADIS16201 is not set -# CONFIG_ADIS16203 is not set -# CONFIG_ADIS16209 is not set -# CONFIG_ADIS16240 is not set -# CONFIG_ADIS16260 is not set -# CONFIG_ADIS16400 is not set -# CONFIG_ADIS16460 is not set -# CONFIG_ADIS16475 is not set -# CONFIG_ADIS16480 is not set -# CONFIG_ADI_AXI_ADC is not set -# CONFIG_ADJD_S311 is not set -# CONFIG_ADM6996_PHY is not set -# CONFIG_ADM8211 is not set -# CONFIG_ADT7316 is not set -# CONFIG_ADUX1020 is not set -CONFIG_ADVISE_SYSCALLS=y -# CONFIG_ADV_SWBUTTON is not set -# CONFIG_ADXL345_I2C is not set -# CONFIG_ADXL345_SPI is not set -# CONFIG_ADXL372_I2C is not set -# CONFIG_ADXL372_SPI is not set -# CONFIG_ADXRS290 is not set -# CONFIG_ADXRS450 is not set -CONFIG_AEABI=y -# CONFIG_AFE4403 is not set -# CONFIG_AFE4404 is not set -# CONFIG_AFFS_FS is not set -# CONFIG_AFS_DEBUG_CURSOR is not set -# CONFIG_AFS_FS is not set -# CONFIG_AF_KCM is not set -# CONFIG_AF_RXRPC is not set -# CONFIG_AF_RXRPC_INJECT_LOSS is not set -# CONFIG_AF_RXRPC_IPV6 is not set -# CONFIG_AF_UNIX_OOB is not set -# CONFIG_AGP is not set -# CONFIG_AHCI_CEVA is not set -# CONFIG_AHCI_IMX is not set -# CONFIG_AHCI_MVEBU is not set -# CONFIG_AHCI_QORIQ is not set -CONFIG_AIO=y -# CONFIG_AIRO is not set -# CONFIG_AIRO_CS is not set -# CONFIG_AIX_PARTITION is not set -# CONFIG_AK09911 is not set -# CONFIG_AK8974 is not set -# CONFIG_AK8975 is not set -# CONFIG_AL3010 is not set -# CONFIG_AL3320A is not set -# CONFIG_ALIM7101_WDT is not set -CONFIG_ALLOW_DEV_COREDUMP=y -# CONFIG_ALTERA_MBOX is not set -# CONFIG_ALTERA_MSGDMA is not set -# CONFIG_ALTERA_STAPL is not set -# CONFIG_ALTERA_TSE is not set -# CONFIG_ALX is not set -# CONFIG_AL_FIC is not set -# CONFIG_AM2315 is not set -# CONFIG_AM335X_PHY_USB is not set -# CONFIG_AMBA_PL08X is not set -# CONFIG_AMD8111_ETH is not set -# CONFIG_AMD_MEM_ENCRYPT is not set -# CONFIG_AMD_PHY is not set -# CONFIG_AMD_XGBE is not set -# CONFIG_AMD_XGBE_HAVE_ECC is not set -# CONFIG_AMIGA_PARTITION is not set -# CONFIG_AMILO_RFKILL is not set -# CONFIG_AMT is not set -# CONFIG_ANDROID is not set -CONFIG_ANON_INODES=y -# CONFIG_ANON_VMA_NAME is not set -# CONFIG_APDS9300 is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_APDS9960 is not set -# CONFIG_APM8018X is not set -# CONFIG_APM_EMULATION is not set -# CONFIG_APPLE_AIC is not set -# CONFIG_APPLE_GMUX is not set -# CONFIG_APPLE_MFI_FASTCHARGE is not set -# CONFIG_APPLE_PROPERTIES is not set -# CONFIG_APPLICOM is not set -# CONFIG_AQTION is not set -# CONFIG_AQUANTIA_PHY is not set -# CONFIG_AR5523 is not set -# CONFIG_AR7 is not set -# CONFIG_AR8216_PHY is not set -# CONFIG_AR8216_PHY_LEDS is not set -# CONFIG_ARCH_ACTIONS is not set -# CONFIG_ARCH_AGILEX is not set -# CONFIG_ARCH_ALPINE is not set -# CONFIG_ARCH_APPLE is not set -# CONFIG_ARCH_ARTPEC is not set -# CONFIG_ARCH_ASPEED is not set -# CONFIG_ARCH_AT91 is not set -# CONFIG_ARCH_AXXIA is not set -# CONFIG_ARCH_BCM is not set -# CONFIG_ARCH_BCM2835 is not set -# CONFIG_ARCH_BCM4908 is not set -# CONFIG_ARCH_BCM_21664 is not set -# CONFIG_ARCH_BCM_23550 is not set -# CONFIG_ARCH_BCM_281XX is not set -# CONFIG_ARCH_BCM_5301X is not set -# CONFIG_ARCH_BCM_53573 is not set -# CONFIG_ARCH_BCM_63XX is not set -# CONFIG_ARCH_BCM_CYGNUS is not set -# CONFIG_ARCH_BCM_IPROC is not set -# CONFIG_ARCH_BCM_NSP is not set -# CONFIG_ARCH_BERLIN is not set -CONFIG_ARCH_BINFMT_ELF_STATE=y -# CONFIG_ARCH_BITMAIN is not set -# CONFIG_ARCH_BRCMSTB is not set -# CONFIG_ARCH_CLPS711X is not set -# CONFIG_ARCH_CNS3XXX is not set -# CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE is not set -# CONFIG_ARCH_DAVINCI is not set -# CONFIG_ARCH_DIGICOLOR is not set -# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set -# CONFIG_ARCH_DOVE is not set -# CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_EP93XX is not set -# CONFIG_ARCH_EXYNOS is not set -CONFIG_ARCH_FLATMEM_ENABLE=y -# CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_GEMINI is not set -# CONFIG_ARCH_HI3xxx is not set -# CONFIG_ARCH_HIGHBANK is not set -# CONFIG_ARCH_HISI is not set -# CONFIG_ARCH_INTEGRATOR is not set -# CONFIG_ARCH_INTEL_SOCFPGA is not set -# CONFIG_ARCH_IOP13XX is not set -# CONFIG_ARCH_IOP32X is not set -# CONFIG_ARCH_IOP33X is not set -# CONFIG_ARCH_IXP4XX is not set -# CONFIG_ARCH_K3 is not set -# CONFIG_ARCH_KEEMBAY is not set -# CONFIG_ARCH_KEYSTONE is not set -# CONFIG_ARCH_KS8695 is not set -# CONFIG_ARCH_LAYERSCAPE is not set -# CONFIG_ARCH_LG1K is not set -# CONFIG_ARCH_LPC32XX is not set -# CONFIG_ARCH_MEDIATEK is not set -# CONFIG_ARCH_MESON is not set -# CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE is not set -# CONFIG_ARCH_MILBEAUT is not set -CONFIG_ARCH_MMAP_RND_BITS=18 -CONFIG_ARCH_MMAP_RND_BITS_MAX=16 -CONFIG_ARCH_MMAP_RND_BITS_MIN=8 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 -# CONFIG_ARCH_MMP is not set -# CONFIG_ARCH_MSTARV7 is not set -# CONFIG_ARCH_MULTIPLATFORM is not set -# CONFIG_ARCH_MULTI_V6 is not set -# CONFIG_ARCH_MULTI_V7 is not set -# CONFIG_ARCH_MV78XX0 is not set -# CONFIG_ARCH_MVEBU is not set -# CONFIG_ARCH_MXC is not set -# CONFIG_ARCH_MXS is not set -# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set -# CONFIG_ARCH_NETX is not set -# CONFIG_ARCH_NOMADIK is not set -# CONFIG_ARCH_NPCM is not set -# CONFIG_ARCH_NSPIRE is not set -# CONFIG_ARCH_OMAP is not set -# CONFIG_ARCH_OMAP1 is not set -# CONFIG_ARCH_OMAP2 is not set -# CONFIG_ARCH_OMAP2PLUS is not set -# CONFIG_ARCH_OMAP3 is not set -# CONFIG_ARCH_OMAP4 is not set -# CONFIG_ARCH_ORION5X is not set -# CONFIG_ARCH_OXNAS is not set -# CONFIG_ARCH_PICOXCELL is not set -# CONFIG_ARCH_PRIMA2 is not set -# CONFIG_ARCH_PXA is not set -# CONFIG_ARCH_QCOM is not set -# CONFIG_ARCH_RANDOM is not set -# CONFIG_ARCH_RDA is not set -# CONFIG_ARCH_REALTEK is not set -# CONFIG_ARCH_REALVIEW is not set -# CONFIG_ARCH_RENESAS is not set -# CONFIG_ARCH_ROCKCHIP is not set -# CONFIG_ARCH_RPC is not set -# CONFIG_ARCH_S32 is not set -# CONFIG_ARCH_S3C24XX is not set -# CONFIG_ARCH_S3C64XX is not set -# CONFIG_ARCH_S5PV210 is not set -# CONFIG_ARCH_SA1100 is not set -# CONFIG_ARCH_SEATTLE is not set -# CONFIG_ARCH_SHMOBILE is not set -# CONFIG_ARCH_SIRF is not set -# CONFIG_ARCH_SOCFPGA is not set -# CONFIG_ARCH_SPARX5 is not set -# CONFIG_ARCH_SPRD is not set -# CONFIG_ARCH_STI is not set -# CONFIG_ARCH_STM32 is not set -# CONFIG_ARCH_STRATIX10 is not set -# CONFIG_ARCH_SUNXI is not set -# CONFIG_ARCH_SYNQUACER is not set -# CONFIG_ARCH_TANGO is not set -# CONFIG_ARCH_TEGRA is not set -# CONFIG_ARCH_THUNDER is not set -# CONFIG_ARCH_THUNDER2 is not set -# CONFIG_ARCH_U300 is not set -# CONFIG_ARCH_U8500 is not set -# CONFIG_ARCH_UNIPHIER is not set -# CONFIG_ARCH_VERSATILE is not set -# CONFIG_ARCH_VEXPRESS is not set -# CONFIG_ARCH_VIRT is not set -# CONFIG_ARCH_VISCONTI is not set -# CONFIG_ARCH_VT8500 is not set -# CONFIG_ARCH_VULCAN is not set -# CONFIG_ARCH_W90X900 is not set -# CONFIG_ARCH_WANTS_NO_INSTR is not set -# CONFIG_ARCH_WANTS_THP_SWAP is not set -# CONFIG_ARCH_WM8505 is not set -# CONFIG_ARCH_WM8750 is not set -# CONFIG_ARCH_WM8850 is not set -# CONFIG_ARCH_XGENE is not set -# CONFIG_ARCH_ZX is not set -# CONFIG_ARCH_ZYNQ is not set -# CONFIG_ARCH_ZYNQMP is not set -# CONFIG_ARCNET is not set -# CONFIG_ARC_EMAC is not set -# CONFIG_ARC_IRQ_NO_AUTOSAVE is not set -# CONFIG_ARM64_16K_PAGES is not set -CONFIG_ARM64_4K_PAGES=y -# CONFIG_ARM64_64K_PAGES is not set -# CONFIG_ARM64_AMU_EXTN is not set -# CONFIG_ARM64_BTI is not set -# CONFIG_ARM64_CRYPTO is not set -# CONFIG_ARM64_E0PD is not set -# CONFIG_ARM64_EPAN is not set -# CONFIG_ARM64_ERRATUM_1024718 is not set -# CONFIG_ARM64_ERRATUM_1165522 is not set -# CONFIG_ARM64_ERRATUM_1286807 is not set -# CONFIG_ARM64_ERRATUM_1319367 is not set -# CONFIG_ARM64_ERRATUM_1418040 is not set -# CONFIG_ARM64_ERRATUM_1463225 is not set -# CONFIG_ARM64_ERRATUM_1508412 is not set -# CONFIG_ARM64_ERRATUM_1530923 is not set -# CONFIG_ARM64_ERRATUM_1542419 is not set -# CONFIG_ARM64_ERRATUM_2051678 is not set -# CONFIG_ARM64_ERRATUM_2054223 is not set -# CONFIG_ARM64_ERRATUM_2067961 is not set -# CONFIG_ARM64_ERRATUM_2077057 is not set -# CONFIG_ARM64_ERRATUM_819472 is not set -# CONFIG_ARM64_ERRATUM_824069 is not set -# CONFIG_ARM64_ERRATUM_826319 is not set -# CONFIG_ARM64_ERRATUM_827319 is not set -# CONFIG_ARM64_ERRATUM_832075 is not set -# CONFIG_ARM64_ERRATUM_834220 is not set -# CONFIG_ARM64_ERRATUM_843419 is not set -# CONFIG_ARM64_ERRATUM_845719 is not set -# CONFIG_ARM64_ERRATUM_858921 is not set -# CONFIG_ARM64_HW_AFDBM is not set -# CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419 is not set -# CONFIG_ARM64_LSE_ATOMICS is not set -# CONFIG_ARM64_MODULE_PLTS is not set -# CONFIG_ARM64_MTE is not set -# CONFIG_ARM64_PAN is not set -# CONFIG_ARM64_PMEM is not set -# CONFIG_ARM64_PSEUDO_NMI is not set -# CONFIG_ARM64_PTDUMP_DEBUGFS is not set -# CONFIG_ARM64_PTR_AUTH is not set -# CONFIG_ARM64_PTR_AUTH_KERNEL is not set -# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set -# CONFIG_ARM64_RAS_EXTN is not set -# CONFIG_ARM64_RELOC_TEST is not set -# CONFIG_ARM64_SVE is not set -CONFIG_ARM64_SW_TTBR0_PAN=y -# CONFIG_ARM64_TAGGED_ADDR_ABI is not set -# CONFIG_ARM64_TLB_RANGE is not set -# CONFIG_ARM64_UAO is not set -# CONFIG_ARM64_USE_LSE_ATOMICS is not set -CONFIG_ARM64_VA_BITS_39=y -# CONFIG_ARM64_VA_BITS_48 is not set -# CONFIG_ARM64_VHE is not set -# CONFIG_ARM_APPENDED_DTB is not set -# CONFIG_ARM_ARCH_TIMER is not set -# CONFIG_ARM_ARCH_TIMER_EVTSTREAM is not set -# CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_EXTEND is not set -# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set -# CONFIG_ARM_CCI is not set -# CONFIG_ARM_CCI400_PMU is not set -# CONFIG_ARM_CCI5xx_PMU is not set -# CONFIG_ARM_CCI_PMU is not set -# CONFIG_ARM_CCN is not set -# CONFIG_ARM_CMN is not set -# CONFIG_ARM_CPUIDLE is not set -CONFIG_ARM_CPU_TOPOLOGY=y -# CONFIG_ARM_CRYPTO is not set -CONFIG_ARM_DMA_MEM_BUFFERABLE=y -# CONFIG_ARM_DSU_PMU is not set -# CONFIG_ARM_ERRATA_326103 is not set -# CONFIG_ARM_ERRATA_364296 is not set -# CONFIG_ARM_ERRATA_411920 is not set -# CONFIG_ARM_ERRATA_430973 is not set -# CONFIG_ARM_ERRATA_458693 is not set -# CONFIG_ARM_ERRATA_460075 is not set -# CONFIG_ARM_ERRATA_643719 is not set -# CONFIG_ARM_ERRATA_720789 is not set -# CONFIG_ARM_ERRATA_742230 is not set -# CONFIG_ARM_ERRATA_742231 is not set -# CONFIG_ARM_ERRATA_743622 is not set -# CONFIG_ARM_ERRATA_751472 is not set -# CONFIG_ARM_ERRATA_754322 is not set -# CONFIG_ARM_ERRATA_754327 is not set -# CONFIG_ARM_ERRATA_764369 is not set -# CONFIG_ARM_ERRATA_773022 is not set -# CONFIG_ARM_ERRATA_775420 is not set -# CONFIG_ARM_ERRATA_798181 is not set -# CONFIG_ARM_ERRATA_814220 is not set -# CONFIG_ARM_ERRATA_818325_852422 is not set -# CONFIG_ARM_ERRATA_821420 is not set -# CONFIG_ARM_ERRATA_825619 is not set -# CONFIG_ARM_ERRATA_852421 is not set -# CONFIG_ARM_ERRATA_852423 is not set -# CONFIG_ARM_ERRATA_857271 is not set -# CONFIG_ARM_ERRATA_857272 is not set -# CONFIG_ARM_FFA_TRANSPORT is not set -CONFIG_ARM_GIC_MAX_NR=1 -# CONFIG_ARM_GT_INITIAL_PRESCALER_VAL is not set -# CONFIG_ARM_KIRKWOOD_CPUFREQ is not set -# CONFIG_ARM_KPROBES_TEST is not set -# CONFIG_ARM_LPAE is not set -# CONFIG_ARM_MHU is not set -# CONFIG_ARM_MHU_V2 is not set -# CONFIG_ARM_MODULE_PLTS is not set -# CONFIG_ARM_PATCH_PHYS_VIRT is not set -# CONFIG_ARM_PSCI is not set -# CONFIG_ARM_PSCI_CHECKER is not set -# CONFIG_ARM_PSCI_CPUIDLE is not set -# CONFIG_ARM_PTDUMP_DEBUGFS is not set -# CONFIG_ARM_SBSA_WATCHDOG is not set -# CONFIG_ARM_SCMI_PROTOCOL is not set -# CONFIG_ARM_SCPI_PROTOCOL is not set -# CONFIG_ARM_SDE_INTERFACE is not set -# CONFIG_ARM_SMCCC_SOC_ID is not set -# CONFIG_ARM_SMC_WATCHDOG is not set -# CONFIG_ARM_SP805_WATCHDOG is not set -# CONFIG_ARM_SPE_PMU is not set -# CONFIG_ARM_THUMBEE is not set -# CONFIG_ARM_TIMER_SP804 is not set -# CONFIG_ARM_UNWIND is not set -# CONFIG_ARM_VIRT_EXT is not set -# CONFIG_AS3935 is not set -# CONFIG_AS73211 is not set -# CONFIG_ASM9260_TIMER is not set -# CONFIG_ASN1 is not set -# CONFIG_ASUS_LAPTOP is not set -# CONFIG_ASUS_WIRELESS is not set -# CONFIG_ASYMMETRIC_KEY_TYPE is not set -# CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE is not set -# CONFIG_ASYNC_RAID6_TEST is not set -# CONFIG_ASYNC_TX_DMA is not set -# CONFIG_AT76C50X_USB is not set -# CONFIG_AT803X_PHY is not set -# CONFIG_AT91_SAMA5D2_ADC is not set -# CONFIG_ATA is not set -# CONFIG_ATAGS is not set -CONFIG_ATAGS_PROC=y -# CONFIG_ATALK is not set -# CONFIG_ATARI_PARTITION is not set -# CONFIG_ATA_ACPI is not set -CONFIG_ATA_BMDMA=y -# CONFIG_ATA_FORCE is not set -# CONFIG_ATA_GENERIC is not set -# CONFIG_ATA_LEDS is not set -# CONFIG_ATA_NONSTANDARD is not set -# CONFIG_ATA_OVER_ETH is not set -# CONFIG_ATA_PIIX is not set -CONFIG_ATA_SFF=y -# CONFIG_ATA_VERBOSE_ERROR is not set -# CONFIG_ATH10K is not set -# CONFIG_ATH25 is not set -# CONFIG_ATH5K is not set -# CONFIG_ATH6KL is not set -# CONFIG_ATH79 is not set -# CONFIG_ATH9K is not set -# CONFIG_ATH9K_HTC is not set -# CONFIG_ATH_DEBUG is not set -# CONFIG_ATL1 is not set -# CONFIG_ATL1C is not set -# CONFIG_ATL1E is not set -# CONFIG_ATL2 is not set -# CONFIG_ATLAS_EZO_SENSOR is not set -# CONFIG_ATLAS_PH_SENSOR is not set -# CONFIG_ATM is not set -# CONFIG_ATMEL is not set -# CONFIG_ATMEL_PIT is not set -# CONFIG_ATMEL_SSC is not set -# CONFIG_ATM_AMBASSADOR is not set -# CONFIG_ATM_BR2684 is not set -CONFIG_ATM_BR2684_IPFILTER=y -# CONFIG_ATM_CLIP is not set -CONFIG_ATM_CLIP_NO_ICMP=y -# CONFIG_ATM_DRIVERS is not set -# CONFIG_ATM_DUMMY is not set -# CONFIG_ATM_ENI is not set -# CONFIG_ATM_FIRESTREAM is not set -# CONFIG_ATM_FORE200E is not set -# CONFIG_ATM_HE is not set -# CONFIG_ATM_HORIZON is not set -# CONFIG_ATM_IA is not set -# CONFIG_ATM_IDT77252 is not set -# CONFIG_ATM_LANAI is not set -# CONFIG_ATM_LANE is not set -# CONFIG_ATM_MPOA is not set -# CONFIG_ATM_NICSTAR is not set -# CONFIG_ATM_SOLOS is not set -# CONFIG_ATM_TCP is not set -# CONFIG_ATM_ZATM is not set -# CONFIG_ATOMIC64_SELFTEST is not set -# CONFIG_ATP is not set -# CONFIG_AUDIT is not set -# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set -# CONFIG_AURORA_NB8800 is not set -# CONFIG_AUTOFS4_FS is not set -# CONFIG_AUTOFS_FS is not set -# CONFIG_AUTO_ZRELADDR is not set -# CONFIG_AUXDISPLAY is not set -# CONFIG_AX25 is not set -# CONFIG_AX25_DAMA_SLAVE is not set -# CONFIG_AX88796 is not set -# CONFIG_AX88796B_PHY is not set -# CONFIG_AXP20X_ADC is not set -# CONFIG_AXP20X_POWER is not set -# CONFIG_AXP288_ADC is not set -# CONFIG_AXP288_FUEL_GAUGE is not set -# CONFIG_B43 is not set -# CONFIG_B43LEGACY is not set -# CONFIG_B44 is not set -# CONFIG_B53 is not set -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_APPLE is not set -# CONFIG_BACKLIGHT_ARCXCNN is not set -# CONFIG_BACKLIGHT_BD6107 is not set -# CONFIG_BACKLIGHT_CLASS_DEVICE is not set -# CONFIG_BACKLIGHT_GENERIC is not set -# CONFIG_BACKLIGHT_GPIO is not set -# CONFIG_BACKLIGHT_KTD253 is not set -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set -# CONFIG_BACKLIGHT_LED is not set -# CONFIG_BACKLIGHT_LM3630A is not set -# CONFIG_BACKLIGHT_LM3639 is not set -# CONFIG_BACKLIGHT_LP855X is not set -# CONFIG_BACKLIGHT_LV5207LP is not set -# CONFIG_BACKLIGHT_PANDORA is not set -# CONFIG_BACKLIGHT_PM8941_WLED is not set -# CONFIG_BACKLIGHT_PWM is not set -# CONFIG_BACKLIGHT_QCOM_WLED is not set -# CONFIG_BACKLIGHT_RPI is not set -# CONFIG_BACKLIGHT_SAHARA is not set -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_BAREUDP is not set -CONFIG_BASE_FULL=y -CONFIG_BASE_SMALL=0 -# CONFIG_BATMAN_ADV is not set -# CONFIG_BATTERY_BQ27XXX is not set -# CONFIG_BATTERY_BQ27XXX_HDQ is not set -# CONFIG_BATTERY_CW2015 is not set -# CONFIG_BATTERY_DS2760 is not set -# CONFIG_BATTERY_DS2780 is not set -# CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_GAUGE_LTC2941 is not set -# CONFIG_BATTERY_GOLDFISH is not set -# CONFIG_BATTERY_LEGO_EV3 is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set -# CONFIG_BATTERY_MAX1721X is not set -# CONFIG_BATTERY_RT5033 is not set -# CONFIG_BATTERY_SAMSUNG_SDI is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_BATTERY_UG3105 is not set -# CONFIG_BAYCOM_EPP is not set -# CONFIG_BAYCOM_PAR is not set -# CONFIG_BAYCOM_SER_FDX is not set -# CONFIG_BAYCOM_SER_HDX is not set -# CONFIG_BCACHE is not set -# CONFIG_BCM47XX is not set -# CONFIG_BCM54140_PHY is not set -# CONFIG_BCM63XX is not set -# CONFIG_BCM63XX_PHY is not set -# CONFIG_BCM7038_WDT is not set -# CONFIG_BCM7XXX_PHY is not set -# CONFIG_BCM84881_PHY is not set -# CONFIG_BCM87XX_PHY is not set -# CONFIG_BCMA is not set -# CONFIG_BCMA_DRIVER_GPIO is not set -CONFIG_BCMA_POSSIBLE=y -# CONFIG_BCMGENET is not set -# CONFIG_BCM_IPROC_ADC is not set -# CONFIG_BCM_KONA_USB2_PHY is not set -# CONFIG_BCM_SBA_RAID is not set -# CONFIG_BCM_VK is not set -# CONFIG_BDI_SWITCH is not set -# CONFIG_BE2ISCSI is not set -# CONFIG_BE2NET is not set -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_BGMAC is not set -# CONFIG_BH1750 is not set -# CONFIG_BH1780 is not set -# CONFIG_BIG_KEYS is not set -# CONFIG_BIG_LITTLE is not set -# CONFIG_BINARY_PRINTF is not set -# CONFIG_BINFMT_AOUT is not set -CONFIG_BINFMT_ELF=y -# CONFIG_BINFMT_ELF_FDPIC is not set -# CONFIG_BINFMT_FLAT is not set -# CONFIG_BINFMT_MISC is not set -CONFIG_BINFMT_SCRIPT=y -CONFIG_BITREVERSE=y -# CONFIG_BLK_CGROUP_IOCOST is not set -# CONFIG_BLK_CGROUP_IOLATENCY is not set -# CONFIG_BLK_CGROUP_IOPRIO is not set -# CONFIG_BLK_CMDLINE_PARSER is not set -# CONFIG_BLK_DEBUG_FS is not set -CONFIG_BLK_DEV=y -# CONFIG_BLK_DEV_3W_XXXX_RAID is not set -# CONFIG_BLK_DEV_4DRIVES is not set -# CONFIG_BLK_DEV_AEC62XX is not set -# CONFIG_BLK_DEV_ALI14XX is not set -# CONFIG_BLK_DEV_ALI15X3 is not set -# CONFIG_BLK_DEV_AMD74XX is not set -# CONFIG_BLK_DEV_ATIIXP is not set -# CONFIG_BLK_DEV_BSG is not set -# CONFIG_BLK_DEV_BSGLIB is not set -# CONFIG_BLK_DEV_BSG_COMMON is not set -# CONFIG_BLK_DEV_CMD640 is not set -# CONFIG_BLK_DEV_CMD64X is not set -# CONFIG_BLK_DEV_COW_COMMON is not set -# CONFIG_BLK_DEV_CRYPTOLOOP is not set -# CONFIG_BLK_DEV_CS5520 is not set -# CONFIG_BLK_DEV_CS5530 is not set -# CONFIG_BLK_DEV_CS5535 is not set -# CONFIG_BLK_DEV_CS5536 is not set -# CONFIG_BLK_DEV_CY82C693 is not set -# CONFIG_BLK_DEV_DAC960 is not set -# CONFIG_BLK_DEV_DELKIN is not set -# CONFIG_BLK_DEV_DRBD is not set -# CONFIG_BLK_DEV_DTC2278 is not set -# CONFIG_BLK_DEV_FD is not set -# CONFIG_BLK_DEV_GENERIC is not set -# CONFIG_BLK_DEV_HPT366 is not set -# CONFIG_BLK_DEV_HT6560B is not set -# CONFIG_BLK_DEV_IDEACPI is not set -# CONFIG_BLK_DEV_IDECD is not set -# CONFIG_BLK_DEV_IDECS is not set -# CONFIG_BLK_DEV_IDEPCI is not set -# CONFIG_BLK_DEV_IDEPNP is not set -# CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDE_AU1XXX is not set -# CONFIG_BLK_DEV_IDE_SATA is not set -CONFIG_BLK_DEV_INITRD=y -# CONFIG_BLK_DEV_INTEGRITY is not set -# CONFIG_BLK_DEV_IO_TRACE is not set -# CONFIG_BLK_DEV_IT8172 is not set -# CONFIG_BLK_DEV_IT8213 is not set -# CONFIG_BLK_DEV_IT821X is not set -# CONFIG_BLK_DEV_JMICRON is not set -# CONFIG_BLK_DEV_LOOP is not set -CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_NS87415 is not set -# CONFIG_BLK_DEV_NULL_BLK is not set -# CONFIG_BLK_DEV_NVME is not set -# CONFIG_BLK_DEV_OFFBOARD is not set -# CONFIG_BLK_DEV_OPTI621 is not set -# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set -# CONFIG_BLK_DEV_PDC202XX_NEW is not set -# CONFIG_BLK_DEV_PDC202XX_OLD is not set -# CONFIG_BLK_DEV_PIIX is not set -# CONFIG_BLK_DEV_PLATFORM is not set -# CONFIG_BLK_DEV_PMEM is not set -# CONFIG_BLK_DEV_QD65XX is not set -# CONFIG_BLK_DEV_RAM is not set -# CONFIG_BLK_DEV_RBD is not set -# CONFIG_BLK_DEV_RSXX is not set -# CONFIG_BLK_DEV_RZ1000 is not set -# CONFIG_BLK_DEV_SC1200 is not set -# CONFIG_BLK_DEV_SD is not set -# CONFIG_BLK_DEV_SIIMAGE is not set -# CONFIG_BLK_DEV_SIS5513 is not set -# CONFIG_BLK_DEV_SKD is not set -# CONFIG_BLK_DEV_SL82C105 is not set -# CONFIG_BLK_DEV_SLC90E66 is not set -# CONFIG_BLK_DEV_SR is not set -# CONFIG_BLK_DEV_SVWKS is not set -# CONFIG_BLK_DEV_SX8 is not set -# CONFIG_BLK_DEV_TC86C001 is not set -# CONFIG_BLK_DEV_THROTTLING is not set -# CONFIG_BLK_DEV_TRIFLEX is not set -# CONFIG_BLK_DEV_TRM290 is not set -# CONFIG_BLK_DEV_UMC8672 is not set -# CONFIG_BLK_DEV_UMEM is not set -# CONFIG_BLK_DEV_VIA82CXXX is not set -# CONFIG_BLK_DEV_ZONED is not set -# CONFIG_BLK_INLINE_ENCRYPTION is not set -# CONFIG_BLK_SED_OPAL is not set -# CONFIG_BLK_WBT is not set -CONFIG_BLOCK=y -# CONFIG_BLOCK_LEGACY_AUTOLOAD is not set -# CONFIG_BMA180 is not set -# CONFIG_BMA220 is not set -# CONFIG_BMA400 is not set -# CONFIG_BMC150_ACCEL is not set -# CONFIG_BMC150_MAGN is not set -# CONFIG_BMC150_MAGN_I2C is not set -# CONFIG_BMC150_MAGN_SPI is not set -# CONFIG_BME680 is not set -# CONFIG_BMG160 is not set -# CONFIG_BMI088_ACCEL is not set -# CONFIG_BMI160_I2C is not set -# CONFIG_BMI160_SPI is not set -# CONFIG_BMIPS_GENERIC is not set -# CONFIG_BMP280 is not set -# CONFIG_BNA is not set -# CONFIG_BNX2 is not set -# CONFIG_BNX2X is not set -# CONFIG_BNX2X_SRIOV is not set -# CONFIG_BNXT is not set -# CONFIG_BONDING is not set -# CONFIG_BOOKE_WDT is not set -CONFIG_BOOKE_WDT_DEFAULT_TIMEOUT=3 -# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set -# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set -# CONFIG_BOOTTIME_TRACING is not set -# CONFIG_BOOT_CONFIG is not set -# CONFIG_BOOT_PRINTK_DELAY is not set -CONFIG_BOOT_RAW=y -# CONFIG_BOUNCE is not set -CONFIG_BPF=y -# CONFIG_BPFILTER is not set -CONFIG_BPF_JIT=y -# CONFIG_BPF_JIT_ALWAYS_ON is not set -CONFIG_BPF_JIT_DEFAULT_ON=y -# CONFIG_BPF_PRELOAD is not set -# CONFIG_BPF_STREAM_PARSER is not set -CONFIG_BPF_SYSCALL=y -CONFIG_BPF_UNPRIV_DEFAULT_OFF=y -# CONFIG_BPQETHER is not set -CONFIG_BQL=y -CONFIG_BRANCH_PROFILE_NONE=y -# CONFIG_BRCMFMAC is not set -# CONFIG_BRCMSMAC is not set -# CONFIG_BRCMSTB_GISB_ARB is not set -CONFIG_BRIDGE=y -# CONFIG_BRIDGE_CFM is not set -# CONFIG_BRIDGE_EBT_802_3 is not set -# CONFIG_BRIDGE_EBT_AMONG is not set -# CONFIG_BRIDGE_EBT_ARP is not set -# CONFIG_BRIDGE_EBT_ARPREPLY is not set -# CONFIG_BRIDGE_EBT_BROUTE is not set -# CONFIG_BRIDGE_EBT_DNAT is not set -# CONFIG_BRIDGE_EBT_IP is not set -# CONFIG_BRIDGE_EBT_IP6 is not set -# CONFIG_BRIDGE_EBT_LIMIT is not set -# CONFIG_BRIDGE_EBT_LOG is not set -# CONFIG_BRIDGE_EBT_MARK is not set -# CONFIG_BRIDGE_EBT_MARK_T is not set -# CONFIG_BRIDGE_EBT_NFLOG is not set -# CONFIG_BRIDGE_EBT_PKTTYPE is not set -# CONFIG_BRIDGE_EBT_REDIRECT is not set -# CONFIG_BRIDGE_EBT_SNAT is not set -# CONFIG_BRIDGE_EBT_STP is not set -# CONFIG_BRIDGE_EBT_T_FILTER is not set -# CONFIG_BRIDGE_EBT_T_NAT is not set -# CONFIG_BRIDGE_EBT_VLAN is not set -CONFIG_BRIDGE_IGMP_SNOOPING=y -# CONFIG_BRIDGE_MRP is not set -# CONFIG_BRIDGE_NETFILTER is not set -# CONFIG_BRIDGE_NF_EBTABLES is not set -CONFIG_BRIDGE_VLAN_FILTERING=y -# CONFIG_BROADCOM_PHY is not set -CONFIG_BROKEN_ON_SMP=y -# CONFIG_BSD_DISKLABEL is not set -# CONFIG_BSD_PROCESS_ACCT is not set -# CONFIG_BSD_PROCESS_ACCT_V3 is not set -# CONFIG_BT is not set -# CONFIG_BTRFS_ASSERT is not set -# CONFIG_BTRFS_DEBUG is not set -# CONFIG_BTRFS_FS is not set -# CONFIG_BTRFS_FS_POSIX_ACL is not set -# CONFIG_BTRFS_FS_REF_VERIFY is not set -# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set -# CONFIG_BT_AOSPEXT is not set -# CONFIG_BT_ATH3K is not set -# CONFIG_BT_BNEP is not set -CONFIG_BT_BNEP_MC_FILTER=y -CONFIG_BT_BNEP_PROTO_FILTER=y -# CONFIG_BT_BREDR is not set -# CONFIG_BT_CMTP is not set -# CONFIG_BT_FEATURE_DEBUG is not set -# CONFIG_BT_HCIBCM203X is not set -# CONFIG_BT_HCIBFUSB is not set -# CONFIG_BT_HCIBLUECARD is not set -# CONFIG_BT_HCIBPA10X is not set -# CONFIG_BT_HCIBT3C is not set -# CONFIG_BT_HCIBTSDIO is not set -# CONFIG_BT_HCIBTUSB is not set -# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set -# CONFIG_BT_HCIBTUSB_MTK is not set -# CONFIG_BT_HCIBTUSB_RTL is not set -# CONFIG_BT_HCIDTL1 is not set -# CONFIG_BT_HCIUART is not set -# CONFIG_BT_HCIUART_3WIRE is not set -# CONFIG_BT_HCIUART_AG6XX is not set -# CONFIG_BT_HCIUART_ATH3K is not set -CONFIG_BT_HCIUART_BCSP=y -CONFIG_BT_HCIUART_H4=y -# CONFIG_BT_HCIUART_LL is not set -# CONFIG_BT_HCIUART_MRVL is not set -# CONFIG_BT_HCIUART_QCA is not set -# CONFIG_BT_HCIUART_RTL is not set -# CONFIG_BT_HCIVHCI is not set -# CONFIG_BT_HIDP is not set -# CONFIG_BT_HS is not set -# CONFIG_BT_LE is not set -# CONFIG_BT_LEDS is not set -# CONFIG_BT_MRVL is not set -# CONFIG_BT_MSFTEXT is not set -# CONFIG_BT_MTKSDIO is not set -# CONFIG_BT_MTKUART is not set -# CONFIG_BT_RFCOMM is not set -CONFIG_BT_RFCOMM_TTY=y -# CONFIG_BT_SELFTEST is not set -CONFIG_BUG=y -# CONFIG_BUG_ON_DATA_CORRUPTION is not set -CONFIG_BUILDTIME_EXTABLE_SORT=y -CONFIG_BUILDTIME_TABLE_SORT=y -# CONFIG_BUILD_BIN2C is not set -CONFIG_BUILD_SALT="" -# CONFIG_C2PORT is not set -CONFIG_CACHE_L2X0_PMU=y -# CONFIG_CADENCE_WATCHDOG is not set -# CONFIG_CAIF is not set -# CONFIG_CAN is not set -# CONFIG_CAN_BCM is not set -# CONFIG_CAN_DEBUG_DEVICES is not set -# CONFIG_CAN_DEV is not set -# CONFIG_CAN_ETAS_ES58X is not set -# CONFIG_CAN_GS_USB is not set -# CONFIG_CAN_GW is not set -# CONFIG_CAN_HI311X is not set -# CONFIG_CAN_IFI_CANFD is not set -# CONFIG_CAN_ISOTP is not set -# CONFIG_CAN_J1939 is not set -# CONFIG_CAN_KVASER_PCIEFD is not set -# CONFIG_CAN_MCBA_USB is not set -# CONFIG_CAN_MCP251XFD is not set -# CONFIG_CAN_M_CAN is not set -# CONFIG_CAN_PEAK_PCIEFD is not set -# CONFIG_CAN_RAW is not set -# CONFIG_CAN_RCAR is not set -# CONFIG_CAN_RCAR_CANFD is not set -# CONFIG_CAN_SLCAN is not set -# CONFIG_CAN_SUN4I is not set -# CONFIG_CAN_UCAN is not set -# CONFIG_CAN_VCAN is not set -# CONFIG_CAN_VXCAN is not set -# CONFIG_CAPI_AVM is not set -# CONFIG_CAPI_EICON is not set -# CONFIG_CAPI_TRACE is not set -CONFIG_CARDBUS=y -# CONFIG_CARDMAN_4000 is not set -# CONFIG_CARDMAN_4040 is not set -# CONFIG_CARL9170 is not set -# CONFIG_CASSINI is not set -# CONFIG_CAVIUM_CPT is not set -# CONFIG_CAVIUM_ERRATUM_22375 is not set -# CONFIG_CAVIUM_ERRATUM_23144 is not set -# CONFIG_CAVIUM_ERRATUM_23154 is not set -# CONFIG_CAVIUM_ERRATUM_27456 is not set -# CONFIG_CAVIUM_ERRATUM_30115 is not set -# CONFIG_CAVIUM_OCTEON_SOC is not set -# CONFIG_CAVIUM_PTP is not set -# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set -# CONFIG_CB710_CORE is not set -# CONFIG_CC10001_ADC is not set -# CONFIG_CCS811 is not set -CONFIG_CC_CAN_LINK=y -CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set -# CONFIG_CDROM_PKTCDVD is not set -# CONFIG_CEPH_FS is not set -# CONFIG_CEPH_LIB is not set -# CONFIG_CFG80211 is not set -# CONFIG_CFG80211_CERTIFICATION_ONUS is not set -# CONFIG_CGROUPS is not set -# CONFIG_CGROUP_MISC is not set -# CONFIG_CHARGER_ADP5061 is not set -# CONFIG_CHARGER_BD99954 is not set -# CONFIG_CHARGER_BQ2415X is not set -# CONFIG_CHARGER_BQ24190 is not set -# CONFIG_CHARGER_BQ24257 is not set -# CONFIG_CHARGER_BQ24735 is not set -# CONFIG_CHARGER_BQ2515X is not set -# CONFIG_CHARGER_BQ256XX is not set -# CONFIG_CHARGER_BQ25890 is not set -# CONFIG_CHARGER_BQ25980 is not set -# CONFIG_CHARGER_DETECTOR_MAX14656 is not set -# CONFIG_CHARGER_GPIO is not set -# CONFIG_CHARGER_ISP1704 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_LT3651 is not set -# CONFIG_CHARGER_LTC3651 is not set -# CONFIG_CHARGER_LTC4162L is not set -# CONFIG_CHARGER_MANAGER is not set -# CONFIG_CHARGER_MAX77976 is not set -# CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_RT9455 is not set -# CONFIG_CHARGER_SBS is not set -# CONFIG_CHARGER_SMB347 is not set -# CONFIG_CHARGER_TWL4030 is not set -# CONFIG_CHARGER_UCS1002 is not set -# CONFIG_CHASH_SELFTEST is not set -# CONFIG_CHASH_STATS is not set -# CONFIG_CHECKPOINT_RESTORE is not set -# CONFIG_CHELSIO_T1 is not set -# CONFIG_CHELSIO_T3 is not set -# CONFIG_CHELSIO_T4 is not set -# CONFIG_CHELSIO_T4VF is not set -# CONFIG_CHROME_PLATFORMS is not set -# CONFIG_CHR_DEV_OSST is not set -# CONFIG_CHR_DEV_SCH is not set -# CONFIG_CHR_DEV_SG is not set -# CONFIG_CHR_DEV_ST is not set -# CONFIG_CICADA_PHY is not set -# CONFIG_CIFS is not set -# CONFIG_CIFS_ACL is not set -CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y -# CONFIG_CIFS_DEBUG is not set -# CONFIG_CIFS_DEBUG2 is not set -# CONFIG_CIFS_FSCACHE is not set -# CONFIG_CIFS_NFSD_EXPORT is not set -CONFIG_CIFS_POSIX=y -# CONFIG_CIFS_SMB2 is not set -# CONFIG_CIFS_STATS is not set -# CONFIG_CIFS_STATS2 is not set -# CONFIG_CIFS_SWN_UPCALL is not set -# CONFIG_CIFS_WEAK_PW_HASH is not set -CONFIG_CIFS_XATTR=y -# CONFIG_CIO_DAC is not set -# CONFIG_CLEANCACHE is not set -# CONFIG_CLKSRC_VERSATILE is not set -# CONFIG_CLK_HSDK is not set -# CONFIG_CLK_ICST is not set -# CONFIG_CLK_QORIQ is not set -# CONFIG_CLK_SP810 is not set -# CONFIG_CLOCK_THERMAL is not set -CONFIG_CLS_U32_MARK=y -# CONFIG_CLS_U32_PERF is not set -# CONFIG_CM32181 is not set -# CONFIG_CM3232 is not set -# CONFIG_CM3323 is not set -# CONFIG_CM3605 is not set -# CONFIG_CM36651 is not set -# CONFIG_CMA is not set -# CONFIG_CMA_SYSFS is not set -CONFIG_CMDLINE="" -# CONFIG_CMDLINE_BOOL is not set -# CONFIG_CMDLINE_EXTEND is not set -# CONFIG_CMDLINE_FORCE is not set -# CONFIG_CMDLINE_FROM_BOOTLOADER is not set -# CONFIG_CMDLINE_PARTITION is not set -# CONFIG_CNIC is not set -# CONFIG_CODA_FS is not set -# CONFIG_CODE_PATCHING_SELFTEST is not set -# CONFIG_COMEDI is not set -# CONFIG_COMMON_CLK_AXI_CLKGEN is not set -# CONFIG_COMMON_CLK_CDCE706 is not set -# CONFIG_COMMON_CLK_CDCE925 is not set -# CONFIG_COMMON_CLK_CS2000_CP is not set -# CONFIG_COMMON_CLK_FIXED_MMIO is not set -# CONFIG_COMMON_CLK_IPROC is not set -# CONFIG_COMMON_CLK_LAN966X is not set -# CONFIG_COMMON_CLK_MAX9485 is not set -# CONFIG_COMMON_CLK_MT6765 is not set -# CONFIG_COMMON_CLK_MT8167 is not set -# CONFIG_COMMON_CLK_MT8167_AUDSYS is not set -# CONFIG_COMMON_CLK_MT8167_IMGSYS is not set -# CONFIG_COMMON_CLK_MT8167_MFGCFG is not set -# CONFIG_COMMON_CLK_MT8167_MMSYS is not set -# CONFIG_COMMON_CLK_MT8167_VDECSYS is not set -# CONFIG_COMMON_CLK_NXP is not set -# CONFIG_COMMON_CLK_PIC32 is not set -# CONFIG_COMMON_CLK_PWM is not set -# CONFIG_COMMON_CLK_PXA is not set -# CONFIG_COMMON_CLK_QCOM is not set -# CONFIG_COMMON_CLK_RK808 is not set -# CONFIG_COMMON_CLK_ROCKCHIP is not set -# CONFIG_COMMON_CLK_SI514 is not set -# CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set -# CONFIG_COMMON_CLK_SI544 is not set -# CONFIG_COMMON_CLK_SI570 is not set -# CONFIG_COMMON_CLK_VC5 is not set -# CONFIG_COMMON_CLK_XGENE is not set -# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set -CONFIG_COMPACTION=y -# CONFIG_COMPAL_LAPTOP is not set -# CONFIG_COMPAT is not set -# CONFIG_COMPAT_32BIT_TIME is not set -# CONFIG_COMPAT_BRK is not set -# CONFIG_COMPILE_TEST is not set -# CONFIG_CONFIGFS_FS is not set -# CONFIG_CONFIG_KVM_AMD_SEV is not set -# CONFIG_CONNECTOR is not set -CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 -CONFIG_CONSOLE_LOGLEVEL_QUIET=4 -CONFIG_CONSTRUCTORS=y -# CONFIG_CONTEXT_SWITCH_TRACER is not set -# CONFIG_COPS is not set -# CONFIG_CORDIC is not set -# CONFIG_COREDUMP is not set -# CONFIG_CORESIGHT is not set -# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set -# CONFIG_CORTINA_PHY is not set -# CONFIG_COUNTER is not set -# CONFIG_CPA_DEBUG is not set -# CONFIG_CPU_BIG_ENDIAN is not set -# CONFIG_CPU_BPREDICT_DISABLE is not set -# CONFIG_CPU_DCACHE_DISABLE is not set -# CONFIG_CPU_FREQ is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set -# CONFIG_CPU_FREQ_STAT_DETAILS is not set -# CONFIG_CPU_FREQ_THERMAL is not set -# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set -# CONFIG_CPU_ICACHE_DISABLE is not set -# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set -# CONFIG_CPU_IDLE is not set -# CONFIG_CPU_IDLE_GOV_LADDER is not set -# CONFIG_CPU_IDLE_GOV_MENU is not set -# CONFIG_CPU_IDLE_GOV_TEO is not set -# CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set -# CONFIG_CPU_ISOLATION is not set -CONFIG_CPU_LITTLE_ENDIAN=y -# CONFIG_CPU_NO_EFFICIENT_FFS is not set -CONFIG_CPU_SW_DOMAIN_PAN=y -# CONFIG_CPU_THERMAL is not set -# CONFIG_CRAMFS is not set -CONFIG_CRAMFS_BLOCKDEV=y -# CONFIG_CRAMFS_MTD is not set -CONFIG_CRASHLOG=y -# CONFIG_CRASH_DUMP is not set -# CONFIG_CRC16 is not set -CONFIG_CRC32=y -# CONFIG_CRC32_BIT is not set -CONFIG_CRC32_SARWATE=y -# CONFIG_CRC32_SELFTEST is not set -# CONFIG_CRC32_SLICEBY4 is not set -# CONFIG_CRC32_SLICEBY8 is not set -# CONFIG_CRC4 is not set -# CONFIG_CRC64 is not set -# CONFIG_CRC64_ROCKSOFT is not set -# CONFIG_CRC7 is not set -# CONFIG_CRC8 is not set -# CONFIG_CRC_CCITT is not set -# CONFIG_CRC_ITU_T is not set -# CONFIG_CRC_T10DIF is not set -CONFIG_CROSS_COMPILE="" -# CONFIG_CROSS_MEMORY_ATTACH is not set -CONFIG_CRYPTO=y -# CONFIG_CRYPTO_842 is not set -CONFIG_CRYPTO_ACOMP2=y -# CONFIG_CRYPTO_ADIANTUM is not set -CONFIG_CRYPTO_AEAD=y -CONFIG_CRYPTO_AEAD2=y -# CONFIG_CRYPTO_AEGIS128 is not set -# CONFIG_CRYPTO_AEGIS128L is not set -# CONFIG_CRYPTO_AEGIS128L_AESNI_SSE2 is not set -# CONFIG_CRYPTO_AEGIS128_AESNI_SSE2 is not set -# CONFIG_CRYPTO_AEGIS256 is not set -# CONFIG_CRYPTO_AEGIS256_AESNI_SSE2 is not set -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_AES_586 is not set -# CONFIG_CRYPTO_AES_ARM is not set -# CONFIG_CRYPTO_AES_ARM64 is not set -# CONFIG_CRYPTO_AES_ARM64_BS is not set -# CONFIG_CRYPTO_AES_ARM64_CE is not set -# CONFIG_CRYPTO_AES_ARM64_CE_BLK is not set -# CONFIG_CRYPTO_AES_ARM64_CE_CCM is not set -# CONFIG_CRYPTO_AES_ARM64_NEON_BLK is not set -# CONFIG_CRYPTO_AES_ARM_BS is not set -# CONFIG_CRYPTO_AES_ARM_CE is not set -# CONFIG_CRYPTO_AES_NI_INTEL is not set -# CONFIG_CRYPTO_AES_TI is not set -CONFIG_CRYPTO_AKCIPHER=y -CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_ALGAPI=y -CONFIG_CRYPTO_ALGAPI2=y -# CONFIG_CRYPTO_ANSI_CPRNG is not set -# CONFIG_CRYPTO_ANUBIS is not set -# CONFIG_CRYPTO_ARC4 is not set -# CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S is not set -# CONFIG_CRYPTO_AUTHENC is not set -# CONFIG_CRYPTO_BLAKE2B is not set -CONFIG_CRYPTO_BLAKE2B_NEON=y -# CONFIG_CRYPTO_BLAKE2S is not set -CONFIG_CRYPTO_BLAKE2S_ARM=y -# CONFIG_CRYPTO_BLAKE2S_X86 is not set -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_CBC is not set -CONFIG_CRYPTO_CCM=y -# CONFIG_CRYPTO_CFB is not set -# CONFIG_CRYPTO_CHACHA20 is not set -# CONFIG_CRYPTO_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_CHACHA20_NEON is not set -# CONFIG_CRYPTO_CHACHA20_X86_64 is not set -# CONFIG_CRYPTO_CHACHA_MIPS is not set -# CONFIG_CRYPTO_CMAC is not set -# CONFIG_CRYPTO_CRC32 is not set -# CONFIG_CRYPTO_CRC32C is not set -# CONFIG_CRYPTO_CRC32C_INTEL is not set -# CONFIG_CRYPTO_CRC32_ARM_CE is not set -# CONFIG_CRYPTO_CRCT10DIF is not set -# CONFIG_CRYPTO_CRCT10DIF_ARM64_CE is not set -# CONFIG_CRYPTO_CRYPTD is not set -CONFIG_CRYPTO_CTR=y -# CONFIG_CRYPTO_CTS is not set -# CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_NEON is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set -# CONFIG_CRYPTO_DEFLATE is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set -# CONFIG_CRYPTO_DEV_ATMEL_AES is not set -# CONFIG_CRYPTO_DEV_ATMEL_AUTHENC is not set -# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set -# CONFIG_CRYPTO_DEV_ATMEL_SHA is not set -# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set -# CONFIG_CRYPTO_DEV_ATMEL_TDES is not set -# CONFIG_CRYPTO_DEV_CAVIUM_ZIP is not set -# CONFIG_CRYPTO_DEV_CCP is not set -# CONFIG_CRYPTO_DEV_CCP_DEBUGFS is not set -# CONFIG_CRYPTO_DEV_CCREE is not set -# CONFIG_CRYPTO_DEV_FSL_CAAM is not set -# CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_DESC is not set -# CONFIG_CRYPTO_DEV_HIFN_795X is not set -# CONFIG_CRYPTO_DEV_HISI_SEC is not set -# CONFIG_CRYPTO_DEV_HISI_ZIP is not set -# CONFIG_CRYPTO_DEV_IMGTEC_HASH is not set -# CONFIG_CRYPTO_DEV_MARVELL_CESA is not set -# CONFIG_CRYPTO_DEV_MV_CESA is not set -# CONFIG_CRYPTO_DEV_MXC_SCC is not set -# CONFIG_CRYPTO_DEV_MXS_DCP is not set -# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set -# CONFIG_CRYPTO_DEV_QAT_4XXX is not set -# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set -# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set -# CONFIG_CRYPTO_DEV_QAT_C62X is not set -# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set -# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set -# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set -# CONFIG_CRYPTO_DEV_QCE is not set -# CONFIG_CRYPTO_DEV_S5P is not set -# CONFIG_CRYPTO_DEV_SAFEXCEL is not set -# CONFIG_CRYPTO_DEV_SAHARA is not set -# CONFIG_CRYPTO_DEV_SP_PSP is not set -# CONFIG_CRYPTO_DEV_TALITOS is not set -# CONFIG_CRYPTO_DEV_VIRTIO is not set -# CONFIG_CRYPTO_DH is not set -# CONFIG_CRYPTO_DRBG_CTR is not set -# CONFIG_CRYPTO_DRBG_HASH is not set -# CONFIG_CRYPTO_DRBG_MENU is not set -# CONFIG_CRYPTO_ECB is not set -# CONFIG_CRYPTO_ECDH is not set -# CONFIG_CRYPTO_ECDSA is not set -# CONFIG_CRYPTO_ECHAINIV is not set -# CONFIG_CRYPTO_ECRDSA is not set -# CONFIG_CRYPTO_ESSIV is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_FIPS is not set -CONFIG_CRYPTO_GCM=y -CONFIG_CRYPTO_GF128MUL=y -CONFIG_CRYPTO_GHASH=y -# CONFIG_CRYPTO_GHASH_ARM64_CE is not set -# CONFIG_CRYPTO_GHASH_ARM_CE is not set -# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -# CONFIG_CRYPTO_HMAC is not set -# CONFIG_CRYPTO_HW is not set -# CONFIG_CRYPTO_JITTERENTROPY is not set -# CONFIG_CRYPTO_KEYWRAP is not set -# CONFIG_CRYPTO_KHAZAD is not set -CONFIG_CRYPTO_KPP=y -CONFIG_CRYPTO_KPP2=y -CONFIG_CRYPTO_LIB_AES=y -CONFIG_CRYPTO_LIB_ARC4=y -# CONFIG_CRYPTO_LIB_BLAKE2S is not set -CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set -# CONFIG_CRYPTO_LIB_POLY1305 is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 -# CONFIG_CRYPTO_LIB_SHA256 is not set -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_LZ4 is not set -# CONFIG_CRYPTO_LZ4HC is not set -# CONFIG_CRYPTO_LZO is not set -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -# CONFIG_CRYPTO_MCRYPTD is not set -# CONFIG_CRYPTO_MD4 is not set -# CONFIG_CRYPTO_MD5 is not set -# CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_MORUS1280 is not set -# CONFIG_CRYPTO_MORUS1280_AVX2 is not set -# CONFIG_CRYPTO_MORUS1280_SSE2 is not set -# CONFIG_CRYPTO_MORUS640 is not set -# CONFIG_CRYPTO_MORUS640_SSE2 is not set -# CONFIG_CRYPTO_NHPOLY1305_NEON is not set -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_NULL2=y -# CONFIG_CRYPTO_OFB is not set -# CONFIG_CRYPTO_PCBC is not set -# CONFIG_CRYPTO_PCOMP is not set -# CONFIG_CRYPTO_PCOMP2 is not set -CONFIG_CRYPTO_PCRYPT=y -# CONFIG_CRYPTO_POLY1305 is not set -# CONFIG_CRYPTO_POLY1305_ARM is not set -# CONFIG_CRYPTO_POLY1305_MIPS is not set -# CONFIG_CRYPTO_POLY1305_NEON is not set -# CONFIG_CRYPTO_POLY1305_X86_64 is not set -# CONFIG_CRYPTO_RMD128 is not set -# CONFIG_CRYPTO_RMD160 is not set -# CONFIG_CRYPTO_RMD256 is not set -# CONFIG_CRYPTO_RMD320 is not set -# CONFIG_CRYPTO_RNG is not set -# CONFIG_CRYPTO_RSA is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_SALSA20_586 is not set -# CONFIG_CRYPTO_SEED is not set -# CONFIG_CRYPTO_SEQIV is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_SHA1 is not set -# CONFIG_CRYPTO_SHA1_ARM is not set -# CONFIG_CRYPTO_SHA1_ARM64_CE is not set -# CONFIG_CRYPTO_SHA1_ARM_CE is not set -# CONFIG_CRYPTO_SHA1_ARM_NEON is not set -CONFIG_CRYPTO_SHA256=y -# CONFIG_CRYPTO_SHA256_ARM is not set -# CONFIG_CRYPTO_SHA256_ARM64 is not set -# CONFIG_CRYPTO_SHA256_SSSE3 is not set -# CONFIG_CRYPTO_SHA2_ARM64_CE is not set -# CONFIG_CRYPTO_SHA2_ARM_CE is not set -# CONFIG_CRYPTO_SHA3 is not set -# CONFIG_CRYPTO_SHA3_ARM64 is not set -# CONFIG_CRYPTO_SHA512 is not set -# CONFIG_CRYPTO_SHA512_ARM is not set -# CONFIG_CRYPTO_SHA512_ARM64 is not set -# CONFIG_CRYPTO_SHA512_ARM64_CE is not set -# CONFIG_CRYPTO_SIMD is not set -CONFIG_CRYPTO_SKCIPHER=y -CONFIG_CRYPTO_SKCIPHER2=y -# CONFIG_CRYPTO_SM2 is not set -# CONFIG_CRYPTO_SM3 is not set -# CONFIG_CRYPTO_SM3_ARM64_CE is not set -# CONFIG_CRYPTO_SM3_GENERIC is not set -# CONFIG_CRYPTO_SM4 is not set -# CONFIG_CRYPTO_SM4_ARM64_CE is not set -# CONFIG_CRYPTO_SM4_GENERIC is not set -# CONFIG_CRYPTO_SPECK is not set -# CONFIG_CRYPTO_STATS is not set -# CONFIG_CRYPTO_STREEBOG is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_TEST is not set -# CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_TWOFISH_586 is not set -# CONFIG_CRYPTO_TWOFISH_COMMON is not set -# CONFIG_CRYPTO_USER is not set -# CONFIG_CRYPTO_USER_API_AEAD is not set -# CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set -# CONFIG_CRYPTO_USER_API_HASH is not set -# CONFIG_CRYPTO_USER_API_RNG is not set -# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set -# CONFIG_CRYPTO_USER_API_SKCIPHER is not set -# CONFIG_CRYPTO_VMAC is not set -# CONFIG_CRYPTO_WP512 is not set -# CONFIG_CRYPTO_XCBC is not set -# CONFIG_CRYPTO_XTS is not set -# CONFIG_CRYPTO_XXHASH is not set -# CONFIG_CRYPTO_ZLIB is not set -# CONFIG_CRYPTO_ZSTD is not set -# CONFIG_CS5535_MFGPT is not set -# CONFIG_CS89x0 is not set -# CONFIG_CS89x0_PLATFORM is not set -# CONFIG_CSD_LOCK_WAIT_DEBUG is not set -# CONFIG_CURRENT_POINTER_IN_TPIDRURO is not set -# CONFIG_CUSE is not set -# CONFIG_CW1200 is not set -# CONFIG_CXD2880_SPI_DRV is not set -# CONFIG_CXL_AFU_DRIVER_OPS is not set -# CONFIG_CXL_BASE is not set -# CONFIG_CXL_BUS is not set -# CONFIG_CXL_EEH is not set -# CONFIG_CXL_KERNEL_API is not set -# CONFIG_CXL_LIB is not set -# CONFIG_CYPRESS_FIRMWARE is not set -# CONFIG_DA280 is not set -# CONFIG_DA311 is not set -# CONFIG_DAMON is not set -# CONFIG_DAVICOM_PHY is not set -# CONFIG_DAX is not set -# CONFIG_DCB is not set -# CONFIG_DDR is not set -# CONFIG_DEBUG_ALIGN_RODATA is not set -# CONFIG_DEBUG_ATOMIC_SLEEP is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -# CONFIG_DEBUG_BUGVERBOSE is not set -# CONFIG_DEBUG_CREDENTIALS is not set -# CONFIG_DEBUG_DEVRES is not set -# CONFIG_DEBUG_DRIVER is not set -# CONFIG_DEBUG_EFI is not set -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_32B is not set -# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set -CONFIG_DEBUG_FS=y -CONFIG_DEBUG_FS_ALLOW_ALL=y -# CONFIG_DEBUG_FS_ALLOW_NONE is not set -# CONFIG_DEBUG_FS_DISALLOW_MOUNT is not set -# CONFIG_DEBUG_GPIO is not set -# CONFIG_DEBUG_HIGHMEM is not set -# CONFIG_DEBUG_ICEDCC is not set -# CONFIG_DEBUG_INFO is not set -# CONFIG_DEBUG_INFO_BTF is not set -# CONFIG_DEBUG_INFO_COMPRESSED is not set -# CONFIG_DEBUG_INFO_DWARF4 is not set -CONFIG_DEBUG_INFO_DWARF5=y -# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set -# CONFIG_DEBUG_INFO_NONE is not set -CONFIG_DEBUG_INFO_REDUCED=y -# CONFIG_DEBUG_INFO_SPLIT is not set -# CONFIG_DEBUG_IRQFLAGS is not set -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_KMAP_LOCAL is not set -# CONFIG_DEBUG_KMEMLEAK is not set -# CONFIG_DEBUG_KOBJECT is not set -# CONFIG_DEBUG_KOBJECT_RELEASE is not set -# CONFIG_DEBUG_LIST is not set -# CONFIG_DEBUG_LL is not set -# CONFIG_DEBUG_LL_UART_8250 is not set -# CONFIG_DEBUG_LL_UART_PL01X is not set -# CONFIG_DEBUG_LOCKDEP is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_DEBUG_MEMORY_INIT is not set -# CONFIG_DEBUG_MISC is not set -# CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_NET is not set -# CONFIG_DEBUG_NOTIFIERS is not set -# CONFIG_DEBUG_NX_TEST is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_DEBUG_PAGEALLOC is not set -# CONFIG_DEBUG_PAGE_REF is not set -# CONFIG_DEBUG_PERF_USE_VMALLOC is not set -# CONFIG_DEBUG_PER_CPU_MAPS is not set -# CONFIG_DEBUG_PINCTRL is not set -# CONFIG_DEBUG_PI_LIST is not set -# CONFIG_DEBUG_PLIST is not set -# CONFIG_DEBUG_PREEMPT is not set -# CONFIG_DEBUG_RODATA_TEST is not set -# CONFIG_DEBUG_RSEQ is not set -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_DEBUG_RWSEMS is not set -# CONFIG_DEBUG_SECTION_MISMATCH is not set -# CONFIG_DEBUG_SEMIHOSTING is not set -# CONFIG_DEBUG_SG is not set -# CONFIG_DEBUG_SHIRQ is not set -# CONFIG_DEBUG_SLAB is not set -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_DEBUG_STACKOVERFLOW is not set -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set -# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set -# CONFIG_DEBUG_TIMEKEEPING is not set -# CONFIG_DEBUG_UART_8250_PALMCHIP is not set -# CONFIG_DEBUG_UART_8250_WORD is not set -# CONFIG_DEBUG_UART_BCM63XX is not set -# CONFIG_DEBUG_UART_FLOW_CONTROL is not set -# CONFIG_DEBUG_USER is not set -# CONFIG_DEBUG_VIRTUAL is not set -# CONFIG_DEBUG_VM is not set -# CONFIG_DEBUG_VM_PGTABLE is not set -# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set -# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_WX is not set -# CONFIG_DEBUG_ZBOOT is not set -# CONFIG_DECNET is not set -CONFIG_DEFAULT_CUBIC=y -CONFIG_DEFAULT_DEADLINE=y -CONFIG_DEFAULT_HOSTNAME="(none)" -CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 -CONFIG_DEFAULT_INIT="" -CONFIG_DEFAULT_IOSCHED="deadline" -CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 -# CONFIG_DEFAULT_NOOP is not set -CONFIG_DEFAULT_PFIFO_FAST=y -# CONFIG_DEFAULT_RENO is not set -CONFIG_DEFAULT_SECURITY="" -CONFIG_DEFAULT_SECURITY_DAC=y -# CONFIG_DEFAULT_SECURITY_SELINUX is not set -CONFIG_DEFAULT_TCP_CONG="cubic" -CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set -# CONFIG_DELL_LAPTOP is not set -# CONFIG_DELL_RBTN is not set -# CONFIG_DELL_SMBIOS is not set -# CONFIG_DELL_SMO8800 is not set -# CONFIG_DEPRECATED_PARAM_STRUCT is not set -# CONFIG_DETECT_HUNG_TASK is not set -# CONFIG_DEVKMEM is not set -# CONFIG_DEVMEM is not set -CONFIG_DEVPORT=y -# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set -# CONFIG_DEVTMPFS is not set -# CONFIG_DEVTMPFS_MOUNT is not set -# CONFIG_DEV_DAX is not set -# CONFIG_DGAP is not set -# CONFIG_DGNC is not set -# CONFIG_DHT11 is not set -# CONFIG_DISCONTIGMEM_MANUAL is not set -# CONFIG_DISPLAY_CONNECTOR_ANALOG_TV is not set -# CONFIG_DISPLAY_CONNECTOR_DVI is not set -# CONFIG_DISPLAY_CONNECTOR_HDMI is not set -# CONFIG_DISPLAY_ENCODER_TFP410 is not set -# CONFIG_DISPLAY_ENCODER_TPD12S015 is not set -# CONFIG_DISPLAY_PANEL_DPI is not set -# CONFIG_DISPLAY_PANEL_LGPHILIPS_LB035Q02 is not set -# CONFIG_DISPLAY_PANEL_TPO_TD028TTEC1 is not set -# CONFIG_DISPLAY_PANEL_TPO_TD043MTEA1 is not set -# CONFIG_DL2K is not set -# CONFIG_DLHL60D is not set -# CONFIG_DLM is not set -# CONFIG_DM9000 is not set -# CONFIG_DMABUF_DEBUG is not set -# CONFIG_DMABUF_HEAPS is not set -# CONFIG_DMABUF_MOVE_NOTIFY is not set -# CONFIG_DMABUF_SELFTESTS is not set -# CONFIG_DMABUF_SYSFS_STATS is not set -# CONFIG_DMADEVICES is not set -# CONFIG_DMADEVICES_DEBUG is not set -# CONFIG_DMARD06 is not set -# CONFIG_DMARD09 is not set -# CONFIG_DMARD10 is not set -# CONFIG_DMASCC is not set -# CONFIG_DMATEST is not set -# CONFIG_DMA_API_DEBUG is not set -CONFIG_DMA_COHERENT_POOL=y -CONFIG_DMA_DECLARE_COHERENT=y -# CONFIG_DMA_ENGINE is not set -# CONFIG_DMA_FENCE_TRACE is not set -# CONFIG_DMA_JZ4780 is not set -# CONFIG_DMA_MAP_BENCHMARK is not set -CONFIG_DMA_NONCOHERENT_MMAP=y -# CONFIG_DMA_NOOP_OPS is not set -# CONFIG_DMA_PERNUMA_CMA is not set -# CONFIG_DMA_RESTRICTED_POOL is not set -# CONFIG_DMA_SHARED_BUFFER is not set -# CONFIG_DMA_VIRT_OPS is not set -# CONFIG_DM_CACHE is not set -# CONFIG_DM_CLONE is not set -# CONFIG_DM_DEBUG is not set -# CONFIG_DM_DELAY is not set -# CONFIG_DM_DUST is not set -# CONFIG_DM_EBS is not set -# CONFIG_DM_ERA is not set -# CONFIG_DM_FLAKEY is not set -# CONFIG_DM_INTEGRITY is not set -# CONFIG_DM_LOG_USERSPACE is not set -# CONFIG_DM_LOG_WRITES is not set -# CONFIG_DM_MQ_DEFAULT is not set -# CONFIG_DM_MULTIPATH is not set -# CONFIG_DM_RAID is not set -# CONFIG_DM_SWITCH is not set -# CONFIG_DM_THIN_PROVISIONING is not set -# CONFIG_DM_UEVENT is not set -# CONFIG_DM_UNSTRIPED is not set -# CONFIG_DM_VERITY is not set -# CONFIG_DM_WRITECACHE is not set -# CONFIG_DM_ZERO is not set -# CONFIG_DNET is not set -# CONFIG_DNOTIFY is not set -# CONFIG_DNS_RESOLVER is not set -CONFIG_DOUBLEFAULT=y -# CONFIG_DP83822_PHY is not set -# CONFIG_DP83848_PHY is not set -# CONFIG_DP83867_PHY is not set -# CONFIG_DP83869_PHY is not set -# CONFIG_DP83TC811_PHY is not set -# CONFIG_DP83TD510_PHY is not set -# CONFIG_DPOT_DAC is not set -# CONFIG_DPS310 is not set -CONFIG_DQL=y -# CONFIG_DRAGONRISE_FF is not set -# CONFIG_DRM is not set -# CONFIG_DRM_AMDGPU is not set -# CONFIG_DRM_AMDGPU_CIK is not set -# CONFIG_DRM_AMDGPU_GART_DEBUGFS is not set -# CONFIG_DRM_AMDGPU_SI is not set -# CONFIG_DRM_AMDGPU_USERPTR is not set -# CONFIG_DRM_AMD_ACP is not set -# CONFIG_DRM_AMD_DC_DCN2_0 is not set -# CONFIG_DRM_AMD_DC_DCN3_0 is not set -# CONFIG_DRM_AMD_DC_HDCP is not set -# CONFIG_DRM_AMD_DC_SI is not set -# CONFIG_DRM_ANALOGIX_ANX6345 is not set -# CONFIG_DRM_ANALOGIX_ANX78XX is not set -# CONFIG_DRM_ARCPGU is not set -# CONFIG_DRM_ARMADA is not set -# CONFIG_DRM_AST is not set -# CONFIG_DRM_BOCHS is not set -# CONFIG_DRM_CDNS_DSI is not set -# CONFIG_DRM_CDNS_MHDP8546 is not set -# CONFIG_DRM_CHRONTEL_CH7033 is not set -# CONFIG_DRM_CIRRUS_QEMU is not set -# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set -# CONFIG_DRM_DEBUG_MM is not set -# CONFIG_DRM_DEBUG_MODESET_LOCK is not set -# CONFIG_DRM_DEBUG_SELFTEST is not set -# CONFIG_DRM_DISPLAY_CONNECTOR is not set -# CONFIG_DRM_DP_AUX_CHARDEV is not set -# CONFIG_DRM_DP_CEC is not set -# CONFIG_DRM_DUMB_VGA_DAC is not set -# CONFIG_DRM_DW_HDMI_CEC is not set -# CONFIG_DRM_ETNAVIV is not set -# CONFIG_DRM_EXYNOS is not set -# CONFIG_DRM_FBDEV_EMULATION is not set -# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set -# CONFIG_DRM_FSL_DCU is not set -# CONFIG_DRM_GM12U320 is not set -# CONFIG_DRM_GMA500 is not set -# CONFIG_DRM_GUD is not set -# CONFIG_DRM_HDLCD is not set -# CONFIG_DRM_HISI_HIBMC is not set -# CONFIG_DRM_HISI_KIRIN is not set -# CONFIG_DRM_I2C_ADV7511 is not set -# CONFIG_DRM_I2C_CH7006 is not set -# CONFIG_DRM_I2C_NXP_TDA9950 is not set -# CONFIG_DRM_I2C_NXP_TDA998X is not set -# CONFIG_DRM_I2C_SIL164 is not set -# CONFIG_DRM_I915 is not set -CONFIG_DRM_I915_REQUEST_TIMEOUT=20000 -# CONFIG_DRM_KOMEDA is not set -# CONFIG_DRM_LEGACY is not set -# CONFIG_DRM_LIB_RANDOM is not set -# CONFIG_DRM_LIMA is not set -# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set -# CONFIG_DRM_LONTIUM_LT9611 is not set -# CONFIG_DRM_LVDS_CODEC is not set -# CONFIG_DRM_LVDS_ENCODER is not set -# CONFIG_DRM_MALI_DISPLAY is not set -# CONFIG_DRM_MCDE is not set -# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set -# CONFIG_DRM_MGAG200 is not set -# CONFIG_DRM_MXSFB is not set -# CONFIG_DRM_NOUVEAU is not set -# CONFIG_DRM_NWL_MIPI_DSI is not set -# CONFIG_DRM_NXP_PTN3460 is not set -# CONFIG_DRM_OMAP is not set -# CONFIG_DRM_PANEL_ARM_VERSATILE is not set -# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set -# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set -# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set -# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set -# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set -# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set -# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set -# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set -# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set -# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set -# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set -# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set -# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set -# CONFIG_DRM_PANEL_LG_LB035Q02 is not set -# CONFIG_DRM_PANEL_LG_LG4573 is not set -# CONFIG_DRM_PANEL_LVDS is not set -# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set -# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set -# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set -# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set -# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set -# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set -# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set -# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set -# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set -# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set -# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set -# CONFIG_DRM_PANEL_ROCKTECH_JH057N00900 is not set -# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set -# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set -# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set -# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set -# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set -# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set -# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set -# CONFIG_DRM_PANEL_SIMPLE is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set -# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set -# CONFIG_DRM_PANEL_SONY_ACX424AKP is not set -# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set -# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set -# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set -# CONFIG_DRM_PANEL_TPO_TPG110 is not set -# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set -# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set -# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set -# CONFIG_DRM_PANFROST is not set -# CONFIG_DRM_PARADE_PS8622 is not set -# CONFIG_DRM_PARADE_PS8640 is not set -# CONFIG_DRM_PL111 is not set -# CONFIG_DRM_QXL is not set -# CONFIG_DRM_RADEON is not set -# CONFIG_DRM_RADEON_USERPTR is not set -# CONFIG_DRM_RCAR_DW_HDMI is not set -# CONFIG_DRM_RCAR_LVDS is not set -# CONFIG_DRM_SII902X is not set -# CONFIG_DRM_SII9234 is not set -# CONFIG_DRM_SIL_SII8620 is not set -# CONFIG_DRM_SIMPLE_BRIDGE is not set -# CONFIG_DRM_STI is not set -# CONFIG_DRM_STM is not set -# CONFIG_DRM_SUN4I is not set -# CONFIG_DRM_THINE_THC63LVD1024 is not set -# CONFIG_DRM_TIDSS is not set -# CONFIG_DRM_TILCDC is not set -# CONFIG_DRM_TINYDRM is not set -# CONFIG_DRM_TI_SN65DSI86 is not set -# CONFIG_DRM_TI_TFP410 is not set -# CONFIG_DRM_TI_TPD12S015 is not set -# CONFIG_DRM_TOSHIBA_TC358762 is not set -# CONFIG_DRM_TOSHIBA_TC358764 is not set -# CONFIG_DRM_TOSHIBA_TC358767 is not set -# CONFIG_DRM_TOSHIBA_TC358768 is not set -# CONFIG_DRM_TOSHIBA_TC358775 is not set -# CONFIG_DRM_TVE200 is not set -# CONFIG_DRM_UDL is not set -# CONFIG_DRM_VBOXVIDEO is not set -# CONFIG_DRM_VC4_HDMI_CEC is not set -# CONFIG_DRM_VGEM is not set -# CONFIG_DRM_VIRTIO_GPU is not set -# CONFIG_DRM_VKMS is not set -# CONFIG_DRM_VMWGFX is not set -# CONFIG_DRM_XEN is not set -# CONFIG_DRM_XEN_FRONTEND is not set -# CONFIG_DS1682 is not set -# CONFIG_DS1803 is not set -# CONFIG_DS4424 is not set -# CONFIG_DST_CACHE is not set -# CONFIG_DTLK is not set -# CONFIG_DUMMY is not set -CONFIG_DUMMY_CONSOLE_COLUMNS=80 -CONFIG_DUMMY_CONSOLE_ROWS=25 -# CONFIG_DUMMY_IRQ is not set -# CONFIG_DVB_A8293 is not set -# CONFIG_DVB_AF9013 is not set -# CONFIG_DVB_AF9033 is not set -# CONFIG_DVB_AS102 is not set -# CONFIG_DVB_ASCOT2E is not set -# CONFIG_DVB_ATBM8830 is not set -# CONFIG_DVB_AU8522_DTV is not set -# CONFIG_DVB_AU8522_V4L is not set -# CONFIG_DVB_B2C2_FLEXCOP_USB is not set -# CONFIG_DVB_BCM3510 is not set -# CONFIG_DVB_CORE is not set -# CONFIG_DVB_CX22700 is not set -# CONFIG_DVB_CX22702 is not set -# CONFIG_DVB_CX24110 is not set -# CONFIG_DVB_CX24116 is not set -# CONFIG_DVB_CX24117 is not set -# CONFIG_DVB_CX24120 is not set -# CONFIG_DVB_CX24123 is not set -# CONFIG_DVB_CXD2099 is not set -# CONFIG_DVB_CXD2820R is not set -# CONFIG_DVB_CXD2841ER is not set -# CONFIG_DVB_CXD2880 is not set -# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set -# CONFIG_DVB_DIB3000MB is not set -# CONFIG_DVB_DIB3000MC is not set -# CONFIG_DVB_DIB7000M is not set -# CONFIG_DVB_DIB7000P is not set -# CONFIG_DVB_DIB8000 is not set -# CONFIG_DVB_DIB9000 is not set -# CONFIG_DVB_DRX39XYJ is not set -# CONFIG_DVB_DRXD is not set -# CONFIG_DVB_DRXK is not set -# CONFIG_DVB_DS3000 is not set -# CONFIG_DVB_DUMMY_FE is not set -# CONFIG_DVB_DYNAMIC_MINORS is not set -# CONFIG_DVB_EC100 is not set -# CONFIG_DVB_FIREDTV is not set -# CONFIG_DVB_HELENE is not set -# CONFIG_DVB_HORUS3A is not set -# CONFIG_DVB_ISL6405 is not set -# CONFIG_DVB_ISL6421 is not set -# CONFIG_DVB_ISL6423 is not set -# CONFIG_DVB_IX2505V is not set -# CONFIG_DVB_L64781 is not set -# CONFIG_DVB_LG2160 is not set -# CONFIG_DVB_LGDT3305 is not set -# CONFIG_DVB_LGDT3306A is not set -# CONFIG_DVB_LGDT330X is not set -# CONFIG_DVB_LGS8GL5 is not set -# CONFIG_DVB_LGS8GXX is not set -# CONFIG_DVB_LNBH25 is not set -# CONFIG_DVB_LNBH29 is not set -# CONFIG_DVB_LNBP21 is not set -# CONFIG_DVB_LNBP22 is not set -# CONFIG_DVB_M88DS3103 is not set -# CONFIG_DVB_M88RS2000 is not set -CONFIG_DVB_MAX_ADAPTERS=16 -# CONFIG_DVB_MB86A16 is not set -# CONFIG_DVB_MB86A20S is not set -# CONFIG_DVB_MMAP is not set -# CONFIG_DVB_MN88443X is not set -# CONFIG_DVB_MN88472 is not set -# CONFIG_DVB_MN88473 is not set -# CONFIG_DVB_MT312 is not set -# CONFIG_DVB_MT352 is not set -# CONFIG_DVB_MXL5XX is not set -# CONFIG_DVB_MXL692 is not set -# CONFIG_DVB_NET is not set -# CONFIG_DVB_NXT200X is not set -# CONFIG_DVB_NXT6000 is not set -# CONFIG_DVB_OR51132 is not set -# CONFIG_DVB_OR51211 is not set -# CONFIG_DVB_PLATFORM_DRIVERS is not set -# CONFIG_DVB_PLL is not set -# CONFIG_DVB_RTL2830 is not set -# CONFIG_DVB_RTL2832 is not set -# CONFIG_DVB_RTL2832_SDR is not set -# CONFIG_DVB_S5H1409 is not set -# CONFIG_DVB_S5H1411 is not set -# CONFIG_DVB_S5H1420 is not set -# CONFIG_DVB_S5H1432 is not set -# CONFIG_DVB_S921 is not set -# CONFIG_DVB_SI2165 is not set -# CONFIG_DVB_SI2168 is not set -# CONFIG_DVB_SI21XX is not set -# CONFIG_DVB_SP2 is not set -# CONFIG_DVB_SP8870 is not set -# CONFIG_DVB_SP887X is not set -# CONFIG_DVB_STB0899 is not set -# CONFIG_DVB_STB6000 is not set -# CONFIG_DVB_STB6100 is not set -# CONFIG_DVB_STV0288 is not set -# CONFIG_DVB_STV0297 is not set -# CONFIG_DVB_STV0299 is not set -# CONFIG_DVB_STV0367 is not set -# CONFIG_DVB_STV0900 is not set -# CONFIG_DVB_STV090x is not set -# CONFIG_DVB_STV0910 is not set -# CONFIG_DVB_STV6110 is not set -# CONFIG_DVB_STV6110x is not set -# CONFIG_DVB_STV6111 is not set -# CONFIG_DVB_TC90522 is not set -# CONFIG_DVB_TDA10021 is not set -# CONFIG_DVB_TDA10023 is not set -# CONFIG_DVB_TDA10048 is not set -# CONFIG_DVB_TDA1004X is not set -# CONFIG_DVB_TDA10071 is not set -# CONFIG_DVB_TDA10086 is not set -# CONFIG_DVB_TDA18271C2DD is not set -# CONFIG_DVB_TDA665x is not set -# CONFIG_DVB_TDA8083 is not set -# CONFIG_DVB_TDA8261 is not set -# CONFIG_DVB_TDA826X is not set -# CONFIG_DVB_TEST_DRIVERS is not set -# CONFIG_DVB_TS2020 is not set -# CONFIG_DVB_TTUSB_BUDGET is not set -# CONFIG_DVB_TTUSB_DEC is not set -# CONFIG_DVB_TUA6100 is not set -# CONFIG_DVB_TUNER_CX24113 is not set -# CONFIG_DVB_TUNER_DIB0070 is not set -# CONFIG_DVB_TUNER_DIB0090 is not set -# CONFIG_DVB_TUNER_ITD1000 is not set -# CONFIG_DVB_ULE_DEBUG is not set -# CONFIG_DVB_USB_V2 is not set -# CONFIG_DVB_VES1820 is not set -# CONFIG_DVB_VES1X93 is not set -# CONFIG_DVB_ZD1301_DEMOD is not set -# CONFIG_DVB_ZL10036 is not set -# CONFIG_DVB_ZL10039 is not set -# CONFIG_DVB_ZL10353 is not set -# CONFIG_DWC_XLGMAC is not set -# CONFIG_DWMAC_DWC_QOS_ETH is not set -# CONFIG_DWMAC_INTEL_PLAT is not set -# CONFIG_DWMAC_IPQ806X is not set -# CONFIG_DWMAC_LOONGSON is not set -# CONFIG_DWMAC_LPC18XX is not set -# CONFIG_DWMAC_MESON is not set -# CONFIG_DWMAC_ROCKCHIP is not set -# CONFIG_DWMAC_SOCFPGA is not set -# CONFIG_DWMAC_STI is not set -# CONFIG_DW_AXI_DMAC is not set -# CONFIG_DW_DMAC is not set -# CONFIG_DW_DMAC_PCI is not set -# CONFIG_DW_EDMA is not set -# CONFIG_DW_EDMA_PCIE is not set -# CONFIG_DW_WATCHDOG is not set -# CONFIG_DW_XDATA_PCIE is not set -# CONFIG_DYNAMIC_DEBUG is not set -CONFIG_DYNAMIC_DEBUG_CORE=y -# CONFIG_E100 is not set -# CONFIG_E1000 is not set -# CONFIG_E1000E is not set -# CONFIG_E1000E_HWTS is not set -# CONFIG_EARLY_PRINTK_8250 is not set -# CONFIG_EARLY_PRINTK_USB_XDBC is not set -# CONFIG_EBC_C384_WDT is not set -# CONFIG_ECHO is not set -# CONFIG_ECRYPT_FS is not set -# CONFIG_EDAC is not set -# CONFIG_EEEPC_LAPTOP is not set -# CONFIG_EEPROM_93CX6 is not set -# CONFIG_EEPROM_93XX46 is not set -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_AT25 is not set -# CONFIG_EEPROM_DIGSY_MTC_CFG is not set -# CONFIG_EEPROM_EE1004 is not set -# CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set -# CONFIG_EFI is not set -CONFIG_EFI_PARTITION=y -# CONFIG_EFS_FS is not set -CONFIG_ELFCORE=y -# CONFIG_ELF_CORE is not set -# CONFIG_EMAC_ROCKCHIP is not set -CONFIG_EMBEDDED=y -# CONFIG_EM_TIMER_STI is not set -# CONFIG_ENABLE_MUST_CHECK is not set -CONFIG_ENABLE_WARN_DEPRECATED=y -# CONFIG_ENA_ETHERNET is not set -# CONFIG_ENC28J60 is not set -# CONFIG_ENCLOSURE_SERVICES is not set -# CONFIG_ENCRYPTED_KEYS is not set -# CONFIG_ENCX24J600 is not set -# CONFIG_ENERGY_MODEL is not set -# CONFIG_ENIC is not set -# CONFIG_ENVELOPE_DETECTOR is not set -# CONFIG_EPAPR_PARAVIRT is not set -# CONFIG_EPIC100 is not set -CONFIG_EPOLL=y -# CONFIG_EQUALIZER is not set -# CONFIG_EROFS_FS is not set -# CONFIG_ET131X is not set -CONFIG_ETHERNET=y -# CONFIG_ETHOC is not set -CONFIG_ETHTOOL_NETLINK=y -CONFIG_EVENTFD=y -# CONFIG_EVM is not set -# CONFIG_EXCLUSIVE_SYSTEM_RAM is not set -# CONFIG_EXFAT_FS is not set -CONFIG_EXPERT=y -CONFIG_EXPORTFS=y -# CONFIG_EXPORTFS_BLOCK_OPS is not set -# CONFIG_EXT2_FS is not set -CONFIG_EXT2_FS_XATTR=y -# CONFIG_EXT3_FS is not set -# CONFIG_EXT4_DEBUG is not set -# CONFIG_EXT4_ENCRYPTION is not set -# CONFIG_EXT4_FS is not set -# CONFIG_EXT4_FS_POSIX_ACL is not set -# CONFIG_EXT4_FS_SECURITY is not set -CONFIG_EXT4_USE_FOR_EXT2=y -# CONFIG_EXTCON is not set -# CONFIG_EXTCON_ADC_JACK is not set -# CONFIG_EXTCON_ARIZONA is not set -# CONFIG_EXTCON_AXP288 is not set -# CONFIG_EXTCON_FSA9480 is not set -# CONFIG_EXTCON_GPIO is not set -# CONFIG_EXTCON_INTEL_INT3496 is not set -# CONFIG_EXTCON_MAX3355 is not set -# CONFIG_EXTCON_PTN5150 is not set -# CONFIG_EXTCON_QCOM_SPMI_MISC is not set -# CONFIG_EXTCON_RT8973A is not set -# CONFIG_EXTCON_SM5502 is not set -# CONFIG_EXTCON_USBC_TUSB320 is not set -# CONFIG_EXTCON_USB_GPIO is not set -CONFIG_EXTRA_FIRMWARE="" -CONFIG_EXTRA_TARGETS="" -# CONFIG_EXYNOS_ADC is not set -# CONFIG_EXYNOS_VIDEO is not set -# CONFIG_EZCHIP_NPS_MANAGEMENT_ENET is not set -# CONFIG_EZX_PCAP is not set -# CONFIG_F2FS_CHECK_FS is not set -# CONFIG_F2FS_FAULT_INJECTION is not set -# CONFIG_F2FS_FS is not set -# CONFIG_F2FS_FS_COMPRESSION is not set -# CONFIG_F2FS_FS_ENCRYPTION is not set -# CONFIG_F2FS_FS_POSIX_ACL is not set -# CONFIG_F2FS_FS_SECURITY is not set -CONFIG_F2FS_FS_XATTR=y -# CONFIG_F2FS_IOSTAT is not set -# CONFIG_F2FS_IO_TRACE is not set -CONFIG_F2FS_STAT_FS=y -# CONFIG_F2FS_UNFAIR_RWSEM is not set -# CONFIG_FAILOVER is not set -# CONFIG_FAIR_GROUP_SCHED is not set -# CONFIG_FANOTIFY is not set -# CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set -CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" -# CONFIG_FAT_DEFAULT_UTF8 is not set -# CONFIG_FAT_FS is not set -# CONFIG_FAULT_INJECTION is not set -# CONFIG_FB is not set -# CONFIG_FB_3DFX is not set -# CONFIG_FB_ARC is not set -# CONFIG_FB_ARK is not set -# CONFIG_FB_ARMCLCD is not set -# CONFIG_FB_ASILIANT is not set -# CONFIG_FB_ATY is not set -# CONFIG_FB_ATY128 is not set -# CONFIG_FB_AUO_K190X is not set -# CONFIG_FB_BACKLIGHT is not set -# CONFIG_FB_BIG_ENDIAN is not set -# CONFIG_FB_BOOT_VESA_SUPPORT is not set -# CONFIG_FB_BOTH_ENDIAN is not set -# CONFIG_FB_BROADSHEET is not set -# CONFIG_FB_CARMINE is not set -# CONFIG_FB_CFB_COPYAREA is not set -# CONFIG_FB_CFB_FILLRECT is not set -# CONFIG_FB_CFB_IMAGEBLIT is not set -# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_CYBER2000 is not set -# CONFIG_FB_DA8XX is not set -# CONFIG_FB_DDC is not set -# CONFIG_FB_FLEX is not set -# CONFIG_FB_FOREIGN_ENDIAN is not set -# CONFIG_FB_GEODE is not set -# CONFIG_FB_GOLDFISH is not set -# CONFIG_FB_HGA is not set -# CONFIG_FB_I740 is not set -# CONFIG_FB_IBM_GXT4500 is not set -# CONFIG_FB_IMSTT is not set -# CONFIG_FB_IMX is not set -# CONFIG_FB_KYRO is not set -# CONFIG_FB_LE80578 is not set -# CONFIG_FB_LITTLE_ENDIAN is not set -# CONFIG_FB_MACMODES is not set -# CONFIG_FB_MATROX is not set -# CONFIG_FB_MB862XX is not set -# CONFIG_FB_METRONOME is not set -# CONFIG_FB_MODE_HELPERS is not set -# CONFIG_FB_MXS is not set -# CONFIG_FB_N411 is not set -# CONFIG_FB_NEOMAGIC is not set -CONFIG_FB_NOTIFY=y -# CONFIG_FB_NVIDIA is not set -# CONFIG_FB_OF is not set -# CONFIG_FB_OMAP2 is not set -# CONFIG_FB_OPENCORES is not set -# CONFIG_FB_PM2 is not set -# CONFIG_FB_PM3 is not set -# CONFIG_FB_PS3 is not set -# CONFIG_FB_PXA is not set -# CONFIG_FB_RADEON is not set -# CONFIG_FB_RIVA is not set -# CONFIG_FB_S1D13XXX is not set -# CONFIG_FB_S3 is not set -# CONFIG_FB_SAVAGE is not set -# CONFIG_FB_SIMPLE is not set -# CONFIG_FB_SIS is not set -# CONFIG_FB_SM712 is not set -# CONFIG_FB_SM750 is not set -# CONFIG_FB_SMSCUFX is not set -# CONFIG_FB_SSD1307 is not set -# CONFIG_FB_SVGALIB is not set -# CONFIG_FB_SYS_COPYAREA is not set -# CONFIG_FB_SYS_FILLRECT is not set -# CONFIG_FB_SYS_FOPS is not set -# CONFIG_FB_SYS_IMAGEBLIT is not set -# CONFIG_FB_TFT is not set -# CONFIG_FB_TFT_AGM1264K_FL is not set -# CONFIG_FB_TFT_BD663474 is not set -# CONFIG_FB_TFT_FBTFT_DEVICE is not set -# CONFIG_FB_TFT_HX8340BN is not set -# CONFIG_FB_TFT_HX8347D is not set -# CONFIG_FB_TFT_HX8353D is not set -# CONFIG_FB_TFT_HX8357D is not set -# CONFIG_FB_TFT_ILI9163 is not set -# CONFIG_FB_TFT_ILI9320 is not set -# CONFIG_FB_TFT_ILI9325 is not set -# CONFIG_FB_TFT_ILI9340 is not set -# CONFIG_FB_TFT_ILI9341 is not set -# CONFIG_FB_TFT_ILI9481 is not set -# CONFIG_FB_TFT_ILI9486 is not set -# CONFIG_FB_TFT_PCD8544 is not set -# CONFIG_FB_TFT_RA8875 is not set -# CONFIG_FB_TFT_S6D02A1 is not set -# CONFIG_FB_TFT_S6D1121 is not set -# CONFIG_FB_TFT_SEPS525 is not set -# CONFIG_FB_TFT_SH1106 is not set -# CONFIG_FB_TFT_SSD1289 is not set -# CONFIG_FB_TFT_SSD1305 is not set -# CONFIG_FB_TFT_SSD1306 is not set -# CONFIG_FB_TFT_SSD1325 is not set -# CONFIG_FB_TFT_SSD1331 is not set -# CONFIG_FB_TFT_SSD1351 is not set -# CONFIG_FB_TFT_ST7735R is not set -# CONFIG_FB_TFT_ST7789V is not set -# CONFIG_FB_TFT_TINYLCD is not set -# CONFIG_FB_TFT_TLS8204 is not set -# CONFIG_FB_TFT_UC1611 is not set -# CONFIG_FB_TFT_UC1701 is not set -# CONFIG_FB_TFT_UPD161704 is not set -# CONFIG_FB_TFT_WATTEROTT is not set -# CONFIG_FB_TILEBLITTING is not set -# CONFIG_FB_TMIO is not set -# CONFIG_FB_TRIDENT is not set -# CONFIG_FB_UDL is not set -# CONFIG_FB_UVESA is not set -# CONFIG_FB_VGA16 is not set -# CONFIG_FB_VIA is not set -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FB_VOODOO1 is not set -# CONFIG_FB_VT8623 is not set -# CONFIG_FB_XGI is not set -# CONFIG_FCOE is not set -# CONFIG_FCOE_FNIC is not set -# CONFIG_FDDI is not set -# CONFIG_FEALNX is not set -# CONFIG_FENCE_TRACE is not set -# CONFIG_FHANDLE is not set -CONFIG_FIB_RULES=y -# CONFIG_FIELDBUS_DEV is not set -CONFIG_FILE_LOCKING=y -# CONFIG_FIND_BIT_BENCHMARK is not set -# CONFIG_FIREWIRE is not set -# CONFIG_FIREWIRE_NOSY is not set -# CONFIG_FIREWIRE_SERIAL is not set -# CONFIG_FIRMWARE_EDID is not set -# CONFIG_FIRMWARE_IN_KERNEL is not set -# CONFIG_FIRMWARE_MEMMAP is not set -# CONFIG_FIT_PARTITION is not set -# CONFIG_FIXED_PHY is not set -CONFIG_FLATMEM=y -CONFIG_FLATMEM_MANUAL=y -CONFIG_FLAT_NODE_MEM_MAP=y -# CONFIG_FM10K is not set -# CONFIG_FMC is not set -# CONFIG_FONTS is not set -# CONFIG_FONT_6x8 is not set -# CONFIG_FONT_TER16x32 is not set -# CONFIG_FORCEDETH is not set -CONFIG_FORCE_MAX_ZONEORDER=11 -CONFIG_FORTIFY_SOURCE=y -# CONFIG_FPGA is not set -# CONFIG_FRAMEBUFFER_CONSOLE is not set -# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set -# CONFIG_FRAME_POINTER is not set -CONFIG_FRAME_WARN=1024 -# CONFIG_FREEZER is not set -# CONFIG_FRONTSWAP is not set -# CONFIG_FSCACHE is not set -# CONFIG_FSI is not set -# CONFIG_FSL_EDMA is not set -# CONFIG_FSL_ERRATUM_A008585 is not set -# CONFIG_FSL_MC_BUS is not set -# CONFIG_FSL_PQ_MDIO is not set -# CONFIG_FSL_QDMA is not set -# CONFIG_FSL_RCPM is not set -# CONFIG_FSL_XGMAC_MDIO is not set -CONFIG_FSNOTIFY=y -# CONFIG_FS_DAX is not set -# CONFIG_FS_ENCRYPTION is not set -# CONFIG_FS_POSIX_ACL is not set -# CONFIG_FS_VERITY is not set -# CONFIG_FTGMAC100 is not set -# CONFIG_FTL is not set -# CONFIG_FTMAC100 is not set -# CONFIG_FTRACE is not set -# CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_FTR_FIXUP_SELFTEST is not set -# CONFIG_FTWDT010_WATCHDOG is not set -# CONFIG_FUJITSU_ERRATUM_010001 is not set -# CONFIG_FUJITSU_ES is not set -# CONFIG_FUJITSU_LAPTOP is not set -# CONFIG_FUJITSU_TABLET is not set -# CONFIG_FUNCTION_TRACER is not set -# CONFIG_FUSE_FS is not set -# CONFIG_FUSION is not set -# CONFIG_FUSION_FC is not set -# CONFIG_FUSION_SAS is not set -# CONFIG_FUSION_SPI is not set -CONFIG_FUTEX=y -CONFIG_FUTEX_PI=y -# CONFIG_FWNODE_MDIO is not set -# CONFIG_FW_CFG_SYSFS is not set -CONFIG_FW_LOADER=y -# CONFIG_FW_LOADER_COMPRESS is not set -CONFIG_FW_LOADER_USER_HELPER=y -CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y -# CONFIG_FW_UPLOAD is not set -# CONFIG_FXAS21002C is not set -# CONFIG_FXLS8962AF_I2C is not set -# CONFIG_FXLS8962AF_SPI is not set -# CONFIG_FXOS8700_I2C is not set -# CONFIG_FXOS8700_SPI is not set -CONFIG_GACT_PROB=y -# CONFIG_GADGET_UAC1 is not set -# CONFIG_GAMEPORT is not set -# CONFIG_GATEWORKS_GW16083 is not set -# CONFIG_GCC_PLUGINS is not set -# CONFIG_GCOV is not set -# CONFIG_GCOV_KERNEL is not set -# CONFIG_GDB_SCRIPTS is not set -# CONFIG_GEMINI_ETHERNET is not set -# CONFIG_GENERIC_ADC_BATTERY is not set -# CONFIG_GENERIC_ADC_THERMAL is not set -CONFIG_GENERIC_CALIBRATE_DELAY=y -# CONFIG_GENERIC_CPU_DEVICES is not set -# CONFIG_GENERIC_FIND_FIRST_BIT is not set -CONFIG_GENERIC_HWEIGHT=y -# CONFIG_GENERIC_IRQ_DEBUGFS is not set -CONFIG_GENERIC_IRQ_IPI=y -CONFIG_GENERIC_IRQ_PROBE=y -# CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED is not set -CONFIG_GENERIC_NET_UTILS=y -# CONFIG_GENERIC_PHY is not set -# CONFIG_GENERIC_PINCONF is not set -# CONFIG_GENERIC_PINCTRL_GROUPS is not set -# CONFIG_GENERIC_PINMUX_FUNCTIONS is not set -CONFIG_GENERIC_PTDUMP=y -CONFIG_GENERIC_VDSO_TIME_NS=y -# CONFIG_GENEVE is not set -# CONFIG_GENWQE is not set -# CONFIG_GFS2_FS is not set -# CONFIG_GIGASET_CAPI is not set -# CONFIG_GIGASET_DEBUG is not set -# CONFIG_GIGASET_DUMMYLL is not set -# CONFIG_GLOB_SELFTEST is not set -# CONFIG_GNSS is not set -# CONFIG_GOLDFISH is not set -# CONFIG_GOOGLE_FIRMWARE is not set -# CONFIG_GP2AP002 is not set -# CONFIG_GP2AP020A00F is not set -# CONFIG_GPD_POCKET_FAN is not set -# CONFIG_GPIOLIB is not set -CONFIG_GPIOLIB_FASTPATH_LIMIT=512 -# CONFIG_GPIO_104_DIO_48E is not set -# CONFIG_GPIO_104_IDIO_16 is not set -# CONFIG_GPIO_104_IDI_48 is not set -# CONFIG_GPIO_74X164 is not set -# CONFIG_GPIO_74XX_MMIO is not set -# CONFIG_GPIO_ADNP is not set -# CONFIG_GPIO_ADP5588 is not set -# CONFIG_GPIO_AGGREGATOR is not set -# CONFIG_GPIO_ALTERA is not set -# CONFIG_GPIO_AMD8111 is not set -# CONFIG_GPIO_AMDPT is not set -# CONFIG_GPIO_AMD_FCH is not set -# CONFIG_GPIO_BCM_KONA is not set -# CONFIG_GPIO_BT8XX is not set -# CONFIG_GPIO_CADENCE is not set -# CONFIG_GPIO_CDEV is not set -# CONFIG_GPIO_CDEV_V1 is not set -# CONFIG_GPIO_CS5535 is not set -# CONFIG_GPIO_DWAPB is not set -# CONFIG_GPIO_EM is not set -# CONFIG_GPIO_EXAR is not set -# CONFIG_GPIO_F7188X is not set -# CONFIG_GPIO_FTGPIO010 is not set -# CONFIG_GPIO_GENERIC_PLATFORM is not set -# CONFIG_GPIO_GPIO_MM is not set -# CONFIG_GPIO_GRGPIO is not set -# CONFIG_GPIO_GW_PLD is not set -# CONFIG_GPIO_HLWD is not set -# CONFIG_GPIO_ICH is not set -# CONFIG_GPIO_IT87 is not set -# CONFIG_GPIO_LOGICVC is not set -# CONFIG_GPIO_LYNXPOINT is not set -# CONFIG_GPIO_MAX3191X is not set -# CONFIG_GPIO_MAX7300 is not set -# CONFIG_GPIO_MAX7301 is not set -# CONFIG_GPIO_MAX732X is not set -# CONFIG_GPIO_MB86S7X is not set -# CONFIG_GPIO_MC33880 is not set -# CONFIG_GPIO_MCP23S08 is not set -# CONFIG_GPIO_ML_IOH is not set -# CONFIG_GPIO_MOCKUP is not set -# CONFIG_GPIO_MPC8XXX is not set -# CONFIG_GPIO_PCA953X is not set -# CONFIG_GPIO_PCA953X_IRQ is not set -# CONFIG_GPIO_PCA9570 is not set -# CONFIG_GPIO_PCF857X is not set -# CONFIG_GPIO_PCH is not set -# CONFIG_GPIO_PCIE_IDIO_24 is not set -# CONFIG_GPIO_PCI_IDIO_16 is not set -# CONFIG_GPIO_PISOSR is not set -# CONFIG_GPIO_PL061 is not set -# CONFIG_GPIO_RCAR is not set -# CONFIG_GPIO_RDC321X is not set -# CONFIG_GPIO_ROCKCHIP is not set -# CONFIG_GPIO_SAMA5D2_PIOBU is not set -# CONFIG_GPIO_SCH is not set -# CONFIG_GPIO_SCH311X is not set -# CONFIG_GPIO_SIFIVE is not set -# CONFIG_GPIO_SX150X is not set -# CONFIG_GPIO_SYSCON is not set -CONFIG_GPIO_SYSFS=y -# CONFIG_GPIO_TPIC2810 is not set -# CONFIG_GPIO_TS4900 is not set -# CONFIG_GPIO_TS5500 is not set -# CONFIG_GPIO_VX855 is not set -# CONFIG_GPIO_WATCHDOG is not set -# CONFIG_GPIO_WINBOND is not set -# CONFIG_GPIO_WS16C48 is not set -# CONFIG_GPIO_XGENE is not set -# CONFIG_GPIO_XILINX is not set -# CONFIG_GPIO_XRA1403 is not set -# CONFIG_GPIO_ZEVIO is not set -# CONFIG_GPIO_ZX is not set -# CONFIG_GREENASIA_FF is not set -# CONFIG_GREYBUS is not set -# CONFIG_GS_FPGABOOT is not set -# CONFIG_GTP is not set -# CONFIG_GUP_BENCHMARK is not set -# CONFIG_GUP_TEST is not set -# CONFIG_GVE is not set -# CONFIG_HABANA_AI is not set -# CONFIG_HAMACHI is not set -# CONFIG_HAMRADIO is not set -# CONFIG_HAPPYMEAL is not set -CONFIG_HARDENED_USERCOPY=y -# CONFIG_HARDENED_USERCOPY_FALLBACK is not set -# CONFIG_HARDENED_USERCOPY_PAGESPAN is not set -CONFIG_HARDEN_EL2_VECTORS=y -# CONFIG_HARDLOCKUP_DETECTOR is not set -# CONFIG_HAVE_ARM_ARCH_TIMER is not set -# CONFIG_HCALL_STATS is not set -# CONFIG_HDC100X is not set -# CONFIG_HDC2010 is not set -# CONFIG_HDLC is not set -# CONFIG_HDLC_CISCO is not set -# CONFIG_HDLC_FR is not set -# CONFIG_HDLC_PPP is not set -# CONFIG_HDLC_RAW is not set -# CONFIG_HDLC_RAW_ETH is not set -# CONFIG_HDMI_LPE_AUDIO is not set -# CONFIG_HDQ_MASTER_OMAP is not set -# CONFIG_HEADERS_CHECK is not set -# CONFIG_HEADERS_INSTALL is not set -# CONFIG_HEADER_TEST is not set -# CONFIG_HERMES is not set -# CONFIG_HFSPLUS_FS is not set -# CONFIG_HFSPLUS_FS_POSIX_ACL is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFS_FS_POSIX_ACL is not set -# CONFIG_HI8435 is not set -# CONFIG_HIBERNATION is not set -# CONFIG_HID is not set -# CONFIG_HIDRAW is not set -# CONFIG_HID_A4TECH is not set -# CONFIG_HID_ACCUTOUCH is not set -# CONFIG_HID_ACRUX is not set -# CONFIG_HID_ACRUX_FF is not set -# CONFIG_HID_ALPS is not set -# CONFIG_HID_APPLE is not set -# CONFIG_HID_APPLEIR is not set -# CONFIG_HID_ASUS is not set -# CONFIG_HID_AUREAL is not set -# CONFIG_HID_BATTERY_STRENGTH is not set -# CONFIG_HID_BELKIN is not set -# CONFIG_HID_BETOP_FF is not set -# CONFIG_HID_BIGBEN_FF is not set -# CONFIG_HID_CHERRY is not set -# CONFIG_HID_CHICONY is not set -# CONFIG_HID_CMEDIA is not set -# CONFIG_HID_CORSAIR is not set -# CONFIG_HID_COUGAR is not set -# CONFIG_HID_CP2112 is not set -# CONFIG_HID_CREATIVE_SB0540 is not set -# CONFIG_HID_CYPRESS is not set -# CONFIG_HID_DRAGONRISE is not set -# CONFIG_HID_ELAN is not set -# CONFIG_HID_ELECOM is not set -# CONFIG_HID_ELO is not set -# CONFIG_HID_EMS_FF is not set -# CONFIG_HID_EZKEY is not set -# CONFIG_HID_FT260 is not set -# CONFIG_HID_GEMBIRD is not set -# CONFIG_HID_GENERIC is not set -# CONFIG_HID_GFRM is not set -# CONFIG_HID_GLORIOUS is not set -# CONFIG_HID_GOOGLE_HAMMER is not set -# CONFIG_HID_GREENASIA is not set -# CONFIG_HID_GT683R is not set -# CONFIG_HID_GYRATION is not set -# CONFIG_HID_HOLTEK is not set -# CONFIG_HID_ICADE is not set -# CONFIG_HID_ITE is not set -# CONFIG_HID_JABRA is not set -# CONFIG_HID_KENSINGTON is not set -# CONFIG_HID_KEYTOUCH is not set -# CONFIG_HID_KYE is not set -# CONFIG_HID_LCPOWER is not set -# CONFIG_HID_LED is not set -# CONFIG_HID_LENOVO is not set -# CONFIG_HID_LETSKETCH is not set -# CONFIG_HID_LOGITECH is not set -# CONFIG_HID_LOGITECH_DJ is not set -# CONFIG_HID_LOGITECH_HIDPP is not set -# CONFIG_HID_MACALLY is not set -# CONFIG_HID_MAGICMOUSE is not set -# CONFIG_HID_MALTRON is not set -# CONFIG_HID_MAYFLASH is not set -# CONFIG_HID_MCP2221 is not set -# CONFIG_HID_MEGAWORLD_FF is not set -# CONFIG_HID_MICROSOFT is not set -# CONFIG_HID_MONTEREY is not set -# CONFIG_HID_MULTITOUCH is not set -# CONFIG_HID_NINTENDO is not set -# CONFIG_HID_NTI is not set -# CONFIG_HID_NTRIG is not set -# CONFIG_HID_ORTEK is not set -# CONFIG_HID_PANTHERLORD is not set -# CONFIG_HID_PENMOUNT is not set -# CONFIG_HID_PETALYNX is not set -# CONFIG_HID_PICOLCD is not set -# CONFIG_HID_PID is not set -# CONFIG_HID_PLANTRONICS is not set -# CONFIG_HID_PLAYSTATION is not set -# CONFIG_HID_PRIMAX is not set -# CONFIG_HID_PRODIKEYS is not set -# CONFIG_HID_RAZER is not set -# CONFIG_HID_REDRAGON is not set -# CONFIG_HID_RETRODE is not set -# CONFIG_HID_RMI is not set -# CONFIG_HID_ROCCAT is not set -# CONFIG_HID_SAITEK is not set -# CONFIG_HID_SAMSUNG is not set -# CONFIG_HID_SEMITEK is not set -# CONFIG_HID_SENSOR_HUB is not set -# CONFIG_HID_SIGMAMICRO is not set -# CONFIG_HID_SMARTJOYPLUS is not set -# CONFIG_HID_SONY is not set -# CONFIG_HID_SPEEDLINK is not set -# CONFIG_HID_STEAM is not set -# CONFIG_HID_STEELSERIES is not set -# CONFIG_HID_SUNPLUS is not set -# CONFIG_HID_THINGM is not set -# CONFIG_HID_THRUSTMASTER is not set -# CONFIG_HID_TIVO is not set -# CONFIG_HID_TOPSEED is not set -# CONFIG_HID_TWINHAN is not set -# CONFIG_HID_U2FZERO is not set -# CONFIG_HID_UCLOGIC is not set -# CONFIG_HID_UDRAW_PS3 is not set -# CONFIG_HID_VIEWSONIC is not set -# CONFIG_HID_VIVALDI is not set -# CONFIG_HID_WACOM is not set -# CONFIG_HID_WALTOP is not set -# CONFIG_HID_WIIMOTE is not set -# CONFIG_HID_XIAOM is not set -# CONFIG_HID_XIAOMI is not set -# CONFIG_HID_XINMO is not set -# CONFIG_HID_ZEROPLUS is not set -# CONFIG_HID_ZYDACRON is not set -# CONFIG_HIGHMEM is not set -CONFIG_HIGH_RES_TIMERS=y -# CONFIG_HINIC is not set -# CONFIG_HIP04_ETH is not set -# CONFIG_HIPPI is not set -# CONFIG_HISILICON_ERRATUM_161010101 is not set -# CONFIG_HISILICON_ERRATUM_161600802 is not set -# CONFIG_HISI_DMA is not set -# CONFIG_HISI_FEMAC is not set -# CONFIG_HISI_HIKEY_USB is not set -# CONFIG_HISI_PCIE_PMU is not set -# CONFIG_HIX5HD2_GMAC is not set -# CONFIG_HMC425 is not set -# CONFIG_HMC6352 is not set -# CONFIG_HNS is not set -# CONFIG_HNS3 is not set -# CONFIG_HNS_DSAF is not set -# CONFIG_HNS_ENET is not set -# CONFIG_HOSTAP is not set -# CONFIG_HOSTAP_CS is not set -# CONFIG_HOSTAP_PCI is not set -# CONFIG_HOSTAP_PLX is not set -# CONFIG_HOTPLUG_CPU is not set -# CONFIG_HOTPLUG_PCI is not set -# CONFIG_HOTPLUG_PCI_SHPC is not set -# CONFIG_HP03 is not set -# CONFIG_HP100 is not set -# CONFIG_HP206C is not set -CONFIG_HPET_MMAP_DEFAULT=y -# CONFIG_HPFS_FS is not set -# CONFIG_HP_ILO is not set -# CONFIG_HP_WIRELESS is not set -# CONFIG_HSA_AMD is not set -# CONFIG_HSI is not set -# CONFIG_HSR is not set -# CONFIG_HTC_EGPIO is not set -# CONFIG_HTC_I2CPLD is not set -# CONFIG_HTC_PASIC3 is not set -# CONFIG_HTE is not set -# CONFIG_HTS221 is not set -# CONFIG_HTU21 is not set -# CONFIG_HUGETLBFS is not set -# CONFIG_HUGETLB_PAGE is not set -# CONFIG_HVC_DCC is not set -# CONFIG_HVC_UDBG is not set -# CONFIG_HWLAT_TRACER is not set -# CONFIG_HWMON is not set -# CONFIG_HWMON_DEBUG_CHIP is not set -# CONFIG_HWMON_VID is not set -# CONFIG_HWSPINLOCK is not set -# CONFIG_HWSPINLOCK_OMAP is not set -CONFIG_HW_PERF_EVENTS=y -# CONFIG_HW_RANDOM is not set -# CONFIG_HW_RANDOM_AMD is not set -# CONFIG_HW_RANDOM_ARM_SMCCC_TRNG is not set -# CONFIG_HW_RANDOM_ATMEL is not set -# CONFIG_HW_RANDOM_BA431 is not set -# CONFIG_HW_RANDOM_CAVIUM is not set -# CONFIG_HW_RANDOM_CCTRNG is not set -# CONFIG_HW_RANDOM_CN10K is not set -# CONFIG_HW_RANDOM_EXYNOS is not set -# CONFIG_HW_RANDOM_GEODE is not set -# CONFIG_HW_RANDOM_INTEL is not set -# CONFIG_HW_RANDOM_IPROC_RNG200 is not set -# CONFIG_HW_RANDOM_MTK is not set -# CONFIG_HW_RANDOM_OMAP is not set -# CONFIG_HW_RANDOM_OMAP3_ROM is not set -# CONFIG_HW_RANDOM_PPC4XX is not set -# CONFIG_HW_RANDOM_TIMERIOMEM is not set -CONFIG_HW_RANDOM_TPM=y -# CONFIG_HW_RANDOM_VIA is not set -# CONFIG_HW_RANDOM_VIRTIO is not set -# CONFIG_HW_RANDOM_XIPHERA is not set -# CONFIG_HX711 is not set -# CONFIG_HYPERV is not set -# CONFIG_HYPERV_TSCPAGE is not set -# CONFIG_HYSDN is not set -CONFIG_HZ=100 -CONFIG_HZ_100=y -# CONFIG_HZ_1000 is not set -# CONFIG_HZ_1024 is not set -# CONFIG_HZ_128 is not set -# CONFIG_HZ_200 is not set -# CONFIG_HZ_24 is not set -# CONFIG_HZ_250 is not set -# CONFIG_HZ_256 is not set -# CONFIG_HZ_300 is not set -# CONFIG_HZ_48 is not set -# CONFIG_HZ_500 is not set -# CONFIG_HZ_PERIODIC is not set -# CONFIG_I2C is not set -# CONFIG_I2C_ALGOBIT is not set -# CONFIG_I2C_ALGOPCA is not set -# CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_ALI1535 is not set -# CONFIG_I2C_ALI1563 is not set -# CONFIG_I2C_ALI15X3 is not set -# CONFIG_I2C_AMD756 is not set -# CONFIG_I2C_AMD8111 is not set -# CONFIG_I2C_ARB_GPIO_CHALLENGE is not set -# CONFIG_I2C_AU1550 is not set -# CONFIG_I2C_BCM2835 is not set -# CONFIG_I2C_BCM_IPROC is not set -# CONFIG_I2C_CADENCE is not set -# CONFIG_I2C_CBUS_GPIO is not set -# CONFIG_I2C_CHARDEV is not set -# CONFIG_I2C_COMPAT is not set -# CONFIG_I2C_CP2615 is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEMUX_PINCTRL is not set -# CONFIG_I2C_DESIGNWARE_PCI is not set -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_DESIGNWARE_SLAVE is not set -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_EG20T is not set -# CONFIG_I2C_ELEKTOR is not set -# CONFIG_I2C_EMEV2 is not set -# CONFIG_I2C_GPIO is not set -# CONFIG_I2C_GPIO_FAULT_INJECTOR is not set -# CONFIG_I2C_HELPER_AUTO is not set -# CONFIG_I2C_HID is not set -# CONFIG_I2C_HID_OF is not set -# CONFIG_I2C_HID_OF_GOODIX is not set -# CONFIG_I2C_HISI is not set -# CONFIG_I2C_I801 is not set -# CONFIG_I2C_IBM_IIC is not set -# CONFIG_I2C_IMG is not set -# CONFIG_I2C_ISCH is not set -# CONFIG_I2C_ISMT is not set -# CONFIG_I2C_JZ4780 is not set -# CONFIG_I2C_MLXCPLD is not set -# CONFIG_I2C_MPC is not set -# CONFIG_I2C_MT65XX is not set -# CONFIG_I2C_MUX is not set -# CONFIG_I2C_MUX_GPIO is not set -# CONFIG_I2C_MUX_GPMUX is not set -# CONFIG_I2C_MUX_LTC4306 is not set -# CONFIG_I2C_MUX_MLXCPLD is not set -# CONFIG_I2C_MUX_PCA9541 is not set -# CONFIG_I2C_MUX_PCA954x is not set -# CONFIG_I2C_MUX_PINCTRL is not set -# CONFIG_I2C_MUX_REG is not set -# CONFIG_I2C_MV64XXX is not set -# CONFIG_I2C_NFORCE2 is not set -# CONFIG_I2C_NOMADIK is not set -# CONFIG_I2C_NVIDIA_GPU is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_OCTEON is not set -# CONFIG_I2C_PARPORT is not set -# CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_PCA_ISA is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_PIIX4 is not set -# CONFIG_I2C_PXA_PCI is not set -# CONFIG_I2C_PXA_SLAVE is not set -# CONFIG_I2C_RCAR is not set -# CONFIG_I2C_RK3X is not set -# CONFIG_I2C_ROBOTFUZZ_OSIF is not set -# CONFIG_I2C_S3C2410 is not set -# CONFIG_I2C_SCMI is not set -# CONFIG_I2C_SH_MOBILE is not set -# CONFIG_I2C_SIMTEC is not set -# CONFIG_I2C_SIS5595 is not set -# CONFIG_I2C_SIS630 is not set -# CONFIG_I2C_SIS96X is not set -# CONFIG_I2C_SLAVE is not set -# CONFIG_I2C_SLAVE_EEPROM is not set -# CONFIG_I2C_SMBUS is not set -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_THUNDERX is not set -# CONFIG_I2C_TINY_USB is not set -# CONFIG_I2C_VERSATILE is not set -# CONFIG_I2C_VIA is not set -# CONFIG_I2C_VIAPRO is not set -# CONFIG_I2C_VIRTIO is not set -# CONFIG_I2C_XILINX is not set -# CONFIG_I3C is not set -# CONFIG_I40E is not set -# CONFIG_I40EVF is not set -# CONFIG_I6300ESB_WDT is not set -# CONFIG_I82092 is not set -# CONFIG_I82365 is not set -# CONFIG_IAQCORE is not set -# CONFIG_IBM_ASM is not set -# CONFIG_IBM_EMAC_DEBUG is not set -# CONFIG_IBM_EMAC_EMAC4 is not set -# CONFIG_IBM_EMAC_MAL_CLR_ICINTSTAT is not set -# CONFIG_IBM_EMAC_MAL_COMMON_ERR is not set -# CONFIG_IBM_EMAC_NO_FLOW_CTRL is not set -# CONFIG_IBM_EMAC_RGMII is not set -# CONFIG_IBM_EMAC_TAH is not set -# CONFIG_IBM_EMAC_ZMII is not set -# CONFIG_ICE is not set -# CONFIG_ICP10100 is not set -# CONFIG_ICPLUS_PHY is not set -# CONFIG_ICS932S401 is not set -# CONFIG_ICST is not set -# CONFIG_IDE is not set -# CONFIG_IDEAPAD_LAPTOP is not set -# CONFIG_IDE_GD is not set -# CONFIG_IDE_PROC_FS is not set -# CONFIG_IDE_TASK_IOCTL is not set -# CONFIG_IDLE_PAGE_TRACKING is not set -# CONFIG_IEEE802154 is not set -# CONFIG_IEEE802154_ADF7242 is not set -# CONFIG_IEEE802154_ATUSB is not set -# CONFIG_IEEE802154_CA8210 is not set -# CONFIG_IEEE802154_HWSIM is not set -# CONFIG_IEEE802154_MCR20A is not set -# CONFIG_IFB is not set -# CONFIG_IGB is not set -# CONFIG_IGBVF is not set -# CONFIG_IGB_HWMON is not set -# CONFIG_IGC is not set -# CONFIG_IIO is not set -# CONFIG_IIO_BUFFER is not set -# CONFIG_IIO_BUFFER_CB is not set -# CONFIG_IIO_BUFFER_DMA is not set -# CONFIG_IIO_BUFFER_DMAENGINE is not set -# CONFIG_IIO_BUFFER_HDC2010 is not set -# CONFIG_IIO_BUFFER_HW_CONSUMER is not set -# CONFIG_IIO_CONFIGFS is not set -CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 -# CONFIG_IIO_CROS_EC_ACCEL_LEGACY is not set -# CONFIG_IIO_INTERRUPT_TRIGGER is not set -# CONFIG_IIO_MUX is not set -# CONFIG_IIO_PERIODIC_RTC_TRIGGER is not set -# CONFIG_IIO_RESCALE is not set -# CONFIG_IIO_SIMPLE_DUMMY is not set -# CONFIG_IIO_SSP_SENSORHUB is not set -# CONFIG_IIO_ST_ACCEL_3AXIS is not set -# CONFIG_IIO_ST_GYRO_3AXIS is not set -# CONFIG_IIO_ST_LSM6DSX is not set -# CONFIG_IIO_ST_LSM9DS0 is not set -# CONFIG_IIO_ST_MAGN_3AXIS is not set -# CONFIG_IIO_ST_PRESS is not set -# CONFIG_IIO_SW_DEVICE is not set -# CONFIG_IIO_SW_TRIGGER is not set -# CONFIG_IIO_SYSFS_TRIGGER is not set -# CONFIG_IIO_TRIGGER is not set -# CONFIG_IIO_TRIGGERED_EVENT is not set -# CONFIG_IKCONFIG is not set -# CONFIG_IKCONFIG_PROC is not set -# CONFIG_IKHEADERS is not set -# CONFIG_IMA is not set -# CONFIG_IMAGE_CMDLINE_HACK is not set -# CONFIG_IMGPDC_WDT is not set -# CONFIG_IMG_MDC_DMA is not set -# CONFIG_IMX7D_ADC is not set -# CONFIG_IMX_IPUV3_CORE is not set -# CONFIG_IMX_THERMAL is not set -# CONFIG_INA2XX_ADC is not set -# CONFIG_INDIRECT_PIO is not set -CONFIG_INET=y -# CONFIG_INET6_AH is not set -# CONFIG_INET6_ESP is not set -# CONFIG_INET6_ESPINTCP is not set -# CONFIG_INET6_IPCOMP is not set -# CONFIG_INET6_TUNNEL is not set -# CONFIG_INET6_XFRM_MODE_BEET is not set -# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set -# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET6_XFRM_MODE_TUNNEL is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET_AH is not set -# CONFIG_INET_DIAG is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_ESPINTCP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_LRO is not set -# CONFIG_INET_TCP_DIAG is not set -# CONFIG_INET_TUNNEL is not set -# CONFIG_INET_UDP_DIAG is not set -# CONFIG_INET_XFRM_MODE_BEET is not set -# CONFIG_INET_XFRM_MODE_TRANSPORT is not set -# CONFIG_INET_XFRM_MODE_TUNNEL is not set -# CONFIG_INET_XFRM_TUNNEL is not set -# CONFIG_INFINIBAND is not set -# CONFIG_INFTL is not set -# CONFIG_INGENIC_ADC is not set -# CONFIG_INGENIC_CGU_JZ4725B is not set -# CONFIG_INGENIC_CGU_JZ4740 is not set -# CONFIG_INGENIC_CGU_JZ4770 is not set -# CONFIG_INGENIC_CGU_JZ4780 is not set -# CONFIG_INGENIC_CGU_X1000 is not set -# CONFIG_INGENIC_CGU_X1830 is not set -# CONFIG_INGENIC_OST is not set -# CONFIG_INGENIC_SYSOST is not set -# CONFIG_INGENIC_TCU_CLK is not set -# CONFIG_INGENIC_TCU_IRQ is not set -# CONFIG_INGENIC_TIMER is not set -CONFIG_INIT_ENV_ARG_LIMIT=32 -# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set -# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set -CONFIG_INIT_STACK_NONE=y -CONFIG_INOTIFY_USER=y -# CONFIG_INPUT is not set -# CONFIG_INPUT_AD714X is not set -# CONFIG_INPUT_ADXL34X is not set -# CONFIG_INPUT_APANEL is not set -# CONFIG_INPUT_ATI_REMOTE2 is not set -# CONFIG_INPUT_ATLAS_BTNS is not set -# CONFIG_INPUT_ATMEL_CAPTOUCH is not set -# CONFIG_INPUT_AXP20X_PEK is not set -# CONFIG_INPUT_BMA150 is not set -# CONFIG_INPUT_CM109 is not set -# CONFIG_INPUT_CMA3000 is not set -# CONFIG_INPUT_DA7280_HAPTICS is not set -# CONFIG_INPUT_DRV260X_HAPTICS is not set -# CONFIG_INPUT_DRV2665_HAPTICS is not set -# CONFIG_INPUT_DRV2667_HAPTICS is not set -# CONFIG_INPUT_E3X0_BUTTON is not set -# CONFIG_INPUT_EVBUG is not set -# CONFIG_INPUT_EVDEV is not set -# CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_GP2A is not set -# CONFIG_INPUT_GPIO_BEEPER is not set -# CONFIG_INPUT_GPIO_DECODER is not set -# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set -# CONFIG_INPUT_GPIO_TILT_POLLED is not set -# CONFIG_INPUT_GPIO_VIBRA is not set -# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set -# CONFIG_INPUT_IMS_PCU is not set -# CONFIG_INPUT_IQS269A is not set -# CONFIG_INPUT_IQS626A is not set -# CONFIG_INPUT_IQS7222 is not set -# CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_KEYSPAN_REMOTE is not set -# CONFIG_INPUT_KXTJ9 is not set -# CONFIG_INPUT_LEDS is not set -# CONFIG_INPUT_MATRIXKMAP is not set -# CONFIG_INPUT_MAX8997_HAPTIC is not set -CONFIG_INPUT_MISC=y -# CONFIG_INPUT_MMA8450 is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_INPUT_MOUSEDEV is not set -# CONFIG_INPUT_MPU3050 is not set -# CONFIG_INPUT_MSM_VIBRATOR is not set -# CONFIG_INPUT_PALMAS_PWRBUTTON is not set -# CONFIG_INPUT_PCF8574 is not set -# CONFIG_INPUT_PCSPKR is not set -# CONFIG_INPUT_POLLDEV is not set -# CONFIG_INPUT_POWERMATE is not set -# CONFIG_INPUT_PWM_BEEPER is not set -# CONFIG_INPUT_PWM_VIBRA is not set -# CONFIG_INPUT_REGULATOR_HAPTIC is not set -# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set -# CONFIG_INPUT_SPARSEKMAP is not set -# CONFIG_INPUT_TABLET is not set -# CONFIG_INPUT_TOUCHSCREEN is not set -# CONFIG_INPUT_TPS65218_PWRBUTTON is not set -# CONFIG_INPUT_TWL4030_PWRBUTTON is not set -# CONFIG_INPUT_TWL4030_VIBRA is not set -# CONFIG_INPUT_TWL6040_VIBRA is not set -# CONFIG_INPUT_UINPUT is not set -# CONFIG_INPUT_WISTRON_BTNS is not set -# CONFIG_INPUT_YEALINK is not set -# CONFIG_INT340X_THERMAL is not set -# CONFIG_INTEGRITY is not set -# CONFIG_INTEGRITY_AUDIT is not set -# CONFIG_INTEGRITY_SIGNATURE is not set -# CONFIG_INTEL_ATOMISP2_LED is not set -# CONFIG_INTEL_ATOMISP2_PM is not set -# CONFIG_INTEL_CHT_INT33FE is not set -# CONFIG_INTEL_HID_EVENT is not set -# CONFIG_INTEL_IDLE is not set -# CONFIG_INTEL_IDMA64 is not set -# CONFIG_INTEL_INT0002_VGPIO is not set -# CONFIG_INTEL_IOATDMA is not set -# CONFIG_INTEL_ISH_HID is not set -# CONFIG_INTEL_MEI is not set -# CONFIG_INTEL_MEI_ME is not set -# CONFIG_INTEL_MEI_TXE is not set -# CONFIG_INTEL_MIC_CARD is not set -# CONFIG_INTEL_MIC_HOST is not set -# CONFIG_INTEL_MID_PTI is not set -# CONFIG_INTEL_OAKTRAIL is not set -# CONFIG_INTEL_PMC_CORE is not set -# CONFIG_INTEL_PUNIT_IPC is not set -# CONFIG_INTEL_RST is not set -# CONFIG_INTEL_SMARTCONNECT is not set -# CONFIG_INTEL_SOC_PMIC is not set -# CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set -# CONFIG_INTEL_SOC_PMIC_CHTWC is not set -# CONFIG_INTEL_TCC_COOLING is not set -# CONFIG_INTEL_TH is not set -# CONFIG_INTEL_VBTN is not set -# CONFIG_INTEL_XWAY_PHY is not set -# CONFIG_INTERCONNECT is not set -# CONFIG_INTERVAL_TREE_TEST is not set -# CONFIG_INV_ICM42600_I2C is not set -# CONFIG_INV_ICM42600_SPI is not set -# CONFIG_INV_MPU6050_I2C is not set -# CONFIG_INV_MPU6050_IIO is not set -# CONFIG_INV_MPU6050_SPI is not set -# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set -# CONFIG_IOMMU_SUPPORT is not set -# CONFIG_IONIC is not set -# CONFIG_IOSCHED_BFQ is not set -# CONFIG_IOSCHED_CFQ is not set -CONFIG_IOSCHED_DEADLINE=y -CONFIG_IOSCHED_NOOP=y -CONFIG_IO_STRICT_DEVMEM=y -# CONFIG_IO_URING is not set -CONFIG_IO_WQ=y -# CONFIG_IP17XX_PHY is not set -# CONFIG_IP5XXX_POWER is not set -# CONFIG_IP6_NF_FILTER is not set -# CONFIG_IP6_NF_IPTABLES is not set -# CONFIG_IP6_NF_MANGLE is not set -# CONFIG_IP6_NF_MATCH_AH is not set -# CONFIG_IP6_NF_MATCH_EUI64 is not set -# CONFIG_IP6_NF_MATCH_FRAG is not set -# CONFIG_IP6_NF_MATCH_HL is not set -# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set -# CONFIG_IP6_NF_MATCH_MH is not set -# CONFIG_IP6_NF_MATCH_OPTS is not set -# CONFIG_IP6_NF_MATCH_RPFILTER is not set -# CONFIG_IP6_NF_MATCH_RT is not set -# CONFIG_IP6_NF_MATCH_SRH is not set -# CONFIG_IP6_NF_NAT is not set -# CONFIG_IP6_NF_RAW is not set -# CONFIG_IP6_NF_SECURITY is not set -# CONFIG_IP6_NF_TARGET_HL is not set -# CONFIG_IP6_NF_TARGET_MASQUERADE is not set -# CONFIG_IP6_NF_TARGET_REJECT is not set -# CONFIG_IP6_NF_TARGET_SYNPROXY is not set -# CONFIG_IPACK_BUS is not set -# CONFIG_IPC_NS is not set -# CONFIG_IPMB_DEVICE_INTERFACE is not set -# CONFIG_IPMI_HANDLER is not set -# CONFIG_IPV6 is not set -# CONFIG_IPV6_FOU is not set -# CONFIG_IPV6_FOU_TUNNEL is not set -# CONFIG_IPV6_ILA is not set -# CONFIG_IPV6_IOAM6_LWTUNNEL is not set -# CONFIG_IPV6_MIP6 is not set -# CONFIG_IPV6_MROUTE is not set -# CONFIG_IPV6_MROUTE_MULTIPLE_TABLES is not set -# CONFIG_IPV6_MULTIPLE_TABLES is not set -CONFIG_IPV6_NDISC_NODETYPE=y -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_ROUTE_INFO is not set -# CONFIG_IPV6_RPL_LWTUNNEL is not set -# CONFIG_IPV6_SEG6_HMAC is not set -# CONFIG_IPV6_SEG6_LWTUNNEL is not set -# CONFIG_IPV6_SIT is not set -# CONFIG_IPV6_SIT_6RD is not set -# CONFIG_IPV6_TUNNEL is not set -# CONFIG_IPV6_VTI is not set -# CONFIG_IPVLAN is not set -# CONFIG_IPVTAP is not set -# CONFIG_IPW2100 is not set -# CONFIG_IPW2100_DEBUG is not set -CONFIG_IPW2100_MONITOR=y -# CONFIG_IPW2200 is not set -# CONFIG_IPW2200_DEBUG is not set -CONFIG_IPW2200_MONITOR=y -# CONFIG_IPW2200_PROMISCUOUS is not set -# CONFIG_IPW2200_QOS is not set -# CONFIG_IPW2200_RADIOTAP is not set -# CONFIG_IPWIRELESS is not set -# CONFIG_IPX is not set -CONFIG_IP_ADVANCED_ROUTER=y -# CONFIG_IP_DCCP is not set -# CONFIG_IP_FIB_TRIE_STATS is not set -# CONFIG_IP_MROUTE is not set -CONFIG_IP_MROUTE_MULTIPLE_TABLES=y -CONFIG_IP_MULTICAST=y -CONFIG_IP_MULTIPLE_TABLES=y -# CONFIG_IP_NF_ARPFILTER is not set -# CONFIG_IP_NF_ARPTABLES is not set -# CONFIG_IP_NF_ARP_MANGLE is not set -# CONFIG_IP_NF_FILTER is not set -# CONFIG_IP_NF_IPTABLES is not set -# CONFIG_IP_NF_MANGLE is not set -# CONFIG_IP_NF_MATCH_AH is not set -# CONFIG_IP_NF_MATCH_ECN is not set -# CONFIG_IP_NF_MATCH_RPFILTER is not set -# CONFIG_IP_NF_MATCH_TTL is not set -# CONFIG_IP_NF_RAW is not set -# CONFIG_IP_NF_SECURITY is not set -# CONFIG_IP_NF_TARGET_CLUSTERIP is not set -# CONFIG_IP_NF_TARGET_ECN is not set -# CONFIG_IP_NF_TARGET_MASQUERADE is not set -# CONFIG_IP_NF_TARGET_NETMAP is not set -# CONFIG_IP_NF_TARGET_REDIRECT is not set -# CONFIG_IP_NF_TARGET_REJECT is not set -# CONFIG_IP_NF_TARGET_SYNPROXY is not set -# CONFIG_IP_NF_TARGET_TTL is not set -# CONFIG_IP_PIMSM_V1 is not set -# CONFIG_IP_PIMSM_V2 is not set -# CONFIG_IP_PNP is not set -CONFIG_IP_ROUTE_MULTIPATH=y -CONFIG_IP_ROUTE_VERBOSE=y -# CONFIG_IP_SCTP is not set -# CONFIG_IP_SET is not set -# CONFIG_IP_SET_HASH_IPMAC is not set -# CONFIG_IP_VS is not set -# CONFIG_IP_VS_MH is not set -CONFIG_IP_VS_MH_TAB_INDEX=10 -# CONFIG_IP_VS_TWOS is not set -# CONFIG_IRDA is not set -# CONFIG_IRQSOFF_TRACER is not set -# CONFIG_IRQ_ALL_CPUS is not set -# CONFIG_IRQ_DOMAIN_DEBUG is not set -# CONFIG_IRQ_POLL is not set -# CONFIG_IRQ_TIME_ACCOUNTING is not set -# CONFIG_IR_GPIO_CIR is not set -# CONFIG_IR_HIX5HD2 is not set -# CONFIG_IR_IGORPLUGUSB is not set -# CONFIG_IR_IGUANA is not set -# CONFIG_IR_IMG is not set -# CONFIG_IR_IMON is not set -# CONFIG_IR_JVC_DECODER is not set -# CONFIG_IR_LIRC_CODEC is not set -# CONFIG_IR_MCEUSB is not set -# CONFIG_IR_NEC_DECODER is not set -# CONFIG_IR_RC5_DECODER is not set -# CONFIG_IR_RC6_DECODER is not set -# CONFIG_IR_REDRAT3 is not set -# CONFIG_IR_SONY_DECODER is not set -# CONFIG_IR_STREAMZAP is not set -# CONFIG_IR_TTUSBIR is not set -# CONFIG_ISA_BUS is not set -# CONFIG_ISA_BUS_API is not set -# CONFIG_ISCSI_BOOT_SYSFS is not set -# CONFIG_ISCSI_TCP is not set -CONFIG_ISDN=y -# CONFIG_ISDN_AUDIO is not set -# CONFIG_ISDN_CAPI is not set -# CONFIG_ISDN_CAPI_CAPIDRV is not set -# CONFIG_ISDN_DIVERSION is not set -# CONFIG_ISDN_DRV_ACT2000 is not set -# CONFIG_ISDN_DRV_GIGASET is not set -# CONFIG_ISDN_DRV_HISAX is not set -# CONFIG_ISDN_DRV_ICN is not set -# CONFIG_ISDN_DRV_LOOP is not set -# CONFIG_ISDN_DRV_PCBIT is not set -# CONFIG_ISDN_DRV_SC is not set -# CONFIG_ISDN_I4L is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_ISL29125 is not set -# CONFIG_ISL29501 is not set -# CONFIG_ISO9660_FS is not set -# CONFIG_ISS4xx is not set -# CONFIG_ITG3200 is not set -# CONFIG_IWL3945 is not set -# CONFIG_IWLWIFI is not set -# CONFIG_IXGB is not set -# CONFIG_IXGBE is not set -# CONFIG_IXGBEVF is not set -# CONFIG_JAILHOUSE_GUEST is not set -# CONFIG_JBD2_DEBUG is not set -# CONFIG_JFFS2_CMODE_FAVOURLZO is not set -# CONFIG_JFFS2_CMODE_NONE is not set -CONFIG_JFFS2_CMODE_PRIORITY=y -# CONFIG_JFFS2_CMODE_SIZE is not set -CONFIG_JFFS2_COMPRESSION_OPTIONS=y -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_FS_DEBUG=0 -# CONFIG_JFFS2_FS_POSIX_ACL is not set -# CONFIG_JFFS2_FS_SECURITY is not set -# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -CONFIG_JFFS2_FS_WRITEBUFFER=y -CONFIG_JFFS2_FS_XATTR=y -CONFIG_JFFS2_LZMA=y -# CONFIG_JFFS2_LZO is not set -CONFIG_JFFS2_RTIME=y -# CONFIG_JFFS2_RUBIN is not set -CONFIG_JFFS2_SUMMARY=y -# CONFIG_JFFS2_ZLIB is not set -# CONFIG_JFS_DEBUG is not set -# CONFIG_JFS_FS is not set -# CONFIG_JFS_POSIX_ACL is not set -# CONFIG_JFS_SECURITY is not set -# CONFIG_JFS_STATISTICS is not set -# CONFIG_JME is not set -CONFIG_JOLIET=y -# CONFIG_JSA1212 is not set -# CONFIG_JUMP_LABEL is not set -# CONFIG_JZ4740_WDT is not set -# CONFIG_JZ4770_PHY is not set -# CONFIG_KALLSYMS is not set -# CONFIG_KALLSYMS_ABSOLUTE_PERCPU is not set -# CONFIG_KALLSYMS_ALL is not set -CONFIG_KALLSYMS_BASE_RELATIVE=y -# CONFIG_KALLSYMS_UNCOMPRESSED is not set -# CONFIG_KARMA_PARTITION is not set -# CONFIG_KASAN is not set -CONFIG_KASAN_STACK=y -# CONFIG_KCMP is not set -# CONFIG_KCOV is not set -# CONFIG_KCSAN is not set -# CONFIG_KERNEL_BZIP2 is not set -# CONFIG_KERNEL_CAT is not set -# CONFIG_KERNEL_GZIP is not set -# CONFIG_KERNEL_LZ4 is not set -# CONFIG_KERNEL_LZMA is not set -# CONFIG_KERNEL_LZO is not set -CONFIG_KERNEL_MODE_NEON=y -CONFIG_KERNEL_XZ=y -# CONFIG_KERNEL_ZSTD is not set -CONFIG_KERNFS=y -# CONFIG_KEXEC is not set -# CONFIG_KEXEC_FILE is not set -# CONFIG_KEYBOARD_ADC is not set -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set -# CONFIG_KEYBOARD_APPLESPI is not set -# CONFIG_KEYBOARD_ATKBD is not set -# CONFIG_KEYBOARD_BCM is not set -# CONFIG_KEYBOARD_CAP11XX is not set -# CONFIG_KEYBOARD_CYPRESS_SF is not set -# CONFIG_KEYBOARD_DLINK_DIR685 is not set -# CONFIG_KEYBOARD_GPIO is not set -# CONFIG_KEYBOARD_GPIO_POLLED is not set -# CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_LM8323 is not set -# CONFIG_KEYBOARD_LM8333 is not set -# CONFIG_KEYBOARD_MATRIX is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set -# CONFIG_KEYBOARD_NEWTON is not set -# CONFIG_KEYBOARD_OMAP4 is not set -# CONFIG_KEYBOARD_OPENCORES is not set -# CONFIG_KEYBOARD_PXA27x is not set -# CONFIG_KEYBOARD_QT1050 is not set -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_SAMSUNG is not set -# CONFIG_KEYBOARD_SH_KEYSC is not set -# CONFIG_KEYBOARD_SNVS_PWRKEY is not set -# CONFIG_KEYBOARD_STMPE is not set -# CONFIG_KEYBOARD_STOWAWAY is not set -# CONFIG_KEYBOARD_SUNKBD is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_TEGRA is not set -# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set -# CONFIG_KEYBOARD_TWL4030 is not set -# CONFIG_KEYBOARD_XTKBD is not set -# CONFIG_KEYS is not set -# CONFIG_KEYS_REQUEST_CACHE is not set -# CONFIG_KEY_DH_OPERATIONS is not set -# CONFIG_KFENCE is not set -# CONFIG_KGDB is not set -# CONFIG_KMAP_LOCAL is not set -# CONFIG_KMAP_LOCAL_NON_LINEAR_PTE_ARRAY is not set -# CONFIG_KMEMCHECK is not set -# CONFIG_KMX61 is not set -# CONFIG_KPC2000 is not set -# CONFIG_KPROBES is not set -# CONFIG_KPROBES_SANITY_TEST is not set -# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set -# CONFIG_KPROBE_EVENT_GEN_TEST is not set -# CONFIG_KS7010 is not set -# CONFIG_KS8842 is not set -# CONFIG_KS8851 is not set -# CONFIG_KS8851_MLL is not set -# CONFIG_KSM is not set -# CONFIG_KSZ884X_PCI is not set -# CONFIG_KUNIT is not set -CONFIG_KUSER_HELPERS=y -# CONFIG_KVM_AMD is not set -# CONFIG_KVM_AMD_SEV is not set -# CONFIG_KVM_GUEST is not set -# CONFIG_KVM_INTEL is not set -# CONFIG_KVM_WERROR is not set -# CONFIG_KXCJK1013 is not set -# CONFIG_KXSD9 is not set -# CONFIG_L2TP is not set -# CONFIG_L2TP_ETH is not set -# CONFIG_L2TP_IP is not set -# CONFIG_L2TP_V3 is not set -# CONFIG_LAN743X is not set -# CONFIG_LANMEDIA is not set -# CONFIG_LANTIQ is not set -# CONFIG_LAPB is not set -# CONFIG_LASAT is not set -# CONFIG_LATENCYTOP is not set -# CONFIG_LATTICE_ECP3_CONFIG is not set -CONFIG_LBDAF=y -# CONFIG_LCD_AMS369FG06 is not set -# CONFIG_LCD_CLASS_DEVICE is not set -# CONFIG_LCD_HX8357 is not set -# CONFIG_LCD_ILI922X is not set -# CONFIG_LCD_ILI9320 is not set -# CONFIG_LCD_L4F00242T03 is not set -# CONFIG_LCD_LD9040 is not set -# CONFIG_LCD_LMS283GF05 is not set -# CONFIG_LCD_LMS501KF03 is not set -# CONFIG_LCD_LTV350QV is not set -# CONFIG_LCD_OTM3225A is not set -# CONFIG_LCD_S6E63M0 is not set -# CONFIG_LCD_TDO24M is not set -# CONFIG_LCD_VGG2432A4 is not set -CONFIG_LDISC_AUTOLOAD=y -# CONFIG_LDM_PARTITION is not set -CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y -# CONFIG_LEDS_AN30259A is not set -# CONFIG_LEDS_APU is not set -# CONFIG_LEDS_AW2013 is not set -# CONFIG_LEDS_BCM6328 is not set -# CONFIG_LEDS_BCM6358 is not set -# CONFIG_LEDS_BD2802 is not set -# CONFIG_LEDS_BLINKM is not set -CONFIG_LEDS_BRIGHTNESS_HW_CHANGED=y -CONFIG_LEDS_CLASS=y -# CONFIG_LEDS_CLASS_FLASH is not set -CONFIG_LEDS_CLASS_MULTICOLOR=y -# CONFIG_LEDS_CR0014114 is not set -# CONFIG_LEDS_DAC124S085 is not set -# CONFIG_LEDS_EL15203000 is not set -# CONFIG_LEDS_GPIO is not set -# CONFIG_LEDS_INTEL_SS4200 is not set -# CONFIG_LEDS_IS31FL319X is not set -# CONFIG_LEDS_IS31FL32XX is not set -# CONFIG_LEDS_LM3530 is not set -# CONFIG_LEDS_LM3532 is not set -# CONFIG_LEDS_LM355x is not set -# CONFIG_LEDS_LM3642 is not set -# CONFIG_LEDS_LM3692X is not set -# CONFIG_LEDS_LP3944 is not set -# CONFIG_LEDS_LP3952 is not set -# CONFIG_LEDS_LP50XX is not set -# CONFIG_LEDS_LP5521 is not set -# CONFIG_LEDS_LP5523 is not set -# CONFIG_LEDS_LP5562 is not set -# CONFIG_LEDS_LP55XX_COMMON is not set -# CONFIG_LEDS_LP8501 is not set -# CONFIG_LEDS_LP8860 is not set -# CONFIG_LEDS_LT3593 is not set -# CONFIG_LEDS_MLXCPLD is not set -# CONFIG_LEDS_MLXREG is not set -# CONFIG_LEDS_NIC78BX is not set -# CONFIG_LEDS_NS2 is not set -# CONFIG_LEDS_OT200 is not set -# CONFIG_LEDS_PCA9532 is not set -# CONFIG_LEDS_PCA955X is not set -# CONFIG_LEDS_PCA963X is not set -# CONFIG_LEDS_PWM is not set -# CONFIG_LEDS_REGULATOR is not set -# CONFIG_LEDS_SPI_BYTE is not set -# CONFIG_LEDS_SYSCON is not set -# CONFIG_LEDS_TCA6507 is not set -# CONFIG_LEDS_TI_LMU_COMMON is not set -# CONFIG_LEDS_TLC591XX is not set -CONFIG_LEDS_TRIGGERS=y -# CONFIG_LEDS_TRIGGER_ACTIVITY is not set -# CONFIG_LEDS_TRIGGER_AUDIO is not set -# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set -# CONFIG_LEDS_TRIGGER_CAMERA is not set -# CONFIG_LEDS_TRIGGER_CPU is not set -CONFIG_LEDS_TRIGGER_DEFAULT_ON=y -# CONFIG_LEDS_TRIGGER_DISK is not set -# CONFIG_LEDS_TRIGGER_GPIO is not set -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -# CONFIG_LEDS_TRIGGER_MTD is not set -CONFIG_LEDS_TRIGGER_NETDEV=y -# CONFIG_LEDS_TRIGGER_ONESHOT is not set -# CONFIG_LEDS_TRIGGER_PANIC is not set -# CONFIG_LEDS_TRIGGER_PATTERN is not set -CONFIG_LEDS_TRIGGER_TIMER=y -# CONFIG_LEDS_TRIGGER_TRANSIENT is not set -# CONFIG_LEDS_TRIGGER_TTY is not set -# CONFIG_LEDS_TURRIS_OMNIA is not set -# CONFIG_LEDS_USER is not set -# CONFIG_LED_TRIGGER_PHY is not set -# CONFIG_LEGACY_PTYS is not set -# CONFIG_LGUEST is not set -# CONFIG_LIB80211 is not set -# CONFIG_LIB80211_CRYPT_CCMP is not set -# CONFIG_LIB80211_CRYPT_TKIP is not set -# CONFIG_LIB80211_CRYPT_WEP is not set -# CONFIG_LIB80211_DEBUG is not set -# CONFIG_LIBCRC32C is not set -# CONFIG_LIBERTAS is not set -# CONFIG_LIBERTAS_THINFIRM is not set -# CONFIG_LIBERTAS_USB is not set -# CONFIG_LIBFC is not set -# CONFIG_LIBFCOE is not set -# CONFIG_LIBIPW_DEBUG is not set -# CONFIG_LIBNVDIMM is not set -CONFIG_LIB_MEMNEQ=y -# CONFIG_LIDAR_LITE_V2 is not set -CONFIG_LINEAR_RANGES=y -# CONFIG_LIQUIDIO is not set -# CONFIG_LIQUIDIO_VF is not set -# CONFIG_LIS3L02DQ is not set -# CONFIG_LITEX_SOC_CONTROLLER is not set -# CONFIG_LKDTM is not set -CONFIG_LLC=y -# CONFIG_LLC2 is not set -# CONFIG_LMK04832 is not set -# CONFIG_LMP91000 is not set -# CONFIG_LNET is not set -CONFIG_LOCALVERSION="" -# CONFIG_LOCALVERSION_AUTO is not set -# CONFIG_LOCKD is not set -CONFIG_LOCKDEP_SUPPORT=y -CONFIG_LOCKD_V4=y -# CONFIG_LOCKUP_DETECTOR is not set -# CONFIG_LOCK_EVENT_COUNTS is not set -# CONFIG_LOCK_STAT is not set -# CONFIG_LOCK_TORTURE_TEST is not set -# CONFIG_LOGFS is not set -# CONFIG_LOGIG940_FF is not set -# CONFIG_LOGIRUMBLEPAD2_FF is not set -# CONFIG_LOGITECH_FF is not set -# CONFIG_LOGIWHEELS_FF is not set -# CONFIG_LOGO is not set -CONFIG_LOG_BUF_SHIFT=17 -CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 -# CONFIG_LOONGSON_MC146818 is not set -# CONFIG_LPC_ICH is not set -# CONFIG_LPC_SCH is not set -# CONFIG_LP_CONSOLE is not set -# CONFIG_LSI_ET1011C_PHY is not set -CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity" -CONFIG_LSM_MMAP_MIN_ADDR=65536 -# CONFIG_LTC1660 is not set -# CONFIG_LTC2471 is not set -# CONFIG_LTC2485 is not set -# CONFIG_LTC2496 is not set -# CONFIG_LTC2497 is not set -# CONFIG_LTC2632 is not set -# CONFIG_LTC2983 is not set -# CONFIG_LTE_GDM724X is not set -# CONFIG_LTO_NONE is not set -# CONFIG_LTPC is not set -# CONFIG_LTR501 is not set -# CONFIG_LUSTRE_FS is not set -# CONFIG_LV0104CS is not set -# CONFIG_LWTUNNEL is not set -# CONFIG_LXT_PHY is not set -# CONFIG_LZ4HC_COMPRESS is not set -# CONFIG_LZ4_COMPRESS is not set -# CONFIG_LZ4_DECOMPRESS is not set -CONFIG_LZMA_COMPRESS=y -CONFIG_LZMA_DECOMPRESS=y -# CONFIG_LZO_COMPRESS is not set -# CONFIG_LZO_DECOMPRESS is not set -# CONFIG_M62332 is not set -# CONFIG_MAC80211 is not set -# CONFIG_MAC80211_MESSAGE_TRACING is not set -CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 -# CONFIG_MACB is not set -# CONFIG_MACH_ASM9260 is not set -# CONFIG_MACH_DECSTATION is not set -# CONFIG_MACH_INGENIC is not set -# CONFIG_MACH_INGENIC_SOC is not set -# CONFIG_MACH_JAZZ is not set -# CONFIG_MACH_JZ4740 is not set -# CONFIG_MACH_LOONGSON2EF is not set -# CONFIG_MACH_LOONGSON32 is not set -# CONFIG_MACH_LOONGSON64 is not set -# CONFIG_MACH_PIC32 is not set -# CONFIG_MACH_PISTACHIO is not set -# CONFIG_MACH_TX39XX is not set -# CONFIG_MACH_TX49XX is not set -# CONFIG_MACH_VR41XX is not set -# CONFIG_MACH_XILFPGA is not set -# CONFIG_MACINTOSH_DRIVERS is not set -# CONFIG_MACSEC is not set -# CONFIG_MACVLAN is not set -# CONFIG_MACVTAP is not set -# CONFIG_MAC_EMUMOUSEBTN is not set -# CONFIG_MAC_PARTITION is not set -# CONFIG_MAG3110 is not set -# CONFIG_MAGIC_SYSRQ is not set -CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 -# CONFIG_MAGIC_SYSRQ_SERIAL is not set -CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" -# CONFIG_MAILBOX is not set -# CONFIG_MANAGER_SBS is not set -# CONFIG_MANDATORY_FILE_LOCKING is not set -# CONFIG_MANGLE_BOOTARGS is not set -# CONFIG_MARVELL_10G_PHY is not set -# CONFIG_MARVELL_88X2222_PHY is not set -# CONFIG_MARVELL_PHY is not set -# CONFIG_MAX1027 is not set -# CONFIG_MAX11100 is not set -# CONFIG_MAX1118 is not set -# CONFIG_MAX1241 is not set -# CONFIG_MAX1363 is not set -# CONFIG_MAX30100 is not set -# CONFIG_MAX30102 is not set -# CONFIG_MAX31856 is not set -# CONFIG_MAX44000 is not set -# CONFIG_MAX44009 is not set -# CONFIG_MAX517 is not set -# CONFIG_MAX5432 is not set -# CONFIG_MAX5481 is not set -# CONFIG_MAX5487 is not set -# CONFIG_MAX5821 is not set -# CONFIG_MAX63XX_WATCHDOG is not set -# CONFIG_MAX9611 is not set -# CONFIG_MAXIM_THERMOCOUPLE is not set -# CONFIG_MAXLINEAR_GPHY is not set -CONFIG_MAY_USE_DEVLINK=y -# CONFIG_MB1232 is not set -# CONFIG_MC3230 is not set -# CONFIG_MCB is not set -# CONFIG_MCP320X is not set -# CONFIG_MCP3422 is not set -# CONFIG_MCP3911 is not set -# CONFIG_MCP4018 is not set -# CONFIG_MCP41010 is not set -# CONFIG_MCP4131 is not set -# CONFIG_MCP4531 is not set -# CONFIG_MCP4725 is not set -# CONFIG_MCP4922 is not set -# CONFIG_MCPM is not set -# CONFIG_MCTP is not set -# CONFIG_MD is not set -# CONFIG_MDIO_BCM_UNIMAC is not set -# CONFIG_MDIO_BITBANG is not set -# CONFIG_MDIO_BUS_MUX_GPIO is not set -# CONFIG_MDIO_BUS_MUX_MMIOREG is not set -# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set -# CONFIG_MDIO_DEVICE is not set -# CONFIG_MDIO_DEVRES is not set -# CONFIG_MDIO_HISI_FEMAC is not set -# CONFIG_MDIO_IPQ4019 is not set -# CONFIG_MDIO_IPQ8064 is not set -# CONFIG_MDIO_MSCC_MIIM is not set -# CONFIG_MDIO_MVUSB is not set -# CONFIG_MDIO_OCTEON is not set -# CONFIG_MDIO_THUNDER is not set -# CONFIG_MDIO_XPCS is not set -# CONFIG_MD_FAULTY is not set -# CONFIG_MEDIATEK_GE_PHY is not set -# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set -# CONFIG_MEDIA_ATTACH is not set -# CONFIG_MEDIA_CAMERA_SUPPORT is not set -# CONFIG_MEDIA_CEC_SUPPORT is not set -# CONFIG_MEDIA_CONTROLLER is not set -# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set -# CONFIG_MEDIA_PCI_SUPPORT is not set -# CONFIG_MEDIA_PLATFORM_SUPPORT is not set -# CONFIG_MEDIA_RADIO_SUPPORT is not set -# CONFIG_MEDIA_RC_SUPPORT is not set -# CONFIG_MEDIA_SDR_SUPPORT is not set -# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set -# CONFIG_MEDIA_SUPPORT is not set -# CONFIG_MEDIA_SUPPORT_FILTER is not set -# CONFIG_MEDIA_TEST_SUPPORT is not set -# CONFIG_MEDIA_TUNER_E4000 is not set -# CONFIG_MEDIA_TUNER_FC0011 is not set -# CONFIG_MEDIA_TUNER_FC0012 is not set -# CONFIG_MEDIA_TUNER_FC0013 is not set -# CONFIG_MEDIA_TUNER_FC2580 is not set -# CONFIG_MEDIA_TUNER_IT913X is not set -# CONFIG_MEDIA_TUNER_M88RS6000T is not set -# CONFIG_MEDIA_TUNER_MAX2165 is not set -# CONFIG_MEDIA_TUNER_MC44S803 is not set -# CONFIG_MEDIA_TUNER_MSI001 is not set -# CONFIG_MEDIA_TUNER_MT2060 is not set -# CONFIG_MEDIA_TUNER_MT2063 is not set -# CONFIG_MEDIA_TUNER_MT20XX is not set -# CONFIG_MEDIA_TUNER_MT2131 is not set -# CONFIG_MEDIA_TUNER_MT2266 is not set -# CONFIG_MEDIA_TUNER_MXL301RF is not set -# CONFIG_MEDIA_TUNER_MXL5005S is not set -# CONFIG_MEDIA_TUNER_MXL5007T is not set -# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set -# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set -# CONFIG_MEDIA_TUNER_QT1010 is not set -# CONFIG_MEDIA_TUNER_R820T is not set -# CONFIG_MEDIA_TUNER_SI2157 is not set -# CONFIG_MEDIA_TUNER_SIMPLE is not set -# CONFIG_MEDIA_TUNER_TDA18212 is not set -# CONFIG_MEDIA_TUNER_TDA18218 is not set -# CONFIG_MEDIA_TUNER_TDA18250 is not set -# CONFIG_MEDIA_TUNER_TDA18271 is not set -# CONFIG_MEDIA_TUNER_TDA827X is not set -# CONFIG_MEDIA_TUNER_TDA8290 is not set -# CONFIG_MEDIA_TUNER_TDA9887 is not set -# CONFIG_MEDIA_TUNER_TEA5761 is not set -# CONFIG_MEDIA_TUNER_TEA5767 is not set -# CONFIG_MEDIA_TUNER_TUA9001 is not set -# CONFIG_MEDIA_TUNER_XC2028 is not set -# CONFIG_MEDIA_TUNER_XC4000 is not set -# CONFIG_MEDIA_TUNER_XC5000 is not set -# CONFIG_MEDIA_USB_SUPPORT is not set -# CONFIG_MEGARAID_LEGACY is not set -# CONFIG_MEGARAID_NEWGEN is not set -# CONFIG_MEGARAID_SAS is not set -# CONFIG_MELLANOX_PLATFORM is not set -CONFIG_MEMBARRIER=y -# CONFIG_MEMORY is not set -# CONFIG_MEMORY_FAILURE is not set -# CONFIG_MEMORY_HOTPLUG is not set -# CONFIG_MEMSTICK is not set -# CONFIG_MEMTEST is not set -# CONFIG_MEN_A21_WDT is not set -# CONFIG_MESON_SM is not set -CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 -# CONFIG_MFD_88PM800 is not set -# CONFIG_MFD_88PM805 is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_AAT2870_CORE is not set -# CONFIG_MFD_AC100 is not set -# CONFIG_MFD_ACT8945A is not set -# CONFIG_MFD_ARIZONA_I2C is not set -# CONFIG_MFD_ARIZONA_SPI is not set -# CONFIG_MFD_AS3711 is not set -# CONFIG_MFD_AS3722 is not set -# CONFIG_MFD_ASIC3 is not set -# CONFIG_MFD_ATC260X_I2C is not set -# CONFIG_MFD_ATMEL_FLEXCOM is not set -# CONFIG_MFD_ATMEL_HLCDC is not set -# CONFIG_MFD_AXP20X is not set -# CONFIG_MFD_AXP20X_I2C is not set -# CONFIG_MFD_BCM590XX is not set -# CONFIG_MFD_BD9571MWV is not set -# CONFIG_MFD_CORE is not set -# CONFIG_MFD_CPCAP is not set -# CONFIG_MFD_CROS_EC is not set -# CONFIG_MFD_CS5535 is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_MFD_DA9052_SPI is not set -# CONFIG_MFD_DA9055 is not set -# CONFIG_MFD_DA9062 is not set -# CONFIG_MFD_DA9063 is not set -# CONFIG_MFD_DA9150 is not set -# CONFIG_MFD_DLN2 is not set -# CONFIG_MFD_EXYNOS_LPASS is not set -# CONFIG_MFD_GATEWORKS_GSC is not set -# CONFIG_MFD_HI6421_PMIC is not set -# CONFIG_MFD_INTEL_M10_BMC is not set -# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set -# CONFIG_MFD_IQS62X is not set -# CONFIG_MFD_JANZ_CMODIO is not set -# CONFIG_MFD_KEMPLD is not set -# CONFIG_MFD_LM3533 is not set -# CONFIG_MFD_LOCHNAGAR is not set -# CONFIG_MFD_LP3943 is not set -# CONFIG_MFD_LP8788 is not set -# CONFIG_MFD_MADERA is not set -# CONFIG_MFD_MAX14577 is not set -# CONFIG_MFD_MAX77620 is not set -# CONFIG_MFD_MAX77650 is not set -# CONFIG_MFD_MAX77686 is not set -# CONFIG_MFD_MAX77693 is not set -# CONFIG_MFD_MAX77843 is not set -# CONFIG_MFD_MAX8907 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_MC13XXX is not set -# CONFIG_MFD_MC13XXX_I2C is not set -# CONFIG_MFD_MC13XXX_SPI is not set -# CONFIG_MFD_MENF21BMC is not set -# CONFIG_MFD_MP2629 is not set -# CONFIG_MFD_MT6360 is not set -# CONFIG_MFD_MT6397 is not set -# CONFIG_MFD_NTXEC is not set -# CONFIG_MFD_OMAP_USB_HOST is not set -# CONFIG_MFD_PALMAS is not set -# CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_PM8921_CORE is not set -# CONFIG_MFD_PM8XXX is not set -# CONFIG_MFD_QCOM_PM8008 is not set -# CONFIG_MFD_RC5T583 is not set -# CONFIG_MFD_RDC321X is not set -# CONFIG_MFD_RETU is not set -# CONFIG_MFD_RK808 is not set -# CONFIG_MFD_RN5T618 is not set -# CONFIG_MFD_ROHM_BD70528 is not set -# CONFIG_MFD_ROHM_BD71828 is not set -# CONFIG_MFD_ROHM_BD718XX is not set -# CONFIG_MFD_ROHM_BD957XMUF is not set -# CONFIG_MFD_RSMU_I2C is not set -# CONFIG_MFD_RSMU_SPI is not set -# CONFIG_MFD_RT4831 is not set -# CONFIG_MFD_RT5033 is not set -# CONFIG_MFD_RTSX_PCI is not set -# CONFIG_MFD_RTSX_USB is not set -# CONFIG_MFD_SEC_CORE is not set -# CONFIG_MFD_SI476X_CORE is not set -# CONFIG_MFD_SKY81452 is not set -# CONFIG_MFD_SL28CPLD is not set -# CONFIG_MFD_SM501 is not set -# CONFIG_MFD_SMSC is not set -# CONFIG_MFD_STMFX is not set -# CONFIG_MFD_STMPE is not set -# CONFIG_MFD_STPMIC1 is not set -# CONFIG_MFD_SYSCON is not set -# CONFIG_MFD_T7L66XB is not set -# CONFIG_MFD_TC3589X is not set -# CONFIG_MFD_TC6387XB is not set -# CONFIG_MFD_TC6393XB is not set -# CONFIG_MFD_TIMBERDALE is not set -# CONFIG_MFD_TI_AM335X_TSCADC is not set -# CONFIG_MFD_TI_LMU is not set -# CONFIG_MFD_TI_LP873X is not set -# CONFIG_MFD_TI_LP87565 is not set -# CONFIG_MFD_TMIO is not set -# CONFIG_MFD_TPS65086 is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_TPS65217 is not set -# CONFIG_MFD_TPS65218 is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65910 is not set -# CONFIG_MFD_TPS65912 is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS65912_SPI is not set -# CONFIG_MFD_TPS68470 is not set -# CONFIG_MFD_TPS80031 is not set -# CONFIG_MFD_TQMX86 is not set -# CONFIG_MFD_VIPERBOARD is not set -# CONFIG_MFD_VX855 is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_WM831X is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM831X_SPI is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM8994 is not set -# CONFIG_MG_DISK is not set -# CONFIG_MHI_BUS is not set -# CONFIG_MHI_BUS_EP is not set -# CONFIG_MICREL_KS8995MA is not set -# CONFIG_MICREL_PHY is not set -# CONFIG_MICROCHIP_KSZ is not set -# CONFIG_MICROCHIP_PHY is not set -# CONFIG_MICROCHIP_PIT64B is not set -# CONFIG_MICROCHIP_T1_PHY is not set -# CONFIG_MICROSEMI_PHY is not set -# CONFIG_MICROSOFT_MANA is not set -# CONFIG_MIGRATION is not set -CONFIG_MII=y -# CONFIG_MIKROTIK is not set -# CONFIG_MIKROTIK_RB532 is not set -# CONFIG_MINIX_FS is not set -# CONFIG_MINIX_FS_NATIVE_ENDIAN is not set -# CONFIG_MINIX_SUBPARTITION is not set -# CONFIG_MIPS_ALCHEMY is not set -# CONFIG_MIPS_CDMM is not set -# CONFIG_MIPS_COBALT is not set -# CONFIG_MIPS_FPU_EMULATOR is not set -# CONFIG_MIPS_FP_SUPPORT is not set -# CONFIG_MIPS_GENERIC is not set -# CONFIG_MIPS_GENERIC_KERNEL is not set -# CONFIG_MIPS_MALTA is not set -# CONFIG_MIPS_O32_FP64_SUPPORT is not set -# CONFIG_MIPS_PARAVIRT is not set -# CONFIG_MIPS_PLATFORM_DEVICES is not set -# CONFIG_MIPS_SEAD3 is not set -# CONFIG_MISC_ALCOR_PCI is not set -CONFIG_MISC_FILESYSTEMS=y -# CONFIG_MISC_RTSX_PCI is not set -# CONFIG_MISC_RTSX_USB is not set -# CONFIG_MISDN is not set -# CONFIG_MISDN_AVMFRITZ is not set -# CONFIG_MISDN_HFCPCI is not set -# CONFIG_MISDN_HFCUSB is not set -# CONFIG_MISDN_INFINEON is not set -# CONFIG_MISDN_NETJET is not set -# CONFIG_MISDN_SPEEDFAX is not set -# CONFIG_MISDN_W6692 is not set -# CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY is not set -# CONFIG_MKISS is not set -# CONFIG_MLX4_CORE is not set -# CONFIG_MLX4_EN is not set -# CONFIG_MLX5_CORE is not set -# CONFIG_MLX5_SF is not set -# CONFIG_MLX90614 is not set -# CONFIG_MLX90632 is not set -# CONFIG_MLXFW is not set -# CONFIG_MLXSW_CORE is not set -# CONFIG_MLX_CPLD_PLATFORM is not set -# CONFIG_MLX_PLATFORM is not set -# CONFIG_MMA7455_I2C is not set -# CONFIG_MMA7455_SPI is not set -# CONFIG_MMA7660 is not set -# CONFIG_MMA8452 is not set -# CONFIG_MMA9551 is not set -# CONFIG_MMA9553 is not set -# CONFIG_MMC is not set -# CONFIG_MMC35240 is not set -# CONFIG_MMC_ARMMMCI is not set -# CONFIG_MMC_AU1X is not set -# CONFIG_MMC_BLOCK is not set -CONFIG_MMC_BLOCK_BOUNCE=y -CONFIG_MMC_BLOCK_MINORS=8 -# CONFIG_MMC_CAVIUM_THUNDERX is not set -# CONFIG_MMC_CB710 is not set -# CONFIG_MMC_CQHCI is not set -# CONFIG_MMC_DEBUG is not set -# CONFIG_MMC_DW is not set -# CONFIG_MMC_DW_ROCKCHIP is not set -# CONFIG_MMC_HSQ is not set -# CONFIG_MMC_JZ4740 is not set -# CONFIG_MMC_MTK is not set -# CONFIG_MMC_MVSDIO is not set -# CONFIG_MMC_S3C is not set -# CONFIG_MMC_SDHCI is not set -# CONFIG_MMC_SDHCI_ACPI is not set -# CONFIG_MMC_SDHCI_AM654 is not set -# CONFIG_MMC_SDHCI_BCM_KONA is not set -# CONFIG_MMC_SDHCI_CADENCE is not set -# CONFIG_MMC_SDHCI_F_SDH30 is not set -# CONFIG_MMC_SDHCI_IPROC is not set -# CONFIG_MMC_SDHCI_MILBEAUT is not set -# CONFIG_MMC_SDHCI_MSM is not set -# CONFIG_MMC_SDHCI_OF_ARASAN is not set -# CONFIG_MMC_SDHCI_OF_ASPEED is not set -# CONFIG_MMC_SDHCI_OF_AT91 is not set -# CONFIG_MMC_SDHCI_OF_DWCMSHC is not set -# CONFIG_MMC_SDHCI_OF_ESDHC is not set -# CONFIG_MMC_SDHCI_OF_HLWD is not set -# CONFIG_MMC_SDHCI_OMAP is not set -# CONFIG_MMC_SDHCI_PXAV2 is not set -# CONFIG_MMC_SDHCI_PXAV3 is not set -# CONFIG_MMC_SDHCI_S3C is not set -# CONFIG_MMC_SDHCI_XENON is not set -# CONFIG_MMC_SDRICOH_CS is not set -# CONFIG_MMC_SPI is not set -# CONFIG_MMC_STM32_SDMMC is not set -# CONFIG_MMC_TEST is not set -# CONFIG_MMC_TIFM_SD is not set -# CONFIG_MMC_TOSHIBA_PCI is not set -# CONFIG_MMC_USDHI6ROL0 is not set -# CONFIG_MMC_USHC is not set -# CONFIG_MMC_VIA_SDMMC is not set -# CONFIG_MMC_VUB300 is not set -# CONFIG_MMIOTRACE is not set -CONFIG_MMU=y -CONFIG_MMU_GATHER_RCU_TABLE_FREE=y -CONFIG_MMU_GATHER_TABLE_FREE=y -CONFIG_MODPROBE_PATH="/sbin/modprobe" -CONFIG_MODULES=y -# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set -# CONFIG_MODULE_COMPRESS_GZIP is not set -CONFIG_MODULE_COMPRESS_NONE=y -# CONFIG_MODULE_COMPRESS_XZ is not set -# CONFIG_MODULE_COMPRESS_ZSTD is not set -# CONFIG_MODULE_FORCE_LOAD is not set -# CONFIG_MODULE_FORCE_UNLOAD is not set -# CONFIG_MODULE_SIG is not set -# CONFIG_MODULE_SRCVERSION_ALL is not set -CONFIG_MODULE_STRIPPED=y -CONFIG_MODULE_UNLOAD=y -# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set -# CONFIG_MODVERSIONS is not set -# CONFIG_MOST is not set -# CONFIG_MOTORCOMM_PHY is not set -# CONFIG_MOUSE_APPLETOUCH is not set -# CONFIG_MOUSE_ELAN_I2C is not set -# CONFIG_MOUSE_GPIO is not set -# CONFIG_MOUSE_INPORT is not set -# CONFIG_MOUSE_LOGIBM is not set -# CONFIG_MOUSE_PC110PAD is not set -# CONFIG_MOUSE_PS2_FOCALTECH is not set -# CONFIG_MOUSE_PS2_SENTELIC is not set -# CONFIG_MOUSE_SYNAPTICS_I2C is not set -# CONFIG_MOUSE_SYNAPTICS_USB is not set -# CONFIG_MOXTET is not set -# CONFIG_MPL115 is not set -# CONFIG_MPL115_I2C is not set -# CONFIG_MPL115_SPI is not set -# CONFIG_MPL3115 is not set -# CONFIG_MPLS is not set -# CONFIG_MPTCP is not set -# CONFIG_MPU3050_I2C is not set -# CONFIG_MQ_IOSCHED_DEADLINE is not set -# CONFIG_MQ_IOSCHED_KYBER is not set -# CONFIG_MS5611 is not set -# CONFIG_MS5637 is not set -# CONFIG_MSCC_OCELOT_SWITCH is not set -# CONFIG_MSDOS_FS is not set -CONFIG_MSDOS_PARTITION=y -# CONFIG_MSI_BITMAP_SELFTEST is not set -# CONFIG_MSI_LAPTOP is not set -# CONFIG_MST_IRQ is not set -CONFIG_MTD=y -# CONFIG_MTD_ABSENT is not set -# CONFIG_MTD_AFS_PARTS is not set -# CONFIG_MTD_AR7_PARTS is not set -CONFIG_MTD_BLKDEVS=y -CONFIG_MTD_BLOCK=y -# CONFIG_MTD_BLOCK2MTD is not set -CONFIG_MTD_CFI=y -# CONFIG_MTD_CFI_ADV_OPTIONS is not set -CONFIG_MTD_CFI_AMDSTD=y -# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -CONFIG_MTD_CFI_I1=y -CONFIG_MTD_CFI_I2=y -# CONFIG_MTD_CFI_I4 is not set -# CONFIG_MTD_CFI_I8 is not set -CONFIG_MTD_CFI_INTELEXT=y -# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -CONFIG_MTD_CFI_NOSWAP=y -# CONFIG_MTD_CFI_STAA is not set -CONFIG_MTD_CFI_UTIL=y -# CONFIG_MTD_CMDLINE_PARTS is not set -CONFIG_MTD_COMPLEX_MAPPINGS=y -# CONFIG_MTD_DATAFLASH is not set -# CONFIG_MTD_DOCG3 is not set -CONFIG_MTD_GEN_PROBE=y -# CONFIG_MTD_GPIO_ADDR is not set -# CONFIG_MTD_HYPERBUS is not set -# CONFIG_MTD_IMPA7 is not set -# CONFIG_MTD_INTEL_VR_NOR is not set -# CONFIG_MTD_JEDECPROBE is not set -# CONFIG_MTD_LATCH_ADDR is not set -# CONFIG_MTD_LPDDR is not set -# CONFIG_MTD_LPDDR2_NVM is not set -# CONFIG_MTD_M25P80 is not set -CONFIG_MTD_MAP_BANK_WIDTH_1=y -# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -CONFIG_MTD_MAP_BANK_WIDTH_2=y -# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -CONFIG_MTD_MAP_BANK_WIDTH_4=y -# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -# CONFIG_MTD_MCHP23K256 is not set -# CONFIG_MTD_MCHP48L640 is not set -# CONFIG_MTD_MT81xx_NOR is not set -# CONFIG_MTD_MTDRAM is not set -# CONFIG_MTD_MYLOADER_PARTS is not set -# CONFIG_MTD_NAND is not set -# CONFIG_MTD_NAND_AMS_DELTA is not set -# CONFIG_MTD_NAND_AR934X is not set -# CONFIG_MTD_NAND_AR934X_HW_ECC is not set -# CONFIG_MTD_NAND_ARASAN is not set -# CONFIG_MTD_NAND_ATMEL is not set -# CONFIG_MTD_NAND_AU1550 is not set -# CONFIG_MTD_NAND_BCH is not set -# CONFIG_MTD_NAND_BF5XX is not set -# CONFIG_MTD_NAND_BRCMNAND is not set -# CONFIG_MTD_NAND_CADENCE is not set -# CONFIG_MTD_NAND_CAFE is not set -# CONFIG_MTD_NAND_CM_X270 is not set -# CONFIG_MTD_NAND_CS553X is not set -# CONFIG_MTD_NAND_DAVINCI is not set -# CONFIG_MTD_NAND_DENALI is not set -# CONFIG_MTD_NAND_DENALI_DT is not set -# CONFIG_MTD_NAND_DENALI_PCI is not set -CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xff108018 -# CONFIG_MTD_NAND_DISKONCHIP is not set -# CONFIG_MTD_NAND_DOCG4 is not set -# CONFIG_MTD_NAND_ECC is not set -# CONFIG_MTD_NAND_ECC_BCH is not set -# CONFIG_MTD_NAND_ECC_MXIC is not set -# CONFIG_MTD_NAND_ECC_SMC is not set -# CONFIG_MTD_NAND_ECC_SW_BCH is not set -# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set -# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set -# CONFIG_MTD_NAND_FSL_ELBC is not set -# CONFIG_MTD_NAND_FSL_IFC is not set -# CONFIG_MTD_NAND_FSL_UPM is not set -# CONFIG_MTD_NAND_FSMC is not set -# CONFIG_MTD_NAND_GPIO is not set -# CONFIG_MTD_NAND_GPMI_NAND is not set -# CONFIG_MTD_NAND_HISI504 is not set -CONFIG_MTD_NAND_IDS=y -# CONFIG_MTD_NAND_INTEL_LGM is not set -# CONFIG_MTD_NAND_JZ4740 is not set -# CONFIG_MTD_NAND_MPC5121_NFC is not set -# CONFIG_MTD_NAND_MTK is not set -# CONFIG_MTD_NAND_MTK_BMT is not set -# CONFIG_MTD_NAND_MXC is not set -# CONFIG_MTD_NAND_MXIC is not set -# CONFIG_MTD_NAND_NANDSIM is not set -# CONFIG_MTD_NAND_NDFC is not set -# CONFIG_MTD_NAND_NUC900 is not set -# CONFIG_MTD_NAND_OMAP2 is not set -# CONFIG_MTD_NAND_OMAP_BCH_BUILD is not set -# CONFIG_MTD_NAND_ORION is not set -# CONFIG_MTD_NAND_PASEMI is not set -# CONFIG_MTD_NAND_PLATFORM is not set -# CONFIG_MTD_NAND_PXA3xx is not set -# CONFIG_MTD_NAND_RB4XX is not set -# CONFIG_MTD_NAND_RB750 is not set -# CONFIG_MTD_NAND_RB91X is not set -# CONFIG_MTD_NAND_RICOH is not set -# CONFIG_MTD_NAND_S3C2410 is not set -# CONFIG_MTD_NAND_SHARPSL is not set -# CONFIG_MTD_NAND_SH_FLCTL is not set -# CONFIG_MTD_NAND_SOCRATES is not set -# CONFIG_MTD_NAND_TMIO is not set -# CONFIG_MTD_NAND_TXX9NDFMC is not set -CONFIG_MTD_OF_PARTS=y -# CONFIG_MTD_ONENAND is not set -# CONFIG_MTD_OOPS is not set -# CONFIG_MTD_OTP is not set -# CONFIG_MTD_PARTITIONED_MASTER is not set -# CONFIG_MTD_PCI is not set -# CONFIG_MTD_PCMCIA is not set -# CONFIG_MTD_PHRAM is not set -# CONFIG_MTD_PHYSMAP is not set -# CONFIG_MTD_PHYSMAP_COMPAT is not set -# CONFIG_MTD_PHYSMAP_GEMINI is not set -# CONFIG_MTD_PHYSMAP_GPIO_ADDR is not set -# CONFIG_MTD_PHYSMAP_IXP4XX is not set -CONFIG_MTD_PHYSMAP_OF=y -# CONFIG_MTD_PHYSMAP_OF_GEMINI is not set -# CONFIG_MTD_PHYSMAP_OF_VERSATILE is not set -# CONFIG_MTD_PHYSMAP_VERSATILE is not set -# CONFIG_MTD_PLATRAM is not set -# CONFIG_MTD_PMC551 is not set -# CONFIG_MTD_RAM is not set -# CONFIG_MTD_RAW_NAND is not set -CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 -# CONFIG_MTD_REDBOOT_PARTS is not set -# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set -# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set -# CONFIG_MTD_ROM is not set -CONFIG_MTD_ROOTFS_ROOT_DEV=y -# CONFIG_MTD_ROUTERBOOT_PARTS is not set -# CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_SM_COMMON is not set -# CONFIG_MTD_SPINAND_MT29F is not set -# CONFIG_MTD_SPI_NAND is not set -# CONFIG_MTD_SPI_NOR is not set -CONFIG_MTD_SPI_NOR_SWP_DISABLE=y -# CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE is not set -# CONFIG_MTD_SPI_NOR_SWP_KEEP is not set -# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set -CONFIG_MTD_SPI_NOR_USE_4K_SECTORS_LIMIT=4096 -CONFIG_MTD_SPLIT=y -# CONFIG_MTD_SPLIT_BCM63XX_FW is not set -# CONFIG_MTD_SPLIT_BCM_WFI_FW is not set -# CONFIG_MTD_SPLIT_BRNIMAGE_FW is not set -# CONFIG_MTD_SPLIT_ELF_FW is not set -# CONFIG_MTD_SPLIT_EVA_FW is not set -# CONFIG_MTD_SPLIT_FIRMWARE is not set -CONFIG_MTD_SPLIT_FIRMWARE_NAME="firmware" -# CONFIG_MTD_SPLIT_FIT_FW is not set -# CONFIG_MTD_SPLIT_H3C_VFS is not set -# CONFIG_MTD_SPLIT_JIMAGE_FW is not set -# CONFIG_MTD_SPLIT_LZMA_FW is not set -# CONFIG_MTD_SPLIT_MINOR_FW is not set -# CONFIG_MTD_SPLIT_SEAMA_FW is not set -CONFIG_MTD_SPLIT_SQUASHFS_ROOT=y -CONFIG_MTD_SPLIT_SUPPORT=y -# CONFIG_MTD_SPLIT_TPLINK_FW is not set -# CONFIG_MTD_SPLIT_TRX_FW is not set -# CONFIG_MTD_SPLIT_UIMAGE_FW is not set -# CONFIG_MTD_SPLIT_WRGG_FW is not set -# CONFIG_MTD_SST25L is not set -# CONFIG_MTD_SWAP is not set -# CONFIG_MTD_TESTS is not set -# CONFIG_MTD_UBI is not set -# CONFIG_MTD_UBI_FASTMAP is not set -# CONFIG_MTD_UBI_GLUEBI is not set -# CONFIG_MTD_UIMAGE_SPLIT is not set -# CONFIG_MTD_VIRT_CONCAT is not set -# CONFIG_MTK_MMC is not set -# CONFIG_MTK_MMSYS is not set -CONFIG_MULTIUSER=y -# CONFIG_MUTEX_SPIN_ON_OWNER is not set -# CONFIG_MV643XX_ETH is not set -# CONFIG_MVMDIO is not set -# CONFIG_MVNETA_BM is not set -# CONFIG_MVSW61XX_PHY is not set -# CONFIG_MVSWITCH_PHY is not set -# CONFIG_MV_XOR_V2 is not set -# CONFIG_MWAVE is not set -# CONFIG_MWL8K is not set -# CONFIG_MXC4005 is not set -# CONFIG_MXC6255 is not set -# CONFIG_MYRI10GE is not set -# CONFIG_NAMESPACES is not set -# CONFIG_NATIONAL_PHY is not set -# CONFIG_NATSEMI is not set -# CONFIG_NAU7802 is not set -# CONFIG_NBPFAXI_DMA is not set -# CONFIG_NCP_FS is not set -# CONFIG_ND_BLK is not set -# CONFIG_NE2000 is not set -# CONFIG_NE2K_PCI is not set -# CONFIG_NEC_MARKEINS is not set -CONFIG_NET=y -# CONFIG_NETCONSOLE is not set -CONFIG_NETDEVICES=y -# CONFIG_NETDEVSIM is not set -# CONFIG_NETFILTER is not set -# CONFIG_NETFILTER_ADVANCED is not set -# CONFIG_NETFILTER_DEBUG is not set -# CONFIG_NETFILTER_EGRESS is not set -# CONFIG_NETFILTER_INGRESS is not set -# CONFIG_NETFILTER_NETLINK is not set -# CONFIG_NETFILTER_NETLINK_ACCT is not set -# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set -# CONFIG_NETFILTER_NETLINK_HOOK is not set -# CONFIG_NETFILTER_NETLINK_LOG is not set -# CONFIG_NETFILTER_NETLINK_OSF is not set -# CONFIG_NETFILTER_NETLINK_QUEUE is not set -# CONFIG_NETFILTER_XTABLES is not set -# CONFIG_NETFILTER_XTABLES_COMPAT is not set -# CONFIG_NETFILTER_XT_CONNMARK is not set -# CONFIG_NETFILTER_XT_MARK is not set -# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set -# CONFIG_NETFILTER_XT_MATCH_BPF is not set -# CONFIG_NETFILTER_XT_MATCH_CGROUP is not set -# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set -# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set -# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set -# CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set -# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set -# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set -# CONFIG_NETFILTER_XT_MATCH_CPU is not set -# CONFIG_NETFILTER_XT_MATCH_DCCP is not set -# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set -# CONFIG_NETFILTER_XT_MATCH_DSCP is not set -# CONFIG_NETFILTER_XT_MATCH_ECN is not set -# CONFIG_NETFILTER_XT_MATCH_ESP is not set -# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_HELPER is not set -# CONFIG_NETFILTER_XT_MATCH_HL is not set -# CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set -# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set -# CONFIG_NETFILTER_XT_MATCH_L2TP is not set -# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set -# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set -# CONFIG_NETFILTER_XT_MATCH_MAC is not set -# CONFIG_NETFILTER_XT_MATCH_MARK is not set -# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set -# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set -# CONFIG_NETFILTER_XT_MATCH_OSF is not set -# CONFIG_NETFILTER_XT_MATCH_OWNER is not set -# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set -# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set -# CONFIG_NETFILTER_XT_MATCH_POLICY is not set -# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set -# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set -# CONFIG_NETFILTER_XT_MATCH_REALM is not set -# CONFIG_NETFILTER_XT_MATCH_RECENT is not set -# CONFIG_NETFILTER_XT_MATCH_SCTP is not set -# CONFIG_NETFILTER_XT_MATCH_SOCKET is not set -# CONFIG_NETFILTER_XT_MATCH_STATE is not set -# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set -# CONFIG_NETFILTER_XT_MATCH_STRING is not set -# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set -# CONFIG_NETFILTER_XT_MATCH_TIME is not set -# CONFIG_NETFILTER_XT_MATCH_U32 is not set -# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set -# CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set -# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set -# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set -# CONFIG_NETFILTER_XT_TARGET_CT is not set -# CONFIG_NETFILTER_XT_TARGET_DSCP is not set -# CONFIG_NETFILTER_XT_TARGET_HL is not set -# CONFIG_NETFILTER_XT_TARGET_HMARK is not set -# CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set -# CONFIG_NETFILTER_XT_TARGET_LED is not set -# CONFIG_NETFILTER_XT_TARGET_LOG is not set -# CONFIG_NETFILTER_XT_TARGET_MARK is not set -# CONFIG_NETFILTER_XT_TARGET_NETMAP is not set -# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set -# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set -# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set -# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set -# CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set -# CONFIG_NETFILTER_XT_TARGET_SECMARK is not set -# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set -# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set -# CONFIG_NETFILTER_XT_TARGET_TEE is not set -# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set -# CONFIG_NETFILTER_XT_TARGET_TRACE is not set -# CONFIG_NETFS_STATS is not set -# CONFIG_NETFS_SUPPORT is not set -# CONFIG_NETLABEL is not set -# CONFIG_NETLINK_DIAG is not set -# CONFIG_NETLINK_MMAP is not set -# CONFIG_NETPOLL is not set -# CONFIG_NETROM is not set -CONFIG_NETWORK_FILESYSTEMS=y -# CONFIG_NETWORK_PHY_TIMESTAMPING is not set -# CONFIG_NETWORK_SECMARK is not set -# CONFIG_NETXEN_NIC is not set -# CONFIG_NET_9P is not set -# CONFIG_NET_ACT_BPF is not set -# CONFIG_NET_ACT_CSUM is not set -# CONFIG_NET_ACT_CT is not set -# CONFIG_NET_ACT_GACT is not set -# CONFIG_NET_ACT_GATE is not set -# CONFIG_NET_ACT_IFE is not set -# CONFIG_NET_ACT_IPT is not set -# CONFIG_NET_ACT_MIRRED is not set -# CONFIG_NET_ACT_MPLS is not set -# CONFIG_NET_ACT_NAT is not set -# CONFIG_NET_ACT_PEDIT is not set -# CONFIG_NET_ACT_POLICE is not set -# CONFIG_NET_ACT_SAMPLE is not set -# CONFIG_NET_ACT_SIMP is not set -# CONFIG_NET_ACT_SKBEDIT is not set -# CONFIG_NET_ACT_SKBMOD is not set -# CONFIG_NET_ACT_TUNNEL_KEY is not set -# CONFIG_NET_ACT_VLAN is not set -CONFIG_NET_CADENCE=y -# CONFIG_NET_CALXEDA_XGMAC is not set -CONFIG_NET_CLS=y -# CONFIG_NET_CLS_ACT is not set -# CONFIG_NET_CLS_BASIC is not set -# CONFIG_NET_CLS_BPF is not set -# CONFIG_NET_CLS_FLOW is not set -# CONFIG_NET_CLS_FLOWER is not set -# CONFIG_NET_CLS_FW is not set -CONFIG_NET_CLS_IND=y -# CONFIG_NET_CLS_MATCHALL is not set -# CONFIG_NET_CLS_ROUTE4 is not set -# CONFIG_NET_CLS_RSVP is not set -# CONFIG_NET_CLS_RSVP6 is not set -# CONFIG_NET_CLS_TCINDEX is not set -# CONFIG_NET_CLS_U32 is not set -CONFIG_NET_CORE=y -# CONFIG_NET_DEVLINK is not set -# CONFIG_NET_DEV_REFCNT_TRACKER is not set -# CONFIG_NET_DROP_MONITOR is not set -# CONFIG_NET_DSA is not set -# CONFIG_NET_DSA_AR9331 is not set -# CONFIG_NET_DSA_BCM_SF2 is not set -# CONFIG_NET_DSA_LANTIQ_GSWIP is not set -# CONFIG_NET_DSA_LEGACY is not set -# CONFIG_NET_DSA_LOOP is not set -# CONFIG_NET_DSA_MICROCHIP_KSZ8795 is not set -# CONFIG_NET_DSA_MICROCHIP_KSZ9477 is not set -# CONFIG_NET_DSA_MSCC_SEVILLE is not set -# CONFIG_NET_DSA_MT7530 is not set -# CONFIG_NET_DSA_MV88E6060 is not set -# CONFIG_NET_DSA_MV88E6123_61_65 is not set -# CONFIG_NET_DSA_MV88E6131 is not set -# CONFIG_NET_DSA_MV88E6171 is not set -# CONFIG_NET_DSA_MV88E6352 is not set -# CONFIG_NET_DSA_MV88E6XXX is not set -# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set -# CONFIG_NET_DSA_MV88E6XXX_PTP is not set -# CONFIG_NET_DSA_QCA8K is not set -# CONFIG_NET_DSA_REALTEK_SMI is not set -# CONFIG_NET_DSA_SJA1105 is not set -# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set -# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set -# CONFIG_NET_DSA_TAG_8021Q is not set -# CONFIG_NET_DSA_TAG_AR9331 is not set -# CONFIG_NET_DSA_TAG_BRCM is not set -# CONFIG_NET_DSA_TAG_BRCM_LEGACY is not set -# CONFIG_NET_DSA_TAG_BRCM_PREPEND is not set -# CONFIG_NET_DSA_TAG_DSA is not set -# CONFIG_NET_DSA_TAG_DSA_COMMON is not set -# CONFIG_NET_DSA_TAG_EDSA is not set -# CONFIG_NET_DSA_TAG_GSWIP is not set -# CONFIG_NET_DSA_TAG_HELLCREEK is not set -# CONFIG_NET_DSA_TAG_KSZ is not set -# CONFIG_NET_DSA_TAG_LAN9303 is not set -# CONFIG_NET_DSA_TAG_MTK is not set -# CONFIG_NET_DSA_TAG_OCELOT is not set -# CONFIG_NET_DSA_TAG_OCELOT_8021Q is not set -# CONFIG_NET_DSA_TAG_QCA is not set -# CONFIG_NET_DSA_TAG_RTL4_A is not set -# CONFIG_NET_DSA_TAG_RTL8_4 is not set -# CONFIG_NET_DSA_TAG_SJA1105 is not set -# CONFIG_NET_DSA_TAG_TRAILER is not set -# CONFIG_NET_DSA_TAG_XRS700X is not set -# CONFIG_NET_DSA_VITESSE_VSC73XX is not set -# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set -# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set -# CONFIG_NET_DSA_XRS700X_I2C is not set -# CONFIG_NET_DSA_XRS700X_MDIO is not set -# CONFIG_NET_EMATCH is not set -# CONFIG_NET_EMATCH_CANID is not set -# CONFIG_NET_EMATCH_CMP is not set -# CONFIG_NET_EMATCH_IPT is not set -# CONFIG_NET_EMATCH_META is not set -# CONFIG_NET_EMATCH_NBYTE is not set -CONFIG_NET_EMATCH_STACK=32 -# CONFIG_NET_EMATCH_TEXT is not set -# CONFIG_NET_EMATCH_U32 is not set -# CONFIG_NET_FAILOVER is not set -# CONFIG_NET_FC is not set -# CONFIG_NET_FOU is not set -# CONFIG_NET_FOU_IP_TUNNELS is not set -# CONFIG_NET_IFE is not set -# CONFIG_NET_IPGRE is not set -CONFIG_NET_IPGRE_BROADCAST=y -# CONFIG_NET_IPGRE_DEMUX is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPVTI is not set -# CONFIG_NET_IP_TUNNEL is not set -# CONFIG_NET_KEY is not set -# CONFIG_NET_KEY_MIGRATE is not set -# CONFIG_NET_L3_MASTER_DEV is not set -# CONFIG_NET_MEDIATEK_STAR_EMAC is not set -# CONFIG_NET_MPLS_GSO is not set -# CONFIG_NET_NCSI is not set -# CONFIG_NET_NSH is not set -# CONFIG_NET_NS_REFCNT_TRACKER is not set -# CONFIG_NET_PACKET_ENGINE is not set -# CONFIG_NET_PKTGEN is not set -# CONFIG_NET_POLL_CONTROLLER is not set -# CONFIG_NET_PTP_CLASSIFY is not set -CONFIG_NET_RX_BUSY_POLL=y -# CONFIG_NET_SB1000 is not set -CONFIG_NET_SCHED=y -# CONFIG_NET_SCH_ATM is not set -# CONFIG_NET_SCH_CAKE is not set -# CONFIG_NET_SCH_CBQ is not set -# CONFIG_NET_SCH_CBS is not set -# CONFIG_NET_SCH_CHOKE is not set -# CONFIG_NET_SCH_CODEL is not set -# CONFIG_NET_SCH_DEFAULT is not set -# CONFIG_NET_SCH_DRR is not set -# CONFIG_NET_SCH_DSMARK is not set -# CONFIG_NET_SCH_ETF is not set -# CONFIG_NET_SCH_ETS is not set -CONFIG_NET_SCH_FIFO=y -# CONFIG_NET_SCH_FQ is not set -CONFIG_NET_SCH_FQ_CODEL=y -# CONFIG_NET_SCH_FQ_PIE is not set -# CONFIG_NET_SCH_GRED is not set -# CONFIG_NET_SCH_HFSC is not set -# CONFIG_NET_SCH_HHF is not set -# CONFIG_NET_SCH_HTB is not set -# CONFIG_NET_SCH_INGRESS is not set -# CONFIG_NET_SCH_MQPRIO is not set -# CONFIG_NET_SCH_MULTIQ is not set -# CONFIG_NET_SCH_NETEM is not set -# CONFIG_NET_SCH_PIE is not set -# CONFIG_NET_SCH_PLUG is not set -# CONFIG_NET_SCH_PRIO is not set -# CONFIG_NET_SCH_QFQ is not set -# CONFIG_NET_SCH_RED is not set -# CONFIG_NET_SCH_SFB is not set -# CONFIG_NET_SCH_SFQ is not set -# CONFIG_NET_SCH_SKBPRIO is not set -# CONFIG_NET_SCH_TAPRIO is not set -# CONFIG_NET_SCH_TBF is not set -# CONFIG_NET_SCH_TEQL is not set -# CONFIG_NET_SCTPPROBE is not set -# CONFIG_NET_SELFTESTS is not set -# CONFIG_NET_SOCK_MSG is not set -# CONFIG_NET_SWITCHDEV is not set -# CONFIG_NET_TCPPROBE is not set -# CONFIG_NET_TC_SKB_EXT is not set -# CONFIG_NET_TEAM is not set -# CONFIG_NET_TULIP is not set -# CONFIG_NET_UDP_TUNNEL is not set -CONFIG_NET_VENDOR_3COM=y -CONFIG_NET_VENDOR_8390=y -CONFIG_NET_VENDOR_ADAPTEC=y -CONFIG_NET_VENDOR_AGERE=y -CONFIG_NET_VENDOR_ALACRITECH=y -CONFIG_NET_VENDOR_ALTEON=y -CONFIG_NET_VENDOR_AMAZON=y -CONFIG_NET_VENDOR_AMD=y -CONFIG_NET_VENDOR_AQUANTIA=y -CONFIG_NET_VENDOR_ARC=y -# CONFIG_NET_VENDOR_ASIX is not set -CONFIG_NET_VENDOR_ATHEROS=y -CONFIG_NET_VENDOR_AURORA=y -CONFIG_NET_VENDOR_BROADCOM=y -CONFIG_NET_VENDOR_BROCADE=y -CONFIG_NET_VENDOR_CADENCE=y -CONFIG_NET_VENDOR_CAVIUM=y -CONFIG_NET_VENDOR_CHELSIO=y -CONFIG_NET_VENDOR_CIRRUS=y -CONFIG_NET_VENDOR_CISCO=y -CONFIG_NET_VENDOR_CORTINA=y -# CONFIG_NET_VENDOR_DAVICOM is not set -CONFIG_NET_VENDOR_DEC=y -CONFIG_NET_VENDOR_DLINK=y -CONFIG_NET_VENDOR_EMULEX=y -# CONFIG_NET_VENDOR_ENGLEDER is not set -CONFIG_NET_VENDOR_EXAR=y -CONFIG_NET_VENDOR_EZCHIP=y -CONFIG_NET_VENDOR_FARADAY=y -CONFIG_NET_VENDOR_FREESCALE=y -CONFIG_NET_VENDOR_FUJITSU=y -# CONFIG_NET_VENDOR_FUNGIBLE is not set -CONFIG_NET_VENDOR_GOOGLE=y -CONFIG_NET_VENDOR_HISILICON=y -CONFIG_NET_VENDOR_HP=y -CONFIG_NET_VENDOR_HUAWEI=y -CONFIG_NET_VENDOR_I825XX=y -CONFIG_NET_VENDOR_IBM=y -CONFIG_NET_VENDOR_INTEL=y -# CONFIG_NET_VENDOR_LITEX is not set -CONFIG_NET_VENDOR_MARVELL=y -CONFIG_NET_VENDOR_MELLANOX=y -CONFIG_NET_VENDOR_MICREL=y -CONFIG_NET_VENDOR_MICROCHIP=y -CONFIG_NET_VENDOR_MICROSEMI=y -CONFIG_NET_VENDOR_MICROSOFT=y -CONFIG_NET_VENDOR_MYRI=y -CONFIG_NET_VENDOR_NATSEMI=y -CONFIG_NET_VENDOR_NETERION=y -CONFIG_NET_VENDOR_NETRONOME=y -CONFIG_NET_VENDOR_NI=y -CONFIG_NET_VENDOR_NVIDIA=y -CONFIG_NET_VENDOR_OKI=y -CONFIG_NET_VENDOR_PACKET_ENGINES=y -CONFIG_NET_VENDOR_PENSANDO=y -CONFIG_NET_VENDOR_QLOGIC=y -CONFIG_NET_VENDOR_QUALCOMM=y -CONFIG_NET_VENDOR_RDC=y -CONFIG_NET_VENDOR_REALTEK=y -CONFIG_NET_VENDOR_RENESAS=y -CONFIG_NET_VENDOR_ROCKER=y -CONFIG_NET_VENDOR_SAMSUNG=y -CONFIG_NET_VENDOR_SEEQ=y -CONFIG_NET_VENDOR_SILAN=y -CONFIG_NET_VENDOR_SIS=y -CONFIG_NET_VENDOR_SMSC=y -CONFIG_NET_VENDOR_SOCIONEXT=y -CONFIG_NET_VENDOR_SOLARFLARE=y -CONFIG_NET_VENDOR_STMICRO=y -CONFIG_NET_VENDOR_SUN=y -CONFIG_NET_VENDOR_SYNOPSYS=y -CONFIG_NET_VENDOR_TEHUTI=y -CONFIG_NET_VENDOR_TI=y -CONFIG_NET_VENDOR_TOSHIBA=y -# CONFIG_NET_VENDOR_VERTEXCOM is not set -CONFIG_NET_VENDOR_VIA=y -CONFIG_NET_VENDOR_WIZNET=y -CONFIG_NET_VENDOR_XILINX=y -CONFIG_NET_VENDOR_XIRCOM=y -# CONFIG_NET_VRF is not set -# CONFIG_NET_XGENE is not set -CONFIG_NEW_LEDS=y -# CONFIG_NFC is not set -# CONFIG_NFP is not set -# CONFIG_NFSD is not set -# CONFIG_NFSD_V2_ACL is not set -CONFIG_NFSD_V3=y -# CONFIG_NFSD_V3_ACL is not set -# CONFIG_NFSD_V4 is not set -# CONFIG_NFS_ACL_SUPPORT is not set -CONFIG_NFS_COMMON=y -# CONFIG_NFS_DISABLE_UDP_SUPPORT is not set -# CONFIG_NFS_FS is not set -# CONFIG_NFS_FSCACHE is not set -# CONFIG_NFS_SWAP is not set -# CONFIG_NFS_V2 is not set -CONFIG_NFS_V3=y -# CONFIG_NFS_V3_ACL is not set -# CONFIG_NFS_V4 is not set -# CONFIG_NFS_V4_1 is not set -# CONFIG_NFTL is not set -# CONFIG_NFT_BRIDGE_META is not set -# CONFIG_NFT_BRIDGE_REJECT is not set -# CONFIG_NFT_CONNLIMIT is not set -# CONFIG_NFT_DUP_IPV4 is not set -# CONFIG_NFT_DUP_IPV6 is not set -# CONFIG_NFT_FIB_IPV4 is not set -# CONFIG_NFT_FIB_IPV6 is not set -# CONFIG_NFT_FIB_NETDEV is not set -# CONFIG_NFT_FLOW_OFFLOAD is not set -# CONFIG_NFT_OBJREF is not set -# CONFIG_NFT_OSF is not set -# CONFIG_NFT_REJECT_NETDEV is not set -# CONFIG_NFT_RT is not set -# CONFIG_NFT_SET_BITMAP is not set -# CONFIG_NFT_SOCKET is not set -# CONFIG_NFT_SYNPROXY is not set -# CONFIG_NFT_TPROXY is not set -# CONFIG_NFT_TUNNEL is not set -# CONFIG_NFT_XFRM is not set -# CONFIG_NF_CONNTRACK is not set -# CONFIG_NF_CONNTRACK_AMANDA is not set -# CONFIG_NF_CONNTRACK_BRIDGE is not set -# CONFIG_NF_CONNTRACK_EVENTS is not set -# CONFIG_NF_CONNTRACK_FTP is not set -# CONFIG_NF_CONNTRACK_H323 is not set -# CONFIG_NF_CONNTRACK_IPV4 is not set -# CONFIG_NF_CONNTRACK_IPV6 is not set -# CONFIG_NF_CONNTRACK_IRC is not set -# CONFIG_NF_CONNTRACK_LABELS is not set -# CONFIG_NF_CONNTRACK_MARK is not set -# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set -# CONFIG_NF_CONNTRACK_PPTP is not set -CONFIG_NF_CONNTRACK_PROCFS=y -# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set -# CONFIG_NF_CONNTRACK_SANE is not set -# CONFIG_NF_CONNTRACK_SECMARK is not set -# CONFIG_NF_CONNTRACK_SIP is not set -# CONFIG_NF_CONNTRACK_SNMP is not set -# CONFIG_NF_CONNTRACK_TFTP is not set -# CONFIG_NF_CONNTRACK_TIMEOUT is not set -# CONFIG_NF_CONNTRACK_TIMESTAMP is not set -# CONFIG_NF_CONNTRACK_ZONES is not set -# CONFIG_NF_CT_NETLINK is not set -# CONFIG_NF_CT_NETLINK_HELPER is not set -# CONFIG_NF_CT_NETLINK_TIMEOUT is not set -# CONFIG_NF_CT_PROTO_DCCP is not set -# CONFIG_NF_CT_PROTO_GRE is not set -# CONFIG_NF_CT_PROTO_SCTP is not set -# CONFIG_NF_CT_PROTO_UDPLITE is not set -# CONFIG_NF_DEFRAG_IPV4 is not set -# CONFIG_NF_DUP_IPV4 is not set -# CONFIG_NF_DUP_IPV6 is not set -# CONFIG_NF_FLOW_TABLE is not set -# CONFIG_NF_LOG_ARP is not set -CONFIG_NF_LOG_IPV4=y -CONFIG_NF_LOG_IPV6=y -CONFIG_NF_LOG_SYSLOG=y -# CONFIG_NF_NAT is not set -# CONFIG_NF_NAT_AMANDA is not set -# CONFIG_NF_NAT_FTP is not set -# CONFIG_NF_NAT_H323 is not set -# CONFIG_NF_NAT_IPV6 is not set -# CONFIG_NF_NAT_IRC is not set -CONFIG_NF_NAT_MASQUERADE_IPV4=y -CONFIG_NF_NAT_MASQUERADE_IPV6=y -# CONFIG_NF_NAT_NEEDED is not set -# CONFIG_NF_NAT_PPTP is not set -# CONFIG_NF_NAT_PROTO_GRE is not set -# CONFIG_NF_NAT_SIP is not set -# CONFIG_NF_NAT_SNMP_BASIC is not set -# CONFIG_NF_NAT_TFTP is not set -# CONFIG_NF_REJECT_IPV4 is not set -# CONFIG_NF_REJECT_IPV6 is not set -# CONFIG_NF_SOCKET_IPV4 is not set -# CONFIG_NF_SOCKET_IPV6 is not set -# CONFIG_NF_TABLES is not set -CONFIG_NF_TABLES_ARP=y -CONFIG_NF_TABLES_BRIDGE=y -CONFIG_NF_TABLES_INET=y -CONFIG_NF_TABLES_IPV4=y -CONFIG_NF_TABLES_IPV6=y -CONFIG_NF_TABLES_NETDEV=y -# CONFIG_NF_TABLES_SET is not set -# CONFIG_NF_TPROXY_IPV4 is not set -# CONFIG_NF_TPROXY_IPV6 is not set -# CONFIG_NI65 is not set -# CONFIG_NI903X_WDT is not set -# CONFIG_NIC7018_WDT is not set -# CONFIG_NILFS2_FS is not set -# CONFIG_NIU is not set -# CONFIG_NI_XGE_MANAGEMENT_ENET is not set -CONFIG_NLATTR=y -# CONFIG_NLMON is not set -# CONFIG_NLM_XLP_BOARD is not set -# CONFIG_NLM_XLR_BOARD is not set -# CONFIG_NLS is not set -# CONFIG_NLS_ASCII is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -# CONFIG_NLS_CODEPAGE_437 is not set -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_CODEPAGE_932 is not set -# CONFIG_NLS_CODEPAGE_936 is not set -# CONFIG_NLS_CODEPAGE_949 is not set -# CONFIG_NLS_CODEPAGE_950 is not set -CONFIG_NLS_DEFAULT="iso8859-1" -# CONFIG_NLS_ISO8859_1 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -# CONFIG_NLS_MAC_CELTIC is not set -# CONFIG_NLS_MAC_CENTEURO is not set -# CONFIG_NLS_MAC_CROATIAN is not set -# CONFIG_NLS_MAC_CYRILLIC is not set -# CONFIG_NLS_MAC_GAELIC is not set -# CONFIG_NLS_MAC_GREEK is not set -# CONFIG_NLS_MAC_ICELAND is not set -# CONFIG_NLS_MAC_INUIT is not set -# CONFIG_NLS_MAC_ROMAN is not set -# CONFIG_NLS_MAC_ROMANIAN is not set -# CONFIG_NLS_MAC_TURKISH is not set -# CONFIG_NLS_UTF8 is not set -CONFIG_NMI_LOG_BUF_SHIFT=13 -# CONFIG_NOA1305 is not set -# CONFIG_NOP_USB_XCEIV is not set -# CONFIG_NORTEL_HERMES is not set -# CONFIG_NOTIFIER_ERROR_INJECTION is not set -# CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT is not set -# CONFIG_NOZOMI is not set -# CONFIG_NO_BOOTMEM is not set -# CONFIG_NO_HZ is not set -# CONFIG_NO_HZ_FULL is not set -# CONFIG_NO_HZ_IDLE is not set -CONFIG_NR_CPUS=256 -# CONFIG_NS83820 is not set -# CONFIG_NTB is not set -# CONFIG_NTFS3_FS is not set -# CONFIG_NTFS_DEBUG is not set -# CONFIG_NTFS_FS is not set -# CONFIG_NTFS_RW is not set -# CONFIG_NTP_PPS is not set -# CONFIG_NULL_TTY is not set -# CONFIG_NUMA is not set -# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set -# CONFIG_NVM is not set -# CONFIG_NVMEM is not set -# CONFIG_NVMEM_BCM_OCOTP is not set -# CONFIG_NVMEM_IMX_OCOTP is not set -# CONFIG_NVMEM_NINTENDO_OTP is not set -# CONFIG_NVMEM_REBOOT_MODE is not set -CONFIG_NVMEM_RMEM=y -# CONFIG_NVMEM_SYSFS is not set -# CONFIG_NVME_FC is not set -# CONFIG_NVME_TARGET is not set -# CONFIG_NVME_TCP is not set -# CONFIG_NVRAM is not set -# CONFIG_NV_TCO is not set -# CONFIG_NXP_C45_TJA11XX_PHY is not set -# CONFIG_NXP_STB220 is not set -# CONFIG_NXP_STB225 is not set -# CONFIG_NXP_TJA11XX_PHY is not set -# CONFIG_N_GSM is not set -# CONFIG_OABI_COMPAT is not set -# CONFIG_OBS600 is not set -# CONFIG_OCFS2_FS is not set -# CONFIG_OCTEONTX2_AF is not set -# CONFIG_OCTEONTX2_PF is not set -# CONFIG_OF_MDIO is not set -# CONFIG_OF_OVERLAY is not set -CONFIG_OF_RESERVED_MEM=y -# CONFIG_OF_UNITTEST is not set -# CONFIG_OID_REGISTRY is not set -# CONFIG_OMAP2_DSS_DEBUG is not set -# CONFIG_OMAP2_DSS_DEBUGFS is not set -# CONFIG_OMAP2_DSS_SDI is not set -# CONFIG_OMAP_OCP2SCP is not set -# CONFIG_OMAP_USB2 is not set -# CONFIG_OMFS_FS is not set -# CONFIG_OPENVSWITCH is not set -# CONFIG_OPEN_DICE is not set -# CONFIG_OPROFILE is not set -# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set -# CONFIG_OPT3001 is not set -CONFIG_OPTIMIZE_INLINING=y -# CONFIG_ORANGEFS_FS is not set -# CONFIG_ORION_WATCHDOG is not set -# CONFIG_OSF_PARTITION is not set -CONFIG_OVERLAY_FS=y -# CONFIG_OVERLAY_FS_INDEX is not set -# CONFIG_OVERLAY_FS_METACOPY is not set -CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y -# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set -CONFIG_OVERLAY_FS_XINO_AUTO=y -# CONFIG_OWL_LOADER is not set -# CONFIG_P54_COMMON is not set -# CONFIG_PA12203001 is not set -CONFIG_PACKET=y -# CONFIG_PACKET_DIAG is not set -# CONFIG_PACKING is not set -# CONFIG_PAGE_EXTENSION is not set -# CONFIG_PAGE_OWNER is not set -# CONFIG_PAGE_POISONING is not set -# CONFIG_PAGE_POOL_STATS is not set -# CONFIG_PAGE_REPORTING is not set -# CONFIG_PAGE_SIZE_16KB is not set -# CONFIG_PAGE_SIZE_32KB is not set -CONFIG_PAGE_SIZE_4KB=y -# CONFIG_PAGE_SIZE_64KB is not set -# CONFIG_PAGE_SIZE_8KB is not set -# CONFIG_PAGE_SIZE_LESS_THAN_64KB is not set -# CONFIG_PAGE_TABLE_CHECK is not set -# CONFIG_PALMAS_GPADC is not set -# CONFIG_PANASONIC_LAPTOP is not set -# CONFIG_PANEL is not set -CONFIG_PANIC_ON_OOPS=y -CONFIG_PANIC_ON_OOPS_VALUE=1 -CONFIG_PANIC_TIMEOUT=1 -# CONFIG_PANTHERLORD_FF is not set -# CONFIG_PARAVIRT is not set -# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set -# CONFIG_PARPORT is not set -# CONFIG_PARPORT_1284 is not set -# CONFIG_PARPORT_AX88796 is not set -# CONFIG_PARPORT_GSC is not set -# CONFIG_PARPORT_PC is not set -CONFIG_PARTITION_ADVANCED=y -# CONFIG_PATA_ALI is not set -# CONFIG_PATA_AMD is not set -# CONFIG_PATA_ARASAN_CF is not set -# CONFIG_PATA_ARTOP is not set -# CONFIG_PATA_ATIIXP is not set -# CONFIG_PATA_ATP867X is not set -# CONFIG_PATA_CMD640_PCI is not set -# CONFIG_PATA_CMD64X is not set -# CONFIG_PATA_CS5520 is not set -# CONFIG_PATA_CS5530 is not set -# CONFIG_PATA_CS5535 is not set -# CONFIG_PATA_CS5536 is not set -# CONFIG_PATA_CYPRESS is not set -# CONFIG_PATA_EFAR is not set -# CONFIG_PATA_HPT366 is not set -# CONFIG_PATA_HPT37X is not set -# CONFIG_PATA_HPT3X2N is not set -# CONFIG_PATA_HPT3X3 is not set -# CONFIG_PATA_IMX is not set -# CONFIG_PATA_ISAPNP is not set -# CONFIG_PATA_IT8213 is not set -# CONFIG_PATA_IT821X is not set -# CONFIG_PATA_JMICRON is not set -# CONFIG_PATA_LEGACY is not set -# CONFIG_PATA_MARVELL is not set -# CONFIG_PATA_MPIIX is not set -# CONFIG_PATA_NETCELL is not set -# CONFIG_PATA_NINJA32 is not set -# CONFIG_PATA_NS87410 is not set -# CONFIG_PATA_NS87415 is not set -# CONFIG_PATA_OCTEON_CF is not set -# CONFIG_PATA_OF_PLATFORM is not set -# CONFIG_PATA_OLDPIIX is not set -# CONFIG_PATA_OPTI is not set -# CONFIG_PATA_OPTIDMA is not set -# CONFIG_PATA_PCMCIA is not set -# CONFIG_PATA_PDC2027X is not set -# CONFIG_PATA_PDC_OLD is not set -# CONFIG_PATA_PLATFORM is not set -# CONFIG_PATA_QDI is not set -# CONFIG_PATA_RADISYS is not set -# CONFIG_PATA_RDC is not set -# CONFIG_PATA_RZ1000 is not set -# CONFIG_PATA_SC1200 is not set -# CONFIG_PATA_SCH is not set -# CONFIG_PATA_SERVERWORKS is not set -# CONFIG_PATA_SIL680 is not set -# CONFIG_PATA_SIS is not set -# CONFIG_PATA_TOSHIBA is not set -# CONFIG_PATA_TRIFLEX is not set -# CONFIG_PATA_VIA is not set -# CONFIG_PATA_WINBOND is not set -# CONFIG_PATA_WINBOND_VLB is not set -# CONFIG_PC104 is not set -# CONFIG_PC300TOO is not set -# CONFIG_PCCARD is not set -# CONFIG_PCH_DMA is not set -# CONFIG_PCH_GBE is not set -# CONFIG_PCH_PHUB is not set -# CONFIG_PCI is not set -# CONFIG_PCI200SYN is not set -# CONFIG_PCIEAER is not set -# CONFIG_PCIEAER_INJECT is not set -# CONFIG_PCIEASPM is not set -# CONFIG_PCIEPORTBUS is not set -# CONFIG_PCIE_AL is not set -# CONFIG_PCIE_ALTERA is not set -# CONFIG_PCIE_ARMADA_8K is not set -CONFIG_PCIE_BUS_DEFAULT=y -# CONFIG_PCIE_BUS_PEER2PEER is not set -# CONFIG_PCIE_BUS_PERFORMANCE is not set -# CONFIG_PCIE_BUS_SAFE is not set -# CONFIG_PCIE_BUS_TUNE_OFF is not set -# CONFIG_PCIE_BW is not set -# CONFIG_PCIE_CADENCE_HOST is not set -# CONFIG_PCIE_CADENCE_PLAT_HOST is not set -# CONFIG_PCIE_DPC is not set -# CONFIG_PCIE_DW is not set -# CONFIG_PCIE_DW_HOST is not set -# CONFIG_PCIE_DW_PLAT is not set -# CONFIG_PCIE_DW_PLAT_HOST is not set -# CONFIG_PCIE_ECRC is not set -# CONFIG_PCIE_IPROC is not set -# CONFIG_PCIE_KIRIN is not set -# CONFIG_PCIE_LAYERSCAPE_GEN4 is not set -# CONFIG_PCIE_MICROCHIP_HOST is not set -# CONFIG_PCIE_PTM is not set -# CONFIG_PCIE_ROCKCHIP_DW_HOST is not set -# CONFIG_PCIE_XILINX is not set -# CONFIG_PCIPCWATCHDOG is not set -# CONFIG_PCI_ATMEL is not set -# CONFIG_PCI_CNB20LE_QUIRK is not set -# CONFIG_PCI_DEBUG is not set -# CONFIG_PCI_DISABLE_COMMON_QUIRKS is not set -# CONFIG_PCI_ENDPOINT is not set -# CONFIG_PCI_ENDPOINT_TEST is not set -# CONFIG_PCI_FTPCI100 is not set -# CONFIG_PCI_HERMES is not set -# CONFIG_PCI_HISI is not set -# CONFIG_PCI_HOST_GENERIC is not set -# CONFIG_PCI_HOST_THUNDER_ECAM is not set -# CONFIG_PCI_HOST_THUNDER_PEM is not set -# CONFIG_PCI_IOV is not set -# CONFIG_PCI_J721E_HOST is not set -# CONFIG_PCI_LAYERSCAPE is not set -# CONFIG_PCI_MESON is not set -# CONFIG_PCI_MSI is not set -# CONFIG_PCI_PASID is not set -# CONFIG_PCI_PF_STUB is not set -# CONFIG_PCI_PRI is not set -CONFIG_PCI_QUIRKS=y -# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set -# CONFIG_PCI_STUB is not set -# CONFIG_PCI_SW_SWITCHTEC is not set -CONFIG_PCI_SYSCALL=y -# CONFIG_PCI_V3_SEMI is not set -# CONFIG_PCI_XGENE is not set -# CONFIG_PCMCIA is not set -# CONFIG_PCMCIA_3C574 is not set -# CONFIG_PCMCIA_3C589 is not set -# CONFIG_PCMCIA_AHA152X is not set -# CONFIG_PCMCIA_ATMEL is not set -# CONFIG_PCMCIA_AXNET is not set -# CONFIG_PCMCIA_DEBUG is not set -# CONFIG_PCMCIA_FDOMAIN is not set -# CONFIG_PCMCIA_FMVJ18X is not set -# CONFIG_PCMCIA_HERMES is not set -# CONFIG_PCMCIA_LOAD_CIS is not set -# CONFIG_PCMCIA_NINJA_SCSI is not set -# CONFIG_PCMCIA_NMCLAN is not set -# CONFIG_PCMCIA_PCNET is not set -# CONFIG_PCMCIA_QLOGIC is not set -# CONFIG_PCMCIA_RAYCS is not set -# CONFIG_PCMCIA_SMC91C92 is not set -# CONFIG_PCMCIA_SPECTRUM is not set -# CONFIG_PCMCIA_SYM53C500 is not set -# CONFIG_PCMCIA_WL3501 is not set -# CONFIG_PCMCIA_XIRC2PS is not set -# CONFIG_PCMCIA_XIRCOM is not set -# CONFIG_PCNET32 is not set -CONFIG_PCPU_DEV_REFCNT=y -# CONFIG_PCSPKR_PLATFORM is not set -# CONFIG_PCS_XPCS is not set -# CONFIG_PD6729 is not set -# CONFIG_PDA_POWER is not set -# CONFIG_PDC_ADMA is not set -# CONFIG_PECI is not set -# CONFIG_PERCPU_STATS is not set -# CONFIG_PERCPU_TEST is not set -# CONFIG_PERF_EVENTS is not set -# CONFIG_PERF_EVENTS_AMD_POWER is not set -# CONFIG_PERSISTENT_KEYRINGS is not set -# CONFIG_PHANTOM is not set -# CONFIG_PHONET is not set -# CONFIG_PHYLIB is not set -# CONFIG_PHYS_ADDR_T_64BIT is not set -# CONFIG_PHY_CADENCE_DP is not set -# CONFIG_PHY_CADENCE_DPHY is not set -# CONFIG_PHY_CADENCE_DPHY_RX is not set -# CONFIG_PHY_CADENCE_SALVO is not set -# CONFIG_PHY_CADENCE_SIERRA is not set -# CONFIG_PHY_CADENCE_TORRENT is not set -# CONFIG_PHY_CAN_TRANSCEIVER is not set -# CONFIG_PHY_CPCAP_USB is not set -# CONFIG_PHY_EXYNOS_DP_VIDEO is not set -# CONFIG_PHY_EXYNOS_MIPI_VIDEO is not set -# CONFIG_PHY_FSL_IMX8MQ_USB is not set -# CONFIG_PHY_FSL_IMX8M_PCIE is not set -# CONFIG_PHY_INTEL_KEEMBAY_EMMC is not set -# CONFIG_PHY_LAN966X_SERDES is not set -# CONFIG_PHY_MAPPHONE_MDM6600 is not set -# CONFIG_PHY_MIXEL_MIPI_DPHY is not set -# CONFIG_PHY_MTK_HDMI is not set -# CONFIG_PHY_MVEBU_CP110_UTMI is not set -# CONFIG_PHY_OCELOT_SERDES is not set -# CONFIG_PHY_PXA_28NM_HSIC is not set -# CONFIG_PHY_PXA_28NM_USB2 is not set -# CONFIG_PHY_QCOM_DWC3 is not set -# CONFIG_PHY_QCOM_USB_HS is not set -# CONFIG_PHY_QCOM_USB_HSIC is not set -# CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY is not set -# CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY is not set -# CONFIG_PHY_ROCKCHIP_INNO_USB2 is not set -# CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY is not set -# CONFIG_PHY_SAMSUNG_USB2 is not set -# CONFIG_PHY_TUSB1210 is not set -# CONFIG_PHY_XGENE is not set -# CONFIG_PI433 is not set -# CONFIG_PID_IN_CONTEXTIDR is not set -# CONFIG_PID_NS is not set -CONFIG_PINCONF=y -# CONFIG_PINCTRL is not set -# CONFIG_PINCTRL_AMD is not set -# CONFIG_PINCTRL_AXP209 is not set -# CONFIG_PINCTRL_CEDARFORK is not set -# CONFIG_PINCTRL_EXYNOS is not set -# CONFIG_PINCTRL_EXYNOS5440 is not set -# CONFIG_PINCTRL_ICELAKE is not set -# CONFIG_PINCTRL_INGENIC is not set -# CONFIG_PINCTRL_MCP23S08 is not set -CONFIG_PINCTRL_MICROCHIP_SGPIO=y -# CONFIG_PINCTRL_MSM8X74 is not set -# CONFIG_PINCTRL_MT6779 is not set -# CONFIG_PINCTRL_MT8167 is not set -# CONFIG_PINCTRL_MT8192 is not set -# CONFIG_PINCTRL_MTK_V2 is not set -# CONFIG_PINCTRL_OCELOT is not set -# CONFIG_PINCTRL_ROCKCHIP is not set -CONFIG_PINCTRL_SINGLE=y -# CONFIG_PINCTRL_STMFX is not set -# CONFIG_PINCTRL_SX150X is not set -# CONFIG_PING is not set -CONFIG_PINMUX=y -# CONFIG_PKCS7_MESSAGE_PARSER is not set -# CONFIG_PL310_ERRATA_588369 is not set -# CONFIG_PL310_ERRATA_727915 is not set -# CONFIG_PL310_ERRATA_753970 is not set -# CONFIG_PL310_ERRATA_769419 is not set -# CONFIG_PL320_MBOX is not set -# CONFIG_PL330_DMA is not set -# CONFIG_PLATFORM_MHU is not set -# CONFIG_PLAT_SPEAR is not set -# CONFIG_PLIP is not set -# CONFIG_PLX_DMA is not set -# CONFIG_PLX_HERMES is not set -# CONFIG_PM is not set -# CONFIG_PMBUS is not set -# CONFIG_PMC_MSP is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_PMS7003 is not set -# CONFIG_PM_AUTOSLEEP is not set -# CONFIG_PM_DEBUG is not set -# CONFIG_PM_DEVFREQ is not set -# CONFIG_PM_WAKELOCKS is not set -# CONFIG_POSIX_CPU_TIMERS_TASK_WORK is not set -# CONFIG_POSIX_MQUEUE is not set -CONFIG_POSIX_TIMERS=y -# CONFIG_POWERCAP is not set -# CONFIG_POWER_AVS is not set -# CONFIG_POWER_RESET is not set -# CONFIG_POWER_RESET_BRCMKONA is not set -# CONFIG_POWER_RESET_BRCMSTB is not set -# CONFIG_POWER_RESET_GPIO is not set -# CONFIG_POWER_RESET_GPIO_RESTART is not set -# CONFIG_POWER_RESET_LINKSTATION is not set -# CONFIG_POWER_RESET_LTC2952 is not set -# CONFIG_POWER_RESET_PIIX4_POWEROFF is not set -# CONFIG_POWER_RESET_REGULATOR is not set -# CONFIG_POWER_RESET_RESTART is not set -# CONFIG_POWER_RESET_SYSCON is not set -# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set -# CONFIG_POWER_RESET_VERSATILE is not set -# CONFIG_POWER_RESET_XGENE is not set -# CONFIG_POWER_SUPPLY is not set -# CONFIG_POWER_SUPPLY_DEBUG is not set -# CONFIG_POWER_SUPPLY_HWMON is not set -# CONFIG_PPC4xx_GPIO is not set -# CONFIG_PPC_16K_PAGES is not set -# CONFIG_PPC_256K_PAGES is not set -CONFIG_PPC_4K_PAGES=y -# CONFIG_PPC_64K_PAGES is not set -# CONFIG_PPC_DISABLE_WERROR is not set -# CONFIG_PPC_EMULATED_STATS is not set -# CONFIG_PPC_EPAPR_HV_BYTECHAN is not set -# CONFIG_PPP is not set -# CONFIG_PPPOATM is not set -# CONFIG_PPPOE is not set -# CONFIG_PPPOL2TP is not set -# CONFIG_PPP_ASYNC is not set -# CONFIG_PPP_BSDCOMP is not set -# CONFIG_PPP_DEFLATE is not set -CONFIG_PPP_FILTER=y -# CONFIG_PPP_MPPE is not set -CONFIG_PPP_MULTILINK=y -# CONFIG_PPP_SYNC_TTY is not set -# CONFIG_PPS is not set -# CONFIG_PPS_CLIENT_GPIO is not set -# CONFIG_PPS_CLIENT_KTIMER is not set -# CONFIG_PPS_CLIENT_LDISC is not set -# CONFIG_PPS_CLIENT_PARPORT is not set -# CONFIG_PPS_DEBUG is not set -# CONFIG_PPTP is not set -# CONFIG_PREEMPT is not set -# CONFIG_PREEMPTIRQ_DELAY_TEST is not set -# CONFIG_PREEMPTIRQ_EVENTS is not set -# CONFIG_PREEMPT_BUILD is not set -# CONFIG_PREEMPT_DYNAMIC is not set -CONFIG_PREEMPT_NONE=y -# CONFIG_PREEMPT_NONE_BUILD is not set -# CONFIG_PREEMPT_TRACER is not set -# CONFIG_PREEMPT_VOLUNTARY is not set -# CONFIG_PRESTERA is not set -CONFIG_PREVENT_FIRMWARE_BUILD=y -# CONFIG_PRIME_NUMBERS is not set -CONFIG_PRINTK=y -# CONFIG_PRINTK_CALLER is not set -# CONFIG_PRINTK_INDEX is not set -CONFIG_PRINTK_NMI=y -CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 -# CONFIG_PRINTK_TIME is not set -CONFIG_PRINT_STACK_DEPTH=64 -# CONFIG_PRISM2_USB is not set -# CONFIG_PRISM54 is not set -# CONFIG_PROC_CHILDREN is not set -CONFIG_PROC_FS=y -# CONFIG_PROC_KCORE is not set -# CONFIG_PROC_PAGE_MONITOR is not set -# CONFIG_PROC_STRIPPED is not set -CONFIG_PROC_SYSCTL=y -# CONFIG_PROC_VMCORE_DEVICE_DUMP is not set -# CONFIG_PROFILE_ALL_BRANCHES is not set -# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set -# CONFIG_PROFILING is not set -# CONFIG_PROVE_LOCKING is not set -# CONFIG_PROVE_RAW_LOCK_NESTING is not set -# CONFIG_PROVE_RCU is not set -# CONFIG_PROVE_RCU_LIST is not set -# CONFIG_PROVE_RCU_REPEATEDLY is not set -# CONFIG_PSAMPLE is not set -# CONFIG_PSB6970_PHY is not set -# CONFIG_PSI is not set -# CONFIG_PSTORE is not set -# CONFIG_PTDUMP_DEBUGFS is not set -# CONFIG_PTP_1588_CLOCK is not set -# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set -# CONFIG_PTP_1588_CLOCK_IDTCM is not set -# CONFIG_PTP_1588_CLOCK_IXP46X is not set -# CONFIG_PTP_1588_CLOCK_KVM is not set -# CONFIG_PTP_1588_CLOCK_OCP is not set -# CONFIG_PTP_1588_CLOCK_OPTIONAL is not set -# CONFIG_PTP_1588_CLOCK_PCH is not set -# CONFIG_PTP_1588_CLOCK_VMW is not set -# CONFIG_PUBLIC_KEY_ALGO_RSA is not set -# CONFIG_PVPANIC is not set -# CONFIG_PWM is not set -# CONFIG_PWM_ATMEL_TCB is not set -# CONFIG_PWM_DEBUG is not set -# CONFIG_PWM_DWC is not set -# CONFIG_PWM_FSL_FTM is not set -# CONFIG_PWM_PCA9685 is not set -# CONFIG_PWM_ROCKCHIP is not set -CONFIG_PWRSEQ_EMMC=y -# CONFIG_PWRSEQ_SD8787 is not set -CONFIG_PWRSEQ_SIMPLE=y -# CONFIG_QCA7000 is not set -# CONFIG_QCA7000_SPI is not set -# CONFIG_QCA7000_UART is not set -# CONFIG_QCOM_EMAC is not set -# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set -# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set -# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set -# CONFIG_QCOM_HIDMA is not set -# CONFIG_QCOM_HIDMA_MGMT is not set -# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set -# CONFIG_QCOM_SCM is not set -# CONFIG_QCOM_SPMI_ADC5 is not set -# CONFIG_QCOM_SPMI_IADC is not set -# CONFIG_QCOM_SPMI_TEMP_ALARM is not set -# CONFIG_QCOM_SPMI_VADC is not set -# CONFIG_QED is not set -# CONFIG_QLA3XXX is not set -# CONFIG_QLCNIC is not set -# CONFIG_QLGE is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX6FS_FS is not set -# CONFIG_QORIQ_CPUFREQ is not set -# CONFIG_QORIQ_THERMAL is not set -# CONFIG_QRTR is not set -# CONFIG_QSEMI_PHY is not set -# CONFIG_QUEUED_LOCK_STAT is not set -# CONFIG_QUICC_ENGINE is not set -# CONFIG_QUOTA is not set -# CONFIG_QUOTACTL is not set -# CONFIG_QUOTA_DEBUG is not set -# CONFIG_R3964 is not set -# CONFIG_R6040 is not set -# CONFIG_R8169 is not set -# CONFIG_R8188EU is not set -# CONFIG_R8712U is not set -# CONFIG_R8723AU is not set -# CONFIG_RADIO_ADAPTERS is not set -# CONFIG_RADIO_AZTECH is not set -# CONFIG_RADIO_CADET is not set -# CONFIG_RADIO_GEMTEK is not set -# CONFIG_RADIO_MAXIRADIO is not set -# CONFIG_RADIO_RTRACK is not set -# CONFIG_RADIO_RTRACK2 is not set -# CONFIG_RADIO_SF16FMI is not set -# CONFIG_RADIO_SF16FMR2 is not set -# CONFIG_RADIO_TERRATEC is not set -# CONFIG_RADIO_TRUST is not set -# CONFIG_RADIO_TYPHOON is not set -# CONFIG_RADIO_ZOLTRIX is not set -# CONFIG_RAID6_PQ_BENCHMARK is not set -# CONFIG_RAID_ATTRS is not set -# CONFIG_RALINK is not set -# CONFIG_RANDOM32_SELFTEST is not set -# CONFIG_RANDOMIZE_BASE is not set -# CONFIG_RANDOMIZE_KSTACK_OFFSET is not set -# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set -# CONFIG_RANDOM_TRUST_CPU is not set -# CONFIG_RAPIDIO is not set -# CONFIG_RAS is not set -# CONFIG_RAW_DRIVER is not set -# CONFIG_RBTREE_TEST is not set -# CONFIG_RCU_BOOST is not set -CONFIG_RCU_CPU_STALL_TIMEOUT=21 -# CONFIG_RCU_EQS_DEBUG is not set -# CONFIG_RCU_EXPEDITE_BOOT is not set -# CONFIG_RCU_EXPERT is not set -CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=20 -CONFIG_RCU_KTHREAD_PRIO=0 -CONFIG_RCU_NEED_SEGCBLIST=y -# CONFIG_RCU_PERF_TEST is not set -# CONFIG_RCU_REF_SCALE_TEST is not set -# CONFIG_RCU_SCALE_TEST is not set -CONFIG_RCU_STALL_COMMON=y -# CONFIG_RCU_STRICT_GRACE_PERIOD is not set -# CONFIG_RCU_TORTURE_TEST is not set -CONFIG_RCU_TORTURE_TEST_SLOW_INIT_DELAY=3 -# CONFIG_RCU_TRACE is not set -# CONFIG_RC_ATI_REMOTE is not set -# CONFIG_RC_CORE is not set -# CONFIG_RC_DECODERS is not set -# CONFIG_RC_LOOPBACK is not set -# CONFIG_RC_MAP is not set -# CONFIG_RDS is not set -# CONFIG_RD_BZIP2 is not set -# CONFIG_RD_GZIP is not set -# CONFIG_RD_LZ4 is not set -# CONFIG_RD_LZMA is not set -# CONFIG_RD_LZO is not set -# CONFIG_RD_XZ is not set -# CONFIG_RD_ZSTD is not set -# CONFIG_READABLE_ASM is not set -# CONFIG_READ_ONLY_THP_FOR_FS is not set -# CONFIG_REALTEK_PHY is not set -# CONFIG_REDWOOD is not set -# CONFIG_REED_SOLOMON_TEST is not set -# CONFIG_REGMAP is not set -# CONFIG_REGMAP_I2C is not set -# CONFIG_REGMAP_MMIO is not set -# CONFIG_REGMAP_SPI is not set -# CONFIG_REGULATOR is not set -# CONFIG_REGULATOR_88PG86X is not set -# CONFIG_REGULATOR_ACT8865 is not set -# CONFIG_REGULATOR_AD5398 is not set -# CONFIG_REGULATOR_ANATOP is not set -# CONFIG_REGULATOR_DA9121 is not set -# CONFIG_REGULATOR_DA9210 is not set -# CONFIG_REGULATOR_DA9211 is not set -# CONFIG_REGULATOR_DEBUG is not set -# CONFIG_REGULATOR_FAN53555 is not set -# CONFIG_REGULATOR_FAN53880 is not set -# CONFIG_REGULATOR_FIXED_VOLTAGE is not set -# CONFIG_REGULATOR_GPIO is not set -# CONFIG_REGULATOR_ISL6271A is not set -# CONFIG_REGULATOR_ISL9305 is not set -# CONFIG_REGULATOR_LP3971 is not set -# CONFIG_REGULATOR_LP3972 is not set -# CONFIG_REGULATOR_LP872X is not set -# CONFIG_REGULATOR_LP8755 is not set -# CONFIG_REGULATOR_LTC3589 is not set -# CONFIG_REGULATOR_LTC3676 is not set -# CONFIG_REGULATOR_MAX1586 is not set -# CONFIG_REGULATOR_MAX20086 is not set -# CONFIG_REGULATOR_MAX77620 is not set -# CONFIG_REGULATOR_MAX77826 is not set -# CONFIG_REGULATOR_MAX8649 is not set -# CONFIG_REGULATOR_MAX8660 is not set -# CONFIG_REGULATOR_MAX8893 is not set -# CONFIG_REGULATOR_MAX8952 is not set -# CONFIG_REGULATOR_MAX8973 is not set -# CONFIG_REGULATOR_MCP16502 is not set -# CONFIG_REGULATOR_MP5416 is not set -# CONFIG_REGULATOR_MP8859 is not set -# CONFIG_REGULATOR_MP886X is not set -# CONFIG_REGULATOR_MPQ7920 is not set -# CONFIG_REGULATOR_MT6311 is not set -# CONFIG_REGULATOR_PCA9450 is not set -# CONFIG_REGULATOR_PF8X00 is not set -# CONFIG_REGULATOR_PFUZE100 is not set -# CONFIG_REGULATOR_PV88060 is not set -# CONFIG_REGULATOR_PV88080 is not set -# CONFIG_REGULATOR_PV88090 is not set -# CONFIG_REGULATOR_PWM is not set -# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set -# CONFIG_REGULATOR_RT4801 is not set -# CONFIG_REGULATOR_RT6160 is not set -# CONFIG_REGULATOR_RT6245 is not set -# CONFIG_REGULATOR_RTMV20 is not set -# CONFIG_REGULATOR_RTQ2134 is not set -# CONFIG_REGULATOR_RTQ6752 is not set -# CONFIG_REGULATOR_SLG51000 is not set -# CONFIG_REGULATOR_SY8106A is not set -# CONFIG_REGULATOR_SY8824X is not set -# CONFIG_REGULATOR_SY8827N is not set -# CONFIG_REGULATOR_TI_ABB is not set -# CONFIG_REGULATOR_TPS51632 is not set -# CONFIG_REGULATOR_TPS62360 is not set -# CONFIG_REGULATOR_TPS65023 is not set -# CONFIG_REGULATOR_TPS6507X is not set -# CONFIG_REGULATOR_TPS65132 is not set -# CONFIG_REGULATOR_TPS6524X is not set -# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set -# CONFIG_REGULATOR_VCTRL is not set -# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -# CONFIG_REISERFS_CHECK is not set -# CONFIG_REISERFS_FS is not set -# CONFIG_REISERFS_FS_POSIX_ACL is not set -# CONFIG_REISERFS_FS_SECURITY is not set -CONFIG_REISERFS_FS_XATTR=y -# CONFIG_REISERFS_PROC_INFO is not set -# CONFIG_RELAY is not set -# CONFIG_RELOCATABLE is not set -# CONFIG_REMOTEPROC is not set -# CONFIG_RENESAS_PHY is not set -# CONFIG_RESET_ATH79 is not set -# CONFIG_RESET_BERLIN is not set -# CONFIG_RESET_BRCMSTB_RESCAL is not set -# CONFIG_RESET_CONTROLLER is not set -# CONFIG_RESET_IMX7 is not set -# CONFIG_RESET_INTEL_GW is not set -# CONFIG_RESET_LANTIQ is not set -# CONFIG_RESET_LPC18XX is not set -# CONFIG_RESET_MCHP_SPARX5 is not set -# CONFIG_RESET_MESON is not set -# CONFIG_RESET_PISTACHIO is not set -# CONFIG_RESET_SOCFPGA is not set -# CONFIG_RESET_STM32 is not set -# CONFIG_RESET_SUNXI is not set -# CONFIG_RESET_TEGRA_BPMP is not set -# CONFIG_RESET_TI_SYSCON is not set -# CONFIG_RESET_ZYNQ is not set -# CONFIG_RFD77402 is not set -# CONFIG_RFD_FTL is not set -CONFIG_RFKILL=y -# CONFIG_RFKILL_FULL is not set -# CONFIG_RFKILL_GPIO is not set -# CONFIG_RFKILL_INPUT is not set -# CONFIG_RFKILL_LEDS is not set -# CONFIG_RFKILL_REGULATOR is not set -# CONFIG_RING_BUFFER_BENCHMARK is not set -# CONFIG_RING_BUFFER_STARTUP_TEST is not set -# CONFIG_RMI4_CORE is not set -# CONFIG_RMNET is not set -# CONFIG_ROCKCHIP_DW_HDMI is not set -# CONFIG_ROCKCHIP_IODOMAIN is not set -# CONFIG_ROCKCHIP_IOMMU is not set -# CONFIG_ROCKCHIP_MBOX is not set -# CONFIG_ROCKCHIP_PHY is not set -# CONFIG_ROCKCHIP_PM_DOMAINS is not set -# CONFIG_ROCKCHIP_SARADC is not set -# CONFIG_ROCKCHIP_THERMAL is not set -# CONFIG_ROCKCHIP_VOP2 is not set -# CONFIG_ROCKER is not set -# CONFIG_RODATA_FULL_DEFAULT_ENABLED is not set -# CONFIG_ROMFS_FS is not set -# CONFIG_ROSE is not set -# CONFIG_RPCSEC_GSS_KRB5 is not set -# CONFIG_RPMSG_QCOM_GLINK_RPM is not set -# CONFIG_RPMSG_VIRTIO is not set -# CONFIG_RPR0521 is not set -# CONFIG_RSEQ is not set -# CONFIG_RT2X00 is not set -# CONFIG_RTC_CLASS is not set -# CONFIG_RTC_DEBUG is not set -# CONFIG_RTC_DRV_ABB5ZES3 is not set -# CONFIG_RTC_DRV_ABEOZ9 is not set -# CONFIG_RTC_DRV_ABX80X is not set -# CONFIG_RTC_DRV_ARMADA38X is not set -# CONFIG_RTC_DRV_AU1XXX is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_BQ4802 is not set -# CONFIG_RTC_DRV_CADENCE is not set -CONFIG_RTC_DRV_CMOS=y -# CONFIG_RTC_DRV_DS1286 is not set -# CONFIG_RTC_DRV_DS1302 is not set -# CONFIG_RTC_DRV_DS1305 is not set -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1307_CENTURY is not set -# CONFIG_RTC_DRV_DS1307_HWMON is not set -# CONFIG_RTC_DRV_DS1343 is not set -# CONFIG_RTC_DRV_DS1347 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1390 is not set -# CONFIG_RTC_DRV_DS1511 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_DS1685_FAMILY is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_DS2404 is not set -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_DS3234 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_EP93XX is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_FTRTC010 is not set -# CONFIG_RTC_DRV_GENERIC is not set -# CONFIG_RTC_DRV_GOLDFISH is not set -# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set -# CONFIG_RTC_DRV_HYM8563 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_ISL12026 is not set -# CONFIG_RTC_DRV_ISL12057 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_JZ4740 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_M41T93 is not set -# CONFIG_RTC_DRV_M41T94 is not set -# CONFIG_RTC_DRV_M48T35 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_MAX6902 is not set -# CONFIG_RTC_DRV_MAX6916 is not set -# CONFIG_RTC_DRV_MCP795 is not set -# CONFIG_RTC_DRV_MOXART is not set -# CONFIG_RTC_DRV_MPC5121 is not set -# CONFIG_RTC_DRV_MSM6242 is not set -# CONFIG_RTC_DRV_MT2712 is not set -# CONFIG_RTC_DRV_OMAP is not set -# CONFIG_RTC_DRV_PCF2123 is not set -# CONFIG_RTC_DRV_PCF2127 is not set -# CONFIG_RTC_DRV_PCF85063 is not set -# CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85363 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_PL030 is not set -# CONFIG_RTC_DRV_PL031 is not set -# CONFIG_RTC_DRV_PS3 is not set -# CONFIG_RTC_DRV_PT7C4338 is not set -# CONFIG_RTC_DRV_R7301 is not set -# CONFIG_RTC_DRV_R9701 is not set -# CONFIG_RTC_DRV_RK808 is not set -# CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_RS5C348 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_RTC7301 is not set -# CONFIG_RTC_DRV_RV3028 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set -# CONFIG_RTC_DRV_RV3032 is not set -# CONFIG_RTC_DRV_RV8803 is not set -# CONFIG_RTC_DRV_RX4581 is not set -# CONFIG_RTC_DRV_RX6110 is not set -# CONFIG_RTC_DRV_RX8010 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_SD3078 is not set -# CONFIG_RTC_DRV_SNVS is not set -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_SUN6I is not set -# CONFIG_RTC_DRV_TEST is not set -# CONFIG_RTC_DRV_V3020 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_XGENE is not set -# CONFIG_RTC_DRV_ZYNQMP is not set -CONFIG_RTC_HCTOSYS=y -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -CONFIG_RTC_INTF_DEV=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -CONFIG_RTC_INTF_PROC=y -CONFIG_RTC_INTF_SYSFS=y -CONFIG_RTC_LIB=y -# CONFIG_RTC_NVMEM is not set -CONFIG_RTC_SYSTOHC=y -CONFIG_RTC_SYSTOHC_DEVICE="rtc0" -# CONFIG_RTL8180 is not set -# CONFIG_RTL8187 is not set -# CONFIG_RTL8192E is not set -# CONFIG_RTL8192U is not set -# CONFIG_RTL8306_PHY is not set -# CONFIG_RTL8366RB_PHY is not set -# CONFIG_RTL8366S_PHY is not set -# CONFIG_RTL8366_SMI is not set -# CONFIG_RTL8366_SMI_DEBUG_FS is not set -# CONFIG_RTL8367B_PHY is not set -# CONFIG_RTL8367_PHY is not set -# CONFIG_RTLLIB is not set -# CONFIG_RTL_CARDS is not set -# CONFIG_RTS5208 is not set -CONFIG_RT_MUTEXES=y -# CONFIG_RUNTIME_DEBUG is not set -CONFIG_RUNTIME_TESTING_MENU=y -CONFIG_RWSEM_GENERIC_SPINLOCK=y -CONFIG_RXKAD=y -# CONFIG_S2IO is not set -# CONFIG_SAMPLES is not set -# CONFIG_SAMSUNG_LAPTOP is not set -# CONFIG_SATA_ACARD_AHCI is not set -# CONFIG_SATA_AHCI is not set -# CONFIG_SATA_AHCI_PLATFORM is not set -# CONFIG_SATA_DWC is not set -# CONFIG_SATA_FSL is not set -# CONFIG_SATA_HIGHBANK is not set -# CONFIG_SATA_HOST is not set -# CONFIG_SATA_INIC162X is not set -CONFIG_SATA_MOBILE_LPM_POLICY=0 -# CONFIG_SATA_MV is not set -# CONFIG_SATA_NV is not set -# CONFIG_SATA_PMP is not set -# CONFIG_SATA_PROMISE is not set -# CONFIG_SATA_QSTOR is not set -# CONFIG_SATA_RCAR is not set -# CONFIG_SATA_SIL is not set -# CONFIG_SATA_SIL24 is not set -# CONFIG_SATA_SIS is not set -# CONFIG_SATA_SVW is not set -# CONFIG_SATA_SX4 is not set -# CONFIG_SATA_ULI is not set -# CONFIG_SATA_VIA is not set -# CONFIG_SATA_VITESSE is not set -# CONFIG_SBC_FITPC2_WATCHDOG is not set -CONFIG_SBITMAP=y -# CONFIG_SC92031 is not set -# CONFIG_SCA3000 is not set -# CONFIG_SCA3300 is not set -# CONFIG_SCACHE_DEBUGFS is not set -# CONFIG_SCC is not set -# CONFIG_SCD30_CORE is not set -# CONFIG_SCF_TORTURE_TEST is not set -# CONFIG_SCHEDSTATS is not set -# CONFIG_SCHED_AUTOGROUP is not set -# CONFIG_SCHED_CLUSTER is not set -# CONFIG_SCHED_DEBUG is not set -CONFIG_SCHED_HRTICK=y -# CONFIG_SCHED_MC is not set -CONFIG_SCHED_OMIT_FRAME_POINTER=y -# CONFIG_SCHED_SMT is not set -# CONFIG_SCHED_STACK_END_CHECK is not set -# CONFIG_SCHED_TRACER is not set -# CONFIG_SCR24X is not set -# CONFIG_SCSI is not set -# CONFIG_SCSI_3W_9XXX is not set -# CONFIG_SCSI_3W_SAS is not set -# CONFIG_SCSI_7000FASST is not set -# CONFIG_SCSI_AACRAID is not set -# CONFIG_SCSI_ACARD is not set -# CONFIG_SCSI_ADVANSYS is not set -# CONFIG_SCSI_AHA152X is not set -# CONFIG_SCSI_AHA1542 is not set -# CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_AIC7XXX is not set -# CONFIG_SCSI_AIC94XX is not set -# CONFIG_SCSI_AM53C974 is not set -# CONFIG_SCSI_ARCMSR is not set -# CONFIG_SCSI_BFA_FC is not set -# CONFIG_SCSI_BNX2X_FCOE is not set -# CONFIG_SCSI_BNX2_ISCSI is not set -# CONFIG_SCSI_BUSLOGIC is not set -# CONFIG_SCSI_CHELSIO_FCOE is not set -# CONFIG_SCSI_COMMON is not set -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_CXGB3_ISCSI is not set -# CONFIG_SCSI_CXGB4_ISCSI is not set -# CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_DEBUG is not set -# CONFIG_SCSI_DH is not set -CONFIG_SCSI_DMA=y -# CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_DPT_I2O is not set -# CONFIG_SCSI_DTC3280 is not set -# CONFIG_SCSI_EATA is not set -# CONFIG_SCSI_ESAS2R is not set -# CONFIG_SCSI_FC_ATTRS is not set -# CONFIG_SCSI_FDOMAIN_PCI is not set -# CONFIG_SCSI_FUTURE_DOMAIN is not set -# CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_GENERIC_NCR5380 is not set -# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set -# CONFIG_SCSI_HISI_SAS is not set -# CONFIG_SCSI_HPSA is not set -# CONFIG_SCSI_HPTIOP is not set -# CONFIG_SCSI_IN2000 is not set -# CONFIG_SCSI_INIA100 is not set -# CONFIG_SCSI_INITIO is not set -# CONFIG_SCSI_IPR is not set -# CONFIG_SCSI_IPS is not set -# CONFIG_SCSI_ISCI is not set -# CONFIG_SCSI_ISCSI_ATTRS is not set -# CONFIG_SCSI_LOGGING is not set -CONFIG_SCSI_LOWLEVEL=y -# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set -# CONFIG_SCSI_LPFC is not set -CONFIG_SCSI_MOD=y -# CONFIG_SCSI_MPI3MR is not set -# CONFIG_SCSI_MPT2SAS is not set -# CONFIG_SCSI_MPT3SAS is not set -# CONFIG_SCSI_MQ_DEFAULT is not set -# CONFIG_SCSI_MVSAS is not set -# CONFIG_SCSI_MVSAS_DEBUG is not set -# CONFIG_SCSI_MVUMI is not set -# CONFIG_SCSI_MYRB is not set -# CONFIG_SCSI_MYRS is not set -# CONFIG_SCSI_NCR53C406A is not set -# CONFIG_SCSI_NETLINK is not set -# CONFIG_SCSI_NSP32 is not set -# CONFIG_SCSI_OSD_INITIATOR is not set -# CONFIG_SCSI_PAS16 is not set -# CONFIG_SCSI_PM8001 is not set -# CONFIG_SCSI_PMCRAID is not set -CONFIG_SCSI_PROC_FS=y -# CONFIG_SCSI_QLA_FC is not set -# CONFIG_SCSI_QLA_ISCSI is not set -# CONFIG_SCSI_QLOGIC_1280 is not set -# CONFIG_SCSI_QLOGIC_FAS is not set -# CONFIG_SCSI_SAS_ATTRS is not set -# CONFIG_SCSI_SAS_LIBSAS is not set -# CONFIG_SCSI_SCAN_ASYNC is not set -# CONFIG_SCSI_SMARTPQI is not set -# CONFIG_SCSI_SNIC is not set -# CONFIG_SCSI_SPI_ATTRS is not set -# CONFIG_SCSI_SRP_ATTRS is not set -# CONFIG_SCSI_STEX is not set -# CONFIG_SCSI_SYM53C416 is not set -# CONFIG_SCSI_SYM53C8XX_2 is not set -# CONFIG_SCSI_T128 is not set -# CONFIG_SCSI_U14_34F is not set -# CONFIG_SCSI_UFSHCD is not set -# CONFIG_SCSI_UFS_HWMON is not set -# CONFIG_SCSI_ULTRASTOR is not set -# CONFIG_SCSI_VIRTIO is not set -# CONFIG_SCSI_WD719X is not set -# CONFIG_SCx200_ACB is not set -# CONFIG_SDIO_UART is not set -# CONFIG_SDR_MAX2175 is not set -# CONFIG_SDR_PLATFORM_DRIVERS is not set -# CONFIG_SD_ADC_MODULATOR is not set -# CONFIG_SECCOMP is not set -# CONFIG_SECCOMP_CACHE_DEBUG is not set -CONFIG_SECTION_MISMATCH_WARN_ONLY=y -# CONFIG_SECURITY is not set -# CONFIG_SECURITYFS is not set -# CONFIG_SECURITY_APPARMOR is not set -CONFIG_SECURITY_DMESG_RESTRICT=y -# CONFIG_SECURITY_LOADPIN is not set -# CONFIG_SECURITY_LOCKDOWN_LSM is not set -# CONFIG_SECURITY_NETWORK_XFRM is not set -# CONFIG_SECURITY_PATH is not set -# CONFIG_SECURITY_SAFESETID is not set -# CONFIG_SECURITY_SELINUX_AVC_STATS is not set -# CONFIG_SECURITY_SELINUX_BOOTPARAM is not set -CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=0 -# CONFIG_SECURITY_SELINUX_DEVELOP is not set -# CONFIG_SECURITY_SELINUX_DISABLE is not set -# CONFIG_SECURITY_SMACK is not set -# CONFIG_SECURITY_TOMOYO is not set -# CONFIG_SECURITY_YAMA is not set -CONFIG_SELECT_MEMORY_MODEL=y -# CONFIG_SENSIRION_SGP30 is not set -# CONFIG_SENSORS_ABITUGURU is not set -# CONFIG_SENSORS_ABITUGURU3 is not set -# CONFIG_SENSORS_ACPI_POWER is not set -# CONFIG_SENSORS_AD7314 is not set -# CONFIG_SENSORS_AD7414 is not set -# CONFIG_SENSORS_AD7418 is not set -# CONFIG_SENSORS_ADC128D818 is not set -# CONFIG_SENSORS_ADCXX is not set -# CONFIG_SENSORS_ADM1021 is not set -# CONFIG_SENSORS_ADM1025 is not set -# CONFIG_SENSORS_ADM1026 is not set -# CONFIG_SENSORS_ADM1029 is not set -# CONFIG_SENSORS_ADM1031 is not set -# CONFIG_SENSORS_ADM1177 is not set -# CONFIG_SENSORS_ADM1266 is not set -# CONFIG_SENSORS_ADM1275 is not set -# CONFIG_SENSORS_ADM9240 is not set -# CONFIG_SENSORS_ADS1015 is not set -# CONFIG_SENSORS_ADS7828 is not set -# CONFIG_SENSORS_ADS7871 is not set -# CONFIG_SENSORS_ADT7310 is not set -# CONFIG_SENSORS_ADT7410 is not set -# CONFIG_SENSORS_ADT7411 is not set -# CONFIG_SENSORS_ADT7462 is not set -# CONFIG_SENSORS_ADT7470 is not set -# CONFIG_SENSORS_ADT7475 is not set -# CONFIG_SENSORS_AHT10 is not set -# CONFIG_SENSORS_AMC6821 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_SENSORS_APPLESMC is not set -# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set -# CONFIG_SENSORS_AS370 is not set -# CONFIG_SENSORS_ASB100 is not set -# CONFIG_SENSORS_ASC7621 is not set -# CONFIG_SENSORS_ASPEED is not set -# CONFIG_SENSORS_ATK0110 is not set -# CONFIG_SENSORS_ATXP1 is not set -# CONFIG_SENSORS_AXI_FAN_CONTROL is not set -# CONFIG_SENSORS_BEL_PFE is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_BH1780 is not set -# CONFIG_SENSORS_BPA_RS600 is not set -# CONFIG_SENSORS_CORETEMP is not set -# CONFIG_SENSORS_CORSAIR_CPRO is not set -# CONFIG_SENSORS_CORSAIR_PSU is not set -# CONFIG_SENSORS_DELL_SMM is not set -# CONFIG_SENSORS_DME1737 is not set -# CONFIG_SENSORS_DPS920AB is not set -# CONFIG_SENSORS_DRIVETEMP is not set -# CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_DS620 is not set -# CONFIG_SENSORS_EMC1403 is not set -# CONFIG_SENSORS_EMC2103 is not set -# CONFIG_SENSORS_EMC6W201 is not set -# CONFIG_SENSORS_F71805F is not set -# CONFIG_SENSORS_F71882FG is not set -# CONFIG_SENSORS_F75375S is not set -# CONFIG_SENSORS_FAM15H_POWER is not set -# CONFIG_SENSORS_FSCHMD is not set -# CONFIG_SENSORS_FSP_3Y is not set -# CONFIG_SENSORS_FTSTEUTATES is not set -# CONFIG_SENSORS_G760A is not set -# CONFIG_SENSORS_G762 is not set -# CONFIG_SENSORS_GL518SM is not set -# CONFIG_SENSORS_GL520SM is not set -# CONFIG_SENSORS_GPIO_FAN is not set -# CONFIG_SENSORS_GSC is not set -# CONFIG_SENSORS_HDAPS is not set -# CONFIG_SENSORS_HIH6130 is not set -# CONFIG_SENSORS_HMC5843 is not set -# CONFIG_SENSORS_HMC5843_I2C is not set -# CONFIG_SENSORS_HMC5843_SPI is not set -# CONFIG_SENSORS_HTU21 is not set -# CONFIG_SENSORS_I5500 is not set -# CONFIG_SENSORS_I5K_AMB is not set -# CONFIG_SENSORS_IBM_CFFPS is not set -# CONFIG_SENSORS_IIO_HWMON is not set -# CONFIG_SENSORS_INA209 is not set -# CONFIG_SENSORS_INA238 is not set -# CONFIG_SENSORS_INA2XX is not set -# CONFIG_SENSORS_INA3221 is not set -# CONFIG_SENSORS_INSPUR_IPSPS is not set -# CONFIG_SENSORS_IR35221 is not set -# CONFIG_SENSORS_IR36021 is not set -# CONFIG_SENSORS_IR38064 is not set -# CONFIG_SENSORS_IRPS5401 is not set -# CONFIG_SENSORS_ISL29018 is not set -# CONFIG_SENSORS_ISL29028 is not set -# CONFIG_SENSORS_ISL68137 is not set -# CONFIG_SENSORS_IT87 is not set -# CONFIG_SENSORS_JC42 is not set -# CONFIG_SENSORS_K10TEMP is not set -# CONFIG_SENSORS_K8TEMP is not set -# CONFIG_SENSORS_LINEAGE is not set -# CONFIG_SENSORS_LIS3LV02D is not set -# CONFIG_SENSORS_LIS3_I2C is not set -# CONFIG_SENSORS_LIS3_SPI is not set -# CONFIG_SENSORS_LM25066 is not set -# CONFIG_SENSORS_LM63 is not set -# CONFIG_SENSORS_LM70 is not set -# CONFIG_SENSORS_LM73 is not set -# CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM77 is not set -# CONFIG_SENSORS_LM78 is not set -# CONFIG_SENSORS_LM80 is not set -# CONFIG_SENSORS_LM83 is not set -# CONFIG_SENSORS_LM85 is not set -# CONFIG_SENSORS_LM87 is not set -# CONFIG_SENSORS_LM90 is not set -# CONFIG_SENSORS_LM92 is not set -# CONFIG_SENSORS_LM93 is not set -# CONFIG_SENSORS_LM95234 is not set -# CONFIG_SENSORS_LM95241 is not set -# CONFIG_SENSORS_LM95245 is not set -# CONFIG_SENSORS_LTC2945 is not set -# CONFIG_SENSORS_LTC2947_I2C is not set -# CONFIG_SENSORS_LTC2947_SPI is not set -# CONFIG_SENSORS_LTC2978 is not set -# CONFIG_SENSORS_LTC2990 is not set -# CONFIG_SENSORS_LTC2992 is not set -# CONFIG_SENSORS_LTC3815 is not set -# CONFIG_SENSORS_LTC4151 is not set -# CONFIG_SENSORS_LTC4215 is not set -# CONFIG_SENSORS_LTC4222 is not set -# CONFIG_SENSORS_LTC4245 is not set -# CONFIG_SENSORS_LTC4260 is not set -# CONFIG_SENSORS_LTC4261 is not set -# CONFIG_SENSORS_LTQ_CPUTEMP is not set -# CONFIG_SENSORS_MAX1111 is not set -# CONFIG_SENSORS_MAX127 is not set -# CONFIG_SENSORS_MAX15301 is not set -# CONFIG_SENSORS_MAX16064 is not set -# CONFIG_SENSORS_MAX16065 is not set -# CONFIG_SENSORS_MAX1619 is not set -# CONFIG_SENSORS_MAX16601 is not set -# CONFIG_SENSORS_MAX1668 is not set -# CONFIG_SENSORS_MAX197 is not set -# CONFIG_SENSORS_MAX20730 is not set -# CONFIG_SENSORS_MAX20751 is not set -# CONFIG_SENSORS_MAX31722 is not set -# CONFIG_SENSORS_MAX31730 is not set -# CONFIG_SENSORS_MAX31785 is not set -# CONFIG_SENSORS_MAX31790 is not set -# CONFIG_SENSORS_MAX34440 is not set -# CONFIG_SENSORS_MAX6620 is not set -# CONFIG_SENSORS_MAX6621 is not set -# CONFIG_SENSORS_MAX6639 is not set -# CONFIG_SENSORS_MAX6642 is not set -# CONFIG_SENSORS_MAX6650 is not set -# CONFIG_SENSORS_MAX6697 is not set -# CONFIG_SENSORS_MAX8688 is not set -# CONFIG_SENSORS_MCP3021 is not set -# CONFIG_SENSORS_MP2888 is not set -# CONFIG_SENSORS_MP2975 is not set -# CONFIG_SENSORS_MR75203 is not set -# CONFIG_SENSORS_NCT6683 is not set -# CONFIG_SENSORS_NCT6775 is not set -# CONFIG_SENSORS_NCT7802 is not set -# CONFIG_SENSORS_NCT7904 is not set -# CONFIG_SENSORS_NPCM7XX is not set -# CONFIG_SENSORS_NSA320 is not set -# CONFIG_SENSORS_NTC_THERMISTOR is not set -# CONFIG_SENSORS_NZXT_KRAKEN2 is not set -# CONFIG_SENSORS_NZXT_SMART2 is not set -# CONFIG_SENSORS_OCC_P8_I2C is not set -# CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_PC87427 is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_SENSORS_PIM4328 is not set -# CONFIG_SENSORS_PM6764TR is not set -# CONFIG_SENSORS_PMBUS is not set -# CONFIG_SENSORS_POWR1220 is not set -# CONFIG_SENSORS_PWM_FAN is not set -# CONFIG_SENSORS_PXE1610 is not set -# CONFIG_SENSORS_Q54SJ108A2 is not set -# CONFIG_SENSORS_RM3100_I2C is not set -# CONFIG_SENSORS_RM3100_SPI is not set -# CONFIG_SENSORS_SBRMI is not set -# CONFIG_SENSORS_SBTSI is not set -# CONFIG_SENSORS_SCH5627 is not set -# CONFIG_SENSORS_SCH5636 is not set -# CONFIG_SENSORS_SCH56XX_COMMON is not set -# CONFIG_SENSORS_SHT15 is not set -# CONFIG_SENSORS_SHT21 is not set -# CONFIG_SENSORS_SHT3x is not set -# CONFIG_SENSORS_SHT4x is not set -# CONFIG_SENSORS_SHTC1 is not set -# CONFIG_SENSORS_SIS5595 is not set -# CONFIG_SENSORS_SMM665 is not set -# CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_SMSC47M192 is not set -# CONFIG_SENSORS_STPDDC60 is not set -# CONFIG_SENSORS_STTS751 is not set -# CONFIG_SENSORS_TC654 is not set -# CONFIG_SENSORS_TC74 is not set -# CONFIG_SENSORS_THMC50 is not set -# CONFIG_SENSORS_TMP102 is not set -# CONFIG_SENSORS_TMP103 is not set -# CONFIG_SENSORS_TMP108 is not set -# CONFIG_SENSORS_TMP401 is not set -# CONFIG_SENSORS_TMP421 is not set -# CONFIG_SENSORS_TMP513 is not set -# CONFIG_SENSORS_TPS23861 is not set -# CONFIG_SENSORS_TPS40422 is not set -# CONFIG_SENSORS_TPS53679 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_TSL2563 is not set -# CONFIG_SENSORS_UCD9000 is not set -# CONFIG_SENSORS_UCD9200 is not set -# CONFIG_SENSORS_VEXPRESS is not set -# CONFIG_SENSORS_VIA686A is not set -# CONFIG_SENSORS_VIA_CPUTEMP is not set -# CONFIG_SENSORS_VT1211 is not set -# CONFIG_SENSORS_VT8231 is not set -# CONFIG_SENSORS_W83627EHF is not set -# CONFIG_SENSORS_W83627HF is not set -# CONFIG_SENSORS_W83773G is not set -# CONFIG_SENSORS_W83781D is not set -# CONFIG_SENSORS_W83791D is not set -# CONFIG_SENSORS_W83792D is not set -# CONFIG_SENSORS_W83793 is not set -# CONFIG_SENSORS_W83795 is not set -# CONFIG_SENSORS_W83L785TS is not set -# CONFIG_SENSORS_W83L786NG is not set -# CONFIG_SENSORS_XDPE122 is not set -# CONFIG_SENSORS_XGENE is not set -# CONFIG_SENSORS_ZL6100 is not set -CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_16550A_VARIANTS=y -# CONFIG_SERIAL_8250_ACCENT is not set -# CONFIG_SERIAL_8250_ASPEED_VUART is not set -# CONFIG_SERIAL_8250_BOCA is not set -CONFIG_SERIAL_8250_CONSOLE=y -# CONFIG_SERIAL_8250_CS is not set -# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set -# CONFIG_SERIAL_8250_DETECT_IRQ is not set -CONFIG_SERIAL_8250_DMA=y -# CONFIG_SERIAL_8250_DW is not set -# CONFIG_SERIAL_8250_EM is not set -# CONFIG_SERIAL_8250_EXAR is not set -# CONFIG_SERIAL_8250_EXAR_ST16C554 is not set -# CONFIG_SERIAL_8250_EXTENDED is not set -# CONFIG_SERIAL_8250_FINTEK is not set -# CONFIG_SERIAL_8250_FOURPORT is not set -# CONFIG_SERIAL_8250_HUB6 is not set -# CONFIG_SERIAL_8250_INGENIC is not set -# CONFIG_SERIAL_8250_LPSS is not set -# CONFIG_SERIAL_8250_MANY_PORTS is not set -# CONFIG_SERIAL_8250_MID is not set -# CONFIG_SERIAL_8250_MOXA is not set -CONFIG_SERIAL_8250_NR_UARTS=2 -# CONFIG_SERIAL_8250_PCI is not set -# CONFIG_SERIAL_8250_PERICOM is not set -# CONFIG_SERIAL_8250_RSA is not set -# CONFIG_SERIAL_8250_RT288X is not set -CONFIG_SERIAL_8250_RUNTIME_UARTS=2 -# CONFIG_SERIAL_ALTERA_JTAGUART is not set -# CONFIG_SERIAL_ALTERA_UART is not set -# CONFIG_SERIAL_AMBA_PL010 is not set -# CONFIG_SERIAL_AMBA_PL011 is not set -# CONFIG_SERIAL_ARC is not set -# CONFIG_SERIAL_BCM63XX is not set -# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -# CONFIG_SERIAL_DEV_BUS is not set -CONFIG_SERIAL_EARLYCON=y -# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set -# CONFIG_SERIAL_FSL_LINFLEXUART is not set -# CONFIG_SERIAL_FSL_LPUART is not set -# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set -# CONFIG_SERIAL_IFX6X60 is not set -# CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_MAX3100 is not set -# CONFIG_SERIAL_MAX310X is not set -# CONFIG_SERIAL_NONSTANDARD is not set -# CONFIG_SERIAL_OF_PLATFORM is not set -# CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set -# CONFIG_SERIAL_PCH_UART is not set -# CONFIG_SERIAL_RP2 is not set -# CONFIG_SERIAL_SC16IS7XX is not set -# CONFIG_SERIAL_SCCNXP is not set -# CONFIG_SERIAL_SH_SCI is not set -# CONFIG_SERIAL_SIFIVE is not set -# CONFIG_SERIAL_SPRD is not set -# CONFIG_SERIAL_STM32 is not set -# CONFIG_SERIAL_ST_ASC is not set -# CONFIG_SERIAL_TIMBERDALE is not set -# CONFIG_SERIAL_UARTLITE is not set -# CONFIG_SERIAL_XILINX_PS_UART is not set -# CONFIG_SERIO is not set -# CONFIG_SERIO_ALTERA_PS2 is not set -# CONFIG_SERIO_AMBAKMI is not set -# CONFIG_SERIO_APBPS2 is not set -# CONFIG_SERIO_ARC_PS2 is not set -# CONFIG_SERIO_CT82C710 is not set -# CONFIG_SERIO_GPIO_PS2 is not set -# CONFIG_SERIO_I8042 is not set -# CONFIG_SERIO_LIBPS2 is not set -# CONFIG_SERIO_PARKBD is not set -# CONFIG_SERIO_PCIPS2 is not set -# CONFIG_SERIO_PS2MULT is not set -# CONFIG_SERIO_RAW is not set -# CONFIG_SERIO_SERPORT is not set -# CONFIG_SERIO_SUN4I_PS2 is not set -# CONFIG_SFC is not set -# CONFIG_SFC_FALCON is not set -# CONFIG_SFI is not set -# CONFIG_SFP is not set -# CONFIG_SF_PDMA is not set -# CONFIG_SGETMASK_SYSCALL is not set -# CONFIG_SGI_IOC4 is not set -# CONFIG_SGI_IP22 is not set -# CONFIG_SGI_IP27 is not set -# CONFIG_SGI_IP28 is not set -# CONFIG_SGI_IP30 is not set -# CONFIG_SGI_IP32 is not set -# CONFIG_SGI_MFD_IOC3 is not set -# CONFIG_SGI_PARTITION is not set -# CONFIG_SG_POOL is not set -# CONFIG_SG_SPLIT is not set -CONFIG_SHMEM=y -# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set -# CONFIG_SH_ETH is not set -# CONFIG_SH_TIMER_CMT is not set -# CONFIG_SH_TIMER_MTU2 is not set -# CONFIG_SH_TIMER_TMU is not set -# CONFIG_SI1133 is not set -# CONFIG_SI1145 is not set -# CONFIG_SI7005 is not set -# CONFIG_SI7020 is not set -# CONFIG_SIBYTE_BIGSUR is not set -# CONFIG_SIBYTE_CARMEL is not set -# CONFIG_SIBYTE_CRHINE is not set -# CONFIG_SIBYTE_CRHONE is not set -# CONFIG_SIBYTE_LITTLESUR is not set -# CONFIG_SIBYTE_RHONE is not set -# CONFIG_SIBYTE_SENTOSA is not set -# CONFIG_SIBYTE_SWARM is not set -CONFIG_SIGNALFD=y -# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set -# CONFIG_SIMPLE_GPIO is not set -# CONFIG_SIMPLE_PM_BUS is not set -# CONFIG_SIOX is not set -# CONFIG_SIS190 is not set -# CONFIG_SIS900 is not set -# CONFIG_SKGE is not set -# CONFIG_SKY2 is not set -# CONFIG_SKY2_DEBUG is not set -# CONFIG_SLAB is not set -CONFIG_SLABINFO=y -# CONFIG_SLAB_FREELIST_HARDENED is not set -# CONFIG_SLAB_FREELIST_RANDOM is not set -CONFIG_SLAB_MERGE_DEFAULT=y -# CONFIG_SLHC is not set -# CONFIG_SLICOSS is not set -# CONFIG_SLIMBUS is not set -# CONFIG_SLIP is not set -# CONFIG_SLOB is not set -CONFIG_SLUB=y -CONFIG_SLUB_CPU_PARTIAL=y -# CONFIG_SLUB_DEBUG is not set -# CONFIG_SLUB_DEBUG_ON is not set -# CONFIG_SLUB_MEMCG_SYSFS_ON is not set -# CONFIG_SLUB_STATS is not set -# CONFIG_SMARTJOYPLUS_FF is not set -# CONFIG_SMB_SERVER is not set -# CONFIG_SMC911X is not set -# CONFIG_SMC9194 is not set -# CONFIG_SMC91X is not set -# CONFIG_SMP is not set -# CONFIG_SMSC911X is not set -# CONFIG_SMSC9420 is not set -# CONFIG_SMSC_PHY is not set -# CONFIG_SMS_SDIO_DRV is not set -# CONFIG_SMS_USB_DRV is not set -# CONFIG_SM_FTL is not set -# CONFIG_SND is not set -# CONFIG_SND_AC97_POWER_SAVE is not set -# CONFIG_SND_AD1816A is not set -# CONFIG_SND_AD1848 is not set -# CONFIG_SND_AD1889 is not set -# CONFIG_SND_ADLIB is not set -# CONFIG_SND_ALI5451 is not set -# CONFIG_SND_ALOOP is not set -# CONFIG_SND_ALS100 is not set -# CONFIG_SND_ALS300 is not set -# CONFIG_SND_ALS4000 is not set -# CONFIG_SND_ARM is not set -# CONFIG_SND_ASIHPI is not set -# CONFIG_SND_ATIIXP is not set -# CONFIG_SND_ATIIXP_MODEM is not set -# CONFIG_SND_ATMEL_AC97C is not set -# CONFIG_SND_ATMEL_SOC is not set -# CONFIG_SND_AU8810 is not set -# CONFIG_SND_AU8820 is not set -# CONFIG_SND_AU8830 is not set -# CONFIG_SND_AUDIO_GRAPH_CARD is not set -# CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set -# CONFIG_SND_AW2 is not set -# CONFIG_SND_AZT2320 is not set -# CONFIG_SND_AZT3328 is not set -# CONFIG_SND_BCD2000 is not set -# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set -# CONFIG_SND_BT87X is not set -# CONFIG_SND_CA0106 is not set -# CONFIG_SND_CMI8330 is not set -# CONFIG_SND_CMIPCI is not set -# CONFIG_SND_CS4231 is not set -# CONFIG_SND_CS4236 is not set -# CONFIG_SND_CS4281 is not set -# CONFIG_SND_CS46XX is not set -# CONFIG_SND_CS5530 is not set -# CONFIG_SND_CS5535AUDIO is not set -# CONFIG_SND_CTXFI is not set -# CONFIG_SND_DARLA20 is not set -# CONFIG_SND_DARLA24 is not set -# CONFIG_SND_DEBUG is not set -# CONFIG_SND_DESIGNWARE_I2S is not set -CONFIG_SND_DRIVERS=y -# CONFIG_SND_DUMMY is not set -# CONFIG_SND_DYNAMIC_MINORS is not set -# CONFIG_SND_ECHO3G is not set -# CONFIG_SND_EDMA_SOC is not set -# CONFIG_SND_EMU10K1 is not set -# CONFIG_SND_EMU10K1X is not set -# CONFIG_SND_EMU10K1_SEQ is not set -# CONFIG_SND_ENS1370 is not set -# CONFIG_SND_ENS1371 is not set -# CONFIG_SND_ES1688 is not set -# CONFIG_SND_ES18XX is not set -# CONFIG_SND_ES1938 is not set -# CONFIG_SND_ES1968 is not set -# CONFIG_SND_FIREWIRE is not set -# CONFIG_SND_FM801 is not set -# CONFIG_SND_GINA20 is not set -# CONFIG_SND_GINA24 is not set -# CONFIG_SND_GUSCLASSIC is not set -# CONFIG_SND_GUSEXTREME is not set -# CONFIG_SND_GUSMAX is not set -# CONFIG_SND_HDA_INTEL is not set -# CONFIG_SND_HDA_INTEL_DETECT_DMIC is not set -# CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM is not set -CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 -CONFIG_SND_HDA_PREALLOC_SIZE=64 -# CONFIG_SND_HDSP is not set -# CONFIG_SND_HDSPM is not set -# CONFIG_SND_HRTIMER is not set -# CONFIG_SND_HWDEP is not set -# CONFIG_SND_I2S_HI6210_I2S is not set -# CONFIG_SND_ICE1712 is not set -# CONFIG_SND_ICE1724 is not set -# CONFIG_SND_INDIGO is not set -# CONFIG_SND_INDIGODJ is not set -# CONFIG_SND_INDIGODJX is not set -# CONFIG_SND_INDIGOIO is not set -# CONFIG_SND_INDIGOIOX is not set -# CONFIG_SND_INTEL8X0 is not set -# CONFIG_SND_INTEL8X0M is not set -# CONFIG_SND_INTERWAVE is not set -# CONFIG_SND_INTERWAVE_STB is not set -# CONFIG_SND_ISA is not set -# CONFIG_SND_JZ4740_SOC_I2S is not set -# CONFIG_SND_KIRKWOOD_SOC is not set -# CONFIG_SND_KORG1212 is not set -# CONFIG_SND_LAYLA20 is not set -# CONFIG_SND_LAYLA24 is not set -# CONFIG_SND_LOLA is not set -# CONFIG_SND_LX6464ES is not set -# CONFIG_SND_MAESTRO3 is not set -CONFIG_SND_MAX_CARDS=16 -# CONFIG_SND_MIA is not set -# CONFIG_SND_MIPS is not set -# CONFIG_SND_MIRO is not set -# CONFIG_SND_MIXART is not set -# CONFIG_SND_MIXER_OSS is not set -# CONFIG_SND_MONA is not set -# CONFIG_SND_MPC52xx_SOC_EFIKA is not set -# CONFIG_SND_MPU401 is not set -# CONFIG_SND_MTPAV is not set -# CONFIG_SND_MTS64 is not set -# CONFIG_SND_MXS_SOC is not set -# CONFIG_SND_NM256 is not set -# CONFIG_SND_OPL3SA2 is not set -# CONFIG_SND_OPL3_LIB_SEQ is not set -# CONFIG_SND_OPL4_LIB_SEQ is not set -# CONFIG_SND_OPTI92X_AD1848 is not set -# CONFIG_SND_OPTI92X_CS4231 is not set -# CONFIG_SND_OPTI93X is not set -CONFIG_SND_OSSEMUL=y -# CONFIG_SND_OXYGEN is not set -CONFIG_SND_PCI=y -# CONFIG_SND_PCM is not set -# CONFIG_SND_PCMCIA is not set -# CONFIG_SND_PCM_OSS is not set -CONFIG_SND_PCM_OSS_PLUGINS=y -# CONFIG_SND_PCM_TIMER is not set -# CONFIG_SND_PCM_XRUN_DEBUG is not set -# CONFIG_SND_PCXHR is not set -# CONFIG_SND_PDAUDIOCF is not set -# CONFIG_SND_PORTMAN2X4 is not set -# CONFIG_SND_POWERPC_SOC is not set -# CONFIG_SND_PPC is not set -CONFIG_SND_PROC_FS=y -# CONFIG_SND_RAWMIDI is not set -# CONFIG_SND_RAWMIDI_SEQ is not set -# CONFIG_SND_RIPTIDE is not set -# CONFIG_SND_RME32 is not set -# CONFIG_SND_RME96 is not set -# CONFIG_SND_RME9652 is not set -# CONFIG_SND_RTCTIMER is not set -# CONFIG_SND_SB16 is not set -# CONFIG_SND_SB8 is not set -# CONFIG_SND_SBAWE is not set -# CONFIG_SND_SBAWE_SEQ is not set -# CONFIG_SND_SE6X is not set -# CONFIG_SND_SEQUENCER is not set -# CONFIG_SND_SERIAL_GENERIC is not set -# CONFIG_SND_SERIAL_U16550 is not set -# CONFIG_SND_SIMPLE_CARD is not set -# CONFIG_SND_SIMPLE_SCU_CARD is not set -# CONFIG_SND_SIS7019 is not set -# CONFIG_SND_SOC is not set -# CONFIG_SND_SOC_AC97_CODEC is not set -# CONFIG_SND_SOC_ADAU1372_I2C is not set -# CONFIG_SND_SOC_ADAU1372_SPI is not set -# CONFIG_SND_SOC_ADAU1701 is not set -# CONFIG_SND_SOC_ADAU1761_I2C is not set -# CONFIG_SND_SOC_ADAU1761_SPI is not set -# CONFIG_SND_SOC_ADAU7002 is not set -# CONFIG_SND_SOC_ADAU7118_HW is not set -# CONFIG_SND_SOC_ADAU7118_I2C is not set -# CONFIG_SND_SOC_AK4104 is not set -# CONFIG_SND_SOC_AK4118 is not set -# CONFIG_SND_SOC_AK4458 is not set -# CONFIG_SND_SOC_AK4554 is not set -# CONFIG_SND_SOC_AK4613 is not set -# CONFIG_SND_SOC_AK4642 is not set -# CONFIG_SND_SOC_AK5386 is not set -# CONFIG_SND_SOC_AK5558 is not set -# CONFIG_SND_SOC_ALC5623 is not set -# CONFIG_SND_SOC_AMD_ACP is not set -# CONFIG_SND_SOC_AMD_ACP3x is not set -# CONFIG_SND_SOC_AMD_RENOIR is not set -# CONFIG_SND_SOC_AU1XAUDIO is not set -# CONFIG_SND_SOC_AU1XPSC is not set -# CONFIG_SND_SOC_BD28623 is not set -# CONFIG_SND_SOC_BT_SCO is not set -# CONFIG_SND_SOC_CS35L32 is not set -# CONFIG_SND_SOC_CS35L33 is not set -# CONFIG_SND_SOC_CS35L34 is not set -# CONFIG_SND_SOC_CS35L35 is not set -# CONFIG_SND_SOC_CS35L36 is not set -# CONFIG_SND_SOC_CS4234 is not set -# CONFIG_SND_SOC_CS4265 is not set -# CONFIG_SND_SOC_CS4270 is not set -# CONFIG_SND_SOC_CS4271 is not set -# CONFIG_SND_SOC_CS4271_I2C is not set -# CONFIG_SND_SOC_CS4271_SPI is not set -# CONFIG_SND_SOC_CS42L42 is not set -# CONFIG_SND_SOC_CS42L51_I2C is not set -# CONFIG_SND_SOC_CS42L52 is not set -# CONFIG_SND_SOC_CS42L56 is not set -# CONFIG_SND_SOC_CS42L73 is not set -# CONFIG_SND_SOC_CS42XX8_I2C is not set -# CONFIG_SND_SOC_CS43130 is not set -# CONFIG_SND_SOC_CS4341 is not set -# CONFIG_SND_SOC_CS4349 is not set -# CONFIG_SND_SOC_CS53L30 is not set -# CONFIG_SND_SOC_CX2072X is not set -# CONFIG_SND_SOC_DA7213 is not set -# CONFIG_SND_SOC_DIO2125 is not set -# CONFIG_SND_SOC_DMIC is not set -# CONFIG_SND_SOC_ES7134 is not set -# CONFIG_SND_SOC_ES7241 is not set -# CONFIG_SND_SOC_ES8316 is not set -# CONFIG_SND_SOC_ES8328 is not set -# CONFIG_SND_SOC_ES8328_I2C is not set -# CONFIG_SND_SOC_ES8328_SPI is not set -# CONFIG_SND_SOC_EUKREA_TLV320 is not set -# CONFIG_SND_SOC_FSL_ASOC_CARD is not set -# CONFIG_SND_SOC_FSL_ASRC is not set -# CONFIG_SND_SOC_FSL_AUDMIX is not set -# CONFIG_SND_SOC_FSL_ESAI is not set -# CONFIG_SND_SOC_FSL_MICFIL is not set -# CONFIG_SND_SOC_FSL_SAI is not set -# CONFIG_SND_SOC_FSL_SPDIF is not set -# CONFIG_SND_SOC_FSL_SSI is not set -# CONFIG_SND_SOC_FSL_XCVR is not set -# CONFIG_SND_SOC_GTM601 is not set -# CONFIG_SND_SOC_ICS43432 is not set -# CONFIG_SND_SOC_IMG is not set -# CONFIG_SND_SOC_IMX_AUDMIX is not set -# CONFIG_SND_SOC_IMX_AUDMUX is not set -# CONFIG_SND_SOC_IMX_ES8328 is not set -# CONFIG_SND_SOC_IMX_SPDIF is not set -# CONFIG_SND_SOC_IMX_WM8962 is not set -# CONFIG_SND_SOC_INNO_RK3036 is not set -# CONFIG_SND_SOC_INTEL_APL is not set -# CONFIG_SND_SOC_INTEL_BAYTRAIL is not set -# CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH is not set -# CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH is not set -# CONFIG_SND_SOC_INTEL_BXT_RT298_MACH is not set -# CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH is not set -# CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH is not set -# CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH is not set -# CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH is not set -# CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH is not set -# CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH is not set -# CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH is not set -# CONFIG_SND_SOC_INTEL_CATPT is not set -# CONFIG_SND_SOC_INTEL_CFL is not set -# CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH is not set -# CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH is not set -# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH is not set -# CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH is not set -# CONFIG_SND_SOC_INTEL_CML_H is not set -# CONFIG_SND_SOC_INTEL_CML_LP is not set -# CONFIG_SND_SOC_INTEL_CNL is not set -# CONFIG_SND_SOC_INTEL_GLK is not set -# CONFIG_SND_SOC_INTEL_HASWELL is not set -# CONFIG_SND_SOC_INTEL_KBL is not set -# CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH is not set -# CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH is not set -# CONFIG_SND_SOC_INTEL_KEEMBAY is not set -# CONFIG_SND_SOC_INTEL_SKL is not set -# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH is not set -# CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH is not set -# CONFIG_SND_SOC_INTEL_SKL_RT286_MACH is not set -# CONFIG_SND_SOC_INTEL_SKYLAKE is not set -# CONFIG_SND_SOC_INTEL_SST is not set -CONFIG_SND_SOC_INTEL_SST_TOPLEVEL=y -# CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES is not set -# CONFIG_SND_SOC_JZ4725B_CODEC is not set -# CONFIG_SND_SOC_JZ4740_CODEC is not set -# CONFIG_SND_SOC_JZ4770_CODEC is not set -# CONFIG_SND_SOC_LPASS_RX_MACRO is not set -# CONFIG_SND_SOC_LPASS_TX_MACRO is not set -# CONFIG_SND_SOC_LPASS_VA_MACRO is not set -# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set -# CONFIG_SND_SOC_MA120X0P is not set -# CONFIG_SND_SOC_MAX9759 is not set -# CONFIG_SND_SOC_MAX98088 is not set -# CONFIG_SND_SOC_MAX98357A is not set -# CONFIG_SND_SOC_MAX98373 is not set -# CONFIG_SND_SOC_MAX98373_I2C is not set -# CONFIG_SND_SOC_MAX98390 is not set -# CONFIG_SND_SOC_MAX98504 is not set -# CONFIG_SND_SOC_MAX9860 is not set -# CONFIG_SND_SOC_MAX9867 is not set -# CONFIG_SND_SOC_MAX98927 is not set -# CONFIG_SND_SOC_MEDIATEK is not set -# CONFIG_SND_SOC_MPC5200_AC97 is not set -# CONFIG_SND_SOC_MPC5200_I2S is not set -# CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set -# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set -# CONFIG_SND_SOC_MT2701 is not set -# CONFIG_SND_SOC_MT6351 is not set -# CONFIG_SND_SOC_MT6358 is not set -# CONFIG_SND_SOC_MT6660 is not set -# CONFIG_SND_SOC_MT6797 is not set -# CONFIG_SND_SOC_MT8173 is not set -# CONFIG_SND_SOC_MT8183 is not set -# CONFIG_SND_SOC_MTK_BTCVSD is not set -# CONFIG_SND_SOC_NAU8315 is not set -# CONFIG_SND_SOC_NAU8540 is not set -# CONFIG_SND_SOC_NAU8810 is not set -# CONFIG_SND_SOC_NAU8822 is not set -# CONFIG_SND_SOC_NAU8824 is not set -# CONFIG_SND_SOC_PCM1681 is not set -# CONFIG_SND_SOC_PCM1789_I2C is not set -# CONFIG_SND_SOC_PCM1792A is not set -# CONFIG_SND_SOC_PCM179X_I2C is not set -# CONFIG_SND_SOC_PCM179X_SPI is not set -# CONFIG_SND_SOC_PCM186X_I2C is not set -# CONFIG_SND_SOC_PCM186X_SPI is not set -# CONFIG_SND_SOC_PCM3060_I2C is not set -# CONFIG_SND_SOC_PCM3060_SPI is not set -# CONFIG_SND_SOC_PCM3168A_I2C is not set -# CONFIG_SND_SOC_PCM3168A_SPI is not set -# CONFIG_SND_SOC_PCM512x_I2C is not set -# CONFIG_SND_SOC_PCM512x_SPI is not set -# CONFIG_SND_SOC_QCOM is not set -# CONFIG_SND_SOC_RK3328 is not set -# CONFIG_SND_SOC_RK817 is not set -# CONFIG_SND_SOC_ROCKCHIP_SPDIF is not set -# CONFIG_SND_SOC_RT5616 is not set -# CONFIG_SND_SOC_RT5631 is not set -# CONFIG_SND_SOC_RT5640 is not set -# CONFIG_SND_SOC_RT5659 is not set -# CONFIG_SND_SOC_RT5677_SPI is not set -# CONFIG_SND_SOC_SGTL5000 is not set -# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set -# CONFIG_SND_SOC_SIMPLE_MUX is not set -# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set -# CONFIG_SND_SOC_SOF_TOPLEVEL is not set -# CONFIG_SND_SOC_SPDIF is not set -# CONFIG_SND_SOC_SSM2305 is not set -# CONFIG_SND_SOC_SSM2602_I2C is not set -# CONFIG_SND_SOC_SSM2602_SPI is not set -# CONFIG_SND_SOC_SSM4567 is not set -# CONFIG_SND_SOC_STA32X is not set -# CONFIG_SND_SOC_STA350 is not set -# CONFIG_SND_SOC_STI_SAS is not set -# CONFIG_SND_SOC_TAS2552 is not set -# CONFIG_SND_SOC_TAS2562 is not set -# CONFIG_SND_SOC_TAS2764 is not set -# CONFIG_SND_SOC_TAS2770 is not set -# CONFIG_SND_SOC_TAS5086 is not set -# CONFIG_SND_SOC_TAS571X is not set -# CONFIG_SND_SOC_TAS5720 is not set -# CONFIG_SND_SOC_TAS6424 is not set -# CONFIG_SND_SOC_TDA7419 is not set -# CONFIG_SND_SOC_TFA9879 is not set -# CONFIG_SND_SOC_TFA989X is not set -# CONFIG_SND_SOC_TLV320ADCX140 is not set -# CONFIG_SND_SOC_TLV320AIC23_I2C is not set -# CONFIG_SND_SOC_TLV320AIC23_SPI is not set -# CONFIG_SND_SOC_TLV320AIC31XX is not set -# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set -# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set -# CONFIG_SND_SOC_TLV320AIC3X is not set -# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set -# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set -# CONFIG_SND_SOC_TPA6130A2 is not set -# CONFIG_SND_SOC_TS3A227E is not set -# CONFIG_SND_SOC_TSCS42XX is not set -# CONFIG_SND_SOC_TSCS454 is not set -# CONFIG_SND_SOC_UDA1334 is not set -# CONFIG_SND_SOC_WM8510 is not set -# CONFIG_SND_SOC_WM8523 is not set -# CONFIG_SND_SOC_WM8524 is not set -# CONFIG_SND_SOC_WM8580 is not set -# CONFIG_SND_SOC_WM8711 is not set -# CONFIG_SND_SOC_WM8728 is not set -# CONFIG_SND_SOC_WM8731 is not set -# CONFIG_SND_SOC_WM8737 is not set -# CONFIG_SND_SOC_WM8741 is not set -# CONFIG_SND_SOC_WM8750 is not set -# CONFIG_SND_SOC_WM8753 is not set -# CONFIG_SND_SOC_WM8770 is not set -# CONFIG_SND_SOC_WM8776 is not set -# CONFIG_SND_SOC_WM8782 is not set -# CONFIG_SND_SOC_WM8804_I2C is not set -# CONFIG_SND_SOC_WM8804_SPI is not set -# CONFIG_SND_SOC_WM8903 is not set -# CONFIG_SND_SOC_WM8904 is not set -# CONFIG_SND_SOC_WM8960 is not set -# CONFIG_SND_SOC_WM8962 is not set -# CONFIG_SND_SOC_WM8974 is not set -# CONFIG_SND_SOC_WM8978 is not set -# CONFIG_SND_SOC_WM8985 is not set -# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set -# CONFIG_SND_SOC_XILINX_I2S is not set -# CONFIG_SND_SOC_XILINX_SPDIF is not set -# CONFIG_SND_SOC_XTFPGA_I2S is not set -# CONFIG_SND_SOC_ZL38060 is not set -# CONFIG_SND_SOC_ZX_AUD96P22 is not set -# CONFIG_SND_SONICVIBES is not set -# CONFIG_SND_SPI is not set -# CONFIG_SND_SSCAPE is not set -# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI is not set -# CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI is not set -# CONFIG_SND_SUN4I_CODEC is not set -# CONFIG_SND_SUPPORT_OLD_API is not set -# CONFIG_SND_TIMER is not set -# CONFIG_SND_TRIDENT is not set -CONFIG_SND_USB=y -# CONFIG_SND_USB_6FIRE is not set -# CONFIG_SND_USB_AUDIO is not set -# CONFIG_SND_USB_CAIAQ is not set -# CONFIG_SND_USB_HIFACE is not set -# CONFIG_SND_USB_POD is not set -# CONFIG_SND_USB_PODHD is not set -# CONFIG_SND_USB_TONEPORT is not set -# CONFIG_SND_USB_UA101 is not set -# CONFIG_SND_USB_US122L is not set -# CONFIG_SND_USB_USX2Y is not set -# CONFIG_SND_USB_VARIAX is not set -# CONFIG_SND_VERBOSE_PRINTK is not set -CONFIG_SND_VERBOSE_PROCFS=y -# CONFIG_SND_VIA82XX is not set -# CONFIG_SND_VIA82XX_MODEM is not set -# CONFIG_SND_VIRTUOSO is not set -# CONFIG_SND_VX222 is not set -# CONFIG_SND_VXPOCKET is not set -# CONFIG_SND_WAVEFRONT is not set -CONFIG_SND_X86=y -# CONFIG_SND_XEN_FRONTEND is not set -# CONFIG_SND_YMFPCI is not set -# CONFIG_SNI_RM is not set -# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set -# CONFIG_SOCK_CGROUP_DATA is not set -# CONFIG_SOCK_RX_QUEUE_MAPPING is not set -# CONFIG_SOC_AM33XX is not set -# CONFIG_SOC_AM43XX is not set -# CONFIG_SOC_BRCMSTB is not set -# CONFIG_SOC_CAMERA is not set -# CONFIG_SOC_DRA7XX is not set -# CONFIG_SOC_HAS_OMAP2_SDRC is not set -# CONFIG_SOC_OMAP5 is not set -# CONFIG_SOC_TI is not set -# CONFIG_SOFTLOCKUP_DETECTOR is not set -# CONFIG_SOFT_WATCHDOG is not set -# CONFIG_SOLARIS_X86_PARTITION is not set -# CONFIG_SONYPI is not set -# CONFIG_SONY_LAPTOP is not set -# CONFIG_SOUND is not set -# CONFIG_SOUNDWIRE is not set -# CONFIG_SOUND_OSS_CORE is not set -# CONFIG_SOUND_OSS_CORE_PRECLAIM is not set -# CONFIG_SOUND_PRIME is not set -# CONFIG_SP5100_TCO is not set -# CONFIG_SPARSEMEM_MANUAL is not set -# CONFIG_SPARSEMEM_STATIC is not set -# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set -# CONFIG_SPARSE_IRQ is not set -# CONFIG_SPARSE_RCU_POINTER is not set -# CONFIG_SPEAKUP is not set -# CONFIG_SPI is not set -# CONFIG_SPINLOCK_TEST is not set -# CONFIG_SPI_ALTERA is not set -# CONFIG_SPI_ALTERA_CORE is not set -# CONFIG_SPI_AMD is not set -# CONFIG_SPI_AU1550 is not set -# CONFIG_SPI_AXI_SPI_ENGINE is not set -# CONFIG_SPI_BCM2835 is not set -# CONFIG_SPI_BCM_QSPI is not set -# CONFIG_SPI_BITBANG is not set -# CONFIG_SPI_BUTTERFLY is not set -# CONFIG_SPI_CADENCE is not set -# CONFIG_SPI_CADENCE_QUADSPI is not set -# CONFIG_SPI_CADENCE_XSPI is not set -# CONFIG_SPI_DEBUG is not set -# CONFIG_SPI_DESIGNWARE is not set -# CONFIG_SPI_FSL_DSPI is not set -# CONFIG_SPI_FSL_ESPI is not set -# CONFIG_SPI_FSL_SPI is not set -# CONFIG_SPI_GPIO is not set -# CONFIG_SPI_GPIO_OLD is not set -# CONFIG_SPI_IMG_SPFI is not set -# CONFIG_SPI_LANTIQ_SSC is not set -# CONFIG_SPI_LM70_LLP is not set -# CONFIG_SPI_LOOPBACK_TEST is not set -# CONFIG_SPI_MASTER is not set -# CONFIG_SPI_MEM is not set -# CONFIG_SPI_MPC52xx is not set -# CONFIG_SPI_MPC52xx_PSC is not set -# CONFIG_SPI_MTK_QUADSPI is not set -# CONFIG_SPI_MUX is not set -# CONFIG_SPI_MXIC is not set -# CONFIG_SPI_NXP_FLEXSPI is not set -# CONFIG_SPI_OCTEON is not set -# CONFIG_SPI_OC_TINY is not set -# CONFIG_SPI_ORION is not set -# CONFIG_SPI_PL022 is not set -# CONFIG_SPI_PPC4xx is not set -# CONFIG_SPI_PXA2XX is not set -# CONFIG_SPI_PXA2XX_PCI is not set -# CONFIG_SPI_QCOM_QSPI is not set -# CONFIG_SPI_ROCKCHIP is not set -CONFIG_SPI_ROCKCHIP_SFC=y -# CONFIG_SPI_S3C64XX is not set -# CONFIG_SPI_SC18IS602 is not set -# CONFIG_SPI_SIFIVE is not set -# CONFIG_SPI_SLAVE is not set -# CONFIG_SPI_SPIDEV is not set -# CONFIG_SPI_THUNDERX is not set -# CONFIG_SPI_TI_QSPI is not set -# CONFIG_SPI_TLE62X0 is not set -# CONFIG_SPI_TOPCLIFF_PCH is not set -# CONFIG_SPI_XCOMM is not set -# CONFIG_SPI_XILINX is not set -# CONFIG_SPI_XWAY is not set -# CONFIG_SPI_ZYNQMP_GQSPI is not set -CONFIG_SPLIT_PTLOCK_CPUS=4 -# CONFIG_SPMI is not set -# CONFIG_SPS30 is not set -# CONFIG_SPS30_I2C is not set -CONFIG_SQUASHFS=y -# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set -# CONFIG_SQUASHFS_DECOMP_MULTI is not set -CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y -# CONFIG_SQUASHFS_DECOMP_SINGLE is not set -CONFIG_SQUASHFS_EMBEDDED=y -# CONFIG_SQUASHFS_FILE_CACHE is not set -CONFIG_SQUASHFS_FILE_DIRECT=y -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -# CONFIG_SQUASHFS_LZ4 is not set -# CONFIG_SQUASHFS_LZO is not set -# CONFIG_SQUASHFS_XATTR is not set -CONFIG_SQUASHFS_XZ=y -# CONFIG_SQUASHFS_ZLIB is not set -# CONFIG_SQUASHFS_ZSTD is not set -# CONFIG_SRAM is not set -# CONFIG_SRF04 is not set -# CONFIG_SRF08 is not set -# CONFIG_SSB is not set -# CONFIG_SSB_DEBUG is not set -# CONFIG_SSB_DRIVER_GPIO is not set -# CONFIG_SSB_HOST_SOC is not set -# CONFIG_SSB_PCMCIAHOST is not set -CONFIG_SSB_POSSIBLE=y -# CONFIG_SSB_SDIOHOST is not set -# CONFIG_SSB_SILENT is not set -# CONFIG_SSFDC is not set -# CONFIG_STACKPROTECTOR is not set -# CONFIG_STACKPROTECTOR_PER_TASK is not set -# CONFIG_STACKPROTECTOR_STRONG is not set -# CONFIG_STACKTRACE is not set -# CONFIG_STACKTRACE_BUILD_ID is not set -CONFIG_STACKTRACE_SUPPORT=y -CONFIG_STACK_HASH_ORDER=20 -# CONFIG_STACK_TRACER is not set -# CONFIG_STACK_VALIDATION is not set -CONFIG_STAGING=y -# CONFIG_STAGING_BOARD is not set -# CONFIG_STAGING_GASKET_FRAMEWORK is not set -# CONFIG_STAGING_MEDIA is not set -CONFIG_STANDALONE=y -# CONFIG_STATIC_KEYS_SELFTEST is not set -# CONFIG_STATIC_USERMODEHELPER is not set -CONFIG_STDBINUTILS=y -# CONFIG_STE10XP is not set -# CONFIG_STE_MODEM_RPROC is not set -# CONFIG_STK3310 is not set -# CONFIG_STK8312 is not set -# CONFIG_STK8BA50 is not set -# CONFIG_STM is not set -# CONFIG_STMMAC_ETH is not set -# CONFIG_STMMAC_PCI is not set -# CONFIG_STMMAC_PLATFORM is not set -# CONFIG_STM_DUMMY is not set -# CONFIG_STM_SOURCE_CONSOLE is not set -CONFIG_STP=y -# CONFIG_STREAM_PARSER is not set -# CONFIG_STRICT_DEVMEM is not set -CONFIG_STRICT_KERNEL_RWX=y -CONFIG_STRICT_MODULE_RWX=y -# CONFIG_STRING_SELFTEST is not set -CONFIG_STRIP_ASM_SYMS=y -# CONFIG_STX104 is not set -# CONFIG_ST_UVIS25 is not set -# CONFIG_SUN4I_GPADC is not set -# CONFIG_SUN50I_DE2_BUS is not set -# CONFIG_SUN50I_ERRATUM_UNKNOWN1 is not set -# CONFIG_SUNDANCE is not set -# CONFIG_SUNGEM is not set -# CONFIG_SUNRPC is not set -# CONFIG_SUNRPC_DEBUG is not set -CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES=y -# CONFIG_SUNRPC_GSS is not set -# CONFIG_SUNXI_SRAM is not set -# CONFIG_SUN_PARTITION is not set -# CONFIG_SURFACE_3_BUTTON is not set -# CONFIG_SURFACE_PLATFORMS is not set -# CONFIG_SUSPEND is not set -# CONFIG_SUSPEND_SKIP_SYNC is not set -CONFIG_SWAP=y -# CONFIG_SWCONFIG is not set -# CONFIG_SWCONFIG_B53 is not set -# CONFIG_SWCONFIG_B53_MDIO_DRIVER is not set -# CONFIG_SWCONFIG_B53_MMAP_DRIVER is not set -# CONFIG_SWCONFIG_B53_SPI_DRIVER is not set -# CONFIG_SWCONFIG_B53_SRAB_DRIVER is not set -# CONFIG_SWCONFIG_LEDS is not set -# CONFIG_SW_SYNC is not set -# CONFIG_SX9310 is not set -# CONFIG_SX9500 is not set -# CONFIG_SXGBE_ETH is not set -CONFIG_SYMBOLIC_ERRNAME=y -# CONFIG_SYNCLINK_CS is not set -# CONFIG_SYNC_FILE is not set -# CONFIG_SYNOPSYS_DWC_ETH_QOS is not set -# CONFIG_SYNTH_EVENTS is not set -CONFIG_SYN_COOKIES=y -# CONFIG_SYSCON_REBOOT_MODE is not set -CONFIG_SYSCTL=y -# CONFIG_SYSCTL_SYSCALL is not set -CONFIG_SYSFS=y -# CONFIG_SYSFS_DEPRECATED is not set -# CONFIG_SYSFS_DEPRECATED_V2 is not set -# CONFIG_SYSFS_SYSCALL is not set -# CONFIG_SYSTEMPORT is not set -# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set -# CONFIG_SYSTEM_DATA_VERIFICATION is not set -# CONFIG_SYSTEM_TRUSTED_KEYRING is not set -CONFIG_SYSTEM_TRUSTED_KEYS="" -# CONFIG_SYSV68_PARTITION is not set -CONFIG_SYSVIPC=y -CONFIG_SYSVIPC_SYSCTL=y -# CONFIG_SYSV_FS is not set -# CONFIG_SYS_HYPERVISOR is not set -# CONFIG_T5403 is not set -# CONFIG_TARGET_CORE is not set -# CONFIG_TASKSTATS is not set -# CONFIG_TASKS_RCU is not set -CONFIG_TASKS_TRACE_RCU_READ_MB=y -# CONFIG_TASK_XACCT is not set -# CONFIG_TC35815 is not set -# CONFIG_TCG_ATMEL is not set -# CONFIG_TCG_CRB is not set -# CONFIG_TCG_FTPM_TEE is not set -# CONFIG_TCG_INFINEON is not set -# CONFIG_TCG_NSC is not set -# CONFIG_TCG_ST33_I2C is not set -# CONFIG_TCG_TIS is not set -# CONFIG_TCG_TIS_I2C_ATMEL is not set -# CONFIG_TCG_TIS_I2C_CR50 is not set -# CONFIG_TCG_TIS_I2C_INFINEON is not set -# CONFIG_TCG_TIS_I2C_NUVOTON is not set -# CONFIG_TCG_TIS_SPI is not set -# CONFIG_TCG_TIS_ST33ZP24_I2C is not set -# CONFIG_TCG_TIS_ST33ZP24_SPI is not set -# CONFIG_TCG_TPM is not set -# CONFIG_TCG_VTPM_PROXY is not set -# CONFIG_TCG_XEN is not set -# CONFIG_TCIC is not set -CONFIG_TCP_CONG_ADVANCED=y -# CONFIG_TCP_CONG_BBR is not set -# CONFIG_TCP_CONG_BIC is not set -# CONFIG_TCP_CONG_CDG is not set -CONFIG_TCP_CONG_CUBIC=y -# CONFIG_TCP_CONG_DCTCP is not set -# CONFIG_TCP_CONG_HSTCP is not set -# CONFIG_TCP_CONG_HTCP is not set -# CONFIG_TCP_CONG_HYBLA is not set -# CONFIG_TCP_CONG_ILLINOIS is not set -# CONFIG_TCP_CONG_LP is not set -# CONFIG_TCP_CONG_NV is not set -# CONFIG_TCP_CONG_SCALABLE is not set -# CONFIG_TCP_CONG_VEGAS is not set -# CONFIG_TCP_CONG_VENO is not set -# CONFIG_TCP_CONG_WESTWOOD is not set -# CONFIG_TCP_CONG_YEAH is not set -# CONFIG_TCP_MD5SIG is not set -# CONFIG_TCS3414 is not set -# CONFIG_TCS3472 is not set -# CONFIG_TEE is not set -# CONFIG_TEGRA_AHB is not set -# CONFIG_TEGRA_HOST1X is not set -# CONFIG_TEHUTI is not set -# CONFIG_TERANETICS_PHY is not set -# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set -# CONFIG_TEST_BITFIELD is not set -# CONFIG_TEST_BITMAP is not set -# CONFIG_TEST_BITOPS is not set -# CONFIG_TEST_BLACKHOLE_DEV is not set -# CONFIG_TEST_BPF is not set -# CONFIG_TEST_DIV64 is not set -# CONFIG_TEST_FIRMWARE is not set -# CONFIG_TEST_FREE_PAGES is not set -# CONFIG_TEST_HASH is not set -# CONFIG_TEST_HEXDUMP is not set -# CONFIG_TEST_IDA is not set -# CONFIG_TEST_KMOD is not set -# CONFIG_TEST_KSTRTOX is not set -# CONFIG_TEST_LIST_SORT is not set -# CONFIG_TEST_LKM is not set -# CONFIG_TEST_LOCKUP is not set -# CONFIG_TEST_MEMCAT_P is not set -# CONFIG_TEST_MEMINIT is not set -# CONFIG_TEST_MIN_HEAP is not set -# CONFIG_TEST_OVERFLOW is not set -# CONFIG_TEST_POWER is not set -# CONFIG_TEST_PRINTF is not set -# CONFIG_TEST_REF_TRACKER is not set -# CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_SCANF is not set -# CONFIG_TEST_SIPHASH is not set -# CONFIG_TEST_SORT is not set -# CONFIG_TEST_STACKINIT is not set -# CONFIG_TEST_STATIC_KEYS is not set -# CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_TEST_STRSCPY is not set -# CONFIG_TEST_SYSCTL is not set -# CONFIG_TEST_UDELAY is not set -# CONFIG_TEST_USER_COPY is not set -# CONFIG_TEST_UUID is not set -# CONFIG_TEST_VMALLOC is not set -# CONFIG_TEST_XARRAY is not set -CONFIG_TEXTSEARCH=y -# CONFIG_TEXTSEARCH_BM is not set -# CONFIG_TEXTSEARCH_FSM is not set -# CONFIG_TEXTSEARCH_KMP is not set -# CONFIG_THERMAL is not set -# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set -# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set -# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set -# CONFIG_THERMAL_EMULATION is not set -# CONFIG_THERMAL_GOV_BANG_BANG is not set -# CONFIG_THERMAL_GOV_FAIR_SHARE is not set -# CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set -# CONFIG_THERMAL_GOV_USER_SPACE is not set -# CONFIG_THERMAL_HWMON is not set -# CONFIG_THERMAL_MMIO is not set -# CONFIG_THERMAL_NETLINK is not set -# CONFIG_THERMAL_STATISTICS is not set -# CONFIG_THERMAL_WRITABLE_TRIPS is not set -# CONFIG_THINKPAD_ACPI is not set -CONFIG_THIN_ARCHIVES=y -# CONFIG_THREAD_INFO_IN_TASK is not set -# CONFIG_THRUSTMASTER_FF is not set -# CONFIG_THUMB2_KERNEL is not set -# CONFIG_THUNDERBOLT is not set -# CONFIG_THUNDER_NIC_BGX is not set -# CONFIG_THUNDER_NIC_PF is not set -# CONFIG_THUNDER_NIC_RGX is not set -# CONFIG_THUNDER_NIC_VF is not set -# CONFIG_TICK_CPU_ACCOUNTING is not set -CONFIG_TICK_ONESHOT=y -# CONFIG_TIFM_CORE is not set -# CONFIG_TIGON3 is not set -# CONFIG_TIMB_DMA is not set -CONFIG_TIMERFD=y -# CONFIG_TIMER_STATS is not set -# CONFIG_TIME_NS is not set -# CONFIG_TINYDRM_HX8357D is not set -# CONFIG_TINYDRM_ILI9225 is not set -# CONFIG_TINYDRM_ILI9341 is not set -# CONFIG_TINYDRM_ILI9486 is not set -# CONFIG_TINYDRM_MI0283QT is not set -# CONFIG_TINYDRM_REPAPER is not set -# CONFIG_TINYDRM_ST7586 is not set -# CONFIG_TINYDRM_ST7735R is not set -CONFIG_TINY_RCU=y -# CONFIG_TIPC is not set -# CONFIG_TI_ADC081C is not set -# CONFIG_TI_ADC0832 is not set -# CONFIG_TI_ADC084S021 is not set -# CONFIG_TI_ADC108S102 is not set -# CONFIG_TI_ADC12138 is not set -# CONFIG_TI_ADC128S052 is not set -# CONFIG_TI_ADC161S626 is not set -# CONFIG_TI_ADS1015 is not set -# CONFIG_TI_ADS124S08 is not set -# CONFIG_TI_ADS131E08 is not set -# CONFIG_TI_ADS7950 is not set -# CONFIG_TI_ADS8344 is not set -# CONFIG_TI_ADS8688 is not set -# CONFIG_TI_AM335X_ADC is not set -# CONFIG_TI_CPSW is not set -# CONFIG_TI_CPSW_ALE is not set -# CONFIG_TI_CPSW_PHY_SEL is not set -# CONFIG_TI_CPTS is not set -# CONFIG_TI_DAC082S085 is not set -# CONFIG_TI_DAC5571 is not set -# CONFIG_TI_DAC7311 is not set -# CONFIG_TI_DAC7512 is not set -# CONFIG_TI_DAC7612 is not set -# CONFIG_TI_DAVINCI_CPDMA is not set -# CONFIG_TI_DAVINCI_MDIO is not set -# CONFIG_TI_ST is not set -# CONFIG_TI_SYSCON_RESET is not set -# CONFIG_TI_TLC4541 is not set -# CONFIG_TI_TSC2046 is not set -# CONFIG_TLAN is not set -# CONFIG_TLS is not set -# CONFIG_TMD_HERMES is not set -# CONFIG_TMP006 is not set -# CONFIG_TMP007 is not set -# CONFIG_TMP117 is not set -CONFIG_TMPFS=y -# CONFIG_TMPFS_INODE64 is not set -# CONFIG_TMPFS_POSIX_ACL is not set -CONFIG_TMPFS_XATTR=y -# CONFIG_TOPSTAR_LAPTOP is not set -# CONFIG_TORTURE_TEST is not set -# CONFIG_TOSHIBA_HAPS is not set -# CONFIG_TOUCHSCREEN_88PM860X is not set -# CONFIG_TOUCHSCREEN_AD7877 is not set -# CONFIG_TOUCHSCREEN_AD7879 is not set -# CONFIG_TOUCHSCREEN_AD7879_I2C is not set -# CONFIG_TOUCHSCREEN_AD7879_SPI is not set -# CONFIG_TOUCHSCREEN_ADC is not set -# CONFIG_TOUCHSCREEN_ADS7846 is not set -# CONFIG_TOUCHSCREEN_AR1021_I2C is not set -# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set -# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set -# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set -# CONFIG_TOUCHSCREEN_BU21013 is not set -# CONFIG_TOUCHSCREEN_BU21029 is not set -# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set -# CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 is not set -# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set -# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set -# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set -# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set -# CONFIG_TOUCHSCREEN_CYTTSP4_I2C is not set -# CONFIG_TOUCHSCREEN_CYTTSP4_SPI is not set -# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set -# CONFIG_TOUCHSCREEN_CYTTSP_I2C is not set -# CONFIG_TOUCHSCREEN_CYTTSP_SPI is not set -# CONFIG_TOUCHSCREEN_DA9034 is not set -# CONFIG_TOUCHSCREEN_DA9052 is not set -# CONFIG_TOUCHSCREEN_DYNAPRO is not set -# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set -# CONFIG_TOUCHSCREEN_EETI is not set -# CONFIG_TOUCHSCREEN_EGALAX is not set -# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set -# CONFIG_TOUCHSCREEN_EKTF2127 is not set -# CONFIG_TOUCHSCREEN_ELAN is not set -# CONFIG_TOUCHSCREEN_ELO is not set -# CONFIG_TOUCHSCREEN_EXC3000 is not set -# CONFIG_TOUCHSCREEN_FUJITSU is not set -# CONFIG_TOUCHSCREEN_GOODIX is not set -# CONFIG_TOUCHSCREEN_GUNZE is not set -# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set -# CONFIG_TOUCHSCREEN_HIDEEP is not set -# CONFIG_TOUCHSCREEN_HP600 is not set -# CONFIG_TOUCHSCREEN_HP7XX is not set -# CONFIG_TOUCHSCREEN_HTCPEN is not set -# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set -# CONFIG_TOUCHSCREEN_ILI210X is not set -# CONFIG_TOUCHSCREEN_ILITEK is not set -# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set -# CONFIG_TOUCHSCREEN_INEXIO is not set -# CONFIG_TOUCHSCREEN_IPAQ_MICRO is not set -# CONFIG_TOUCHSCREEN_IPROC is not set -# CONFIG_TOUCHSCREEN_IQS5XX is not set -# CONFIG_TOUCHSCREEN_LPC32XX is not set -# CONFIG_TOUCHSCREEN_MAX11801 is not set -# CONFIG_TOUCHSCREEN_MC13783 is not set -# CONFIG_TOUCHSCREEN_MCS5000 is not set -# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set -# CONFIG_TOUCHSCREEN_MIGOR is not set -# CONFIG_TOUCHSCREEN_MK712 is not set -# CONFIG_TOUCHSCREEN_MMS114 is not set -# CONFIG_TOUCHSCREEN_MSG2638 is not set -# CONFIG_TOUCHSCREEN_MTOUCH is not set -# CONFIG_TOUCHSCREEN_MX25 is not set -# CONFIG_TOUCHSCREEN_MXS_LRADC is not set -# CONFIG_TOUCHSCREEN_PCAP is not set -# CONFIG_TOUCHSCREEN_PENMOUNT is not set -# CONFIG_TOUCHSCREEN_PIXCIR is not set -# CONFIG_TOUCHSCREEN_PROPERTIES is not set -# CONFIG_TOUCHSCREEN_RASPBERRYPI_FW is not set -# CONFIG_TOUCHSCREEN_RM_TS is not set -# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set -# CONFIG_TOUCHSCREEN_RPI_FT5406 is not set -# CONFIG_TOUCHSCREEN_S3C2410 is not set -# CONFIG_TOUCHSCREEN_S6SY761 is not set -# CONFIG_TOUCHSCREEN_SILEAD is not set -# CONFIG_TOUCHSCREEN_SIS_I2C is not set -# CONFIG_TOUCHSCREEN_ST1232 is not set -# CONFIG_TOUCHSCREEN_STMFTS is not set -# CONFIG_TOUCHSCREEN_STMPE is not set -# CONFIG_TOUCHSCREEN_SUN4I is not set -# CONFIG_TOUCHSCREEN_SUR40 is not set -# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set -# CONFIG_TOUCHSCREEN_SX8654 is not set -# CONFIG_TOUCHSCREEN_TI_AM335X_TSC is not set -# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set -# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set -# CONFIG_TOUCHSCREEN_TOUCHWIN is not set -# CONFIG_TOUCHSCREEN_TPS6507X is not set -# CONFIG_TOUCHSCREEN_TS4800 is not set -# CONFIG_TOUCHSCREEN_TSC2004 is not set -# CONFIG_TOUCHSCREEN_TSC2005 is not set -# CONFIG_TOUCHSCREEN_TSC2007 is not set -# CONFIG_TOUCHSCREEN_TSC2007_IIO is not set -# CONFIG_TOUCHSCREEN_TSC200X_CORE is not set -# CONFIG_TOUCHSCREEN_TSC_SERIO is not set -# CONFIG_TOUCHSCREEN_UCB1400 is not set -# CONFIG_TOUCHSCREEN_USB_3M is not set -# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set -# CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set -# CONFIG_TOUCHSCREEN_USB_E2I is not set -# CONFIG_TOUCHSCREEN_USB_EASYTOUCH is not set -# CONFIG_TOUCHSCREEN_USB_EGALAX is not set -# CONFIG_TOUCHSCREEN_USB_ELO is not set -# CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set -# CONFIG_TOUCHSCREEN_USB_ETURBO is not set -# CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set -# CONFIG_TOUCHSCREEN_USB_GOTOP is not set -# CONFIG_TOUCHSCREEN_USB_GUNZE is not set -# CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set -# CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set -# CONFIG_TOUCHSCREEN_USB_ITM is not set -# CONFIG_TOUCHSCREEN_USB_JASTEC is not set -# CONFIG_TOUCHSCREEN_USB_NEXIO is not set -# CONFIG_TOUCHSCREEN_USB_PANJIT is not set -# CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set -# CONFIG_TOUCHSCREEN_W90X900 is not set -# CONFIG_TOUCHSCREEN_WACOM_I2C is not set -# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set -# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set -# CONFIG_TOUCHSCREEN_WM831X is not set -# CONFIG_TOUCHSCREEN_WM9705 is not set -# CONFIG_TOUCHSCREEN_WM9712 is not set -# CONFIG_TOUCHSCREEN_WM9713 is not set -# CONFIG_TOUCHSCREEN_WM97XX is not set -# CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE is not set -# CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE is not set -# CONFIG_TOUCHSCREEN_ZET6223 is not set -# CONFIG_TOUCHSCREEN_ZFORCE is not set -# CONFIG_TOUCHSCREEN_ZINITIX is not set -# CONFIG_TPL0102 is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS65010 is not set -# CONFIG_TPS6507X is not set -# CONFIG_TRACEPOINT_BENCHMARK is not set -# CONFIG_TRACER_SNAPSHOT is not set -# CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set -# CONFIG_TRACE_BRANCH_PROFILING is not set -# CONFIG_TRACE_EVAL_MAP_FILE is not set -# CONFIG_TRACE_EVENT_INJECT is not set -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -# CONFIG_TRACE_SINK is not set -# CONFIG_TRACING_EVENTS_GPIO is not set -CONFIG_TRACING_SUPPORT=y -CONFIG_TRAD_SIGNALS=y -# CONFIG_TRANSPARENT_HUGEPAGE is not set -# CONFIG_TRANS_TABLE is not set -# CONFIG_TREE_RCU is not set -# CONFIG_TREE_RCU_TRACE is not set -# CONFIG_TRIM_UNUSED_KSYMS is not set -# CONFIG_TRUSTED_FOUNDATIONS is not set -# CONFIG_TRUSTED_KEYS is not set -# CONFIG_TRUSTED_KEYS_TPM is not set -# CONFIG_TSL2583 is not set -# CONFIG_TSL2591 is not set -# CONFIG_TSL2772 is not set -# CONFIG_TSL2x7x is not set -# CONFIG_TSL4531 is not set -# CONFIG_TSYS01 is not set -# CONFIG_TSYS02D is not set -# CONFIG_TTPCI_EEPROM is not set -CONFIG_TTY=y -# CONFIG_TTY_PRINTK is not set -# CONFIG_TUN is not set -# CONFIG_TUN_VNET_CROSS_LE is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL4030_MADC is not set -# CONFIG_TWL6030_GPADC is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_TYPEC is not set -# CONFIG_TYPEC_TCPM is not set -# CONFIG_TYPEC_UCSI is not set -# CONFIG_TYPHOON is not set -# CONFIG_UACCESS_WITH_MEMCPY is not set -# CONFIG_UBIFS_ATIME_SUPPORT is not set -# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set -# CONFIG_UBIFS_FS_AUTHENTICATION is not set -# CONFIG_UBIFS_FS_ENCRYPTION is not set -CONFIG_UBIFS_FS_LZO=y -# CONFIG_UBIFS_FS_SECURITY is not set -CONFIG_UBIFS_FS_XATTR=y -CONFIG_UBIFS_FS_ZLIB=y -CONFIG_UBIFS_FS_ZSTD=y -# CONFIG_UBSAN is not set -CONFIG_UBSAN_ALIGNMENT=y -# CONFIG_UCB1400_CORE is not set -# CONFIG_UCSI is not set -# CONFIG_UDF_FS is not set -# CONFIG_UDMABUF is not set -CONFIG_UEVENT_HELPER=y -CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" -# CONFIG_UFS_FS is not set -# CONFIG_UHID is not set -CONFIG_UID16=y -# CONFIG_UIO is not set -# CONFIG_ULTRA is not set -# CONFIG_ULTRIX_PARTITION is not set -# CONFIG_UNICODE is not set -# CONFIG_UNISYSSPAR is not set -# CONFIG_UNISYS_VISORBUS is not set -CONFIG_UNIX=y -CONFIG_UNIX98_PTYS=y -# CONFIG_UNIXWARE_DISKLABEL is not set -# CONFIG_UNIX_DIAG is not set -CONFIG_UNIX_SCM=y -# CONFIG_UNMAP_KERNEL_AT_EL0 is not set -# CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_UNWINDER_FRAME_POINTER is not set -# CONFIG_UPROBES is not set -# CONFIG_UPROBE_EVENTS is not set -# CONFIG_US5182D is not set -# CONFIG_USB is not set -# CONFIG_USB4 is not set -# CONFIG_USBIP_CORE is not set -CONFIG_USBIP_VHCI_HC_PORTS=8 -CONFIG_USBIP_VHCI_NR_HCS=1 -# CONFIG_USBIP_VUDC is not set -# CONFIG_USBPCWATCHDOG is not set -# CONFIG_USB_ACM is not set -# CONFIG_USB_ADUTUX is not set -# CONFIG_USB_AIRSPY is not set -CONFIG_USB_ALI_M5632=y -# CONFIG_USB_AMD5536UDC is not set -CONFIG_USB_AN2720=y -# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set -# CONFIG_USB_APPLEDISPLAY is not set -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB_ARMLINUX=y -# CONFIG_USB_ATM is not set -CONFIG_USB_AUTOSUSPEND_DELAY=2 -# CONFIG_USB_BDC_UDC is not set -CONFIG_USB_BELKIN=y -# CONFIG_USB_C67X00_HCD is not set -# CONFIG_USB_CATC is not set -# CONFIG_USB_CDC_COMPOSITE is not set -# CONFIG_USB_CDNS3 is not set -# CONFIG_USB_CDNS_SUPPORT is not set -# CONFIG_USB_CHAOSKEY is not set -# CONFIG_USB_CHIPIDEA is not set -# CONFIG_USB_CHIPIDEA_GENERIC is not set -# CONFIG_USB_CHIPIDEA_IMX is not set -# CONFIG_USB_CHIPIDEA_MSM is not set -# CONFIG_USB_CHIPIDEA_PCI is not set -# CONFIG_USB_CHIPIDEA_TEGRA is not set -# CONFIG_USB_CONFIGFS is not set -# CONFIG_USB_CONN_GPIO is not set -# CONFIG_USB_CXACRU is not set -# CONFIG_USB_CYPRESS_CY7C63 is not set -# CONFIG_USB_CYTHERM is not set -CONFIG_USB_DEFAULT_PERSIST=y -# CONFIG_USB_DSBR is not set -# CONFIG_USB_DUMMY_HCD is not set -# CONFIG_USB_DWC2 is not set -# CONFIG_USB_DWC2_DEBUG is not set -# CONFIG_USB_DWC2_DUAL_ROLE is not set -# CONFIG_USB_DWC2_HOST is not set -# CONFIG_USB_DWC2_PERIPHERAL is not set -# CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set -# CONFIG_USB_DWC3 is not set -# CONFIG_USB_DWC3_EXYNOS is not set -# CONFIG_USB_DWC3_HAPS is not set -# CONFIG_USB_DWC3_KEYSTONE is not set -# CONFIG_USB_DWC3_OF_SIMPLE is not set -# CONFIG_USB_DWC3_PCI is not set -# CONFIG_USB_DWC3_QCOM is not set -# CONFIG_USB_DWC3_ULPI is not set -# CONFIG_USB_DYNAMIC_MINORS is not set -# CONFIG_USB_EG20T is not set -# CONFIG_USB_EHCI_ATH79 is not set -# CONFIG_USB_EHCI_FSL is not set -# CONFIG_USB_EHCI_HCD is not set -# CONFIG_USB_EHCI_HCD_AT91 is not set -# CONFIG_USB_EHCI_HCD_OMAP is not set -# CONFIG_USB_EHCI_HCD_PPC_OF is not set -# CONFIG_USB_EHCI_MSM is not set -# CONFIG_USB_EHCI_MV is not set -CONFIG_USB_EHCI_ROOT_HUB_TT=y -CONFIG_USB_EHCI_TT_NEWSCHED=y -# CONFIG_USB_EHSET_TEST_FIXTURE is not set -# CONFIG_USB_EMI26 is not set -# CONFIG_USB_EMI62 is not set -# CONFIG_USB_EPSON2888 is not set -# CONFIG_USB_EZUSB_FX2 is not set -# CONFIG_USB_FEW_INIT_RETRIES is not set -# CONFIG_USB_FOTG210_HCD is not set -# CONFIG_USB_FOTG210_UDC is not set -# CONFIG_USB_FSL_USB2 is not set -# CONFIG_USB_FTDI_ELAN is not set -# CONFIG_USB_FUNCTIONFS is not set -# CONFIG_USB_FUSB300 is not set -# CONFIG_USB_GADGET is not set -# CONFIG_USB_GADGETFS is not set -# CONFIG_USB_GADGET_DEBUG is not set -# CONFIG_USB_GADGET_DEBUG_FILES is not set -# CONFIG_USB_GADGET_DEBUG_FS is not set -CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 -CONFIG_USB_GADGET_VBUS_DRAW=2 -# CONFIG_USB_GADGET_XILINX is not set -# CONFIG_USB_GL860 is not set -# CONFIG_USB_GOKU is not set -# CONFIG_USB_GPIO_VBUS is not set -# CONFIG_USB_GR_UDC is not set -# CONFIG_USB_GSPCA is not set -# CONFIG_USB_GSPCA_BENQ is not set -# CONFIG_USB_GSPCA_CONEX is not set -# CONFIG_USB_GSPCA_CPIA1 is not set -# CONFIG_USB_GSPCA_DTCS033 is not set -# CONFIG_USB_GSPCA_ETOMS is not set -# CONFIG_USB_GSPCA_FINEPIX is not set -# CONFIG_USB_GSPCA_JEILINJ is not set -# CONFIG_USB_GSPCA_JL2005BCD is not set -# CONFIG_USB_GSPCA_KINECT is not set -# CONFIG_USB_GSPCA_KONICA is not set -# CONFIG_USB_GSPCA_MARS is not set -# CONFIG_USB_GSPCA_MR97310A is not set -# CONFIG_USB_GSPCA_NW80X is not set -# CONFIG_USB_GSPCA_OV519 is not set -# CONFIG_USB_GSPCA_OV534 is not set -# CONFIG_USB_GSPCA_OV534_9 is not set -# CONFIG_USB_GSPCA_PAC207 is not set -# CONFIG_USB_GSPCA_PAC7302 is not set -# CONFIG_USB_GSPCA_PAC7311 is not set -# CONFIG_USB_GSPCA_SE401 is not set -# CONFIG_USB_GSPCA_SN9C2028 is not set -# CONFIG_USB_GSPCA_SN9C20X is not set -# CONFIG_USB_GSPCA_SONIXB is not set -# CONFIG_USB_GSPCA_SONIXJ is not set -# CONFIG_USB_GSPCA_SPCA1528 is not set -# CONFIG_USB_GSPCA_SPCA500 is not set -# CONFIG_USB_GSPCA_SPCA501 is not set -# CONFIG_USB_GSPCA_SPCA505 is not set -# CONFIG_USB_GSPCA_SPCA506 is not set -# CONFIG_USB_GSPCA_SPCA508 is not set -# CONFIG_USB_GSPCA_SPCA561 is not set -# CONFIG_USB_GSPCA_SQ905 is not set -# CONFIG_USB_GSPCA_SQ905C is not set -# CONFIG_USB_GSPCA_SQ930X is not set -# CONFIG_USB_GSPCA_STK014 is not set -# CONFIG_USB_GSPCA_STK1135 is not set -# CONFIG_USB_GSPCA_STV0680 is not set -# CONFIG_USB_GSPCA_SUNPLUS is not set -# CONFIG_USB_GSPCA_T613 is not set -# CONFIG_USB_GSPCA_TOPRO is not set -# CONFIG_USB_GSPCA_TOUPTEK is not set -# CONFIG_USB_GSPCA_TV8532 is not set -# CONFIG_USB_GSPCA_VC032X is not set -# CONFIG_USB_GSPCA_VICAM is not set -# CONFIG_USB_GSPCA_XIRLINK_CIT is not set -# CONFIG_USB_GSPCA_ZC3XX is not set -# CONFIG_USB_G_ACM_MS is not set -# CONFIG_USB_G_DBGP is not set -# CONFIG_USB_G_HID is not set -# CONFIG_USB_G_MULTI is not set -# CONFIG_USB_G_NCM is not set -# CONFIG_USB_G_NOKIA is not set -# CONFIG_USB_G_PRINTER is not set -# CONFIG_USB_G_SERIAL is not set -# CONFIG_USB_G_WEBCAM is not set -# CONFIG_USB_HACKRF is not set -# CONFIG_USB_HCD_TEST_MODE is not set -# CONFIG_USB_HID is not set -# CONFIG_USB_HIDDEV is not set -# CONFIG_USB_HSIC_USB3503 is not set -# CONFIG_USB_HSIC_USB4604 is not set -# CONFIG_USB_HSO is not set -# CONFIG_USB_HUB_USB251XB is not set -# CONFIG_USB_HWA_HCD is not set -# CONFIG_USB_IDMOUSE is not set -# CONFIG_USB_IMX21_HCD is not set -# CONFIG_USB_IOWARRIOR is not set -# CONFIG_USB_IPHETH is not set -# CONFIG_USB_ISIGHTFW is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_ISP1301 is not set -# CONFIG_USB_ISP1362_HCD is not set -# CONFIG_USB_ISP1760 is not set -# CONFIG_USB_ISP1760_HCD is not set -# CONFIG_USB_KAWETH is not set -# CONFIG_USB_KBD is not set -# CONFIG_USB_KC2190 is not set -# CONFIG_USB_LAN78XX is not set -# CONFIG_USB_LCD is not set -# CONFIG_USB_LD is not set -# CONFIG_USB_LED is not set -# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set -# CONFIG_USB_LED_TRIG is not set -# CONFIG_USB_LEGOTOWER is not set -# CONFIG_USB_LGM_PHY is not set -# CONFIG_USB_LINK_LAYER_TEST is not set -# CONFIG_USB_M5602 is not set -# CONFIG_USB_M66592 is not set -# CONFIG_USB_MASS_STORAGE is not set -# CONFIG_USB_MAX3420_UDC is not set -# CONFIG_USB_MAX3421_HCD is not set -# CONFIG_USB_MDC800 is not set -# CONFIG_USB_MICROTEK is not set -# CONFIG_USB_MIDI_GADGET is not set -# CONFIG_USB_MON is not set -# CONFIG_USB_MOUSE is not set -# CONFIG_USB_MSI2500 is not set -# CONFIG_USB_MSM_OTG is not set -# CONFIG_USB_MTU3 is not set -# CONFIG_USB_MUSB_HDRC is not set -# CONFIG_USB_MV_U3D is not set -# CONFIG_USB_MV_UDC is not set -# CONFIG_USB_MXS_PHY is not set -# CONFIG_USB_NET2272 is not set -# CONFIG_USB_NET2280 is not set -# CONFIG_USB_NET_AQC111 is not set -# CONFIG_USB_NET_AX88179_178A is not set -# CONFIG_USB_NET_AX8817X is not set -# CONFIG_USB_NET_CDCETHER is not set -# CONFIG_USB_NET_CDC_EEM is not set -# CONFIG_USB_NET_CDC_MBIM is not set -# CONFIG_USB_NET_CDC_NCM is not set -# CONFIG_USB_NET_CDC_SUBSET is not set -# CONFIG_USB_NET_CH9200 is not set -# CONFIG_USB_NET_CX82310_ETH is not set -# CONFIG_USB_NET_DM9601 is not set -# CONFIG_USB_NET_DRIVERS is not set -# CONFIG_USB_NET_GL620A is not set -# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set -# CONFIG_USB_NET_INT51X1 is not set -# CONFIG_USB_NET_KALMIA is not set -# CONFIG_USB_NET_MCS7830 is not set -# CONFIG_USB_NET_NET1080 is not set -# CONFIG_USB_NET_PLUSB is not set -# CONFIG_USB_NET_QMI_WWAN is not set -# CONFIG_USB_NET_RNDIS_HOST is not set -# CONFIG_USB_NET_RNDIS_WLAN is not set -# CONFIG_USB_NET_SMSC75XX is not set -# CONFIG_USB_NET_SMSC95XX is not set -# CONFIG_USB_NET_SR9700 is not set -# CONFIG_USB_NET_SR9800 is not set -# CONFIG_USB_NET_ZAURUS is not set -# CONFIG_USB_OHCI_HCD is not set -# CONFIG_USB_OHCI_HCD_PCI is not set -# CONFIG_USB_OHCI_HCD_PPC_OF is not set -# CONFIG_USB_OHCI_HCD_PPC_OF_BE is not set -# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set -# CONFIG_USB_OHCI_HCD_SSB is not set -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -# CONFIG_USB_OTG is not set -# CONFIG_USB_OTG_BLACKLIST_HUB is not set -# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set -# CONFIG_USB_OTG_FSM is not set -# CONFIG_USB_OTG_PRODUCTLIST is not set -# CONFIG_USB_OTG_WHITELIST is not set -# CONFIG_USB_OXU210HP_HCD is not set -# CONFIG_USB_PCI is not set -# CONFIG_USB_PEGASUS is not set -# CONFIG_USB_PHY is not set -# CONFIG_USB_PRINTER is not set -# CONFIG_USB_PWC_INPUT_EVDEV is not set -# CONFIG_USB_PXA27X is not set -# CONFIG_USB_R8A66597 is not set -# CONFIG_USB_R8A66597_HCD is not set -# CONFIG_USB_RAW_GADGET is not set -# CONFIG_USB_RCAR_PHY is not set -# CONFIG_USB_RENESAS_USBHS is not set -# CONFIG_USB_RIO500 is not set -# CONFIG_USB_ROLES_INTEL_XHCI is not set -# CONFIG_USB_ROLE_SWITCH is not set -# CONFIG_USB_RTL8150 is not set -# CONFIG_USB_RTL8152 is not set -# CONFIG_USB_RTL8153_ECM is not set -# CONFIG_USB_S2255 is not set -# CONFIG_USB_SERIAL is not set -# CONFIG_USB_SERIAL_AIRCABLE is not set -# CONFIG_USB_SERIAL_ARK3116 is not set -# CONFIG_USB_SERIAL_BELKIN is not set -# CONFIG_USB_SERIAL_CH341 is not set -# CONFIG_USB_SERIAL_CP210X is not set -# CONFIG_USB_SERIAL_CYBERJACK is not set -# CONFIG_USB_SERIAL_CYPRESS_M8 is not set -# CONFIG_USB_SERIAL_DEBUG is not set -# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT is not set -# CONFIG_USB_SERIAL_EDGEPORT_TI is not set -# CONFIG_USB_SERIAL_EMPEG is not set -# CONFIG_USB_SERIAL_F81232 is not set -# CONFIG_USB_SERIAL_F8153X is not set -# CONFIG_USB_SERIAL_FTDI_SIO is not set -# CONFIG_USB_SERIAL_GARMIN is not set -CONFIG_USB_SERIAL_GENERIC=y -# CONFIG_USB_SERIAL_IPAQ is not set -# CONFIG_USB_SERIAL_IPW is not set -# CONFIG_USB_SERIAL_IR is not set -# CONFIG_USB_SERIAL_IUU is not set -# CONFIG_USB_SERIAL_KEYSPAN is not set -CONFIG_USB_SERIAL_KEYSPAN_MPR=y -# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set -CONFIG_USB_SERIAL_KEYSPAN_USA18X=y -CONFIG_USB_SERIAL_KEYSPAN_USA19=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y -CONFIG_USB_SERIAL_KEYSPAN_USA19W=y -CONFIG_USB_SERIAL_KEYSPAN_USA28=y -CONFIG_USB_SERIAL_KEYSPAN_USA28X=y -CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y -CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y -CONFIG_USB_SERIAL_KEYSPAN_USA49W=y -CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y -# CONFIG_USB_SERIAL_KLSI is not set -# CONFIG_USB_SERIAL_KOBIL_SCT is not set -# CONFIG_USB_SERIAL_MCT_U232 is not set -# CONFIG_USB_SERIAL_METRO is not set -# CONFIG_USB_SERIAL_MOS7715_PARPORT is not set -# CONFIG_USB_SERIAL_MOS7720 is not set -# CONFIG_USB_SERIAL_MOS7840 is not set -# CONFIG_USB_SERIAL_MXUPORT is not set -# CONFIG_USB_SERIAL_NAVMAN is not set -# CONFIG_USB_SERIAL_OMNINET is not set -# CONFIG_USB_SERIAL_OPTICON is not set -# CONFIG_USB_SERIAL_OPTION is not set -# CONFIG_USB_SERIAL_OTI6858 is not set -# CONFIG_USB_SERIAL_PL2303 is not set -# CONFIG_USB_SERIAL_QCAUX is not set -# CONFIG_USB_SERIAL_QT2 is not set -# CONFIG_USB_SERIAL_QUALCOMM is not set -# CONFIG_USB_SERIAL_SAFE is not set -CONFIG_USB_SERIAL_SAFE_PADDED=y -# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set -# CONFIG_USB_SERIAL_SIMPLE is not set -# CONFIG_USB_SERIAL_SPCP8X5 is not set -# CONFIG_USB_SERIAL_SSU100 is not set -# CONFIG_USB_SERIAL_SYMBOL is not set -# CONFIG_USB_SERIAL_TI is not set -# CONFIG_USB_SERIAL_UPD78F0730 is not set -# CONFIG_USB_SERIAL_VISOR is not set -# CONFIG_USB_SERIAL_WHITEHEAT is not set -# CONFIG_USB_SERIAL_WISHBONE is not set -# CONFIG_USB_SERIAL_XIRCOM is not set -# CONFIG_USB_SERIAL_XR is not set -# CONFIG_USB_SERIAL_XSENS_MT is not set -# CONFIG_USB_SEVSEG is not set -# CONFIG_USB_SIERRA_NET is not set -# CONFIG_USB_SISUSBVGA is not set -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_SNP_UDC_PLAT is not set -# CONFIG_USB_SPEEDTOUCH is not set -# CONFIG_USB_STKWEBCAM is not set -# CONFIG_USB_STORAGE is not set -# CONFIG_USB_STORAGE_ALAUDA is not set -# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set -# CONFIG_USB_STORAGE_DATAFAB is not set -# CONFIG_USB_STORAGE_DEBUG is not set -# CONFIG_USB_STORAGE_ENE_UB6250 is not set -# CONFIG_USB_STORAGE_FREECOM is not set -# CONFIG_USB_STORAGE_ISD200 is not set -# CONFIG_USB_STORAGE_JUMPSHOT is not set -# CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_ONETOUCH is not set -# CONFIG_USB_STORAGE_REALTEK is not set -# CONFIG_USB_STORAGE_SDDR09 is not set -# CONFIG_USB_STORAGE_SDDR55 is not set -# CONFIG_USB_STORAGE_USBAT is not set -# CONFIG_USB_STV06XX is not set -# CONFIG_USB_SUPPORT is not set -# CONFIG_USB_SWITCH_FSA9480 is not set -# CONFIG_USB_TEST is not set -# CONFIG_USB_TMC is not set -# CONFIG_USB_TRANCEVIBRATOR is not set -# CONFIG_USB_UAS is not set -# CONFIG_USB_UEAGLEATM is not set -# CONFIG_USB_ULPI is not set -# CONFIG_USB_ULPI_BUS is not set -# CONFIG_USB_USBNET is not set -# CONFIG_USB_USS720 is not set -# CONFIG_USB_VIDEO_CLASS is not set -CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y -# CONFIG_USB_VL600 is not set -# CONFIG_USB_WDM is not set -# CONFIG_USB_WHCI_HCD is not set -# CONFIG_USB_WUSB is not set -# CONFIG_USB_WUSB_CBAF is not set -# CONFIG_USB_XHCI_DBGCAP is not set -# CONFIG_USB_XHCI_HCD is not set -# CONFIG_USB_XHCI_MVEBU is not set -# CONFIG_USB_XHCI_PCI_RENESAS is not set -# CONFIG_USB_XUSBATM is not set -# CONFIG_USB_YUREX is not set -# CONFIG_USB_ZD1201 is not set -# CONFIG_USB_ZERO is not set -# CONFIG_USB_ZR364XX is not set -# CONFIG_USELIB is not set -# CONFIG_USERFAULTFD is not set -# CONFIG_USERIO is not set -# CONFIG_USER_DECRYPTED_DATA is not set -# CONFIG_USE_OF is not set -# CONFIG_UTS_NS is not set -# CONFIG_UWB is not set -# CONFIG_U_SERIAL_CONSOLE is not set -# CONFIG_V4L_MEM2MEM_DRIVERS is not set -# CONFIG_V4L_PLATFORM_DRIVERS is not set -# CONFIG_V4L_TEST_DRIVERS is not set -# CONFIG_VALIDATE_FS_PARSER is not set -# CONFIG_VBOXGUEST is not set -# CONFIG_VCNL3020 is not set -# CONFIG_VCNL4000 is not set -# CONFIG_VCNL4035 is not set -# CONFIG_VDPA is not set -CONFIG_VDSO=y -# CONFIG_VEML6030 is not set -# CONFIG_VEML6070 is not set -# CONFIG_VETH is not set -# CONFIG_VEXPRESS_CONFIG is not set -# CONFIG_VF610_ADC is not set -# CONFIG_VF610_DAC is not set -# CONFIG_VFAT_FS is not set -# CONFIG_VFIO is not set -# CONFIG_VGASTATE is not set -# CONFIG_VGA_ARB is not set -# CONFIG_VGA_SWITCHEROO is not set -# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set -CONFIG_VHOST_MENU=y -# CONFIG_VHOST_NET is not set -# CONFIG_VHOST_VSOCK is not set -# CONFIG_VIA_RHINE is not set -# CONFIG_VIA_VELOCITY is not set -# CONFIG_VIDEO_AD5820 is not set -# CONFIG_VIDEO_AD9389B is not set -# CONFIG_VIDEO_ADP1653 is not set -# CONFIG_VIDEO_ADV7170 is not set -# CONFIG_VIDEO_ADV7175 is not set -# CONFIG_VIDEO_ADV7180 is not set -# CONFIG_VIDEO_ADV7183 is not set -# CONFIG_VIDEO_ADV7343 is not set -# CONFIG_VIDEO_ADV7393 is not set -# CONFIG_VIDEO_ADV748X is not set -# CONFIG_VIDEO_ADV7511 is not set -# CONFIG_VIDEO_ADV7604 is not set -# CONFIG_VIDEO_ADV7842 is not set -# CONFIG_VIDEO_ADV_DEBUG is not set -# CONFIG_VIDEO_AK7375 is not set -# CONFIG_VIDEO_AK881X is not set -# CONFIG_VIDEO_ASPEED is not set -# CONFIG_VIDEO_AU0828 is not set -# CONFIG_VIDEO_BT819 is not set -# CONFIG_VIDEO_BT848 is not set -# CONFIG_VIDEO_BT856 is not set -# CONFIG_VIDEO_BT866 is not set -# CONFIG_VIDEO_CADENCE is not set -# CONFIG_VIDEO_CAFE_CCIC is not set -# CONFIG_VIDEO_CCS is not set -# CONFIG_VIDEO_CS3308 is not set -# CONFIG_VIDEO_CS5345 is not set -# CONFIG_VIDEO_CS53L32A is not set -# CONFIG_VIDEO_CX231XX is not set -# CONFIG_VIDEO_CX2341X is not set -# CONFIG_VIDEO_CX25840 is not set -# CONFIG_VIDEO_CX88 is not set -# CONFIG_VIDEO_DEV is not set -# CONFIG_VIDEO_DM6446_CCDC is not set -# CONFIG_VIDEO_DT3155 is not set -# CONFIG_VIDEO_DW9714 is not set -# CONFIG_VIDEO_DW9768 is not set -# CONFIG_VIDEO_DW9807_VCM is not set -# CONFIG_VIDEO_EM28XX is not set -# CONFIG_VIDEO_ET8EK8 is not set -# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set -# CONFIG_VIDEO_GO7007 is not set -# CONFIG_VIDEO_GS1662 is not set -# CONFIG_VIDEO_HANTRO_ROCKCHIP is not set -# CONFIG_VIDEO_HDPVR is not set -# CONFIG_VIDEO_HEXIUM_GEMINI is not set -# CONFIG_VIDEO_HEXIUM_ORION is not set -# CONFIG_VIDEO_HI556 is not set -# CONFIG_VIDEO_I2C is not set -# CONFIG_VIDEO_IMX214 is not set -# CONFIG_VIDEO_IMX219 is not set -# CONFIG_VIDEO_IMX258 is not set -# CONFIG_VIDEO_IMX274 is not set -# CONFIG_VIDEO_IMX290 is not set -# CONFIG_VIDEO_IMX319 is not set -# CONFIG_VIDEO_IMX334 is not set -# CONFIG_VIDEO_IMX355 is not set -# CONFIG_VIDEO_IMX477 is not set -# CONFIG_VIDEO_IRS1125 is not set -# CONFIG_VIDEO_IR_I2C is not set -# CONFIG_VIDEO_IVTV is not set -# CONFIG_VIDEO_KS0127 is not set -# CONFIG_VIDEO_LM3560 is not set -# CONFIG_VIDEO_LM3646 is not set -# CONFIG_VIDEO_M52790 is not set -# CONFIG_VIDEO_M5MOLS is not set -# CONFIG_VIDEO_MAX9286 is not set -# CONFIG_VIDEO_ML86V7667 is not set -# CONFIG_VIDEO_MSP3400 is not set -# CONFIG_VIDEO_MT9M001 is not set -# CONFIG_VIDEO_MT9M032 is not set -# CONFIG_VIDEO_MT9M111 is not set -# CONFIG_VIDEO_MT9P031 is not set -# CONFIG_VIDEO_MT9T001 is not set -# CONFIG_VIDEO_MT9T112 is not set -# CONFIG_VIDEO_MT9V011 is not set -# CONFIG_VIDEO_MT9V032 is not set -# CONFIG_VIDEO_MT9V111 is not set -# CONFIG_VIDEO_MUX is not set -# CONFIG_VIDEO_MXB is not set -# CONFIG_VIDEO_NOON010PC30 is not set -# CONFIG_VIDEO_OMAP2_VOUT is not set -# CONFIG_VIDEO_OV02A10 is not set -# CONFIG_VIDEO_OV13858 is not set -# CONFIG_VIDEO_OV2640 is not set -# CONFIG_VIDEO_OV2659 is not set -# CONFIG_VIDEO_OV2680 is not set -# CONFIG_VIDEO_OV2685 is not set -# CONFIG_VIDEO_OV2740 is not set -# CONFIG_VIDEO_OV5640 is not set -# CONFIG_VIDEO_OV5645 is not set -# CONFIG_VIDEO_OV5647 is not set -# CONFIG_VIDEO_OV5670 is not set -# CONFIG_VIDEO_OV5675 is not set -# CONFIG_VIDEO_OV5695 is not set -# CONFIG_VIDEO_OV6650 is not set -# CONFIG_VIDEO_OV7251 is not set -# CONFIG_VIDEO_OV7640 is not set -# CONFIG_VIDEO_OV7670 is not set -# CONFIG_VIDEO_OV772X is not set -# CONFIG_VIDEO_OV7740 is not set -# CONFIG_VIDEO_OV8856 is not set -# CONFIG_VIDEO_OV9281 is not set -# CONFIG_VIDEO_OV9640 is not set -# CONFIG_VIDEO_OV9650 is not set -# CONFIG_VIDEO_PVRUSB2 is not set -# CONFIG_VIDEO_RDACM20 is not set -# CONFIG_VIDEO_RDACM21 is not set -# CONFIG_VIDEO_RJ54N1 is not set -# CONFIG_VIDEO_S5C73M3 is not set -# CONFIG_VIDEO_S5K4ECGX is not set -# CONFIG_VIDEO_S5K5BAF is not set -# CONFIG_VIDEO_S5K6A3 is not set -# CONFIG_VIDEO_S5K6AA is not set -# CONFIG_VIDEO_SAA6588 is not set -# CONFIG_VIDEO_SAA6752HS is not set -# CONFIG_VIDEO_SAA7110 is not set -# CONFIG_VIDEO_SAA711X is not set -# CONFIG_VIDEO_SAA7127 is not set -# CONFIG_VIDEO_SAA7134 is not set -# CONFIG_VIDEO_SAA717X is not set -# CONFIG_VIDEO_SAA7185 is not set -# CONFIG_VIDEO_SH_MOBILE_CEU is not set -# CONFIG_VIDEO_SMIAPP is not set -# CONFIG_VIDEO_SONY_BTF_MPX is not set -# CONFIG_VIDEO_SR030PC30 is not set -# CONFIG_VIDEO_STK1160_COMMON is not set -# CONFIG_VIDEO_ST_MIPID02 is not set -# CONFIG_VIDEO_TC358743 is not set -# CONFIG_VIDEO_TDA1997X is not set -# CONFIG_VIDEO_TDA7432 is not set -# CONFIG_VIDEO_TDA9840 is not set -# CONFIG_VIDEO_TEA6415C is not set -# CONFIG_VIDEO_TEA6420 is not set -# CONFIG_VIDEO_THS7303 is not set -# CONFIG_VIDEO_THS8200 is not set -# CONFIG_VIDEO_TIMBERDALE is not set -# CONFIG_VIDEO_TLV320AIC23B is not set -# CONFIG_VIDEO_TM6000 is not set -# CONFIG_VIDEO_TVAUDIO is not set -# CONFIG_VIDEO_TVP514X is not set -# CONFIG_VIDEO_TVP5150 is not set -# CONFIG_VIDEO_TVP7002 is not set -# CONFIG_VIDEO_TW2804 is not set -# CONFIG_VIDEO_TW9903 is not set -# CONFIG_VIDEO_TW9906 is not set -# CONFIG_VIDEO_TW9910 is not set -# CONFIG_VIDEO_UDA1342 is not set -# CONFIG_VIDEO_UPD64031A is not set -# CONFIG_VIDEO_UPD64083 is not set -# CONFIG_VIDEO_USBTV is not set -# CONFIG_VIDEO_USBVISION is not set -# CONFIG_VIDEO_V4L2 is not set -# CONFIG_VIDEO_VP27SMPX is not set -# CONFIG_VIDEO_VPX3220 is not set -# CONFIG_VIDEO_VS6624 is not set -# CONFIG_VIDEO_WM8739 is not set -# CONFIG_VIDEO_WM8775 is not set -# CONFIG_VIDEO_XILINX is not set -# CONFIG_VIDEO_ZORAN is not set -# CONFIG_VIRTIO_BALLOON is not set -# CONFIG_VIRTIO_BLK_SCSI is not set -# CONFIG_VIRTIO_CONSOLE is not set -# CONFIG_VIRTIO_FS is not set -# CONFIG_VIRTIO_INPUT is not set -CONFIG_VIRTIO_MENU=y -# CONFIG_VIRTIO_MMIO is not set -# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set -# CONFIG_VIRTIO_PCI is not set -# CONFIG_VIRTUALIZATION is not set -# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set -# CONFIG_VIRT_DRIVERS is not set -CONFIG_VIRT_TO_BUS=y -# CONFIG_VITESSE_PHY is not set -# CONFIG_VL53L0X_I2C is not set -# CONFIG_VL6180 is not set -CONFIG_VLAN_8021Q=y -# CONFIG_VLAN_8021Q_GVRP is not set -# CONFIG_VLAN_8021Q_MVRP is not set -# CONFIG_VMAP_STACK is not set -# CONFIG_VME_BUS is not set -# CONFIG_VMLINUX_MAP is not set -# CONFIG_VMSPLIT_1G is not set -# CONFIG_VMSPLIT_2G is not set -# CONFIG_VMSPLIT_2G_OPT is not set -CONFIG_VMSPLIT_3G=y -# CONFIG_VMSPLIT_3G_OPT is not set -# CONFIG_VMWARE_PVSCSI is not set -# CONFIG_VMXNET3 is not set -# CONFIG_VM_EVENT_COUNTERS is not set -# CONFIG_VOP_BUS is not set -# CONFIG_VORTEX is not set -# CONFIG_VSOCKETS is not set -# CONFIG_VSOCKETS_DIAG is not set -# CONFIG_VT is not set -# CONFIG_VT6655 is not set -# CONFIG_VT6656 is not set -# CONFIG_VXFS_FS is not set -# CONFIG_VXGE is not set -# CONFIG_VXLAN is not set -# CONFIG_VZ89X is not set -# CONFIG_W1 is not set -# CONFIG_W1_CON is not set -# CONFIG_W1_MASTER_DS1WM is not set -# CONFIG_W1_MASTER_DS2482 is not set -# CONFIG_W1_MASTER_DS2490 is not set -# CONFIG_W1_MASTER_GPIO is not set -# CONFIG_W1_MASTER_MATROX is not set -# CONFIG_W1_MASTER_SGI is not set -# CONFIG_W1_SLAVE_DS2405 is not set -# CONFIG_W1_SLAVE_DS2406 is not set -# CONFIG_W1_SLAVE_DS2408 is not set -# CONFIG_W1_SLAVE_DS2413 is not set -# CONFIG_W1_SLAVE_DS2423 is not set -# CONFIG_W1_SLAVE_DS2430 is not set -# CONFIG_W1_SLAVE_DS2431 is not set -# CONFIG_W1_SLAVE_DS2433 is not set -# CONFIG_W1_SLAVE_DS2438 is not set -# CONFIG_W1_SLAVE_DS250X is not set -# CONFIG_W1_SLAVE_DS2780 is not set -# CONFIG_W1_SLAVE_DS2781 is not set -# CONFIG_W1_SLAVE_DS2805 is not set -# CONFIG_W1_SLAVE_DS28E04 is not set -# CONFIG_W1_SLAVE_DS28E17 is not set -# CONFIG_W1_SLAVE_SMEM is not set -# CONFIG_W1_SLAVE_THERM is not set -# CONFIG_W83627HF_WDT is not set -# CONFIG_W83877F_WDT is not set -# CONFIG_W83977F_WDT is not set -# CONFIG_WAN is not set -# CONFIG_WANXL is not set -# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set -CONFIG_WATCHDOG=y -# CONFIG_WATCHDOG_CORE is not set -CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y -# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set -# CONFIG_WATCHDOG_NOWAYOUT is not set -CONFIG_WATCHDOG_OPEN_TIMEOUT=0 -# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set -# CONFIG_WATCHDOG_SYSFS is not set -# CONFIG_WATCH_QUEUE is not set -# CONFIG_WD80x3 is not set -# CONFIG_WDAT_WDT is not set -# CONFIG_WDTPCI is not set -# CONFIG_WERROR is not set -CONFIG_WEXT_CORE=y -CONFIG_WEXT_PRIV=y -CONFIG_WEXT_PROC=y -CONFIG_WEXT_SPY=y -CONFIG_WILINK_PLATFORM_DATA=y -# CONFIG_WIMAX is not set -# CONFIG_WIREGUARD is not set -CONFIG_WIRELESS=y -CONFIG_WIRELESS_EXT=y -# CONFIG_WIRELESS_WDS is not set -# CONFIG_WIZNET_W5100 is not set -# CONFIG_WIZNET_W5300 is not set -# CONFIG_WL1251 is not set -# CONFIG_WL12XX is not set -# CONFIG_WL18XX is not set -CONFIG_WLAN=y -# CONFIG_WLAN_VENDOR_ADMTEK is not set -# CONFIG_WLAN_VENDOR_ATH is not set -# CONFIG_WLAN_VENDOR_ATMEL is not set -# CONFIG_WLAN_VENDOR_BROADCOM is not set -# CONFIG_WLAN_VENDOR_CISCO is not set -# CONFIG_WLAN_VENDOR_INTEL is not set -# CONFIG_WLAN_VENDOR_INTERSIL is not set -# CONFIG_WLAN_VENDOR_MARVELL is not set -# CONFIG_WLAN_VENDOR_MEDIATEK is not set -# CONFIG_WLAN_VENDOR_MICROCHIP is not set -# CONFIG_WLAN_VENDOR_PURELIFI is not set -# CONFIG_WLAN_VENDOR_QUANTENNA is not set -# CONFIG_WLAN_VENDOR_RALINK is not set -# CONFIG_WLAN_VENDOR_REALTEK is not set -# CONFIG_WLAN_VENDOR_RSI is not set -# CONFIG_WLAN_VENDOR_SILABS is not set -# CONFIG_WLAN_VENDOR_ST is not set -# CONFIG_WLAN_VENDOR_TI is not set -# CONFIG_WLAN_VENDOR_ZYDAS is not set -# CONFIG_WLCORE is not set -CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y -# CONFIG_WQ_WATCHDOG is not set -# CONFIG_WWAN is not set -# CONFIG_WW_MUTEX_SELFTEST is not set -# CONFIG_X25 is not set -# CONFIG_X509_CERTIFICATE_PARSER is not set -# CONFIG_X86_PKG_TEMP_THERMAL is not set -CONFIG_X86_SYSFB=y -# CONFIG_XDP_SOCKETS is not set -# CONFIG_XEN is not set -# CONFIG_XEN_GRANT_DMA_ALLOC is not set -# CONFIG_XEN_PVCALLS_FRONTEND is not set -CONFIG_XEN_SCRUB_PAGES_DEFAULT=y -CONFIG_XFRM=y -# CONFIG_XFRM_INTERFACE is not set -# CONFIG_XFRM_IPCOMP is not set -# CONFIG_XFRM_MIGRATE is not set -# CONFIG_XFRM_STATISTICS is not set -# CONFIG_XFRM_SUB_POLICY is not set -# CONFIG_XFRM_USER is not set -# CONFIG_XFS_DEBUG is not set -# CONFIG_XFS_FS is not set -# CONFIG_XFS_ONLINE_SCRUB is not set -# CONFIG_XFS_POSIX_ACL is not set -# CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_RT is not set -# CONFIG_XFS_SUPPORT_V4 is not set -# CONFIG_XFS_WARN is not set -# CONFIG_XILINX_AXI_EMAC is not set -# CONFIG_XILINX_DMA is not set -# CONFIG_XILINX_EMACLITE is not set -# CONFIG_XILINX_GMII2RGMII is not set -# CONFIG_XILINX_INTC is not set -# CONFIG_XILINX_LL_TEMAC is not set -# CONFIG_XILINX_SDFEC is not set -# CONFIG_XILINX_VCU is not set -# CONFIG_XILINX_WATCHDOG is not set -# CONFIG_XILINX_XADC is not set -# CONFIG_XILINX_ZYNQMP_DMA is not set -# CONFIG_XILINX_ZYNQMP_DPDMA is not set -# CONFIG_XILLYBUS is not set -# CONFIG_XILLYUSB is not set -# CONFIG_XIL_AXIS_FIFO is not set -# CONFIG_XIP_KERNEL is not set -# CONFIG_XMON is not set -# CONFIG_XXHASH is not set -CONFIG_XZ_DEC=y -# CONFIG_XZ_DEC_ARM is not set -# CONFIG_XZ_DEC_ARMTHUMB is not set -# CONFIG_XZ_DEC_BCJ is not set -# CONFIG_XZ_DEC_IA64 is not set -# CONFIG_XZ_DEC_MICROLZMA is not set -# CONFIG_XZ_DEC_POWERPC is not set -# CONFIG_XZ_DEC_SPARC is not set -# CONFIG_XZ_DEC_TEST is not set -# CONFIG_XZ_DEC_X86 is not set -# CONFIG_YAM is not set -# CONFIG_YAMAHA_YAS530 is not set -# CONFIG_YELLOWFIN is not set -# CONFIG_YENTA is not set -# CONFIG_YENTA_O2 is not set -# CONFIG_YENTA_RICOH is not set -# CONFIG_YENTA_TI is not set -# CONFIG_YENTA_TOSHIBA is not set -# CONFIG_ZBUD is not set -# CONFIG_ZD1211RW is not set -# CONFIG_ZD1211RW_DEBUG is not set -# CONFIG_ZEROPLUS_FF is not set -# CONFIG_ZERO_CALL_USED_REGS is not set -# CONFIG_ZIIRAVE_WATCHDOG is not set -# CONFIG_ZISOFS is not set -# CONFIG_ZLIB_DEFLATE is not set -# CONFIG_ZLIB_INFLATE is not set -CONFIG_ZONE_DMA=y -# CONFIG_ZONE_DMA32 is not set -# CONFIG_ZOPT2201 is not set -# CONFIG_ZPA2326 is not set -# CONFIG_ZPOOL is not set -# CONFIG_ZRAM is not set -# CONFIG_ZRAM_MEMORY_TRACKING is not set -# CONFIG_ZSMALLOC is not set -# CONFIG_ZSTD_COMPRESS is not set -# CONFIG_ZSTD_DECOMPRESS is not set -# CONFIG_ZSWAP is not set -# CONFIG_ZX_TDM is not set diff --git a/target/linux/generic/hack-5.19/204-module_strip.patch b/target/linux/generic/hack-5.19/204-module_strip.patch deleted file mode 100644 index de724bb25..000000000 --- a/target/linux/generic/hack-5.19/204-module_strip.patch +++ /dev/null @@ -1,174 +0,0 @@ -From a779a482fb9b9f8fcdf8b2519c789b4b9bb5dd05 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 16:56:48 +0200 -Subject: build: add a hack for removing non-essential module info - -Signed-off-by: Felix Fietkau ---- - include/linux/module.h | 13 ++++++++----- - include/linux/moduleparam.h | 15 ++++++++++++--- - init/Kconfig | 7 +++++++ - kernel/module.c | 5 ++++- - scripts/mod/modpost.c | 12 ++++++++++++ - 5 files changed, 43 insertions(+), 9 deletions(-) - ---- a/include/linux/module.h -+++ b/include/linux/module.h -@@ -164,6 +164,7 @@ extern void cleanup_module(void); - - /* Generic info of form tag = "info" */ - #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info) -+#define MODULE_INFO_STRIP(tag, info) __MODULE_INFO_STRIP(tag, tag, info) - - /* For userspace: you can also call me... */ - #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias) -@@ -233,12 +234,12 @@ extern void cleanup_module(void); - * Author(s), use "Name " or just "Name", for multiple - * authors use multiple MODULE_AUTHOR() statements/lines. - */ --#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author) -+#define MODULE_AUTHOR(_author) MODULE_INFO_STRIP(author, _author) - - /* What your module does. */ --#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description) -+#define MODULE_DESCRIPTION(_description) MODULE_INFO_STRIP(description, _description) - --#ifdef MODULE -+#if defined(MODULE) && !defined(CONFIG_MODULE_STRIPPED) - /* Creates an alias so file2alias.c can find device table. */ - #define MODULE_DEVICE_TABLE(type, name) \ - extern typeof(name) __mod_##type##__##name##_device_table \ -@@ -265,7 +266,9 @@ extern typeof(name) __mod_##type##__##na - */ - - #if defined(MODULE) || !defined(CONFIG_SYSFS) --#define MODULE_VERSION(_version) MODULE_INFO(version, _version) -+#define MODULE_VERSION(_version) MODULE_INFO_STRIP(version, _version) -+#elif defined(CONFIG_MODULE_STRIPPED) -+#define MODULE_VERSION(_version) __MODULE_INFO_DISABLED(version) - #else - #define MODULE_VERSION(_version) \ - MODULE_INFO(version, _version); \ -@@ -288,7 +291,7 @@ extern typeof(name) __mod_##type##__##na - /* Optional firmware file (or files) needed by the module - * format is simply firmware file name. Multiple firmware - * files require multiple MODULE_FIRMWARE() specifiers */ --#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware) -+#define MODULE_FIRMWARE(_firmware) MODULE_INFO_STRIP(firmware, _firmware) - - #define MODULE_IMPORT_NS(ns) MODULE_INFO(import_ns, __stringify(ns)) - ---- a/include/linux/moduleparam.h -+++ b/include/linux/moduleparam.h -@@ -20,6 +20,16 @@ - /* Chosen so that structs with an unsigned long line up. */ - #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long)) - -+/* This struct is here for syntactic coherency, it is not used */ -+#define __MODULE_INFO_DISABLED(name) \ -+ struct __UNIQUE_ID(name) {} -+ -+#ifdef CONFIG_MODULE_STRIPPED -+#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO_DISABLED(name) -+#else -+#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO(tag, name, info) -+#endif -+ - #define __MODULE_INFO(tag, name, info) \ - static const char __UNIQUE_ID(name)[] \ - __used __section(".modinfo") __aligned(1) \ -@@ -31,7 +41,7 @@ - /* One for each parameter, describing how to use it. Some files do - multiple of these per line, so can't just use MODULE_INFO. */ - #define MODULE_PARM_DESC(_parm, desc) \ -- __MODULE_INFO(parm, _parm, #_parm ":" desc) -+ __MODULE_INFO_STRIP(parm, _parm, #_parm ":" desc) - - struct kernel_param; - ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -2219,6 +2219,13 @@ config UNUSED_KSYMS_WHITELIST - one per line. The path can be absolute, or relative to the kernel - source tree. - -+config MODULE_STRIPPED -+ bool "Reduce module size" -+ depends on MODULES -+ help -+ Remove module parameter descriptions, author info, version, aliases, -+ device tables, etc. -+ - endif # MODULES - - config MODULES_TREE_LOOKUP ---- a/kernel/module/main.c -+++ b/kernel/module/main.c -@@ -1949,9 +1949,11 @@ static int setup_load_info(struct load_i - - static int check_modinfo(struct module *mod, struct load_info *info, int flags) - { -- const char *modmagic = get_modinfo(info, "vermagic"); - int err; - -+#ifndef CONFIG_MODULE_STRIPPED -+ const char *modmagic = get_modinfo(info, "vermagic"); -+ - if (flags & MODULE_INIT_IGNORE_VERMAGIC) - modmagic = NULL; - -@@ -1972,6 +1974,7 @@ static int check_modinfo(struct module * - mod->name); - add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK); - } -+#endif - - check_modinfo_retpoline(mod, info); - ---- a/scripts/mod/modpost.c -+++ b/scripts/mod/modpost.c -@@ -2002,7 +2002,9 @@ static void read_symbols(const char *mod - symname = remove_dot(info.strtab + sym->st_name); - - handle_symbol(mod, &info, sym, symname); -+#ifndef CONFIG_MODULE_STRIPPED - handle_moddevtable(mod, &info, sym, symname); -+#endif - } - - for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { -@@ -2165,8 +2167,10 @@ static void add_header(struct buffer *b, - buf_printf(b, "BUILD_SALT;\n"); - buf_printf(b, "BUILD_LTO_INFO;\n"); - buf_printf(b, "\n"); -+#ifndef CONFIG_MODULE_STRIPPED - buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n"); - buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n"); -+#endif - buf_printf(b, "\n"); - buf_printf(b, "__visible struct module __this_module\n"); - buf_printf(b, "__section(\".gnu.linkonce.this_module\") = {\n"); -@@ -2283,11 +2287,13 @@ static void add_depends(struct buffer *b - - static void add_srcversion(struct buffer *b, struct module *mod) - { -+#ifndef CONFIG_MODULE_STRIPPED - if (mod->srcversion[0]) { - buf_printf(b, "\n"); - buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n", - mod->srcversion); - } -+#endif - } - - static void write_buf(struct buffer *b, const char *fname) -@@ -2373,7 +2379,9 @@ static void write_mod_c_file(struct modu - add_exported_symbols(&buf, mod); - add_versions(&buf, mod); - add_depends(&buf, mod); -+#ifndef CONFIG_MODULE_STRIPPED - add_moddevtable(&buf, mod); -+#endif - add_srcversion(&buf, mod); - - ret = snprintf(fname, sizeof(fname), "%s.mod.c", mod->name); diff --git a/target/linux/generic/hack-5.19/205-kconfig-exit.patch b/target/linux/generic/hack-5.19/205-kconfig-exit.patch deleted file mode 100644 index f1b50283d..000000000 --- a/target/linux/generic/hack-5.19/205-kconfig-exit.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/scripts/kconfig/conf.c -+++ b/scripts/kconfig/conf.c -@@ -432,6 +432,8 @@ static int conf_sym(struct menu *menu) - break; - continue; - case 0: -+ if (!sym_has_value(sym) && !tty_stdio && getenv("FAIL_ON_UNCONFIGURED")) -+ exit(1); - newval = oldval; - break; - case '?': diff --git a/target/linux/generic/hack-5.19/210-darwin_scripts_include.patch b/target/linux/generic/hack-5.19/210-darwin_scripts_include.patch deleted file mode 100644 index c9612536d..000000000 --- a/target/linux/generic/hack-5.19/210-darwin_scripts_include.patch +++ /dev/null @@ -1,3053 +0,0 @@ -From db7c30dcd9a0391bf13b62c9f91e144d762ef43a Mon Sep 17 00:00:00 2001 -From: Florian Fainelli -Date: Fri, 7 Jul 2017 17:00:49 +0200 -Subject: Add an OSX specific patch to make the kernel be compiled - -lede-commit: 3fc2a24f0422b2f55f9ed43f116db3111f700526 -Signed-off-by: Florian Fainelli ---- - scripts/kconfig/Makefile | 3 + - scripts/mod/elf.h | 3007 ++++++++++++++++++++++++++++++++++++++++++++ - scripts/mod/mk_elfconfig.c | 4 + - scripts/mod/modpost.h | 4 + - 4 files changed, 3018 insertions(+) - create mode 100644 scripts/mod/elf.h - ---- /dev/null -+++ b/scripts/mod/elf.h -@@ -0,0 +1,3007 @@ -+/* This file defines standard ELF types, structures, and macros. -+ Copyright (C) 1995-2012 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ . */ -+ -+#ifndef _ELF_H -+#define _ELF_H 1 -+ -+/* Standard ELF types. */ -+ -+#include -+ -+/* Type for a 16-bit quantity. */ -+typedef uint16_t Elf32_Half; -+typedef uint16_t Elf64_Half; -+ -+/* Types for signed and unsigned 32-bit quantities. */ -+typedef uint32_t Elf32_Word; -+typedef int32_t Elf32_Sword; -+typedef uint32_t Elf64_Word; -+typedef int32_t Elf64_Sword; -+ -+/* Types for signed and unsigned 64-bit quantities. */ -+typedef uint64_t Elf32_Xword; -+typedef int64_t Elf32_Sxword; -+typedef uint64_t Elf64_Xword; -+typedef int64_t Elf64_Sxword; -+ -+/* Type of addresses. */ -+typedef uint32_t Elf32_Addr; -+typedef uint64_t Elf64_Addr; -+ -+/* Type of file offsets. */ -+typedef uint32_t Elf32_Off; -+typedef uint64_t Elf64_Off; -+ -+/* Type for section indices, which are 16-bit quantities. */ -+typedef uint16_t Elf32_Section; -+typedef uint16_t Elf64_Section; -+ -+/* Type for version symbol information. */ -+typedef Elf32_Half Elf32_Versym; -+typedef Elf64_Half Elf64_Versym; -+ -+ -+/* The ELF file header. This appears at the start of every ELF file. */ -+ -+#define EI_NIDENT (16) -+ -+typedef struct -+{ -+ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ -+ Elf32_Half e_type; /* Object file type */ -+ Elf32_Half e_machine; /* Architecture */ -+ Elf32_Word e_version; /* Object file version */ -+ Elf32_Addr e_entry; /* Entry point virtual address */ -+ Elf32_Off e_phoff; /* Program header table file offset */ -+ Elf32_Off e_shoff; /* Section header table file offset */ -+ Elf32_Word e_flags; /* Processor-specific flags */ -+ Elf32_Half e_ehsize; /* ELF header size in bytes */ -+ Elf32_Half e_phentsize; /* Program header table entry size */ -+ Elf32_Half e_phnum; /* Program header table entry count */ -+ Elf32_Half e_shentsize; /* Section header table entry size */ -+ Elf32_Half e_shnum; /* Section header table entry count */ -+ Elf32_Half e_shstrndx; /* Section header string table index */ -+} Elf32_Ehdr; -+ -+typedef struct -+{ -+ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ -+ Elf64_Half e_type; /* Object file type */ -+ Elf64_Half e_machine; /* Architecture */ -+ Elf64_Word e_version; /* Object file version */ -+ Elf64_Addr e_entry; /* Entry point virtual address */ -+ Elf64_Off e_phoff; /* Program header table file offset */ -+ Elf64_Off e_shoff; /* Section header table file offset */ -+ Elf64_Word e_flags; /* Processor-specific flags */ -+ Elf64_Half e_ehsize; /* ELF header size in bytes */ -+ Elf64_Half e_phentsize; /* Program header table entry size */ -+ Elf64_Half e_phnum; /* Program header table entry count */ -+ Elf64_Half e_shentsize; /* Section header table entry size */ -+ Elf64_Half e_shnum; /* Section header table entry count */ -+ Elf64_Half e_shstrndx; /* Section header string table index */ -+} Elf64_Ehdr; -+ -+/* Fields in the e_ident array. The EI_* macros are indices into the -+ array. The macros under each EI_* macro are the values the byte -+ may have. */ -+ -+#define EI_MAG0 0 /* File identification byte 0 index */ -+#define ELFMAG0 0x7f /* Magic number byte 0 */ -+ -+#define EI_MAG1 1 /* File identification byte 1 index */ -+#define ELFMAG1 'E' /* Magic number byte 1 */ -+ -+#define EI_MAG2 2 /* File identification byte 2 index */ -+#define ELFMAG2 'L' /* Magic number byte 2 */ -+ -+#define EI_MAG3 3 /* File identification byte 3 index */ -+#define ELFMAG3 'F' /* Magic number byte 3 */ -+ -+/* Conglomeration of the identification bytes, for easy testing as a word. */ -+#define ELFMAG "\177ELF" -+#define SELFMAG 4 -+ -+#define EI_CLASS 4 /* File class byte index */ -+#define ELFCLASSNONE 0 /* Invalid class */ -+#define ELFCLASS32 1 /* 32-bit objects */ -+#define ELFCLASS64 2 /* 64-bit objects */ -+#define ELFCLASSNUM 3 -+ -+#define EI_DATA 5 /* Data encoding byte index */ -+#define ELFDATANONE 0 /* Invalid data encoding */ -+#define ELFDATA2LSB 1 /* 2's complement, little endian */ -+#define ELFDATA2MSB 2 /* 2's complement, big endian */ -+#define ELFDATANUM 3 -+ -+#define EI_VERSION 6 /* File version byte index */ -+ /* Value must be EV_CURRENT */ -+ -+#define EI_OSABI 7 /* OS ABI identification */ -+#define ELFOSABI_NONE 0 /* UNIX System V ABI */ -+#define ELFOSABI_SYSV 0 /* Alias. */ -+#define ELFOSABI_HPUX 1 /* HP-UX */ -+#define ELFOSABI_NETBSD 2 /* NetBSD. */ -+#define ELFOSABI_GNU 3 /* Object uses GNU ELF extensions. */ -+#define ELFOSABI_LINUX ELFOSABI_GNU /* Compatibility alias. */ -+#define ELFOSABI_SOLARIS 6 /* Sun Solaris. */ -+#define ELFOSABI_AIX 7 /* IBM AIX. */ -+#define ELFOSABI_IRIX 8 /* SGI Irix. */ -+#define ELFOSABI_FREEBSD 9 /* FreeBSD. */ -+#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */ -+#define ELFOSABI_MODESTO 11 /* Novell Modesto. */ -+#define ELFOSABI_OPENBSD 12 /* OpenBSD. */ -+#define ELFOSABI_ARM_AEABI 64 /* ARM EABI */ -+#define ELFOSABI_ARM 97 /* ARM */ -+#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ -+ -+#define EI_ABIVERSION 8 /* ABI version */ -+ -+#define EI_PAD 9 /* Byte index of padding bytes */ -+ -+/* Legal values for e_type (object file type). */ -+ -+#define ET_NONE 0 /* No file type */ -+#define ET_REL 1 /* Relocatable file */ -+#define ET_EXEC 2 /* Executable file */ -+#define ET_DYN 3 /* Shared object file */ -+#define ET_CORE 4 /* Core file */ -+#define ET_NUM 5 /* Number of defined types */ -+#define ET_LOOS 0xfe00 /* OS-specific range start */ -+#define ET_HIOS 0xfeff /* OS-specific range end */ -+#define ET_LOPROC 0xff00 /* Processor-specific range start */ -+#define ET_HIPROC 0xffff /* Processor-specific range end */ -+ -+/* Legal values for e_machine (architecture). */ -+ -+#define EM_NONE 0 /* No machine */ -+#define EM_M32 1 /* AT&T WE 32100 */ -+#define EM_SPARC 2 /* SUN SPARC */ -+#define EM_386 3 /* Intel 80386 */ -+#define EM_68K 4 /* Motorola m68k family */ -+#define EM_88K 5 /* Motorola m88k family */ -+#define EM_860 7 /* Intel 80860 */ -+#define EM_MIPS 8 /* MIPS R3000 big-endian */ -+#define EM_S370 9 /* IBM System/370 */ -+#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ -+ -+#define EM_PARISC 15 /* HPPA */ -+#define EM_VPP500 17 /* Fujitsu VPP500 */ -+#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ -+#define EM_960 19 /* Intel 80960 */ -+#define EM_PPC 20 /* PowerPC */ -+#define EM_PPC64 21 /* PowerPC 64-bit */ -+#define EM_S390 22 /* IBM S390 */ -+ -+#define EM_V800 36 /* NEC V800 series */ -+#define EM_FR20 37 /* Fujitsu FR20 */ -+#define EM_RH32 38 /* TRW RH-32 */ -+#define EM_RCE 39 /* Motorola RCE */ -+#define EM_ARM 40 /* ARM */ -+#define EM_FAKE_ALPHA 41 /* Digital Alpha */ -+#define EM_SH 42 /* Hitachi SH */ -+#define EM_SPARCV9 43 /* SPARC v9 64-bit */ -+#define EM_TRICORE 44 /* Siemens Tricore */ -+#define EM_ARC 45 /* Argonaut RISC Core */ -+#define EM_H8_300 46 /* Hitachi H8/300 */ -+#define EM_H8_300H 47 /* Hitachi H8/300H */ -+#define EM_H8S 48 /* Hitachi H8S */ -+#define EM_H8_500 49 /* Hitachi H8/500 */ -+#define EM_IA_64 50 /* Intel Merced */ -+#define EM_MIPS_X 51 /* Stanford MIPS-X */ -+#define EM_COLDFIRE 52 /* Motorola Coldfire */ -+#define EM_68HC12 53 /* Motorola M68HC12 */ -+#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/ -+#define EM_PCP 55 /* Siemens PCP */ -+#define EM_NCPU 56 /* Sony nCPU embeeded RISC */ -+#define EM_NDR1 57 /* Denso NDR1 microprocessor */ -+#define EM_STARCORE 58 /* Motorola Start*Core processor */ -+#define EM_ME16 59 /* Toyota ME16 processor */ -+#define EM_ST100 60 /* STMicroelectronic ST100 processor */ -+#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/ -+#define EM_X86_64 62 /* AMD x86-64 architecture */ -+#define EM_PDSP 63 /* Sony DSP Processor */ -+ -+#define EM_FX66 66 /* Siemens FX66 microcontroller */ -+#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */ -+#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */ -+#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */ -+#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */ -+#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */ -+#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */ -+#define EM_SVX 73 /* Silicon Graphics SVx */ -+#define EM_ST19 74 /* STMicroelectronics ST19 8 bit mc */ -+#define EM_VAX 75 /* Digital VAX */ -+#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ -+#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */ -+#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */ -+#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */ -+#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ -+#define EM_HUANY 81 /* Harvard University machine-independent object files */ -+#define EM_PRISM 82 /* SiTera Prism */ -+#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ -+#define EM_FR30 84 /* Fujitsu FR30 */ -+#define EM_D10V 85 /* Mitsubishi D10V */ -+#define EM_D30V 86 /* Mitsubishi D30V */ -+#define EM_V850 87 /* NEC v850 */ -+#define EM_M32R 88 /* Mitsubishi M32R */ -+#define EM_MN10300 89 /* Matsushita MN10300 */ -+#define EM_MN10200 90 /* Matsushita MN10200 */ -+#define EM_PJ 91 /* picoJava */ -+#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ -+#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ -+#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ -+#define EM_TILEPRO 188 /* Tilera TILEPro */ -+#define EM_TILEGX 191 /* Tilera TILE-Gx */ -+#define EM_NUM 192 -+ -+/* If it is necessary to assign new unofficial EM_* values, please -+ pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the -+ chances of collision with official or non-GNU unofficial values. */ -+ -+#define EM_ALPHA 0x9026 -+ -+/* Legal values for e_version (version). */ -+ -+#define EV_NONE 0 /* Invalid ELF version */ -+#define EV_CURRENT 1 /* Current version */ -+#define EV_NUM 2 -+ -+/* Section header. */ -+ -+typedef struct -+{ -+ Elf32_Word sh_name; /* Section name (string tbl index) */ -+ Elf32_Word sh_type; /* Section type */ -+ Elf32_Word sh_flags; /* Section flags */ -+ Elf32_Addr sh_addr; /* Section virtual addr at execution */ -+ Elf32_Off sh_offset; /* Section file offset */ -+ Elf32_Word sh_size; /* Section size in bytes */ -+ Elf32_Word sh_link; /* Link to another section */ -+ Elf32_Word sh_info; /* Additional section information */ -+ Elf32_Word sh_addralign; /* Section alignment */ -+ Elf32_Word sh_entsize; /* Entry size if section holds table */ -+} Elf32_Shdr; -+ -+typedef struct -+{ -+ Elf64_Word sh_name; /* Section name (string tbl index) */ -+ Elf64_Word sh_type; /* Section type */ -+ Elf64_Xword sh_flags; /* Section flags */ -+ Elf64_Addr sh_addr; /* Section virtual addr at execution */ -+ Elf64_Off sh_offset; /* Section file offset */ -+ Elf64_Xword sh_size; /* Section size in bytes */ -+ Elf64_Word sh_link; /* Link to another section */ -+ Elf64_Word sh_info; /* Additional section information */ -+ Elf64_Xword sh_addralign; /* Section alignment */ -+ Elf64_Xword sh_entsize; /* Entry size if section holds table */ -+} Elf64_Shdr; -+ -+/* Special section indices. */ -+ -+#define SHN_UNDEF 0 /* Undefined section */ -+#define SHN_LORESERVE 0xff00 /* Start of reserved indices */ -+#define SHN_LOPROC 0xff00 /* Start of processor-specific */ -+#define SHN_BEFORE 0xff00 /* Order section before all others -+ (Solaris). */ -+#define SHN_AFTER 0xff01 /* Order section after all others -+ (Solaris). */ -+#define SHN_HIPROC 0xff1f /* End of processor-specific */ -+#define SHN_LOOS 0xff20 /* Start of OS-specific */ -+#define SHN_HIOS 0xff3f /* End of OS-specific */ -+#define SHN_ABS 0xfff1 /* Associated symbol is absolute */ -+#define SHN_COMMON 0xfff2 /* Associated symbol is common */ -+#define SHN_XINDEX 0xffff /* Index is in extra table. */ -+#define SHN_HIRESERVE 0xffff /* End of reserved indices */ -+ -+/* Legal values for sh_type (section type). */ -+ -+#define SHT_NULL 0 /* Section header table entry unused */ -+#define SHT_PROGBITS 1 /* Program data */ -+#define SHT_SYMTAB 2 /* Symbol table */ -+#define SHT_STRTAB 3 /* String table */ -+#define SHT_RELA 4 /* Relocation entries with addends */ -+#define SHT_HASH 5 /* Symbol hash table */ -+#define SHT_DYNAMIC 6 /* Dynamic linking information */ -+#define SHT_NOTE 7 /* Notes */ -+#define SHT_NOBITS 8 /* Program space with no data (bss) */ -+#define SHT_REL 9 /* Relocation entries, no addends */ -+#define SHT_SHLIB 10 /* Reserved */ -+#define SHT_DYNSYM 11 /* Dynamic linker symbol table */ -+#define SHT_INIT_ARRAY 14 /* Array of constructors */ -+#define SHT_FINI_ARRAY 15 /* Array of destructors */ -+#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */ -+#define SHT_GROUP 17 /* Section group */ -+#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */ -+#define SHT_NUM 19 /* Number of defined types. */ -+#define SHT_LOOS 0x60000000 /* Start OS-specific. */ -+#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */ -+#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */ -+#define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */ -+#define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content. */ -+#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */ -+#define SHT_SUNW_move 0x6ffffffa -+#define SHT_SUNW_COMDAT 0x6ffffffb -+#define SHT_SUNW_syminfo 0x6ffffffc -+#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */ -+#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */ -+#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */ -+#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */ -+#define SHT_HIOS 0x6fffffff /* End OS-specific type */ -+#define SHT_LOPROC 0x70000000 /* Start of processor-specific */ -+#define SHT_HIPROC 0x7fffffff /* End of processor-specific */ -+#define SHT_LOUSER 0x80000000 /* Start of application-specific */ -+#define SHT_HIUSER 0x8fffffff /* End of application-specific */ -+ -+/* Legal values for sh_flags (section flags). */ -+ -+#define SHF_WRITE (1 << 0) /* Writable */ -+#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */ -+#define SHF_EXECINSTR (1 << 2) /* Executable */ -+#define SHF_MERGE (1 << 4) /* Might be merged */ -+#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */ -+#define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */ -+#define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */ -+#define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling -+ required */ -+#define SHF_GROUP (1 << 9) /* Section is member of a group. */ -+#define SHF_TLS (1 << 10) /* Section hold thread-local data. */ -+#define SHF_MASKOS 0x0ff00000 /* OS-specific. */ -+#define SHF_MASKPROC 0xf0000000 /* Processor-specific */ -+#define SHF_ORDERED (1 << 30) /* Special ordering requirement -+ (Solaris). */ -+#define SHF_EXCLUDE (1 << 31) /* Section is excluded unless -+ referenced or allocated (Solaris).*/ -+ -+/* Section group handling. */ -+#define GRP_COMDAT 0x1 /* Mark group as COMDAT. */ -+ -+/* Symbol table entry. */ -+ -+typedef struct -+{ -+ Elf32_Word st_name; /* Symbol name (string tbl index) */ -+ Elf32_Addr st_value; /* Symbol value */ -+ Elf32_Word st_size; /* Symbol size */ -+ unsigned char st_info; /* Symbol type and binding */ -+ unsigned char st_other; /* Symbol visibility */ -+ Elf32_Section st_shndx; /* Section index */ -+} Elf32_Sym; -+ -+typedef struct -+{ -+ Elf64_Word st_name; /* Symbol name (string tbl index) */ -+ unsigned char st_info; /* Symbol type and binding */ -+ unsigned char st_other; /* Symbol visibility */ -+ Elf64_Section st_shndx; /* Section index */ -+ Elf64_Addr st_value; /* Symbol value */ -+ Elf64_Xword st_size; /* Symbol size */ -+} Elf64_Sym; -+ -+/* The syminfo section if available contains additional information about -+ every dynamic symbol. */ -+ -+typedef struct -+{ -+ Elf32_Half si_boundto; /* Direct bindings, symbol bound to */ -+ Elf32_Half si_flags; /* Per symbol flags */ -+} Elf32_Syminfo; -+ -+typedef struct -+{ -+ Elf64_Half si_boundto; /* Direct bindings, symbol bound to */ -+ Elf64_Half si_flags; /* Per symbol flags */ -+} Elf64_Syminfo; -+ -+/* Possible values for si_boundto. */ -+#define SYMINFO_BT_SELF 0xffff /* Symbol bound to self */ -+#define SYMINFO_BT_PARENT 0xfffe /* Symbol bound to parent */ -+#define SYMINFO_BT_LOWRESERVE 0xff00 /* Beginning of reserved entries */ -+ -+/* Possible bitmasks for si_flags. */ -+#define SYMINFO_FLG_DIRECT 0x0001 /* Direct bound symbol */ -+#define SYMINFO_FLG_PASSTHRU 0x0002 /* Pass-thru symbol for translator */ -+#define SYMINFO_FLG_COPY 0x0004 /* Symbol is a copy-reloc */ -+#define SYMINFO_FLG_LAZYLOAD 0x0008 /* Symbol bound to object to be lazy -+ loaded */ -+/* Syminfo version values. */ -+#define SYMINFO_NONE 0 -+#define SYMINFO_CURRENT 1 -+#define SYMINFO_NUM 2 -+ -+ -+/* How to extract and insert information held in the st_info field. */ -+ -+#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4) -+#define ELF32_ST_TYPE(val) ((val) & 0xf) -+#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) -+ -+/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field. */ -+#define ELF64_ST_BIND(val) ELF32_ST_BIND (val) -+#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val) -+#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type)) -+ -+/* Legal values for ST_BIND subfield of st_info (symbol binding). */ -+ -+#define STB_LOCAL 0 /* Local symbol */ -+#define STB_GLOBAL 1 /* Global symbol */ -+#define STB_WEAK 2 /* Weak symbol */ -+#define STB_NUM 3 /* Number of defined types. */ -+#define STB_LOOS 10 /* Start of OS-specific */ -+#define STB_GNU_UNIQUE 10 /* Unique symbol. */ -+#define STB_HIOS 12 /* End of OS-specific */ -+#define STB_LOPROC 13 /* Start of processor-specific */ -+#define STB_HIPROC 15 /* End of processor-specific */ -+ -+/* Legal values for ST_TYPE subfield of st_info (symbol type). */ -+ -+#define STT_NOTYPE 0 /* Symbol type is unspecified */ -+#define STT_OBJECT 1 /* Symbol is a data object */ -+#define STT_FUNC 2 /* Symbol is a code object */ -+#define STT_SECTION 3 /* Symbol associated with a section */ -+#define STT_FILE 4 /* Symbol's name is file name */ -+#define STT_COMMON 5 /* Symbol is a common data object */ -+#define STT_TLS 6 /* Symbol is thread-local data object*/ -+#define STT_NUM 7 /* Number of defined types. */ -+#define STT_LOOS 10 /* Start of OS-specific */ -+#define STT_GNU_IFUNC 10 /* Symbol is indirect code object */ -+#define STT_HIOS 12 /* End of OS-specific */ -+#define STT_LOPROC 13 /* Start of processor-specific */ -+#define STT_HIPROC 15 /* End of processor-specific */ -+ -+ -+/* Symbol table indices are found in the hash buckets and chain table -+ of a symbol hash table section. This special index value indicates -+ the end of a chain, meaning no further symbols are found in that bucket. */ -+ -+#define STN_UNDEF 0 /* End of a chain. */ -+ -+ -+/* How to extract and insert information held in the st_other field. */ -+ -+#define ELF32_ST_VISIBILITY(o) ((o) & 0x03) -+ -+/* For ELF64 the definitions are the same. */ -+#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o) -+ -+/* Symbol visibility specification encoded in the st_other field. */ -+#define STV_DEFAULT 0 /* Default symbol visibility rules */ -+#define STV_INTERNAL 1 /* Processor specific hidden class */ -+#define STV_HIDDEN 2 /* Sym unavailable in other modules */ -+#define STV_PROTECTED 3 /* Not preemptible, not exported */ -+ -+ -+/* Relocation table entry without addend (in section of type SHT_REL). */ -+ -+typedef struct -+{ -+ Elf32_Addr r_offset; /* Address */ -+ Elf32_Word r_info; /* Relocation type and symbol index */ -+} Elf32_Rel; -+ -+/* I have seen two different definitions of the Elf64_Rel and -+ Elf64_Rela structures, so we'll leave them out until Novell (or -+ whoever) gets their act together. */ -+/* The following, at least, is used on Sparc v9, MIPS, and Alpha. */ -+ -+typedef struct -+{ -+ Elf64_Addr r_offset; /* Address */ -+ Elf64_Xword r_info; /* Relocation type and symbol index */ -+} Elf64_Rel; -+ -+/* Relocation table entry with addend (in section of type SHT_RELA). */ -+ -+typedef struct -+{ -+ Elf32_Addr r_offset; /* Address */ -+ Elf32_Word r_info; /* Relocation type and symbol index */ -+ Elf32_Sword r_addend; /* Addend */ -+} Elf32_Rela; -+ -+typedef struct -+{ -+ Elf64_Addr r_offset; /* Address */ -+ Elf64_Xword r_info; /* Relocation type and symbol index */ -+ Elf64_Sxword r_addend; /* Addend */ -+} Elf64_Rela; -+ -+/* How to extract and insert information held in the r_info field. */ -+ -+#define ELF32_R_SYM(val) ((val) >> 8) -+#define ELF32_R_TYPE(val) ((val) & 0xff) -+#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff)) -+ -+#define ELF64_R_SYM(i) ((i) >> 32) -+#define ELF64_R_TYPE(i) ((i) & 0xffffffff) -+#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type)) -+ -+/* Program segment header. */ -+ -+typedef struct -+{ -+ Elf32_Word p_type; /* Segment type */ -+ Elf32_Off p_offset; /* Segment file offset */ -+ Elf32_Addr p_vaddr; /* Segment virtual address */ -+ Elf32_Addr p_paddr; /* Segment physical address */ -+ Elf32_Word p_filesz; /* Segment size in file */ -+ Elf32_Word p_memsz; /* Segment size in memory */ -+ Elf32_Word p_flags; /* Segment flags */ -+ Elf32_Word p_align; /* Segment alignment */ -+} Elf32_Phdr; -+ -+typedef struct -+{ -+ Elf64_Word p_type; /* Segment type */ -+ Elf64_Word p_flags; /* Segment flags */ -+ Elf64_Off p_offset; /* Segment file offset */ -+ Elf64_Addr p_vaddr; /* Segment virtual address */ -+ Elf64_Addr p_paddr; /* Segment physical address */ -+ Elf64_Xword p_filesz; /* Segment size in file */ -+ Elf64_Xword p_memsz; /* Segment size in memory */ -+ Elf64_Xword p_align; /* Segment alignment */ -+} Elf64_Phdr; -+ -+/* Special value for e_phnum. This indicates that the real number of -+ program headers is too large to fit into e_phnum. Instead the real -+ value is in the field sh_info of section 0. */ -+ -+#define PN_XNUM 0xffff -+ -+/* Legal values for p_type (segment type). */ -+ -+#define PT_NULL 0 /* Program header table entry unused */ -+#define PT_LOAD 1 /* Loadable program segment */ -+#define PT_DYNAMIC 2 /* Dynamic linking information */ -+#define PT_INTERP 3 /* Program interpreter */ -+#define PT_NOTE 4 /* Auxiliary information */ -+#define PT_SHLIB 5 /* Reserved */ -+#define PT_PHDR 6 /* Entry for header table itself */ -+#define PT_TLS 7 /* Thread-local storage segment */ -+#define PT_NUM 8 /* Number of defined types */ -+#define PT_LOOS 0x60000000 /* Start of OS-specific */ -+#define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */ -+#define PT_GNU_STACK 0x6474e551 /* Indicates stack executability */ -+#define PT_GNU_RELRO 0x6474e552 /* Read-only after relocation */ -+#define PT_LOSUNW 0x6ffffffa -+#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */ -+#define PT_SUNWSTACK 0x6ffffffb /* Stack segment */ -+#define PT_HISUNW 0x6fffffff -+#define PT_HIOS 0x6fffffff /* End of OS-specific */ -+#define PT_LOPROC 0x70000000 /* Start of processor-specific */ -+#define PT_HIPROC 0x7fffffff /* End of processor-specific */ -+ -+/* Legal values for p_flags (segment flags). */ -+ -+#define PF_X (1 << 0) /* Segment is executable */ -+#define PF_W (1 << 1) /* Segment is writable */ -+#define PF_R (1 << 2) /* Segment is readable */ -+#define PF_MASKOS 0x0ff00000 /* OS-specific */ -+#define PF_MASKPROC 0xf0000000 /* Processor-specific */ -+ -+/* Legal values for note segment descriptor types for core files. */ -+ -+#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ -+#define NT_FPREGSET 2 /* Contains copy of fpregset struct */ -+#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ -+#define NT_PRXREG 4 /* Contains copy of prxregset struct */ -+#define NT_TASKSTRUCT 4 /* Contains copy of task structure */ -+#define NT_PLATFORM 5 /* String from sysinfo(SI_PLATFORM) */ -+#define NT_AUXV 6 /* Contains copy of auxv array */ -+#define NT_GWINDOWS 7 /* Contains copy of gwindows struct */ -+#define NT_ASRS 8 /* Contains copy of asrset struct */ -+#define NT_PSTATUS 10 /* Contains copy of pstatus struct */ -+#define NT_PSINFO 13 /* Contains copy of psinfo struct */ -+#define NT_PRCRED 14 /* Contains copy of prcred struct */ -+#define NT_UTSNAME 15 /* Contains copy of utsname struct */ -+#define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */ -+#define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */ -+#define NT_PRFPXREG 20 /* Contains copy of fprxregset struct */ -+#define NT_PRXFPREG 0x46e62b7f /* Contains copy of user_fxsr_struct */ -+#define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */ -+#define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */ -+#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ -+#define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */ -+#define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */ -+#define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */ -+ -+/* Legal values for the note segment descriptor types for object files. */ -+ -+#define NT_VERSION 1 /* Contains a version string. */ -+ -+ -+/* Dynamic section entry. */ -+ -+typedef struct -+{ -+ Elf32_Sword d_tag; /* Dynamic entry type */ -+ union -+ { -+ Elf32_Word d_val; /* Integer value */ -+ Elf32_Addr d_ptr; /* Address value */ -+ } d_un; -+} Elf32_Dyn; -+ -+typedef struct -+{ -+ Elf64_Sxword d_tag; /* Dynamic entry type */ -+ union -+ { -+ Elf64_Xword d_val; /* Integer value */ -+ Elf64_Addr d_ptr; /* Address value */ -+ } d_un; -+} Elf64_Dyn; -+ -+/* Legal values for d_tag (dynamic entry type). */ -+ -+#define DT_NULL 0 /* Marks end of dynamic section */ -+#define DT_NEEDED 1 /* Name of needed library */ -+#define DT_PLTRELSZ 2 /* Size in bytes of PLT relocs */ -+#define DT_PLTGOT 3 /* Processor defined value */ -+#define DT_HASH 4 /* Address of symbol hash table */ -+#define DT_STRTAB 5 /* Address of string table */ -+#define DT_SYMTAB 6 /* Address of symbol table */ -+#define DT_RELA 7 /* Address of Rela relocs */ -+#define DT_RELASZ 8 /* Total size of Rela relocs */ -+#define DT_RELAENT 9 /* Size of one Rela reloc */ -+#define DT_STRSZ 10 /* Size of string table */ -+#define DT_SYMENT 11 /* Size of one symbol table entry */ -+#define DT_INIT 12 /* Address of init function */ -+#define DT_FINI 13 /* Address of termination function */ -+#define DT_SONAME 14 /* Name of shared object */ -+#define DT_RPATH 15 /* Library search path (deprecated) */ -+#define DT_SYMBOLIC 16 /* Start symbol search here */ -+#define DT_REL 17 /* Address of Rel relocs */ -+#define DT_RELSZ 18 /* Total size of Rel relocs */ -+#define DT_RELENT 19 /* Size of one Rel reloc */ -+#define DT_PLTREL 20 /* Type of reloc in PLT */ -+#define DT_DEBUG 21 /* For debugging; unspecified */ -+#define DT_TEXTREL 22 /* Reloc might modify .text */ -+#define DT_JMPREL 23 /* Address of PLT relocs */ -+#define DT_BIND_NOW 24 /* Process relocations of object */ -+#define DT_INIT_ARRAY 25 /* Array with addresses of init fct */ -+#define DT_FINI_ARRAY 26 /* Array with addresses of fini fct */ -+#define DT_INIT_ARRAYSZ 27 /* Size in bytes of DT_INIT_ARRAY */ -+#define DT_FINI_ARRAYSZ 28 /* Size in bytes of DT_FINI_ARRAY */ -+#define DT_RUNPATH 29 /* Library search path */ -+#define DT_FLAGS 30 /* Flags for the object being loaded */ -+#define DT_ENCODING 32 /* Start of encoded range */ -+#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/ -+#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */ -+#define DT_NUM 34 /* Number used */ -+#define DT_LOOS 0x6000000d /* Start of OS-specific */ -+#define DT_HIOS 0x6ffff000 /* End of OS-specific */ -+#define DT_LOPROC 0x70000000 /* Start of processor-specific */ -+#define DT_HIPROC 0x7fffffff /* End of processor-specific */ -+#define DT_PROCNUM DT_MIPS_NUM /* Most used by any processor */ -+ -+/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the -+ Dyn.d_un.d_val field of the Elf*_Dyn structure. This follows Sun's -+ approach. */ -+#define DT_VALRNGLO 0x6ffffd00 -+#define DT_GNU_PRELINKED 0x6ffffdf5 /* Prelinking timestamp */ -+#define DT_GNU_CONFLICTSZ 0x6ffffdf6 /* Size of conflict section */ -+#define DT_GNU_LIBLISTSZ 0x6ffffdf7 /* Size of library list */ -+#define DT_CHECKSUM 0x6ffffdf8 -+#define DT_PLTPADSZ 0x6ffffdf9 -+#define DT_MOVEENT 0x6ffffdfa -+#define DT_MOVESZ 0x6ffffdfb -+#define DT_FEATURE_1 0x6ffffdfc /* Feature selection (DTF_*). */ -+#define DT_POSFLAG_1 0x6ffffdfd /* Flags for DT_* entries, effecting -+ the following DT_* entry. */ -+#define DT_SYMINSZ 0x6ffffdfe /* Size of syminfo table (in bytes) */ -+#define DT_SYMINENT 0x6ffffdff /* Entry size of syminfo */ -+#define DT_VALRNGHI 0x6ffffdff -+#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) /* Reverse order! */ -+#define DT_VALNUM 12 -+ -+/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the -+ Dyn.d_un.d_ptr field of the Elf*_Dyn structure. -+ -+ If any adjustment is made to the ELF object after it has been -+ built these entries will need to be adjusted. */ -+#define DT_ADDRRNGLO 0x6ffffe00 -+#define DT_GNU_HASH 0x6ffffef5 /* GNU-style hash table. */ -+#define DT_TLSDESC_PLT 0x6ffffef6 -+#define DT_TLSDESC_GOT 0x6ffffef7 -+#define DT_GNU_CONFLICT 0x6ffffef8 /* Start of conflict section */ -+#define DT_GNU_LIBLIST 0x6ffffef9 /* Library list */ -+#define DT_CONFIG 0x6ffffefa /* Configuration information. */ -+#define DT_DEPAUDIT 0x6ffffefb /* Dependency auditing. */ -+#define DT_AUDIT 0x6ffffefc /* Object auditing. */ -+#define DT_PLTPAD 0x6ffffefd /* PLT padding. */ -+#define DT_MOVETAB 0x6ffffefe /* Move table. */ -+#define DT_SYMINFO 0x6ffffeff /* Syminfo table. */ -+#define DT_ADDRRNGHI 0x6ffffeff -+#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag)) /* Reverse order! */ -+#define DT_ADDRNUM 11 -+ -+/* The versioning entry types. The next are defined as part of the -+ GNU extension. */ -+#define DT_VERSYM 0x6ffffff0 -+ -+#define DT_RELACOUNT 0x6ffffff9 -+#define DT_RELCOUNT 0x6ffffffa -+ -+/* These were chosen by Sun. */ -+#define DT_FLAGS_1 0x6ffffffb /* State flags, see DF_1_* below. */ -+#define DT_VERDEF 0x6ffffffc /* Address of version definition -+ table */ -+#define DT_VERDEFNUM 0x6ffffffd /* Number of version definitions */ -+#define DT_VERNEED 0x6ffffffe /* Address of table with needed -+ versions */ -+#define DT_VERNEEDNUM 0x6fffffff /* Number of needed versions */ -+#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */ -+#define DT_VERSIONTAGNUM 16 -+ -+/* Sun added these machine-independent extensions in the "processor-specific" -+ range. Be compatible. */ -+#define DT_AUXILIARY 0x7ffffffd /* Shared object to load before self */ -+#define DT_FILTER 0x7fffffff /* Shared object to get values from */ -+#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1) -+#define DT_EXTRANUM 3 -+ -+/* Values of `d_un.d_val' in the DT_FLAGS entry. */ -+#define DF_ORIGIN 0x00000001 /* Object may use DF_ORIGIN */ -+#define DF_SYMBOLIC 0x00000002 /* Symbol resolutions starts here */ -+#define DF_TEXTREL 0x00000004 /* Object contains text relocations */ -+#define DF_BIND_NOW 0x00000008 /* No lazy binding for this object */ -+#define DF_STATIC_TLS 0x00000010 /* Module uses the static TLS model */ -+ -+/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1 -+ entry in the dynamic section. */ -+#define DF_1_NOW 0x00000001 /* Set RTLD_NOW for this object. */ -+#define DF_1_GLOBAL 0x00000002 /* Set RTLD_GLOBAL for this object. */ -+#define DF_1_GROUP 0x00000004 /* Set RTLD_GROUP for this object. */ -+#define DF_1_NODELETE 0x00000008 /* Set RTLD_NODELETE for this object.*/ -+#define DF_1_LOADFLTR 0x00000010 /* Trigger filtee loading at runtime.*/ -+#define DF_1_INITFIRST 0x00000020 /* Set RTLD_INITFIRST for this object*/ -+#define DF_1_NOOPEN 0x00000040 /* Set RTLD_NOOPEN for this object. */ -+#define DF_1_ORIGIN 0x00000080 /* $ORIGIN must be handled. */ -+#define DF_1_DIRECT 0x00000100 /* Direct binding enabled. */ -+#define DF_1_TRANS 0x00000200 -+#define DF_1_INTERPOSE 0x00000400 /* Object is used to interpose. */ -+#define DF_1_NODEFLIB 0x00000800 /* Ignore default lib search path. */ -+#define DF_1_NODUMP 0x00001000 /* Object can't be dldump'ed. */ -+#define DF_1_CONFALT 0x00002000 /* Configuration alternative created.*/ -+#define DF_1_ENDFILTEE 0x00004000 /* Filtee terminates filters search. */ -+#define DF_1_DISPRELDNE 0x00008000 /* Disp reloc applied at build time. */ -+#define DF_1_DISPRELPND 0x00010000 /* Disp reloc applied at run-time. */ -+ -+/* Flags for the feature selection in DT_FEATURE_1. */ -+#define DTF_1_PARINIT 0x00000001 -+#define DTF_1_CONFEXP 0x00000002 -+ -+/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry. */ -+#define DF_P1_LAZYLOAD 0x00000001 /* Lazyload following object. */ -+#define DF_P1_GROUPPERM 0x00000002 /* Symbols from next object are not -+ generally available. */ -+ -+/* Version definition sections. */ -+ -+typedef struct -+{ -+ Elf32_Half vd_version; /* Version revision */ -+ Elf32_Half vd_flags; /* Version information */ -+ Elf32_Half vd_ndx; /* Version Index */ -+ Elf32_Half vd_cnt; /* Number of associated aux entries */ -+ Elf32_Word vd_hash; /* Version name hash value */ -+ Elf32_Word vd_aux; /* Offset in bytes to verdaux array */ -+ Elf32_Word vd_next; /* Offset in bytes to next verdef -+ entry */ -+} Elf32_Verdef; -+ -+typedef struct -+{ -+ Elf64_Half vd_version; /* Version revision */ -+ Elf64_Half vd_flags; /* Version information */ -+ Elf64_Half vd_ndx; /* Version Index */ -+ Elf64_Half vd_cnt; /* Number of associated aux entries */ -+ Elf64_Word vd_hash; /* Version name hash value */ -+ Elf64_Word vd_aux; /* Offset in bytes to verdaux array */ -+ Elf64_Word vd_next; /* Offset in bytes to next verdef -+ entry */ -+} Elf64_Verdef; -+ -+ -+/* Legal values for vd_version (version revision). */ -+#define VER_DEF_NONE 0 /* No version */ -+#define VER_DEF_CURRENT 1 /* Current version */ -+#define VER_DEF_NUM 2 /* Given version number */ -+ -+/* Legal values for vd_flags (version information flags). */ -+#define VER_FLG_BASE 0x1 /* Version definition of file itself */ -+#define VER_FLG_WEAK 0x2 /* Weak version identifier */ -+ -+/* Versym symbol index values. */ -+#define VER_NDX_LOCAL 0 /* Symbol is local. */ -+#define VER_NDX_GLOBAL 1 /* Symbol is global. */ -+#define VER_NDX_LORESERVE 0xff00 /* Beginning of reserved entries. */ -+#define VER_NDX_ELIMINATE 0xff01 /* Symbol is to be eliminated. */ -+ -+/* Auxialiary version information. */ -+ -+typedef struct -+{ -+ Elf32_Word vda_name; /* Version or dependency names */ -+ Elf32_Word vda_next; /* Offset in bytes to next verdaux -+ entry */ -+} Elf32_Verdaux; -+ -+typedef struct -+{ -+ Elf64_Word vda_name; /* Version or dependency names */ -+ Elf64_Word vda_next; /* Offset in bytes to next verdaux -+ entry */ -+} Elf64_Verdaux; -+ -+ -+/* Version dependency section. */ -+ -+typedef struct -+{ -+ Elf32_Half vn_version; /* Version of structure */ -+ Elf32_Half vn_cnt; /* Number of associated aux entries */ -+ Elf32_Word vn_file; /* Offset of filename for this -+ dependency */ -+ Elf32_Word vn_aux; /* Offset in bytes to vernaux array */ -+ Elf32_Word vn_next; /* Offset in bytes to next verneed -+ entry */ -+} Elf32_Verneed; -+ -+typedef struct -+{ -+ Elf64_Half vn_version; /* Version of structure */ -+ Elf64_Half vn_cnt; /* Number of associated aux entries */ -+ Elf64_Word vn_file; /* Offset of filename for this -+ dependency */ -+ Elf64_Word vn_aux; /* Offset in bytes to vernaux array */ -+ Elf64_Word vn_next; /* Offset in bytes to next verneed -+ entry */ -+} Elf64_Verneed; -+ -+ -+/* Legal values for vn_version (version revision). */ -+#define VER_NEED_NONE 0 /* No version */ -+#define VER_NEED_CURRENT 1 /* Current version */ -+#define VER_NEED_NUM 2 /* Given version number */ -+ -+/* Auxiliary needed version information. */ -+ -+typedef struct -+{ -+ Elf32_Word vna_hash; /* Hash value of dependency name */ -+ Elf32_Half vna_flags; /* Dependency specific information */ -+ Elf32_Half vna_other; /* Unused */ -+ Elf32_Word vna_name; /* Dependency name string offset */ -+ Elf32_Word vna_next; /* Offset in bytes to next vernaux -+ entry */ -+} Elf32_Vernaux; -+ -+typedef struct -+{ -+ Elf64_Word vna_hash; /* Hash value of dependency name */ -+ Elf64_Half vna_flags; /* Dependency specific information */ -+ Elf64_Half vna_other; /* Unused */ -+ Elf64_Word vna_name; /* Dependency name string offset */ -+ Elf64_Word vna_next; /* Offset in bytes to next vernaux -+ entry */ -+} Elf64_Vernaux; -+ -+ -+/* Legal values for vna_flags. */ -+#define VER_FLG_WEAK 0x2 /* Weak version identifier */ -+ -+ -+/* Auxiliary vector. */ -+ -+/* This vector is normally only used by the program interpreter. The -+ usual definition in an ABI supplement uses the name auxv_t. The -+ vector is not usually defined in a standard file, but it -+ can't hurt. We rename it to avoid conflicts. The sizes of these -+ types are an arrangement between the exec server and the program -+ interpreter, so we don't fully specify them here. */ -+ -+typedef struct -+{ -+ uint32_t a_type; /* Entry type */ -+ union -+ { -+ uint32_t a_val; /* Integer value */ -+ /* We use to have pointer elements added here. We cannot do that, -+ though, since it does not work when using 32-bit definitions -+ on 64-bit platforms and vice versa. */ -+ } a_un; -+} Elf32_auxv_t; -+ -+typedef struct -+{ -+ uint64_t a_type; /* Entry type */ -+ union -+ { -+ uint64_t a_val; /* Integer value */ -+ /* We use to have pointer elements added here. We cannot do that, -+ though, since it does not work when using 32-bit definitions -+ on 64-bit platforms and vice versa. */ -+ } a_un; -+} Elf64_auxv_t; -+ -+/* Legal values for a_type (entry type). */ -+ -+#define AT_NULL 0 /* End of vector */ -+#define AT_IGNORE 1 /* Entry should be ignored */ -+#define AT_EXECFD 2 /* File descriptor of program */ -+#define AT_PHDR 3 /* Program headers for program */ -+#define AT_PHENT 4 /* Size of program header entry */ -+#define AT_PHNUM 5 /* Number of program headers */ -+#define AT_PAGESZ 6 /* System page size */ -+#define AT_BASE 7 /* Base address of interpreter */ -+#define AT_FLAGS 8 /* Flags */ -+#define AT_ENTRY 9 /* Entry point of program */ -+#define AT_NOTELF 10 /* Program is not ELF */ -+#define AT_UID 11 /* Real uid */ -+#define AT_EUID 12 /* Effective uid */ -+#define AT_GID 13 /* Real gid */ -+#define AT_EGID 14 /* Effective gid */ -+#define AT_CLKTCK 17 /* Frequency of times() */ -+ -+/* Some more special a_type values describing the hardware. */ -+#define AT_PLATFORM 15 /* String identifying platform. */ -+#define AT_HWCAP 16 /* Machine dependent hints about -+ processor capabilities. */ -+ -+/* This entry gives some information about the FPU initialization -+ performed by the kernel. */ -+#define AT_FPUCW 18 /* Used FPU control word. */ -+ -+/* Cache block sizes. */ -+#define AT_DCACHEBSIZE 19 /* Data cache block size. */ -+#define AT_ICACHEBSIZE 20 /* Instruction cache block size. */ -+#define AT_UCACHEBSIZE 21 /* Unified cache block size. */ -+ -+/* A special ignored value for PPC, used by the kernel to control the -+ interpretation of the AUXV. Must be > 16. */ -+#define AT_IGNOREPPC 22 /* Entry should be ignored. */ -+ -+#define AT_SECURE 23 /* Boolean, was exec setuid-like? */ -+ -+#define AT_BASE_PLATFORM 24 /* String identifying real platforms.*/ -+ -+#define AT_RANDOM 25 /* Address of 16 random bytes. */ -+ -+#define AT_EXECFN 31 /* Filename of executable. */ -+ -+/* Pointer to the global system page used for system calls and other -+ nice things. */ -+#define AT_SYSINFO 32 -+#define AT_SYSINFO_EHDR 33 -+ -+/* Shapes of the caches. Bits 0-3 contains associativity; bits 4-7 contains -+ log2 of line size; mask those to get cache size. */ -+#define AT_L1I_CACHESHAPE 34 -+#define AT_L1D_CACHESHAPE 35 -+#define AT_L2_CACHESHAPE 36 -+#define AT_L3_CACHESHAPE 37 -+ -+/* Note section contents. Each entry in the note section begins with -+ a header of a fixed form. */ -+ -+typedef struct -+{ -+ Elf32_Word n_namesz; /* Length of the note's name. */ -+ Elf32_Word n_descsz; /* Length of the note's descriptor. */ -+ Elf32_Word n_type; /* Type of the note. */ -+} Elf32_Nhdr; -+ -+typedef struct -+{ -+ Elf64_Word n_namesz; /* Length of the note's name. */ -+ Elf64_Word n_descsz; /* Length of the note's descriptor. */ -+ Elf64_Word n_type; /* Type of the note. */ -+} Elf64_Nhdr; -+ -+/* Known names of notes. */ -+ -+/* Solaris entries in the note section have this name. */ -+#define ELF_NOTE_SOLARIS "SUNW Solaris" -+ -+/* Note entries for GNU systems have this name. */ -+#define ELF_NOTE_GNU "GNU" -+ -+ -+/* Defined types of notes for Solaris. */ -+ -+/* Value of descriptor (one word) is desired pagesize for the binary. */ -+#define ELF_NOTE_PAGESIZE_HINT 1 -+ -+ -+/* Defined note types for GNU systems. */ -+ -+/* ABI information. The descriptor consists of words: -+ word 0: OS descriptor -+ word 1: major version of the ABI -+ word 2: minor version of the ABI -+ word 3: subminor version of the ABI -+*/ -+#define NT_GNU_ABI_TAG 1 -+#define ELF_NOTE_ABI NT_GNU_ABI_TAG /* Old name. */ -+ -+/* Known OSes. These values can appear in word 0 of an -+ NT_GNU_ABI_TAG note section entry. */ -+#define ELF_NOTE_OS_LINUX 0 -+#define ELF_NOTE_OS_GNU 1 -+#define ELF_NOTE_OS_SOLARIS2 2 -+#define ELF_NOTE_OS_FREEBSD 3 -+ -+/* Synthetic hwcap information. The descriptor begins with two words: -+ word 0: number of entries -+ word 1: bitmask of enabled entries -+ Then follow variable-length entries, one byte followed by a -+ '\0'-terminated hwcap name string. The byte gives the bit -+ number to test if enabled, (1U << bit) & bitmask. */ -+#define NT_GNU_HWCAP 2 -+ -+/* Build ID bits as generated by ld --build-id. -+ The descriptor consists of any nonzero number of bytes. */ -+#define NT_GNU_BUILD_ID 3 -+ -+/* Version note generated by GNU gold containing a version string. */ -+#define NT_GNU_GOLD_VERSION 4 -+ -+ -+/* Move records. */ -+typedef struct -+{ -+ Elf32_Xword m_value; /* Symbol value. */ -+ Elf32_Word m_info; /* Size and index. */ -+ Elf32_Word m_poffset; /* Symbol offset. */ -+ Elf32_Half m_repeat; /* Repeat count. */ -+ Elf32_Half m_stride; /* Stride info. */ -+} Elf32_Move; -+ -+typedef struct -+{ -+ Elf64_Xword m_value; /* Symbol value. */ -+ Elf64_Xword m_info; /* Size and index. */ -+ Elf64_Xword m_poffset; /* Symbol offset. */ -+ Elf64_Half m_repeat; /* Repeat count. */ -+ Elf64_Half m_stride; /* Stride info. */ -+} Elf64_Move; -+ -+/* Macro to construct move records. */ -+#define ELF32_M_SYM(info) ((info) >> 8) -+#define ELF32_M_SIZE(info) ((unsigned char) (info)) -+#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size)) -+ -+#define ELF64_M_SYM(info) ELF32_M_SYM (info) -+#define ELF64_M_SIZE(info) ELF32_M_SIZE (info) -+#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size) -+ -+ -+/* Motorola 68k specific definitions. */ -+ -+/* Values for Elf32_Ehdr.e_flags. */ -+#define EF_CPU32 0x00810000 -+ -+/* m68k relocs. */ -+ -+#define R_68K_NONE 0 /* No reloc */ -+#define R_68K_32 1 /* Direct 32 bit */ -+#define R_68K_16 2 /* Direct 16 bit */ -+#define R_68K_8 3 /* Direct 8 bit */ -+#define R_68K_PC32 4 /* PC relative 32 bit */ -+#define R_68K_PC16 5 /* PC relative 16 bit */ -+#define R_68K_PC8 6 /* PC relative 8 bit */ -+#define R_68K_GOT32 7 /* 32 bit PC relative GOT entry */ -+#define R_68K_GOT16 8 /* 16 bit PC relative GOT entry */ -+#define R_68K_GOT8 9 /* 8 bit PC relative GOT entry */ -+#define R_68K_GOT32O 10 /* 32 bit GOT offset */ -+#define R_68K_GOT16O 11 /* 16 bit GOT offset */ -+#define R_68K_GOT8O 12 /* 8 bit GOT offset */ -+#define R_68K_PLT32 13 /* 32 bit PC relative PLT address */ -+#define R_68K_PLT16 14 /* 16 bit PC relative PLT address */ -+#define R_68K_PLT8 15 /* 8 bit PC relative PLT address */ -+#define R_68K_PLT32O 16 /* 32 bit PLT offset */ -+#define R_68K_PLT16O 17 /* 16 bit PLT offset */ -+#define R_68K_PLT8O 18 /* 8 bit PLT offset */ -+#define R_68K_COPY 19 /* Copy symbol at runtime */ -+#define R_68K_GLOB_DAT 20 /* Create GOT entry */ -+#define R_68K_JMP_SLOT 21 /* Create PLT entry */ -+#define R_68K_RELATIVE 22 /* Adjust by program base */ -+#define R_68K_TLS_GD32 25 /* 32 bit GOT offset for GD */ -+#define R_68K_TLS_GD16 26 /* 16 bit GOT offset for GD */ -+#define R_68K_TLS_GD8 27 /* 8 bit GOT offset for GD */ -+#define R_68K_TLS_LDM32 28 /* 32 bit GOT offset for LDM */ -+#define R_68K_TLS_LDM16 29 /* 16 bit GOT offset for LDM */ -+#define R_68K_TLS_LDM8 30 /* 8 bit GOT offset for LDM */ -+#define R_68K_TLS_LDO32 31 /* 32 bit module-relative offset */ -+#define R_68K_TLS_LDO16 32 /* 16 bit module-relative offset */ -+#define R_68K_TLS_LDO8 33 /* 8 bit module-relative offset */ -+#define R_68K_TLS_IE32 34 /* 32 bit GOT offset for IE */ -+#define R_68K_TLS_IE16 35 /* 16 bit GOT offset for IE */ -+#define R_68K_TLS_IE8 36 /* 8 bit GOT offset for IE */ -+#define R_68K_TLS_LE32 37 /* 32 bit offset relative to -+ static TLS block */ -+#define R_68K_TLS_LE16 38 /* 16 bit offset relative to -+ static TLS block */ -+#define R_68K_TLS_LE8 39 /* 8 bit offset relative to -+ static TLS block */ -+#define R_68K_TLS_DTPMOD32 40 /* 32 bit module number */ -+#define R_68K_TLS_DTPREL32 41 /* 32 bit module-relative offset */ -+#define R_68K_TLS_TPREL32 42 /* 32 bit TP-relative offset */ -+/* Keep this the last entry. */ -+#define R_68K_NUM 43 -+ -+/* Intel 80386 specific definitions. */ -+ -+/* i386 relocs. */ -+ -+#define R_386_NONE 0 /* No reloc */ -+#define R_386_32 1 /* Direct 32 bit */ -+#define R_386_PC32 2 /* PC relative 32 bit */ -+#define R_386_GOT32 3 /* 32 bit GOT entry */ -+#define R_386_PLT32 4 /* 32 bit PLT address */ -+#define R_386_COPY 5 /* Copy symbol at runtime */ -+#define R_386_GLOB_DAT 6 /* Create GOT entry */ -+#define R_386_JMP_SLOT 7 /* Create PLT entry */ -+#define R_386_RELATIVE 8 /* Adjust by program base */ -+#define R_386_GOTOFF 9 /* 32 bit offset to GOT */ -+#define R_386_GOTPC 10 /* 32 bit PC relative offset to GOT */ -+#define R_386_32PLT 11 -+#define R_386_TLS_TPOFF 14 /* Offset in static TLS block */ -+#define R_386_TLS_IE 15 /* Address of GOT entry for static TLS -+ block offset */ -+#define R_386_TLS_GOTIE 16 /* GOT entry for static TLS block -+ offset */ -+#define R_386_TLS_LE 17 /* Offset relative to static TLS -+ block */ -+#define R_386_TLS_GD 18 /* Direct 32 bit for GNU version of -+ general dynamic thread local data */ -+#define R_386_TLS_LDM 19 /* Direct 32 bit for GNU version of -+ local dynamic thread local data -+ in LE code */ -+#define R_386_16 20 -+#define R_386_PC16 21 -+#define R_386_8 22 -+#define R_386_PC8 23 -+#define R_386_TLS_GD_32 24 /* Direct 32 bit for general dynamic -+ thread local data */ -+#define R_386_TLS_GD_PUSH 25 /* Tag for pushl in GD TLS code */ -+#define R_386_TLS_GD_CALL 26 /* Relocation for call to -+ __tls_get_addr() */ -+#define R_386_TLS_GD_POP 27 /* Tag for popl in GD TLS code */ -+#define R_386_TLS_LDM_32 28 /* Direct 32 bit for local dynamic -+ thread local data in LE code */ -+#define R_386_TLS_LDM_PUSH 29 /* Tag for pushl in LDM TLS code */ -+#define R_386_TLS_LDM_CALL 30 /* Relocation for call to -+ __tls_get_addr() in LDM code */ -+#define R_386_TLS_LDM_POP 31 /* Tag for popl in LDM TLS code */ -+#define R_386_TLS_LDO_32 32 /* Offset relative to TLS block */ -+#define R_386_TLS_IE_32 33 /* GOT entry for negated static TLS -+ block offset */ -+#define R_386_TLS_LE_32 34 /* Negated offset relative to static -+ TLS block */ -+#define R_386_TLS_DTPMOD32 35 /* ID of module containing symbol */ -+#define R_386_TLS_DTPOFF32 36 /* Offset in TLS block */ -+#define R_386_TLS_TPOFF32 37 /* Negated offset in static TLS block */ -+/* 38? */ -+#define R_386_TLS_GOTDESC 39 /* GOT offset for TLS descriptor. */ -+#define R_386_TLS_DESC_CALL 40 /* Marker of call through TLS -+ descriptor for -+ relaxation. */ -+#define R_386_TLS_DESC 41 /* TLS descriptor containing -+ pointer to code and to -+ argument, returning the TLS -+ offset for the symbol. */ -+#define R_386_IRELATIVE 42 /* Adjust indirectly by program base */ -+/* Keep this the last entry. */ -+#define R_386_NUM 43 -+ -+/* SUN SPARC specific definitions. */ -+ -+/* Legal values for ST_TYPE subfield of st_info (symbol type). */ -+ -+#define STT_SPARC_REGISTER 13 /* Global register reserved to app. */ -+ -+/* Values for Elf64_Ehdr.e_flags. */ -+ -+#define EF_SPARCV9_MM 3 -+#define EF_SPARCV9_TSO 0 -+#define EF_SPARCV9_PSO 1 -+#define EF_SPARCV9_RMO 2 -+#define EF_SPARC_LEDATA 0x800000 /* little endian data */ -+#define EF_SPARC_EXT_MASK 0xFFFF00 -+#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */ -+#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */ -+#define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */ -+#define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */ -+ -+/* SPARC relocs. */ -+ -+#define R_SPARC_NONE 0 /* No reloc */ -+#define R_SPARC_8 1 /* Direct 8 bit */ -+#define R_SPARC_16 2 /* Direct 16 bit */ -+#define R_SPARC_32 3 /* Direct 32 bit */ -+#define R_SPARC_DISP8 4 /* PC relative 8 bit */ -+#define R_SPARC_DISP16 5 /* PC relative 16 bit */ -+#define R_SPARC_DISP32 6 /* PC relative 32 bit */ -+#define R_SPARC_WDISP30 7 /* PC relative 30 bit shifted */ -+#define R_SPARC_WDISP22 8 /* PC relative 22 bit shifted */ -+#define R_SPARC_HI22 9 /* High 22 bit */ -+#define R_SPARC_22 10 /* Direct 22 bit */ -+#define R_SPARC_13 11 /* Direct 13 bit */ -+#define R_SPARC_LO10 12 /* Truncated 10 bit */ -+#define R_SPARC_GOT10 13 /* Truncated 10 bit GOT entry */ -+#define R_SPARC_GOT13 14 /* 13 bit GOT entry */ -+#define R_SPARC_GOT22 15 /* 22 bit GOT entry shifted */ -+#define R_SPARC_PC10 16 /* PC relative 10 bit truncated */ -+#define R_SPARC_PC22 17 /* PC relative 22 bit shifted */ -+#define R_SPARC_WPLT30 18 /* 30 bit PC relative PLT address */ -+#define R_SPARC_COPY 19 /* Copy symbol at runtime */ -+#define R_SPARC_GLOB_DAT 20 /* Create GOT entry */ -+#define R_SPARC_JMP_SLOT 21 /* Create PLT entry */ -+#define R_SPARC_RELATIVE 22 /* Adjust by program base */ -+#define R_SPARC_UA32 23 /* Direct 32 bit unaligned */ -+ -+/* Additional Sparc64 relocs. */ -+ -+#define R_SPARC_PLT32 24 /* Direct 32 bit ref to PLT entry */ -+#define R_SPARC_HIPLT22 25 /* High 22 bit PLT entry */ -+#define R_SPARC_LOPLT10 26 /* Truncated 10 bit PLT entry */ -+#define R_SPARC_PCPLT32 27 /* PC rel 32 bit ref to PLT entry */ -+#define R_SPARC_PCPLT22 28 /* PC rel high 22 bit PLT entry */ -+#define R_SPARC_PCPLT10 29 /* PC rel trunc 10 bit PLT entry */ -+#define R_SPARC_10 30 /* Direct 10 bit */ -+#define R_SPARC_11 31 /* Direct 11 bit */ -+#define R_SPARC_64 32 /* Direct 64 bit */ -+#define R_SPARC_OLO10 33 /* 10bit with secondary 13bit addend */ -+#define R_SPARC_HH22 34 /* Top 22 bits of direct 64 bit */ -+#define R_SPARC_HM10 35 /* High middle 10 bits of ... */ -+#define R_SPARC_LM22 36 /* Low middle 22 bits of ... */ -+#define R_SPARC_PC_HH22 37 /* Top 22 bits of pc rel 64 bit */ -+#define R_SPARC_PC_HM10 38 /* High middle 10 bit of ... */ -+#define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */ -+#define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */ -+#define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */ -+#define R_SPARC_GLOB_JMP 42 /* was part of v9 ABI but was removed */ -+#define R_SPARC_7 43 /* Direct 7 bit */ -+#define R_SPARC_5 44 /* Direct 5 bit */ -+#define R_SPARC_6 45 /* Direct 6 bit */ -+#define R_SPARC_DISP64 46 /* PC relative 64 bit */ -+#define R_SPARC_PLT64 47 /* Direct 64 bit ref to PLT entry */ -+#define R_SPARC_HIX22 48 /* High 22 bit complemented */ -+#define R_SPARC_LOX10 49 /* Truncated 11 bit complemented */ -+#define R_SPARC_H44 50 /* Direct high 12 of 44 bit */ -+#define R_SPARC_M44 51 /* Direct mid 22 of 44 bit */ -+#define R_SPARC_L44 52 /* Direct low 10 of 44 bit */ -+#define R_SPARC_REGISTER 53 /* Global register usage */ -+#define R_SPARC_UA64 54 /* Direct 64 bit unaligned */ -+#define R_SPARC_UA16 55 /* Direct 16 bit unaligned */ -+#define R_SPARC_TLS_GD_HI22 56 -+#define R_SPARC_TLS_GD_LO10 57 -+#define R_SPARC_TLS_GD_ADD 58 -+#define R_SPARC_TLS_GD_CALL 59 -+#define R_SPARC_TLS_LDM_HI22 60 -+#define R_SPARC_TLS_LDM_LO10 61 -+#define R_SPARC_TLS_LDM_ADD 62 -+#define R_SPARC_TLS_LDM_CALL 63 -+#define R_SPARC_TLS_LDO_HIX22 64 -+#define R_SPARC_TLS_LDO_LOX10 65 -+#define R_SPARC_TLS_LDO_ADD 66 -+#define R_SPARC_TLS_IE_HI22 67 -+#define R_SPARC_TLS_IE_LO10 68 -+#define R_SPARC_TLS_IE_LD 69 -+#define R_SPARC_TLS_IE_LDX 70 -+#define R_SPARC_TLS_IE_ADD 71 -+#define R_SPARC_TLS_LE_HIX22 72 -+#define R_SPARC_TLS_LE_LOX10 73 -+#define R_SPARC_TLS_DTPMOD32 74 -+#define R_SPARC_TLS_DTPMOD64 75 -+#define R_SPARC_TLS_DTPOFF32 76 -+#define R_SPARC_TLS_DTPOFF64 77 -+#define R_SPARC_TLS_TPOFF32 78 -+#define R_SPARC_TLS_TPOFF64 79 -+#define R_SPARC_GOTDATA_HIX22 80 -+#define R_SPARC_GOTDATA_LOX10 81 -+#define R_SPARC_GOTDATA_OP_HIX22 82 -+#define R_SPARC_GOTDATA_OP_LOX10 83 -+#define R_SPARC_GOTDATA_OP 84 -+#define R_SPARC_H34 85 -+#define R_SPARC_SIZE32 86 -+#define R_SPARC_SIZE64 87 -+#define R_SPARC_WDISP10 88 -+#define R_SPARC_JMP_IREL 248 -+#define R_SPARC_IRELATIVE 249 -+#define R_SPARC_GNU_VTINHERIT 250 -+#define R_SPARC_GNU_VTENTRY 251 -+#define R_SPARC_REV32 252 -+/* Keep this the last entry. */ -+#define R_SPARC_NUM 253 -+ -+/* For Sparc64, legal values for d_tag of Elf64_Dyn. */ -+ -+#define DT_SPARC_REGISTER 0x70000001 -+#define DT_SPARC_NUM 2 -+ -+/* MIPS R3000 specific definitions. */ -+ -+/* Legal values for e_flags field of Elf32_Ehdr. */ -+ -+#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used */ -+#define EF_MIPS_PIC 2 /* Contains PIC code */ -+#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence */ -+#define EF_MIPS_XGOT 8 -+#define EF_MIPS_64BIT_WHIRL 16 -+#define EF_MIPS_ABI2 32 -+#define EF_MIPS_ABI_ON32 64 -+#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level */ -+ -+/* Legal values for MIPS architecture level. */ -+ -+#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ -+#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ -+#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ -+#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ -+#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ -+#define EF_MIPS_ARCH_32 0x60000000 /* MIPS32 code. */ -+#define EF_MIPS_ARCH_64 0x70000000 /* MIPS64 code. */ -+ -+/* The following are non-official names and should not be used. */ -+ -+#define E_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ -+#define E_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ -+#define E_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ -+#define E_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ -+#define E_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ -+#define E_MIPS_ARCH_32 0x60000000 /* MIPS32 code. */ -+#define E_MIPS_ARCH_64 0x70000000 /* MIPS64 code. */ -+ -+/* Special section indices. */ -+ -+#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols */ -+#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */ -+#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */ -+#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols */ -+#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols */ -+ -+/* Legal values for sh_type field of Elf32_Shdr. */ -+ -+#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link */ -+#define SHT_MIPS_MSYM 0x70000001 -+#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols */ -+#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes */ -+#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */ -+#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging information*/ -+#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information */ -+#define SHT_MIPS_PACKAGE 0x70000007 -+#define SHT_MIPS_PACKSYM 0x70000008 -+#define SHT_MIPS_RELD 0x70000009 -+#define SHT_MIPS_IFACE 0x7000000b -+#define SHT_MIPS_CONTENT 0x7000000c -+#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */ -+#define SHT_MIPS_SHDR 0x70000010 -+#define SHT_MIPS_FDESC 0x70000011 -+#define SHT_MIPS_EXTSYM 0x70000012 -+#define SHT_MIPS_DENSE 0x70000013 -+#define SHT_MIPS_PDESC 0x70000014 -+#define SHT_MIPS_LOCSYM 0x70000015 -+#define SHT_MIPS_AUXSYM 0x70000016 -+#define SHT_MIPS_OPTSYM 0x70000017 -+#define SHT_MIPS_LOCSTR 0x70000018 -+#define SHT_MIPS_LINE 0x70000019 -+#define SHT_MIPS_RFDESC 0x7000001a -+#define SHT_MIPS_DELTASYM 0x7000001b -+#define SHT_MIPS_DELTAINST 0x7000001c -+#define SHT_MIPS_DELTACLASS 0x7000001d -+#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */ -+#define SHT_MIPS_DELTADECL 0x7000001f -+#define SHT_MIPS_SYMBOL_LIB 0x70000020 -+#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */ -+#define SHT_MIPS_TRANSLATE 0x70000022 -+#define SHT_MIPS_PIXIE 0x70000023 -+#define SHT_MIPS_XLATE 0x70000024 -+#define SHT_MIPS_XLATE_DEBUG 0x70000025 -+#define SHT_MIPS_WHIRL 0x70000026 -+#define SHT_MIPS_EH_REGION 0x70000027 -+#define SHT_MIPS_XLATE_OLD 0x70000028 -+#define SHT_MIPS_PDR_EXCEPTION 0x70000029 -+ -+/* Legal values for sh_flags field of Elf32_Shdr. */ -+ -+#define SHF_MIPS_GPREL 0x10000000 /* Must be part of global data area */ -+#define SHF_MIPS_MERGE 0x20000000 -+#define SHF_MIPS_ADDR 0x40000000 -+#define SHF_MIPS_STRINGS 0x80000000 -+#define SHF_MIPS_NOSTRIP 0x08000000 -+#define SHF_MIPS_LOCAL 0x04000000 -+#define SHF_MIPS_NAMES 0x02000000 -+#define SHF_MIPS_NODUPE 0x01000000 -+ -+ -+/* Symbol tables. */ -+ -+/* MIPS specific values for `st_other'. */ -+#define STO_MIPS_DEFAULT 0x0 -+#define STO_MIPS_INTERNAL 0x1 -+#define STO_MIPS_HIDDEN 0x2 -+#define STO_MIPS_PROTECTED 0x3 -+#define STO_MIPS_PLT 0x8 -+#define STO_MIPS_SC_ALIGN_UNUSED 0xff -+ -+/* MIPS specific values for `st_info'. */ -+#define STB_MIPS_SPLIT_COMMON 13 -+ -+/* Entries found in sections of type SHT_MIPS_GPTAB. */ -+ -+typedef union -+{ -+ struct -+ { -+ Elf32_Word gt_current_g_value; /* -G value used for compilation */ -+ Elf32_Word gt_unused; /* Not used */ -+ } gt_header; /* First entry in section */ -+ struct -+ { -+ Elf32_Word gt_g_value; /* If this value were used for -G */ -+ Elf32_Word gt_bytes; /* This many bytes would be used */ -+ } gt_entry; /* Subsequent entries in section */ -+} Elf32_gptab; -+ -+/* Entry found in sections of type SHT_MIPS_REGINFO. */ -+ -+typedef struct -+{ -+ Elf32_Word ri_gprmask; /* General registers used */ -+ Elf32_Word ri_cprmask[4]; /* Coprocessor registers used */ -+ Elf32_Sword ri_gp_value; /* $gp register value */ -+} Elf32_RegInfo; -+ -+/* Entries found in sections of type SHT_MIPS_OPTIONS. */ -+ -+typedef struct -+{ -+ unsigned char kind; /* Determines interpretation of the -+ variable part of descriptor. */ -+ unsigned char size; /* Size of descriptor, including header. */ -+ Elf32_Section section; /* Section header index of section affected, -+ 0 for global options. */ -+ Elf32_Word info; /* Kind-specific information. */ -+} Elf_Options; -+ -+/* Values for `kind' field in Elf_Options. */ -+ -+#define ODK_NULL 0 /* Undefined. */ -+#define ODK_REGINFO 1 /* Register usage information. */ -+#define ODK_EXCEPTIONS 2 /* Exception processing options. */ -+#define ODK_PAD 3 /* Section padding options. */ -+#define ODK_HWPATCH 4 /* Hardware workarounds performed */ -+#define ODK_FILL 5 /* record the fill value used by the linker. */ -+#define ODK_TAGS 6 /* reserve space for desktop tools to write. */ -+#define ODK_HWAND 7 /* HW workarounds. 'AND' bits when merging. */ -+#define ODK_HWOR 8 /* HW workarounds. 'OR' bits when merging. */ -+ -+/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries. */ -+ -+#define OEX_FPU_MIN 0x1f /* FPE's which MUST be enabled. */ -+#define OEX_FPU_MAX 0x1f00 /* FPE's which MAY be enabled. */ -+#define OEX_PAGE0 0x10000 /* page zero must be mapped. */ -+#define OEX_SMM 0x20000 /* Force sequential memory mode? */ -+#define OEX_FPDBUG 0x40000 /* Force floating point debug mode? */ -+#define OEX_PRECISEFP OEX_FPDBUG -+#define OEX_DISMISS 0x80000 /* Dismiss invalid address faults? */ -+ -+#define OEX_FPU_INVAL 0x10 -+#define OEX_FPU_DIV0 0x08 -+#define OEX_FPU_OFLO 0x04 -+#define OEX_FPU_UFLO 0x02 -+#define OEX_FPU_INEX 0x01 -+ -+/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry. */ -+ -+#define OHW_R4KEOP 0x1 /* R4000 end-of-page patch. */ -+#define OHW_R8KPFETCH 0x2 /* may need R8000 prefetch patch. */ -+#define OHW_R5KEOP 0x4 /* R5000 end-of-page patch. */ -+#define OHW_R5KCVTL 0x8 /* R5000 cvt.[ds].l bug. clean=1. */ -+ -+#define OPAD_PREFIX 0x1 -+#define OPAD_POSTFIX 0x2 -+#define OPAD_SYMBOL 0x4 -+ -+/* Entry found in `.options' section. */ -+ -+typedef struct -+{ -+ Elf32_Word hwp_flags1; /* Extra flags. */ -+ Elf32_Word hwp_flags2; /* Extra flags. */ -+} Elf_Options_Hw; -+ -+/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries. */ -+ -+#define OHWA0_R4KEOP_CHECKED 0x00000001 -+#define OHWA1_R4KEOP_CLEAN 0x00000002 -+ -+/* MIPS relocs. */ -+ -+#define R_MIPS_NONE 0 /* No reloc */ -+#define R_MIPS_16 1 /* Direct 16 bit */ -+#define R_MIPS_32 2 /* Direct 32 bit */ -+#define R_MIPS_REL32 3 /* PC relative 32 bit */ -+#define R_MIPS_26 4 /* Direct 26 bit shifted */ -+#define R_MIPS_HI16 5 /* High 16 bit */ -+#define R_MIPS_LO16 6 /* Low 16 bit */ -+#define R_MIPS_GPREL16 7 /* GP relative 16 bit */ -+#define R_MIPS_LITERAL 8 /* 16 bit literal entry */ -+#define R_MIPS_GOT16 9 /* 16 bit GOT entry */ -+#define R_MIPS_PC16 10 /* PC relative 16 bit */ -+#define R_MIPS_CALL16 11 /* 16 bit GOT entry for function */ -+#define R_MIPS_GPREL32 12 /* GP relative 32 bit */ -+ -+#define R_MIPS_SHIFT5 16 -+#define R_MIPS_SHIFT6 17 -+#define R_MIPS_64 18 -+#define R_MIPS_GOT_DISP 19 -+#define R_MIPS_GOT_PAGE 20 -+#define R_MIPS_GOT_OFST 21 -+#define R_MIPS_GOT_HI16 22 -+#define R_MIPS_GOT_LO16 23 -+#define R_MIPS_SUB 24 -+#define R_MIPS_INSERT_A 25 -+#define R_MIPS_INSERT_B 26 -+#define R_MIPS_DELETE 27 -+#define R_MIPS_HIGHER 28 -+#define R_MIPS_HIGHEST 29 -+#define R_MIPS_CALL_HI16 30 -+#define R_MIPS_CALL_LO16 31 -+#define R_MIPS_SCN_DISP 32 -+#define R_MIPS_REL16 33 -+#define R_MIPS_ADD_IMMEDIATE 34 -+#define R_MIPS_PJUMP 35 -+#define R_MIPS_RELGOT 36 -+#define R_MIPS_JALR 37 -+#define R_MIPS_TLS_DTPMOD32 38 /* Module number 32 bit */ -+#define R_MIPS_TLS_DTPREL32 39 /* Module-relative offset 32 bit */ -+#define R_MIPS_TLS_DTPMOD64 40 /* Module number 64 bit */ -+#define R_MIPS_TLS_DTPREL64 41 /* Module-relative offset 64 bit */ -+#define R_MIPS_TLS_GD 42 /* 16 bit GOT offset for GD */ -+#define R_MIPS_TLS_LDM 43 /* 16 bit GOT offset for LDM */ -+#define R_MIPS_TLS_DTPREL_HI16 44 /* Module-relative offset, high 16 bits */ -+#define R_MIPS_TLS_DTPREL_LO16 45 /* Module-relative offset, low 16 bits */ -+#define R_MIPS_TLS_GOTTPREL 46 /* 16 bit GOT offset for IE */ -+#define R_MIPS_TLS_TPREL32 47 /* TP-relative offset, 32 bit */ -+#define R_MIPS_TLS_TPREL64 48 /* TP-relative offset, 64 bit */ -+#define R_MIPS_TLS_TPREL_HI16 49 /* TP-relative offset, high 16 bits */ -+#define R_MIPS_TLS_TPREL_LO16 50 /* TP-relative offset, low 16 bits */ -+#define R_MIPS_GLOB_DAT 51 -+#define R_MIPS_COPY 126 -+#define R_MIPS_JUMP_SLOT 127 -+/* Keep this the last entry. */ -+#define R_MIPS_NUM 128 -+ -+/* Legal values for p_type field of Elf32_Phdr. */ -+ -+#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ -+#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */ -+#define PT_MIPS_OPTIONS 0x70000002 -+ -+/* Special program header types. */ -+ -+#define PF_MIPS_LOCAL 0x10000000 -+ -+/* Legal values for d_tag field of Elf32_Dyn. */ -+ -+#define DT_MIPS_RLD_VERSION 0x70000001 /* Runtime linker interface version */ -+#define DT_MIPS_TIME_STAMP 0x70000002 /* Timestamp */ -+#define DT_MIPS_ICHECKSUM 0x70000003 /* Checksum */ -+#define DT_MIPS_IVERSION 0x70000004 /* Version string (string tbl index) */ -+#define DT_MIPS_FLAGS 0x70000005 /* Flags */ -+#define DT_MIPS_BASE_ADDRESS 0x70000006 /* Base address */ -+#define DT_MIPS_MSYM 0x70000007 -+#define DT_MIPS_CONFLICT 0x70000008 /* Address of CONFLICT section */ -+#define DT_MIPS_LIBLIST 0x70000009 /* Address of LIBLIST section */ -+#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* Number of local GOT entries */ -+#define DT_MIPS_CONFLICTNO 0x7000000b /* Number of CONFLICT entries */ -+#define DT_MIPS_LIBLISTNO 0x70000010 /* Number of LIBLIST entries */ -+#define DT_MIPS_SYMTABNO 0x70000011 /* Number of DYNSYM entries */ -+#define DT_MIPS_UNREFEXTNO 0x70000012 /* First external DYNSYM */ -+#define DT_MIPS_GOTSYM 0x70000013 /* First GOT entry in DYNSYM */ -+#define DT_MIPS_HIPAGENO 0x70000014 /* Number of GOT page table entries */ -+#define DT_MIPS_RLD_MAP 0x70000016 /* Address of run time loader map. */ -+#define DT_MIPS_DELTA_CLASS 0x70000017 /* Delta C++ class definition. */ -+#define DT_MIPS_DELTA_CLASS_NO 0x70000018 /* Number of entries in -+ DT_MIPS_DELTA_CLASS. */ -+#define DT_MIPS_DELTA_INSTANCE 0x70000019 /* Delta C++ class instances. */ -+#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in -+ DT_MIPS_DELTA_INSTANCE. */ -+#define DT_MIPS_DELTA_RELOC 0x7000001b /* Delta relocations. */ -+#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in -+ DT_MIPS_DELTA_RELOC. */ -+#define DT_MIPS_DELTA_SYM 0x7000001d /* Delta symbols that Delta -+ relocations refer to. */ -+#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in -+ DT_MIPS_DELTA_SYM. */ -+#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the -+ class declaration. */ -+#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in -+ DT_MIPS_DELTA_CLASSSYM. */ -+#define DT_MIPS_CXX_FLAGS 0x70000022 /* Flags indicating for C++ flavor. */ -+#define DT_MIPS_PIXIE_INIT 0x70000023 -+#define DT_MIPS_SYMBOL_LIB 0x70000024 -+#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025 -+#define DT_MIPS_LOCAL_GOTIDX 0x70000026 -+#define DT_MIPS_HIDDEN_GOTIDX 0x70000027 -+#define DT_MIPS_PROTECTED_GOTIDX 0x70000028 -+#define DT_MIPS_OPTIONS 0x70000029 /* Address of .options. */ -+#define DT_MIPS_INTERFACE 0x7000002a /* Address of .interface. */ -+#define DT_MIPS_DYNSTR_ALIGN 0x7000002b -+#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */ -+#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve -+ function stored in GOT. */ -+#define DT_MIPS_PERF_SUFFIX 0x7000002e /* Default suffix of dso to be added -+ by rld on dlopen() calls. */ -+#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */ -+#define DT_MIPS_GP_VALUE 0x70000030 /* GP value for aux GOTs. */ -+#define DT_MIPS_AUX_DYNAMIC 0x70000031 /* Address of aux .dynamic. */ -+/* The address of .got.plt in an executable using the new non-PIC ABI. */ -+#define DT_MIPS_PLTGOT 0x70000032 -+/* The base of the PLT in an executable using the new non-PIC ABI if that -+ PLT is writable. For a non-writable PLT, this is omitted or has a zero -+ value. */ -+#define DT_MIPS_RWPLT 0x70000034 -+#define DT_MIPS_NUM 0x35 -+ -+/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */ -+ -+#define RHF_NONE 0 /* No flags */ -+#define RHF_QUICKSTART (1 << 0) /* Use quickstart */ -+#define RHF_NOTPOT (1 << 1) /* Hash size not power of 2 */ -+#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) /* Ignore LD_LIBRARY_PATH */ -+#define RHF_NO_MOVE (1 << 3) -+#define RHF_SGI_ONLY (1 << 4) -+#define RHF_GUARANTEE_INIT (1 << 5) -+#define RHF_DELTA_C_PLUS_PLUS (1 << 6) -+#define RHF_GUARANTEE_START_INIT (1 << 7) -+#define RHF_PIXIE (1 << 8) -+#define RHF_DEFAULT_DELAY_LOAD (1 << 9) -+#define RHF_REQUICKSTART (1 << 10) -+#define RHF_REQUICKSTARTED (1 << 11) -+#define RHF_CORD (1 << 12) -+#define RHF_NO_UNRES_UNDEF (1 << 13) -+#define RHF_RLD_ORDER_SAFE (1 << 14) -+ -+/* Entries found in sections of type SHT_MIPS_LIBLIST. */ -+ -+typedef struct -+{ -+ Elf32_Word l_name; /* Name (string table index) */ -+ Elf32_Word l_time_stamp; /* Timestamp */ -+ Elf32_Word l_checksum; /* Checksum */ -+ Elf32_Word l_version; /* Interface version */ -+ Elf32_Word l_flags; /* Flags */ -+} Elf32_Lib; -+ -+typedef struct -+{ -+ Elf64_Word l_name; /* Name (string table index) */ -+ Elf64_Word l_time_stamp; /* Timestamp */ -+ Elf64_Word l_checksum; /* Checksum */ -+ Elf64_Word l_version; /* Interface version */ -+ Elf64_Word l_flags; /* Flags */ -+} Elf64_Lib; -+ -+ -+/* Legal values for l_flags. */ -+ -+#define LL_NONE 0 -+#define LL_EXACT_MATCH (1 << 0) /* Require exact match */ -+#define LL_IGNORE_INT_VER (1 << 1) /* Ignore interface version */ -+#define LL_REQUIRE_MINOR (1 << 2) -+#define LL_EXPORTS (1 << 3) -+#define LL_DELAY_LOAD (1 << 4) -+#define LL_DELTA (1 << 5) -+ -+/* Entries found in sections of type SHT_MIPS_CONFLICT. */ -+ -+typedef Elf32_Addr Elf32_Conflict; -+ -+ -+/* HPPA specific definitions. */ -+ -+/* Legal values for e_flags field of Elf32_Ehdr. */ -+ -+#define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */ -+#define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */ -+#define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */ -+#define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */ -+#define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch -+ prediction. */ -+#define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */ -+#define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */ -+ -+/* Defined values for `e_flags & EF_PARISC_ARCH' are: */ -+ -+#define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */ -+#define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */ -+#define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */ -+ -+/* Additional section indeces. */ -+ -+#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared -+ symbols in ANSI C. */ -+#define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */ -+ -+/* Legal values for sh_type field of Elf32_Shdr. */ -+ -+#define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */ -+#define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */ -+#define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */ -+ -+/* Legal values for sh_flags field of Elf32_Shdr. */ -+ -+#define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */ -+#define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */ -+#define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */ -+ -+/* Legal values for ST_TYPE subfield of st_info (symbol type). */ -+ -+#define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */ -+ -+#define STT_HP_OPAQUE (STT_LOOS + 0x1) -+#define STT_HP_STUB (STT_LOOS + 0x2) -+ -+/* HPPA relocs. */ -+ -+#define R_PARISC_NONE 0 /* No reloc. */ -+#define R_PARISC_DIR32 1 /* Direct 32-bit reference. */ -+#define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */ -+#define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */ -+#define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */ -+#define R_PARISC_DIR14R 6 /* Right 14 bits of eff. address. */ -+#define R_PARISC_PCREL32 9 /* 32-bit rel. address. */ -+#define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */ -+#define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */ -+#define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */ -+#define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */ -+#define R_PARISC_DPREL21L 18 /* Left 21 bits of rel. address. */ -+#define R_PARISC_DPREL14R 22 /* Right 14 bits of rel. address. */ -+#define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */ -+#define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */ -+#define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */ -+#define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */ -+#define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */ -+#define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */ -+#define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */ -+#define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */ -+#define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */ -+#define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */ -+#define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */ -+#define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */ -+#define R_PARISC_FPTR64 64 /* 64 bits function address. */ -+#define R_PARISC_PLABEL32 65 /* 32 bits function address. */ -+#define R_PARISC_PLABEL21L 66 /* Left 21 bits of fdesc address. */ -+#define R_PARISC_PLABEL14R 70 /* Right 14 bits of fdesc address. */ -+#define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */ -+#define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */ -+#define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */ -+#define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */ -+#define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */ -+#define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */ -+#define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */ -+#define R_PARISC_DIR64 80 /* 64 bits of eff. address. */ -+#define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */ -+#define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */ -+#define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */ -+#define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */ -+#define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */ -+#define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */ -+#define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */ -+#define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */ -+#define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */ -+#define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */ -+#define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */ -+#define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */ -+#define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */ -+#define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */ -+#define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */ -+#define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */ -+#define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */ -+#define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */ -+#define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */ -+#define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */ -+#define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */ -+#define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */ -+#define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */ -+#define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */ -+#define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */ -+#define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */ -+#define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */ -+#define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */ -+#define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */ -+#define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */ -+#define R_PARISC_LORESERVE 128 -+#define R_PARISC_COPY 128 /* Copy relocation. */ -+#define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */ -+#define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */ -+#define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */ -+#define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */ -+#define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */ -+#define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */ -+#define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/ -+#define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */ -+#define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */ -+#define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */ -+#define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */ -+#define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */ -+#define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */ -+#define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */ -+#define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */ -+#define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/ -+#define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/ -+#define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */ -+#define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */ -+#define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */ -+#define R_PARISC_GNU_VTENTRY 232 -+#define R_PARISC_GNU_VTINHERIT 233 -+#define R_PARISC_TLS_GD21L 234 /* GD 21-bit left. */ -+#define R_PARISC_TLS_GD14R 235 /* GD 14-bit right. */ -+#define R_PARISC_TLS_GDCALL 236 /* GD call to __t_g_a. */ -+#define R_PARISC_TLS_LDM21L 237 /* LD module 21-bit left. */ -+#define R_PARISC_TLS_LDM14R 238 /* LD module 14-bit right. */ -+#define R_PARISC_TLS_LDMCALL 239 /* LD module call to __t_g_a. */ -+#define R_PARISC_TLS_LDO21L 240 /* LD offset 21-bit left. */ -+#define R_PARISC_TLS_LDO14R 241 /* LD offset 14-bit right. */ -+#define R_PARISC_TLS_DTPMOD32 242 /* DTP module 32-bit. */ -+#define R_PARISC_TLS_DTPMOD64 243 /* DTP module 64-bit. */ -+#define R_PARISC_TLS_DTPOFF32 244 /* DTP offset 32-bit. */ -+#define R_PARISC_TLS_DTPOFF64 245 /* DTP offset 32-bit. */ -+#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L -+#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R -+#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L -+#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R -+#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32 -+#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64 -+#define R_PARISC_HIRESERVE 255 -+ -+/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */ -+ -+#define PT_HP_TLS (PT_LOOS + 0x0) -+#define PT_HP_CORE_NONE (PT_LOOS + 0x1) -+#define PT_HP_CORE_VERSION (PT_LOOS + 0x2) -+#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3) -+#define PT_HP_CORE_COMM (PT_LOOS + 0x4) -+#define PT_HP_CORE_PROC (PT_LOOS + 0x5) -+#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6) -+#define PT_HP_CORE_STACK (PT_LOOS + 0x7) -+#define PT_HP_CORE_SHM (PT_LOOS + 0x8) -+#define PT_HP_CORE_MMF (PT_LOOS + 0x9) -+#define PT_HP_PARALLEL (PT_LOOS + 0x10) -+#define PT_HP_FASTBIND (PT_LOOS + 0x11) -+#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12) -+#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13) -+#define PT_HP_STACK (PT_LOOS + 0x14) -+ -+#define PT_PARISC_ARCHEXT 0x70000000 -+#define PT_PARISC_UNWIND 0x70000001 -+ -+/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */ -+ -+#define PF_PARISC_SBP 0x08000000 -+ -+#define PF_HP_PAGE_SIZE 0x00100000 -+#define PF_HP_FAR_SHARED 0x00200000 -+#define PF_HP_NEAR_SHARED 0x00400000 -+#define PF_HP_CODE 0x01000000 -+#define PF_HP_MODIFY 0x02000000 -+#define PF_HP_LAZYSWAP 0x04000000 -+#define PF_HP_SBP 0x08000000 -+ -+ -+/* Alpha specific definitions. */ -+ -+/* Legal values for e_flags field of Elf64_Ehdr. */ -+ -+#define EF_ALPHA_32BIT 1 /* All addresses must be < 2GB. */ -+#define EF_ALPHA_CANRELAX 2 /* Relocations for relaxing exist. */ -+ -+/* Legal values for sh_type field of Elf64_Shdr. */ -+ -+/* These two are primerily concerned with ECOFF debugging info. */ -+#define SHT_ALPHA_DEBUG 0x70000001 -+#define SHT_ALPHA_REGINFO 0x70000002 -+ -+/* Legal values for sh_flags field of Elf64_Shdr. */ -+ -+#define SHF_ALPHA_GPREL 0x10000000 -+ -+/* Legal values for st_other field of Elf64_Sym. */ -+#define STO_ALPHA_NOPV 0x80 /* No PV required. */ -+#define STO_ALPHA_STD_GPLOAD 0x88 /* PV only used for initial ldgp. */ -+ -+/* Alpha relocs. */ -+ -+#define R_ALPHA_NONE 0 /* No reloc */ -+#define R_ALPHA_REFLONG 1 /* Direct 32 bit */ -+#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */ -+#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */ -+#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */ -+#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */ -+#define R_ALPHA_GPDISP 6 /* Add displacement to GP */ -+#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */ -+#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */ -+#define R_ALPHA_SREL16 9 /* PC relative 16 bit */ -+#define R_ALPHA_SREL32 10 /* PC relative 32 bit */ -+#define R_ALPHA_SREL64 11 /* PC relative 64 bit */ -+#define R_ALPHA_GPRELHIGH 17 /* GP relative 32 bit, high 16 bits */ -+#define R_ALPHA_GPRELLOW 18 /* GP relative 32 bit, low 16 bits */ -+#define R_ALPHA_GPREL16 19 /* GP relative 16 bit */ -+#define R_ALPHA_COPY 24 /* Copy symbol at runtime */ -+#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */ -+#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */ -+#define R_ALPHA_RELATIVE 27 /* Adjust by program base */ -+#define R_ALPHA_TLS_GD_HI 28 -+#define R_ALPHA_TLSGD 29 -+#define R_ALPHA_TLS_LDM 30 -+#define R_ALPHA_DTPMOD64 31 -+#define R_ALPHA_GOTDTPREL 32 -+#define R_ALPHA_DTPREL64 33 -+#define R_ALPHA_DTPRELHI 34 -+#define R_ALPHA_DTPRELLO 35 -+#define R_ALPHA_DTPREL16 36 -+#define R_ALPHA_GOTTPREL 37 -+#define R_ALPHA_TPREL64 38 -+#define R_ALPHA_TPRELHI 39 -+#define R_ALPHA_TPRELLO 40 -+#define R_ALPHA_TPREL16 41 -+/* Keep this the last entry. */ -+#define R_ALPHA_NUM 46 -+ -+/* Magic values of the LITUSE relocation addend. */ -+#define LITUSE_ALPHA_ADDR 0 -+#define LITUSE_ALPHA_BASE 1 -+#define LITUSE_ALPHA_BYTOFF 2 -+#define LITUSE_ALPHA_JSR 3 -+#define LITUSE_ALPHA_TLS_GD 4 -+#define LITUSE_ALPHA_TLS_LDM 5 -+ -+/* Legal values for d_tag of Elf64_Dyn. */ -+#define DT_ALPHA_PLTRO (DT_LOPROC + 0) -+#define DT_ALPHA_NUM 1 -+ -+/* PowerPC specific declarations */ -+ -+/* Values for Elf32/64_Ehdr.e_flags. */ -+#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag */ -+ -+/* Cygnus local bits below */ -+#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag*/ -+#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib -+ flag */ -+ -+/* PowerPC relocations defined by the ABIs */ -+#define R_PPC_NONE 0 -+#define R_PPC_ADDR32 1 /* 32bit absolute address */ -+#define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */ -+#define R_PPC_ADDR16 3 /* 16bit absolute address */ -+#define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */ -+#define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */ -+#define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */ -+#define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */ -+#define R_PPC_ADDR14_BRTAKEN 8 -+#define R_PPC_ADDR14_BRNTAKEN 9 -+#define R_PPC_REL24 10 /* PC relative 26 bit */ -+#define R_PPC_REL14 11 /* PC relative 16 bit */ -+#define R_PPC_REL14_BRTAKEN 12 -+#define R_PPC_REL14_BRNTAKEN 13 -+#define R_PPC_GOT16 14 -+#define R_PPC_GOT16_LO 15 -+#define R_PPC_GOT16_HI 16 -+#define R_PPC_GOT16_HA 17 -+#define R_PPC_PLTREL24 18 -+#define R_PPC_COPY 19 -+#define R_PPC_GLOB_DAT 20 -+#define R_PPC_JMP_SLOT 21 -+#define R_PPC_RELATIVE 22 -+#define R_PPC_LOCAL24PC 23 -+#define R_PPC_UADDR32 24 -+#define R_PPC_UADDR16 25 -+#define R_PPC_REL32 26 -+#define R_PPC_PLT32 27 -+#define R_PPC_PLTREL32 28 -+#define R_PPC_PLT16_LO 29 -+#define R_PPC_PLT16_HI 30 -+#define R_PPC_PLT16_HA 31 -+#define R_PPC_SDAREL16 32 -+#define R_PPC_SECTOFF 33 -+#define R_PPC_SECTOFF_LO 34 -+#define R_PPC_SECTOFF_HI 35 -+#define R_PPC_SECTOFF_HA 36 -+ -+/* PowerPC relocations defined for the TLS access ABI. */ -+#define R_PPC_TLS 67 /* none (sym+add)@tls */ -+#define R_PPC_DTPMOD32 68 /* word32 (sym+add)@dtpmod */ -+#define R_PPC_TPREL16 69 /* half16* (sym+add)@tprel */ -+#define R_PPC_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */ -+#define R_PPC_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */ -+#define R_PPC_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */ -+#define R_PPC_TPREL32 73 /* word32 (sym+add)@tprel */ -+#define R_PPC_DTPREL16 74 /* half16* (sym+add)@dtprel */ -+#define R_PPC_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */ -+#define R_PPC_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */ -+#define R_PPC_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */ -+#define R_PPC_DTPREL32 78 /* word32 (sym+add)@dtprel */ -+#define R_PPC_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */ -+#define R_PPC_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */ -+#define R_PPC_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */ -+#define R_PPC_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */ -+#define R_PPC_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */ -+#define R_PPC_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */ -+#define R_PPC_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */ -+#define R_PPC_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */ -+#define R_PPC_GOT_TPREL16 87 /* half16* (sym+add)@got@tprel */ -+#define R_PPC_GOT_TPREL16_LO 88 /* half16 (sym+add)@got@tprel@l */ -+#define R_PPC_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */ -+#define R_PPC_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */ -+#define R_PPC_GOT_DTPREL16 91 /* half16* (sym+add)@got@dtprel */ -+#define R_PPC_GOT_DTPREL16_LO 92 /* half16* (sym+add)@got@dtprel@l */ -+#define R_PPC_GOT_DTPREL16_HI 93 /* half16* (sym+add)@got@dtprel@h */ -+#define R_PPC_GOT_DTPREL16_HA 94 /* half16* (sym+add)@got@dtprel@ha */ -+ -+/* The remaining relocs are from the Embedded ELF ABI, and are not -+ in the SVR4 ELF ABI. */ -+#define R_PPC_EMB_NADDR32 101 -+#define R_PPC_EMB_NADDR16 102 -+#define R_PPC_EMB_NADDR16_LO 103 -+#define R_PPC_EMB_NADDR16_HI 104 -+#define R_PPC_EMB_NADDR16_HA 105 -+#define R_PPC_EMB_SDAI16 106 -+#define R_PPC_EMB_SDA2I16 107 -+#define R_PPC_EMB_SDA2REL 108 -+#define R_PPC_EMB_SDA21 109 /* 16 bit offset in SDA */ -+#define R_PPC_EMB_MRKREF 110 -+#define R_PPC_EMB_RELSEC16 111 -+#define R_PPC_EMB_RELST_LO 112 -+#define R_PPC_EMB_RELST_HI 113 -+#define R_PPC_EMB_RELST_HA 114 -+#define R_PPC_EMB_BIT_FLD 115 -+#define R_PPC_EMB_RELSDA 116 /* 16 bit relative offset in SDA */ -+ -+/* Diab tool relocations. */ -+#define R_PPC_DIAB_SDA21_LO 180 /* like EMB_SDA21, but lower 16 bit */ -+#define R_PPC_DIAB_SDA21_HI 181 /* like EMB_SDA21, but high 16 bit */ -+#define R_PPC_DIAB_SDA21_HA 182 /* like EMB_SDA21, adjusted high 16 */ -+#define R_PPC_DIAB_RELSDA_LO 183 /* like EMB_RELSDA, but lower 16 bit */ -+#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */ -+#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */ -+ -+/* GNU extension to support local ifunc. */ -+#define R_PPC_IRELATIVE 248 -+ -+/* GNU relocs used in PIC code sequences. */ -+#define R_PPC_REL16 249 /* half16 (sym+add-.) */ -+#define R_PPC_REL16_LO 250 /* half16 (sym+add-.)@l */ -+#define R_PPC_REL16_HI 251 /* half16 (sym+add-.)@h */ -+#define R_PPC_REL16_HA 252 /* half16 (sym+add-.)@ha */ -+ -+/* This is a phony reloc to handle any old fashioned TOC16 references -+ that may still be in object files. */ -+#define R_PPC_TOC16 255 -+ -+/* PowerPC specific values for the Dyn d_tag field. */ -+#define DT_PPC_GOT (DT_LOPROC + 0) -+#define DT_PPC_NUM 1 -+ -+/* PowerPC64 relocations defined by the ABIs */ -+#define R_PPC64_NONE R_PPC_NONE -+#define R_PPC64_ADDR32 R_PPC_ADDR32 /* 32bit absolute address */ -+#define R_PPC64_ADDR24 R_PPC_ADDR24 /* 26bit address, word aligned */ -+#define R_PPC64_ADDR16 R_PPC_ADDR16 /* 16bit absolute address */ -+#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO /* lower 16bits of address */ -+#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI /* high 16bits of address. */ -+#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA /* adjusted high 16bits. */ -+#define R_PPC64_ADDR14 R_PPC_ADDR14 /* 16bit address, word aligned */ -+#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN -+#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN -+#define R_PPC64_REL24 R_PPC_REL24 /* PC-rel. 26 bit, word aligned */ -+#define R_PPC64_REL14 R_PPC_REL14 /* PC relative 16 bit */ -+#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN -+#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN -+#define R_PPC64_GOT16 R_PPC_GOT16 -+#define R_PPC64_GOT16_LO R_PPC_GOT16_LO -+#define R_PPC64_GOT16_HI R_PPC_GOT16_HI -+#define R_PPC64_GOT16_HA R_PPC_GOT16_HA -+ -+#define R_PPC64_COPY R_PPC_COPY -+#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT -+#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT -+#define R_PPC64_RELATIVE R_PPC_RELATIVE -+ -+#define R_PPC64_UADDR32 R_PPC_UADDR32 -+#define R_PPC64_UADDR16 R_PPC_UADDR16 -+#define R_PPC64_REL32 R_PPC_REL32 -+#define R_PPC64_PLT32 R_PPC_PLT32 -+#define R_PPC64_PLTREL32 R_PPC_PLTREL32 -+#define R_PPC64_PLT16_LO R_PPC_PLT16_LO -+#define R_PPC64_PLT16_HI R_PPC_PLT16_HI -+#define R_PPC64_PLT16_HA R_PPC_PLT16_HA -+ -+#define R_PPC64_SECTOFF R_PPC_SECTOFF -+#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO -+#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI -+#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA -+#define R_PPC64_ADDR30 37 /* word30 (S + A - P) >> 2 */ -+#define R_PPC64_ADDR64 38 /* doubleword64 S + A */ -+#define R_PPC64_ADDR16_HIGHER 39 /* half16 #higher(S + A) */ -+#define R_PPC64_ADDR16_HIGHERA 40 /* half16 #highera(S + A) */ -+#define R_PPC64_ADDR16_HIGHEST 41 /* half16 #highest(S + A) */ -+#define R_PPC64_ADDR16_HIGHESTA 42 /* half16 #highesta(S + A) */ -+#define R_PPC64_UADDR64 43 /* doubleword64 S + A */ -+#define R_PPC64_REL64 44 /* doubleword64 S + A - P */ -+#define R_PPC64_PLT64 45 /* doubleword64 L + A */ -+#define R_PPC64_PLTREL64 46 /* doubleword64 L + A - P */ -+#define R_PPC64_TOC16 47 /* half16* S + A - .TOC */ -+#define R_PPC64_TOC16_LO 48 /* half16 #lo(S + A - .TOC.) */ -+#define R_PPC64_TOC16_HI 49 /* half16 #hi(S + A - .TOC.) */ -+#define R_PPC64_TOC16_HA 50 /* half16 #ha(S + A - .TOC.) */ -+#define R_PPC64_TOC 51 /* doubleword64 .TOC */ -+#define R_PPC64_PLTGOT16 52 /* half16* M + A */ -+#define R_PPC64_PLTGOT16_LO 53 /* half16 #lo(M + A) */ -+#define R_PPC64_PLTGOT16_HI 54 /* half16 #hi(M + A) */ -+#define R_PPC64_PLTGOT16_HA 55 /* half16 #ha(M + A) */ -+ -+#define R_PPC64_ADDR16_DS 56 /* half16ds* (S + A) >> 2 */ -+#define R_PPC64_ADDR16_LO_DS 57 /* half16ds #lo(S + A) >> 2 */ -+#define R_PPC64_GOT16_DS 58 /* half16ds* (G + A) >> 2 */ -+#define R_PPC64_GOT16_LO_DS 59 /* half16ds #lo(G + A) >> 2 */ -+#define R_PPC64_PLT16_LO_DS 60 /* half16ds #lo(L + A) >> 2 */ -+#define R_PPC64_SECTOFF_DS 61 /* half16ds* (R + A) >> 2 */ -+#define R_PPC64_SECTOFF_LO_DS 62 /* half16ds #lo(R + A) >> 2 */ -+#define R_PPC64_TOC16_DS 63 /* half16ds* (S + A - .TOC.) >> 2 */ -+#define R_PPC64_TOC16_LO_DS 64 /* half16ds #lo(S + A - .TOC.) >> 2 */ -+#define R_PPC64_PLTGOT16_DS 65 /* half16ds* (M + A) >> 2 */ -+#define R_PPC64_PLTGOT16_LO_DS 66 /* half16ds #lo(M + A) >> 2 */ -+ -+/* PowerPC64 relocations defined for the TLS access ABI. */ -+#define R_PPC64_TLS 67 /* none (sym+add)@tls */ -+#define R_PPC64_DTPMOD64 68 /* doubleword64 (sym+add)@dtpmod */ -+#define R_PPC64_TPREL16 69 /* half16* (sym+add)@tprel */ -+#define R_PPC64_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */ -+#define R_PPC64_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */ -+#define R_PPC64_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */ -+#define R_PPC64_TPREL64 73 /* doubleword64 (sym+add)@tprel */ -+#define R_PPC64_DTPREL16 74 /* half16* (sym+add)@dtprel */ -+#define R_PPC64_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */ -+#define R_PPC64_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */ -+#define R_PPC64_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */ -+#define R_PPC64_DTPREL64 78 /* doubleword64 (sym+add)@dtprel */ -+#define R_PPC64_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */ -+#define R_PPC64_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */ -+#define R_PPC64_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */ -+#define R_PPC64_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */ -+#define R_PPC64_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */ -+#define R_PPC64_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */ -+#define R_PPC64_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */ -+#define R_PPC64_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */ -+#define R_PPC64_GOT_TPREL16_DS 87 /* half16ds* (sym+add)@got@tprel */ -+#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */ -+#define R_PPC64_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */ -+#define R_PPC64_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */ -+#define R_PPC64_GOT_DTPREL16_DS 91 /* half16ds* (sym+add)@got@dtprel */ -+#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */ -+#define R_PPC64_GOT_DTPREL16_HI 93 /* half16 (sym+add)@got@dtprel@h */ -+#define R_PPC64_GOT_DTPREL16_HA 94 /* half16 (sym+add)@got@dtprel@ha */ -+#define R_PPC64_TPREL16_DS 95 /* half16ds* (sym+add)@tprel */ -+#define R_PPC64_TPREL16_LO_DS 96 /* half16ds (sym+add)@tprel@l */ -+#define R_PPC64_TPREL16_HIGHER 97 /* half16 (sym+add)@tprel@higher */ -+#define R_PPC64_TPREL16_HIGHERA 98 /* half16 (sym+add)@tprel@highera */ -+#define R_PPC64_TPREL16_HIGHEST 99 /* half16 (sym+add)@tprel@highest */ -+#define R_PPC64_TPREL16_HIGHESTA 100 /* half16 (sym+add)@tprel@highesta */ -+#define R_PPC64_DTPREL16_DS 101 /* half16ds* (sym+add)@dtprel */ -+#define R_PPC64_DTPREL16_LO_DS 102 /* half16ds (sym+add)@dtprel@l */ -+#define R_PPC64_DTPREL16_HIGHER 103 /* half16 (sym+add)@dtprel@higher */ -+#define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */ -+#define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */ -+#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta */ -+ -+/* GNU extension to support local ifunc. */ -+#define R_PPC64_JMP_IREL 247 -+#define R_PPC64_IRELATIVE 248 -+#define R_PPC64_REL16 249 /* half16 (sym+add-.) */ -+#define R_PPC64_REL16_LO 250 /* half16 (sym+add-.)@l */ -+#define R_PPC64_REL16_HI 251 /* half16 (sym+add-.)@h */ -+#define R_PPC64_REL16_HA 252 /* half16 (sym+add-.)@ha */ -+ -+/* PowerPC64 specific values for the Dyn d_tag field. */ -+#define DT_PPC64_GLINK (DT_LOPROC + 0) -+#define DT_PPC64_OPD (DT_LOPROC + 1) -+#define DT_PPC64_OPDSZ (DT_LOPROC + 2) -+#define DT_PPC64_NUM 3 -+ -+ -+/* ARM specific declarations */ -+ -+/* Processor specific flags for the ELF header e_flags field. */ -+#define EF_ARM_RELEXEC 0x01 -+#define EF_ARM_HASENTRY 0x02 -+#define EF_ARM_INTERWORK 0x04 -+#define EF_ARM_APCS_26 0x08 -+#define EF_ARM_APCS_FLOAT 0x10 -+#define EF_ARM_PIC 0x20 -+#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use */ -+#define EF_ARM_NEW_ABI 0x80 -+#define EF_ARM_OLD_ABI 0x100 -+#define EF_ARM_SOFT_FLOAT 0x200 -+#define EF_ARM_VFP_FLOAT 0x400 -+#define EF_ARM_MAVERICK_FLOAT 0x800 -+ -+ -+/* Other constants defined in the ARM ELF spec. version B-01. */ -+/* NB. These conflict with values defined above. */ -+#define EF_ARM_SYMSARESORTED 0x04 -+#define EF_ARM_DYNSYMSUSESEGIDX 0x08 -+#define EF_ARM_MAPSYMSFIRST 0x10 -+#define EF_ARM_EABIMASK 0XFF000000 -+ -+/* Constants defined in AAELF. */ -+#define EF_ARM_BE8 0x00800000 -+#define EF_ARM_LE8 0x00400000 -+ -+#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) -+#define EF_ARM_EABI_UNKNOWN 0x00000000 -+#define EF_ARM_EABI_VER1 0x01000000 -+#define EF_ARM_EABI_VER2 0x02000000 -+#define EF_ARM_EABI_VER3 0x03000000 -+#define EF_ARM_EABI_VER4 0x04000000 -+#define EF_ARM_EABI_VER5 0x05000000 -+ -+/* Additional symbol types for Thumb. */ -+#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */ -+#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */ -+ -+/* ARM-specific values for sh_flags */ -+#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */ -+#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined -+ in the input to a link step. */ -+ -+/* ARM-specific program header flags */ -+#define PF_ARM_SB 0x10000000 /* Segment contains the location -+ addressed by the static base. */ -+#define PF_ARM_PI 0x20000000 /* Position-independent segment. */ -+#define PF_ARM_ABS 0x40000000 /* Absolute segment. */ -+ -+/* Processor specific values for the Phdr p_type field. */ -+#define PT_ARM_EXIDX (PT_LOPROC + 1) /* ARM unwind segment. */ -+ -+/* Processor specific values for the Shdr sh_type field. */ -+#define SHT_ARM_EXIDX (SHT_LOPROC + 1) /* ARM unwind section. */ -+#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) /* Preemption details. */ -+#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) /* ARM attributes section. */ -+ -+ -+/* ARM relocs. */ -+ -+#define R_ARM_NONE 0 /* No reloc */ -+#define R_ARM_PC24 1 /* PC relative 26 bit branch */ -+#define R_ARM_ABS32 2 /* Direct 32 bit */ -+#define R_ARM_REL32 3 /* PC relative 32 bit */ -+#define R_ARM_PC13 4 -+#define R_ARM_ABS16 5 /* Direct 16 bit */ -+#define R_ARM_ABS12 6 /* Direct 12 bit */ -+#define R_ARM_THM_ABS5 7 -+#define R_ARM_ABS8 8 /* Direct 8 bit */ -+#define R_ARM_SBREL32 9 -+#define R_ARM_THM_PC22 10 -+#define R_ARM_THM_PC8 11 -+#define R_ARM_AMP_VCALL9 12 -+#define R_ARM_SWI24 13 /* Obsolete static relocation. */ -+#define R_ARM_TLS_DESC 13 /* Dynamic relocation. */ -+#define R_ARM_THM_SWI8 14 -+#define R_ARM_XPC25 15 -+#define R_ARM_THM_XPC22 16 -+#define R_ARM_TLS_DTPMOD32 17 /* ID of module containing symbol */ -+#define R_ARM_TLS_DTPOFF32 18 /* Offset in TLS block */ -+#define R_ARM_TLS_TPOFF32 19 /* Offset in static TLS block */ -+#define R_ARM_COPY 20 /* Copy symbol at runtime */ -+#define R_ARM_GLOB_DAT 21 /* Create GOT entry */ -+#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */ -+#define R_ARM_RELATIVE 23 /* Adjust by program base */ -+#define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */ -+#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */ -+#define R_ARM_GOT32 26 /* 32 bit GOT entry */ -+#define R_ARM_PLT32 27 /* 32 bit PLT address */ -+#define R_ARM_ALU_PCREL_7_0 32 -+#define R_ARM_ALU_PCREL_15_8 33 -+#define R_ARM_ALU_PCREL_23_15 34 -+#define R_ARM_LDR_SBREL_11_0 35 -+#define R_ARM_ALU_SBREL_19_12 36 -+#define R_ARM_ALU_SBREL_27_20 37 -+#define R_ARM_TLS_GOTDESC 90 -+#define R_ARM_TLS_CALL 91 -+#define R_ARM_TLS_DESCSEQ 92 -+#define R_ARM_THM_TLS_CALL 93 -+#define R_ARM_GNU_VTENTRY 100 -+#define R_ARM_GNU_VTINHERIT 101 -+#define R_ARM_THM_PC11 102 /* thumb unconditional branch */ -+#define R_ARM_THM_PC9 103 /* thumb conditional branch */ -+#define R_ARM_TLS_GD32 104 /* PC-rel 32 bit for global dynamic -+ thread local data */ -+#define R_ARM_TLS_LDM32 105 /* PC-rel 32 bit for local dynamic -+ thread local data */ -+#define R_ARM_TLS_LDO32 106 /* 32 bit offset relative to TLS -+ block */ -+#define R_ARM_TLS_IE32 107 /* PC-rel 32 bit for GOT entry of -+ static TLS block offset */ -+#define R_ARM_TLS_LE32 108 /* 32 bit offset relative to static -+ TLS block */ -+#define R_ARM_THM_TLS_DESCSEQ 129 -+#define R_ARM_IRELATIVE 160 -+#define R_ARM_RXPC25 249 -+#define R_ARM_RSBREL32 250 -+#define R_ARM_THM_RPC22 251 -+#define R_ARM_RREL32 252 -+#define R_ARM_RABS22 253 -+#define R_ARM_RPC24 254 -+#define R_ARM_RBASE 255 -+/* Keep this the last entry. */ -+#define R_ARM_NUM 256 -+ -+/* IA-64 specific declarations. */ -+ -+/* Processor specific flags for the Ehdr e_flags field. */ -+#define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */ -+#define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */ -+#define EF_IA_64_ARCH 0xff000000 /* arch. version mask */ -+ -+/* Processor specific values for the Phdr p_type field. */ -+#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */ -+#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */ -+#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12) -+#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13) -+#define PT_IA_64_HP_STACK (PT_LOOS + 0x14) -+ -+/* Processor specific flags for the Phdr p_flags field. */ -+#define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */ -+ -+/* Processor specific values for the Shdr sh_type field. */ -+#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */ -+#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */ -+ -+/* Processor specific flags for the Shdr sh_flags field. */ -+#define SHF_IA_64_SHORT 0x10000000 /* section near gp */ -+#define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */ -+ -+/* Processor specific values for the Dyn d_tag field. */ -+#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0) -+#define DT_IA_64_NUM 1 -+ -+/* IA-64 relocations. */ -+#define R_IA64_NONE 0x00 /* none */ -+#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */ -+#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */ -+#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */ -+#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */ -+#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */ -+#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */ -+#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */ -+#define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */ -+#define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */ -+#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */ -+#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */ -+#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */ -+#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */ -+#define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */ -+#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */ -+#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */ -+#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */ -+#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */ -+#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */ -+#define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */ -+#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */ -+#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */ -+#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */ -+#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */ -+#define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */ -+#define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */ -+#define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */ -+#define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */ -+#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */ -+#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */ -+#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */ -+#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */ -+#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */ -+#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */ -+#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */ -+#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */ -+#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */ -+#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */ -+#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */ -+#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */ -+#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */ -+#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */ -+#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */ -+#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */ -+#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */ -+#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */ -+#define R_IA64_REL32MSB 0x6c /* data 4 + REL */ -+#define R_IA64_REL32LSB 0x6d /* data 4 + REL */ -+#define R_IA64_REL64MSB 0x6e /* data 8 + REL */ -+#define R_IA64_REL64LSB 0x6f /* data 8 + REL */ -+#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */ -+#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */ -+#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */ -+#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */ -+#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */ -+#define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */ -+#define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */ -+#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */ -+#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */ -+#define R_IA64_COPY 0x84 /* copy relocation */ -+#define R_IA64_SUB 0x85 /* Addend and symbol difference */ -+#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */ -+#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */ -+#define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */ -+#define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */ -+#define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */ -+#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */ -+#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */ -+#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */ -+#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */ -+#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */ -+#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */ -+#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */ -+#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */ -+#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */ -+#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */ -+#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */ -+#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */ -+#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */ -+#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */ -+ -+/* SH specific declarations */ -+ -+/* Processor specific flags for the ELF header e_flags field. */ -+#define EF_SH_MACH_MASK 0x1f -+#define EF_SH_UNKNOWN 0x0 -+#define EF_SH1 0x1 -+#define EF_SH2 0x2 -+#define EF_SH3 0x3 -+#define EF_SH_DSP 0x4 -+#define EF_SH3_DSP 0x5 -+#define EF_SH4AL_DSP 0x6 -+#define EF_SH3E 0x8 -+#define EF_SH4 0x9 -+#define EF_SH2E 0xb -+#define EF_SH4A 0xc -+#define EF_SH2A 0xd -+#define EF_SH4_NOFPU 0x10 -+#define EF_SH4A_NOFPU 0x11 -+#define EF_SH4_NOMMU_NOFPU 0x12 -+#define EF_SH2A_NOFPU 0x13 -+#define EF_SH3_NOMMU 0x14 -+#define EF_SH2A_SH4_NOFPU 0x15 -+#define EF_SH2A_SH3_NOFPU 0x16 -+#define EF_SH2A_SH4 0x17 -+#define EF_SH2A_SH3E 0x18 -+ -+/* SH relocs. */ -+#define R_SH_NONE 0 -+#define R_SH_DIR32 1 -+#define R_SH_REL32 2 -+#define R_SH_DIR8WPN 3 -+#define R_SH_IND12W 4 -+#define R_SH_DIR8WPL 5 -+#define R_SH_DIR8WPZ 6 -+#define R_SH_DIR8BP 7 -+#define R_SH_DIR8W 8 -+#define R_SH_DIR8L 9 -+#define R_SH_SWITCH16 25 -+#define R_SH_SWITCH32 26 -+#define R_SH_USES 27 -+#define R_SH_COUNT 28 -+#define R_SH_ALIGN 29 -+#define R_SH_CODE 30 -+#define R_SH_DATA 31 -+#define R_SH_LABEL 32 -+#define R_SH_SWITCH8 33 -+#define R_SH_GNU_VTINHERIT 34 -+#define R_SH_GNU_VTENTRY 35 -+#define R_SH_TLS_GD_32 144 -+#define R_SH_TLS_LD_32 145 -+#define R_SH_TLS_LDO_32 146 -+#define R_SH_TLS_IE_32 147 -+#define R_SH_TLS_LE_32 148 -+#define R_SH_TLS_DTPMOD32 149 -+#define R_SH_TLS_DTPOFF32 150 -+#define R_SH_TLS_TPOFF32 151 -+#define R_SH_GOT32 160 -+#define R_SH_PLT32 161 -+#define R_SH_COPY 162 -+#define R_SH_GLOB_DAT 163 -+#define R_SH_JMP_SLOT 164 -+#define R_SH_RELATIVE 165 -+#define R_SH_GOTOFF 166 -+#define R_SH_GOTPC 167 -+/* Keep this the last entry. */ -+#define R_SH_NUM 256 -+ -+/* S/390 specific definitions. */ -+ -+/* Valid values for the e_flags field. */ -+ -+#define EF_S390_HIGH_GPRS 0x00000001 /* High GPRs kernel facility needed. */ -+ -+/* Additional s390 relocs */ -+ -+#define R_390_NONE 0 /* No reloc. */ -+#define R_390_8 1 /* Direct 8 bit. */ -+#define R_390_12 2 /* Direct 12 bit. */ -+#define R_390_16 3 /* Direct 16 bit. */ -+#define R_390_32 4 /* Direct 32 bit. */ -+#define R_390_PC32 5 /* PC relative 32 bit. */ -+#define R_390_GOT12 6 /* 12 bit GOT offset. */ -+#define R_390_GOT32 7 /* 32 bit GOT offset. */ -+#define R_390_PLT32 8 /* 32 bit PC relative PLT address. */ -+#define R_390_COPY 9 /* Copy symbol at runtime. */ -+#define R_390_GLOB_DAT 10 /* Create GOT entry. */ -+#define R_390_JMP_SLOT 11 /* Create PLT entry. */ -+#define R_390_RELATIVE 12 /* Adjust by program base. */ -+#define R_390_GOTOFF32 13 /* 32 bit offset to GOT. */ -+#define R_390_GOTPC 14 /* 32 bit PC relative offset to GOT. */ -+#define R_390_GOT16 15 /* 16 bit GOT offset. */ -+#define R_390_PC16 16 /* PC relative 16 bit. */ -+#define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */ -+#define R_390_PLT16DBL 18 /* 16 bit PC rel. PLT shifted by 1. */ -+#define R_390_PC32DBL 19 /* PC relative 32 bit shifted by 1. */ -+#define R_390_PLT32DBL 20 /* 32 bit PC rel. PLT shifted by 1. */ -+#define R_390_GOTPCDBL 21 /* 32 bit PC rel. GOT shifted by 1. */ -+#define R_390_64 22 /* Direct 64 bit. */ -+#define R_390_PC64 23 /* PC relative 64 bit. */ -+#define R_390_GOT64 24 /* 64 bit GOT offset. */ -+#define R_390_PLT64 25 /* 64 bit PC relative PLT address. */ -+#define R_390_GOTENT 26 /* 32 bit PC rel. to GOT entry >> 1. */ -+#define R_390_GOTOFF16 27 /* 16 bit offset to GOT. */ -+#define R_390_GOTOFF64 28 /* 64 bit offset to GOT. */ -+#define R_390_GOTPLT12 29 /* 12 bit offset to jump slot. */ -+#define R_390_GOTPLT16 30 /* 16 bit offset to jump slot. */ -+#define R_390_GOTPLT32 31 /* 32 bit offset to jump slot. */ -+#define R_390_GOTPLT64 32 /* 64 bit offset to jump slot. */ -+#define R_390_GOTPLTENT 33 /* 32 bit rel. offset to jump slot. */ -+#define R_390_PLTOFF16 34 /* 16 bit offset from GOT to PLT. */ -+#define R_390_PLTOFF32 35 /* 32 bit offset from GOT to PLT. */ -+#define R_390_PLTOFF64 36 /* 16 bit offset from GOT to PLT. */ -+#define R_390_TLS_LOAD 37 /* Tag for load insn in TLS code. */ -+#define R_390_TLS_GDCALL 38 /* Tag for function call in general -+ dynamic TLS code. */ -+#define R_390_TLS_LDCALL 39 /* Tag for function call in local -+ dynamic TLS code. */ -+#define R_390_TLS_GD32 40 /* Direct 32 bit for general dynamic -+ thread local data. */ -+#define R_390_TLS_GD64 41 /* Direct 64 bit for general dynamic -+ thread local data. */ -+#define R_390_TLS_GOTIE12 42 /* 12 bit GOT offset for static TLS -+ block offset. */ -+#define R_390_TLS_GOTIE32 43 /* 32 bit GOT offset for static TLS -+ block offset. */ -+#define R_390_TLS_GOTIE64 44 /* 64 bit GOT offset for static TLS -+ block offset. */ -+#define R_390_TLS_LDM32 45 /* Direct 32 bit for local dynamic -+ thread local data in LE code. */ -+#define R_390_TLS_LDM64 46 /* Direct 64 bit for local dynamic -+ thread local data in LE code. */ -+#define R_390_TLS_IE32 47 /* 32 bit address of GOT entry for -+ negated static TLS block offset. */ -+#define R_390_TLS_IE64 48 /* 64 bit address of GOT entry for -+ negated static TLS block offset. */ -+#define R_390_TLS_IEENT 49 /* 32 bit rel. offset to GOT entry for -+ negated static TLS block offset. */ -+#define R_390_TLS_LE32 50 /* 32 bit negated offset relative to -+ static TLS block. */ -+#define R_390_TLS_LE64 51 /* 64 bit negated offset relative to -+ static TLS block. */ -+#define R_390_TLS_LDO32 52 /* 32 bit offset relative to TLS -+ block. */ -+#define R_390_TLS_LDO64 53 /* 64 bit offset relative to TLS -+ block. */ -+#define R_390_TLS_DTPMOD 54 /* ID of module containing symbol. */ -+#define R_390_TLS_DTPOFF 55 /* Offset in TLS block. */ -+#define R_390_TLS_TPOFF 56 /* Negated offset in static TLS -+ block. */ -+#define R_390_20 57 /* Direct 20 bit. */ -+#define R_390_GOT20 58 /* 20 bit GOT offset. */ -+#define R_390_GOTPLT20 59 /* 20 bit offset to jump slot. */ -+#define R_390_TLS_GOTIE20 60 /* 20 bit GOT offset for static TLS -+ block offset. */ -+#define R_390_IRELATIVE 61 /* STT_GNU_IFUNC relocation. */ -+/* Keep this the last entry. */ -+#define R_390_NUM 62 -+ -+ -+/* CRIS relocations. */ -+#define R_CRIS_NONE 0 -+#define R_CRIS_8 1 -+#define R_CRIS_16 2 -+#define R_CRIS_32 3 -+#define R_CRIS_8_PCREL 4 -+#define R_CRIS_16_PCREL 5 -+#define R_CRIS_32_PCREL 6 -+#define R_CRIS_GNU_VTINHERIT 7 -+#define R_CRIS_GNU_VTENTRY 8 -+#define R_CRIS_COPY 9 -+#define R_CRIS_GLOB_DAT 10 -+#define R_CRIS_JUMP_SLOT 11 -+#define R_CRIS_RELATIVE 12 -+#define R_CRIS_16_GOT 13 -+#define R_CRIS_32_GOT 14 -+#define R_CRIS_16_GOTPLT 15 -+#define R_CRIS_32_GOTPLT 16 -+#define R_CRIS_32_GOTREL 17 -+#define R_CRIS_32_PLT_GOTREL 18 -+#define R_CRIS_32_PLT_PCREL 19 -+ -+#define R_CRIS_NUM 20 -+ -+ -+/* AMD x86-64 relocations. */ -+#define R_X86_64_NONE 0 /* No reloc */ -+#define R_X86_64_64 1 /* Direct 64 bit */ -+#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ -+#define R_X86_64_GOT32 3 /* 32 bit GOT entry */ -+#define R_X86_64_PLT32 4 /* 32 bit PLT address */ -+#define R_X86_64_COPY 5 /* Copy symbol at runtime */ -+#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */ -+#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */ -+#define R_X86_64_RELATIVE 8 /* Adjust by program base */ -+#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative -+ offset to GOT */ -+#define R_X86_64_32 10 /* Direct 32 bit zero extended */ -+#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ -+#define R_X86_64_16 12 /* Direct 16 bit zero extended */ -+#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */ -+#define R_X86_64_8 14 /* Direct 8 bit sign extended */ -+#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */ -+#define R_X86_64_DTPMOD64 16 /* ID of module containing symbol */ -+#define R_X86_64_DTPOFF64 17 /* Offset in module's TLS block */ -+#define R_X86_64_TPOFF64 18 /* Offset in initial TLS block */ -+#define R_X86_64_TLSGD 19 /* 32 bit signed PC relative offset -+ to two GOT entries for GD symbol */ -+#define R_X86_64_TLSLD 20 /* 32 bit signed PC relative offset -+ to two GOT entries for LD symbol */ -+#define R_X86_64_DTPOFF32 21 /* Offset in TLS block */ -+#define R_X86_64_GOTTPOFF 22 /* 32 bit signed PC relative offset -+ to GOT entry for IE symbol */ -+#define R_X86_64_TPOFF32 23 /* Offset in initial TLS block */ -+#define R_X86_64_PC64 24 /* PC relative 64 bit */ -+#define R_X86_64_GOTOFF64 25 /* 64 bit offset to GOT */ -+#define R_X86_64_GOTPC32 26 /* 32 bit signed pc relative -+ offset to GOT */ -+#define R_X86_64_GOT64 27 /* 64-bit GOT entry offset */ -+#define R_X86_64_GOTPCREL64 28 /* 64-bit PC relative offset -+ to GOT entry */ -+#define R_X86_64_GOTPC64 29 /* 64-bit PC relative offset to GOT */ -+#define R_X86_64_GOTPLT64 30 /* like GOT64, says PLT entry needed */ -+#define R_X86_64_PLTOFF64 31 /* 64-bit GOT relative offset -+ to PLT entry */ -+#define R_X86_64_SIZE32 32 /* Size of symbol plus 32-bit addend */ -+#define R_X86_64_SIZE64 33 /* Size of symbol plus 64-bit addend */ -+#define R_X86_64_GOTPC32_TLSDESC 34 /* GOT offset for TLS descriptor. */ -+#define R_X86_64_TLSDESC_CALL 35 /* Marker for call through TLS -+ descriptor. */ -+#define R_X86_64_TLSDESC 36 /* TLS descriptor. */ -+#define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */ -+#define R_X86_64_RELATIVE64 38 /* 64-bit adjust by program base */ -+ -+#define R_X86_64_NUM 39 -+ -+ -+/* AM33 relocations. */ -+#define R_MN10300_NONE 0 /* No reloc. */ -+#define R_MN10300_32 1 /* Direct 32 bit. */ -+#define R_MN10300_16 2 /* Direct 16 bit. */ -+#define R_MN10300_8 3 /* Direct 8 bit. */ -+#define R_MN10300_PCREL32 4 /* PC-relative 32-bit. */ -+#define R_MN10300_PCREL16 5 /* PC-relative 16-bit signed. */ -+#define R_MN10300_PCREL8 6 /* PC-relative 8-bit signed. */ -+#define R_MN10300_GNU_VTINHERIT 7 /* Ancient C++ vtable garbage... */ -+#define R_MN10300_GNU_VTENTRY 8 /* ... collection annotation. */ -+#define R_MN10300_24 9 /* Direct 24 bit. */ -+#define R_MN10300_GOTPC32 10 /* 32-bit PCrel offset to GOT. */ -+#define R_MN10300_GOTPC16 11 /* 16-bit PCrel offset to GOT. */ -+#define R_MN10300_GOTOFF32 12 /* 32-bit offset from GOT. */ -+#define R_MN10300_GOTOFF24 13 /* 24-bit offset from GOT. */ -+#define R_MN10300_GOTOFF16 14 /* 16-bit offset from GOT. */ -+#define R_MN10300_PLT32 15 /* 32-bit PCrel to PLT entry. */ -+#define R_MN10300_PLT16 16 /* 16-bit PCrel to PLT entry. */ -+#define R_MN10300_GOT32 17 /* 32-bit offset to GOT entry. */ -+#define R_MN10300_GOT24 18 /* 24-bit offset to GOT entry. */ -+#define R_MN10300_GOT16 19 /* 16-bit offset to GOT entry. */ -+#define R_MN10300_COPY 20 /* Copy symbol at runtime. */ -+#define R_MN10300_GLOB_DAT 21 /* Create GOT entry. */ -+#define R_MN10300_JMP_SLOT 22 /* Create PLT entry. */ -+#define R_MN10300_RELATIVE 23 /* Adjust by program base. */ -+ -+#define R_MN10300_NUM 24 -+ -+ -+/* M32R relocs. */ -+#define R_M32R_NONE 0 /* No reloc. */ -+#define R_M32R_16 1 /* Direct 16 bit. */ -+#define R_M32R_32 2 /* Direct 32 bit. */ -+#define R_M32R_24 3 /* Direct 24 bit. */ -+#define R_M32R_10_PCREL 4 /* PC relative 10 bit shifted. */ -+#define R_M32R_18_PCREL 5 /* PC relative 18 bit shifted. */ -+#define R_M32R_26_PCREL 6 /* PC relative 26 bit shifted. */ -+#define R_M32R_HI16_ULO 7 /* High 16 bit with unsigned low. */ -+#define R_M32R_HI16_SLO 8 /* High 16 bit with signed low. */ -+#define R_M32R_LO16 9 /* Low 16 bit. */ -+#define R_M32R_SDA16 10 /* 16 bit offset in SDA. */ -+#define R_M32R_GNU_VTINHERIT 11 -+#define R_M32R_GNU_VTENTRY 12 -+/* M32R relocs use SHT_RELA. */ -+#define R_M32R_16_RELA 33 /* Direct 16 bit. */ -+#define R_M32R_32_RELA 34 /* Direct 32 bit. */ -+#define R_M32R_24_RELA 35 /* Direct 24 bit. */ -+#define R_M32R_10_PCREL_RELA 36 /* PC relative 10 bit shifted. */ -+#define R_M32R_18_PCREL_RELA 37 /* PC relative 18 bit shifted. */ -+#define R_M32R_26_PCREL_RELA 38 /* PC relative 26 bit shifted. */ -+#define R_M32R_HI16_ULO_RELA 39 /* High 16 bit with unsigned low */ -+#define R_M32R_HI16_SLO_RELA 40 /* High 16 bit with signed low */ -+#define R_M32R_LO16_RELA 41 /* Low 16 bit */ -+#define R_M32R_SDA16_RELA 42 /* 16 bit offset in SDA */ -+#define R_M32R_RELA_GNU_VTINHERIT 43 -+#define R_M32R_RELA_GNU_VTENTRY 44 -+#define R_M32R_REL32 45 /* PC relative 32 bit. */ -+ -+#define R_M32R_GOT24 48 /* 24 bit GOT entry */ -+#define R_M32R_26_PLTREL 49 /* 26 bit PC relative to PLT shifted */ -+#define R_M32R_COPY 50 /* Copy symbol at runtime */ -+#define R_M32R_GLOB_DAT 51 /* Create GOT entry */ -+#define R_M32R_JMP_SLOT 52 /* Create PLT entry */ -+#define R_M32R_RELATIVE 53 /* Adjust by program base */ -+#define R_M32R_GOTOFF 54 /* 24 bit offset to GOT */ -+#define R_M32R_GOTPC24 55 /* 24 bit PC relative offset to GOT */ -+#define R_M32R_GOT16_HI_ULO 56 /* High 16 bit GOT entry with unsigned -+ low */ -+#define R_M32R_GOT16_HI_SLO 57 /* High 16 bit GOT entry with signed -+ low */ -+#define R_M32R_GOT16_LO 58 /* Low 16 bit GOT entry */ -+#define R_M32R_GOTPC_HI_ULO 59 /* High 16 bit PC relative offset to -+ GOT with unsigned low */ -+#define R_M32R_GOTPC_HI_SLO 60 /* High 16 bit PC relative offset to -+ GOT with signed low */ -+#define R_M32R_GOTPC_LO 61 /* Low 16 bit PC relative offset to -+ GOT */ -+#define R_M32R_GOTOFF_HI_ULO 62 /* High 16 bit offset to GOT -+ with unsigned low */ -+#define R_M32R_GOTOFF_HI_SLO 63 /* High 16 bit offset to GOT -+ with signed low */ -+#define R_M32R_GOTOFF_LO 64 /* Low 16 bit offset to GOT */ -+#define R_M32R_NUM 256 /* Keep this the last entry. */ -+ -+ -+/* TILEPro relocations. */ -+#define R_TILEPRO_NONE 0 /* No reloc */ -+#define R_TILEPRO_32 1 /* Direct 32 bit */ -+#define R_TILEPRO_16 2 /* Direct 16 bit */ -+#define R_TILEPRO_8 3 /* Direct 8 bit */ -+#define R_TILEPRO_32_PCREL 4 /* PC relative 32 bit */ -+#define R_TILEPRO_16_PCREL 5 /* PC relative 16 bit */ -+#define R_TILEPRO_8_PCREL 6 /* PC relative 8 bit */ -+#define R_TILEPRO_LO16 7 /* Low 16 bit */ -+#define R_TILEPRO_HI16 8 /* High 16 bit */ -+#define R_TILEPRO_HA16 9 /* High 16 bit, adjusted */ -+#define R_TILEPRO_COPY 10 /* Copy relocation */ -+#define R_TILEPRO_GLOB_DAT 11 /* Create GOT entry */ -+#define R_TILEPRO_JMP_SLOT 12 /* Create PLT entry */ -+#define R_TILEPRO_RELATIVE 13 /* Adjust by program base */ -+#define R_TILEPRO_BROFF_X1 14 /* X1 pipe branch offset */ -+#define R_TILEPRO_JOFFLONG_X1 15 /* X1 pipe jump offset */ -+#define R_TILEPRO_JOFFLONG_X1_PLT 16 /* X1 pipe jump offset to PLT */ -+#define R_TILEPRO_IMM8_X0 17 /* X0 pipe 8-bit */ -+#define R_TILEPRO_IMM8_Y0 18 /* Y0 pipe 8-bit */ -+#define R_TILEPRO_IMM8_X1 19 /* X1 pipe 8-bit */ -+#define R_TILEPRO_IMM8_Y1 20 /* Y1 pipe 8-bit */ -+#define R_TILEPRO_MT_IMM15_X1 21 /* X1 pipe mtspr */ -+#define R_TILEPRO_MF_IMM15_X1 22 /* X1 pipe mfspr */ -+#define R_TILEPRO_IMM16_X0 23 /* X0 pipe 16-bit */ -+#define R_TILEPRO_IMM16_X1 24 /* X1 pipe 16-bit */ -+#define R_TILEPRO_IMM16_X0_LO 25 /* X0 pipe low 16-bit */ -+#define R_TILEPRO_IMM16_X1_LO 26 /* X1 pipe low 16-bit */ -+#define R_TILEPRO_IMM16_X0_HI 27 /* X0 pipe high 16-bit */ -+#define R_TILEPRO_IMM16_X1_HI 28 /* X1 pipe high 16-bit */ -+#define R_TILEPRO_IMM16_X0_HA 29 /* X0 pipe high 16-bit, adjusted */ -+#define R_TILEPRO_IMM16_X1_HA 30 /* X1 pipe high 16-bit, adjusted */ -+#define R_TILEPRO_IMM16_X0_PCREL 31 /* X0 pipe PC relative 16 bit */ -+#define R_TILEPRO_IMM16_X1_PCREL 32 /* X1 pipe PC relative 16 bit */ -+#define R_TILEPRO_IMM16_X0_LO_PCREL 33 /* X0 pipe PC relative low 16 bit */ -+#define R_TILEPRO_IMM16_X1_LO_PCREL 34 /* X1 pipe PC relative low 16 bit */ -+#define R_TILEPRO_IMM16_X0_HI_PCREL 35 /* X0 pipe PC relative high 16 bit */ -+#define R_TILEPRO_IMM16_X1_HI_PCREL 36 /* X1 pipe PC relative high 16 bit */ -+#define R_TILEPRO_IMM16_X0_HA_PCREL 37 /* X0 pipe PC relative ha() 16 bit */ -+#define R_TILEPRO_IMM16_X1_HA_PCREL 38 /* X1 pipe PC relative ha() 16 bit */ -+#define R_TILEPRO_IMM16_X0_GOT 39 /* X0 pipe 16-bit GOT offset */ -+#define R_TILEPRO_IMM16_X1_GOT 40 /* X1 pipe 16-bit GOT offset */ -+#define R_TILEPRO_IMM16_X0_GOT_LO 41 /* X0 pipe low 16-bit GOT offset */ -+#define R_TILEPRO_IMM16_X1_GOT_LO 42 /* X1 pipe low 16-bit GOT offset */ -+#define R_TILEPRO_IMM16_X0_GOT_HI 43 /* X0 pipe high 16-bit GOT offset */ -+#define R_TILEPRO_IMM16_X1_GOT_HI 44 /* X1 pipe high 16-bit GOT offset */ -+#define R_TILEPRO_IMM16_X0_GOT_HA 45 /* X0 pipe ha() 16-bit GOT offset */ -+#define R_TILEPRO_IMM16_X1_GOT_HA 46 /* X1 pipe ha() 16-bit GOT offset */ -+#define R_TILEPRO_MMSTART_X0 47 /* X0 pipe mm "start" */ -+#define R_TILEPRO_MMEND_X0 48 /* X0 pipe mm "end" */ -+#define R_TILEPRO_MMSTART_X1 49 /* X1 pipe mm "start" */ -+#define R_TILEPRO_MMEND_X1 50 /* X1 pipe mm "end" */ -+#define R_TILEPRO_SHAMT_X0 51 /* X0 pipe shift amount */ -+#define R_TILEPRO_SHAMT_X1 52 /* X1 pipe shift amount */ -+#define R_TILEPRO_SHAMT_Y0 53 /* Y0 pipe shift amount */ -+#define R_TILEPRO_SHAMT_Y1 54 /* Y1 pipe shift amount */ -+#define R_TILEPRO_DEST_IMM8_X1 55 /* X1 pipe destination 8-bit */ -+/* Relocs 56-59 are currently not defined. */ -+#define R_TILEPRO_TLS_GD_CALL 60 /* "jal" for TLS GD */ -+#define R_TILEPRO_IMM8_X0_TLS_GD_ADD 61 /* X0 pipe "addi" for TLS GD */ -+#define R_TILEPRO_IMM8_X1_TLS_GD_ADD 62 /* X1 pipe "addi" for TLS GD */ -+#define R_TILEPRO_IMM8_Y0_TLS_GD_ADD 63 /* Y0 pipe "addi" for TLS GD */ -+#define R_TILEPRO_IMM8_Y1_TLS_GD_ADD 64 /* Y1 pipe "addi" for TLS GD */ -+#define R_TILEPRO_TLS_IE_LOAD 65 /* "lw_tls" for TLS IE */ -+#define R_TILEPRO_IMM16_X0_TLS_GD 66 /* X0 pipe 16-bit TLS GD offset */ -+#define R_TILEPRO_IMM16_X1_TLS_GD 67 /* X1 pipe 16-bit TLS GD offset */ -+#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68 /* X0 pipe low 16-bit TLS GD offset */ -+#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69 /* X1 pipe low 16-bit TLS GD offset */ -+#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70 /* X0 pipe high 16-bit TLS GD offset */ -+#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71 /* X1 pipe high 16-bit TLS GD offset */ -+#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72 /* X0 pipe ha() 16-bit TLS GD offset */ -+#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73 /* X1 pipe ha() 16-bit TLS GD offset */ -+#define R_TILEPRO_IMM16_X0_TLS_IE 74 /* X0 pipe 16-bit TLS IE offset */ -+#define R_TILEPRO_IMM16_X1_TLS_IE 75 /* X1 pipe 16-bit TLS IE offset */ -+#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76 /* X0 pipe low 16-bit TLS IE offset */ -+#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77 /* X1 pipe low 16-bit TLS IE offset */ -+#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78 /* X0 pipe high 16-bit TLS IE offset */ -+#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79 /* X1 pipe high 16-bit TLS IE offset */ -+#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80 /* X0 pipe ha() 16-bit TLS IE offset */ -+#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81 /* X1 pipe ha() 16-bit TLS IE offset */ -+#define R_TILEPRO_TLS_DTPMOD32 82 /* ID of module containing symbol */ -+#define R_TILEPRO_TLS_DTPOFF32 83 /* Offset in TLS block */ -+#define R_TILEPRO_TLS_TPOFF32 84 /* Offset in static TLS block */ -+#define R_TILEPRO_IMM16_X0_TLS_LE 85 /* X0 pipe 16-bit TLS LE offset */ -+#define R_TILEPRO_IMM16_X1_TLS_LE 86 /* X1 pipe 16-bit TLS LE offset */ -+#define R_TILEPRO_IMM16_X0_TLS_LE_LO 87 /* X0 pipe low 16-bit TLS LE offset */ -+#define R_TILEPRO_IMM16_X1_TLS_LE_LO 88 /* X1 pipe low 16-bit TLS LE offset */ -+#define R_TILEPRO_IMM16_X0_TLS_LE_HI 89 /* X0 pipe high 16-bit TLS LE offset */ -+#define R_TILEPRO_IMM16_X1_TLS_LE_HI 90 /* X1 pipe high 16-bit TLS LE offset */ -+#define R_TILEPRO_IMM16_X0_TLS_LE_HA 91 /* X0 pipe ha() 16-bit TLS LE offset */ -+#define R_TILEPRO_IMM16_X1_TLS_LE_HA 92 /* X1 pipe ha() 16-bit TLS LE offset */ -+ -+#define R_TILEPRO_GNU_VTINHERIT 128 /* GNU C++ vtable hierarchy */ -+#define R_TILEPRO_GNU_VTENTRY 129 /* GNU C++ vtable member usage */ -+ -+#define R_TILEPRO_NUM 130 -+ -+ -+/* TILE-Gx relocations. */ -+#define R_TILEGX_NONE 0 /* No reloc */ -+#define R_TILEGX_64 1 /* Direct 64 bit */ -+#define R_TILEGX_32 2 /* Direct 32 bit */ -+#define R_TILEGX_16 3 /* Direct 16 bit */ -+#define R_TILEGX_8 4 /* Direct 8 bit */ -+#define R_TILEGX_64_PCREL 5 /* PC relative 64 bit */ -+#define R_TILEGX_32_PCREL 6 /* PC relative 32 bit */ -+#define R_TILEGX_16_PCREL 7 /* PC relative 16 bit */ -+#define R_TILEGX_8_PCREL 8 /* PC relative 8 bit */ -+#define R_TILEGX_HW0 9 /* hword 0 16-bit */ -+#define R_TILEGX_HW1 10 /* hword 1 16-bit */ -+#define R_TILEGX_HW2 11 /* hword 2 16-bit */ -+#define R_TILEGX_HW3 12 /* hword 3 16-bit */ -+#define R_TILEGX_HW0_LAST 13 /* last hword 0 16-bit */ -+#define R_TILEGX_HW1_LAST 14 /* last hword 1 16-bit */ -+#define R_TILEGX_HW2_LAST 15 /* last hword 2 16-bit */ -+#define R_TILEGX_COPY 16 /* Copy relocation */ -+#define R_TILEGX_GLOB_DAT 17 /* Create GOT entry */ -+#define R_TILEGX_JMP_SLOT 18 /* Create PLT entry */ -+#define R_TILEGX_RELATIVE 19 /* Adjust by program base */ -+#define R_TILEGX_BROFF_X1 20 /* X1 pipe branch offset */ -+#define R_TILEGX_JUMPOFF_X1 21 /* X1 pipe jump offset */ -+#define R_TILEGX_JUMPOFF_X1_PLT 22 /* X1 pipe jump offset to PLT */ -+#define R_TILEGX_IMM8_X0 23 /* X0 pipe 8-bit */ -+#define R_TILEGX_IMM8_Y0 24 /* Y0 pipe 8-bit */ -+#define R_TILEGX_IMM8_X1 25 /* X1 pipe 8-bit */ -+#define R_TILEGX_IMM8_Y1 26 /* Y1 pipe 8-bit */ -+#define R_TILEGX_DEST_IMM8_X1 27 /* X1 pipe destination 8-bit */ -+#define R_TILEGX_MT_IMM14_X1 28 /* X1 pipe mtspr */ -+#define R_TILEGX_MF_IMM14_X1 29 /* X1 pipe mfspr */ -+#define R_TILEGX_MMSTART_X0 30 /* X0 pipe mm "start" */ -+#define R_TILEGX_MMEND_X0 31 /* X0 pipe mm "end" */ -+#define R_TILEGX_SHAMT_X0 32 /* X0 pipe shift amount */ -+#define R_TILEGX_SHAMT_X1 33 /* X1 pipe shift amount */ -+#define R_TILEGX_SHAMT_Y0 34 /* Y0 pipe shift amount */ -+#define R_TILEGX_SHAMT_Y1 35 /* Y1 pipe shift amount */ -+#define R_TILEGX_IMM16_X0_HW0 36 /* X0 pipe hword 0 */ -+#define R_TILEGX_IMM16_X1_HW0 37 /* X1 pipe hword 0 */ -+#define R_TILEGX_IMM16_X0_HW1 38 /* X0 pipe hword 1 */ -+#define R_TILEGX_IMM16_X1_HW1 39 /* X1 pipe hword 1 */ -+#define R_TILEGX_IMM16_X0_HW2 40 /* X0 pipe hword 2 */ -+#define R_TILEGX_IMM16_X1_HW2 41 /* X1 pipe hword 2 */ -+#define R_TILEGX_IMM16_X0_HW3 42 /* X0 pipe hword 3 */ -+#define R_TILEGX_IMM16_X1_HW3 43 /* X1 pipe hword 3 */ -+#define R_TILEGX_IMM16_X0_HW0_LAST 44 /* X0 pipe last hword 0 */ -+#define R_TILEGX_IMM16_X1_HW0_LAST 45 /* X1 pipe last hword 0 */ -+#define R_TILEGX_IMM16_X0_HW1_LAST 46 /* X0 pipe last hword 1 */ -+#define R_TILEGX_IMM16_X1_HW1_LAST 47 /* X1 pipe last hword 1 */ -+#define R_TILEGX_IMM16_X0_HW2_LAST 48 /* X0 pipe last hword 2 */ -+#define R_TILEGX_IMM16_X1_HW2_LAST 49 /* X1 pipe last hword 2 */ -+#define R_TILEGX_IMM16_X0_HW0_PCREL 50 /* X0 pipe PC relative hword 0 */ -+#define R_TILEGX_IMM16_X1_HW0_PCREL 51 /* X1 pipe PC relative hword 0 */ -+#define R_TILEGX_IMM16_X0_HW1_PCREL 52 /* X0 pipe PC relative hword 1 */ -+#define R_TILEGX_IMM16_X1_HW1_PCREL 53 /* X1 pipe PC relative hword 1 */ -+#define R_TILEGX_IMM16_X0_HW2_PCREL 54 /* X0 pipe PC relative hword 2 */ -+#define R_TILEGX_IMM16_X1_HW2_PCREL 55 /* X1 pipe PC relative hword 2 */ -+#define R_TILEGX_IMM16_X0_HW3_PCREL 56 /* X0 pipe PC relative hword 3 */ -+#define R_TILEGX_IMM16_X1_HW3_PCREL 57 /* X1 pipe PC relative hword 3 */ -+#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL 58 /* X0 pipe PC-rel last hword 0 */ -+#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL 59 /* X1 pipe PC-rel last hword 0 */ -+#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL 60 /* X0 pipe PC-rel last hword 1 */ -+#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL 61 /* X1 pipe PC-rel last hword 1 */ -+#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL 62 /* X0 pipe PC-rel last hword 2 */ -+#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */ -+#define R_TILEGX_IMM16_X0_HW0_GOT 64 /* X0 pipe hword 0 GOT offset */ -+#define R_TILEGX_IMM16_X1_HW0_GOT 65 /* X1 pipe hword 0 GOT offset */ -+/* Relocs 66-71 are currently not defined. */ -+#define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */ -+#define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */ -+#define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */ -+#define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */ -+/* Relocs 76-77 are currently not defined. */ -+#define R_TILEGX_IMM16_X0_HW0_TLS_GD 78 /* X0 pipe hword 0 TLS GD offset */ -+#define R_TILEGX_IMM16_X1_HW0_TLS_GD 79 /* X1 pipe hword 0 TLS GD offset */ -+#define R_TILEGX_IMM16_X0_HW0_TLS_LE 80 /* X0 pipe hword 0 TLS LE offset */ -+#define R_TILEGX_IMM16_X1_HW0_TLS_LE 81 /* X1 pipe hword 0 TLS LE offset */ -+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE 82 /* X0 pipe last hword 0 LE off */ -+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE 83 /* X1 pipe last hword 0 LE off */ -+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE 84 /* X0 pipe last hword 1 LE off */ -+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE 85 /* X1 pipe last hword 1 LE off */ -+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD 86 /* X0 pipe last hword 0 GD off */ -+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD 87 /* X1 pipe last hword 0 GD off */ -+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD 88 /* X0 pipe last hword 1 GD off */ -+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD 89 /* X1 pipe last hword 1 GD off */ -+/* Relocs 90-91 are currently not defined. */ -+#define R_TILEGX_IMM16_X0_HW0_TLS_IE 92 /* X0 pipe hword 0 TLS IE offset */ -+#define R_TILEGX_IMM16_X1_HW0_TLS_IE 93 /* X1 pipe hword 0 TLS IE offset */ -+/* Relocs 94-99 are currently not defined. */ -+#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */ -+#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */ -+#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */ -+#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE 103 /* X1 pipe last hword 1 IE off */ -+/* Relocs 104-105 are currently not defined. */ -+#define R_TILEGX_TLS_DTPMOD64 106 /* 64-bit ID of symbol's module */ -+#define R_TILEGX_TLS_DTPOFF64 107 /* 64-bit offset in TLS block */ -+#define R_TILEGX_TLS_TPOFF64 108 /* 64-bit offset in static TLS block */ -+#define R_TILEGX_TLS_DTPMOD32 109 /* 32-bit ID of symbol's module */ -+#define R_TILEGX_TLS_DTPOFF32 110 /* 32-bit offset in TLS block */ -+#define R_TILEGX_TLS_TPOFF32 111 /* 32-bit offset in static TLS block */ -+#define R_TILEGX_TLS_GD_CALL 112 /* "jal" for TLS GD */ -+#define R_TILEGX_IMM8_X0_TLS_GD_ADD 113 /* X0 pipe "addi" for TLS GD */ -+#define R_TILEGX_IMM8_X1_TLS_GD_ADD 114 /* X1 pipe "addi" for TLS GD */ -+#define R_TILEGX_IMM8_Y0_TLS_GD_ADD 115 /* Y0 pipe "addi" for TLS GD */ -+#define R_TILEGX_IMM8_Y1_TLS_GD_ADD 116 /* Y1 pipe "addi" for TLS GD */ -+#define R_TILEGX_TLS_IE_LOAD 117 /* "ld_tls" for TLS IE */ -+#define R_TILEGX_IMM8_X0_TLS_ADD 118 /* X0 pipe "addi" for TLS GD/IE */ -+#define R_TILEGX_IMM8_X1_TLS_ADD 119 /* X1 pipe "addi" for TLS GD/IE */ -+#define R_TILEGX_IMM8_Y0_TLS_ADD 120 /* Y0 pipe "addi" for TLS GD/IE */ -+#define R_TILEGX_IMM8_Y1_TLS_ADD 121 /* Y1 pipe "addi" for TLS GD/IE */ -+ -+#define R_TILEGX_GNU_VTINHERIT 128 /* GNU C++ vtable hierarchy */ -+#define R_TILEGX_GNU_VTENTRY 129 /* GNU C++ vtable member usage */ -+ -+#define R_TILEGX_NUM 130 -+ -+#endif /* elf.h */ ---- a/scripts/mod/mk_elfconfig.c -+++ b/scripts/mod/mk_elfconfig.c -@@ -2,7 +2,11 @@ - #include - #include - #include -+#ifndef __APPLE__ - #include -+#else -+#include "elf.h" -+#endif - - int - main(int argc, char **argv) ---- a/scripts/mod/modpost.h -+++ b/scripts/mod/modpost.h -@@ -9,7 +9,11 @@ - #include - #include - #include -+#if !(defined(__APPLE__) || defined(__CYGWIN__)) - #include -+#else -+#include "elf.h" -+#endif - - #include "list.h" - #include "elfconfig.h" diff --git a/target/linux/generic/hack-5.19/211-darwin-uuid-typedef-clash.patch b/target/linux/generic/hack-5.19/211-darwin-uuid-typedef-clash.patch deleted file mode 100644 index 50a622714..000000000 --- a/target/linux/generic/hack-5.19/211-darwin-uuid-typedef-clash.patch +++ /dev/null @@ -1,22 +0,0 @@ -From e44fc2af1ddc452b6659d08c16973d65c73b7d0a Mon Sep 17 00:00:00 2001 -From: Kevin Darbyshire-Bryant -Date: Wed, 5 Feb 2020 18:36:43 +0000 -Subject: [PATCH] file2alias: build on macos - -Signed-off-by: Kevin Darbyshire-Bryant ---- - scripts/mod/file2alias.c | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/scripts/mod/file2alias.c -+++ b/scripts/mod/file2alias.c -@@ -38,6 +38,9 @@ typedef struct { - __u8 b[16]; - } guid_t; - -+#ifdef __APPLE__ -+#define uuid_t compat_uuid_t -+#endif - /* backwards compatibility, don't use in new code */ - typedef struct { - __u8 b[16]; diff --git a/target/linux/generic/hack-5.19/212-tools_portability.patch b/target/linux/generic/hack-5.19/212-tools_portability.patch deleted file mode 100644 index b488155f9..000000000 --- a/target/linux/generic/hack-5.19/212-tools_portability.patch +++ /dev/null @@ -1,110 +0,0 @@ -From 48232d3d931c95953ce2ddfe7da7bb164aef6a73 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:03:16 +0200 -Subject: fix portability of some includes files in tools/ used on the host - -Signed-off-by: Felix Fietkau ---- - tools/include/tools/be_byteshift.h | 4 ++++ - tools/include/tools/le_byteshift.h | 4 ++++ - tools/include/tools/linux_types.h | 22 ++++++++++++++++++++++ - 3 files changed, 30 insertions(+) - create mode 100644 tools/include/tools/linux_types.h - ---- a/tools/include/tools/be_byteshift.h -+++ b/tools/include/tools/be_byteshift.h -@@ -2,6 +2,10 @@ - #ifndef _TOOLS_BE_BYTESHIFT_H - #define _TOOLS_BE_BYTESHIFT_H - -+#ifndef __linux__ -+#include "linux_types.h" -+#endif -+ - #include - - static inline uint16_t __get_unaligned_be16(const uint8_t *p) ---- a/tools/include/tools/le_byteshift.h -+++ b/tools/include/tools/le_byteshift.h -@@ -2,6 +2,10 @@ - #ifndef _TOOLS_LE_BYTESHIFT_H - #define _TOOLS_LE_BYTESHIFT_H - -+#ifndef __linux__ -+#include "linux_types.h" -+#endif -+ - #include - - static inline uint16_t __get_unaligned_le16(const uint8_t *p) ---- /dev/null -+++ b/tools/include/tools/linux_types.h -@@ -0,0 +1,26 @@ -+#ifndef __LINUX_TYPES_H -+#define __LINUX_TYPES_H -+ -+#include -+ -+typedef int8_t __s8; -+typedef uint8_t __u8; -+typedef uint8_t __be8; -+typedef uint8_t __le8; -+ -+typedef int16_t __s16; -+typedef uint16_t __u16; -+typedef uint16_t __be16; -+typedef uint16_t __le16; -+ -+typedef int32_t __s32; -+typedef uint32_t __u32; -+typedef uint32_t __be32; -+typedef uint32_t __le32; -+ -+typedef int64_t __s64; -+typedef uint64_t __u64; -+typedef uint64_t __be64; -+typedef uint64_t __le64; -+ -+#endif ---- a/tools/include/linux/types.h -+++ b/tools/include/linux/types.h -@@ -10,8 +10,12 @@ - #define __SANE_USERSPACE_TYPES__ /* For PPC64, to get LL64 types */ - #endif - -+#ifndef __linux__ -+#include -+#else - #include - #include -+#endif - - struct page; - struct kmem_cache; ---- a/tools/perf/pmu-events/jevents.c -+++ b/tools/perf/pmu-events/jevents.c -@@ -1,4 +1,6 @@ -+#ifdef __linux__ - #define _XOPEN_SOURCE 500 /* needed for nftw() */ -+#endif - #define _GNU_SOURCE /* needed for asprintf() */ - - /* Parse event JSON files */ -@@ -35,6 +37,7 @@ - #include - #include - #include -+#include - #include - #include - #include ---- a/tools/perf/pmu-events/json.c -+++ b/tools/perf/pmu-events/json.c -@@ -38,7 +38,6 @@ - #include - #include "jsmn.h" - #include "json.h" --#include - - - static char *mapfile(const char *fn, size_t *size) diff --git a/target/linux/generic/hack-5.19/214-spidev_h_portability.patch b/target/linux/generic/hack-5.19/214-spidev_h_portability.patch deleted file mode 100644 index db754a290..000000000 --- a/target/linux/generic/hack-5.19/214-spidev_h_portability.patch +++ /dev/null @@ -1,24 +0,0 @@ -From be9be95ff10e16a5b4ad36f903978d0cc5747024 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:04:08 +0200 -Subject: kernel: fix linux/spi/spidev.h portability issues with musl - -Felix will try to get this define included into musl - -lede-commit: 795e7cf60de19e7a076a46874fab7bb88b43bbff -Signed-off-by: Felix Fietkau ---- - include/uapi/linux/spi/spidev.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/include/uapi/linux/spi/spidev.h -+++ b/include/uapi/linux/spi/spidev.h -@@ -93,7 +93,7 @@ struct spi_ioc_transfer { - - /* not all platforms use or _IOC_TYPECHECK() ... */ - #define SPI_MSGSIZE(N) \ -- ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \ -+ ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << 13)) \ - ? ((N)*(sizeof (struct spi_ioc_transfer))) : 0) - #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)]) - diff --git a/target/linux/generic/hack-5.19/220-arm-gc_sections.patch b/target/linux/generic/hack-5.19/220-arm-gc_sections.patch deleted file mode 100644 index 6cfc3236b..000000000 --- a/target/linux/generic/hack-5.19/220-arm-gc_sections.patch +++ /dev/null @@ -1,123 +0,0 @@ -From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sat, 15 Jul 2017 23:42:36 +0200 -Subject: use -ffunction-sections, -fdata-sections and --gc-sections - -In combination with kernel symbol export stripping this significantly reduces -the kernel image size. Used on both ARM and MIPS architectures. - -Signed-off-by: Felix Fietkau -Signed-off-by: Jonas Gorski -Signed-off-by: Gabor Juhos ---- ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -121,6 +121,7 @@ config ARM - select HAVE_UID16 - select HAVE_VIRT_CPU_ACCOUNTING_GEN - select IRQ_FORCED_THREADING -+ select HAVE_LD_DEAD_CODE_DATA_ELIMINATION - select MODULES_USE_ELF_REL - select NEED_DMA_MAP_STATE - select OF_EARLY_FLATTREE if OF ---- a/arch/arm/boot/compressed/Makefile -+++ b/arch/arm/boot/compressed/Makefile -@@ -91,6 +91,7 @@ endif - ifeq ($(CONFIG_USE_OF),y) - OBJS += $(libfdt_objs) fdt_check_mem_start.o - endif -+KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL)) - - OBJS += lib1funcs.o ashldi3.o bswapsdi2.o - ---- a/arch/arm/kernel/vmlinux.lds.S -+++ b/arch/arm/kernel/vmlinux.lds.S -@@ -75,7 +75,7 @@ SECTIONS - . = ALIGN(4); - __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { - __start___ex_table = .; -- ARM_MMU_KEEP(*(__ex_table)) -+ KEEP(*(__ex_table)) - __stop___ex_table = .; - } - -@@ -100,24 +100,24 @@ SECTIONS - } - .init.arch.info : { - __arch_info_begin = .; -- *(.arch.info.init) -+ KEEP(*(.arch.info.init)) - __arch_info_end = .; - } - .init.tagtable : { - __tagtable_begin = .; -- *(.taglist.init) -+ KEEP(*(.taglist.init)) - __tagtable_end = .; - } - #ifdef CONFIG_SMP_ON_UP - .init.smpalt : { - __smpalt_begin = .; -- *(.alt.smp.init) -+ KEEP(*(.alt.smp.init)) - __smpalt_end = .; - } - #endif - .init.pv_table : { - __pv_table_begin = .; -- *(.pv_table) -+ KEEP(*(.pv_table)) - __pv_table_end = .; - } - ---- a/arch/arm/include/asm/vmlinux.lds.h -+++ b/arch/arm/include/asm/vmlinux.lds.h -@@ -42,13 +42,13 @@ - #define PROC_INFO \ - . = ALIGN(4); \ - __proc_info_begin = .; \ -- *(.proc.info.init) \ -+ KEEP(*(.proc.info.init)) \ - __proc_info_end = .; - - #define IDMAP_TEXT \ - ALIGN_FUNCTION(); \ - __idmap_text_start = .; \ -- *(.idmap.text) \ -+ KEEP(*(.idmap.text)) \ - __idmap_text_end = .; \ - - #define ARM_DISCARD \ -@@ -109,12 +109,12 @@ - . = ALIGN(8); \ - .ARM.unwind_idx : { \ - __start_unwind_idx = .; \ -- *(.ARM.exidx*) \ -+ KEEP(*(.ARM.exidx*)) \ - __stop_unwind_idx = .; \ - } \ - .ARM.unwind_tab : { \ - __start_unwind_tab = .; \ -- *(.ARM.extab*) \ -+ KEEP(*(.ARM.extab*)) \ - __stop_unwind_tab = .; \ - } - -@@ -126,7 +126,7 @@ - __vectors_lma = .; \ - OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \ - .vectors { \ -- *(.vectors) \ -+ KEEP(*(.vectors)) \ - } \ - .vectors.bhb.loop8 { \ - *(.vectors.bhb.loop8) \ -@@ -144,7 +144,7 @@ - \ - __stubs_lma = .; \ - .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \ -- *(.stubs) \ -+ KEEP(*(.stubs)) \ - } \ - ARM_LMA(__stubs, .stubs); \ - . = __stubs_lma + SIZEOF(.stubs); \ diff --git a/target/linux/generic/hack-5.19/221-module_exports.patch b/target/linux/generic/hack-5.19/221-module_exports.patch deleted file mode 100644 index 13c5b58d8..000000000 --- a/target/linux/generic/hack-5.19/221-module_exports.patch +++ /dev/null @@ -1,102 +0,0 @@ -From b14784e7883390c20ed3ff904892255404a5914b Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:05:53 +0200 -Subject: add an optional config option for stripping all unnecessary symbol exports from the kernel image - -lede-commit: bb5a40c64b7c4f4848509fa0a6625055fc9e66cc -Signed-off-by: Felix Fietkau ---- - include/asm-generic/vmlinux.lds.h | 18 +++++++++++++++--- - include/linux/export.h | 9 ++++++++- - scripts/Makefile.build | 2 +- - 3 files changed, 24 insertions(+), 5 deletions(-) - ---- a/include/asm-generic/vmlinux.lds.h -+++ b/include/asm-generic/vmlinux.lds.h -@@ -81,6 +81,16 @@ - #define RO_EXCEPTION_TABLE - #endif - -+#ifndef SYMTAB_KEEP -+#define SYMTAB_KEEP KEEP(*(SORT(___ksymtab+*))) -+#define SYMTAB_KEEP_GPL KEEP(*(SORT(___ksymtab_gpl+*))) -+#endif -+ -+#ifndef SYMTAB_DISCARD -+#define SYMTAB_DISCARD -+#define SYMTAB_DISCARD_GPL -+#endif -+ - /* Align . to a 8 byte boundary equals to maximum function alignment. */ - #define ALIGN_FUNCTION() . = ALIGN(8) - -@@ -478,14 +488,14 @@ - /* Kernel symbol table: Normal symbols */ \ - __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ - __start___ksymtab = .; \ -- KEEP(*(SORT(___ksymtab+*))) \ -+ SYMTAB_KEEP \ - __stop___ksymtab = .; \ - } \ - \ - /* Kernel symbol table: GPL-only symbols */ \ - __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ - __start___ksymtab_gpl = .; \ -- KEEP(*(SORT(___ksymtab_gpl+*))) \ -+ SYMTAB_KEEP_GPL \ - __stop___ksymtab_gpl = .; \ - } \ - \ -@@ -505,7 +515,7 @@ - \ - /* Kernel symbol table: strings */ \ - __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ -- *(__ksymtab_strings) \ -+ *(__ksymtab_strings+*) \ - } \ - \ - /* __*init sections */ \ -@@ -1023,6 +1033,8 @@ - - #define COMMON_DISCARDS \ - SANITIZER_DISCARDS \ -+ SYMTAB_DISCARD \ -+ SYMTAB_DISCARD_GPL \ - *(.discard) \ - *(.discard.*) \ - *(.modinfo) \ ---- a/include/linux/export.h -+++ b/include/linux/export.h -@@ -72,6 +72,12 @@ struct kernel_symbol { - - #else - -+#ifdef MODULE -+#define __EXPORT_SUFFIX(sym) -+#else -+#define __EXPORT_SUFFIX(sym) "+" #sym -+#endif -+ - /* - * For every exported symbol, do the following: - * -@@ -87,7 +93,7 @@ struct kernel_symbol { - extern typeof(sym) sym; \ - extern const char __kstrtab_##sym[]; \ - extern const char __kstrtabns_##sym[]; \ -- asm(" .section \"__ksymtab_strings\",\"aMS\",%progbits,1 \n" \ -+ asm(" .section \"__ksymtab_strings" __EXPORT_SUFFIX(sym) "\",\"aMS\",%progbits,1 \n" \ - "__kstrtab_" #sym ": \n" \ - " .asciz \"" #sym "\" \n" \ - "__kstrtabns_" #sym ": \n" \ ---- a/scripts/Makefile.build -+++ b/scripts/Makefile.build -@@ -328,7 +328,7 @@ targets += $(real-dtb-y) $(lib-y) $(alwa - # Linker scripts preprocessor (.lds.S -> .lds) - # --------------------------------------------------------------------------- - quiet_cmd_cpp_lds_S = LDS $@ -- cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -U$(ARCH) \ -+ cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -U$(ARCH) \ - -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $< - - $(obj)/%.lds: $(src)/%.lds.S FORCE diff --git a/target/linux/generic/hack-5.19/230-openwrt_lzma_options.patch b/target/linux/generic/hack-5.19/230-openwrt_lzma_options.patch deleted file mode 100644 index 1adc6b9fa..000000000 --- a/target/linux/generic/hack-5.19/230-openwrt_lzma_options.patch +++ /dev/null @@ -1,34 +0,0 @@ -From b3d00b452467f621317953d9e4c6f9ae8dcfd271 Mon Sep 17 00:00:00 2001 -From: Imre Kaloz -Date: Fri, 7 Jul 2017 17:06:55 +0200 -Subject: use the openwrt lzma options for now - -lede-commit: 548de949f392049420a6a1feeef118b30ab8ea8c -Signed-off-by: Imre Kaloz ---- - lib/decompress.c | 1 + - scripts/Makefile.lib | 2 +- - usr/gen_initramfs_list.sh | 10 +++++----- - 3 files changed, 7 insertions(+), 6 deletions(-) - ---- a/lib/decompress.c -+++ b/lib/decompress.c -@@ -53,6 +53,7 @@ static const struct compress_format comp - { {0x1f, 0x9e}, "gzip", gunzip }, - { {0x42, 0x5a}, "bzip2", bunzip2 }, - { {0x5d, 0x00}, "lzma", unlzma }, -+ { {0x6d, 0x00}, "lzma-openwrt", unlzma }, - { {0xfd, 0x37}, "xz", unxz }, - { {0x89, 0x4c}, "lzo", unlzo }, - { {0x02, 0x21}, "lz4", unlz4 }, ---- a/scripts/Makefile.lib -+++ b/scripts/Makefile.lib -@@ -421,7 +421,7 @@ quiet_cmd_bzip2_with_size = BZIP2 $@ - # --------------------------------------------------------------------------- - - quiet_cmd_lzma = LZMA $@ -- cmd_lzma = cat $(real-prereqs) | $(LZMA) -9 > $@ -+ cmd_lzma = { cat $(real-prereqs) | $(LZMA) e -d20 -lc1 -lp2 -pb2 -eos -si -so; $(size_append); } > $@ - - quiet_cmd_lzma_with_size = LZMA $@ - cmd_lzma_with_size = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@ diff --git a/target/linux/generic/hack-5.19/249-udp-tunnel-selection.patch b/target/linux/generic/hack-5.19/249-udp-tunnel-selection.patch deleted file mode 100644 index 2c74298df..000000000 --- a/target/linux/generic/hack-5.19/249-udp-tunnel-selection.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/ipv4/Kconfig -+++ b/net/ipv4/Kconfig -@@ -315,7 +315,7 @@ config NET_IPVTI - on top. - - config NET_UDP_TUNNEL -- tristate -+ tristate "IP: UDP tunneling support" - select NET_IP_TUNNEL - default n - diff --git a/target/linux/generic/hack-5.19/250-netfilter_depends.patch b/target/linux/generic/hack-5.19/250-netfilter_depends.patch deleted file mode 100644 index 045875fd8..000000000 --- a/target/linux/generic/hack-5.19/250-netfilter_depends.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Felix Fietkau -Subject: hack: net: remove bogus netfilter dependencies - -lede-commit: 589d2a377dee27d206fc3725325309cf649e4df6 -Signed-off-by: Felix Fietkau ---- - net/netfilter/Kconfig | 2 -- - 1 file changed, 2 deletions(-) - ---- a/net/netfilter/Kconfig -+++ b/net/netfilter/Kconfig -@@ -253,7 +253,6 @@ config NF_CONNTRACK_FTP - - config NF_CONNTRACK_H323 - tristate "H.323 protocol support" -- depends on IPV6 || IPV6=n - depends on NETFILTER_ADVANCED - help - H.323 is a VoIP signalling protocol from ITU-T. As one of the most -@@ -1110,7 +1109,6 @@ config NETFILTER_XT_TARGET_SECMARK - - config NETFILTER_XT_TARGET_TCPMSS - tristate '"TCPMSS" target support' -- depends on IPV6 || IPV6=n - default m if NETFILTER_ADVANCED=n - help - This option adds a `TCPMSS' target, which allows you to alter the diff --git a/target/linux/generic/hack-5.19/251-kconfig.patch b/target/linux/generic/hack-5.19/251-kconfig.patch deleted file mode 100644 index b53207ef1..000000000 --- a/target/linux/generic/hack-5.19/251-kconfig.patch +++ /dev/null @@ -1,199 +0,0 @@ -From da3c50704f14132f4adf80d48e9a4cd5d46e54c9 Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Fri, 7 Jul 2017 17:09:21 +0200 -Subject: kconfig: owrt specifc dependencies - -Signed-off-by: John Crispin ---- - crypto/Kconfig | 10 +++++----- - drivers/bcma/Kconfig | 1 + - drivers/ssb/Kconfig | 3 ++- - lib/Kconfig | 8 ++++---- - net/netfilter/Kconfig | 2 +- - net/wireless/Kconfig | 17 ++++++++++------- - sound/core/Kconfig | 4 ++-- - 7 files changed, 25 insertions(+), 20 deletions(-) - ---- a/crypto/Kconfig -+++ b/crypto/Kconfig -@@ -34,7 +34,7 @@ config CRYPTO_FIPS - this is. - - config CRYPTO_ALGAPI -- tristate -+ tristate "ALGAPI" - select CRYPTO_ALGAPI2 - help - This option provides the API for cryptographic algorithms. -@@ -43,7 +43,7 @@ config CRYPTO_ALGAPI2 - tristate - - config CRYPTO_AEAD -- tristate -+ tristate "AEAD" - select CRYPTO_AEAD2 - select CRYPTO_ALGAPI - -@@ -54,7 +54,7 @@ config CRYPTO_AEAD2 - select CRYPTO_RNG2 - - config CRYPTO_SKCIPHER -- tristate -+ tristate "SKCIPHER" - select CRYPTO_SKCIPHER2 - select CRYPTO_ALGAPI - -@@ -64,7 +64,7 @@ config CRYPTO_SKCIPHER2 - select CRYPTO_RNG2 - - config CRYPTO_HASH -- tristate -+ tristate "HASH" - select CRYPTO_HASH2 - select CRYPTO_ALGAPI - -@@ -73,7 +73,7 @@ config CRYPTO_HASH2 - select CRYPTO_ALGAPI2 - - config CRYPTO_RNG -- tristate -+ tristate "RNG" - select CRYPTO_RNG2 - select CRYPTO_ALGAPI - ---- a/drivers/bcma/Kconfig -+++ b/drivers/bcma/Kconfig -@@ -16,6 +16,7 @@ if BCMA - # Support for Block-I/O. SELECT this from the driver that needs it. - config BCMA_BLOCKIO - bool -+ default y - - config BCMA_HOST_PCI_POSSIBLE - bool ---- a/drivers/ssb/Kconfig -+++ b/drivers/ssb/Kconfig -@@ -29,6 +29,7 @@ config SSB_SPROM - config SSB_BLOCKIO - bool - depends on SSB -+ default y - - config SSB_PCIHOST_POSSIBLE - bool -@@ -49,7 +50,7 @@ config SSB_PCIHOST - config SSB_B43_PCI_BRIDGE - bool - depends on SSB_PCIHOST -- default n -+ default y - - config SSB_PCMCIAHOST_POSSIBLE - bool ---- a/lib/Kconfig -+++ b/lib/Kconfig -@@ -449,16 +449,16 @@ config BCH_CONST_T - # Textsearch support is select'ed if needed - # - config TEXTSEARCH -- bool -+ bool "Textsearch support" - - config TEXTSEARCH_KMP -- tristate -+ tristate "Textsearch KMP" - - config TEXTSEARCH_BM -- tristate -+ tristate "Textsearch BM" - - config TEXTSEARCH_FSM -- tristate -+ tristate "Textsearch FSM" - - config BTREE - bool ---- a/net/netfilter/Kconfig -+++ b/net/netfilter/Kconfig -@@ -22,7 +22,7 @@ config NETFILTER_SKIP_EGRESS - def_bool NETFILTER_EGRESS && (NET_CLS_ACT || IFB) - - config NETFILTER_NETLINK -- tristate -+ tristate "Netfilter NFNETLINK interface" - - config NETFILTER_FAMILY_BRIDGE - bool ---- a/net/wireless/Kconfig -+++ b/net/wireless/Kconfig -@@ -1,6 +1,6 @@ - # SPDX-License-Identifier: GPL-2.0-only - config WIRELESS_EXT -- bool -+ bool "Wireless extensions" - - config WEXT_CORE - def_bool y -@@ -12,10 +12,10 @@ config WEXT_PROC - depends on WEXT_CORE - - config WEXT_SPY -- bool -+ bool "WEXT_SPY" - - config WEXT_PRIV -- bool -+ bool "WEXT_PRIV" - - config CFG80211 - tristate "cfg80211 - wireless configuration API" -@@ -204,7 +204,7 @@ config CFG80211_WEXT_EXPORT - endif # CFG80211 - - config LIB80211 -- tristate -+ tristate "LIB80211" - default n - help - This options enables a library of common routines used -@@ -213,17 +213,17 @@ config LIB80211 - Drivers should select this themselves if needed. - - config LIB80211_CRYPT_WEP -- tristate -+ tristate "LIB80211_CRYPT_WEP" - select CRYPTO_LIB_ARC4 - - config LIB80211_CRYPT_CCMP -- tristate -+ tristate "LIB80211_CRYPT_CCMP" - select CRYPTO - select CRYPTO_AES - select CRYPTO_CCM - - config LIB80211_CRYPT_TKIP -- tristate -+ tristate "LIB80211_CRYPT_TKIP" - select CRYPTO_LIB_ARC4 - - config LIB80211_DEBUG ---- a/sound/core/Kconfig -+++ b/sound/core/Kconfig -@@ -17,7 +17,7 @@ config SND_DMAENGINE_PCM - tristate - - config SND_HWDEP -- tristate -+ tristate "Sound hardware support" - - config SND_SEQ_DEVICE - tristate -@@ -27,7 +27,7 @@ config SND_RAWMIDI - select SND_SEQ_DEVICE if SND_SEQUENCER != n - - config SND_COMPRESS_OFFLOAD -- tristate -+ tristate "Compression offloading support" - - config SND_JACK - bool diff --git a/target/linux/generic/hack-5.19/253-ksmbd-config.patch b/target/linux/generic/hack-5.19/253-ksmbd-config.patch deleted file mode 100644 index 07769d05d..000000000 --- a/target/linux/generic/hack-5.19/253-ksmbd-config.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -2251,7 +2251,7 @@ config PADATA - bool - - config ASN1 -- tristate -+ tristate "ASN1" - help - Build a simple ASN.1 grammar compiler that produces a bytecode output - that can be interpreted by the ASN.1 stream decoder and used to ---- a/lib/Kconfig -+++ b/lib/Kconfig -@@ -620,7 +620,7 @@ config LIBFDT - bool - - config OID_REGISTRY -- tristate -+ tristate "OID" - help - Enable fast lookup object identifier registry. - diff --git a/target/linux/generic/hack-5.19/259-regmap_dynamic.patch b/target/linux/generic/hack-5.19/259-regmap_dynamic.patch deleted file mode 100644 index 1164c0ac8..000000000 --- a/target/linux/generic/hack-5.19/259-regmap_dynamic.patch +++ /dev/null @@ -1,144 +0,0 @@ -From 811d9e2268a62b830cfe93cd8bc929afcb8b198b Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sat, 15 Jul 2017 21:12:38 +0200 -Subject: kernel: move regmap bloat out of the kernel image if it is only being used in modules - -lede-commit: 96f39119815028073583e4fca3a9c5fe9141e998 -Signed-off-by: Felix Fietkau ---- - drivers/base/regmap/Kconfig | 15 ++++++++++----- - drivers/base/regmap/Makefile | 12 ++++++++---- - drivers/base/regmap/regmap.c | 3 +++ - include/linux/regmap.h | 2 +- - 4 files changed, 22 insertions(+), 10 deletions(-) - ---- a/drivers/base/regmap/Kconfig -+++ b/drivers/base/regmap/Kconfig -@@ -4,10 +4,9 @@ - # subsystems should select the appropriate symbols. - - config REGMAP -- default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_SOUNDWIRE_MBQ || REGMAP_SCCB || REGMAP_I3C || REGMAP_SPI_AVMM || REGMAP_MDIO) - select IRQ_DOMAIN if REGMAP_IRQ - select MDIO_BUS if REGMAP_MDIO -- bool -+ tristate - - config REGCACHE_COMPRESSED - select LZO_COMPRESS -@@ -15,53 +14,67 @@ config REGCACHE_COMPRESSED - bool - - config REGMAP_AC97 -+ select REGMAP - tristate - - config REGMAP_I2C -+ select REGMAP - tristate - depends on I2C - - config REGMAP_SLIMBUS -+ select REGMAP - tristate - depends on SLIMBUS - - config REGMAP_SPI -+ select REGMAP - tristate - depends on SPI - - config REGMAP_SPMI -+ select REGMAP - tristate - depends on SPMI - - config REGMAP_W1 -+ select REGMAP - tristate - depends on W1 - - config REGMAP_MDIO -+ select REGMAP - tristate - - config REGMAP_MMIO -+ select REGMAP - tristate - - config REGMAP_IRQ -+ select REGMAP - bool - - config REGMAP_SOUNDWIRE -+ select REGMAP - tristate - depends on SOUNDWIRE - - config REGMAP_SOUNDWIRE_MBQ -+ select REGMAP - tristate - depends on SOUNDWIRE - - config REGMAP_SCCB -+ select REGMAP - tristate - depends on I2C - - config REGMAP_I3C -+ select REGMAP - tristate - depends on I3C - - config REGMAP_SPI_AVMM -+ select REGMAP - tristate - depends on SPI ---- a/drivers/base/regmap/Makefile -+++ b/drivers/base/regmap/Makefile -@@ -2,10 +2,14 @@ - # For include/trace/define_trace.h to include trace.h - CFLAGS_regmap.o := -I$(src) - --obj-$(CONFIG_REGMAP) += regmap.o regcache.o --obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-flat.o --obj-$(CONFIG_REGCACHE_COMPRESSED) += regcache-lzo.o --obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o -+regmap-core-objs = regmap.o regcache.o regcache-rbtree.o regcache-flat.o -+ifdef CONFIG_DEBUG_FS -+regmap-core-objs += regmap-debugfs.o -+endif -+ifdef CONFIG_REGCACHE_COMPRESSED -+regmap-core-objs += regcache-lzo.o -+endif -+obj-$(CONFIG_REGMAP) += regmap-core.o - obj-$(CONFIG_REGMAP_AC97) += regmap-ac97.o - obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o - obj-$(CONFIG_REGMAP_SLIMBUS) += regmap-slimbus.o ---- a/drivers/base/regmap/regmap.c -+++ b/drivers/base/regmap/regmap.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -3357,3 +3358,5 @@ static int __init regmap_initcall(void) - return 0; - } - postcore_initcall(regmap_initcall); -+ -+MODULE_LICENSE("GPL"); ---- a/include/linux/regmap.h -+++ b/include/linux/regmap.h -@@ -180,7 +180,7 @@ struct reg_sequence { - __ret ?: __tmp; \ - }) - --#ifdef CONFIG_REGMAP -+#if IS_REACHABLE(CONFIG_REGMAP) - - enum regmap_endian { - /* Unspecified -> 0 -> Backwards compatible default */ diff --git a/target/linux/generic/hack-5.19/260-crypto_test_dependencies.patch b/target/linux/generic/hack-5.19/260-crypto_test_dependencies.patch deleted file mode 100644 index 64daa8274..000000000 --- a/target/linux/generic/hack-5.19/260-crypto_test_dependencies.patch +++ /dev/null @@ -1,52 +0,0 @@ -From fd1799b0bf5efa46dd3e6dfbbf3955564807e508 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:12:51 +0200 -Subject: kernel: prevent cryptomgr from pulling in useless extra dependencies for tests that are not run - -Reduces kernel size after LZMA by about 5k on MIPS - -lede-commit: 044c316167e076479a344c59905e5b435b84a77f -Signed-off-by: Felix Fietkau ---- - crypto/Kconfig | 13 ++++++------- - crypto/algboss.c | 4 ++++ - 2 files changed, 10 insertions(+), 7 deletions(-) - ---- a/crypto/Kconfig -+++ b/crypto/Kconfig -@@ -121,13 +121,13 @@ config CRYPTO_MANAGER - cbc(aes). - - config CRYPTO_MANAGER2 -- def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y) -- select CRYPTO_AEAD2 -- select CRYPTO_HASH2 -- select CRYPTO_SKCIPHER2 -- select CRYPTO_AKCIPHER2 -- select CRYPTO_KPP2 -- select CRYPTO_ACOMP2 -+ def_tristate CRYPTO_MANAGER || (CRYPTO_MANAGER!=n && CRYPTO_ALGAPI=y && !CRYPTO_MANAGER_DISABLE_TESTS) -+ select CRYPTO_AEAD2 if !CRYPTO_MANAGER_DISABLE_TESTS -+ select CRYPTO_HASH2 if !CRYPTO_MANAGER_DISABLE_TESTS -+ select CRYPTO_SKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS -+ select CRYPTO_AKCIPHER2 if !CRYPTO_MANAGER_DISABLE_TESTS -+ select CRYPTO_KPP2 if !CRYPTO_MANAGER_DISABLE_TESTS -+ select CRYPTO_ACOMP2 if !CRYPTO_MANAGER_DISABLE_TESTS - - config CRYPTO_USER - tristate "Userspace cryptographic algorithm configuration" ---- a/crypto/algboss.c -+++ b/crypto/algboss.c -@@ -211,8 +211,12 @@ static int cryptomgr_schedule_test(struc - type = alg->cra_flags; - - /* Do not test internal algorithms. */ -+#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS -+ type |= CRYPTO_ALG_TESTED; -+#else - if (type & CRYPTO_ALG_INTERNAL) - type |= CRYPTO_ALG_TESTED; -+#endif - - param->type = type; - diff --git a/target/linux/generic/hack-5.19/261-lib-arc4-unhide.patch b/target/linux/generic/hack-5.19/261-lib-arc4-unhide.patch deleted file mode 100644 index 4ffd8cfa3..000000000 --- a/target/linux/generic/hack-5.19/261-lib-arc4-unhide.patch +++ /dev/null @@ -1,15 +0,0 @@ -This makes it possible to select CONFIG_CRYPTO_LIB_ARC4 directly. We -need this to be able to compile this into the kernel and make use of it -from backports. - ---- a/lib/crypto/Kconfig -+++ b/lib/crypto/Kconfig -@@ -6,7 +6,7 @@ config CRYPTO_LIB_AES - tristate - - config CRYPTO_LIB_ARC4 -- tristate -+ tristate "ARC4 cipher library" - - config CRYPTO_ARCH_HAVE_LIB_BLAKE2S - bool diff --git a/target/linux/generic/hack-5.19/280-rfkill-stubs.patch b/target/linux/generic/hack-5.19/280-rfkill-stubs.patch deleted file mode 100644 index 7a650d132..000000000 --- a/target/linux/generic/hack-5.19/280-rfkill-stubs.patch +++ /dev/null @@ -1,84 +0,0 @@ -From 236c1acdfef5958010ac9814a9872e0a46fd78ee Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Fri, 7 Jul 2017 17:13:44 +0200 -Subject: rfkill: add fake rfkill support - -allow building of modules depending on RFKILL even if RFKILL is not enabled. - -Signed-off-by: John Crispin ---- - include/linux/rfkill.h | 2 +- - net/Makefile | 2 +- - net/rfkill/Kconfig | 14 +++++++++----- - net/rfkill/Makefile | 2 +- - 4 files changed, 12 insertions(+), 8 deletions(-) - ---- a/include/linux/rfkill.h -+++ b/include/linux/rfkill.h -@@ -64,7 +64,7 @@ struct rfkill_ops { - int (*set_block)(void *data, bool blocked); - }; - --#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE) -+#if defined(CONFIG_RFKILL_FULL) || defined(CONFIG_RFKILL_FULL_MODULE) - /** - * rfkill_alloc - Allocate rfkill structure - * @name: name of the struct -- the string is not copied internally ---- a/net/Makefile -+++ b/net/Makefile -@@ -52,7 +52,7 @@ obj-$(CONFIG_TIPC) += tipc/ - obj-$(CONFIG_NETLABEL) += netlabel/ - obj-$(CONFIG_IUCV) += iucv/ - obj-$(CONFIG_SMC) += smc/ --obj-$(CONFIG_RFKILL) += rfkill/ -+obj-$(CONFIG_RFKILL_FULL) += rfkill/ - obj-$(CONFIG_NET_9P) += 9p/ - obj-$(CONFIG_CAIF) += caif/ - obj-$(CONFIG_DCB) += dcb/ ---- a/net/rfkill/Kconfig -+++ b/net/rfkill/Kconfig -@@ -2,7 +2,11 @@ - # - # RF switch subsystem configuration - # --menuconfig RFKILL -+config RFKILL -+ bool -+ default y -+ -+menuconfig RFKILL_FULL - tristate "RF switch subsystem support" - help - Say Y here if you want to have control over RF switches -@@ -14,19 +18,19 @@ menuconfig RFKILL - # LED trigger support - config RFKILL_LEDS - bool -- depends on RFKILL -+ depends on RFKILL_FULL - depends on LEDS_TRIGGERS = y || RFKILL = LEDS_TRIGGERS - default y - - config RFKILL_INPUT - bool "RF switch input support" if EXPERT -- depends on RFKILL -+ depends on RFKILL_FULL - depends on INPUT = y || RFKILL = INPUT - default y if !EXPERT - - config RFKILL_GPIO - tristate "GPIO RFKILL driver" -- depends on RFKILL -+ depends on RFKILL_FULL - depends on GPIOLIB || COMPILE_TEST - default n - help ---- a/net/rfkill/Makefile -+++ b/net/rfkill/Makefile -@@ -5,5 +5,5 @@ - - rfkill-y += core.o - rfkill-$(CONFIG_RFKILL_INPUT) += input.o --obj-$(CONFIG_RFKILL) += rfkill.o -+obj-$(CONFIG_RFKILL_FULL) += rfkill.o - obj-$(CONFIG_RFKILL_GPIO) += rfkill-gpio.o diff --git a/target/linux/generic/hack-5.19/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch b/target/linux/generic/hack-5.19/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch deleted file mode 100644 index f21f20013..000000000 --- a/target/linux/generic/hack-5.19/300-MIPS-r4k_cache-use-more-efficient-cache-blast.patch +++ /dev/null @@ -1,64 +0,0 @@ -From: Ben Menchaca -Date: Fri, 7 Jun 2013 18:35:22 -0500 -Subject: MIPS: r4k_cache: use more efficient cache blast - -Optimize the compiler output for larger cache blast cases that are -common for DMA-based networking. - -Signed-off-by: Ben Menchaca -Signed-off-by: Felix Fietkau ---- ---- a/arch/mips/include/asm/r4kcache.h -+++ b/arch/mips/include/asm/r4kcache.h -@@ -286,14 +286,46 @@ static inline void prot##extra##blast_## - unsigned long end) \ - { \ - unsigned long lsize = cpu_##desc##_line_size(); \ -+ unsigned long lsize_2 = lsize * 2; \ -+ unsigned long lsize_3 = lsize * 3; \ -+ unsigned long lsize_4 = lsize * 4; \ -+ unsigned long lsize_5 = lsize * 5; \ -+ unsigned long lsize_6 = lsize * 6; \ -+ unsigned long lsize_7 = lsize * 7; \ -+ unsigned long lsize_8 = lsize * 8; \ - unsigned long addr = start & ~(lsize - 1); \ -- unsigned long aend = (end - 1) & ~(lsize - 1); \ -+ unsigned long aend = (end + lsize - 1) & ~(lsize - 1); \ -+ int lines = (aend - addr) / lsize; \ - \ -- while (1) { \ -+ while (lines >= 8) { \ -+ prot##cache_op(hitop, addr); \ -+ prot##cache_op(hitop, addr + lsize); \ -+ prot##cache_op(hitop, addr + lsize_2); \ -+ prot##cache_op(hitop, addr + lsize_3); \ -+ prot##cache_op(hitop, addr + lsize_4); \ -+ prot##cache_op(hitop, addr + lsize_5); \ -+ prot##cache_op(hitop, addr + lsize_6); \ -+ prot##cache_op(hitop, addr + lsize_7); \ -+ addr += lsize_8; \ -+ lines -= 8; \ -+ } \ -+ \ -+ if (lines & 0x4) { \ -+ prot##cache_op(hitop, addr); \ -+ prot##cache_op(hitop, addr + lsize); \ -+ prot##cache_op(hitop, addr + lsize_2); \ -+ prot##cache_op(hitop, addr + lsize_3); \ -+ addr += lsize_4; \ -+ } \ -+ \ -+ if (lines & 0x2) { \ -+ prot##cache_op(hitop, addr); \ -+ prot##cache_op(hitop, addr + lsize); \ -+ addr += lsize_2; \ -+ } \ -+ \ -+ if (lines & 0x1) { \ - prot##cache_op(hitop, addr); \ -- if (addr == aend) \ -- break; \ -- addr += lsize; \ - } \ - } - diff --git a/target/linux/generic/hack-5.19/301-mips_image_cmdline_hack.patch b/target/linux/generic/hack-5.19/301-mips_image_cmdline_hack.patch deleted file mode 100644 index df0cfb2c0..000000000 --- a/target/linux/generic/hack-5.19/301-mips_image_cmdline_hack.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: John Crispin -Subject: hack: kernel: add generic image_cmdline hack to MIPS targets - -lede-commit: d59f5b3a987a48508257a0ddbaeadc7909f9f976 -Signed-off-by: Gabor Juhos ---- - arch/mips/Kconfig | 4 ++++ - arch/mips/kernel/head.S | 6 ++++++ - 2 files changed, 10 insertions(+) - ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -1121,6 +1121,10 @@ config MIPS_MSC - config SYNC_R4K - bool - -+config IMAGE_CMDLINE_HACK -+ bool "OpenWrt specific image command line hack" -+ default n -+ - config NO_IOPORT_MAP - def_bool n - ---- a/arch/mips/kernel/head.S -+++ b/arch/mips/kernel/head.S -@@ -79,6 +79,12 @@ FEXPORT(__kernel_entry) - j kernel_entry - #endif /* CONFIG_BOOT_RAW */ - -+#ifdef CONFIG_IMAGE_CMDLINE_HACK -+ .ascii "CMDLINE:" -+EXPORT(__image_cmdline) -+ .fill 0x400 -+#endif /* CONFIG_IMAGE_CMDLINE_HACK */ -+ - __REF - - NESTED(kernel_entry, 16, sp) # kernel entry point diff --git a/target/linux/generic/hack-5.19/321-powerpc_crtsavres_prereq.patch b/target/linux/generic/hack-5.19/321-powerpc_crtsavres_prereq.patch deleted file mode 100644 index 17eba0b35..000000000 --- a/target/linux/generic/hack-5.19/321-powerpc_crtsavres_prereq.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 107c0964cb8db7ca28ac5199426414fdab3c274d Mon Sep 17 00:00:00 2001 -From: "Alexandros C. Couloumbis" -Date: Fri, 7 Jul 2017 17:14:51 +0200 -Subject: hack: arch: powerpc: drop register save/restore library from modules - -Upstream GCC uses a libgcc function for saving/restoring registers. This -makes the code bigger, and upstream kernels need to carry that function -for every single kernel module. Our GCC is patched to avoid those -references, so we can drop the extra bloat for modules. - -lede-commit: e8e1084654f50904e6bf77b70b2de3f137d7b3ec -Signed-off-by: Alexandros C. Couloumbis ---- - arch/powerpc/Makefile | 1 - - 1 file changed, 1 deletion(-) - ---- a/arch/powerpc/Makefile -+++ b/arch/powerpc/Makefile -@@ -42,19 +42,6 @@ machine-$(CONFIG_PPC64) += 64 - machine-$(CONFIG_CPU_LITTLE_ENDIAN) += le - UTS_MACHINE := $(subst $(space),,$(machine-y)) - --# XXX This needs to be before we override LD below --ifdef CONFIG_PPC32 --KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o --else --ifeq ($(call ld-ifversion, -ge, 22500, y),y) --# Have the linker provide sfpr if possible. --# There is a corresponding test in arch/powerpc/lib/Makefile --KBUILD_LDFLAGS_MODULE += --save-restore-funcs --else --KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o --endif --endif -- - ifdef CONFIG_CPU_LITTLE_ENDIAN - KBUILD_CFLAGS += -mlittle-endian - KBUILD_LDFLAGS += -EL diff --git a/target/linux/generic/hack-5.19/410-block-fit-partition-parser.patch b/target/linux/generic/hack-5.19/410-block-fit-partition-parser.patch deleted file mode 100644 index 79d97ebb7..000000000 --- a/target/linux/generic/hack-5.19/410-block-fit-partition-parser.patch +++ /dev/null @@ -1,196 +0,0 @@ ---- a/block/blk.h -+++ b/block/blk.h -@@ -404,6 +404,8 @@ void blk_free_ext_minor(unsigned int min - #define ADDPART_FLAG_NONE 0 - #define ADDPART_FLAG_RAID 1 - #define ADDPART_FLAG_WHOLEDISK 2 -+#define ADDPART_FLAG_READONLY 4 -+#define ADDPART_FLAG_ROOTDEV 8 - int bdev_add_partition(struct gendisk *disk, int partno, sector_t start, - sector_t length); - int bdev_del_partition(struct gendisk *disk, int partno); ---- a/block/partitions/Kconfig -+++ b/block/partitions/Kconfig -@@ -103,6 +103,13 @@ config ATARI_PARTITION - Say Y here if you would like to use hard disks under Linux which - were partitioned under the Atari OS. - -+config FIT_PARTITION -+ bool "Flattened-Image-Tree (FIT) partition support" if PARTITION_ADVANCED -+ default n -+ help -+ Say Y here if your system needs to mount the filesystem part of -+ a Flattened-Image-Tree (FIT) image commonly used with Das U-Boot. -+ - config IBM_PARTITION - bool "IBM disk label and partition support" - depends on PARTITION_ADVANCED && S390 ---- a/block/partitions/Makefile -+++ b/block/partitions/Makefile -@@ -8,6 +8,7 @@ obj-$(CONFIG_ACORN_PARTITION) += acorn.o - obj-$(CONFIG_AMIGA_PARTITION) += amiga.o - obj-$(CONFIG_ATARI_PARTITION) += atari.o - obj-$(CONFIG_AIX_PARTITION) += aix.o -+obj-$(CONFIG_FIT_PARTITION) += fit.o - obj-$(CONFIG_CMDLINE_PARTITION) += cmdline.o - obj-$(CONFIG_MAC_PARTITION) += mac.o - obj-$(CONFIG_LDM_PARTITION) += ldm.o ---- a/block/partitions/check.h -+++ b/block/partitions/check.h -@@ -57,6 +57,7 @@ int amiga_partition(struct parsed_partit - int atari_partition(struct parsed_partitions *state); - int cmdline_partition(struct parsed_partitions *state); - int efi_partition(struct parsed_partitions *state); -+int fit_partition(struct parsed_partitions *state); - int ibm_partition(struct parsed_partitions *); - int karma_partition(struct parsed_partitions *state); - int ldm_partition(struct parsed_partitions *state); -@@ -67,3 +68,5 @@ int sgi_partition(struct parsed_partitio - int sun_partition(struct parsed_partitions *state); - int sysv68_partition(struct parsed_partitions *state); - int ultrix_partition(struct parsed_partitions *state); -+ -+int parse_fit_partitions(struct parsed_partitions *state, u64 start_sector, u64 nr_sectors, int *slot, int add_remain); ---- a/block/partitions/core.c -+++ b/block/partitions/core.c -@@ -11,6 +11,10 @@ - #include - #include - #include -+#ifdef CONFIG_FIT_PARTITION -+#include -+#endif -+ - #include "check.h" - - static int (*check_part[])(struct parsed_partitions *) = { -@@ -47,6 +51,9 @@ static int (*check_part[])(struct parsed - #ifdef CONFIG_EFI_PARTITION - efi_partition, /* this must come before msdos */ - #endif -+#ifdef CONFIG_FIT_PARTITION -+ fit_partition, -+#endif - #ifdef CONFIG_SGI_PARTITION - sgi_partition, - #endif -@@ -399,6 +406,11 @@ static struct block_device *add_partitio - goto out_del; - } - -+#ifdef CONFIG_FIT_PARTITION -+ if (flags & ADDPART_FLAG_READONLY) -+ bdev->bd_read_only = true; -+#endif -+ - /* everything is up and running, commence */ - err = xa_insert(&disk->part_tbl, partno, bdev, GFP_KERNEL); - if (err) -@@ -586,6 +598,11 @@ static bool blk_add_partition(struct gen - (state->parts[p].flags & ADDPART_FLAG_RAID)) - md_autodetect_dev(part->bd_dev); - -+#ifdef CONFIG_FIT_PARTITION -+ if ((state->parts[p].flags & ADDPART_FLAG_ROOTDEV) && ROOT_DEV == 0) -+ ROOT_DEV = part->bd_dev; -+#endif -+ - return true; - } - ---- a/drivers/mtd/ubi/block.c -+++ b/drivers/mtd/ubi/block.c -@@ -433,6 +433,9 @@ int ubiblock_create(struct ubi_volume_in - } - gd->flags |= GENHD_FL_NO_PART; - gd->private_data = dev; -+#ifdef CONFIG_FIT_PARTITION -+ gd->flags |= GENHD_FL_EXT_DEVT; -+#endif - sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id); - set_capacity(gd, disk_capacity); - dev->gd = gd; ---- a/drivers/mtd/mtd_blkdevs.c -+++ b/drivers/mtd/mtd_blkdevs.c -@@ -346,6 +346,9 @@ int add_mtd_blktrans_dev(struct mtd_blkt - gd->first_minor = (new->devnum) << tr->part_bits; - gd->minors = 1 << tr->part_bits; - gd->fops = &mtd_block_ops; -+#ifdef CONFIG_FIT_PARTITION -+ gd->flags |= GENHD_FL_EXT_DEVT; -+#endif - - if (tr->part_bits) { - if (new->devnum < 26) ---- a/block/partitions/efi.c -+++ b/block/partitions/efi.c -@@ -716,6 +716,9 @@ int efi_partition(struct parsed_partitio - gpt_entry *ptes = NULL; - u32 i; - unsigned ssz = queue_logical_block_size(state->disk->queue) / 512; -+#ifdef CONFIG_FIT_PARTITION -+ u32 extra_slot = 64; -+#endif - - if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) { - kfree(gpt); -@@ -749,6 +752,11 @@ int efi_partition(struct parsed_partitio - ARRAY_SIZE(ptes[i].partition_name)); - utf16_le_to_7bit(ptes[i].partition_name, label_max, info->volname); - state->parts[i + 1].has_info = true; -+#ifdef CONFIG_FIT_PARTITION -+ /* If this is a U-Boot FIT volume it may have subpartitions */ -+ if (!efi_guidcmp(ptes[i].partition_type_guid, PARTITION_LINUX_FIT_GUID)) -+ (void) parse_fit_partitions(state, start * ssz, size * ssz, &extra_slot, 1); -+#endif - } - kfree(ptes); - kfree(gpt); ---- a/block/partitions/efi.h -+++ b/block/partitions/efi.h -@@ -51,6 +51,9 @@ - #define PARTITION_LINUX_LVM_GUID \ - EFI_GUID( 0xe6d6d379, 0xf507, 0x44c2, \ - 0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28) -+#define PARTITION_LINUX_FIT_GUID \ -+ EFI_GUID( 0xcae9be83, 0xb15f, 0x49cc, \ -+ 0x86, 0x3f, 0x08, 0x1b, 0x74, 0x4a, 0x2d, 0x93) - - typedef struct _gpt_header { - __le64 signature; ---- a/block/partitions/msdos.c -+++ b/block/partitions/msdos.c -@@ -564,6 +564,15 @@ static void parse_minix(struct parsed_pa - #endif /* CONFIG_MINIX_SUBPARTITION */ - } - -+static void parse_fit_mbr(struct parsed_partitions *state, -+ sector_t offset, sector_t size, int origin) -+{ -+#ifdef CONFIG_FIT_PARTITION -+ u32 extra_slot = 64; -+ (void) parse_fit_partitions(state, offset, size, &extra_slot, 1); -+#endif /* CONFIG_FIT_PARTITION */ -+} -+ - static struct { - unsigned char id; - void (*parse)(struct parsed_partitions *, sector_t, sector_t, int); -@@ -575,6 +584,7 @@ static struct { - {UNIXWARE_PARTITION, parse_unixware}, - {SOLARIS_X86_PARTITION, parse_solaris_x86}, - {NEW_SOLARIS_X86_PARTITION, parse_solaris_x86}, -+ {FIT_PARTITION, parse_fit_mbr}, - {0, NULL}, - }; - ---- a/include/linux/msdos_partition.h -+++ b/include/linux/msdos_partition.h -@@ -31,6 +31,7 @@ enum msdos_sys_ind { - LINUX_LVM_PARTITION = 0x8e, - LINUX_RAID_PARTITION = 0xfd, /* autodetect RAID partition */ - -+ FIT_PARTITION = 0x2e, /* U-Boot uImage.FIT */ - SOLARIS_X86_PARTITION = 0x82, /* also Linux swap partitions */ - NEW_SOLARIS_X86_PARTITION = 0xbf, - diff --git a/target/linux/generic/hack-5.19/420-mtd-set-rootfs-to-be-root-dev.patch b/target/linux/generic/hack-5.19/420-mtd-set-rootfs-to-be-root-dev.patch deleted file mode 100644 index 33efd82aa..000000000 --- a/target/linux/generic/hack-5.19/420-mtd-set-rootfs-to-be-root-dev.patch +++ /dev/null @@ -1,39 +0,0 @@ -From: Gabor Juhos -Subject: kernel/3.1[02]: move MTD root device setup code to mtdcore - -The current code only allows to automatically set -root device on MTD partitions. Move the code to MTD -core to allow to use it with all MTD devices. - -Signed-off-by: Gabor Juhos ---- - drivers/mtd/mtdcore.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -27,6 +27,7 @@ - #include - #include - #include -+#include - #include - - #include -@@ -685,6 +686,16 @@ int add_mtd_device(struct mtd_info *mtd) - of this try_ nonsense, and no bitching about it - either. :) */ - __module_get(THIS_MODULE); -+ -+ if (!strcmp(mtd->name, "rootfs") && -+ IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && -+ ROOT_DEV == 0) { -+ unsigned int index = mtd->index; -+ pr_notice("mtd: device %d (%s) set to be root filesystem\n", -+ mtd->index, mtd->name); -+ ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, index); -+ } -+ - return 0; - - fail_nvmem_add: diff --git a/target/linux/generic/hack-5.19/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch b/target/linux/generic/hack-5.19/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch deleted file mode 100644 index 965a331a1..000000000 --- a/target/linux/generic/hack-5.19/421-drivers-mtd-parsers-add-nvmem-support-to-cmdlinepart.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 6fa9e3678eb002246df1280322b6a024853950a5 Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Mon, 11 Oct 2021 00:53:14 +0200 -Subject: [PATCH] drivers: mtd: parsers: add nvmem support to cmdlinepart - -Assuming cmdlinepart is only one level deep partition scheme and that -static partition are also defined in DTS, we can assign an of_node for -partition declared from bootargs. cmdlinepart have priority than -fiexed-partition parser so in this specific case the parser doesn't -assign an of_node. Fix this by searching a defined of_node using a -similar fixed_partition parser and if a partition is found with the same -label, check that it has the same offset and size and return the DT -of_node to correctly use NVMEM cells. - -Signed-off-by: Ansuel Smith ---- - drivers/mtd/parsers/cmdlinepart.c | 71 +++++++++++++++++++++++++++++++ - 1 file changed, 71 insertions(+) - ---- a/drivers/mtd/parsers/cmdlinepart.c -+++ b/drivers/mtd/parsers/cmdlinepart.c -@@ -43,6 +43,7 @@ - #include - #include - #include -+#include - - /* debug macro */ - #if 0 -@@ -323,6 +324,68 @@ static int mtdpart_setup_real(char *s) - return 0; - } - -+static int search_fixed_partition(struct mtd_info *master, -+ struct mtd_partition *target_part, -+ struct mtd_partition *fixed_part) -+{ -+ struct device_node *mtd_node; -+ struct device_node *ofpart_node; -+ struct device_node *pp; -+ struct mtd_partition part; -+ const char *partname; -+ -+ mtd_node = mtd_get_of_node(master); -+ if (!mtd_node) -+ return -EINVAL; -+ -+ ofpart_node = of_get_child_by_name(mtd_node, "partitions"); -+ -+ for_each_child_of_node(ofpart_node, pp) { -+ const __be32 *reg; -+ int len; -+ int a_cells, s_cells; -+ -+ reg = of_get_property(pp, "reg", &len); -+ if (!reg) { -+ pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n", -+ master->name, pp, -+ mtd_node); -+ continue; -+ } -+ -+ a_cells = of_n_addr_cells(pp); -+ s_cells = of_n_size_cells(pp); -+ if (len / 4 != a_cells + s_cells) { -+ pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n", -+ master->name, pp, -+ mtd_node); -+ continue; -+ } -+ -+ part.offset = of_read_number(reg, a_cells); -+ part.size = of_read_number(reg + a_cells, s_cells); -+ part.of_node = pp; -+ -+ partname = of_get_property(pp, "label", &len); -+ if (!partname) -+ partname = of_get_property(pp, "name", &len); -+ part.name = partname; -+ -+ if (!strncmp(target_part->name, part.name, len)) { -+ if (part.offset != target_part->offset) -+ return -EINVAL; -+ -+ if (part.size != target_part->size) -+ return -EINVAL; -+ -+ memcpy(fixed_part, &part, sizeof(struct mtd_partition)); -+ return 0; -+ } -+ } -+ -+ return -EINVAL; -+} -+ - /* - * Main function to be called from the MTD mapping driver/device to - * obtain the partitioning information. At this point the command line -@@ -338,6 +401,7 @@ static int parse_cmdline_partitions(stru - int i, err; - struct cmdline_mtd_partition *part; - const char *mtd_id = master->name; -+ struct mtd_partition fixed_part; - - /* parse command line */ - if (!cmdline_parsed) { -@@ -382,6 +446,13 @@ static int parse_cmdline_partitions(stru - sizeof(*part->parts) * (part->num_parts - i)); - i--; - } -+ -+ err = search_fixed_partition(master, &part->parts[i], &fixed_part); -+ if (!err) { -+ part->parts[i].of_node = fixed_part.of_node; -+ pr_info("Found partition defined in DT for %s. Assigning OF node to support nvmem.", -+ part->parts[i].name); -+ } - } - - *pparts = kmemdup(part->parts, sizeof(*part->parts) * part->num_parts, diff --git a/target/linux/generic/hack-5.19/430-mtk-bmt-support.patch b/target/linux/generic/hack-5.19/430-mtk-bmt-support.patch deleted file mode 100644 index f782e07cd..000000000 --- a/target/linux/generic/hack-5.19/430-mtk-bmt-support.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/drivers/mtd/nand/Kconfig -+++ b/drivers/mtd/nand/Kconfig -@@ -61,6 +61,10 @@ config MTD_NAND_ECC_MEDIATEK - help - This enables support for the hardware ECC engine from Mediatek. - -+config MTD_NAND_MTK_BMT -+ bool "Support MediaTek NAND Bad-block Management Table" -+ default n -+ - endmenu - - endmenu ---- a/drivers/mtd/nand/Makefile -+++ b/drivers/mtd/nand/Makefile -@@ -3,6 +3,7 @@ - nandcore-objs := core.o bbt.o - obj-$(CONFIG_MTD_NAND_CORE) += nandcore.o - obj-$(CONFIG_MTD_NAND_ECC_MEDIATEK) += ecc-mtk.o -+obj-$(CONFIG_MTD_NAND_MTK_BMT) += mtk_bmt.o mtk_bmt_v2.o mtk_bmt_bbt.o mtk_bmt_nmbm.o - - obj-y += onenand/ - obj-y += raw/ diff --git a/target/linux/generic/hack-5.19/640-bridge-only-accept-EAP-locally.patch b/target/linux/generic/hack-5.19/640-bridge-only-accept-EAP-locally.patch deleted file mode 100644 index 2356c58a5..000000000 --- a/target/linux/generic/hack-5.19/640-bridge-only-accept-EAP-locally.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:18:54 +0200 -Subject: bridge: only accept EAP locally - -When bridging, do not forward EAP frames to other ports, only deliver -them locally, regardless of the state. - -Signed-off-by: Felix Fietkau -[add disable_eap_hack sysfs attribute] -Signed-off-by: Etienne Champetier ---- - ---- a/net/bridge/br_input.c -+++ b/net/bridge/br_input.c -@@ -133,10 +133,14 @@ int br_handle_frame_finish(struct net *n - } - } - -+ BR_INPUT_SKB_CB(skb)->brdev = br->dev; -+ -+ if (skb->protocol == htons(ETH_P_PAE) && !br->disable_eap_hack) -+ return br_pass_frame_up(skb); -+ - if (state == BR_STATE_LEARNING) - goto drop; - -- BR_INPUT_SKB_CB(skb)->brdev = br->dev; - BR_INPUT_SKB_CB(skb)->src_port_isolated = !!(p->flags & BR_ISOLATED); - - if (IS_ENABLED(CONFIG_INET) && ---- a/net/bridge/br_private.h -+++ b/net/bridge/br_private.h -@@ -482,6 +482,8 @@ struct net_bridge { - u16 group_fwd_mask; - u16 group_fwd_mask_required; - -+ bool disable_eap_hack; -+ - /* STP */ - bridge_id designated_root; - bridge_id bridge_id; diff --git a/target/linux/generic/hack-5.19/645-netfilter-connmark-introduce-set-dscpmark.patch b/target/linux/generic/hack-5.19/645-netfilter-connmark-introduce-set-dscpmark.patch deleted file mode 100644 index 2d3fe01a7..000000000 --- a/target/linux/generic/hack-5.19/645-netfilter-connmark-introduce-set-dscpmark.patch +++ /dev/null @@ -1,212 +0,0 @@ -From eda40b8c8c82e0f2789d6bc8bf63846dce2e8f32 Mon Sep 17 00:00:00 2001 -From: Kevin Darbyshire-Bryant -Date: Sat, 23 Mar 2019 09:29:49 +0000 -Subject: [PATCH] netfilter: connmark: introduce set-dscpmark - -set-dscpmark is a method of storing the DSCP of an ip packet into -conntrack mark. In combination with a suitable tc filter action -(act_ctinfo) DSCP values are able to be stored in the mark on egress and -restored on ingress across links that otherwise alter or bleach DSCP. - -This is useful for qdiscs such as CAKE which are able to shape according -to policies based on DSCP. - -Ingress classification is traditionally a challenging task since -iptables rules haven't yet run and tc filter/eBPF programs are pre-NAT -lookups, hence are unable to see internal IPv4 addresses as used on the -typical home masquerading gateway. - -x_tables CONNMARK set-dscpmark target solves the problem of storing the -DSCP to the conntrack mark in a way suitable for the new act_ctinfo tc -action to restore. - -The set-dscpmark option accepts 2 parameters, a 32bit 'dscpmask' and a -32bit 'statemask'. The dscp mask must be 6 contiguous bits and -represents the area where the DSCP will be stored in the connmark. The -state mask is a minimum 1 bit length mask that must not overlap with the -dscpmask. It represents a flag which is set when the DSCP has been -stored in the conntrack mark. This is useful to implement a 'one shot' -iptables based classification where the 'complicated' iptables rules are -only run once to classify the connection on initial (egress) packet and -subsequent packets are all marked/restored with the same DSCP. A state -mask of zero disables the setting of a status bit/s. - -example syntax with a suitably modified iptables user space application: - -iptables -A QOS_MARK_eth0 -t mangle -j CONNMARK --set-dscpmark 0xfc000000/0x01000000 - -Would store the DSCP in the top 6 bits of the 32bit mark field, and use -the LSB of the top byte as the 'DSCP has been stored' marker. - -|----0xFC----conntrack mark----000000---| -| Bits 31-26 | bit 25 | bit24 |~~~ Bit 0| -| DSCP | unused | flag |unused | -|-----------------------0x01---000000---| - ^ ^ - | | - ---| Conditional flag - | set this when dscp -|-ip diffserv-| stored in mark -| 6 bits | -|-------------| - -an identically configured tc action to restore looks like: - -tc filter show dev eth0 ingress -filter parent ffff: protocol all pref 10 u32 chain 0 -filter parent ffff: protocol all pref 10 u32 chain 0 fh 800: ht divisor 1 -filter parent ffff: protocol all pref 10 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1: not_in_hw - match 00000000/00000000 at 0 - action order 1: ctinfo zone 0 pipe - index 2 ref 1 bind 1 dscp 0xfc000000/0x1000000 - - action order 2: mirred (Egress Redirect to device ifb4eth0) stolen - index 1 ref 1 bind 1 - -|----0xFC----conntrack mark----000000---| -| Bits 31-26 | bit 25 | bit24 |~~~ Bit 0| -| DSCP | unused | flag |unused | -|-----------------------0x01---000000---| - | | - | | - ---| Conditional flag - v only restore if set -|-ip diffserv-| -| 6 bits | -|-------------| - -Signed-off-by: Kevin Darbyshire-Bryant ---- - include/uapi/linux/netfilter/xt_connmark.h | 10 ++++ - net/netfilter/xt_connmark.c | 55 ++++++++++++++++++---- - 2 files changed, 57 insertions(+), 8 deletions(-) - ---- a/include/uapi/linux/netfilter/xt_connmark.h -+++ b/include/uapi/linux/netfilter/xt_connmark.h -@@ -20,6 +20,11 @@ enum { - }; - - enum { -+ XT_CONNMARK_VALUE = (1 << 0), -+ XT_CONNMARK_DSCP = (1 << 1) -+}; -+ -+enum { - D_SHIFT_LEFT = 0, - D_SHIFT_RIGHT, - }; -@@ -34,6 +39,11 @@ struct xt_connmark_tginfo2 { - __u8 shift_dir, shift_bits, mode; - }; - -+struct xt_connmark_tginfo3 { -+ __u32 ctmark, ctmask, nfmask; -+ __u8 shift_dir, shift_bits, mode, func; -+}; -+ - struct xt_connmark_mtinfo1 { - __u32 mark, mask; - __u8 invert; ---- a/net/netfilter/xt_connmark.c -+++ b/net/netfilter/xt_connmark.c -@@ -24,12 +24,13 @@ MODULE_ALIAS("ipt_connmark"); - MODULE_ALIAS("ip6t_connmark"); - - static unsigned int --connmark_tg_shift(struct sk_buff *skb, const struct xt_connmark_tginfo2 *info) -+connmark_tg_shift(struct sk_buff *skb, const struct xt_connmark_tginfo3 *info) - { - enum ip_conntrack_info ctinfo; - u_int32_t new_targetmark; - struct nf_conn *ct; - u_int32_t newmark; -+ u_int8_t dscp; - - ct = nf_ct_get(skb, &ctinfo); - if (ct == NULL) -@@ -37,12 +38,24 @@ connmark_tg_shift(struct sk_buff *skb, c - - switch (info->mode) { - case XT_CONNMARK_SET: -- newmark = (ct->mark & ~info->ctmask) ^ info->ctmark; -- if (info->shift_dir == D_SHIFT_RIGHT) -- newmark >>= info->shift_bits; -- else -- newmark <<= info->shift_bits; -+ newmark = ct->mark; -+ if (info->func & XT_CONNMARK_VALUE) { -+ newmark = (newmark & ~info->ctmask) ^ info->ctmark; -+ if (info->shift_dir == D_SHIFT_RIGHT) -+ newmark >>= info->shift_bits; -+ else -+ newmark <<= info->shift_bits; -+ } else if (info->func & XT_CONNMARK_DSCP) { -+ if (skb->protocol == htons(ETH_P_IP)) -+ dscp = ipv4_get_dsfield(ip_hdr(skb)) >> 2; -+ else if (skb->protocol == htons(ETH_P_IPV6)) -+ dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> 2; -+ else /* protocol doesn't have diffserv */ -+ break; - -+ newmark = (newmark & ~info->ctmark) | -+ (info->ctmask | (dscp << info->shift_bits)); -+ } - if (ct->mark != newmark) { - ct->mark = newmark; - nf_conntrack_event_cache(IPCT_MARK, ct); -@@ -81,20 +94,36 @@ static unsigned int - connmark_tg(struct sk_buff *skb, const struct xt_action_param *par) - { - const struct xt_connmark_tginfo1 *info = par->targinfo; -- const struct xt_connmark_tginfo2 info2 = { -+ const struct xt_connmark_tginfo3 info3 = { - .ctmark = info->ctmark, - .ctmask = info->ctmask, - .nfmask = info->nfmask, - .mode = info->mode, -+ .func = XT_CONNMARK_VALUE - }; - -- return connmark_tg_shift(skb, &info2); -+ return connmark_tg_shift(skb, &info3); - } - - static unsigned int - connmark_tg_v2(struct sk_buff *skb, const struct xt_action_param *par) - { - const struct xt_connmark_tginfo2 *info = par->targinfo; -+ const struct xt_connmark_tginfo3 info3 = { -+ .ctmark = info->ctmark, -+ .ctmask = info->ctmask, -+ .nfmask = info->nfmask, -+ .mode = info->mode, -+ .func = XT_CONNMARK_VALUE -+ }; -+ -+ return connmark_tg_shift(skb, &info3); -+} -+ -+static unsigned int -+connmark_tg_v3(struct sk_buff *skb, const struct xt_action_param *par) -+{ -+ const struct xt_connmark_tginfo3 *info = par->targinfo; - - return connmark_tg_shift(skb, info); - } -@@ -165,6 +194,16 @@ static struct xt_target connmark_tg_reg[ - .targetsize = sizeof(struct xt_connmark_tginfo2), - .destroy = connmark_tg_destroy, - .me = THIS_MODULE, -+ }, -+ { -+ .name = "CONNMARK", -+ .revision = 3, -+ .family = NFPROTO_UNSPEC, -+ .checkentry = connmark_tg_check, -+ .target = connmark_tg_v3, -+ .targetsize = sizeof(struct xt_connmark_tginfo3), -+ .destroy = connmark_tg_destroy, -+ .me = THIS_MODULE, - } - }; - diff --git a/target/linux/generic/hack-5.19/650-netfilter-add-xt_FLOWOFFLOAD-target.patch b/target/linux/generic/hack-5.19/650-netfilter-add-xt_FLOWOFFLOAD-target.patch deleted file mode 100644 index fdac77b96..000000000 --- a/target/linux/generic/hack-5.19/650-netfilter-add-xt_FLOWOFFLOAD-target.patch +++ /dev/null @@ -1,776 +0,0 @@ -From: Felix Fietkau -Date: Tue, 20 Feb 2018 15:56:02 +0100 -Subject: [PATCH] netfilter: add xt_FLOWOFFLOAD target - -Signed-off-by: Felix Fietkau ---- - create mode 100644 net/netfilter/xt_OFFLOAD.c - ---- a/net/netfilter/Kconfig -+++ b/net/netfilter/Kconfig -@@ -712,8 +712,6 @@ config NFT_REJECT_NETDEV - - endif # NF_TABLES_NETDEV - --endif # NF_TABLES -- - config NF_FLOW_TABLE_INET - tristate "Netfilter flow table mixed IPv4/IPv6 module" - depends on NF_FLOW_TABLE -@@ -722,11 +720,12 @@ config NF_FLOW_TABLE_INET - - To compile it as a module, choose M here. - -+endif # NF_TABLES -+ - config NF_FLOW_TABLE - tristate "Netfilter flow table module" - depends on NETFILTER_INGRESS - depends on NF_CONNTRACK -- depends on NF_TABLES - help - This option adds the flow table core infrastructure. - -@@ -1015,6 +1014,15 @@ config NETFILTER_XT_TARGET_NOTRACK - depends on NETFILTER_ADVANCED - select NETFILTER_XT_TARGET_CT - -+config NETFILTER_XT_TARGET_FLOWOFFLOAD -+ tristate '"FLOWOFFLOAD" target support' -+ depends on NF_FLOW_TABLE -+ depends on NETFILTER_INGRESS -+ help -+ This option adds a `FLOWOFFLOAD' target, which uses the nf_flow_offload -+ module to speed up processing of packets by bypassing the usual -+ netfilter chains -+ - config NETFILTER_XT_TARGET_RATEEST - tristate '"RATEEST" target support' - depends on NETFILTER_ADVANCED ---- a/net/netfilter/Makefile -+++ b/net/netfilter/Makefile -@@ -147,6 +147,7 @@ obj-$(CONFIG_NETFILTER_XT_TARGET_CLASSIF - obj-$(CONFIG_NETFILTER_XT_TARGET_CONNSECMARK) += xt_CONNSECMARK.o - obj-$(CONFIG_NETFILTER_XT_TARGET_CT) += xt_CT.o - obj-$(CONFIG_NETFILTER_XT_TARGET_DSCP) += xt_DSCP.o -+obj-$(CONFIG_NETFILTER_XT_TARGET_FLOWOFFLOAD) += xt_FLOWOFFLOAD.o - obj-$(CONFIG_NETFILTER_XT_TARGET_HL) += xt_HL.o - obj-$(CONFIG_NETFILTER_XT_TARGET_HMARK) += xt_HMARK.o - obj-$(CONFIG_NETFILTER_XT_TARGET_LED) += xt_LED.o ---- /dev/null -+++ b/net/netfilter/xt_FLOWOFFLOAD.c -@@ -0,0 +1,694 @@ -+/* -+ * Copyright (C) 2018-2021 Felix Fietkau -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+struct xt_flowoffload_hook { -+ struct hlist_node list; -+ struct nf_hook_ops ops; -+ struct net *net; -+ bool registered; -+ bool used; -+}; -+ -+struct xt_flowoffload_table { -+ struct nf_flowtable ft; -+ struct hlist_head hooks; -+ struct delayed_work work; -+}; -+ -+struct nf_forward_info { -+ const struct net_device *indev; -+ const struct net_device *outdev; -+ const struct net_device *hw_outdev; -+ struct id { -+ __u16 id; -+ __be16 proto; -+ } encap[NF_FLOW_TABLE_ENCAP_MAX]; -+ u8 num_encaps; -+ u8 ingress_vlans; -+ u8 h_source[ETH_ALEN]; -+ u8 h_dest[ETH_ALEN]; -+ enum flow_offload_xmit_type xmit_type; -+}; -+ -+static DEFINE_SPINLOCK(hooks_lock); -+ -+struct xt_flowoffload_table flowtable[2]; -+ -+static unsigned int -+xt_flowoffload_net_hook(void *priv, struct sk_buff *skb, -+ const struct nf_hook_state *state) -+{ -+ struct vlan_ethhdr *veth; -+ __be16 proto; -+ -+ switch (skb->protocol) { -+ case htons(ETH_P_8021Q): -+ veth = (struct vlan_ethhdr *)skb_mac_header(skb); -+ proto = veth->h_vlan_encapsulated_proto; -+ break; -+ case htons(ETH_P_PPP_SES): -+ proto = nf_flow_pppoe_proto(skb); -+ break; -+ default: -+ proto = skb->protocol; -+ break; -+ } -+ -+ switch (proto) { -+ case htons(ETH_P_IP): -+ return nf_flow_offload_ip_hook(priv, skb, state); -+ case htons(ETH_P_IPV6): -+ return nf_flow_offload_ipv6_hook(priv, skb, state); -+ } -+ -+ return NF_ACCEPT; -+} -+ -+static int -+xt_flowoffload_create_hook(struct xt_flowoffload_table *table, -+ struct net_device *dev) -+{ -+ struct xt_flowoffload_hook *hook; -+ struct nf_hook_ops *ops; -+ -+ hook = kzalloc(sizeof(*hook), GFP_ATOMIC); -+ if (!hook) -+ return -ENOMEM; -+ -+ ops = &hook->ops; -+ ops->pf = NFPROTO_NETDEV; -+ ops->hooknum = NF_NETDEV_INGRESS; -+ ops->priority = 10; -+ ops->priv = &table->ft; -+ ops->hook = xt_flowoffload_net_hook; -+ ops->dev = dev; -+ -+ hlist_add_head(&hook->list, &table->hooks); -+ mod_delayed_work(system_power_efficient_wq, &table->work, 0); -+ -+ return 0; -+} -+ -+static struct xt_flowoffload_hook * -+flow_offload_lookup_hook(struct xt_flowoffload_table *table, -+ struct net_device *dev) -+{ -+ struct xt_flowoffload_hook *hook; -+ -+ hlist_for_each_entry(hook, &table->hooks, list) { -+ if (hook->ops.dev == dev) -+ return hook; -+ } -+ -+ return NULL; -+} -+ -+static void -+xt_flowoffload_check_device(struct xt_flowoffload_table *table, -+ struct net_device *dev) -+{ -+ struct xt_flowoffload_hook *hook; -+ -+ if (!dev) -+ return; -+ -+ spin_lock_bh(&hooks_lock); -+ hook = flow_offload_lookup_hook(table, dev); -+ if (hook) -+ hook->used = true; -+ else -+ xt_flowoffload_create_hook(table, dev); -+ spin_unlock_bh(&hooks_lock); -+} -+ -+static void -+xt_flowoffload_register_hooks(struct xt_flowoffload_table *table) -+{ -+ struct xt_flowoffload_hook *hook; -+ -+restart: -+ hlist_for_each_entry(hook, &table->hooks, list) { -+ if (hook->registered) -+ continue; -+ -+ hook->registered = true; -+ hook->net = dev_net(hook->ops.dev); -+ spin_unlock_bh(&hooks_lock); -+ nf_register_net_hook(hook->net, &hook->ops); -+ if (table->ft.flags & NF_FLOWTABLE_HW_OFFLOAD) -+ table->ft.type->setup(&table->ft, hook->ops.dev, -+ FLOW_BLOCK_BIND); -+ spin_lock_bh(&hooks_lock); -+ goto restart; -+ } -+ -+} -+ -+static bool -+xt_flowoffload_cleanup_hooks(struct xt_flowoffload_table *table) -+{ -+ struct xt_flowoffload_hook *hook; -+ bool active = false; -+ -+restart: -+ spin_lock_bh(&hooks_lock); -+ hlist_for_each_entry(hook, &table->hooks, list) { -+ if (hook->used || !hook->registered) { -+ active = true; -+ continue; -+ } -+ -+ hlist_del(&hook->list); -+ spin_unlock_bh(&hooks_lock); -+ if (table->ft.flags & NF_FLOWTABLE_HW_OFFLOAD) -+ table->ft.type->setup(&table->ft, hook->ops.dev, -+ FLOW_BLOCK_UNBIND); -+ nf_unregister_net_hook(hook->net, &hook->ops); -+ kfree(hook); -+ goto restart; -+ } -+ spin_unlock_bh(&hooks_lock); -+ -+ return active; -+} -+ -+static void -+xt_flowoffload_check_hook(struct flow_offload *flow, void *data) -+{ -+ struct xt_flowoffload_table *table = data; -+ struct flow_offload_tuple *tuple0 = &flow->tuplehash[0].tuple; -+ struct flow_offload_tuple *tuple1 = &flow->tuplehash[1].tuple; -+ struct xt_flowoffload_hook *hook; -+ -+ spin_lock_bh(&hooks_lock); -+ hlist_for_each_entry(hook, &table->hooks, list) { -+ if (hook->ops.dev->ifindex != tuple0->iifidx && -+ hook->ops.dev->ifindex != tuple1->iifidx) -+ continue; -+ -+ hook->used = true; -+ } -+ spin_unlock_bh(&hooks_lock); -+} -+ -+static void -+xt_flowoffload_hook_work(struct work_struct *work) -+{ -+ struct xt_flowoffload_table *table; -+ struct xt_flowoffload_hook *hook; -+ int err; -+ -+ table = container_of(work, struct xt_flowoffload_table, work.work); -+ -+ spin_lock_bh(&hooks_lock); -+ xt_flowoffload_register_hooks(table); -+ hlist_for_each_entry(hook, &table->hooks, list) -+ hook->used = false; -+ spin_unlock_bh(&hooks_lock); -+ -+ -+ -+ if (err && err != -EAGAIN) -+ goto out; -+ -+ if (!xt_flowoffload_cleanup_hooks(table)) -+ return; -+ -+out: -+ queue_delayed_work(system_power_efficient_wq, &table->work, HZ); -+} -+ -+static bool -+xt_flowoffload_skip(struct sk_buff *skb, int family) -+{ -+ if (skb_sec_path(skb)) -+ return true; -+ -+ if (family == NFPROTO_IPV4) { -+ const struct ip_options *opt = &(IPCB(skb)->opt); -+ -+ if (unlikely(opt->optlen)) -+ return true; -+ } -+ -+ return false; -+} -+ -+static enum flow_offload_xmit_type nf_xmit_type(struct dst_entry *dst) -+{ -+ if (dst_xfrm(dst)) -+ return FLOW_OFFLOAD_XMIT_XFRM; -+ -+ return FLOW_OFFLOAD_XMIT_NEIGH; -+} -+ -+static void nf_default_forward_path(struct nf_flow_route *route, -+ struct dst_entry *dst_cache, -+ enum ip_conntrack_dir dir, -+ struct net_device **dev) -+{ -+ dev[!dir] = dst_cache->dev; -+ route->tuple[!dir].in.ifindex = dst_cache->dev->ifindex; -+ route->tuple[dir].dst = dst_cache; -+ route->tuple[dir].xmit_type = nf_xmit_type(dst_cache); -+} -+ -+static bool nf_is_valid_ether_device(const struct net_device *dev) -+{ -+ if (!dev || (dev->flags & IFF_LOOPBACK) || dev->type != ARPHRD_ETHER || -+ dev->addr_len != ETH_ALEN || !is_valid_ether_addr(dev->dev_addr)) -+ return false; -+ -+ return true; -+} -+ -+static void nf_dev_path_info(const struct net_device_path_stack *stack, -+ struct nf_forward_info *info, -+ unsigned char *ha) -+{ -+ const struct net_device_path *path; -+ int i; -+ -+ memcpy(info->h_dest, ha, ETH_ALEN); -+ -+ for (i = 0; i < stack->num_paths; i++) { -+ path = &stack->path[i]; -+ switch (path->type) { -+ case DEV_PATH_ETHERNET: -+ case DEV_PATH_DSA: -+ case DEV_PATH_VLAN: -+ case DEV_PATH_PPPOE: -+ info->indev = path->dev; -+ if (is_zero_ether_addr(info->h_source)) -+ memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); -+ -+ if (path->type == DEV_PATH_ETHERNET) -+ break; -+ if (path->type == DEV_PATH_DSA) { -+ i = stack->num_paths; -+ break; -+ } -+ -+ /* DEV_PATH_VLAN and DEV_PATH_PPPOE */ -+ if (info->num_encaps >= NF_FLOW_TABLE_ENCAP_MAX) { -+ info->indev = NULL; -+ break; -+ } -+ if (!info->outdev) -+ info->outdev = path->dev; -+ info->encap[info->num_encaps].id = path->encap.id; -+ info->encap[info->num_encaps].proto = path->encap.proto; -+ info->num_encaps++; -+ if (path->type == DEV_PATH_PPPOE) -+ memcpy(info->h_dest, path->encap.h_dest, ETH_ALEN); -+ break; -+ case DEV_PATH_BRIDGE: -+ if (is_zero_ether_addr(info->h_source)) -+ memcpy(info->h_source, path->dev->dev_addr, ETH_ALEN); -+ -+ switch (path->bridge.vlan_mode) { -+ case DEV_PATH_BR_VLAN_UNTAG_HW: -+ info->ingress_vlans |= BIT(info->num_encaps - 1); -+ break; -+ case DEV_PATH_BR_VLAN_TAG: -+ info->encap[info->num_encaps].id = path->bridge.vlan_id; -+ info->encap[info->num_encaps].proto = path->bridge.vlan_proto; -+ info->num_encaps++; -+ break; -+ case DEV_PATH_BR_VLAN_UNTAG: -+ info->num_encaps--; -+ break; -+ case DEV_PATH_BR_VLAN_KEEP: -+ break; -+ } -+ break; -+ default: -+ info->indev = NULL; -+ break; -+ } -+ } -+ if (!info->outdev) -+ info->outdev = info->indev; -+ -+ info->hw_outdev = info->indev; -+ -+ if (nf_is_valid_ether_device(info->indev)) -+ info->xmit_type = FLOW_OFFLOAD_XMIT_DIRECT; -+} -+ -+static int nf_dev_fill_forward_path(const struct nf_flow_route *route, -+ const struct dst_entry *dst_cache, -+ const struct nf_conn *ct, -+ enum ip_conntrack_dir dir, u8 *ha, -+ struct net_device_path_stack *stack) -+{ -+ const void *daddr = &ct->tuplehash[!dir].tuple.src.u3; -+ struct net_device *dev = dst_cache->dev; -+ struct neighbour *n; -+ u8 nud_state; -+ -+ if (!nf_is_valid_ether_device(dev)) -+ goto out; -+ -+ n = dst_neigh_lookup(dst_cache, daddr); -+ if (!n) -+ return -1; -+ -+ read_lock_bh(&n->lock); -+ nud_state = n->nud_state; -+ ether_addr_copy(ha, n->ha); -+ read_unlock_bh(&n->lock); -+ neigh_release(n); -+ -+ if (!(nud_state & NUD_VALID)) -+ return -1; -+ -+out: -+ return dev_fill_forward_path(dev, ha, stack); -+} -+ -+static void nf_dev_forward_path(struct nf_flow_route *route, -+ const struct nf_conn *ct, -+ enum ip_conntrack_dir dir, -+ struct net_device **devs) -+{ -+ const struct dst_entry *dst = route->tuple[dir].dst; -+ struct net_device_path_stack stack; -+ struct nf_forward_info info = {}; -+ unsigned char ha[ETH_ALEN]; -+ int i; -+ -+ if (nf_dev_fill_forward_path(route, dst, ct, dir, ha, &stack) >= 0) -+ nf_dev_path_info(&stack, &info, ha); -+ -+ devs[!dir] = (struct net_device *)info.indev; -+ if (!info.indev) -+ return; -+ -+ route->tuple[!dir].in.ifindex = info.indev->ifindex; -+ for (i = 0; i < info.num_encaps; i++) { -+ route->tuple[!dir].in.encap[i].id = info.encap[i].id; -+ route->tuple[!dir].in.encap[i].proto = info.encap[i].proto; -+ } -+ route->tuple[!dir].in.num_encaps = info.num_encaps; -+ route->tuple[!dir].in.ingress_vlans = info.ingress_vlans; -+ -+ if (info.xmit_type == FLOW_OFFLOAD_XMIT_DIRECT) { -+ memcpy(route->tuple[dir].out.h_source, info.h_source, ETH_ALEN); -+ memcpy(route->tuple[dir].out.h_dest, info.h_dest, ETH_ALEN); -+ route->tuple[dir].out.ifindex = info.outdev->ifindex; -+ route->tuple[dir].out.hw_ifindex = info.hw_outdev->ifindex; -+ route->tuple[dir].xmit_type = info.xmit_type; -+ } -+} -+ -+static int -+xt_flowoffload_route(struct sk_buff *skb, const struct nf_conn *ct, -+ const struct xt_action_param *par, -+ struct nf_flow_route *route, enum ip_conntrack_dir dir, -+ struct net_device **devs) -+{ -+ struct dst_entry *this_dst = skb_dst(skb); -+ struct dst_entry *other_dst = NULL; -+ struct flowi fl; -+ -+ memset(&fl, 0, sizeof(fl)); -+ switch (xt_family(par)) { -+ case NFPROTO_IPV4: -+ fl.u.ip4.daddr = ct->tuplehash[dir].tuple.src.u3.ip; -+ fl.u.ip4.flowi4_oif = xt_in(par)->ifindex; -+ break; -+ case NFPROTO_IPV6: -+ fl.u.ip6.saddr = ct->tuplehash[!dir].tuple.dst.u3.in6; -+ fl.u.ip6.daddr = ct->tuplehash[dir].tuple.src.u3.in6; -+ fl.u.ip6.flowi6_oif = xt_in(par)->ifindex; -+ break; -+ } -+ -+ nf_route(xt_net(par), &other_dst, &fl, false, xt_family(par)); -+ if (!other_dst) -+ return -ENOENT; -+ -+ nf_default_forward_path(route, this_dst, dir, devs); -+ nf_default_forward_path(route, other_dst, !dir, devs); -+ -+ if (route->tuple[dir].xmit_type == FLOW_OFFLOAD_XMIT_NEIGH && -+ route->tuple[!dir].xmit_type == FLOW_OFFLOAD_XMIT_NEIGH) { -+ nf_dev_forward_path(route, ct, dir, devs); -+ nf_dev_forward_path(route, ct, !dir, devs); -+ } -+ -+ return 0; -+} -+ -+static unsigned int -+flowoffload_tg(struct sk_buff *skb, const struct xt_action_param *par) -+{ -+ struct xt_flowoffload_table *table; -+ const struct xt_flowoffload_target_info *info = par->targinfo; -+ struct tcphdr _tcph, *tcph = NULL; -+ enum ip_conntrack_info ctinfo; -+ enum ip_conntrack_dir dir; -+ struct nf_flow_route route = {}; -+ struct flow_offload *flow = NULL; -+ struct net_device *devs[2] = {}; -+ struct nf_conn *ct; -+ struct net *net; -+ -+ if (xt_flowoffload_skip(skb, xt_family(par))) -+ return XT_CONTINUE; -+ -+ ct = nf_ct_get(skb, &ctinfo); -+ if (ct == NULL) -+ return XT_CONTINUE; -+ -+ switch (ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum) { -+ case IPPROTO_TCP: -+ if (ct->proto.tcp.state != TCP_CONNTRACK_ESTABLISHED) -+ return XT_CONTINUE; -+ -+ tcph = skb_header_pointer(skb, par->thoff, -+ sizeof(_tcph), &_tcph); -+ if (unlikely(!tcph || tcph->fin || tcph->rst)) -+ return XT_CONTINUE; -+ break; -+ case IPPROTO_UDP: -+ break; -+ default: -+ return XT_CONTINUE; -+ } -+ -+ if (nf_ct_ext_exist(ct, NF_CT_EXT_HELPER) || -+ ct->status & (IPS_SEQ_ADJUST | IPS_NAT_CLASH)) -+ return XT_CONTINUE; -+ -+ if (!nf_ct_is_confirmed(ct)) -+ return XT_CONTINUE; -+ -+ devs[dir] = xt_out(par); -+ devs[!dir] = xt_in(par); -+ -+ if (!devs[dir] || !devs[!dir]) -+ return XT_CONTINUE; -+ -+ if (test_and_set_bit(IPS_OFFLOAD_BIT, &ct->status)) -+ return XT_CONTINUE; -+ -+ dir = CTINFO2DIR(ctinfo); -+ -+ if (xt_flowoffload_route(skb, ct, par, &route, dir, devs) < 0) -+ goto err_flow_route; -+ -+ flow = flow_offload_alloc(ct); -+ if (!flow) -+ goto err_flow_alloc; -+ -+ if (flow_offload_route_init(flow, &route) < 0) -+ goto err_flow_add; -+ -+ if (tcph) { -+ ct->proto.tcp.seen[0].flags |= IP_CT_TCP_FLAG_BE_LIBERAL; -+ ct->proto.tcp.seen[1].flags |= IP_CT_TCP_FLAG_BE_LIBERAL; -+ } -+ -+ table = &flowtable[!!(info->flags & XT_FLOWOFFLOAD_HW)]; -+ -+ net = read_pnet(&table->ft.net); -+ if (!net) -+ write_pnet(&table->ft.net, xt_net(par)); -+ -+ if (flow_offload_add(&table->ft, flow) < 0) -+ goto err_flow_add; -+ -+ xt_flowoffload_check_device(table, devs[0]); -+ xt_flowoffload_check_device(table, devs[1]); -+ -+ dst_release(route.tuple[!dir].dst); -+ -+ return XT_CONTINUE; -+ -+err_flow_add: -+ flow_offload_free(flow); -+err_flow_alloc: -+ dst_release(route.tuple[!dir].dst); -+err_flow_route: -+ clear_bit(IPS_OFFLOAD_BIT, &ct->status); -+ -+ return XT_CONTINUE; -+} -+ -+static int flowoffload_chk(const struct xt_tgchk_param *par) -+{ -+ struct xt_flowoffload_target_info *info = par->targinfo; -+ -+ if (info->flags & ~XT_FLOWOFFLOAD_MASK) -+ return -EINVAL; -+ -+ return 0; -+} -+ -+static struct xt_target offload_tg_reg __read_mostly = { -+ .family = NFPROTO_UNSPEC, -+ .name = "FLOWOFFLOAD", -+ .revision = 0, -+ .targetsize = sizeof(struct xt_flowoffload_target_info), -+ .usersize = sizeof(struct xt_flowoffload_target_info), -+ .checkentry = flowoffload_chk, -+ .target = flowoffload_tg, -+ .me = THIS_MODULE, -+}; -+ -+static int flow_offload_netdev_event(struct notifier_block *this, -+ unsigned long event, void *ptr) -+{ -+ struct xt_flowoffload_hook *hook0, *hook1; -+ struct net_device *dev = netdev_notifier_info_to_dev(ptr); -+ -+ if (event != NETDEV_UNREGISTER) -+ return NOTIFY_DONE; -+ -+ spin_lock_bh(&hooks_lock); -+ hook0 = flow_offload_lookup_hook(&flowtable[0], dev); -+ if (hook0) -+ hlist_del(&hook0->list); -+ -+ hook1 = flow_offload_lookup_hook(&flowtable[1], dev); -+ if (hook1) -+ hlist_del(&hook1->list); -+ spin_unlock_bh(&hooks_lock); -+ -+ if (hook0) { -+ nf_unregister_net_hook(hook0->net, &hook0->ops); -+ kfree(hook0); -+ } -+ -+ if (hook1) { -+ nf_unregister_net_hook(hook1->net, &hook1->ops); -+ kfree(hook1); -+ } -+ -+ nf_flow_table_cleanup(dev); -+ -+ return NOTIFY_DONE; -+} -+ -+static struct notifier_block flow_offload_netdev_notifier = { -+ .notifier_call = flow_offload_netdev_event, -+}; -+ -+static int nf_flow_rule_route_inet(struct net *net, -+ const struct flow_offload *flow, -+ enum flow_offload_tuple_dir dir, -+ struct nf_flow_rule *flow_rule) -+{ -+ const struct flow_offload_tuple *flow_tuple = &flow->tuplehash[dir].tuple; -+ int err; -+ -+ switch (flow_tuple->l3proto) { -+ case NFPROTO_IPV4: -+ err = nf_flow_rule_route_ipv4(net, flow, dir, flow_rule); -+ break; -+ case NFPROTO_IPV6: -+ err = nf_flow_rule_route_ipv6(net, flow, dir, flow_rule); -+ break; -+ default: -+ err = -1; -+ break; -+ } -+ -+ return err; -+} -+ -+static struct nf_flowtable_type flowtable_inet = { -+ .family = NFPROTO_INET, -+ .init = nf_flow_table_init, -+ .setup = nf_flow_table_offload_setup, -+ .action = nf_flow_rule_route_inet, -+ .free = nf_flow_table_free, -+ .hook = xt_flowoffload_net_hook, -+ .owner = THIS_MODULE, -+}; -+ -+static int init_flowtable(struct xt_flowoffload_table *tbl) -+{ -+ INIT_DELAYED_WORK(&tbl->work, xt_flowoffload_hook_work); -+ tbl->ft.type = &flowtable_inet; -+ -+ return nf_flow_table_init(&tbl->ft); -+} -+ -+static int __init xt_flowoffload_tg_init(void) -+{ -+ int ret; -+ -+ register_netdevice_notifier(&flow_offload_netdev_notifier); -+ -+ ret = init_flowtable(&flowtable[0]); -+ if (ret) -+ return ret; -+ -+ ret = init_flowtable(&flowtable[1]); -+ if (ret) -+ goto cleanup; -+ -+ flowtable[1].ft.flags = NF_FLOWTABLE_HW_OFFLOAD; -+ -+ ret = xt_register_target(&offload_tg_reg); -+ if (ret) -+ goto cleanup2; -+ -+ return 0; -+ -+cleanup2: -+ nf_flow_table_free(&flowtable[1].ft); -+cleanup: -+ nf_flow_table_free(&flowtable[0].ft); -+ return ret; -+} -+ -+static void __exit xt_flowoffload_tg_exit(void) -+{ -+ xt_unregister_target(&offload_tg_reg); -+ unregister_netdevice_notifier(&flow_offload_netdev_notifier); -+ nf_flow_table_free(&flowtable[0].ft); -+ nf_flow_table_free(&flowtable[1].ft); -+} -+ -+MODULE_LICENSE("GPL"); -+module_init(xt_flowoffload_tg_init); -+module_exit(xt_flowoffload_tg_exit); ---- /dev/null -+++ b/include/uapi/linux/netfilter/xt_FLOWOFFLOAD.h -@@ -0,0 +1,17 @@ -+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -+#ifndef _XT_FLOWOFFLOAD_H -+#define _XT_FLOWOFFLOAD_H -+ -+#include -+ -+enum { -+ XT_FLOWOFFLOAD_HW = 1 << 0, -+ -+ XT_FLOWOFFLOAD_MASK = XT_FLOWOFFLOAD_HW -+}; -+ -+struct xt_flowoffload_target_info { -+ __u32 flags; -+}; -+ -+#endif /* _XT_FLOWOFFLOAD_H */ diff --git a/target/linux/generic/hack-5.19/651-wireless_mesh_header.patch b/target/linux/generic/hack-5.19/651-wireless_mesh_header.patch deleted file mode 100644 index fd7d5346a..000000000 --- a/target/linux/generic/hack-5.19/651-wireless_mesh_header.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 6d3bc769657b0ee7c7506dad9911111c4226a7ea Mon Sep 17 00:00:00 2001 -From: Imre Kaloz -Date: Fri, 7 Jul 2017 17:21:05 +0200 -Subject: mac80211: increase wireless mesh header size - -lede-commit 3d4466cfd8f75f717efdb1f96fdde3c70d865fc1 -Signed-off-by: Imre Kaloz ---- - include/linux/netdevice.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -149,8 +149,8 @@ static inline bool dev_xmit_complete(int - - #if defined(CONFIG_HYPERV_NET) - # define LL_MAX_HEADER 128 --#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25) --# if defined(CONFIG_MAC80211_MESH) -+#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25) || 1 -+# if defined(CONFIG_MAC80211_MESH) || 1 - # define LL_MAX_HEADER 128 - # else - # define LL_MAX_HEADER 96 diff --git a/target/linux/generic/hack-5.19/660-fq_codel_defaults.patch b/target/linux/generic/hack-5.19/660-fq_codel_defaults.patch deleted file mode 100644 index ba21555a0..000000000 --- a/target/linux/generic/hack-5.19/660-fq_codel_defaults.patch +++ /dev/null @@ -1,27 +0,0 @@ -From a6ccb238939b25851474a279b20367fd24a0e816 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:21:53 +0200 -Subject: hack: net: fq_codel: tune defaults for small devices - -Assume that x86_64 devices always have a big memory and do not need this -optimization compared to devices with only 32 MB or 64 MB RAM. - -Signed-off-by: Felix Fietkau ---- - net/sched/sch_fq_codel.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/net/sched/sch_fq_codel.c -+++ b/net/sched/sch_fq_codel.c -@@ -476,7 +476,11 @@ static int fq_codel_init(struct Qdisc *s - - sch->limit = 10*1024; - q->flows_cnt = 1024; -+#ifdef CONFIG_X86_64 - q->memory_limit = 32 << 20; /* 32 MBytes */ -+#else -+ q->memory_limit = 4 << 20; /* 4 MBytes */ -+#endif - q->drop_batch_size = 64; - q->quantum = psched_mtu(qdisc_dev(sch)); - INIT_LIST_HEAD(&q->new_flows); diff --git a/target/linux/generic/hack-5.19/661-use_fq_codel_by_default.patch b/target/linux/generic/hack-5.19/661-use_fq_codel_by_default.patch deleted file mode 100644 index d4b0dfa2c..000000000 --- a/target/linux/generic/hack-5.19/661-use_fq_codel_by_default.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 1d418f7e88035ed7a94073f6354246c66e9193e9 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:22:58 +0200 -Subject: fq_codel: switch default qdisc from pfifo_fast to fq_codel and remove pfifo_fast - -Signed-off-by: Felix Fietkau ---- - include/net/sch_generic.h | 3 ++- - net/sched/Kconfig | 3 ++- - net/sched/sch_api.c | 2 +- - net/sched/sch_fq_codel.c | 3 ++- - net/sched/sch_generic.c | 4 ++-- - 5 files changed, 9 insertions(+), 6 deletions(-) - ---- a/include/net/sch_generic.h -+++ b/include/net/sch_generic.h -@@ -604,12 +604,13 @@ extern struct Qdisc_ops noop_qdisc_ops; - extern struct Qdisc_ops pfifo_fast_ops; - extern struct Qdisc_ops mq_qdisc_ops; - extern struct Qdisc_ops noqueue_qdisc_ops; -+extern struct Qdisc_ops fq_codel_qdisc_ops; - extern const struct Qdisc_ops *default_qdisc_ops; - static inline const struct Qdisc_ops * - get_default_qdisc_ops(const struct net_device *dev, int ntx) - { - return ntx < dev->real_num_tx_queues ? -- default_qdisc_ops : &pfifo_fast_ops; -+ default_qdisc_ops : &fq_codel_qdisc_ops; - } - - struct Qdisc_class_common { ---- a/net/sched/Kconfig -+++ b/net/sched/Kconfig -@@ -4,8 +4,9 @@ - # - - menuconfig NET_SCHED -- bool "QoS and/or fair queueing" -+ def_bool y - select NET_SCH_FIFO -+ select NET_SCH_FQ_CODEL - help - When the kernel has several packets to send out over a network - device, it has to decide which ones to send first, which ones to ---- a/net/sched/sch_api.c -+++ b/net/sched/sch_api.c -@@ -2276,7 +2276,7 @@ static int __init pktsched_init(void) - return err; - } - -- register_qdisc(&pfifo_fast_ops); -+ register_qdisc(&fq_codel_qdisc_ops); - register_qdisc(&pfifo_qdisc_ops); - register_qdisc(&bfifo_qdisc_ops); - register_qdisc(&pfifo_head_drop_qdisc_ops); ---- a/net/sched/sch_fq_codel.c -+++ b/net/sched/sch_fq_codel.c -@@ -721,7 +721,7 @@ static const struct Qdisc_class_ops fq_c - .walk = fq_codel_walk, - }; - --static struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = { -+struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = { - .cl_ops = &fq_codel_class_ops, - .id = "fq_codel", - .priv_size = sizeof(struct fq_codel_sched_data), -@@ -736,6 +736,7 @@ static struct Qdisc_ops fq_codel_qdisc_o - .dump_stats = fq_codel_dump_stats, - .owner = THIS_MODULE, - }; -+EXPORT_SYMBOL(fq_codel_qdisc_ops); - - static int __init fq_codel_module_init(void) - { ---- a/net/sched/sch_generic.c -+++ b/net/sched/sch_generic.c -@@ -32,7 +32,7 @@ - #include - - /* Qdisc to use by default */ --const struct Qdisc_ops *default_qdisc_ops = &pfifo_fast_ops; -+const struct Qdisc_ops *default_qdisc_ops = &fq_codel_qdisc_ops; - EXPORT_SYMBOL(default_qdisc_ops); - - static void qdisc_maybe_clear_missed(struct Qdisc *q, -@@ -1145,12 +1145,12 @@ static void attach_one_default_qdisc(str - void *_unused) - { - struct Qdisc *qdisc; -- const struct Qdisc_ops *ops = default_qdisc_ops; -+ const struct Qdisc_ops *ops = &fq_codel_qdisc_ops; - - if (dev->priv_flags & IFF_NO_QUEUE) - ops = &noqueue_qdisc_ops; - else if(dev->type == ARPHRD_CAN) -- ops = &pfifo_fast_ops; -+ ops = &fq_codel_qdisc_ops; - - qdisc = qdisc_create_dflt(dev_queue, ops, TC_H_ROOT, NULL); - if (!qdisc) diff --git a/target/linux/generic/hack-5.19/700-swconfig_switch_drivers.patch b/target/linux/generic/hack-5.19/700-swconfig_switch_drivers.patch deleted file mode 100644 index 560937a7c..000000000 --- a/target/linux/generic/hack-5.19/700-swconfig_switch_drivers.patch +++ /dev/null @@ -1,129 +0,0 @@ -From 36e516290611e613aa92996cb4339561452695b4 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Fri, 7 Jul 2017 17:24:23 +0200 -Subject: net: swconfig: adds openwrt switch layer - -Signed-off-by: Felix Fietkau ---- - drivers/net/phy/Kconfig | 83 +++++++++++++++++++++++++++++++++++++++++++++++ - drivers/net/phy/Makefile | 15 +++++++++ - include/uapi/linux/Kbuild | 1 + - 3 files changed, 99 insertions(+) - ---- a/drivers/net/phy/Kconfig -+++ b/drivers/net/phy/Kconfig -@@ -61,6 +61,80 @@ config SFP - depends on HWMON || HWMON=n - select MDIO_I2C - -+comment "Switch configuration API + drivers" -+ -+config SWCONFIG -+ tristate "Switch configuration API" -+ help -+ Switch configuration API using netlink. This allows -+ you to configure the VLAN features of certain switches. -+ -+config SWCONFIG_LEDS -+ bool "Switch LED trigger support" -+ depends on (SWCONFIG && LEDS_TRIGGERS) -+ -+config ADM6996_PHY -+ tristate "Driver for ADM6996 switches" -+ select SWCONFIG -+ help -+ Currently supports the ADM6996FC and ADM6996M switches. -+ Support for FC is very limited. -+ -+config AR8216_PHY -+ tristate "Driver for Atheros AR8216 switches" -+ select SWCONFIG -+ -+config AR8216_PHY_LEDS -+ bool "Atheros AR8216 switch LED support" -+ depends on (AR8216_PHY && LEDS_CLASS) -+ -+source "drivers/net/phy/b53/Kconfig" -+ -+config IP17XX_PHY -+ tristate "Driver for IC+ IP17xx switches" -+ select SWCONFIG -+ -+config PSB6970_PHY -+ tristate "Lantiq XWAY Tantos (PSB6970) Ethernet switch" -+ select SWCONFIG -+ select ETHERNET_PACKET_MANGLE -+ -+config RTL8306_PHY -+ tristate "Driver for Realtek RTL8306S switches" -+ select SWCONFIG -+ -+config RTL8366_SMI -+ tristate "Driver for the RTL8366 SMI interface" -+ depends on GPIOLIB -+ help -+ This module implements the SMI interface protocol which is used -+ by some RTL8366 ethernet switch devices via the generic GPIO API. -+ -+if RTL8366_SMI -+ -+config RTL8366_SMI_DEBUG_FS -+ bool "RTL8366 SMI interface debugfs support" -+ depends on DEBUG_FS -+ default n -+ -+config RTL8366S_PHY -+ tristate "Driver for the Realtek RTL8366S switch" -+ select SWCONFIG -+ -+config RTL8366RB_PHY -+ tristate "Driver for the Realtek RTL8366RB switch" -+ select SWCONFIG -+ -+config RTL8367_PHY -+ tristate "Driver for the Realtek RTL8367R/M switches" -+ select SWCONFIG -+ -+config RTL8367B_PHY -+ tristate "Driver fot the Realtek RTL8367R-VB switch" -+ select SWCONFIG -+ -+endif # RTL8366_SMI -+ - comment "MII PHY device drivers" - - config AMD_PHY ---- a/drivers/net/phy/Makefile -+++ b/drivers/net/phy/Makefile -@@ -24,6 +24,19 @@ libphy-$(CONFIG_LED_TRIGGER_PHY) += phy_ - obj-$(CONFIG_PHYLINK) += phylink.o - obj-$(CONFIG_PHYLIB) += libphy.o - -+obj-$(CONFIG_SWCONFIG) += swconfig.o -+obj-$(CONFIG_ADM6996_PHY) += adm6996.o -+obj-$(CONFIG_AR8216_PHY) += ar8216.o ar8327.o -+obj-$(CONFIG_SWCONFIG_B53) += b53/ -+obj-$(CONFIG_IP17XX_PHY) += ip17xx.o -+obj-$(CONFIG_PSB6970_PHY) += psb6970.o -+obj-$(CONFIG_RTL8306_PHY) += rtl8306.o -+obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi.o -+obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o -+obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o -+obj-$(CONFIG_RTL8367_PHY) += rtl8367.o -+obj-$(CONFIG_RTL8367B_PHY) += rtl8367b.o -+ - obj-$(CONFIG_NETWORK_PHY_TIMESTAMPING) += mii_timestamper.o - - obj-$(CONFIG_SFP) += sfp.o ---- a/include/linux/platform_data/b53.h -+++ b/include/linux/platform_data/b53.h -@@ -29,6 +29,9 @@ struct b53_platform_data { - u32 chip_id; - u16 enabled_ports; - -+ /* allow to specify an ethX alias */ -+ const char *alias; -+ - /* only used by MMAP'd driver */ - unsigned big_endian:1; - void __iomem *regs; diff --git a/target/linux/generic/hack-5.19/760-net-usb-r8152-add-LED-configuration-from-OF.patch b/target/linux/generic/hack-5.19/760-net-usb-r8152-add-LED-configuration-from-OF.patch deleted file mode 100644 index c315dcf8f..000000000 --- a/target/linux/generic/hack-5.19/760-net-usb-r8152-add-LED-configuration-from-OF.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 82985725e071f2a5735052f18e109a32aeac3a0b Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Sun, 26 Jul 2020 02:38:31 +0200 -Subject: [PATCH] net: usb: r8152: add LED configuration from OF - -This adds the ability to configure the LED configuration register using -OF. This way, the correct value for board specific LED configuration can -be determined. - -Signed-off-by: David Bauer ---- - drivers/net/usb/r8152.c | 23 +++++++++++++++++++++++ - 1 file changed, 23 insertions(+) - ---- a/drivers/net/usb/r8152.c -+++ b/drivers/net/usb/r8152.c -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -6864,6 +6865,22 @@ static void rtl_tally_reset(struct r8152 - ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data); - } - -+static int r8152_led_configuration(struct r8152 *tp) -+{ -+ u32 led_data; -+ int ret; -+ -+ ret = of_property_read_u32(tp->udev->dev.of_node, "realtek,led-data", -+ &led_data); -+ -+ if (ret) -+ return ret; -+ -+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_LEDSEL, led_data); -+ -+ return 0; -+} -+ - static void r8152b_init(struct r8152 *tp) - { - u32 ocp_data; -@@ -6905,6 +6922,8 @@ static void r8152b_init(struct r8152 *tp - ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); - ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); - ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); -+ -+ r8152_led_configuration(tp); - } - - static void r8153_init(struct r8152 *tp) -@@ -7045,6 +7064,8 @@ static void r8153_init(struct r8152 *tp) - tp->coalesce = COALESCE_SLOW; - break; - } -+ -+ r8152_led_configuration(tp); - } - - static void r8153b_init(struct r8152 *tp) -@@ -7127,6 +7148,8 @@ static void r8153b_init(struct r8152 *tp - rtl_tally_reset(tp); - - tp->coalesce = 15000; /* 15 us */ -+ -+ r8152_led_configuration(tp); - } - - static void r8153c_init(struct r8152 *tp) diff --git a/target/linux/generic/hack-5.19/761-dt-bindings-net-add-RTL8152-binding-documentation.patch b/target/linux/generic/hack-5.19/761-dt-bindings-net-add-RTL8152-binding-documentation.patch deleted file mode 100644 index be262b993..000000000 --- a/target/linux/generic/hack-5.19/761-dt-bindings-net-add-RTL8152-binding-documentation.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 3ee05f4aa64fc86af3be5bc176ba5808de9260a7 Mon Sep 17 00:00:00 2001 -From: David Bauer -Date: Sun, 26 Jul 2020 15:30:33 +0200 -Subject: [PATCH] dt-bindings: net: add RTL8152 binding documentation - -Add binding documentation for the Realtek RTL8152 / RTL8153 USB ethernet -adapters. - -Signed-off-by: David Bauer ---- - .../bindings/net/realtek,rtl8152.yaml | 36 +++++++++++++++++++ - 1 file changed, 36 insertions(+) - create mode 100644 Documentation/devicetree/bindings/net/realtek,rtl8152.yaml - ---- /dev/null -+++ b/Documentation/devicetree/bindings/net/realtek,rtl8152.yaml -@@ -0,0 +1,36 @@ -+# SPDX-License-Identifier: GPL-2.0 -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/net/realtek,rtl8152.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Realtek RTL8152/RTL8153 series USB ethernet -+ -+maintainers: -+ - David Bauer -+ -+properties: -+ compatible: -+ oneOf: -+ - items: -+ - enum: -+ - realtek,rtl8152 -+ - realtek,rtl8153 -+ -+ reg: -+ description: The device number on the USB bus -+ -+ realtek,led-data: -+ description: Value to be written to the LED configuration register. -+ -+required: -+ - compatible -+ - reg -+ -+examples: -+ - | -+ usb-eth@2 { -+ compatible = "realtek,rtl8153"; -+ reg = <2>; -+ realtek,led-data = <0x87>; -+ }; -\ No newline at end of file diff --git a/target/linux/generic/hack-5.19/773-bgmac-add-srab-switch.patch b/target/linux/generic/hack-5.19/773-bgmac-add-srab-switch.patch deleted file mode 100644 index 076051b5b..000000000 --- a/target/linux/generic/hack-5.19/773-bgmac-add-srab-switch.patch +++ /dev/null @@ -1,98 +0,0 @@ -From 3cb240533ab787899dc7f17aa7d6c5b4810e2e58 Mon Sep 17 00:00:00 2001 -From: Hauke Mehrtens -Date: Fri, 7 Jul 2017 17:26:01 +0200 -Subject: bcm53xx: bgmac: use srab switch driver - -use the srab switch driver on these SoCs. - -Signed-off-by: Hauke Mehrtens ---- - drivers/net/ethernet/broadcom/bgmac-bcma.c | 1 + - drivers/net/ethernet/broadcom/bgmac.c | 24 ++++++++++++++++++++++++ - drivers/net/ethernet/broadcom/bgmac.h | 4 ++++ - 3 files changed, 29 insertions(+) - ---- a/drivers/net/ethernet/broadcom/bgmac-bcma.c -+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c -@@ -280,6 +280,7 @@ static int bgmac_probe(struct bcma_devic - bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST; - bgmac->feature_flags |= BGMAC_FEAT_NO_RESET; - bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500; -+ bgmac->feature_flags |= BGMAC_FEAT_SRAB; - break; - default: - bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST; ---- a/drivers/net/ethernet/broadcom/bgmac.c -+++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -12,6 +12,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -1408,6 +1409,17 @@ static const struct ethtool_ops bgmac_et - .set_link_ksettings = phy_ethtool_set_link_ksettings, - }; - -+static struct b53_platform_data bgmac_b53_pdata = { -+}; -+ -+static struct platform_device bgmac_b53_dev = { -+ .name = "b53-srab-switch", -+ .id = -1, -+ .dev = { -+ .platform_data = &bgmac_b53_pdata, -+ }, -+}; -+ - /************************************************** - * MII - **************************************************/ -@@ -1542,6 +1554,14 @@ int bgmac_enet_probe(struct bgmac *bgmac - /* Omit FCS from max MTU size */ - net_dev->max_mtu = BGMAC_RX_MAX_FRAME_SIZE - ETH_FCS_LEN; - -+ if ((bgmac->feature_flags & BGMAC_FEAT_SRAB) && !bgmac_b53_pdata.regs) { -+ bgmac_b53_pdata.regs = ioremap_nocache(0x18007000, 0x1000); -+ -+ err = platform_device_register(&bgmac_b53_dev); -+ if (!err) -+ bgmac->b53_device = &bgmac_b53_dev; -+ } -+ - err = register_netdev(bgmac->net_dev); - if (err) { - dev_err(bgmac->dev, "Cannot register net device\n"); -@@ -1564,6 +1584,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe); - - void bgmac_enet_remove(struct bgmac *bgmac) - { -+ if (bgmac->b53_device) -+ platform_device_unregister(&bgmac_b53_dev); -+ bgmac->b53_device = NULL; -+ - unregister_netdev(bgmac->net_dev); - phy_disconnect(bgmac->net_dev->phydev); - netif_napi_del(&bgmac->napi); ---- a/drivers/net/ethernet/broadcom/bgmac.h -+++ b/drivers/net/ethernet/broadcom/bgmac.h -@@ -388,6 +388,7 @@ - #define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII BIT(18) - #define BGMAC_FEAT_CC7_IF_TYPE_RGMII BIT(19) - #define BGMAC_FEAT_IDM_MASK BIT(20) -+#define BGMAC_FEAT_SRAB BIT(21) - - struct bgmac_slot_info { - union { -@@ -493,6 +494,9 @@ struct bgmac { - void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask, - u32 set); - int (*phy_connect)(struct bgmac *bgmac); -+ -+ /* platform device for associated switch */ -+ struct platform_device *b53_device; - }; - - struct bgmac *bgmac_alloc(struct device *dev); diff --git a/target/linux/generic/hack-5.19/780-usb-net-MeigLink_modem_support.patch b/target/linux/generic/hack-5.19/780-usb-net-MeigLink_modem_support.patch deleted file mode 100644 index e0be8619e..000000000 --- a/target/linux/generic/hack-5.19/780-usb-net-MeigLink_modem_support.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/drivers/net/usb/qmi_wwan.c -+++ b/drivers/net/usb/qmi_wwan.c -@@ -1087,6 +1087,7 @@ static const struct usb_device_id produc - {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0512)}, /* Quectel EG12/EM12 */ - {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)}, /* Quectel EM160R-GL */ - {QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)}, /* Quectel RM500Q-GL */ -+ {QMI_MATCH_FF_FF_FF(0x05c6, 0xf601)}, /* MeigLink SLM750 */ - - /* 3. Combined interface devices matching on interface number */ - {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -243,6 +243,8 @@ static void option_instat_callback(struc - #define UBLOX_PRODUCT_R6XX 0x90fa - /* These Yuga products use Qualcomm's vendor ID */ - #define YUGA_PRODUCT_CLM920_NC5 0x9625 -+/* These MeigLink products use Qualcomm's vendor ID */ -+#define MEIGLINK_PRODUCT_SLM750 0xf601 - - #define QUECTEL_VENDOR_ID 0x2c7c - /* These Quectel products use Quectel's vendor ID */ -@@ -1143,6 +1145,11 @@ static const struct usb_device_id option - .driver_info = ZLP }, - { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96), - .driver_info = RSVD(4) }, -+ /* Meiglink products using Qualcomm vendor ID */ -+ // Works OK. In case of some issues check macros that are used by Quectel Products -+ { USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, MEIGLINK_PRODUCT_SLM750, 0xff, 0xff, 0xff), -+ .driver_info = NUMEP2 }, -+ { USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, MEIGLINK_PRODUCT_SLM750, 0xff, 0, 0) }, - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff), - .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 }, - { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0, 0) }, diff --git a/target/linux/generic/hack-5.19/800-GPIO-add-named-gpio-exports.patch b/target/linux/generic/hack-5.19/800-GPIO-add-named-gpio-exports.patch deleted file mode 100644 index 898bd53cb..000000000 --- a/target/linux/generic/hack-5.19/800-GPIO-add-named-gpio-exports.patch +++ /dev/null @@ -1,162 +0,0 @@ -From cc809a441d8f2924f785eb863dfa6aef47a25b0b Mon Sep 17 00:00:00 2001 -From: John Crispin -Date: Tue, 12 Aug 2014 20:49:27 +0200 -Subject: [PATCH 30/36] GPIO: add named gpio exports - -Signed-off-by: John Crispin ---- a/drivers/gpio/gpiolib-of.c -+++ b/drivers/gpio/gpiolib-of.c -@@ -19,6 +19,8 @@ - #include - #include - #include -+#include -+#include - - #include "gpiolib.h" - #include "gpiolib-of.h" -@@ -1059,3 +1061,72 @@ void of_gpio_dev_init(struct gpio_chip * - else - gc->of_node = gdev->dev.of_node; - } -+ -+#ifdef CONFIG_GPIO_SYSFS -+ -+static struct of_device_id gpio_export_ids[] = { -+ { .compatible = "gpio-export" }, -+ { /* sentinel */ } -+}; -+ -+static int of_gpio_export_probe(struct platform_device *pdev) -+{ -+ struct device_node *np = pdev->dev.of_node; -+ struct device_node *cnp; -+ u32 val; -+ int nb = 0; -+ -+ for_each_child_of_node(np, cnp) { -+ const char *name = NULL; -+ int gpio; -+ bool dmc; -+ int max_gpio = 1; -+ int i; -+ -+ of_property_read_string(cnp, "gpio-export,name", &name); -+ -+ if (!name) -+ max_gpio = of_gpio_count(cnp); -+ -+ for (i = 0; i < max_gpio; i++) { -+ unsigned flags = 0; -+ enum of_gpio_flags of_flags; -+ -+ gpio = of_get_gpio_flags(cnp, i, &of_flags); -+ if (!gpio_is_valid(gpio)) -+ return gpio; -+ -+ if (of_flags == OF_GPIO_ACTIVE_LOW) -+ flags |= GPIOF_ACTIVE_LOW; -+ -+ if (!of_property_read_u32(cnp, "gpio-export,output", &val)) -+ flags |= val ? GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; -+ else -+ flags |= GPIOF_IN; -+ -+ if (devm_gpio_request_one(&pdev->dev, gpio, flags, name ? name : of_node_full_name(np))) -+ continue; -+ -+ dmc = of_property_read_bool(cnp, "gpio-export,direction_may_change"); -+ gpio_export_with_name(gpio, dmc, name); -+ nb++; -+ } -+ } -+ -+ dev_info(&pdev->dev, "%d gpio(s) exported\n", nb); -+ -+ return 0; -+} -+ -+static struct platform_driver gpio_export_driver = { -+ .driver = { -+ .name = "gpio-export", -+ .owner = THIS_MODULE, -+ .of_match_table = of_match_ptr(gpio_export_ids), -+ }, -+ .probe = of_gpio_export_probe, -+}; -+ -+module_platform_driver(gpio_export_driver); -+ -+#endif ---- a/include/asm-generic/gpio.h -+++ b/include/asm-generic/gpio.h -@@ -125,6 +125,12 @@ static inline int gpio_export(unsigned g - return gpiod_export(gpio_to_desc(gpio), direction_may_change); - } - -+int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name); -+static inline int gpio_export_with_name(unsigned gpio, bool direction_may_change, const char *name) -+{ -+ return __gpiod_export(gpio_to_desc(gpio), direction_may_change, name); -+} -+ - static inline int gpio_export_link(struct device *dev, const char *name, - unsigned gpio) - { ---- a/include/linux/gpio/consumer.h -+++ b/include/linux/gpio/consumer.h -@@ -728,6 +728,7 @@ static inline struct gpio_desc *acpi_get - - #if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS) - -+int _gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name); - int gpiod_export(struct gpio_desc *desc, bool direction_may_change); - int gpiod_export_link(struct device *dev, const char *name, - struct gpio_desc *desc); -@@ -735,6 +736,13 @@ void gpiod_unexport(struct gpio_desc *de - - #else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */ - -+static inline int _gpiod_export(struct gpio_desc *desc, -+ bool direction_may_change, -+ const char *name) -+{ -+ return -ENOSYS; -+} -+ - static inline int gpiod_export(struct gpio_desc *desc, - bool direction_may_change) - { ---- a/drivers/gpio/gpiolib-sysfs.c -+++ b/drivers/gpio/gpiolib-sysfs.c -@@ -544,7 +544,7 @@ static struct class gpio_class = { - * - * Returns zero on success, else an error. - */ --int gpiod_export(struct gpio_desc *desc, bool direction_may_change) -+int __gpiod_export(struct gpio_desc *desc, bool direction_may_change, const char *name) - { - struct gpio_chip *chip; - struct gpio_device *gdev; -@@ -606,6 +606,8 @@ int gpiod_export(struct gpio_desc *desc, - offset = gpio_chip_hwgpio(desc); - if (chip->names && chip->names[offset]) - ioname = chip->names[offset]; -+ if (name) -+ ioname = name; - - dev = device_create_with_groups(&gpio_class, &gdev->dev, - MKDEV(0, 0), data, gpio_groups, -@@ -627,6 +629,12 @@ err_unlock: - gpiod_dbg(desc, "%s: status %d\n", __func__, status); - return status; - } -+EXPORT_SYMBOL_GPL(__gpiod_export); -+ -+int gpiod_export(struct gpio_desc *desc, bool direction_may_change) -+{ -+ return __gpiod_export(desc, direction_may_change, NULL); -+} - EXPORT_SYMBOL_GPL(gpiod_export); - - static int match_export(struct device *dev, const void *desc) diff --git a/target/linux/generic/hack-5.19/902-debloat_proc.patch b/target/linux/generic/hack-5.19/902-debloat_proc.patch deleted file mode 100644 index 2759191a7..000000000 --- a/target/linux/generic/hack-5.19/902-debloat_proc.patch +++ /dev/null @@ -1,408 +0,0 @@ -From 9e3f1d0805b2d919904dd9a4ff0d956314cc3cba Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sat, 8 Jul 2017 08:20:09 +0200 -Subject: debloat: procfs - -Signed-off-by: Felix Fietkau ---- - fs/locks.c | 2 ++ - fs/proc/Kconfig | 5 +++++ - fs/proc/consoles.c | 3 +++ - fs/proc/proc_tty.c | 11 ++++++++++- - include/net/snmp.h | 18 +++++++++++++++++- - ipc/msg.c | 3 +++ - ipc/sem.c | 2 ++ - ipc/shm.c | 2 ++ - ipc/util.c | 3 +++ - kernel/exec_domain.c | 2 ++ - kernel/irq/proc.c | 9 +++++++++ - kernel/time/timer_list.c | 2 ++ - mm/vmalloc.c | 2 ++ - mm/vmstat.c | 8 +++++--- - net/8021q/vlanproc.c | 6 ++++++ - net/core/net-procfs.c | 18 ++++++++++++------ - net/core/sock.c | 2 ++ - net/ipv4/fib_trie.c | 18 ++++++++++++------ - net/ipv4/proc.c | 3 +++ - net/ipv4/route.c | 3 +++ - 20 files changed, 105 insertions(+), 17 deletions(-) - ---- a/fs/locks.c -+++ b/fs/locks.c -@@ -2905,6 +2905,8 @@ static const struct seq_operations locks - - static int __init proc_locks_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; - proc_create_seq_private("locks", 0, NULL, &locks_seq_operations, - sizeof(struct locks_iterator), NULL); - return 0; ---- a/fs/proc/Kconfig -+++ b/fs/proc/Kconfig -@@ -100,6 +100,11 @@ config PROC_CHILDREN - Say Y if you are running any user-space software which takes benefit from - this interface. For example, rkt is such a piece of software. - -+config PROC_STRIPPED -+ default n -+ depends on EXPERT -+ bool "Strip non-essential /proc functionality to reduce code size" -+ - config PROC_PID_ARCH_STATUS - def_bool n - depends on PROC_FS ---- a/fs/proc/consoles.c -+++ b/fs/proc/consoles.c -@@ -92,6 +92,9 @@ static const struct seq_operations conso - - static int __init proc_consoles_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; -+ - proc_create_seq("consoles", 0, NULL, &consoles_op); - return 0; - } ---- a/fs/proc/proc_tty.c -+++ b/fs/proc/proc_tty.c -@@ -133,7 +133,10 @@ static const struct seq_operations tty_d - void proc_tty_register_driver(struct tty_driver *driver) - { - struct proc_dir_entry *ent; -- -+ -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - if (!driver->driver_name || driver->proc_entry || - !driver->ops->proc_show) - return; -@@ -150,6 +153,9 @@ void proc_tty_unregister_driver(struct t - { - struct proc_dir_entry *ent; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - ent = driver->proc_entry; - if (!ent) - return; -@@ -164,6 +170,9 @@ void proc_tty_unregister_driver(struct t - */ - void __init proc_tty_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - if (!proc_mkdir("tty", NULL)) - return; - proc_mkdir("tty/ldisc", NULL); /* Preserved: it's userspace visible */ ---- a/include/net/snmp.h -+++ b/include/net/snmp.h -@@ -124,6 +124,21 @@ struct linux_tls_mib { - #define DECLARE_SNMP_STAT(type, name) \ - extern __typeof__(type) __percpu *name - -+#ifdef CONFIG_PROC_STRIPPED -+#define __SNMP_STATS_DUMMY(mib) \ -+ do { (void) mib->mibs[0]; } while(0) -+ -+#define __SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib) -+#define SNMP_INC_STATS_ATOMIC_LONG(mib, field) __SNMP_STATS_DUMMY(mib) -+#define SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib) -+#define SNMP_DEC_STATS(mib, field) __SNMP_STATS_DUMMY(mib) -+#define __SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib) -+#define SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib) -+#define SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib) -+#define __SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib) -+ -+#else -+ - #define __SNMP_INC_STATS(mib, field) \ - __this_cpu_inc(mib->mibs[field]) - -@@ -154,8 +169,9 @@ struct linux_tls_mib { - __this_cpu_add(ptr[basefield##OCTETS], addend); \ - } while (0) - -+#endif - --#if BITS_PER_LONG==32 -+#if (BITS_PER_LONG==32) && !defined(CONFIG_PROC_STRIPPED) - - #define __SNMP_ADD_STATS64(mib, field, addend) \ - do { \ ---- a/ipc/msg.c -+++ b/ipc/msg.c -@@ -1350,6 +1350,9 @@ void __init msg_init(void) - { - msg_init_ns(&init_ipc_ns); - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - ipc_init_proc_interface("sysvipc/msg", - " key msqid perms cbytes qnum lspid lrpid uid gid cuid cgid stime rtime ctime\n", - IPC_MSG_IDS, sysvipc_msg_proc_show); ---- a/ipc/sem.c -+++ b/ipc/sem.c -@@ -268,6 +268,8 @@ void sem_exit_ns(struct ipc_namespace *n - void __init sem_init(void) - { - sem_init_ns(&init_ipc_ns); -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; - ipc_init_proc_interface("sysvipc/sem", - " key semid perms nsems uid gid cuid cgid otime ctime\n", - IPC_SEM_IDS, sysvipc_sem_proc_show); ---- a/ipc/shm.c -+++ b/ipc/shm.c -@@ -154,6 +154,8 @@ pure_initcall(ipc_ns_init); - - void __init shm_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; - ipc_init_proc_interface("sysvipc/shm", - #if BITS_PER_LONG <= 32 - " key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime rss swap\n", ---- a/ipc/util.c -+++ b/ipc/util.c -@@ -141,6 +141,9 @@ void __init ipc_init_proc_interface(cons - struct proc_dir_entry *pde; - struct ipc_proc_iface *iface; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - iface = kmalloc(sizeof(*iface), GFP_KERNEL); - if (!iface) - return; ---- a/kernel/exec_domain.c -+++ b/kernel/exec_domain.c -@@ -29,6 +29,8 @@ static int execdomains_proc_show(struct - - static int __init proc_execdomains_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; - proc_create_single("execdomains", 0, NULL, execdomains_proc_show); - return 0; - } ---- a/kernel/irq/proc.c -+++ b/kernel/irq/proc.c -@@ -341,6 +341,9 @@ void register_irq_proc(unsigned int irq, - void __maybe_unused *irqp = (void *)(unsigned long) irq; - char name [MAX_NAMELEN]; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP)) -+ return; -+ - if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip)) - return; - -@@ -394,6 +397,9 @@ void unregister_irq_proc(unsigned int ir - { - char name [MAX_NAMELEN]; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP)) -+ return; -+ - if (!root_irq_dir || !desc->dir) - return; - #ifdef CONFIG_SMP -@@ -432,6 +438,9 @@ void init_irq_proc(void) - unsigned int irq; - struct irq_desc *desc; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP)) -+ return; -+ - /* create /proc/irq */ - root_irq_dir = proc_mkdir("irq", NULL); - if (!root_irq_dir) ---- a/kernel/time/timer_list.c -+++ b/kernel/time/timer_list.c -@@ -350,6 +350,8 @@ static int __init init_timer_list_procfs - { - struct proc_dir_entry *pe; - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; - pe = proc_create_seq_private("timer_list", 0400, NULL, &timer_list_sops, - sizeof(struct timer_list_iter), NULL); - if (!pe) ---- a/mm/vmalloc.c -+++ b/mm/vmalloc.c -@@ -4132,6 +4132,8 @@ static const struct seq_operations vmall - - static int __init proc_vmalloc_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; - if (IS_ENABLED(CONFIG_NUMA)) - proc_create_seq_private("vmallocinfo", 0400, NULL, - &vmalloc_op, ---- a/mm/vmstat.c -+++ b/mm/vmstat.c -@@ -2120,10 +2120,12 @@ void __init init_mm_internals(void) - #endif - migrate_on_reclaim_init(); - #ifdef CONFIG_PROC_FS -- proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op); -- proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) { -+ proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op); -+ proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op); -+ proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op); -+ } - proc_create_seq("vmstat", 0444, NULL, &vmstat_op); -- proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op); - #endif - } - ---- a/net/8021q/vlanproc.c -+++ b/net/8021q/vlanproc.c -@@ -93,6 +93,9 @@ void vlan_proc_cleanup(struct net *net) - { - struct vlan_net *vn = net_generic(net, vlan_net_id); - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return; -+ - if (vn->proc_vlan_conf) - remove_proc_entry(name_conf, vn->proc_vlan_dir); - -@@ -112,6 +115,9 @@ int __net_init vlan_proc_init(struct net - { - struct vlan_net *vn = net_generic(net, vlan_net_id); - -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; -+ - vn->proc_vlan_dir = proc_net_mkdir(net, name_root, net->proc_net); - if (!vn->proc_vlan_dir) - goto err; ---- a/net/core/net-procfs.c -+++ b/net/core/net-procfs.c -@@ -319,10 +319,12 @@ static int __net_init dev_proc_net_init( - if (!proc_create_net("dev", 0444, net->proc_net, &dev_seq_ops, - sizeof(struct seq_net_private))) - goto out; -- if (!proc_create_seq("softnet_stat", 0444, net->proc_net, -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && -+ !proc_create_seq("softnet_stat", 0444, net->proc_net, - &softnet_seq_ops)) - goto out_dev; -- if (!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops, -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && -+ !proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops, - sizeof(struct seq_net_private))) - goto out_softnet; - -@@ -332,9 +334,11 @@ static int __net_init dev_proc_net_init( - out: - return rc; - out_ptype: -- remove_proc_entry("ptype", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ remove_proc_entry("ptype", net->proc_net); - out_softnet: -- remove_proc_entry("softnet_stat", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ remove_proc_entry("softnet_stat", net->proc_net); - out_dev: - remove_proc_entry("dev", net->proc_net); - goto out; -@@ -344,8 +348,10 @@ static void __net_exit dev_proc_net_exit - { - wext_proc_exit(net); - -- remove_proc_entry("ptype", net->proc_net); -- remove_proc_entry("softnet_stat", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) { -+ remove_proc_entry("ptype", net->proc_net); -+ remove_proc_entry("softnet_stat", net->proc_net); -+ } - remove_proc_entry("dev", net->proc_net); - } - ---- a/net/core/sock.c -+++ b/net/core/sock.c -@@ -3999,6 +3999,8 @@ static __net_initdata struct pernet_oper - - static int __init proto_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; - return register_pernet_subsys(&proto_net_ops); - } - ---- a/net/ipv4/fib_trie.c -+++ b/net/ipv4/fib_trie.c -@@ -3029,11 +3029,13 @@ static const struct seq_operations fib_r - - int __net_init fib_proc_init(struct net *net) - { -- if (!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops, -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && -+ !proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops, - sizeof(struct fib_trie_iter))) - goto out1; - -- if (!proc_create_net_single("fib_triestat", 0444, net->proc_net, -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) && -+ !proc_create_net_single("fib_triestat", 0444, net->proc_net, - fib_triestat_seq_show, NULL)) - goto out2; - -@@ -3044,17 +3046,21 @@ int __net_init fib_proc_init(struct net - return 0; - - out3: -- remove_proc_entry("fib_triestat", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ remove_proc_entry("fib_triestat", net->proc_net); - out2: -- remove_proc_entry("fib_trie", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ remove_proc_entry("fib_trie", net->proc_net); - out1: - return -ENOMEM; - } - - void __net_exit fib_proc_exit(struct net *net) - { -- remove_proc_entry("fib_trie", net->proc_net); -- remove_proc_entry("fib_triestat", net->proc_net); -+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) { -+ remove_proc_entry("fib_trie", net->proc_net); -+ remove_proc_entry("fib_triestat", net->proc_net); -+ } - remove_proc_entry("route", net->proc_net); - } - ---- a/net/ipv4/proc.c -+++ b/net/ipv4/proc.c -@@ -553,5 +553,8 @@ static __net_initdata struct pernet_oper - - int __init ip_misc_proc_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; -+ - return register_pernet_subsys(&ip_proc_ops); - } ---- a/net/ipv4/route.c -+++ b/net/ipv4/route.c -@@ -380,6 +380,9 @@ static struct pernet_operations ip_rt_pr - - static int __init ip_rt_proc_init(void) - { -+ if (IS_ENABLED(CONFIG_PROC_STRIPPED)) -+ return 0; -+ - return register_pernet_subsys(&ip_rt_proc_ops); - } - diff --git a/target/linux/generic/hack-5.19/904-debloat_dma_buf.patch b/target/linux/generic/hack-5.19/904-debloat_dma_buf.patch deleted file mode 100644 index bab1b22f6..000000000 --- a/target/linux/generic/hack-5.19/904-debloat_dma_buf.patch +++ /dev/null @@ -1,93 +0,0 @@ -From e3692cb2fcd5ba1244512a0f43b8118f65f1c375 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sat, 8 Jul 2017 08:20:43 +0200 -Subject: debloat: dmabuf - -Signed-off-by: Felix Fietkau ---- - drivers/base/Kconfig | 2 +- - drivers/dma-buf/Makefile | 10 +++++++--- - drivers/dma-buf/dma-buf.c | 4 +++- - kernel/sched/core.c | 1 + - 4 files changed, 12 insertions(+), 5 deletions(-) - ---- a/drivers/base/Kconfig -+++ b/drivers/base/Kconfig -@@ -198,7 +198,7 @@ config SOC_BUS - source "drivers/base/regmap/Kconfig" - - config DMA_SHARED_BUFFER -- bool -+ tristate - default n - select IRQ_WORK - help ---- a/drivers/dma-buf/heaps/Makefile -+++ b/drivers/dma-buf/heaps/Makefile -@@ -1,3 +1,3 @@ - # SPDX-License-Identifier: GPL-2.0 --obj-$(CONFIG_DMABUF_HEAPS_SYSTEM) += system_heap.o --obj-$(CONFIG_DMABUF_HEAPS_CMA) += cma_heap.o -+dma-buf-objs-$(CONFIG_DMABUF_HEAPS_SYSTEM) += system_heap.o -+dma-buf-objs-$(CONFIG_DMABUF_HEAPS_CMA) += cma_heap.o ---- a/drivers/dma-buf/Makefile -+++ b/drivers/dma-buf/Makefile -@@ -1,12 +1,14 @@ - # SPDX-License-Identifier: GPL-2.0-only --obj-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \ -+obj-$(CONFIG_DMA_SHARED_BUFFER) := dma-shared-buffer.o -+ -+dma-buf-objs-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \ - dma-resv.o --obj-$(CONFIG_DMABUF_HEAPS) += dma-heap.o --obj-$(CONFIG_DMABUF_HEAPS) += heaps/ --obj-$(CONFIG_SYNC_FILE) += sync_file.o --obj-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o --obj-$(CONFIG_UDMABUF) += udmabuf.o --obj-$(CONFIG_DMABUF_SYSFS_STATS) += dma-buf-sysfs-stats.o -+dma-buf-objs-$(CONFIG_DMABUF_HEAPS) += dma-heap.o -+obj-$(CONFIG_DMABUF_HEAPS) += heaps/ -+dma-buf-objs-$(CONFIG_SYNC_FILE) += sync_file.o -+dma-buf-objs-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o -+dma-buf-objs-$(CONFIG_UDMABUF) += udmabuf.o -+dma-buf-objs-$(CONFIG_DMABUF_SYSFS_STATS) += udmabuf.o - - dmabuf_selftests-y := \ - selftest.o \ -@@ -15,4 +17,6 @@ dmabuf_selftests-y := \ - st-dma-fence-unwrap.o \ - st-dma-resv.o - --obj-$(CONFIG_DMABUF_SELFTESTS) += dmabuf_selftests.o -+dma-buf-objs-$(CONFIG_DMABUF_SELFTESTS) += dmabuf_selftests.o -+ -+dma-shared-buffer-objs := $(dma-buf-objs-y) ---- a/drivers/dma-buf/dma-buf.c -+++ b/drivers/dma-buf/dma-buf.c -@@ -1473,4 +1473,5 @@ static void __exit dma_buf_deinit(void) - kern_unmount(dma_buf_mnt); - dma_buf_uninit_sysfs_statistics(); - } --__exitcall(dma_buf_deinit); -+module_exit(dma_buf_deinit); -+MODULE_LICENSE("GPL"); ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -4293,6 +4293,7 @@ int wake_up_state(struct task_struct *p, - { - return try_to_wake_up(p, state, 0); - } -+EXPORT_SYMBOL_GPL(wake_up_state); - - /* - * Perform scheduler related setup for a newly forked process p. ---- a/fs/d_path.c -+++ b/fs/d_path.c -@@ -314,6 +314,7 @@ char *dynamic_dname(struct dentry *dentr - buffer += buflen - sz; - return memcpy(buffer, temp, sz); - } -+EXPORT_SYMBOL_GPL(dynamic_dname); - - char *simple_dname(struct dentry *dentry, char *buffer, int buflen) - { diff --git a/target/linux/generic/hack-5.19/910-kobject_uevent.patch b/target/linux/generic/hack-5.19/910-kobject_uevent.patch deleted file mode 100644 index c4c41ca40..000000000 --- a/target/linux/generic/hack-5.19/910-kobject_uevent.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sun, 16 Jul 2017 16:56:10 +0200 -Subject: lib: add uevent_next_seqnum() - -Signed-off-by: Felix Fietkau ---- - include/linux/kobject.h | 5 +++++ - lib/kobject_uevent.c | 37 +++++++++++++++++++++++++++++++++++++ - 2 files changed, 42 insertions(+) - ---- a/lib/kobject_uevent.c -+++ b/lib/kobject_uevent.c -@@ -179,6 +179,18 @@ out: - return r; - } - -+u64 uevent_next_seqnum(void) -+{ -+ u64 seq; -+ -+ mutex_lock(&uevent_sock_mutex); -+ seq = ++uevent_seqnum; -+ mutex_unlock(&uevent_sock_mutex); -+ -+ return seq; -+} -+EXPORT_SYMBOL_GPL(uevent_next_seqnum); -+ - /** - * kobject_synth_uevent - send synthetic uevent with arguments - * diff --git a/target/linux/generic/hack-5.19/911-kobject_add_broadcast_uevent.patch b/target/linux/generic/hack-5.19/911-kobject_add_broadcast_uevent.patch deleted file mode 100644 index 9854585d2..000000000 --- a/target/linux/generic/hack-5.19/911-kobject_add_broadcast_uevent.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001 -From: Felix Fietkau -Date: Sun, 16 Jul 2017 16:56:10 +0200 -Subject: lib: add uevent_next_seqnum() - -Signed-off-by: Felix Fietkau ---- - include/linux/kobject.h | 5 +++++ - lib/kobject_uevent.c | 37 +++++++++++++++++++++++++++++++++++++ - 2 files changed, 42 insertions(+) - ---- a/include/linux/kobject.h -+++ b/include/linux/kobject.h -@@ -32,6 +32,8 @@ - #define UEVENT_NUM_ENVP 64 /* number of env pointers */ - #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */ - -+struct sk_buff; -+ - #ifdef CONFIG_UEVENT_HELPER - /* path to the userspace helper executed on an event */ - extern char uevent_helper[]; -@@ -224,4 +226,7 @@ int kobject_synth_uevent(struct kobject - __printf(2, 3) - int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...); - -+int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, -+ gfp_t allocation); -+ - #endif /* _KOBJECT_H_ */ ---- a/lib/kobject_uevent.c -+++ b/lib/kobject_uevent.c -@@ -691,6 +691,43 @@ int add_uevent_var(struct kobj_uevent_en - EXPORT_SYMBOL_GPL(add_uevent_var); - - #if defined(CONFIG_NET) -+int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, -+ gfp_t allocation) -+{ -+ struct uevent_sock *ue_sk; -+ int err = 0; -+ -+ /* send netlink message */ -+ mutex_lock(&uevent_sock_mutex); -+ list_for_each_entry(ue_sk, &uevent_sock_list, list) { -+ struct sock *uevent_sock = ue_sk->sk; -+ struct sk_buff *skb2; -+ -+ skb2 = skb_clone(skb, allocation); -+ if (!skb2) -+ break; -+ -+ err = netlink_broadcast(uevent_sock, skb2, pid, group, -+ allocation); -+ if (err) -+ break; -+ } -+ mutex_unlock(&uevent_sock_mutex); -+ -+ kfree_skb(skb); -+ return err; -+} -+#else -+int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group, -+ gfp_t allocation) -+{ -+ kfree_skb(skb); -+ return 0; -+} -+#endif -+EXPORT_SYMBOL_GPL(broadcast_uevent); -+ -+#if defined(CONFIG_NET) - static int uevent_net_broadcast(struct sock *usk, struct sk_buff *skb, - struct netlink_ext_ack *extack) - { diff --git a/target/linux/generic/hack-5.19/920-device_tree_cmdline.patch b/target/linux/generic/hack-5.19/920-device_tree_cmdline.patch deleted file mode 100644 index 92507b4f9..000000000 --- a/target/linux/generic/hack-5.19/920-device_tree_cmdline.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/drivers/of/fdt.c -+++ b/drivers/of/fdt.c -@@ -1178,6 +1178,9 @@ int __init early_init_dt_scan_chosen(cha - p = of_get_flat_dt_prop(node, "bootargs", &l); - if (p != NULL && l > 0) - strlcpy(cmdline, p, min(l, COMMAND_LINE_SIZE)); -+ p = of_get_flat_dt_prop(node, "bootargs-append", &l); -+ if (p != NULL && l > 0) -+ strlcat(cmdline, p, min_t(int, strlen(cmdline) + (int)l, COMMAND_LINE_SIZE)); - - /* - * CONFIG_CMDLINE is meant to be a default in case nothing else diff --git a/target/linux/generic/hack-5.19/952-add-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.19/952-add-net-conntrack-events-support-multiple-registrant.patch deleted file mode 100644 index b3cf1e0a3..000000000 --- a/target/linux/generic/hack-5.19/952-add-net-conntrack-events-support-multiple-registrant.patch +++ /dev/null @@ -1,352 +0,0 @@ -From 42824d4b753f84ccf885eca602c5037338b546c8 Mon Sep 17 00:00:00 2001 -From: Zhi Chen -Date: Tue, 13 Jan 2015 14:28:18 -0800 -Subject: [PATCH 3/3] net: conntrack events, support multiple registrant - -Merging this patch from kernel 3.4: -This was supported by old (.28) kernel versions but removed -because of it's overhead. -But we need this feature for NA connection manager. Both ipv4 -and ipv6 modules needs to register themselves to ct events. - -Change-Id: Iebfb254590fb594f5baf232f849d1b7ae45ef757 -Signed-off-by: Zhi Chen ---- - include/net/netfilter/nf_conntrack_ecache.h | 15 ++- - include/net/netns/conntrack.h | 3 + - net/netfilter/Kconfig | 8 ++ - net/netfilter/nf_conntrack_core.c | 4 + - net/netfilter/nf_conntrack_ecache.c | 103 +++++++++++++++++++- - net/netfilter/nf_conntrack_netlink.c | 17 ++++ - 6 files changed, 146 insertions(+), 4 deletions(-) - ---- a/include/net/netfilter/nf_conntrack_ecache.h -+++ b/include/net/netfilter/nf_conntrack_ecache.h -@@ -65,9 +65,14 @@ struct nf_ct_event_notifier { - int (*exp_event)(unsigned int events, const struct nf_exp_event *item); - }; - --void nf_conntrack_register_notifier(struct net *net, -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb); -+extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb); -+#else -+int nf_conntrack_register_notifier(struct net *net, - const struct nf_ct_event_notifier *nb); - void nf_conntrack_unregister_notifier(struct net *net); -+#endif - - void nf_ct_deliver_cached_events(struct nf_conn *ct); - int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct, -@@ -98,11 +103,13 @@ static inline void - nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct) - { - #ifdef CONFIG_NF_CONNTRACK_EVENTS -- struct net *net = nf_ct_net(ct); - struct nf_conntrack_ecache *e; -+#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+ struct net *net = nf_ct_net(ct); - - if (!rcu_access_pointer(net->ct.nf_conntrack_event_cb)) - return; -+#endif - - e = nf_ct_ecache_find(ct); - if (e == NULL) -@@ -117,20 +124,34 @@ nf_conntrack_event_report(enum ip_conntr - u32 portid, int report) - { - #ifdef CONFIG_NF_CONNTRACK_EVENTS -- if (nf_ct_ecache_exist(ct)) -- return nf_conntrack_eventmask_report(1 << event, ct, portid, report); -+#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+ const struct net *net = nf_ct_net(ct); -+ -+ if (!rcu_access_pointer(net->ct.nf_conntrack_event_cb)) -+ return 0; - #endif -+ -+ return nf_conntrack_eventmask_report(1 << event, ct, portid, report); -+#else - return 0; -+#endif - } - - static inline int - nf_conntrack_event(enum ip_conntrack_events event, struct nf_conn *ct) - { - #ifdef CONFIG_NF_CONNTRACK_EVENTS -- if (nf_ct_ecache_exist(ct)) -- return nf_conntrack_eventmask_report(1 << event, ct, 0, 0); -+#ifndef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+ const struct net *net = nf_ct_net(ct); -+ -+ if (!rcu_access_pointer(net->ct.nf_conntrack_event_cb)) -+ return 0; - #endif -+ -+ return nf_conntrack_eventmask_report(1 << event, ct, 0, 0); -+#else - return 0; -+#endif - } - - #ifdef CONFIG_NF_CONNTRACK_EVENTS ---- a/include/net/netns/conntrack.h -+++ b/include/net/netns/conntrack.h -@@ -107,6 +107,9 @@ struct netns_ct { - u8 sysctl_checksum; - - struct ip_conntrack_stat __percpu *stat; -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+ struct atomic_notifier_head nf_conntrack_chain; -+#endif - struct nf_ct_event_notifier __rcu *nf_conntrack_event_cb; - struct nf_ip_net nf_ct_proto; - #if defined(CONFIG_NF_CONNTRACK_LABELS) ---- a/net/netfilter/Kconfig -+++ b/net/netfilter/Kconfig -@@ -161,6 +161,14 @@ config NF_CONNTRACK_EVENTS - - If unsure, say `N'. - -+config NF_CONNTRACK_CHAIN_EVENTS -+ bool "Register multiple callbacks to ct events" -+ depends on NF_CONNTRACK_EVENTS -+ help -+ Support multiple registrations. -+ -+ If unsure, say `N'. -+ - config NF_CONNTRACK_TIMEOUT - bool 'Connection tracking timeout' - depends on NETFILTER_ADVANCED ---- a/net/netfilter/nf_conntrack_core.c -+++ b/net/netfilter/nf_conntrack_core.c -@@ -2802,6 +2802,10 @@ int nf_conntrack_init_net(struct net *ne - nf_conntrack_helper_pernet_init(net); - nf_conntrack_proto_pernet_init(net); - -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+ ATOMIC_INIT_NOTIFIER_HEAD(&net->ct.nf_conntrack_chain); -+#endif -+ - return 0; - - err_expect: ---- a/net/netfilter/nf_conntrack_ecache.c -+++ b/net/netfilter/nf_conntrack_ecache.c -@@ -17,6 +17,9 @@ - #include - #include - #include -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+#include -+#endif - #include - #include - #include -@@ -162,6 +165,35 @@ static int __nf_conntrack_eventmask_repo - return ret; - } - -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct, -+ u32 portid, int report) -+{ -+ struct nf_conntrack_ecache *e; -+ struct net *net = nf_ct_net(ct); -+ -+ e = nf_ct_ecache_find(ct); -+ if (e == NULL) -+ return 0; -+ -+ if (nf_ct_is_confirmed(ct)) { -+ struct nf_ct_event item = { -+ .ct = ct, -+ .portid = e->portid ? e->portid : portid, -+ .report = report -+ }; -+ /* This is a resent of a destroy event? If so, skip missed */ -+ unsigned long missed = e->portid ? 0 : e->missed; -+ -+ if (!((eventmask | missed) & e->ctmask)) -+ return 0; -+ -+ atomic_notifier_call_chain(&net->ct.nf_conntrack_chain, eventmask | missed, &item); -+ } -+ -+ return 0; -+} -+#else - int nf_conntrack_eventmask_report(unsigned int events, struct nf_conn *ct, - u32 portid, int report) - { -@@ -197,10 +229,52 @@ int nf_conntrack_eventmask_report(unsign - - return ret; - } -+#endif - EXPORT_SYMBOL_GPL(nf_conntrack_eventmask_report); - - /* deliver cached events and clear cache entry - must be called with locally - * disabled softirqs */ -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+void nf_ct_deliver_cached_events(struct nf_conn *ct) -+{ -+ unsigned long events, missed; -+ struct nf_conntrack_ecache *e; -+ struct nf_ct_event item; -+ struct net *net = nf_ct_net(ct); -+ -+ e = nf_ct_ecache_find(ct); -+ if (e == NULL) -+ return; -+ -+ events = xchg(&e->cache, 0); -+ -+ if (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct) || !events) -+ return; -+ -+ /* We make a copy of the missed event cache without taking -+ * the lock, thus we may send missed events twice. However, -+ * this does not harm and it happens very rarely. */ -+ missed = e->missed; -+ -+ if (!((events | missed) & e->ctmask)) -+ return; -+ -+ item.ct = ct; -+ item.portid = 0; -+ item.report = 0; -+ -+ atomic_notifier_call_chain(&net->ct.nf_conntrack_chain, -+ events | missed, -+ &item); -+ -+ if (likely(!missed)) -+ return; -+ -+ spin_lock_bh(&ct->lock); -+ e->missed &= ~missed; -+ spin_unlock_bh(&ct->lock); -+} -+#else - void nf_ct_deliver_cached_events(struct nf_conn *ct) - { - struct nf_conntrack_ecache *e; -@@ -226,6 +300,7 @@ void nf_ct_deliver_cached_events(struct - */ - __nf_conntrack_eventmask_report(e, events, e->missed, &item); - } -+#endif - EXPORT_SYMBOL_GPL(nf_ct_deliver_cached_events); - - void nf_ct_expect_event_report(enum ip_conntrack_expect_events event, -@@ -258,20 +333,43 @@ out_unlock: - rcu_read_unlock(); - } - --void nf_conntrack_register_notifier(struct net *net, -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+int nf_conntrack_register_notifier(struct net *net, -+ struct notifier_block *nb) -+{ -+ return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb); -+} -+#else -+int nf_conntrack_register_notifier(struct net *net, - const struct nf_ct_event_notifier *new) - { -+ int ret; - struct nf_ct_event_notifier *notify; - - mutex_lock(&nf_ct_ecache_mutex); - notify = rcu_dereference_protected(net->ct.nf_conntrack_event_cb, - lockdep_is_held(&nf_ct_ecache_mutex)); - WARN_ON_ONCE(notify); -+ if (notify != NULL) { -+ ret = -EBUSY; -+ goto out_unlock; -+ } -+ - rcu_assign_pointer(net->ct.nf_conntrack_event_cb, new); -- mutex_unlock(&nf_ct_ecache_mutex); -+ ret = 0; -+out_unlock: -+ mutex_unlock(&nf_ct_ecache_mutex); -+ return ret; - } -+#endif - EXPORT_SYMBOL_GPL(nf_conntrack_register_notifier); - -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb) -+{ -+ return atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb); -+} -+#else - void nf_conntrack_unregister_notifier(struct net *net) - { - mutex_lock(&nf_ct_ecache_mutex); -@@ -279,6 +377,7 @@ void nf_conntrack_unregister_notifier(st - mutex_unlock(&nf_ct_ecache_mutex); - /* synchronize_rcu() is called after netns pre_exit */ - } -+#endif - EXPORT_SYMBOL_GPL(nf_conntrack_unregister_notifier); - - void nf_conntrack_ecache_work(struct net *net, enum nf_ct_ecache_state state) ---- a/net/netfilter/nf_conntrack_netlink.c -+++ b/net/netfilter/nf_conntrack_netlink.c -@@ -712,12 +712,19 @@ static size_t ctnetlink_nlmsg_size(const - } - - static int -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+ctnetlink_conntrack_event(struct notifier_block *this, unsigned long events, void *ptr) -+#else - ctnetlink_conntrack_event(unsigned int events, const struct nf_ct_event *item) -+#endif - { - const struct nf_conntrack_zone *zone; - struct net *net; - struct nlmsghdr *nlh; - struct nlattr *nest_parms; -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+ struct nf_ct_event *item = (struct nf_ct_event *)ptr; -+#endif - struct nf_conn *ct = item->ct; - struct sk_buff *skb; - unsigned int type; -@@ -3791,11 +3798,17 @@ static int ctnetlink_stat_exp_cpu(struct - } - - #ifdef CONFIG_NF_CONNTRACK_EVENTS -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+static struct notifier_block ctnl_notifier = { -+ .notifier_call = ctnetlink_conntrack_event -+}; -+#else - static struct nf_ct_event_notifier ctnl_notifier = { - .ct_event = ctnetlink_conntrack_event, - .exp_event = ctnetlink_expect_event, - }; - #endif -+#endif - - static const struct nfnl_callback ctnl_cb[IPCTNL_MSG_MAX] = { - [IPCTNL_MSG_CT_NEW] = { -@@ -3894,8 +3907,12 @@ static int __net_init ctnetlink_net_init - static void ctnetlink_net_pre_exit(struct net *net) - { - #ifdef CONFIG_NF_CONNTRACK_EVENTS -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+ nf_conntrack_unregister_notifier(net,&ctnl_notifier); -+#else - nf_conntrack_unregister_notifier(net); - #endif -+#endif - } - - static struct pernet_operations ctnetlink_net_ops = { diff --git a/target/linux/generic/hack-5.19/953-net-patch-linux-kernel-to-support-shortcut-fe.patch b/target/linux/generic/hack-5.19/953-net-patch-linux-kernel-to-support-shortcut-fe.patch deleted file mode 100644 index 3cc6f5cd3..000000000 --- a/target/linux/generic/hack-5.19/953-net-patch-linux-kernel-to-support-shortcut-fe.patch +++ /dev/null @@ -1,204 +0,0 @@ ---- a/include/linux/if_bridge.h -+++ b/include/linux/if_bridge.h -@@ -69,6 +69,9 @@ void brioctl_set(int (*hook)(struct net - int br_ioctl_call(struct net *net, struct net_bridge *br, unsigned int cmd, - struct ifreq *ifr, void __user *uarg); - -+extern void br_dev_update_stats(struct net_device *dev, -+ struct rtnl_link_stats64 *nlstats); -+ - #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING) - int br_multicast_list_adjacent(struct net_device *dev, - struct list_head *br_ip_list); ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -1146,6 +1146,10 @@ struct sk_buff { - __u8 slow_gro:1; - __u8 csum_not_inet:1; - -+#ifdef CONFIG_SHORTCUT_FE -+ __u8 fast_forwarded:1; -+#endif -+ - #ifdef CONFIG_NET_SCHED - __u16 tc_index; /* traffic control index */ - #endif ---- a/include/linux/timer.h -+++ b/include/linux/timer.h -@@ -18,6 +18,10 @@ struct timer_list { - void (*function)(struct timer_list *); - u32 flags; - -+#ifdef CONFIG_SHORTCUT_FE -+ unsigned long cust_data; -+#endif -+ - #ifdef CONFIG_LOCKDEP - struct lockdep_map lockdep_map; - #endif ---- a/include/net/netfilter/nf_conntrack_ecache.h -+++ b/include/net/netfilter/nf_conntrack_ecache.h -@@ -68,6 +68,8 @@ struct nf_ct_event_notifier { - #ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS - extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb); - extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb); -+extern int nf_conntrack_register_chain_notifier(struct net *net, struct notifier_block *nb); -+extern int nf_conntrack_unregister_chain_notifier(struct net *net, struct notifier_block *nb); - #else - int nf_conntrack_register_notifier(struct net *net, - const struct nf_ct_event_notifier *nb); ---- a/net/Kconfig -+++ b/net/Kconfig -@@ -460,6 +460,9 @@ config FAILOVER - migration of VMs with direct attached VFs by failing over to the - paravirtual datapath when the VF is unplugged. - -+config SHORTCUT_FE -+ bool "Enables kernel network stack path for Shortcut Forwarding Engine" -+ - config ETHTOOL_NETLINK - bool "Netlink interface for ethtool" - default y ---- a/net/bridge/br_if.c -+++ b/net/bridge/br_if.c -@@ -774,6 +774,28 @@ void br_port_flags_change(struct net_bri - br_recalculate_neigh_suppress_enabled(br); - } - -+void br_dev_update_stats(struct net_device *dev, -+ struct rtnl_link_stats64 *nlstats) -+{ -+ -+ struct pcpu_sw_netstats *stats; -+ -+ /* Is this a bridge? */ -+ if (!(dev->priv_flags & IFF_EBRIDGE)) -+ return; -+ -+ -+ stats = this_cpu_ptr(dev->tstats); -+ -+ u64_stats_update_begin(&stats->syncp); -+ stats->rx_packets += nlstats->rx_packets; -+ stats->rx_bytes += nlstats->rx_bytes; -+ stats->tx_packets += nlstats->tx_packets; -+ stats->tx_bytes += nlstats->tx_bytes; -+ u64_stats_update_end(&stats->syncp); -+} -+EXPORT_SYMBOL_GPL(br_dev_update_stats); -+ - bool br_port_flag_is_set(const struct net_device *dev, unsigned long flag) - { - struct net_bridge_port *p; ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -3581,9 +3581,17 @@ static int xmit_one(struct sk_buff *skb, - { - unsigned int len; - int rc; -- -+#ifdef CONFIG_SHORTCUT_FE -+ /* If this skb has been fast forwarded then we don't want it to -+ * go to any taps (by definition we're trying to bypass them). -+ */ -+ if (!skb->fast_forwarded) { -+#endif - if (dev_nit_active(dev)) - dev_queue_xmit_nit(skb, dev); -+#ifdef CONFIG_SHORTCUT_FE -+ } -+#endif - - len = skb->len; - trace_net_dev_start_xmit(skb, dev); -@@ -5233,6 +5241,11 @@ void netdev_rx_handler_unregister(struct - } - EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister); - -+#ifdef CONFIG_SHORTCUT_FE -+int (*athrs_fast_nat_recv)(struct sk_buff *skb) __rcu __read_mostly; -+EXPORT_SYMBOL_GPL(athrs_fast_nat_recv); -+#endif -+ - /* - * Limit the use of PFMEMALLOC reserves to those protocols that implement - * the special handling of PFMEMALLOC skbs. -@@ -5281,6 +5294,10 @@ static int __netif_receive_skb_core(stru - int ret = NET_RX_DROP; - __be16 type; - -+#ifdef CONFIG_SHORTCUT_FE -+ int (*fast_recv)(struct sk_buff *skb); -+#endif -+ - net_timestamp_check(!READ_ONCE(netdev_tstamp_prequeue), skb); - - trace_netif_receive_skb(skb); -@@ -5318,6 +5335,15 @@ another_round: - goto out; - } - -+#ifdef CONFIG_SHORTCUT_FE -+ fast_recv = rcu_dereference(athrs_fast_nat_recv); -+ if (fast_recv) { -+ if (fast_recv(skb)) { -+ ret = NET_RX_SUCCESS; -+ goto out; -+ } -+ } -+#endif - if (skb_skip_tc_classify(skb)) - goto skip_classify; - ---- a/net/netfilter/nf_conntrack_ecache.c -+++ b/net/netfilter/nf_conntrack_ecache.c -@@ -143,12 +143,23 @@ static int __nf_conntrack_eventmask_repo - rcu_read_lock(); - - notify = rcu_dereference(net->ct.nf_conntrack_event_cb); -- if (!notify) { -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+ if (!notify && !rcu_dereference_raw(net->ct.nf_conntrack_chain.head)) -+#else -+ if (!notify) -+#endif -+ { - rcu_read_unlock(); - return 0; - } -- -+#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS -+ ret = atomic_notifier_call_chain(&net->ct.nf_conntrack_chain, -+ events | missed, &item); -+ if (notify) -+ ret = notify->ct_event(events | missed, item); -+#else - ret = notify->ct_event(events | missed, item); -+#endif - rcu_read_unlock(); - - if (likely(ret >= 0 && missed == 0)) -@@ -339,6 +350,11 @@ int nf_conntrack_register_notifier(struc - { - return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb); - } -+int nf_conntrack_register_chain_notifier(struct net *net, struct notifier_block *nb) -+{ -+ return atomic_notifier_chain_register(&net->ct.nf_conntrack_chain, nb); -+} -+EXPORT_SYMBOL_GPL(nf_conntrack_register_chain_notifier); - #else - int nf_conntrack_register_notifier(struct net *net, - const struct nf_ct_event_notifier *new) -@@ -369,6 +385,11 @@ int nf_conntrack_unregister_notifier(str - { - return atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb); - } -+int nf_conntrack_unregister_chain_notifier(struct net *net, struct notifier_block *nb) -+{ -+ return atomic_notifier_chain_unregister(&net->ct.nf_conntrack_chain, nb); -+} -+EXPORT_SYMBOL_GPL(nf_conntrack_unregister_chain_notifier); - #else - void nf_conntrack_unregister_notifier(struct net *net) - { diff --git a/target/linux/generic/hack-5.19/992-add-ndo-do-ioctl.patch b/target/linux/generic/hack-5.19/992-add-ndo-do-ioctl.patch deleted file mode 100644 index da206e4b4..000000000 --- a/target/linux/generic/hack-5.19/992-add-ndo-do-ioctl.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/net/wireless/wext-core.c -+++ b/net/wireless/wext-core.c -@@ -956,6 +956,9 @@ static int wireless_process_ioctl(struct - else if (private) - return private(dev, iwr, cmd, info, handler); - } -+ /* Old driver API : call driver ioctl handler */ -+ if (dev->netdev_ops->ndo_do_ioctl) -+ return dev->netdev_ops->ndo_do_ioctl(dev, (struct ifreq *) iwr, cmd); - return -EOPNOTSUPP; - } - diff --git a/target/linux/generic/pending-5.19/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch b/target/linux/generic/pending-5.19/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch deleted file mode 100644 index 92bf8420c..000000000 --- a/target/linux/generic/pending-5.19/100-compiler.h-only-include-asm-rwonce.h-for-kernel-code.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Felix Fietkau -Date: Thu, 22 Oct 2020 22:00:03 +0200 -Subject: [PATCH] compiler.h: only include asm/rwonce.h for kernel code - -This header file is not in uapi, which makes any user space code that includes -linux/compiler.h to fail with the error 'asm/rwonce.h: No such file or directory' - -Fixes: e506ea451254 ("compiler.h: Split {READ,WRITE}_ONCE definitions out into rwonce.h") -Signed-off-by: Felix Fietkau ---- - ---- a/include/linux/compiler.h -+++ b/include/linux/compiler.h -@@ -213,6 +213,8 @@ void ftrace_likely_update(struct ftrace_ - #define function_nocfi(x) (x) - #endif - -+#include -+ - #endif /* __KERNEL__ */ - - /* -@@ -245,6 +247,4 @@ static inline void *offset_to_ptr(const - */ - #define prevent_tail_call_optimization() mb() - --#include -- - #endif /* __LINUX_COMPILER_H */ diff --git a/target/linux/generic/pending-5.19/101-Use-stddefs.h-instead-of-compiler.h.patch b/target/linux/generic/pending-5.19/101-Use-stddefs.h-instead-of-compiler.h.patch deleted file mode 100644 index 824b9444e..000000000 --- a/target/linux/generic/pending-5.19/101-Use-stddefs.h-instead-of-compiler.h.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/include/uapi/linux/swab.h -+++ b/include/uapi/linux/swab.h -@@ -3,7 +3,7 @@ - #define _UAPI_LINUX_SWAB_H - - #include --#include -+#include - #include - #include - diff --git a/target/linux/generic/pending-5.19/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch b/target/linux/generic/pending-5.19/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch deleted file mode 100644 index 7ce3d491c..000000000 --- a/target/linux/generic/pending-5.19/102-MIPS-only-process-negative-stack-offsets-on-stack-tr.patch +++ /dev/null @@ -1,57 +0,0 @@ -From: Felix Fietkau -Date: Wed, 18 Apr 2018 10:50:05 +0200 -Subject: [PATCH] MIPS: only process negative stack offsets on stack traces - -Fixes endless back traces in cases where the compiler emits a stack -pointer increase in a branch delay slot (probably for some form of -function return). - -[ 3.475442] BUG: MAX_STACK_TRACE_ENTRIES too low! -[ 3.480070] turning off the locking correctness validator. -[ 3.485521] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.14.34 #0 -[ 3.491475] Stack : 00000000 00000000 00000000 00000000 80e0fce2 00000034 00000000 00000000 -[ 3.499764] 87c3838c 80696377 8061047c 00000000 00000001 00000001 87c2d850 6534689f -[ 3.508059] 00000000 00000000 80e10000 00000000 00000000 000000cf 0000000f 00000000 -[ 3.516353] 00000000 806a0000 00076891 00000000 00000000 00000000 ffffffff 00000000 -[ 3.524648] 806c0000 00000004 80e10000 806a0000 00000003 80690000 00000000 80700000 -[ 3.532942] ... -[ 3.535362] Call Trace: -[ 3.537818] [<80010a48>] show_stack+0x58/0x100 -[ 3.542207] [<804c2f78>] dump_stack+0xe8/0x170 -[ 3.546613] [<80079f90>] save_trace+0xf0/0x110 -[ 3.551010] [<8007b1ec>] mark_lock+0x33c/0x78c -[ 3.555413] [<8007bf48>] __lock_acquire+0x2ac/0x1a08 -[ 3.560337] [<8007de60>] lock_acquire+0x64/0x8c -[ 3.564846] [<804e1570>] _raw_spin_lock_irqsave+0x54/0x78 -[ 3.570186] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.574770] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.579257] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.583839] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.588329] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.592911] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.597401] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.601983] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.606473] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.611055] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.615545] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.620125] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.624619] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.629197] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.633691] [<801b618c>] kernfs_notify+0x94/0xac -[ 3.638269] [<801b7b10>] sysfs_notify+0x74/0xa0 -[ 3.642763] [<801b618c>] kernfs_notify+0x94/0xac - -Signed-off-by: Felix Fietkau ---- - ---- a/arch/mips/kernel/process.c -+++ b/arch/mips/kernel/process.c -@@ -394,6 +394,8 @@ static inline int is_sp_move_ins(union m - - if (ip->i_format.opcode == addiu_op || - ip->i_format.opcode == daddiu_op) { -+ if (ip->i_format.simmediate > 0) -+ return 0; - *frame_size = -ip->i_format.simmediate; - return 1; - } diff --git a/target/linux/generic/pending-5.19/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-5.19/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch deleted file mode 100644 index 3b8571561..000000000 --- a/target/linux/generic/pending-5.19/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch +++ /dev/null @@ -1,82 +0,0 @@ -From: Tobias Wolf -Subject: mm: Fix alloc_node_mem_map with ARCH_PFN_OFFSET calculation - -An rt288x (ralink) based router (Belkin F5D8235 v1) does not boot with any -kernel beyond version 4.3 resulting in: - -BUG: Bad page state in process swapper pfn:086ac - -bisect resulted in: - -a1c34a3bf00af2cede839879502e12dc68491ad5 is the first bad commit -commit a1c34a3bf00af2cede839879502e12dc68491ad5 -Author: Laura Abbott -Date: Thu Nov 5 18:48:46 2015 -0800 - - mm: Don't offset memmap for flatmem - - Srinivas Kandagatla reported bad page messages when trying to remove the - bottom 2MB on an ARM based IFC6410 board - - BUG: Bad page state in process swapper pfn:fffa8 - page:ef7fb500 count:0 mapcount:0 mapping: (null) index:0x0 - flags: 0x96640253(locked|error|dirty|active|arch_1|reclaim|mlocked) - page dumped because: PAGE_FLAGS_CHECK_AT_FREE flag(s) set - bad because of flags: - flags: 0x200041(locked|active|mlocked) - Modules linked in: - CPU: 0 PID: 0 Comm: swapper Not tainted 3.19.0-rc3-00007-g412f9ba-dirty -#816 - Hardware name: Qualcomm (Flattened Device Tree) - unwind_backtrace - show_stack - dump_stack - bad_page - free_pages_prepare - free_hot_cold_page - __free_pages - free_highmem_page - mem_init - start_kernel - Disabling lock debugging due to kernel taint - [...] -:040000 040000 2de013c372345fd471cd58f0553c9b38b0ef1cc4 -0a8156f848733dfa21e16c196dfb6c0a76290709 M mm - -This fix for ARM does not account ARCH_PFN_OFFSET for mem_map as later used by -page_to_pfn anymore. - -The following output was generated with two hacked in printk statements: - -printk("before %p vs. %p or %p\n", mem_map, mem_map - offset, mem_map - -(pgdat->node_start_pfn - ARCH_PFN_OFFSET)); - if (page_to_pfn(mem_map) != pgdat->node_start_pfn) - mem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET); -printk("after %p\n", mem_map); - -Output: - -[ 0.000000] before 8861b280 vs. 8861b280 or 8851b280 -[ 0.000000] after 8851b280 - -As seen in the first line mem_map with subtraction of offset does not equal the -mem_map after subtraction of ARCH_PFN_OFFSET. - -After adding the offset of ARCH_PFN_OFFSET as well to mem_map as the -previously calculated offset is zero for the named platform it is able to boot -4.4 and 4.9-rc7 again. - -Signed-off-by: Tobias Wolf ---- - ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -7743,7 +7743,7 @@ static void __init alloc_node_mem_map(st - if (pgdat == NODE_DATA(0)) { - mem_map = NODE_DATA(0)->node_mem_map; - if (page_to_pfn(mem_map) != pgdat->node_start_pfn) -- mem_map -= offset; -+ mem_map -= offset + (pgdat->node_start_pfn - ARCH_PFN_OFFSET); - } - #endif - } diff --git a/target/linux/generic/pending-5.19/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch b/target/linux/generic/pending-5.19/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch deleted file mode 100644 index 8f40ae3ba..000000000 --- a/target/linux/generic/pending-5.19/140-jffs2-use-.rename2-and-add-RENAME_WHITEOUT-support.patch +++ /dev/null @@ -1,81 +0,0 @@ -From: Felix Fietkau -Subject: jffs2: use .rename2 and add RENAME_WHITEOUT support - -It is required for renames on overlayfs - -Signed-off-by: Felix Fietkau ---- - ---- a/fs/jffs2/dir.c -+++ b/fs/jffs2/dir.c -@@ -614,8 +614,8 @@ static int jffs2_rmdir (struct inode *di - return ret; - } - --static int jffs2_mknod (struct user_namespace *mnt_userns, struct inode *dir_i, -- struct dentry *dentry, umode_t mode, dev_t rdev) -+static int __jffs2_mknod (struct user_namespace *mnt_userns, struct inode *dir_i, -+ struct dentry *dentry, umode_t mode, dev_t rdev, bool whiteout) - { - struct jffs2_inode_info *f, *dir_f; - struct jffs2_sb_info *c; -@@ -754,7 +754,11 @@ static int jffs2_mknod (struct user_name - mutex_unlock(&dir_f->sem); - jffs2_complete_reservation(c); - -- d_instantiate_new(dentry, inode); -+ if (!whiteout) -+ d_instantiate_new(dentry, inode); -+ else -+ unlock_new_inode(inode); -+ - return 0; - - fail: -@@ -762,6 +766,19 @@ static int jffs2_mknod (struct user_name - return ret; - } - -+static int jffs2_mknod (struct user_namespace *mnt_userns, struct inode *dir_i, -+ struct dentry *dentry, umode_t mode, dev_t rdev) -+{ -+ return __jffs2_mknod(mnt_userns, dir_i, dentry, mode, rdev, false); -+} -+ -+static int jffs2_whiteout (struct user_namespace *mnt_userns, struct inode *old_dir, -+ struct dentry *old_dentry) -+{ -+ return __jffs2_mknod(mnt_userns, old_dir, old_dentry, S_IFCHR | WHITEOUT_MODE, -+ WHITEOUT_DEV, true); -+} -+ - static int jffs2_rename (struct user_namespace *mnt_userns, - struct inode *old_dir_i, struct dentry *old_dentry, - struct inode *new_dir_i, struct dentry *new_dentry, -@@ -773,7 +790,7 @@ static int jffs2_rename (struct user_nam - uint8_t type; - uint32_t now; - -- if (flags & ~RENAME_NOREPLACE) -+ if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT)) - return -EINVAL; - - /* The VFS will check for us and prevent trying to rename a -@@ -839,9 +856,14 @@ static int jffs2_rename (struct user_nam - if (d_is_dir(old_dentry) && !victim_f) - inc_nlink(new_dir_i); - -- /* Unlink the original */ -- ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), -- old_dentry->d_name.name, old_dentry->d_name.len, NULL, now); -+ if (flags & RENAME_WHITEOUT) -+ /* Replace with whiteout */ -+ ret = jffs2_whiteout(mnt_userns, old_dir_i, old_dentry); -+ else -+ /* Unlink the original */ -+ ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), -+ old_dentry->d_name.name, -+ old_dentry->d_name.len, NULL, now); - - /* We don't touch inode->i_nlink */ - diff --git a/target/linux/generic/pending-5.19/141-jffs2-add-RENAME_EXCHANGE-support.patch b/target/linux/generic/pending-5.19/141-jffs2-add-RENAME_EXCHANGE-support.patch deleted file mode 100644 index f58fc791d..000000000 --- a/target/linux/generic/pending-5.19/141-jffs2-add-RENAME_EXCHANGE-support.patch +++ /dev/null @@ -1,73 +0,0 @@ -From: Felix Fietkau -Subject: jffs2: add RENAME_EXCHANGE support - -Signed-off-by: Felix Fietkau ---- - ---- a/fs/jffs2/dir.c -+++ b/fs/jffs2/dir.c -@@ -787,18 +787,31 @@ static int jffs2_rename (struct user_nam - int ret; - struct jffs2_sb_info *c = JFFS2_SB_INFO(old_dir_i->i_sb); - struct jffs2_inode_info *victim_f = NULL; -+ struct inode *fst_inode = d_inode(old_dentry); -+ struct inode *snd_inode = d_inode(new_dentry); - uint8_t type; - uint32_t now; - -- if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT)) -+ if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT|RENAME_EXCHANGE)) - return -EINVAL; - -+ if ((flags & RENAME_EXCHANGE) && (old_dir_i != new_dir_i)) { -+ if (S_ISDIR(fst_inode->i_mode) && !S_ISDIR(snd_inode->i_mode)) { -+ inc_nlink(new_dir_i); -+ drop_nlink(old_dir_i); -+ } -+ else if (!S_ISDIR(fst_inode->i_mode) && S_ISDIR(snd_inode->i_mode)) { -+ drop_nlink(new_dir_i); -+ inc_nlink(old_dir_i); -+ } -+ } -+ - /* The VFS will check for us and prevent trying to rename a - * file over a directory and vice versa, but if it's a directory, - * the VFS can't check whether the victim is empty. The filesystem - * needs to do that for itself. - */ -- if (d_really_is_positive(new_dentry)) { -+ if (d_really_is_positive(new_dentry) && !(flags & RENAME_EXCHANGE)) { - victim_f = JFFS2_INODE_INFO(d_inode(new_dentry)); - if (d_is_dir(new_dentry)) { - struct jffs2_full_dirent *fd; -@@ -833,7 +846,7 @@ static int jffs2_rename (struct user_nam - if (ret) - return ret; - -- if (victim_f) { -+ if (victim_f && !(flags & RENAME_EXCHANGE)) { - /* There was a victim. Kill it off nicely */ - if (d_is_dir(new_dentry)) - clear_nlink(d_inode(new_dentry)); -@@ -859,6 +872,12 @@ static int jffs2_rename (struct user_nam - if (flags & RENAME_WHITEOUT) - /* Replace with whiteout */ - ret = jffs2_whiteout(mnt_userns, old_dir_i, old_dentry); -+ else if (flags & RENAME_EXCHANGE) -+ /* Replace the original */ -+ ret = jffs2_do_link(c, JFFS2_INODE_INFO(old_dir_i), -+ d_inode(new_dentry)->i_ino, type, -+ old_dentry->d_name.name, old_dentry->d_name.len, -+ now); - else - /* Unlink the original */ - ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i), -@@ -890,7 +909,7 @@ static int jffs2_rename (struct user_nam - return ret; - } - -- if (d_is_dir(old_dentry)) -+ if (d_is_dir(old_dentry) && !(flags & RENAME_EXCHANGE)) - drop_nlink(old_dir_i); - - new_dir_i->i_mtime = new_dir_i->i_ctime = old_dir_i->i_mtime = old_dir_i->i_ctime = ITIME(now); diff --git a/target/linux/generic/pending-5.19/142-jffs2-add-splice-ops.patch b/target/linux/generic/pending-5.19/142-jffs2-add-splice-ops.patch deleted file mode 100644 index de847a1f5..000000000 --- a/target/linux/generic/pending-5.19/142-jffs2-add-splice-ops.patch +++ /dev/null @@ -1,20 +0,0 @@ -From: Felix Fietkau -Subject: jffs2: add splice ops - -Add splice_read using generic_file_splice_read. -Add splice_write using iter_file_splice_write - -Signed-off-by: Felix Fietkau ---- - ---- a/fs/jffs2/file.c -+++ b/fs/jffs2/file.c -@@ -53,6 +53,8 @@ const struct file_operations jffs2_file_ - .open = generic_file_open, - .read_iter = generic_file_read_iter, - .write_iter = generic_file_write_iter, -+ .splice_read = generic_file_splice_read, -+ .splice_write = iter_file_splice_write, - .unlocked_ioctl=jffs2_ioctl, - .mmap = generic_file_readonly_mmap, - .fsync = jffs2_fsync, diff --git a/target/linux/generic/pending-5.19/150-bridge_allow_receiption_on_disabled_port.patch b/target/linux/generic/pending-5.19/150-bridge_allow_receiption_on_disabled_port.patch deleted file mode 100644 index 93a2d146b..000000000 --- a/target/linux/generic/pending-5.19/150-bridge_allow_receiption_on_disabled_port.patch +++ /dev/null @@ -1,45 +0,0 @@ -From: Stephen Hemminger -Subject: bridge: allow receiption on disabled port - -When an ethernet device is enslaved to a bridge, and the bridge STP -detects loss of carrier (or operational state down), then normally -packet receiption is blocked. - -This breaks control applications like WPA which maybe expecting to -receive packets to negotiate to bring link up. The bridge needs to -block forwarding packets from these disabled ports, but there is no -hard requirement to not allow local packet delivery. - -Signed-off-by: Stephen Hemminger -Signed-off-by: Felix Fietkau - ---- a/net/bridge/br_input.c -+++ b/net/bridge/br_input.c -@@ -222,6 +222,9 @@ static void __br_handle_local_finish(str - /* note: already called with rcu_read_lock */ - static int br_handle_local_finish(struct net *net, struct sock *sk, struct sk_buff *skb) - { -+ struct net_bridge_port *p = br_port_get_rcu(skb->dev); -+ -+ if (p->state != BR_STATE_DISABLED) - __br_handle_local_finish(skb); - - /* return 1 to signal the okfn() was called so it's ok to use the skb */ -@@ -390,6 +393,17 @@ forward: - goto defer_stp_filtering; - - switch (p->state) { -+ case BR_STATE_DISABLED: -+ if (ether_addr_equal(p->br->dev->dev_addr, dest)) -+ skb->pkt_type = PACKET_HOST; -+ -+ if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_PRE_ROUTING, -+ dev_net(skb->dev), NULL, skb, skb->dev, NULL, -+ br_handle_local_finish) == 1) { -+ return RX_HANDLER_PASS; -+ } -+ break; -+ - case BR_STATE_FORWARDING: - case BR_STATE_LEARNING: - defer_stp_filtering: diff --git a/target/linux/generic/pending-5.19/190-rtc-rs5c372-support_alarms_up_to_1_week.patch b/target/linux/generic/pending-5.19/190-rtc-rs5c372-support_alarms_up_to_1_week.patch deleted file mode 100644 index 2f5c2228c..000000000 --- a/target/linux/generic/pending-5.19/190-rtc-rs5c372-support_alarms_up_to_1_week.patch +++ /dev/null @@ -1,94 +0,0 @@ -From: Daniel González Cabanelas -Subject: [PATCH 1/2] rtc: rs5c372: support alarms up to 1 week - -The Ricoh R2221x, R2223x, RS5C372, RV5C387A chips can handle 1 week -alarms. - -Read the "wday" alarm register and convert it to a date to support up 1 -week in our driver. - -Signed-off-by: Daniel González Cabanelas ---- - drivers/rtc/rtc-rs5c372.c | 48 ++++++++++++++++++++++++++++++++++----- - 1 file changed, 42 insertions(+), 6 deletions(-) - ---- a/drivers/rtc/rtc-rs5c372.c -+++ b/drivers/rtc/rtc-rs5c372.c -@@ -399,7 +399,9 @@ static int rs5c_read_alarm(struct device - { - struct i2c_client *client = to_i2c_client(dev); - struct rs5c372 *rs5c = i2c_get_clientdata(client); -- int status; -+ int status, wday_offs; -+ struct rtc_time rtc; -+ unsigned long alarm_secs; - - status = rs5c_get_regs(rs5c); - if (status < 0) -@@ -409,6 +411,30 @@ static int rs5c_read_alarm(struct device - t->time.tm_sec = 0; - t->time.tm_min = bcd2bin(rs5c->regs[RS5C_REG_ALARM_A_MIN] & 0x7f); - t->time.tm_hour = rs5c_reg2hr(rs5c, rs5c->regs[RS5C_REG_ALARM_A_HOURS]); -+ t->time.tm_wday = ffs(rs5c->regs[RS5C_REG_ALARM_A_WDAY] & 0x7f) - 1; -+ -+ /* determine the day, month and year based on alarm wday, taking as a -+ * reference the current time from the rtc -+ */ -+ status = rs5c372_rtc_read_time(dev, &rtc); -+ if (status < 0) -+ return status; -+ -+ wday_offs = t->time.tm_wday - rtc.tm_wday; -+ alarm_secs = mktime64(rtc.tm_year + 1900, -+ rtc.tm_mon + 1, -+ rtc.tm_mday + wday_offs, -+ t->time.tm_hour, -+ t->time.tm_min, -+ t->time.tm_sec); -+ -+ if (wday_offs < 0 || (wday_offs == 0 && -+ (t->time.tm_hour < rtc.tm_hour || -+ (t->time.tm_hour == rtc.tm_hour && -+ t->time.tm_min <= rtc.tm_min)))) -+ alarm_secs += 7 * 86400; -+ -+ rtc_time64_to_tm(alarm_secs, &t->time); - - /* ... and status */ - t->enabled = !!(rs5c->regs[RS5C_REG_CTRL1] & RS5C_CTRL1_AALE); -@@ -423,12 +449,20 @@ static int rs5c_set_alarm(struct device - struct rs5c372 *rs5c = i2c_get_clientdata(client); - int status, addr, i; - unsigned char buf[3]; -+ struct rtc_time rtc_tm; -+ unsigned long rtc_secs, alarm_secs; - -- /* only handle up to 24 hours in the future, like RTC_ALM_SET */ -- if (t->time.tm_mday != -1 -- || t->time.tm_mon != -1 -- || t->time.tm_year != -1) -+ /* chip only can handle alarms up to one week in the future*/ -+ status = rs5c372_rtc_read_time(dev, &rtc_tm); -+ if (status) -+ return status; -+ rtc_secs = rtc_tm_to_time64(&rtc_tm); -+ alarm_secs = rtc_tm_to_time64(&t->time); -+ if (alarm_secs >= rtc_secs + 7 * 86400) { -+ dev_err(dev, "%s: alarm maximum is one week in the future (%d)\n", -+ __func__, status); - return -EINVAL; -+ } - - /* REVISIT: round up tm_sec */ - -@@ -449,7 +483,9 @@ static int rs5c_set_alarm(struct device - /* set alarm */ - buf[0] = bin2bcd(t->time.tm_min); - buf[1] = rs5c_hr2reg(rs5c, t->time.tm_hour); -- buf[2] = 0x7f; /* any/all days */ -+ /* each bit is the day of the week, 0x7f means all days */ -+ buf[2] = (t->time.tm_wday >= 0 && t->time.tm_wday < 7) ? -+ BIT(t->time.tm_wday) : 0x7f; - - for (i = 0; i < sizeof(buf); i++) { - addr = RS5C_ADDR(RS5C_REG_ALARM_A_MIN + i); diff --git a/target/linux/generic/pending-5.19/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch b/target/linux/generic/pending-5.19/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch deleted file mode 100644 index 0ed070bc5..000000000 --- a/target/linux/generic/pending-5.19/191-rtc-rs5c372-let_the_alarm_to_be_used_as_wakeup_source.patch +++ /dev/null @@ -1,70 +0,0 @@ -From: Daniel González Cabanelas -Subject: [PATCH 2/2] rtc: rs5c372: let the alarm to be used as wakeup source - -Currently there is no use for the interrupts on the rs5c372 RTC and the -wakealarm isn't enabled. There are some devices like NASes which use this -RTC to wake up from the power off state when the INTR pin is activated by -the alarm clock. - -Enable the alarm and let to be used as a wakeup source. - -Tested on a Buffalo LS421DE NAS. - -Signed-off-by: Daniel González Cabanelas ---- - drivers/rtc/rtc-rs5c372.c | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - ---- a/drivers/rtc/rtc-rs5c372.c -+++ b/drivers/rtc/rtc-rs5c372.c -@@ -833,6 +833,7 @@ static int rs5c372_probe(struct i2c_clie - int err = 0; - int smbus_mode = 0; - struct rs5c372 *rs5c372; -+ bool rs5c372_can_wakeup_device = false; - - dev_dbg(&client->dev, "%s\n", __func__); - -@@ -868,6 +869,12 @@ static int rs5c372_probe(struct i2c_clie - else - rs5c372->type = id->driver_data; - -+#ifdef CONFIG_OF -+ if(of_property_read_bool(client->dev.of_node, -+ "wakeup-source")) -+ rs5c372_can_wakeup_device = true; -+#endif -+ - /* we read registers 0x0f then 0x00-0x0f; skip the first one */ - rs5c372->regs = &rs5c372->buf[1]; - rs5c372->smbus = smbus_mode; -@@ -901,6 +908,8 @@ static int rs5c372_probe(struct i2c_clie - goto exit; - } - -+ rs5c372->has_irq = 1; -+ - /* if the oscillator lost power and no other software (like - * the bootloader) set it up, do it here. - * -@@ -927,6 +936,10 @@ static int rs5c372_probe(struct i2c_clie - ); - - /* REVISIT use client->irq to register alarm irq ... */ -+ if (rs5c372_can_wakeup_device) { -+ device_init_wakeup(&client->dev, true); -+ } -+ - rs5c372->rtc = devm_rtc_device_register(&client->dev, - rs5c372_driver.driver.name, - &rs5c372_rtc_ops, THIS_MODULE); -@@ -940,6 +953,9 @@ static int rs5c372_probe(struct i2c_clie - if (err) - goto exit; - -+ /* the rs5c372 alarm only supports a minute accuracy */ -+ -+ - return 0; - - exit: diff --git a/target/linux/generic/pending-5.19/201-extra_optimization.patch b/target/linux/generic/pending-5.19/201-extra_optimization.patch deleted file mode 100644 index acf6a2684..000000000 --- a/target/linux/generic/pending-5.19/201-extra_optimization.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Felix Fietkau -Subject: Upgrade to Linux 2.6.19 - -- Includes large parts of the patch from #1021 by dpalffy -- Includes RB532 NAND driver changes by n0-1 - -[john@phrozen.org: feix will add this to his upstream queue] - -lede-commit: bff468813f78f81e36ebb2a3f4354de7365e640f -Signed-off-by: Felix Fietkau ---- - Makefile | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/Makefile -+++ b/Makefile -@@ -758,7 +758,7 @@ KBUILD_CFLAGS += -O2 - else ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3 - KBUILD_CFLAGS += -O3 - else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE --KBUILD_CFLAGS += -Os -+KBUILD_CFLAGS += -Os -fno-reorder-blocks -fno-tree-ch - endif - - # Tell gcc to never replace conditional load with a non-conditional one diff --git a/target/linux/generic/pending-5.19/203-kallsyms_uncompressed.patch b/target/linux/generic/pending-5.19/203-kallsyms_uncompressed.patch deleted file mode 100644 index 508fa4d8a..000000000 --- a/target/linux/generic/pending-5.19/203-kallsyms_uncompressed.patch +++ /dev/null @@ -1,119 +0,0 @@ -From: Felix Fietkau -Subject: kernel: add a config option for keeping the kallsyms table uncompressed, saving ~9kb kernel size after lzma on ar71xx - -[john@phrozen.org: added to my upstream queue 30.12.2016] -lede-commit: e0e3509b5ce2ccf93d4d67ea907613f5f7ec2eed -Signed-off-by: Felix Fietkau ---- - init/Kconfig | 11 +++++++++++ - kernel/kallsyms.c | 8 ++++++++ - scripts/kallsyms.c | 12 ++++++++++++ - scripts/link-vmlinux.sh | 4 ++++ - 4 files changed, 35 insertions(+) - ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -1465,6 +1465,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW - the unaligned access emulation. - see arch/parisc/kernel/unaligned.c for reference - -+config KALLSYMS_UNCOMPRESSED -+ bool "Keep kallsyms uncompressed" -+ depends on KALLSYMS -+ help -+ Normally kallsyms contains compressed symbols (using a token table), -+ reducing the uncompressed kernel image size. Keeping the symbol table -+ uncompressed significantly improves the size of this part in compressed -+ kernel images. -+ -+ Say N unless you need compressed kernel images to be small. -+ - config HAVE_PCSPKR_PLATFORM - bool - ---- a/kernel/kallsyms.c -+++ b/kernel/kallsyms.c -@@ -81,6 +81,11 @@ static unsigned int kallsyms_expand_symb - * For every byte on the compressed symbol data, copy the table - * entry for that byte. - */ -+#ifdef CONFIG_KALLSYMS_UNCOMPRESSED -+ memcpy(result, data + 1, len - 1); -+ result += len - 1; -+ len = 0; -+#endif - while (len) { - tptr = &kallsyms_token_table[kallsyms_token_index[*data]]; - data++; -@@ -113,6 +118,9 @@ tail: - */ - static char kallsyms_get_symbol_type(unsigned int off) - { -+#ifdef CONFIG_KALLSYMS_UNCOMPRESSED -+ return kallsyms_names[off + 1]; -+#endif - /* - * Get just the first code, look it up in the token table, - * and return the first char from this token. ---- a/scripts/kallsyms.c -+++ b/scripts/kallsyms.c -@@ -58,6 +58,7 @@ static struct addr_range percpu_range = - static struct sym_entry **table; - static unsigned int table_size, table_cnt; - static int all_symbols; -+static int uncompressed; - static int absolute_percpu; - static int base_relative; - -@@ -487,6 +488,9 @@ static void write_src(void) - - free(markers); - -+ if (uncompressed) -+ return; -+ - output_label("kallsyms_token_table"); - off = 0; - for (i = 0; i < 256; i++) { -@@ -538,6 +542,9 @@ static unsigned char *find_token(unsigne - { - int i; - -+ if (uncompressed) -+ return NULL; -+ - for (i = 0; i < len - 1; i++) { - if (str[i] == token[0] && str[i+1] == token[1]) - return &str[i]; -@@ -610,6 +617,9 @@ static void optimize_result(void) - { - int i, best; - -+ if (uncompressed) -+ return; -+ - /* using the '\0' symbol last allows compress_symbols to use standard - * fast string functions */ - for (i = 255; i >= 0; i--) { -@@ -774,6 +784,8 @@ int main(int argc, char **argv) - absolute_percpu = 1; - else if (strcmp(argv[i], "--base-relative") == 0) - base_relative = 1; -+ else if (strcmp(argv[i], "--uncompressed") == 0) -+ uncompressed = 1; - else - usage(); - } ---- a/scripts/link-vmlinux.sh -+++ b/scripts/link-vmlinux.sh -@@ -156,6 +156,10 @@ kallsyms() - kallsymopt="${kallsymopt} --base-relative" - fi - -+ if [ -n "${CONFIG_KALLSYMS_UNCOMPRESSED}" ]; then -+ kallsymopt="${kallsymopt} --uncompressed" -+ fi -+ - info KSYMS ${2} - ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2} - } diff --git a/target/linux/generic/pending-5.19/205-backtrace_module_info.patch b/target/linux/generic/pending-5.19/205-backtrace_module_info.patch deleted file mode 100644 index 5f4f6e493..000000000 --- a/target/linux/generic/pending-5.19/205-backtrace_module_info.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Felix Fietkau -Subject: kernel: when KALLSYMS is disabled, print module address + size for matching backtrace entries - -[john@phrozen.org: felix will add this to his upstream queue] - -lede-commit 53827cdc824556cda910b23ce5030c363b8f1461 -Signed-off-by: Felix Fietkau ---- - lib/vsprintf.c | 15 +++++++++++---- - 1 file changed, 11 insertions(+), 4 deletions(-) - ---- a/lib/vsprintf.c -+++ b/lib/vsprintf.c -@@ -980,8 +980,10 @@ char *symbol_string(char *buf, char *end - struct printf_spec spec, const char *fmt) - { - unsigned long value; --#ifdef CONFIG_KALLSYMS - char sym[KSYM_SYMBOL_LEN]; -+#ifndef CONFIG_KALLSYMS -+ struct module *mod; -+ int len; - #endif - - if (fmt[1] == 'R') -@@ -1002,8 +1004,14 @@ char *symbol_string(char *buf, char *end - - return string_nocheck(buf, end, sym, spec); - #else -- return special_hex_number(buf, end, value, sizeof(void *)); -+ len = snprintf(sym, sizeof(sym), "0x%lx", value); -+ mod = __module_address(value); -+ if (mod) -+ snprintf(sym + len, sizeof(sym) - len, " [%s@%p+0x%x]", -+ mod->name, mod->core_layout.base, -+ mod->core_layout.size); - #endif -+ return string(buf, end, sym, spec); - } - - static const struct printf_spec default_str_spec = { diff --git a/target/linux/generic/pending-5.19/240-remove-unsane-filenames-from-deps_initramfs-list.patch b/target/linux/generic/pending-5.19/240-remove-unsane-filenames-from-deps_initramfs-list.patch deleted file mode 100644 index 9e78284ec..000000000 --- a/target/linux/generic/pending-5.19/240-remove-unsane-filenames-from-deps_initramfs-list.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Gabor Juhos -Subject: usr: sanitize deps_initramfs list - -If any filename in the intramfs dependency -list contains a colon, that causes a kernel -build error like this: - -/devel/openwrt/build_dir/linux-ar71xx_generic/linux-3.6.6/usr/Makefile:58: *** multiple target patterns. Stop. -make[5]: *** [usr] Error 2 - -Fix it by removing such filenames from the -deps_initramfs list. - -Signed-off-by: Gabor Juhos -Signed-off-by: Felix Fietkau ---- - usr/Makefile | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - ---- a/usr/Makefile -+++ b/usr/Makefile -@@ -56,6 +56,8 @@ hostprogs := gen_init_cpio - # The dependency list is generated by gen_initramfs.sh -l - -include $(obj)/.initramfs_data.cpio.d - -+deps_initramfs := $(foreach v,$(deps_initramfs),$(if $(findstring :,$(v)),,$(v))) -+ - # do not try to update files included in initramfs - $(deps_initramfs): ; - diff --git a/target/linux/generic/pending-5.19/261-enable_wilink_platform_without_drivers.patch b/target/linux/generic/pending-5.19/261-enable_wilink_platform_without_drivers.patch deleted file mode 100644 index cd31f9d93..000000000 --- a/target/linux/generic/pending-5.19/261-enable_wilink_platform_without_drivers.patch +++ /dev/null @@ -1,20 +0,0 @@ -From: Imre Kaloz -Subject: [PATCH] hack: net: wireless: make the wl12xx glue code available with - compat-wireless, too - -Signed-off-by: Imre Kaloz ---- - drivers/net/wireless/ti/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ti/Kconfig -+++ b/drivers/net/wireless/ti/Kconfig -@@ -20,7 +20,7 @@ source "drivers/net/wireless/ti/wlcore/K - - config WILINK_PLATFORM_DATA - bool "TI WiLink platform data" -- depends on WLCORE_SDIO || WL1251_SDIO -+ depends on WLCORE_SDIO || WL1251_SDIO || ARCH_OMAP2PLUS - default y - help - Small platform data bit needed to pass data to the sdio modules. diff --git a/target/linux/generic/pending-5.19/270-platform-mikrotik-build-bits.patch b/target/linux/generic/pending-5.19/270-platform-mikrotik-build-bits.patch deleted file mode 100644 index 31f86f4aa..000000000 --- a/target/linux/generic/pending-5.19/270-platform-mikrotik-build-bits.patch +++ /dev/null @@ -1,35 +0,0 @@ -From c2deb5ef01a0ef09088832744cbace9e239a6ee0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= -Date: Sat, 28 Mar 2020 12:11:50 +0100 -Subject: [PATCH] generic: platform/mikrotik build bits (5.4) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch adds platform/mikrotik kernel build bits - -Signed-off-by: Thibaut VARÈNE ---- - drivers/platform/Kconfig | 2 ++ - drivers/platform/Makefile | 1 + - 2 files changed, 3 insertions(+) - ---- a/drivers/platform/Kconfig -+++ b/drivers/platform/Kconfig -@@ -12,6 +12,8 @@ source "drivers/platform/chrome/Kconfig" - - source "drivers/platform/mellanox/Kconfig" - -+source "drivers/platform/mikrotik/Kconfig" -+ - source "drivers/platform/olpc/Kconfig" - - source "drivers/platform/surface/Kconfig" ---- a/drivers/platform/Makefile -+++ b/drivers/platform/Makefile -@@ -9,4 +9,5 @@ obj-$(CONFIG_MIPS) += mips/ - obj-$(CONFIG_OLPC_EC) += olpc/ - obj-$(CONFIG_GOLDFISH) += goldfish/ - obj-$(CONFIG_CHROME_PLATFORMS) += chrome/ -+obj-$(CONFIG_MIKROTIK) += mikrotik/ - obj-$(CONFIG_SURFACE_PLATFORMS) += surface/ diff --git a/target/linux/generic/pending-5.19/300-mips_expose_boot_raw.patch b/target/linux/generic/pending-5.19/300-mips_expose_boot_raw.patch deleted file mode 100644 index fd3f21876..000000000 --- a/target/linux/generic/pending-5.19/300-mips_expose_boot_raw.patch +++ /dev/null @@ -1,40 +0,0 @@ -From: Mark Miller -Subject: mips: expose CONFIG_BOOT_RAW - -This exposes the CONFIG_BOOT_RAW symbol in Kconfig. This is needed on -certain Broadcom chipsets running CFE in order to load the kernel. - -Signed-off-by: Mark Miller -Acked-by: Rob Landley ---- ---- a/arch/mips/Kconfig -+++ b/arch/mips/Kconfig -@@ -1041,9 +1041,6 @@ config FW_ARC - config ARCH_MAY_HAVE_PC_FDC - bool - --config BOOT_RAW -- bool -- - config CEVT_BCM1480 - bool - -@@ -3113,6 +3110,18 @@ choice - bool "Extend builtin kernel arguments with bootloader arguments" - endchoice - -+config BOOT_RAW -+ bool "Enable the kernel to be executed from the load address" -+ default n -+ help -+ Allow the kernel to be executed from the load address for -+ bootloaders which cannot read the ELF format. This places -+ a jump to start_kernel at the load address. -+ -+ If unsure, say N. -+ -+ -+ - endmenu - - config LOCKDEP_SUPPORT diff --git a/target/linux/generic/pending-5.19/302-mips_no_branch_likely.patch b/target/linux/generic/pending-5.19/302-mips_no_branch_likely.patch deleted file mode 100644 index 542fba651..000000000 --- a/target/linux/generic/pending-5.19/302-mips_no_branch_likely.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: Felix Fietkau -Subject: mips: use -mno-branch-likely for kernel and userspace - -saves ~11k kernel size after lzma and ~12k squashfs size in the - -lede-commit: 41a039f46450ffae9483d6216422098669da2900 -Signed-off-by: Felix Fietkau ---- - arch/mips/Makefile | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/mips/Makefile -+++ b/arch/mips/Makefile -@@ -94,7 +94,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin - # machines may also. Since BFD is incredibly buggy with respect to - # crossformat linking we rely on the elf2ecoff tool for format conversion. - # --cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -+cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely - cflags-y += -msoft-float - LDFLAGS_vmlinux += -G 0 -static -n -nostdlib - KBUILD_AFLAGS_MODULE += -mlong-calls diff --git a/target/linux/generic/pending-5.19/305-mips_module_reloc.patch b/target/linux/generic/pending-5.19/305-mips_module_reloc.patch deleted file mode 100644 index 5ced02871..000000000 --- a/target/linux/generic/pending-5.19/305-mips_module_reloc.patch +++ /dev/null @@ -1,370 +0,0 @@ -From: Felix Fietkau -Subject: mips: replace -mlong-calls with -mno-long-calls to make function calls faster in kernel modules to achieve this, try to - -lede-commit: 3b3d64743ba2a874df9d70cd19e242205b0a788c -Signed-off-by: Felix Fietkau ---- - arch/mips/Makefile | 5 + - arch/mips/include/asm/module.h | 5 + - arch/mips/kernel/module.c | 279 ++++++++++++++++++++++++++++++++++++++++- - 3 files changed, 284 insertions(+), 5 deletions(-) - ---- a/arch/mips/Makefile -+++ b/arch/mips/Makefile -@@ -97,8 +97,18 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin - cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely - cflags-y += -msoft-float - LDFLAGS_vmlinux += -G 0 -static -n -nostdlib -+ifdef CONFIG_64BIT - KBUILD_AFLAGS_MODULE += -mlong-calls - KBUILD_CFLAGS_MODULE += -mlong-calls -+else -+ ifdef CONFIG_DYNAMIC_FTRACE -+ KBUILD_AFLAGS_MODULE += -mlong-calls -+ KBUILD_CFLAGS_MODULE += -mlong-calls -+ else -+ KBUILD_AFLAGS_MODULE += -mno-long-calls -+ KBUILD_CFLAGS_MODULE += -mno-long-calls -+ endif -+endif - - ifeq ($(CONFIG_RELOCATABLE),y) - LDFLAGS_vmlinux += --emit-relocs ---- a/arch/mips/include/asm/module.h -+++ b/arch/mips/include/asm/module.h -@@ -12,6 +12,11 @@ struct mod_arch_specific { - const struct exception_table_entry *dbe_start; - const struct exception_table_entry *dbe_end; - struct mips_hi16 *r_mips_hi16_list; -+ -+ void *phys_plt_tbl; -+ void *virt_plt_tbl; -+ unsigned int phys_plt_offset; -+ unsigned int virt_plt_offset; - }; - - typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ ---- a/arch/mips/kernel/module.c -+++ b/arch/mips/kernel/module.c -@@ -31,23 +31,261 @@ struct mips_hi16 { - static LIST_HEAD(dbe_list); - static DEFINE_SPINLOCK(dbe_lock); - --#ifdef MODULE_START -+/* -+ * Get the potential max trampolines size required of the init and -+ * non-init sections. Only used if we cannot find enough contiguous -+ * physically mapped memory to put the module into. -+ */ -+static unsigned int -+get_plt_size(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, -+ const char *secstrings, unsigned int symindex, bool is_init) -+{ -+ unsigned long ret = 0; -+ unsigned int i, j; -+ Elf_Sym *syms; -+ -+ /* Everything marked ALLOC (this includes the exported symbols) */ -+ for (i = 1; i < hdr->e_shnum; ++i) { -+ unsigned int info = sechdrs[i].sh_info; -+ -+ if (sechdrs[i].sh_type != SHT_REL -+ && sechdrs[i].sh_type != SHT_RELA) -+ continue; -+ -+ /* Not a valid relocation section? */ -+ if (info >= hdr->e_shnum) -+ continue; -+ -+ /* Don't bother with non-allocated sections */ -+ if (!(sechdrs[info].sh_flags & SHF_ALLOC)) -+ continue; -+ -+ /* If it's called *.init*, and we're not init, we're -+ not interested */ -+ if ((strstr(secstrings + sechdrs[i].sh_name, ".init") != 0) -+ != is_init) -+ continue; -+ -+ syms = (Elf_Sym *) sechdrs[symindex].sh_addr; -+ if (sechdrs[i].sh_type == SHT_REL) { -+ Elf_Mips_Rel *rel = (void *) sechdrs[i].sh_addr; -+ unsigned int size = sechdrs[i].sh_size / sizeof(*rel); -+ -+ for (j = 0; j < size; ++j) { -+ Elf_Sym *sym; -+ -+ if (ELF_MIPS_R_TYPE(rel[j]) != R_MIPS_26) -+ continue; -+ -+ sym = syms + ELF_MIPS_R_SYM(rel[j]); -+ if (!is_init && sym->st_shndx != SHN_UNDEF) -+ continue; -+ -+ ret += 4 * sizeof(int); -+ } -+ } else { -+ Elf_Mips_Rela *rela = (void *) sechdrs[i].sh_addr; -+ unsigned int size = sechdrs[i].sh_size / sizeof(*rela); -+ -+ for (j = 0; j < size; ++j) { -+ Elf_Sym *sym; -+ -+ if (ELF_MIPS_R_TYPE(rela[j]) != R_MIPS_26) -+ continue; -+ -+ sym = syms + ELF_MIPS_R_SYM(rela[j]); -+ if (!is_init && sym->st_shndx != SHN_UNDEF) -+ continue; -+ -+ ret += 4 * sizeof(int); -+ } -+ } -+ } -+ -+ return ret; -+} -+ -+#ifndef MODULE_START -+static void *alloc_phys(unsigned long size) -+{ -+ unsigned order; -+ struct page *page; -+ struct page *p; -+ -+ size = PAGE_ALIGN(size); -+ order = get_order(size); -+ -+ page = alloc_pages(GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN | -+ __GFP_THISNODE, order); -+ if (!page) -+ return NULL; -+ -+ split_page(page, order); -+ -+ /* mark all pages except for the last one */ -+ for (p = page; p + 1 < page + (size >> PAGE_SHIFT); ++p) -+ set_bit(PG_owner_priv_1, &p->flags); -+ -+ for (p = page + (size >> PAGE_SHIFT); p < page + (1 << order); ++p) -+ __free_page(p); -+ -+ return page_address(page); -+} -+#endif -+ -+static void free_phys(void *ptr) -+{ -+ struct page *page; -+ bool free; -+ -+ page = virt_to_page(ptr); -+ do { -+ free = test_and_clear_bit(PG_owner_priv_1, &page->flags); -+ __free_page(page); -+ page++; -+ } while (free); -+} -+ - void *module_alloc(unsigned long size) - { -+#ifdef MODULE_START - return __vmalloc_node_range(size, 1, MODULE_START, MODULE_END, - GFP_KERNEL, PAGE_KERNEL, 0, NUMA_NO_NODE, - __builtin_return_address(0)); -+#else -+ void *ptr; -+ -+ if (size == 0) -+ return NULL; -+ -+ ptr = alloc_phys(size); -+ -+ /* If we failed to allocate physically contiguous memory, -+ * fall back to regular vmalloc. The module loader code will -+ * create jump tables to handle long jumps */ -+ if (!ptr) -+ return vmalloc(size); -+ -+ return ptr; -+#endif - } -+ -+static inline bool is_phys_addr(void *ptr) -+{ -+#ifdef CONFIG_64BIT -+ return (KSEGX((unsigned long)ptr) == CKSEG0); -+#else -+ return (KSEGX(ptr) == KSEG0); - #endif -+} -+ -+/* Free memory returned from module_alloc */ -+void module_memfree(void *module_region) -+{ -+ if (is_phys_addr(module_region)) -+ free_phys(module_region); -+ else -+ vfree(module_region); -+} -+ -+static void *__module_alloc(int size, bool phys) -+{ -+ void *ptr; -+ -+ if (phys) -+ ptr = kmalloc(size, GFP_KERNEL); -+ else -+ ptr = vmalloc(size); -+ return ptr; -+} -+ -+static void __module_free(void *ptr) -+{ -+ if (is_phys_addr(ptr)) -+ kfree(ptr); -+ else -+ vfree(ptr); -+} -+ -+int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, -+ char *secstrings, struct module *mod) -+{ -+ unsigned int symindex = 0; -+ unsigned int core_size, init_size; -+ int i; -+ -+ mod->arch.phys_plt_offset = 0; -+ mod->arch.virt_plt_offset = 0; -+ mod->arch.phys_plt_tbl = NULL; -+ mod->arch.virt_plt_tbl = NULL; -+ -+ if (IS_ENABLED(CONFIG_64BIT)) -+ return 0; -+ -+ for (i = 1; i < hdr->e_shnum; i++) -+ if (sechdrs[i].sh_type == SHT_SYMTAB) -+ symindex = i; -+ -+ core_size = get_plt_size(hdr, sechdrs, secstrings, symindex, false); -+ init_size = get_plt_size(hdr, sechdrs, secstrings, symindex, true); -+ -+ if ((core_size + init_size) == 0) -+ return 0; -+ -+ mod->arch.phys_plt_tbl = __module_alloc(core_size + init_size, 1); -+ if (!mod->arch.phys_plt_tbl) -+ return -ENOMEM; -+ -+ mod->arch.virt_plt_tbl = __module_alloc(core_size + init_size, 0); -+ if (!mod->arch.virt_plt_tbl) { -+ __module_free(mod->arch.phys_plt_tbl); -+ mod->arch.phys_plt_tbl = NULL; -+ return -ENOMEM; -+ } -+ -+ return 0; -+} - - static void apply_r_mips_32(u32 *location, u32 base, Elf_Addr v) - { - *location = base + v; - } - -+static Elf_Addr add_plt_entry_to(unsigned *plt_offset, -+ void *start, Elf_Addr v) -+{ -+ unsigned *tramp = start + *plt_offset; -+ *plt_offset += 4 * sizeof(int); -+ -+ /* adjust carry for addiu */ -+ if (v & 0x00008000) -+ v += 0x10000; -+ -+ tramp[0] = 0x3c190000 | (v >> 16); /* lui t9, hi16 */ -+ tramp[1] = 0x27390000 | (v & 0xffff); /* addiu t9, t9, lo16 */ -+ tramp[2] = 0x03200008; /* jr t9 */ -+ tramp[3] = 0x00000000; /* nop */ -+ -+ return (Elf_Addr) tramp; -+} -+ -+static Elf_Addr add_plt_entry(struct module *me, void *location, Elf_Addr v) -+{ -+ if (is_phys_addr(location)) -+ return add_plt_entry_to(&me->arch.phys_plt_offset, -+ me->arch.phys_plt_tbl, v); -+ else -+ return add_plt_entry_to(&me->arch.virt_plt_offset, -+ me->arch.virt_plt_tbl, v); -+ -+} -+ -+ - static int apply_r_mips_26(struct module *me, u32 *location, u32 base, - Elf_Addr v) - { -+ u32 ofs = base & 0x03ffffff; -+ - if (v % 4) { - pr_err("module %s: dangerous R_MIPS_26 relocation\n", - me->name); -@@ -55,13 +293,17 @@ static int apply_r_mips_26(struct module - } - - if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) { -- pr_err("module %s: relocation overflow\n", -- me->name); -- return -ENOEXEC; -+ v = add_plt_entry(me, location, v + (ofs << 2)); -+ if (!v) { -+ pr_err("module %s: relocation overflow\n", -+ me->name); -+ return -ENOEXEC; -+ } -+ ofs = 0; - } - - *location = (*location & ~0x03ffffff) | -- ((base + (v >> 2)) & 0x03ffffff); -+ ((ofs + (v >> 2)) & 0x03ffffff); - - return 0; - } -@@ -441,9 +683,36 @@ int module_finalize(const Elf_Ehdr *hdr, - list_add(&me->arch.dbe_list, &dbe_list); - spin_unlock_irq(&dbe_lock); - } -+ -+ /* Get rid of the fixup trampoline if we're running the module -+ * from physically mapped address space */ -+ if (me->arch.phys_plt_offset == 0) { -+ __module_free(me->arch.phys_plt_tbl); -+ me->arch.phys_plt_tbl = NULL; -+ } -+ if (me->arch.virt_plt_offset == 0) { -+ __module_free(me->arch.virt_plt_tbl); -+ me->arch.virt_plt_tbl = NULL; -+ } -+ - return 0; - } - -+void module_arch_freeing_init(struct module *mod) -+{ -+ if (mod->state == MODULE_STATE_LIVE) -+ return; -+ -+ if (mod->arch.phys_plt_tbl) { -+ __module_free(mod->arch.phys_plt_tbl); -+ mod->arch.phys_plt_tbl = NULL; -+ } -+ if (mod->arch.virt_plt_tbl) { -+ __module_free(mod->arch.virt_plt_tbl); -+ mod->arch.virt_plt_tbl = NULL; -+ } -+} -+ - void module_arch_cleanup(struct module *mod) - { - spin_lock_irq(&dbe_lock); diff --git a/target/linux/generic/pending-5.19/307-mips_highmem_offset.patch b/target/linux/generic/pending-5.19/307-mips_highmem_offset.patch deleted file mode 100644 index 0529b0c5c..000000000 --- a/target/linux/generic/pending-5.19/307-mips_highmem_offset.patch +++ /dev/null @@ -1,19 +0,0 @@ -From: Felix Fietkau -Subject: kernel: adjust mips highmem offset to avoid the need for -mlong-calls on systems with >256M RAM - -Signed-off-by: Felix Fietkau ---- - arch/mips/include/asm/mach-generic/spaces.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/mips/include/asm/mach-generic/spaces.h -+++ b/arch/mips/include/asm/mach-generic/spaces.h -@@ -46,7 +46,7 @@ - * Memory above this physical address will be considered highmem. - */ - #ifndef HIGHMEM_START --#define HIGHMEM_START _AC(0x20000000, UL) -+#define HIGHMEM_START _AC(0x10000000, UL) - #endif - - #endif /* CONFIG_32BIT */ diff --git a/target/linux/generic/pending-5.19/308-mips32r2_tune.patch b/target/linux/generic/pending-5.19/308-mips32r2_tune.patch deleted file mode 100644 index 932d72624..000000000 --- a/target/linux/generic/pending-5.19/308-mips32r2_tune.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: Felix Fietkau -Subject: kernel: add -mtune=34kc to MIPS CFLAGS when building for mips32r2 - -This provides a good tradeoff across at least 24Kc-74Kc, while also -producing smaller code. - -Signed-off-by: Felix Fietkau ---- - arch/mips/Makefile | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/mips/Makefile -+++ b/arch/mips/Makefile -@@ -173,7 +173,7 @@ cflags-$(CONFIG_CPU_VR41XX) += -march=r4 - cflags-$(CONFIG_CPU_R4X00) += -march=r4600 -Wa,--trap - cflags-$(CONFIG_CPU_TX49XX) += -march=r4600 -Wa,--trap - cflags-$(CONFIG_CPU_MIPS32_R1) += -march=mips32 -Wa,--trap --cflags-$(CONFIG_CPU_MIPS32_R2) += -march=mips32r2 -Wa,--trap -+cflags-$(CONFIG_CPU_MIPS32_R2) += -march=mips32r2 -mtune=34kc -Wa,--trap - cflags-$(CONFIG_CPU_MIPS32_R5) += -march=mips32r5 -Wa,--trap -modd-spreg - cflags-$(CONFIG_CPU_MIPS32_R6) += -march=mips32r6 -Wa,--trap -modd-spreg - cflags-$(CONFIG_CPU_MIPS64_R1) += -march=mips64 -Wa,--trap diff --git a/target/linux/generic/pending-5.19/310-arm_module_unresolved_weak_sym.patch b/target/linux/generic/pending-5.19/310-arm_module_unresolved_weak_sym.patch deleted file mode 100644 index 54cc9ba64..000000000 --- a/target/linux/generic/pending-5.19/310-arm_module_unresolved_weak_sym.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: Felix Fietkau -Subject: fix errors in unresolved weak symbols on arm - -lede-commit: 570699d4838a907c3ef9f2819bf19eb72997b32f -Signed-off-by: Felix Fietkau ---- - arch/arm/kernel/module.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/arch/arm/kernel/module.c -+++ b/arch/arm/kernel/module.c -@@ -146,6 +146,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons - return -ENOEXEC; - } - -+ if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) && -+ ELF_ST_BIND(sym->st_info) == STB_WEAK) -+ continue; -+ - loc = dstsec->sh_addr + rel->r_offset; - - switch (ELF32_R_TYPE(rel->r_info)) { diff --git a/target/linux/generic/pending-5.19/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch b/target/linux/generic/pending-5.19/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch deleted file mode 100644 index 8d2a9b144..000000000 --- a/target/linux/generic/pending-5.19/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch +++ /dev/null @@ -1,284 +0,0 @@ -From: Yousong Zhou -Subject: MIPS: kexec: Accept command line parameters from userspace. - -Signed-off-by: Yousong Zhou ---- - arch/mips/kernel/machine_kexec.c | 153 +++++++++++++++++++++++++++++++----- - arch/mips/kernel/machine_kexec.h | 20 +++++ - arch/mips/kernel/relocate_kernel.S | 21 +++-- - 3 files changed, 167 insertions(+), 27 deletions(-) - create mode 100644 arch/mips/kernel/machine_kexec.h - ---- a/arch/mips/kernel/machine_kexec.c -+++ b/arch/mips/kernel/machine_kexec.c -@@ -9,14 +9,11 @@ - #include - #include - -+#include - #include - #include -- --extern const unsigned char relocate_new_kernel[]; --extern const size_t relocate_new_kernel_size; -- --extern unsigned long kexec_start_address; --extern unsigned long kexec_indirection_page; -+#include -+#include "machine_kexec.h" - - static unsigned long reboot_code_buffer; - -@@ -30,6 +27,101 @@ void (*_crash_smp_send_stop)(void) = NUL - void (*_machine_kexec_shutdown)(void) = NULL; - void (*_machine_crash_shutdown)(struct pt_regs *regs) = NULL; - -+static void machine_kexec_print_args(void) -+{ -+ unsigned long argc = (int)kexec_args[0]; -+ int i; -+ -+ pr_info("kexec_args[0] (argc): %lu\n", argc); -+ pr_info("kexec_args[1] (argv): %p\n", (void *)kexec_args[1]); -+ pr_info("kexec_args[2] (env ): %p\n", (void *)kexec_args[2]); -+ pr_info("kexec_args[3] (desc): %p\n", (void *)kexec_args[3]); -+ -+ for (i = 0; i < argc; i++) { -+ pr_info("kexec_argv[%d] = %p, %s\n", -+ i, kexec_argv[i], kexec_argv[i]); -+ } -+} -+ -+static void machine_kexec_init_argv(struct kimage *image) -+{ -+ void __user *buf = NULL; -+ size_t bufsz; -+ size_t size; -+ int i; -+ -+ bufsz = 0; -+ for (i = 0; i < image->nr_segments; i++) { -+ struct kexec_segment *seg; -+ -+ seg = &image->segment[i]; -+ if (seg->bufsz < 6) -+ continue; -+ -+ if (strncmp((char *) seg->buf, "kexec ", 6)) -+ continue; -+ -+ buf = seg->buf; -+ bufsz = seg->bufsz; -+ break; -+ } -+ -+ if (!buf) -+ return; -+ -+ size = KEXEC_COMMAND_LINE_SIZE; -+ size = min(size, bufsz); -+ if (size < bufsz) -+ pr_warn("kexec command line truncated to %zd bytes\n", size); -+ -+ /* Copy to kernel space */ -+ if (copy_from_user(kexec_argv_buf, buf, size)) -+ pr_warn("kexec command line copy to kernel space failed\n"); -+ -+ kexec_argv_buf[size - 1] = 0; -+} -+ -+static void machine_kexec_parse_argv(struct kimage *image) -+{ -+ char *reboot_code_buffer; -+ int reloc_delta; -+ char *ptr; -+ int argc; -+ int i; -+ -+ ptr = kexec_argv_buf; -+ argc = 0; -+ -+ /* -+ * convert command line string to array of parameters -+ * (as bootloader does). -+ */ -+ while (ptr && *ptr && (KEXEC_MAX_ARGC > argc)) { -+ if (*ptr == ' ') { -+ *ptr++ = '\0'; -+ continue; -+ } -+ -+ kexec_argv[argc++] = ptr; -+ ptr = strchr(ptr, ' '); -+ } -+ -+ if (!argc) -+ return; -+ -+ kexec_args[0] = argc; -+ kexec_args[1] = (unsigned long)kexec_argv; -+ kexec_args[2] = 0; -+ kexec_args[3] = 0; -+ -+ reboot_code_buffer = page_address(image->control_code_page); -+ reloc_delta = reboot_code_buffer - (char *)kexec_relocate_new_kernel; -+ -+ kexec_args[1] += reloc_delta; -+ for (i = 0; i < argc; i++) -+ kexec_argv[i] += reloc_delta; -+} -+ - static void kexec_image_info(const struct kimage *kimage) - { - unsigned long i; -@@ -99,6 +191,18 @@ machine_kexec_prepare(struct kimage *kim - #endif - - kexec_image_info(kimage); -+ /* -+ * Whenever arguments passed from kexec-tools, Init the arguments as -+ * the original ones to try avoiding booting failure. -+ */ -+ -+ kexec_args[0] = fw_arg0; -+ kexec_args[1] = fw_arg1; -+ kexec_args[2] = fw_arg2; -+ kexec_args[3] = fw_arg3; -+ -+ machine_kexec_init_argv(kimage); -+ machine_kexec_parse_argv(kimage); - - if (_machine_kexec_prepare) - return _machine_kexec_prepare(kimage); -@@ -161,7 +265,7 @@ machine_crash_shutdown(struct pt_regs *r - void kexec_nonboot_cpu_jump(void) - { - local_flush_icache_range((unsigned long)relocated_kexec_smp_wait, -- reboot_code_buffer + relocate_new_kernel_size); -+ reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE); - - relocated_kexec_smp_wait(NULL); - } -@@ -199,7 +303,7 @@ void kexec_reboot(void) - * machine_kexec() CPU. - */ - local_flush_icache_range(reboot_code_buffer, -- reboot_code_buffer + relocate_new_kernel_size); -+ reboot_code_buffer + KEXEC_RELOCATE_NEW_KERNEL_SIZE); - - do_kexec = (void *)reboot_code_buffer; - do_kexec(); -@@ -212,10 +316,12 @@ machine_kexec(struct kimage *image) - unsigned long *ptr; - - reboot_code_buffer = -- (unsigned long)page_address(image->control_code_page); -+ (unsigned long)page_address(image->control_code_page); -+ pr_info("reboot_code_buffer = %p\n", (void *)reboot_code_buffer); - - kexec_start_address = - (unsigned long) phys_to_virt(image->start); -+ pr_info("kexec_start_address = %p\n", (void *)kexec_start_address); - - if (image->type == KEXEC_TYPE_DEFAULT) { - kexec_indirection_page = -@@ -223,9 +329,19 @@ machine_kexec(struct kimage *image) - } else { - kexec_indirection_page = (unsigned long)&image->head; - } -+ pr_info("kexec_indirection_page = %p\n", (void *)kexec_indirection_page); - -- memcpy((void*)reboot_code_buffer, relocate_new_kernel, -- relocate_new_kernel_size); -+ pr_info("Where is memcpy: %p\n", memcpy); -+ pr_info("kexec_relocate_new_kernel = %p, kexec_relocate_new_kernel_end = %p\n", -+ (void *)kexec_relocate_new_kernel, &kexec_relocate_new_kernel_end); -+ pr_info("Copy %lu bytes from %p to %p\n", KEXEC_RELOCATE_NEW_KERNEL_SIZE, -+ (void *)kexec_relocate_new_kernel, (void *)reboot_code_buffer); -+ memcpy((void*)reboot_code_buffer, kexec_relocate_new_kernel, -+ KEXEC_RELOCATE_NEW_KERNEL_SIZE); -+ -+ pr_info("Before _print_args().\n"); -+ machine_kexec_print_args(); -+ pr_info("Before eval loop.\n"); - - /* - * The generic kexec code builds a page list with physical -@@ -256,7 +372,7 @@ machine_kexec(struct kimage *image) - #ifdef CONFIG_SMP - /* All secondary cpus now may jump to kexec_wait cycle */ - relocated_kexec_smp_wait = reboot_code_buffer + -- (void *)(kexec_smp_wait - relocate_new_kernel); -+ (void *)(kexec_smp_wait - kexec_relocate_new_kernel); - smp_wmb(); - atomic_set(&kexec_ready_to_reboot, 1); - #endif ---- /dev/null -+++ b/arch/mips/kernel/machine_kexec.h -@@ -0,0 +1,20 @@ -+#ifndef _MACHINE_KEXEC_H -+#define _MACHINE_KEXEC_H -+ -+#ifndef __ASSEMBLY__ -+extern const unsigned char kexec_relocate_new_kernel[]; -+extern unsigned long kexec_relocate_new_kernel_end; -+extern unsigned long kexec_start_address; -+extern unsigned long kexec_indirection_page; -+ -+extern char kexec_argv_buf[]; -+extern char *kexec_argv[]; -+ -+#define KEXEC_RELOCATE_NEW_KERNEL_SIZE ((unsigned long)&kexec_relocate_new_kernel_end - (unsigned long)kexec_relocate_new_kernel) -+#endif /* !__ASSEMBLY__ */ -+ -+#define KEXEC_COMMAND_LINE_SIZE 256 -+#define KEXEC_ARGV_SIZE (KEXEC_COMMAND_LINE_SIZE / 16) -+#define KEXEC_MAX_ARGC (KEXEC_ARGV_SIZE / sizeof(long)) -+ -+#endif ---- a/arch/mips/kernel/relocate_kernel.S -+++ b/arch/mips/kernel/relocate_kernel.S -@@ -10,10 +10,12 @@ - #include - #include - #include -+#include "machine_kexec.h" - - #include - --LEAF(relocate_new_kernel) -+LEAF(kexec_relocate_new_kernel) -+ - PTR_L a0, arg0 - PTR_L a1, arg1 - PTR_L a2, arg2 -@@ -98,7 +100,7 @@ done: - #endif - /* jump to kexec_start_address */ - j s1 -- END(relocate_new_kernel) -+ END(kexec_relocate_new_kernel) - - #ifdef CONFIG_SMP - /* -@@ -181,9 +183,15 @@ kexec_indirection_page: - PTR_WD 0 - .size kexec_indirection_page, PTRSIZE - --relocate_new_kernel_end: -+kexec_argv_buf: -+ EXPORT(kexec_argv_buf) -+ .skip KEXEC_COMMAND_LINE_SIZE -+ .size kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE -+ -+kexec_argv: -+ EXPORT(kexec_argv) -+ .skip KEXEC_ARGV_SIZE -+ .size kexec_argv, KEXEC_ARGV_SIZE - --relocate_new_kernel_size: -- EXPORT(relocate_new_kernel_size) -- PTR_WD relocate_new_kernel_end - relocate_new_kernel -- .size relocate_new_kernel_size, PTRSIZE -+kexec_relocate_new_kernel_end: -+ EXPORT(kexec_relocate_new_kernel_end) diff --git a/target/linux/generic/pending-5.19/332-arc-add-OWRTDTB-section.patch b/target/linux/generic/pending-5.19/332-arc-add-OWRTDTB-section.patch deleted file mode 100644 index 30158cf39..000000000 --- a/target/linux/generic/pending-5.19/332-arc-add-OWRTDTB-section.patch +++ /dev/null @@ -1,84 +0,0 @@ -From bb0c3b0175240bf152fd7c644821a0cf9f77c37c Mon Sep 17 00:00:00 2001 -From: Evgeniy Didin -Date: Fri, 15 Mar 2019 18:53:38 +0300 -Subject: [PATCH] arc add OWRTDTB section - -This change allows OpenWRT to patch resulting kernel binary with -external .dtb. - -That allows us to re-use exactky the same vmlinux on different boards -given its ARC core configurations match (at least cache line sizes etc). - -""patch-dtb" searches for ASCII "OWRTDTB:" strign and copies external -.dtb right after it, keeping the string in place. - -Signed-off-by: Eugeniy Paltsev -Signed-off-by: Alexey Brodkin -Signed-off-by: Evgeniy Didin ---- - arch/arc/kernel/head.S | 10 ++++++++++ - arch/arc/kernel/setup.c | 4 +++- - arch/arc/kernel/vmlinux.lds.S | 13 +++++++++++++ - 3 files changed, 26 insertions(+), 1 deletion(-) - ---- a/arch/arc/kernel/head.S -+++ b/arch/arc/kernel/head.S -@@ -88,6 +88,16 @@ - DSP_EARLY_INIT - .endm - -+ ; Here "patch-dtb" will embed external .dtb -+ ; Note "patch-dtb" searches for ASCII "OWRTDTB:" string -+ ; and pastes .dtb right after it, hense the string precedes -+ ; __image_dtb symbol. -+ .section .owrt, "aw",@progbits -+ .ascii "OWRTDTB:" -+ENTRY(__image_dtb) -+ .fill 0x4000 -+END(__image_dtb) -+ - .section .init.text, "ax",@progbits - - ;---------------------------------------------------------------- ---- a/arch/arc/kernel/setup.c -+++ b/arch/arc/kernel/setup.c -@@ -495,6 +495,8 @@ static inline bool uboot_arg_invalid(uns - /* We always pass 0 as magic from U-boot */ - #define UBOOT_MAGIC_VALUE 0 - -+extern struct boot_param_header __image_dtb; -+ - void __init handle_uboot_args(void) - { - bool use_embedded_dtb = true; -@@ -533,7 +535,7 @@ void __init handle_uboot_args(void) - ignore_uboot_args: - - if (use_embedded_dtb) { -- machine_desc = setup_machine_fdt(__dtb_start); -+ machine_desc = setup_machine_fdt(&__image_dtb); - if (!machine_desc) - panic("Embedded DT invalid\n"); - } ---- a/arch/arc/kernel/vmlinux.lds.S -+++ b/arch/arc/kernel/vmlinux.lds.S -@@ -27,6 +27,19 @@ SECTIONS - - . = CONFIG_LINUX_LINK_BASE; - -+ /* -+ * In OpenWRT we want to patch built binary embedding .dtb of choice. -+ * This is implemented with "patch-dtb" utility which searches for -+ * "OWRTDTB:" string in first 16k of image and if it is found -+ * copies .dtb right after mentioned string. -+ * -+ * Note: "OWRTDTB:" won't be overwritten with .dtb, .dtb will follow it. -+ */ -+ .owrt : { -+ *(.owrt) -+ . = ALIGN(PAGE_SIZE); -+ } -+ - _int_vec_base_lds = .; - .vector : { - *(.vector) diff --git a/target/linux/generic/pending-5.19/333-arc-enable-unaligned-access-in-kernel-mode.patch b/target/linux/generic/pending-5.19/333-arc-enable-unaligned-access-in-kernel-mode.patch deleted file mode 100644 index 1848a84cc..000000000 --- a/target/linux/generic/pending-5.19/333-arc-enable-unaligned-access-in-kernel-mode.patch +++ /dev/null @@ -1,24 +0,0 @@ -From: Alexey Brodkin -Subject: arc: enable unaligned access in kernel mode - -This enables misaligned access handling even in kernel mode. -Some wireless drivers (ath9k-htc and mt7601u) use misaligned accesses -here and there and to cope with that without fixing stuff in the drivers -we're just gracefully handling it on ARC. - -Signed-off-by: Alexey Brodkin ---- - arch/arc/kernel/unaligned.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/arc/kernel/unaligned.c -+++ b/arch/arc/kernel/unaligned.c -@@ -202,7 +202,7 @@ int misaligned_fixup(unsigned long addre - char buf[TASK_COMM_LEN]; - - /* handle user mode only and only if enabled by sysadmin */ -- if (!user_mode(regs) || !unaligned_enabled) -+ if (!unaligned_enabled) - return 1; - - if (no_unaligned_warning) { diff --git a/target/linux/generic/pending-5.19/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch b/target/linux/generic/pending-5.19/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch deleted file mode 100644 index 1e598aeb4..000000000 --- a/target/linux/generic/pending-5.19/342-powerpc-Enable-kernel-XZ-compression-option-on-PPC_8.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 66770a004afe10df11d3902e16eaa0c2c39436bb Mon Sep 17 00:00:00 2001 -From: Pawel Dembicki -Date: Fri, 24 May 2019 17:56:19 +0200 -Subject: [PATCH] powerpc: Enable kernel XZ compression option on PPC_85xx - -Enable kernel XZ compression option on PPC_85xx. Tested with -simpleImage on TP-Link TL-WDR4900 (Freescale P1014 processor). - -Suggested-by: Christian Lamparter -Signed-off-by: Pawel Dembicki ---- - arch/powerpc/Kconfig | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/arch/powerpc/Kconfig -+++ b/arch/powerpc/Kconfig -@@ -227,7 +227,7 @@ config PPC - select HAVE_KERNEL_GZIP - select HAVE_KERNEL_LZMA if DEFAULT_UIMAGE - select HAVE_KERNEL_LZO if DEFAULT_UIMAGE -- select HAVE_KERNEL_XZ if PPC_BOOK3S || 44x -+ select HAVE_KERNEL_XZ if PPC_BOOK3S || 44x || PPC_85xx - select HAVE_KPROBES - select HAVE_KPROBES_ON_FTRACE - select HAVE_KRETPROBES diff --git a/target/linux/generic/pending-5.19/400-mtd-mtdsplit-support.patch b/target/linux/generic/pending-5.19/400-mtd-mtdsplit-support.patch deleted file mode 100644 index d24122afc..000000000 --- a/target/linux/generic/pending-5.19/400-mtd-mtdsplit-support.patch +++ /dev/null @@ -1,314 +0,0 @@ ---- a/drivers/mtd/Kconfig -+++ b/drivers/mtd/Kconfig -@@ -12,6 +12,25 @@ menuconfig MTD - - if MTD - -+menu "OpenWrt specific MTD options" -+ -+config MTD_ROOTFS_ROOT_DEV -+ bool "Automatically set 'rootfs' partition to be root filesystem" -+ default y -+ -+config MTD_SPLIT_FIRMWARE -+ bool "Automatically split firmware partition for kernel+rootfs" -+ default y -+ -+config MTD_SPLIT_FIRMWARE_NAME -+ string "Firmware partition name" -+ depends on MTD_SPLIT_FIRMWARE -+ default "firmware" -+ -+source "drivers/mtd/mtdsplit/Kconfig" -+ -+endmenu -+ - config MTD_TESTS - tristate "MTD tests support (DANGEROUS)" - depends on m ---- a/drivers/mtd/mtdpart.c -+++ b/drivers/mtd/mtdpart.c -@@ -15,11 +15,13 @@ - #include - #include - #include -+#include - #include - #include - #include - - #include "mtdcore.h" -+#include "mtdsplit/mtdsplit.h" - - /* - * MTD methods which simply translate the effective address and pass through -@@ -236,6 +238,146 @@ static int mtd_add_partition_attrs(struc - return ret; - } - -+static DEFINE_SPINLOCK(part_parser_lock); -+static LIST_HEAD(part_parsers); -+ -+static struct mtd_part_parser *mtd_part_parser_get(const char *name) -+{ -+ struct mtd_part_parser *p, *ret = NULL; -+ -+ spin_lock(&part_parser_lock); -+ -+ list_for_each_entry(p, &part_parsers, list) -+ if (!strcmp(p->name, name) && try_module_get(p->owner)) { -+ ret = p; -+ break; -+ } -+ -+ spin_unlock(&part_parser_lock); -+ -+ return ret; -+} -+ -+static inline void mtd_part_parser_put(const struct mtd_part_parser *p) -+{ -+ module_put(p->owner); -+} -+ -+static struct mtd_part_parser * -+get_partition_parser_by_type(enum mtd_parser_type type, -+ struct mtd_part_parser *start) -+{ -+ struct mtd_part_parser *p, *ret = NULL; -+ -+ spin_lock(&part_parser_lock); -+ -+ p = list_prepare_entry(start, &part_parsers, list); -+ if (start) -+ mtd_part_parser_put(start); -+ -+ list_for_each_entry_continue(p, &part_parsers, list) { -+ if (p->type == type && try_module_get(p->owner)) { -+ ret = p; -+ break; -+ } -+ } -+ -+ spin_unlock(&part_parser_lock); -+ -+ return ret; -+} -+ -+static int parse_mtd_partitions_by_type(struct mtd_info *master, -+ enum mtd_parser_type type, -+ const struct mtd_partition **pparts, -+ struct mtd_part_parser_data *data) -+{ -+ struct mtd_part_parser *prev = NULL; -+ int ret = 0; -+ -+ while (1) { -+ struct mtd_part_parser *parser; -+ -+ parser = get_partition_parser_by_type(type, prev); -+ if (!parser) -+ break; -+ -+ ret = (*parser->parse_fn)(master, pparts, data); -+ -+ if (ret > 0) { -+ mtd_part_parser_put(parser); -+ printk(KERN_NOTICE -+ "%d %s partitions found on MTD device %s\n", -+ ret, parser->name, master->name); -+ break; -+ } -+ -+ prev = parser; -+ } -+ -+ return ret; -+} -+ -+static int -+run_parsers_by_type(struct mtd_info *child, enum mtd_parser_type type) -+{ -+ struct mtd_partition *parts; -+ int nr_parts; -+ int i; -+ -+ nr_parts = parse_mtd_partitions_by_type(child, type, (const struct mtd_partition **)&parts, -+ NULL); -+ if (nr_parts <= 0) -+ return nr_parts; -+ -+ if (WARN_ON(!parts)) -+ return 0; -+ -+ for (i = 0; i < nr_parts; i++) { -+ /* adjust partition offsets */ -+ parts[i].offset += child->part.offset; -+ -+ mtd_add_partition(child->parent, -+ parts[i].name, -+ parts[i].offset, -+ parts[i].size); -+ } -+ -+ kfree(parts); -+ -+ return nr_parts; -+} -+ -+#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME -+#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME -+#else -+#define SPLIT_FIRMWARE_NAME "unused" -+#endif -+ -+static void split_firmware(struct mtd_info *master, struct mtd_info *part) -+{ -+ run_parsers_by_type(part, MTD_PARSER_TYPE_FIRMWARE); -+} -+ -+static void mtd_partition_split(struct mtd_info *master, struct mtd_info *part) -+{ -+ static int rootfs_found = 0; -+ -+ if (rootfs_found) -+ return; -+ -+ if (!strcmp(part->name, "rootfs")) { -+ run_parsers_by_type(part, MTD_PARSER_TYPE_ROOTFS); -+ -+ rootfs_found = 1; -+ } -+ -+ if (IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE) && -+ !strcmp(part->name, SPLIT_FIRMWARE_NAME) && -+ !of_find_property(mtd_get_of_node(part), "compatible", NULL)) -+ split_firmware(master, part); -+} -+ - int mtd_add_partition(struct mtd_info *parent, const char *name, - long long offset, long long length) - { -@@ -274,6 +416,7 @@ int mtd_add_partition(struct mtd_info *p - if (ret) - goto err_remove_part; - -+ mtd_partition_split(parent, child); - mtd_add_partition_attrs(child); - - return 0; -@@ -422,6 +565,7 @@ int add_mtd_partitions(struct mtd_info * - goto err_del_partitions; - } - -+ mtd_partition_split(master, child); - mtd_add_partition_attrs(child); - - /* Look for subpartitions */ -@@ -438,31 +582,6 @@ err_del_partitions: - return ret; - } - --static DEFINE_SPINLOCK(part_parser_lock); --static LIST_HEAD(part_parsers); -- --static struct mtd_part_parser *mtd_part_parser_get(const char *name) --{ -- struct mtd_part_parser *p, *ret = NULL; -- -- spin_lock(&part_parser_lock); -- -- list_for_each_entry(p, &part_parsers, list) -- if (!strcmp(p->name, name) && try_module_get(p->owner)) { -- ret = p; -- break; -- } -- -- spin_unlock(&part_parser_lock); -- -- return ret; --} -- --static inline void mtd_part_parser_put(const struct mtd_part_parser *p) --{ -- module_put(p->owner); --} -- - /* - * Many partition parsers just expected the core to kfree() all their data in - * one chunk. Do that by default. ---- a/include/linux/mtd/partitions.h -+++ b/include/linux/mtd/partitions.h -@@ -75,6 +75,12 @@ struct mtd_part_parser_data { - * Functions dealing with the various ways of partitioning the space - */ - -+enum mtd_parser_type { -+ MTD_PARSER_TYPE_DEVICE = 0, -+ MTD_PARSER_TYPE_ROOTFS, -+ MTD_PARSER_TYPE_FIRMWARE, -+}; -+ - struct mtd_part_parser { - struct list_head list; - struct module *owner; -@@ -83,6 +89,7 @@ struct mtd_part_parser { - int (*parse_fn)(struct mtd_info *, const struct mtd_partition **, - struct mtd_part_parser_data *); - void (*cleanup)(const struct mtd_partition *pparts, int nr_parts); -+ enum mtd_parser_type type; - }; - - /* Container for passing around a set of parsed partitions */ ---- a/drivers/mtd/Makefile -+++ b/drivers/mtd/Makefile -@@ -9,6 +9,8 @@ mtd-y := mtdcore.o mtdsuper.o mtdconc - - obj-y += parsers/ - -+obj-$(CONFIG_MTD_SPLIT) += mtdsplit/ -+ - # 'Users' - code which presents functionality to userspace. - obj-$(CONFIG_MTD_BLKDEVS) += mtd_blkdevs.o - obj-$(CONFIG_MTD_BLOCK) += mtdblock.o ---- a/include/linux/mtd/mtd.h -+++ b/include/linux/mtd/mtd.h -@@ -608,6 +608,24 @@ static inline void mtd_align_erase_req(s - req->len += mtd->erasesize - mod; - } - -+static inline uint64_t mtd_roundup_to_eb(uint64_t sz, struct mtd_info *mtd) -+{ -+ if (mtd_mod_by_eb(sz, mtd) == 0) -+ return sz; -+ -+ /* Round up to next erase block */ -+ return (mtd_div_by_eb(sz, mtd) + 1) * mtd->erasesize; -+} -+ -+static inline uint64_t mtd_rounddown_to_eb(uint64_t sz, struct mtd_info *mtd) -+{ -+ if (mtd_mod_by_eb(sz, mtd) == 0) -+ return sz; -+ -+ /* Round down to the start of the current erase block */ -+ return (mtd_div_by_eb(sz, mtd)) * mtd->erasesize; -+} -+ - static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd) - { - if (mtd->writesize_shift) -@@ -680,6 +698,13 @@ extern void __put_mtd_device(struct mtd_ - extern struct mtd_info *get_mtd_device_nm(const char *name); - extern void put_mtd_device(struct mtd_info *mtd); - -+static inline uint64_t mtdpart_get_offset(const struct mtd_info *mtd) -+{ -+ if (!mtd_is_partition(mtd)) -+ return 0; -+ -+ return mtd->part.offset; -+} - - struct mtd_notifier { - void (*add)(struct mtd_info *mtd); diff --git a/target/linux/generic/pending-5.19/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch b/target/linux/generic/pending-5.19/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch deleted file mode 100644 index a91f88718..000000000 --- a/target/linux/generic/pending-5.19/402-mtd-spi-nor-write-support-for-minor-aligned-partitions.patch +++ /dev/null @@ -1,389 +0,0 @@ -From patchwork Tue Jun 8 04:07:19 2021 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: John Thomson -X-Patchwork-Id: 1489105 -X-Patchwork-Delegate: tudor.ambarus@gmail.com -Return-Path: - -X-Original-To: incoming@patchwork.ozlabs.org -Delivered-To: patchwork-incoming@bilbo.ozlabs.org -Authentication-Results: ozlabs.org; - spf=none (no SPF record) smtp.mailfrom=lists.infradead.org - (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; - envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; - receiver=) -Authentication-Results: ozlabs.org; - dkim=pass (2048-bit key; - secure) header.d=lists.infradead.org header.i=@lists.infradead.org - header.a=rsa-sha256 header.s=bombadil.20210309 header.b=EMabhVoR; - dkim=fail reason="signature verification failed" (2048-bit key; - unprotected) header.d=fastmail.com.au header.i=@fastmail.com.au - header.a=rsa-sha256 header.s=fm3 header.b=dLzuZ6dB; - dkim=fail reason="signature verification failed" (2048-bit key; - unprotected) header.d=messagingengine.com header.i=@messagingengine.com - header.a=rsa-sha256 header.s=fm3 header.b=nSRGsW+C; - dkim-atps=neutral -Received: from bombadil.infradead.org (bombadil.infradead.org - [IPv6:2607:7c80:54:e::133]) - (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) - key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest - SHA256) - (No client certificate requested) - by ozlabs.org (Postfix) with ESMTPS id 4FzcFN1j1nz9sW8 - for ; Tue, 8 Jun 2021 14:09:28 +1000 (AEST) -DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; - d=lists.infradead.org; s=bombadil.20210309; h=Sender: - Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: - List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc - :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: - Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: - List-Owner; bh=6mUWQd71FwsINycGYY1qOhKz+ecWJVNtwDkTebG3XkA=; b=EMabhVoRE3ad89 - o3L2AgyKrs+blSofUC3hoSsQe7gi3m4si8S9HW8Z+8SsS5TufUsvGwDl80qSYGlQOytQF+1yRUWvE - 6FJ/+bqv+TwjqZFibgJ6+9OVsQN9dZ/no1R0bBXIpmrf8ORUmv58QK4ZQquaFKbyXKpFeWOC2MSv4 - H2MAhyhTU8a3gtooH6G8+KvsJEfVgh6C+aDbwxyh2UY3chHKuw1kvL6AktbfUE2xl4zxi3x3kc70B - Wi3LiJBFokxVdgnROXxTU5tI0XboWYkQV64gLuQNV4XKClcuhVpzloDK8Iok6NTd7b32a7TdEFlCS - lGKsEKmxtUlW2FpfoduA==; -Received: from localhost ([::1] helo=bombadil.infradead.org) - by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) - id 1lqT1r-006OAW-DX; Tue, 08 Jun 2021 04:07:51 +0000 -Received: from new1-smtp.messagingengine.com ([66.111.4.221]) - by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) - id 1lqT1l-006O9b-Fq - for linux-mtd@lists.infradead.org; Tue, 08 Jun 2021 04:07:50 +0000 -Received: from compute2.internal (compute2.nyi.internal [10.202.2.42]) - by mailnew.nyi.internal (Postfix) with ESMTP id 4456B580622; - Tue, 8 Jun 2021 00:07:42 -0400 (EDT) -Received: from mailfrontend2 ([10.202.2.163]) - by compute2.internal (MEProxy); Tue, 08 Jun 2021 00:07:42 -0400 -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastmail.com.au; - h=from:to:cc:subject:date:message-id:mime-version - :content-transfer-encoding; s=fm3; bh=ZXRH+YluM1mHCS1EWUiCY/Sg8O - LccfHe1oW5iAay6y8=; b=dLzuZ6dBYf7ZA8tWLOBFZYLi7ERsGe/4vnMXG+ovvb - dNBO0+SaFGwoqYSFrfq/TeyHfKyvxrA7+LCdopIuT4abpLHxtRwtRiafQcDYCPat - qJIqOZO+wCZC5S9Jc1OP7+t1FviGpgevqIMotci37P+RWc5u3AweMzFljZk90E8C - uorV6rXagD+OssJQzllRnAIK88+rOAC9ZyXv2gWxy4d1HSCwSWgzx2vnV9CNp918 - YC/3tiHas9krbrPIaAsdBROr7Bvoe/ShRRzruKRuvZVgg5NN90vX+/5ZjI8u04GM - p2bWCbC62CP6wlcgDaz+c/Sgr5ITd2GPENJsHfqmLRBA== -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= - messagingengine.com; h=cc:content-transfer-encoding:date:from - :message-id:mime-version:subject:to:x-me-proxy:x-me-proxy - :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; bh=ZXRH+YluM1mHCS1EW - UiCY/Sg8OLccfHe1oW5iAay6y8=; b=nSRGsW+CQ2Zx1RVpIUu8W/VD/k5P+32BW - 5k2ltd+UhI3dfldBPzHrYiOP/IJqGkNW+V+rHASacW/vFygnaZoxNjRYKnOsu+26 - wb2yK3jpl6lsNTg3N1Z4XJrYY2lf9H29DMFbhC67l0PTc050rcZk4XsKTLAlv14Q - VA4WREYSaX/4IN4O+ES4TMq0a/3gKZh6nvbbJXbsXfK0WlSHTGZtZmW3fyrqvbXa - t+R7L8vvqWvwls0pV+Sn8LeQqb7+A69w0UOnuznjkcA3sCc2YehcHbxcUEnMH+9N - bxOjmIDeg9/4X/829tUWUJiLhE5SFmQZ1P6oFtmbWoLrDz0ZJIVBw== -X-ME-Sender: - -X-ME-Received: - -X-ME-Proxy-Cause: - gggruggvucftvghtrhhoucdtuddrgeduledrfedtkedgjeduucetufdoteggodetrfdotf - fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen - uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne - cujfgurhephffvufffkffoggfgsedtkeertdertddtnecuhfhrohhmpeflohhhnhcuvfhh - ohhmshhonhcuoehgihhtsehjohhhnhhthhhomhhsohhnrdhfrghsthhmrghilhdrtghomh - drrghuqeenucggtffrrghtthgvrhhnpefffeeihfdukedtuedufeetieeuudfhhefhkefh - tefgtdeuffekffelleetveduieenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh - epmhgrihhlfhhrohhmpehgihhtsehjohhhnhhthhhomhhsohhnrdhfrghsthhmrghilhdr - tghomhdrrghu -X-ME-Proxy: - - - -Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue, - 8 Jun 2021 00:07:35 -0400 (EDT) -From: John Thomson -To: Miquel Raynal , - Richard Weinberger , Vignesh Raghavendra , - Tudor Ambarus , - Michael Walle , Pratyush Yadav , - linux-mtd@lists.infradead.org -Cc: linux-kernel@vger.kernel.org, - John Thomson , - kernel test robot , Dan Carpenter -Subject: [PATCH] mtd: spi-nor: write support for minor aligned partitions -Date: Tue, 8 Jun 2021 14:07:19 +1000 -Message-Id: <20210608040719.14431-1-git@johnthomson.fastmail.com.au> -X-Mailer: git-send-email 2.31.1 -MIME-Version: 1.0 -X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 -X-CRM114-CacheID: sfid-20210607_210745_712053_67A7D864 -X-CRM114-Status: GOOD ( 26.99 ) -X-Spam-Score: -0.8 (/) -X-Spam-Report: Spam detection software, - running on the system "bombadil.infradead.org", - has NOT identified this incoming email as spam. The original - message has been attached to this so you can view it or label - similar future email. If you have any questions, see - the administrator of that system for details. - Content preview: Do not prevent writing to mtd partitions where a partition - boundary sits on a minor erasesize boundary. This addresses a FIXME that - has been present since the start of the linux git history: /* Doesn' [...] - Content analysis details: (-0.8 points, 5.0 required) - pts rule name description - ---- ---------------------- - -------------------------------------------------- - -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at https://www.dnswl.org/, - low trust [66.111.4.221 listed in list.dnswl.org] - -0.0 SPF_PASS SPF: sender matches SPF record - -0.0 SPF_HELO_PASS SPF: HELO matches SPF record - 0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) - [66.111.4.221 listed in wl.mailspike.net] - -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature - 0.1 DKIM_SIGNED Message has a DKIM or DK signature, - not necessarily - valid - -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from - envelope-from domain - 0.0 RCVD_IN_MSPIKE_WL Mailspike good senders -X-BeenThere: linux-mtd@lists.infradead.org -X-Mailman-Version: 2.1.34 -Precedence: list -List-Id: Linux MTD discussion mailing list -List-Unsubscribe: , - -List-Archive: -List-Post: -List-Help: -List-Subscribe: , - -Sender: "linux-mtd" -Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org - -Do not prevent writing to mtd partitions where a partition boundary sits -on a minor erasesize boundary. -This addresses a FIXME that has been present since the start of the -linux git history: -/* Doesn't start on a boundary of major erase size */ -/* FIXME: Let it be writable if it is on a boundary of - * _minor_ erase size though */ - -Allow a uniform erase region spi-nor device to be configured -to use the non-uniform erase regions code path for an erase with: -CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE=y - -On supporting hardware (SECT_4K: majority of current SPI-NOR device) -provide the facility for an erase to use the least number -of SPI-NOR operations, as well as access to 4K erase without -requiring CONFIG_MTD_SPI_NOR_USE_4K_SECTORS - -Introduce erasesize_minor to the mtd struct, -the smallest erasesize supported by the device - -On existing devices, this is useful where write support is wanted -for data on a 4K partition, such as some u-boot-env partitions, -or RouterBoot soft_config, while still netting the performance -benefits of using 64K sectors - -Performance: -time mtd erase firmware -OpenWrt 5.10 ramips MT7621 w25q128jv 0xfc0000 partition length - -Without this patch -MTD_SPI_NOR_USE_4K_SECTORS=y |n -real 2m 11.66s |0m 50.86s -user 0m 0.00s |0m 0.00s -sys 1m 56.20s |0m 50.80s - -With this patch -MTD_SPI_NOR_USE_VARIABLE_ERASE=n|y |4K_SECTORS=y -real 0m 51.68s |0m 50.85s |2m 12.89s -user 0m 0.00s |0m 0.00s |0m 0.01s -sys 0m 46.94s |0m 50.38s |2m 12.46s - -Signed-off-by: John Thomson ---- -Have not tested on variable erase regions device. - -checkpatch does not like the printk(KERN_WARNING -these should be changed separately beforehand? - -Changes RFC -> v1: -Fix uninitialized variable smatch warning -Reported-by: kernel test robot -Reported-by: Dan Carpenter ---- - drivers/mtd/mtdpart.c | 52 ++++++++++++++++++++++++++++--------- - drivers/mtd/spi-nor/Kconfig | 10 +++++++ - drivers/mtd/spi-nor/core.c | 10 +++++-- - include/linux/mtd/mtd.h | 2 ++ - 4 files changed, 60 insertions(+), 14 deletions(-) - ---- a/drivers/mtd/mtdpart.c -+++ b/drivers/mtd/mtdpart.c -@@ -41,10 +41,11 @@ static struct mtd_info *allocate_partiti - struct mtd_info *master = mtd_get_master(parent); - int wr_alignment = (parent->flags & MTD_NO_ERASE) ? - master->writesize : master->erasesize; -+ int wr_alignment_minor = 0; - u64 parent_size = mtd_is_partition(parent) ? - parent->part.size : parent->size; - struct mtd_info *child; -- u32 remainder; -+ u32 remainder, remainder_minor; - char *name; - u64 tmp; - -@@ -146,6 +147,7 @@ static struct mtd_info *allocate_partiti - int i, max = parent->numeraseregions; - u64 end = child->part.offset + child->part.size; - struct mtd_erase_region_info *regions = parent->eraseregions; -+ uint32_t erasesize_minor = child->erasesize; - - /* Find the first erase regions which is part of this - * partition. */ -@@ -156,15 +158,24 @@ static struct mtd_info *allocate_partiti - if (i > 0) - i--; - -- /* Pick biggest erasesize */ - for (; i < max && regions[i].offset < end; i++) { -+ /* Pick biggest erasesize */ - if (child->erasesize < regions[i].erasesize) - child->erasesize = regions[i].erasesize; -+ /* Pick smallest non-zero erasesize */ -+ if ((erasesize_minor > regions[i].erasesize) && (regions[i].erasesize > 0)) -+ erasesize_minor = regions[i].erasesize; - } -+ -+ if (erasesize_minor < child->erasesize) -+ child->erasesize_minor = erasesize_minor; -+ - BUG_ON(child->erasesize == 0); - } else { - /* Single erase size */ - child->erasesize = master->erasesize; -+ if (master->erasesize_minor) -+ child->erasesize_minor = master->erasesize_minor; - } - - /* -@@ -172,26 +183,43 @@ static struct mtd_info *allocate_partiti - * exposes several regions with different erasesize. Adjust - * wr_alignment accordingly. - */ -- if (!(child->flags & MTD_NO_ERASE)) -+ if (!(child->flags & MTD_NO_ERASE)) { - wr_alignment = child->erasesize; -+ if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE) && child->erasesize_minor) -+ wr_alignment_minor = child->erasesize_minor; -+ } - - tmp = mtd_get_master_ofs(child, 0); - remainder = do_div(tmp, wr_alignment); - if ((child->flags & MTD_WRITEABLE) && remainder) { -- /* Doesn't start on a boundary of major erase size */ -- /* FIXME: Let it be writable if it is on a boundary of -- * _minor_ erase size though */ -- child->flags &= ~MTD_WRITEABLE; -- printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n", -- part->name); -+ if (wr_alignment_minor) { -+ tmp = mtd_get_master_ofs(child, 0); -+ remainder_minor = do_div(tmp, wr_alignment_minor); -+ if (remainder_minor == 0) -+ child->erasesize = child->erasesize_minor; -+ } -+ -+ if ((!wr_alignment_minor) || (wr_alignment_minor && remainder_minor != 0)) { -+ child->flags &= ~MTD_WRITEABLE; -+ printk(KERN_WARNING"mtd: partition \"%s\" doesn't start on an erase/write block boundary -- force read-only\n", -+ part->name); -+ } - } - - tmp = mtd_get_master_ofs(child, 0) + child->part.size; - remainder = do_div(tmp, wr_alignment); - if ((child->flags & MTD_WRITEABLE) && remainder) { -- child->flags &= ~MTD_WRITEABLE; -- printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n", -- part->name); -+ if (wr_alignment_minor) { -+ tmp = mtd_get_master_ofs(child, 0) + child->part.size; -+ remainder_minor = do_div(tmp, wr_alignment_minor); -+ if (remainder_minor == 0) -+ child->erasesize = child->erasesize_minor; -+ } -+ if ((!wr_alignment_minor) || (wr_alignment_minor && remainder_minor != 0)) { -+ child->flags &= ~MTD_WRITEABLE; -+ printk(KERN_WARNING"mtd: partition \"%s\" doesn't end on an erase/write block -- force read-only\n", -+ part->name); -+ } - } - - child->size = child->part.size; ---- a/drivers/mtd/spi-nor/Kconfig -+++ b/drivers/mtd/spi-nor/Kconfig -@@ -10,6 +10,16 @@ menuconfig MTD_SPI_NOR - - if MTD_SPI_NOR - -+config MTD_SPI_NOR_USE_VARIABLE_ERASE -+ bool "Disable uniform_erase to allow use of all hardware supported erasesizes" -+ depends on !MTD_SPI_NOR_USE_4K_SECTORS -+ default n -+ help -+ Allow mixed use of all hardware supported erasesizes, -+ by forcing spi_nor to use the multiple eraseregions code path. -+ For example: A 68K erase will use one 64K erase, and one 4K erase -+ on supporting hardware. -+ - config MTD_SPI_NOR_USE_4K_SECTORS - bool "Use small 4096 B erase sectors" - default y ---- a/drivers/mtd/spi-nor/core.c -+++ b/drivers/mtd/spi-nor/core.c -@@ -1048,6 +1048,8 @@ static u8 spi_nor_convert_3to4_erase(u8 - - static bool spi_nor_has_uniform_erase(const struct spi_nor *nor) - { -+ if (IS_ENABLED(CONFIG_MTD_SPI_NOR_USE_VARIABLE_ERASE)) -+ return false; - return !!nor->params->erase_map.uniform_erase_type; - } - -@@ -2144,6 +2146,7 @@ static int spi_nor_select_erase(struct s - { - struct spi_nor_erase_map *map = &nor->params->erase_map; - const struct spi_nor_erase_type *erase = NULL; -+ const struct spi_nor_erase_type *erase_minor = NULL; - struct mtd_info *mtd = &nor->mtd; - u32 wanted_size = nor->info->sector_size; - int i; -@@ -2176,8 +2179,9 @@ static int spi_nor_select_erase(struct s - */ - for (i = SNOR_ERASE_TYPE_MAX - 1; i >= 0; i--) { - if (map->erase_type[i].size) { -- erase = &map->erase_type[i]; -- break; -+ if (!erase) -+ erase = &map->erase_type[i]; -+ erase_minor = &map->erase_type[i]; - } - } - -@@ -2185,6 +2189,8 @@ static int spi_nor_select_erase(struct s - return -EINVAL; - - mtd->erasesize = erase->size; -+ if (erase_minor && erase_minor->size < erase->size) -+ mtd->erasesize_minor = erase_minor->size; - return 0; - } - ---- a/include/linux/mtd/mtd.h -+++ b/include/linux/mtd/mtd.h -@@ -238,6 +238,8 @@ struct mtd_info { - * information below if they desire - */ - uint32_t erasesize; -+ /* "Minor" (smallest) erase size supported by the whole device */ -+ uint32_t erasesize_minor; - /* Minimal writable flash unit size. In case of NOR flash it is 1 (even - * though individual bits can be cleared), in case of NAND flash it is - * one NAND page (or half, or one-fourths of it), in case of ECC-ed NOR diff --git a/target/linux/generic/pending-5.19/419-mtd-redboot-add-of_match_table-with-DT-binding.patch b/target/linux/generic/pending-5.19/419-mtd-redboot-add-of_match_table-with-DT-binding.patch deleted file mode 100644 index ade36033d..000000000 --- a/target/linux/generic/pending-5.19/419-mtd-redboot-add-of_match_table-with-DT-binding.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Subject: [PATCH] mtd: redboot: add of_match_table with DT binding -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This allows parsing RedBoot compatible partitions for properly described -flash device in DT. - -Signed-off-by: Rafał Miłecki ---- - ---- a/drivers/mtd/parsers/redboot.c -+++ b/drivers/mtd/parsers/redboot.c -@@ -305,6 +305,7 @@ nogood: - - static const struct of_device_id mtd_parser_redboot_of_match_table[] = { - { .compatible = "redboot-fis" }, -+ { .compatible = "ecoscentric,redboot-fis-partitions" }, - {}, - }; - MODULE_DEVICE_TABLE(of, mtd_parser_redboot_of_match_table); diff --git a/target/linux/generic/pending-5.19/420-mtd-redboot_space.patch b/target/linux/generic/pending-5.19/420-mtd-redboot_space.patch deleted file mode 100644 index 5518ea71d..000000000 --- a/target/linux/generic/pending-5.19/420-mtd-redboot_space.patch +++ /dev/null @@ -1,41 +0,0 @@ -From: Felix Fietkau -Subject: add patch for including unpartitioned space in the rootfs partition for redboot devices (if applicable) - -[john@phrozen.org: used by ixp and others] - -lede-commit: 394918851f84e4d00fa16eb900e7700e95091f00 -Signed-off-by: Felix Fietkau ---- - drivers/mtd/redboot.c | 19 +++++++++++++------ - 1 file changed, 13 insertions(+), 6 deletions(-) - ---- a/drivers/mtd/parsers/redboot.c -+++ b/drivers/mtd/parsers/redboot.c -@@ -278,14 +278,21 @@ nogood: - #endif - names += strlen(names) + 1; - --#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED - if (fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) { -- i++; -- parts[i].offset = parts[i - 1].size + parts[i - 1].offset; -- parts[i].size = fl->next->img->flash_base - parts[i].offset; -- parts[i].name = nullname; -- } -+ if (!strcmp(parts[i].name, "rootfs")) { -+ parts[i].size = fl->next->img->flash_base; -+ parts[i].size &= ~(master->erasesize - 1); -+ parts[i].size -= parts[i].offset; -+#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED -+ nrparts--; -+ } else { -+ i++; -+ parts[i].offset = parts[i-1].size + parts[i-1].offset; -+ parts[i].size = fl->next->img->flash_base - parts[i].offset; -+ parts[i].name = nullname; - #endif -+ } -+ } - tmp_fl = fl; - fl = fl->next; - kfree(tmp_fl); diff --git a/target/linux/generic/pending-5.19/430-mtd-add-myloader-partition-parser.patch b/target/linux/generic/pending-5.19/430-mtd-add-myloader-partition-parser.patch deleted file mode 100644 index 0889c9a34..000000000 --- a/target/linux/generic/pending-5.19/430-mtd-add-myloader-partition-parser.patch +++ /dev/null @@ -1,229 +0,0 @@ -From: Florian Fainelli -Subject: Add myloader partition table parser - -[john@phozen.org: shoud be upstreamable] - -lede-commit: d8bf22859b51faa09d22c056fe221a45d2f7a3b8 -Signed-off-by: Florian Fainelli -[adjust for kernel 5.4, add myloader.c to patch] -Signed-off-by: Adrian Schmutzler - ---- a/drivers/mtd/parsers/Kconfig -+++ b/drivers/mtd/parsers/Kconfig -@@ -57,6 +57,22 @@ config MTD_CMDLINE_PARTS - - If unsure, say 'N'. - -+config MTD_MYLOADER_PARTS -+ tristate "MyLoader partition parsing" -+ depends on ADM5120 || ATH25 || ATH79 -+ help -+ MyLoader is a bootloader which allows the user to define partitions -+ in flash devices, by putting a table in the second erase block -+ on the device, similar to a partition table. This table gives the -+ offsets and lengths of the user defined partitions. -+ -+ If you need code which can detect and parse these tables, and -+ register MTD 'partitions' corresponding to each image detected, -+ enable this option. -+ -+ You will still need the parsing functions to be called by the driver -+ for your particular device. It won't happen automatically. -+ - config MTD_OF_PARTS - tristate "OpenFirmware (device tree) partitioning parser" - default y ---- a/drivers/mtd/parsers/Makefile -+++ b/drivers/mtd/parsers/Makefile -@@ -3,6 +3,7 @@ obj-$(CONFIG_MTD_AR7_PARTS) += ar7part. - obj-$(CONFIG_MTD_BCM47XX_PARTS) += bcm47xxpart.o - obj-$(CONFIG_MTD_BCM63XX_PARTS) += bcm63xxpart.o - obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o -+obj-$(CONFIG_MTD_MYLOADER_PARTS) += myloader.o - obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o - ofpart-y += ofpart_core.o - ofpart-$(CONFIG_MTD_OF_PARTS_BCM4908) += ofpart_bcm4908.o ---- /dev/null -+++ b/drivers/mtd/parsers/myloader.c -@@ -0,0 +1,181 @@ -+/* -+ * Parse MyLoader-style flash partition tables and produce a Linux partition -+ * array to match. -+ * -+ * Copyright (C) 2007-2009 Gabor Juhos -+ * -+ * This file was based on drivers/mtd/redboot.c -+ * Author: Red Hat, Inc. - David Woodhouse -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License version 2 as published -+ * by the Free Software Foundation. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define BLOCK_LEN_MIN 0x10000 -+#define PART_NAME_LEN 32 -+ -+struct part_data { -+ struct mylo_partition_table tab; -+ char names[MYLO_MAX_PARTITIONS][PART_NAME_LEN]; -+}; -+ -+static int myloader_parse_partitions(struct mtd_info *master, -+ const struct mtd_partition **pparts, -+ struct mtd_part_parser_data *data) -+{ -+ struct part_data *buf; -+ struct mylo_partition_table *tab; -+ struct mylo_partition *part; -+ struct mtd_partition *mtd_parts; -+ struct mtd_partition *mtd_part; -+ int num_parts; -+ int ret, i; -+ size_t retlen; -+ char *names; -+ unsigned long offset; -+ unsigned long blocklen; -+ -+ buf = vmalloc(sizeof(*buf)); -+ if (!buf) { -+ return -ENOMEM; -+ goto out; -+ } -+ tab = &buf->tab; -+ -+ blocklen = master->erasesize; -+ if (blocklen < BLOCK_LEN_MIN) -+ blocklen = BLOCK_LEN_MIN; -+ -+ offset = blocklen; -+ -+ /* Find the partition table */ -+ for (i = 0; i < 4; i++, offset += blocklen) { -+ printk(KERN_DEBUG "%s: searching for MyLoader partition table" -+ " at offset 0x%lx\n", master->name, offset); -+ -+ ret = mtd_read(master, offset, sizeof(*buf), &retlen, -+ (void *)buf); -+ if (ret) -+ goto out_free_buf; -+ -+ if (retlen != sizeof(*buf)) { -+ ret = -EIO; -+ goto out_free_buf; -+ } -+ -+ /* Check for Partition Table magic number */ -+ if (tab->magic == le32_to_cpu(MYLO_MAGIC_PARTITIONS)) -+ break; -+ -+ } -+ -+ if (tab->magic != le32_to_cpu(MYLO_MAGIC_PARTITIONS)) { -+ printk(KERN_DEBUG "%s: no MyLoader partition table found\n", -+ master->name); -+ ret = 0; -+ goto out_free_buf; -+ } -+ -+ /* The MyLoader and the Partition Table is always present */ -+ num_parts = 2; -+ -+ /* Detect number of used partitions */ -+ for (i = 0; i < MYLO_MAX_PARTITIONS; i++) { -+ part = &tab->partitions[i]; -+ -+ if (le16_to_cpu(part->type) == PARTITION_TYPE_FREE) -+ continue; -+ -+ num_parts++; -+ } -+ -+ mtd_parts = kzalloc((num_parts * sizeof(*mtd_part) + -+ num_parts * PART_NAME_LEN), GFP_KERNEL); -+ -+ if (!mtd_parts) { -+ ret = -ENOMEM; -+ goto out_free_buf; -+ } -+ -+ mtd_part = mtd_parts; -+ names = (char *)&mtd_parts[num_parts]; -+ -+ strncpy(names, "myloader", PART_NAME_LEN); -+ mtd_part->name = names; -+ mtd_part->offset = 0; -+ mtd_part->size = offset; -+ mtd_part->mask_flags = MTD_WRITEABLE; -+ mtd_part++; -+ names += PART_NAME_LEN; -+ -+ strncpy(names, "partition_table", PART_NAME_LEN); -+ mtd_part->name = names; -+ mtd_part->offset = offset; -+ mtd_part->size = blocklen; -+ mtd_part->mask_flags = MTD_WRITEABLE; -+ mtd_part++; -+ names += PART_NAME_LEN; -+ -+ for (i = 0; i < MYLO_MAX_PARTITIONS; i++) { -+ part = &tab->partitions[i]; -+ -+ if (le16_to_cpu(part->type) == PARTITION_TYPE_FREE) -+ continue; -+ -+ if ((buf->names[i][0]) && (buf->names[i][0] != '\xff')) -+ strncpy(names, buf->names[i], PART_NAME_LEN); -+ else -+ snprintf(names, PART_NAME_LEN, "partition%d", i); -+ -+ mtd_part->offset = le32_to_cpu(part->addr); -+ mtd_part->size = le32_to_cpu(part->size); -+ mtd_part->name = names; -+ mtd_part++; -+ names += PART_NAME_LEN; -+ } -+ -+ *pparts = mtd_parts; -+ ret = num_parts; -+ -+ out_free_buf: -+ vfree(buf); -+ out: -+ return ret; -+} -+ -+static struct mtd_part_parser myloader_mtd_parser = { -+ .owner = THIS_MODULE, -+ .parse_fn = myloader_parse_partitions, -+ .name = "MyLoader", -+}; -+ -+static int __init myloader_mtd_parser_init(void) -+{ -+ register_mtd_parser(&myloader_mtd_parser); -+ -+ return 0; -+} -+ -+static void __exit myloader_mtd_parser_exit(void) -+{ -+ deregister_mtd_parser(&myloader_mtd_parser); -+} -+ -+module_init(myloader_mtd_parser_init); -+module_exit(myloader_mtd_parser_exit); -+ -+MODULE_AUTHOR("Gabor Juhos "); -+MODULE_DESCRIPTION("Parsing code for MyLoader partition tables"); -+MODULE_LICENSE("GPL v2"); diff --git a/target/linux/generic/pending-5.19/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch b/target/linux/generic/pending-5.19/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch deleted file mode 100644 index bcea45d00..000000000 --- a/target/linux/generic/pending-5.19/431-mtd-bcm47xxpart-check-for-bad-blocks-when-calculatin.patch +++ /dev/null @@ -1,68 +0,0 @@ -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Subject: [PATCH] mtd: bcm47xxpart: check for bad blocks when calculating offsets - -Signed-off-by: Rafał Miłecki ---- - ---- a/drivers/mtd/parsers/parser_trx.c -+++ b/drivers/mtd/parsers/parser_trx.c -@@ -25,6 +25,33 @@ struct trx_header { - uint32_t offset[3]; - } __packed; - -+/* -+ * Calculate real end offset (address) for a given amount of data. It checks -+ * all blocks skipping bad ones. -+ */ -+static size_t parser_trx_real_offset(struct mtd_info *mtd, size_t bytes) -+{ -+ size_t real_offset = 0; -+ -+ if (mtd_block_isbad(mtd, real_offset)) -+ pr_warn("Base offset shouldn't be at bad block"); -+ -+ while (bytes >= mtd->erasesize) { -+ bytes -= mtd->erasesize; -+ real_offset += mtd->erasesize; -+ while (mtd_block_isbad(mtd, real_offset)) { -+ real_offset += mtd->erasesize; -+ -+ if (real_offset >= mtd->size) -+ return real_offset - mtd->erasesize; -+ } -+ } -+ -+ real_offset += bytes; -+ -+ return real_offset; -+} -+ - static const char *parser_trx_data_part_name(struct mtd_info *master, - size_t offset) - { -@@ -86,21 +113,21 @@ static int parser_trx_parse(struct mtd_i - if (trx.offset[2]) { - part = &parts[curr_part++]; - part->name = "loader"; -- part->offset = trx.offset[i]; -+ part->offset = parser_trx_real_offset(mtd, trx.offset[i]); - i++; - } - - if (trx.offset[i]) { - part = &parts[curr_part++]; - part->name = "linux"; -- part->offset = trx.offset[i]; -+ part->offset = parser_trx_real_offset(mtd, trx.offset[i]); - i++; - } - - if (trx.offset[i]) { - part = &parts[curr_part++]; -- part->name = parser_trx_data_part_name(mtd, trx.offset[i]); -- part->offset = trx.offset[i]; -+ part->offset = parser_trx_real_offset(mtd, trx.offset[i]); -+ part->name = parser_trx_data_part_name(mtd, part->offset); - i++; - } - diff --git a/target/linux/generic/pending-5.19/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch b/target/linux/generic/pending-5.19/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch deleted file mode 100644 index 852654d92..000000000 --- a/target/linux/generic/pending-5.19/432-mtd-bcm47xxpart-detect-T_Meter-partition.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Subject: mtd: bcm47xxpart: detect T_Meter partition - -It can be found on many Netgear devices. It consists of many 0x30 blocks -starting with 4D 54. - -Signed-off-by: Rafał Miłecki ---- - drivers/mtd/bcm47xxpart.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - ---- a/drivers/mtd/parsers/bcm47xxpart.c -+++ b/drivers/mtd/parsers/bcm47xxpart.c -@@ -35,6 +35,7 @@ - #define NVRAM_HEADER 0x48534C46 /* FLSH */ - #define POT_MAGIC1 0x54544f50 /* POTT */ - #define POT_MAGIC2 0x504f /* OP */ -+#define T_METER_MAGIC 0x4D540000 /* MT */ - #define ML_MAGIC1 0x39685a42 - #define ML_MAGIC2 0x26594131 - #define TRX_MAGIC 0x30524448 -@@ -178,6 +179,15 @@ static int bcm47xxpart_parse(struct mtd_ - MTD_WRITEABLE); - continue; - } -+ -+ /* T_Meter */ -+ if ((le32_to_cpu(buf[0x000 / 4]) & 0xFFFF0000) == T_METER_MAGIC && -+ (le32_to_cpu(buf[0x030 / 4]) & 0xFFFF0000) == T_METER_MAGIC && -+ (le32_to_cpu(buf[0x060 / 4]) & 0xFFFF0000) == T_METER_MAGIC) { -+ bcm47xxpart_add_part(&parts[curr_part++], "T_Meter", offset, -+ MTD_WRITEABLE); -+ continue; -+ } - - /* TRX */ - if (buf[0x000 / 4] == TRX_MAGIC) { diff --git a/target/linux/generic/pending-5.19/435-mtd-add-routerbootpart-parser-config.patch b/target/linux/generic/pending-5.19/435-mtd-add-routerbootpart-parser-config.patch deleted file mode 100644 index 721a4d3a5..000000000 --- a/target/linux/generic/pending-5.19/435-mtd-add-routerbootpart-parser-config.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 4437e01fb6bca63fccdba5d6c44888b0935885c2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Thibaut=20VAR=C3=88NE?= -Date: Tue, 24 Mar 2020 11:45:07 +0100 -Subject: [PATCH] generic: routerboot partition build bits (5.4) -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This patch adds routerbootpart kernel build bits - -Signed-off-by: Thibaut VARÈNE ---- - drivers/mtd/parsers/Kconfig | 9 +++++++++ - drivers/mtd/parsers/Makefile | 1 + - 2 files changed, 10 insertions(+) - ---- a/drivers/mtd/parsers/Kconfig -+++ b/drivers/mtd/parsers/Kconfig -@@ -202,3 +202,12 @@ config MTD_QCOMSMEM_PARTS - help - This provides support for parsing partitions from Shared Memory (SMEM) - for NAND and SPI flash on Qualcomm platforms. -+ -+config MTD_ROUTERBOOT_PARTS -+ tristate "RouterBoot flash partition parser" -+ depends on MTD && OF -+ help -+ MikroTik RouterBoot is implemented as a multi segment system on the -+ flash, some of which are fixed and some of which are located at -+ variable offsets. This parser handles both cases via properly -+ formatted DTS. ---- a/drivers/mtd/parsers/Makefile -+++ b/drivers/mtd/parsers/Makefile -@@ -14,3 +14,4 @@ obj-$(CONFIG_MTD_PARSER_TRX) += parser_ - obj-$(CONFIG_MTD_SHARPSL_PARTS) += sharpslpart.o - obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o - obj-$(CONFIG_MTD_QCOMSMEM_PARTS) += qcomsmempart.o -+obj-$(CONFIG_MTD_ROUTERBOOT_PARTS) += routerbootpart.o diff --git a/target/linux/generic/pending-5.19/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch b/target/linux/generic/pending-5.19/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch deleted file mode 100644 index 1b653fb73..000000000 --- a/target/linux/generic/pending-5.19/460-mtd-cfi_cmdset_0002-no-erase_suspend.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Felix Fietkau -Subject: kernel: disable cfi cmdset 0002 erase suspend - -on some platforms, erase suspend leads to data corruption and lockups when write -ops collide with erase ops. this has been observed on the buffalo wzr-hp-g300nh. -rather than play whack-a-mole with a hard to reproduce issue on a variety of devices, -simply disable erase suspend, as it will usually not produce any useful gain on -the small filesystems used on embedded hardware. - -Signed-off-by: Felix Fietkau ---- - drivers/mtd/chips/cfi_cmdset_0002.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/mtd/chips/cfi_cmdset_0002.c -+++ b/drivers/mtd/chips/cfi_cmdset_0002.c -@@ -908,7 +908,7 @@ static int get_chip(struct map_info *map - return 0; - - case FL_ERASING: -- if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) || -+ if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) || - !(mode == FL_READY || mode == FL_POINT || - (mode == FL_WRITING && (cfip->EraseSuspend & 0x2)))) - goto sleep; diff --git a/target/linux/generic/pending-5.19/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch b/target/linux/generic/pending-5.19/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch deleted file mode 100644 index f2788c521..000000000 --- a/target/linux/generic/pending-5.19/461-mtd-cfi_cmdset_0002-add-buffer-write-cmd-timeout.patch +++ /dev/null @@ -1,17 +0,0 @@ -From: George Kashperko -Subject: Issue map read after Write Buffer Load command to ensure chip is ready to receive data. - -Signed-off-by: George Kashperko ---- - drivers/mtd/chips/cfi_cmdset_0002.c | 1 + - 1 file changed, 1 insertion(+) ---- a/drivers/mtd/chips/cfi_cmdset_0002.c -+++ b/drivers/mtd/chips/cfi_cmdset_0002.c -@@ -2052,6 +2052,7 @@ static int __xipram do_write_buffer(stru - - /* Write Buffer Load */ - map_write(map, CMD(0x25), cmd_adr); -+ (void) map_read(map, cmd_adr); - - chip->state = FL_WRITING_TO_BUFFER; - diff --git a/target/linux/generic/pending-5.19/465-m25p80-mx-disable-software-protection.patch b/target/linux/generic/pending-5.19/465-m25p80-mx-disable-software-protection.patch deleted file mode 100644 index 1e2807733..000000000 --- a/target/linux/generic/pending-5.19/465-m25p80-mx-disable-software-protection.patch +++ /dev/null @@ -1,18 +0,0 @@ -From: Felix Fietkau -Subject: Disable software protection bits for Macronix flashes. - -Signed-off-by: Felix Fietkau ---- - drivers/mtd/spi-nor/spi-nor.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/mtd/spi-nor/macronix.c -+++ b/drivers/mtd/spi-nor/macronix.c -@@ -106,6 +106,7 @@ static void macronix_nor_default_init(st - { - nor->params->quad_enable = spi_nor_sr1_bit6_quad_enable; - nor->params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode; -+ nor->flags |= SNOR_F_HAS_LOCK; - } - - static const struct spi_nor_fixups macronix_nor_fixups = { diff --git a/target/linux/generic/pending-5.19/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch b/target/linux/generic/pending-5.19/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch deleted file mode 100644 index b120548d2..000000000 --- a/target/linux/generic/pending-5.19/490-ubi-auto-attach-mtd-device-named-ubi-or-data-on-boot.patch +++ /dev/null @@ -1,97 +0,0 @@ -From: Daniel Golle -Subject: ubi: auto-attach mtd device named "ubi" or "data" on boot - -Signed-off-by: Daniel Golle ---- - drivers/mtd/ubi/build.c | 36 ++++++++++++++++++++++++++++++++++++ - 1 file changed, 36 insertions(+) - ---- a/drivers/mtd/ubi/build.c -+++ b/drivers/mtd/ubi/build.c -@@ -1184,6 +1184,73 @@ static struct mtd_info * __init open_mtd - return mtd; - } - -+/* -+ * This function tries attaching mtd partitions named either "ubi" or "data" -+ * during boot. -+ */ -+static void __init ubi_auto_attach(void) -+{ -+ int err; -+ struct mtd_info *mtd; -+ loff_t offset = 0; -+ size_t len; -+ char magic[4]; -+ -+ /* try attaching mtd device named "ubi" or "data" */ -+ mtd = open_mtd_device("ubi"); -+ if (IS_ERR(mtd)) -+ mtd = open_mtd_device("data"); -+ -+ if (IS_ERR(mtd)) -+ return; -+ -+ /* get the first not bad block */ -+ if (mtd_can_have_bb(mtd)) -+ while (mtd_block_isbad(mtd, offset)) { -+ offset += mtd->erasesize; -+ -+ if (offset > mtd->size) { -+ pr_err("UBI error: Failed to find a non-bad " -+ "block on mtd%d\n", mtd->index); -+ goto cleanup; -+ } -+ } -+ -+ /* check if the read from flash was successful */ -+ err = mtd_read(mtd, offset, 4, &len, (void *) magic); -+ if ((err && !mtd_is_bitflip(err)) || len != 4) { -+ pr_err("UBI error: unable to read from mtd%d\n", mtd->index); -+ goto cleanup; -+ } -+ -+ /* check for a valid ubi magic */ -+ if (strncmp(magic, "UBI#", 4)) { -+ pr_err("UBI error: no valid UBI magic found inside mtd%d\n", mtd->index); -+ goto cleanup; -+ } -+ -+ /* don't auto-add media types where UBI doesn't makes sense */ -+ if (mtd->type != MTD_NANDFLASH && -+ mtd->type != MTD_NORFLASH && -+ mtd->type != MTD_DATAFLASH && -+ mtd->type != MTD_MLCNANDFLASH) -+ goto cleanup; -+ -+ mutex_lock(&ubi_devices_mutex); -+ pr_notice("UBI: auto-attach mtd%d\n", mtd->index); -+ err = ubi_attach_mtd_dev(mtd, UBI_DEV_NUM_AUTO, 0, 0); -+ mutex_unlock(&ubi_devices_mutex); -+ if (err < 0) { -+ pr_err("UBI error: cannot attach mtd%d\n", mtd->index); -+ goto cleanup; -+ } -+ -+ return; -+ -+cleanup: -+ put_mtd_device(mtd); -+} -+ - static int __init ubi_init(void) - { - int err, i, k; -@@ -1267,6 +1334,12 @@ static int __init ubi_init(void) - } - } - -+ /* auto-attach mtd devices only if built-in to the kernel and no ubi.mtd -+ * parameter was given */ -+ if (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && -+ !ubi_is_module() && !mtd_devs) -+ ubi_auto_attach(); -+ - err = ubiblock_init(); - if (err) { - pr_err("UBI error: block: cannot initialize, error %d\n", err); diff --git a/target/linux/generic/pending-5.19/491-ubi-auto-create-ubiblock-device-for-rootfs.patch b/target/linux/generic/pending-5.19/491-ubi-auto-create-ubiblock-device-for-rootfs.patch deleted file mode 100644 index 17e8d8bed..000000000 --- a/target/linux/generic/pending-5.19/491-ubi-auto-create-ubiblock-device-for-rootfs.patch +++ /dev/null @@ -1,69 +0,0 @@ -From: Daniel Golle -Subject: ubi: auto-create ubiblock device for rootfs - -Signed-off-by: Daniel Golle ---- - drivers/mtd/ubi/block.c | 42 ++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 42 insertions(+) - ---- a/drivers/mtd/ubi/block.c -+++ b/drivers/mtd/ubi/block.c -@@ -653,6 +653,47 @@ static void __init ubiblock_create_from_ - } - } - -+#define UBIFS_NODE_MAGIC 0x06101831 -+static inline int ubi_vol_is_ubifs(struct ubi_volume_desc *desc) -+{ -+ int ret; -+ uint32_t magic_of, magic; -+ ret = ubi_read(desc, 0, (char *)&magic_of, 0, 4); -+ if (ret) -+ return 0; -+ magic = le32_to_cpu(magic_of); -+ return magic == UBIFS_NODE_MAGIC; -+} -+ -+static void __init ubiblock_create_auto_rootfs(void) -+{ -+ int ubi_num, ret, is_ubifs; -+ struct ubi_volume_desc *desc; -+ struct ubi_volume_info vi; -+ -+ for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++) { -+ desc = ubi_open_volume_nm(ubi_num, "rootfs", UBI_READONLY); -+ if (IS_ERR(desc)) -+ desc = ubi_open_volume_nm(ubi_num, "fit", UBI_READONLY);; -+ -+ if (IS_ERR(desc)) -+ continue; -+ -+ ubi_get_volume_info(desc, &vi); -+ is_ubifs = ubi_vol_is_ubifs(desc); -+ ubi_close_volume(desc); -+ if (is_ubifs) -+ break; -+ -+ ret = ubiblock_create(&vi); -+ if (ret) -+ pr_err("UBI error: block: can't add '%s' volume, err=%d\n", -+ vi.name, ret); -+ /* always break if we get here */ -+ break; -+ } -+} -+ - static void ubiblock_remove_all(void) - { - struct ubiblock *next; -@@ -685,6 +726,10 @@ int __init ubiblock_init(void) - */ - ubiblock_create_from_param(); - -+ /* auto-attach "rootfs" volume if existing and non-ubifs */ -+ if (IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV)) -+ ubiblock_create_auto_rootfs(); -+ - /* - * Block devices are only created upon user requests, so we ignore - * existing volumes. diff --git a/target/linux/generic/pending-5.19/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch b/target/linux/generic/pending-5.19/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch deleted file mode 100644 index 1db73cf17..000000000 --- a/target/linux/generic/pending-5.19/492-try-auto-mounting-ubi0-rootfs-in-init-do_mounts.c.patch +++ /dev/null @@ -1,52 +0,0 @@ -From: Daniel Golle -Subject: try auto-mounting ubi0:rootfs in init/do_mounts.c - -Signed-off-by: Daniel Golle ---- - init/do_mounts.c | 28 +++++++++++++++++++++++++++- - 1 file changed, 27 insertions(+), 1 deletion(-) - ---- a/init/do_mounts.c -+++ b/init/do_mounts.c -@@ -446,7 +446,28 @@ retry: - out: - put_page(page); - } -- -+ -+static int __init mount_ubi_rootfs(void) -+{ -+ int flags = MS_SILENT; -+ int err, tried = 0; -+ -+ while (tried < 2) { -+ err = do_mount_root("ubi0:rootfs", "ubifs", flags, \ -+ root_mount_data); -+ switch (err) { -+ case -EACCES: -+ flags |= MS_RDONLY; -+ tried++; -+ break; -+ default: -+ return err; -+ } -+ } -+ -+ return -EINVAL; -+} -+ - #ifdef CONFIG_ROOT_NFS - - #define NFSROOT_TIMEOUT_MIN 5 -@@ -583,6 +604,11 @@ void __init mount_root(void) - if (mount_nodev_root() == 0) - return; - } -+ -+#ifdef CONFIG_MTD_ROOTFS_ROOT_DEV -+ if (!mount_ubi_rootfs()) -+ return; -+#endif - #ifdef CONFIG_BLOCK - { - int err = create_dev("/dev/root", ROOT_DEV); diff --git a/target/linux/generic/pending-5.19/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch b/target/linux/generic/pending-5.19/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch deleted file mode 100644 index e3493ef19..000000000 --- a/target/linux/generic/pending-5.19/493-ubi-set-ROOT_DEV-to-ubiblock-rootfs-if-unset.patch +++ /dev/null @@ -1,34 +0,0 @@ -From: Daniel Golle -Subject: ubi: set ROOT_DEV to ubiblock "rootfs" if unset - -Signed-off-by: Daniel Golle ---- - drivers/mtd/ubi/block.c | 10 ++++++++++ - 1 file changed, 10 insertions(+) - ---- a/drivers/mtd/ubi/block.c -+++ b/drivers/mtd/ubi/block.c -@@ -42,6 +42,7 @@ - #include - #include - #include -+#include - - #include "ubi-media.h" - #include "ubi.h" -@@ -459,6 +460,15 @@ int ubiblock_create(struct ubi_volume_in - dev_info(disk_to_dev(dev->gd), "created from ubi%d:%d(%s)", - dev->ubi_num, dev->vol_id, vi->name); - mutex_unlock(&devices_mutex); -+ -+ if (!strcmp(vi->name, "rootfs") && -+ IS_ENABLED(CONFIG_MTD_ROOTFS_ROOT_DEV) && -+ ROOT_DEV == 0) { -+ pr_notice("ubiblock: device ubiblock%d_%d (%s) set to be root filesystem\n", -+ dev->ubi_num, dev->vol_id, vi->name); -+ ROOT_DEV = MKDEV(gd->major, gd->first_minor); -+ } -+ - return 0; - - out_destroy_wq: diff --git a/target/linux/generic/pending-5.19/494-mtd-ubi-add-EOF-marker-support.patch b/target/linux/generic/pending-5.19/494-mtd-ubi-add-EOF-marker-support.patch deleted file mode 100644 index 413431755..000000000 --- a/target/linux/generic/pending-5.19/494-mtd-ubi-add-EOF-marker-support.patch +++ /dev/null @@ -1,60 +0,0 @@ -From: Gabor Juhos -Subject: mtd: add EOF marker support to the UBI layer - -Signed-off-by: Gabor Juhos ---- - drivers/mtd/ubi/attach.c | 25 ++++++++++++++++++++++--- - drivers/mtd/ubi/ubi.h | 1 + - 2 files changed, 23 insertions(+), 3 deletions(-) - ---- a/drivers/mtd/ubi/attach.c -+++ b/drivers/mtd/ubi/attach.c -@@ -926,6 +926,13 @@ static bool vol_ignored(int vol_id) - #endif - } - -+static bool ec_hdr_has_eof(struct ubi_ec_hdr *ech) -+{ -+ return ech->padding1[0] == 'E' && -+ ech->padding1[1] == 'O' && -+ ech->padding1[2] == 'F'; -+} -+ - /** - * scan_peb - scan and process UBI headers of a PEB. - * @ubi: UBI device description object -@@ -958,9 +965,21 @@ static int scan_peb(struct ubi_device *u - return 0; - } - -- err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); -- if (err < 0) -- return err; -+ if (!ai->eof_found) { -+ err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); -+ if (err < 0) -+ return err; -+ -+ if (ec_hdr_has_eof(ech)) { -+ pr_notice("UBI: EOF marker found, PEBs from %d will be erased\n", -+ pnum); -+ ai->eof_found = true; -+ } -+ } -+ -+ if (ai->eof_found) -+ err = UBI_IO_FF_BITFLIPS; -+ - switch (err) { - case 0: - break; ---- a/drivers/mtd/ubi/ubi.h -+++ b/drivers/mtd/ubi/ubi.h -@@ -778,6 +778,7 @@ struct ubi_attach_info { - int mean_ec; - uint64_t ec_sum; - int ec_count; -+ bool eof_found; - struct kmem_cache *aeb_slab_cache; - struct ubi_ec_hdr *ech; - struct ubi_vid_io_buf *vidb; diff --git a/target/linux/generic/pending-5.19/495-mtd-core-add-get_mtd_device_by_node.patch b/target/linux/generic/pending-5.19/495-mtd-core-add-get_mtd_device_by_node.patch deleted file mode 100644 index d06bc8996..000000000 --- a/target/linux/generic/pending-5.19/495-mtd-core-add-get_mtd_device_by_node.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 1bd1b740f208d1cf4071932cc51860d37266c402 Mon Sep 17 00:00:00 2001 -From: Bernhard Frauendienst -Date: Sat, 1 Sep 2018 00:30:11 +0200 -Subject: [PATCH 495/497] mtd: core: add get_mtd_device_by_node - -Add function to retrieve a mtd device by its OF node. Since drivers can -assign arbitrary names to mtd devices in the absence of a label -property, there is no other reliable way to retrieve a mtd device for a -given OF node. - -Signed-off-by: Bernhard Frauendienst -Reviewed-by: Miquel Raynal ---- - drivers/mtd/mtdcore.c | 38 ++++++++++++++++++++++++++++++++++++++ - include/linux/mtd/mtd.h | 2 ++ - 2 files changed, 40 insertions(+) - ---- a/drivers/mtd/mtdcore.c -+++ b/drivers/mtd/mtdcore.c -@@ -1192,6 +1192,44 @@ out_unlock: - } - EXPORT_SYMBOL_GPL(get_mtd_device_nm); - -+/** -+ * get_mtd_device_by_node - obtain a validated handle for an MTD device -+ * by of_node -+ * @of_node: OF node of MTD device to open -+ * -+ * This function returns MTD device description structure in case of -+ * success and an error code in case of failure. -+ */ -+struct mtd_info *get_mtd_device_by_node(const struct device_node *of_node) -+{ -+ int err = -ENODEV; -+ struct mtd_info *mtd = NULL, *other; -+ -+ mutex_lock(&mtd_table_mutex); -+ -+ mtd_for_each_device(other) { -+ if (of_node == other->dev.of_node) { -+ mtd = other; -+ break; -+ } -+ } -+ -+ if (!mtd) -+ goto out_unlock; -+ -+ err = __get_mtd_device(mtd); -+ if (err) -+ goto out_unlock; -+ -+ mutex_unlock(&mtd_table_mutex); -+ return mtd; -+ -+out_unlock: -+ mutex_unlock(&mtd_table_mutex); -+ return ERR_PTR(err); -+} -+EXPORT_SYMBOL_GPL(get_mtd_device_by_node); -+ - void put_mtd_device(struct mtd_info *mtd) - { - mutex_lock(&mtd_table_mutex); ---- a/include/linux/mtd/mtd.h -+++ b/include/linux/mtd/mtd.h -@@ -698,6 +698,8 @@ extern struct mtd_info *get_mtd_device(s - extern int __get_mtd_device(struct mtd_info *mtd); - extern void __put_mtd_device(struct mtd_info *mtd); - extern struct mtd_info *get_mtd_device_nm(const char *name); -+extern struct mtd_info *get_mtd_device_by_node( -+ const struct device_node *of_node); - extern void put_mtd_device(struct mtd_info *mtd); - - static inline uint64_t mtdpart_get_offset(const struct mtd_info *mtd) diff --git a/target/linux/generic/pending-5.19/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch b/target/linux/generic/pending-5.19/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch deleted file mode 100644 index 01f3b9ec2..000000000 --- a/target/linux/generic/pending-5.19/496-dt-bindings-add-bindings-for-mtd-concat-devices.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 5734c6669fba7ddb5ef491ccff7159d15dba0b59 Mon Sep 17 00:00:00 2001 -From: Bernhard Frauendienst -Date: Wed, 5 Sep 2018 01:32:51 +0200 -Subject: [PATCH 496/497] dt-bindings: add bindings for mtd-concat devices - -Document virtual mtd-concat device bindings. - -Signed-off-by: Bernhard Frauendienst ---- - .../devicetree/bindings/mtd/mtd-concat.txt | 36 +++++++++++++++++++ - 1 file changed, 36 insertions(+) - create mode 100644 Documentation/devicetree/bindings/mtd/mtd-concat.txt - ---- /dev/null -+++ b/Documentation/devicetree/bindings/mtd/mtd-concat.txt -@@ -0,0 +1,36 @@ -+Virtual MTD concat device -+ -+Requires properties: -+- devices: list of phandles to mtd nodes that should be concatenated -+ -+Example: -+ -+&spi { -+ flash0: flash@0 { -+ ... -+ }; -+ flash1: flash@1 { -+ ... -+ }; -+}; -+ -+flash { -+ compatible = "mtd-concat"; -+ -+ devices = <&flash0 &flash1>; -+ -+ partitions { -+ compatible = "fixed-partitions"; -+ -+ partition@0 { -+ label = "boot"; -+ reg = <0x0000000 0x0040000>; -+ read-only; -+ }; -+ -+ partition@40000 { -+ label = "firmware"; -+ reg = <0x0040000 0x1fc0000>; -+ }; -+ } -+} diff --git a/target/linux/generic/pending-5.19/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch b/target/linux/generic/pending-5.19/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch deleted file mode 100644 index 321680154..000000000 --- a/target/linux/generic/pending-5.19/497-mtd-mtdconcat-add-dt-driver-for-concat-devices.patch +++ /dev/null @@ -1,216 +0,0 @@ -From e53f712d8eac71f54399b61038ccf87d2cee99d7 Mon Sep 17 00:00:00 2001 -From: Bernhard Frauendienst -Date: Sat, 25 Aug 2018 12:35:22 +0200 -Subject: [PATCH 497/497] mtd: mtdconcat: add dt driver for concat devices - -Some mtd drivers like physmap variants have support for concatenating -multiple mtd devices, but there is no generic way to define such a -concat device from within the device tree. - -This is useful for some SoC boards that use multiple flash chips as -memory banks of a single mtd device, with partitions spanning chip -borders. - -This commit adds a driver for creating virtual mtd-concat devices. They -must have a compatible = "mtd-concat" line, and define a list of devices -to concat in the 'devices' property, for example: - -flash { - compatible = "mtd-concat"; - - devices = <&flash0 &flash1>; - - partitions { - ... - }; -}; - -The driver is added to the very end of the mtd Makefile to increase the -likelyhood of all child devices already being loaded at the time of -probing, preventing unnecessary deferred probes. - -Signed-off-by: Bernhard Frauendienst ---- - drivers/mtd/Kconfig | 2 + - drivers/mtd/Makefile | 3 + - drivers/mtd/composite/Kconfig | 12 +++ - drivers/mtd/composite/Makefile | 6 ++ - drivers/mtd/composite/virt_concat.c | 128 ++++++++++++++++++++++++++++ - 5 files changed, 151 insertions(+) - create mode 100644 drivers/mtd/composite/Kconfig - create mode 100644 drivers/mtd/composite/Makefile - create mode 100644 drivers/mtd/composite/virt_concat.c - ---- a/drivers/mtd/Kconfig -+++ b/drivers/mtd/Kconfig -@@ -241,4 +241,6 @@ source "drivers/mtd/ubi/Kconfig" - - source "drivers/mtd/hyperbus/Kconfig" - -+source "drivers/mtd/composite/Kconfig" -+ - endif # MTD ---- a/drivers/mtd/Makefile -+++ b/drivers/mtd/Makefile -@@ -33,3 +33,6 @@ obj-y += chips/ lpddr/ maps/ devices/ n - obj-$(CONFIG_MTD_SPI_NOR) += spi-nor/ - obj-$(CONFIG_MTD_UBI) += ubi/ - obj-$(CONFIG_MTD_HYPERBUS) += hyperbus/ -+ -+# Composite drivers must be loaded last -+obj-y += composite/ ---- /dev/null -+++ b/drivers/mtd/composite/Kconfig -@@ -0,0 +1,12 @@ -+menu "Composite MTD device drivers" -+ depends on MTD!=n -+ -+config MTD_VIRT_CONCAT -+ tristate "Virtual concat MTD device" -+ help -+ This driver allows creation of a virtual MTD concat device, which -+ concatenates multiple underlying MTD devices to a single device. -+ This is required by some SoC boards where multiple memory banks are -+ used as one device with partitions spanning across device boundaries. -+ -+endmenu ---- /dev/null -+++ b/drivers/mtd/composite/Makefile -@@ -0,0 +1,6 @@ -+# SPDX-License-Identifier: GPL-2.0 -+# -+# linux/drivers/mtd/composite/Makefile -+# -+ -+obj-$(CONFIG_MTD_VIRT_CONCAT) += virt_concat.o ---- /dev/null -+++ b/drivers/mtd/composite/virt_concat.c -@@ -0,0 +1,128 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+/* -+ * Virtual concat MTD device driver -+ * -+ * Copyright (C) 2018 Bernhard Frauendienst -+ * Author: Bernhard Frauendienst, kernel@nospam.obeliks.de -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* -+ * struct of_virt_concat - platform device driver data. -+ * @cmtd the final mtd_concat device -+ * @num_devices the number of devices in @devices -+ * @devices points to an array of devices already loaded -+ */ -+struct of_virt_concat { -+ struct mtd_info *cmtd; -+ int num_devices; -+ struct mtd_info **devices; -+}; -+ -+static int virt_concat_remove(struct platform_device *pdev) -+{ -+ struct of_virt_concat *info; -+ int i; -+ -+ info = platform_get_drvdata(pdev); -+ if (!info) -+ return 0; -+ -+ // unset data for when this is called after a probe error -+ platform_set_drvdata(pdev, NULL); -+ -+ if (info->cmtd) { -+ mtd_device_unregister(info->cmtd); -+ mtd_concat_destroy(info->cmtd); -+ } -+ -+ if (info->devices) { -+ for (i = 0; i < info->num_devices; i++) -+ put_mtd_device(info->devices[i]); -+ } -+ -+ return 0; -+} -+ -+static int virt_concat_probe(struct platform_device *pdev) -+{ -+ struct device_node *node = pdev->dev.of_node; -+ struct of_phandle_iterator it; -+ struct of_virt_concat *info; -+ struct mtd_info *mtd; -+ int err = 0, count; -+ -+ count = of_count_phandle_with_args(node, "devices", NULL); -+ if (count <= 0) -+ return -EINVAL; -+ -+ info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); -+ if (!info) -+ return -ENOMEM; -+ info->devices = devm_kcalloc(&pdev->dev, count, -+ sizeof(*(info->devices)), GFP_KERNEL); -+ if (!info->devices) { -+ err = -ENOMEM; -+ goto err_remove; -+ } -+ -+ platform_set_drvdata(pdev, info); -+ -+ of_for_each_phandle(&it, err, node, "devices", NULL, 0) { -+ mtd = get_mtd_device_by_node(it.node); -+ if (IS_ERR(mtd)) { -+ of_node_put(it.node); -+ err = -EPROBE_DEFER; -+ goto err_remove; -+ } -+ -+ info->devices[info->num_devices++] = mtd; -+ } -+ -+ info->cmtd = mtd_concat_create(info->devices, info->num_devices, -+ dev_name(&pdev->dev)); -+ if (!info->cmtd) { -+ err = -ENXIO; -+ goto err_remove; -+ } -+ -+ info->cmtd->dev.parent = &pdev->dev; -+ mtd_set_of_node(info->cmtd, node); -+ mtd_device_register(info->cmtd, NULL, 0); -+ -+ return 0; -+ -+err_remove: -+ virt_concat_remove(pdev); -+ -+ return err; -+} -+ -+static const struct of_device_id virt_concat_of_match[] = { -+ { .compatible = "mtd-concat", }, -+ { /* sentinel */ } -+}; -+MODULE_DEVICE_TABLE(of, virt_concat_of_match); -+ -+static struct platform_driver virt_concat_driver = { -+ .probe = virt_concat_probe, -+ .remove = virt_concat_remove, -+ .driver = { -+ .name = "virt-mtdconcat", -+ .of_match_table = virt_concat_of_match, -+ }, -+}; -+ -+module_platform_driver(virt_concat_driver); -+ -+MODULE_LICENSE("GPL v2"); -+MODULE_AUTHOR("Bernhard Frauendienst "); -+MODULE_DESCRIPTION("Virtual concat MTD device driver"); diff --git a/target/linux/generic/pending-5.19/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch b/target/linux/generic/pending-5.19/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch deleted file mode 100644 index e9060e16e..000000000 --- a/target/linux/generic/pending-5.19/499-mtd-spi-nor-disable-16-bit-sr-for-macronix.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 245224608b5368c10407da07557e546743d3c489 Mon Sep 17 00:00:00 2001 -From: Nick Hainke -Date: Mon, 27 Dec 2021 09:33:13 +0100 -Subject: [PATCH 2/2] mtd: spi-nor: disable 16-bit-sr for macronix - -Macronix flash chips seem to consist of only one status register. -These chips will not work with the "16-bit Write Status (01h) Command". -Disable SNOR_F_HAS_16BIT_SR for all Macronix chips. - -Tested with MX25L6405D. - -Fixes: 39d1e3340c73 ("mtd: spi-nor: Fix clearing of QE bit on -lock()/unlock()") - -Signed-off-by: David Bauer -Signed-off-by: Nick Hainke ---- - drivers/mtd/spi-nor/macronix.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/mtd/spi-nor/macronix.c -+++ b/drivers/mtd/spi-nor/macronix.c -@@ -106,6 +106,7 @@ static void macronix_nor_default_init(st - { - nor->params->quad_enable = spi_nor_sr1_bit6_quad_enable; - nor->params->set_4byte_addr_mode = spi_nor_set_4byte_addr_mode; -+ nor->flags &= ~SNOR_F_HAS_16BIT_SR; - nor->flags |= SNOR_F_HAS_LOCK; - } - diff --git a/target/linux/generic/pending-5.19/500-fs_cdrom_dependencies.patch b/target/linux/generic/pending-5.19/500-fs_cdrom_dependencies.patch deleted file mode 100644 index 0a5a3aae5..000000000 --- a/target/linux/generic/pending-5.19/500-fs_cdrom_dependencies.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- a/fs/hfs/Kconfig -+++ b/fs/hfs/Kconfig -@@ -2,6 +2,7 @@ - config HFS_FS - tristate "Apple Macintosh file system support" - depends on BLOCK -+ select CDROM - select NLS - help - If you say Y here, you will be able to mount Macintosh-formatted ---- a/fs/hfsplus/Kconfig -+++ b/fs/hfsplus/Kconfig -@@ -2,6 +2,7 @@ - config HFSPLUS_FS - tristate "Apple Extended HFS file system support" - depends on BLOCK -+ select CDROM - select NLS - select NLS_UTF8 - help ---- a/fs/isofs/Kconfig -+++ b/fs/isofs/Kconfig -@@ -1,6 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0-only - config ISO9660_FS - tristate "ISO 9660 CDROM file system support" -+ select CDROM - help - This is the standard file system used on CD-ROMs. It was previously - known as "High Sierra File System" and is called "hsfs" on other ---- a/fs/udf/Kconfig -+++ b/fs/udf/Kconfig -@@ -1,6 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0-only - config UDF_FS - tristate "UDF file system support" -+ select CDROM - select CRC_ITU_T - select NLS - help diff --git a/target/linux/generic/pending-5.19/530-jffs2_make_lzma_available.patch b/target/linux/generic/pending-5.19/530-jffs2_make_lzma_available.patch deleted file mode 100644 index 1ba8e7cb5..000000000 --- a/target/linux/generic/pending-5.19/530-jffs2_make_lzma_available.patch +++ /dev/null @@ -1,4581 +0,0 @@ -From: Alexandros C. Couloumbis -Subject: fs: add jffs2/lzma support (not activated by default yet) - -lede-commit: c2c88d315fa0e881f8b19da07b62859b915b11b2 -Signed-off-by: Alexandros C. Couloumbis ---- - fs/jffs2/Kconfig | 9 + - fs/jffs2/Makefile | 3 + - fs/jffs2/compr.c | 6 + - fs/jffs2/compr.h | 10 +- - fs/jffs2/compr_lzma.c | 128 +++ - fs/jffs2/super.c | 33 +- - include/linux/lzma.h | 62 ++ - include/linux/lzma/LzFind.h | 115 +++ - include/linux/lzma/LzHash.h | 54 + - include/linux/lzma/LzmaDec.h | 231 +++++ - include/linux/lzma/LzmaEnc.h | 80 ++ - include/linux/lzma/Types.h | 226 +++++ - include/uapi/linux/jffs2.h | 1 + - lib/Kconfig | 6 + - lib/Makefile | 12 + - lib/lzma/LzFind.c | 761 ++++++++++++++ - lib/lzma/LzmaDec.c | 999 +++++++++++++++++++ - lib/lzma/LzmaEnc.c | 2271 ++++++++++++++++++++++++++++++++++++++++++ - lib/lzma/Makefile | 7 + - 19 files changed, 5008 insertions(+), 6 deletions(-) - create mode 100644 fs/jffs2/compr_lzma.c - create mode 100644 include/linux/lzma.h - create mode 100644 include/linux/lzma/LzFind.h - create mode 100644 include/linux/lzma/LzHash.h - create mode 100644 include/linux/lzma/LzmaDec.h - create mode 100644 include/linux/lzma/LzmaEnc.h - create mode 100644 include/linux/lzma/Types.h - create mode 100644 lib/lzma/LzFind.c - create mode 100644 lib/lzma/LzmaDec.c - create mode 100644 lib/lzma/LzmaEnc.c - create mode 100644 lib/lzma/Makefile - ---- a/fs/jffs2/Kconfig -+++ b/fs/jffs2/Kconfig -@@ -136,6 +136,15 @@ config JFFS2_LZO - This feature was added in July, 2007. Say 'N' if you need - compatibility with older bootloaders or kernels. - -+config JFFS2_LZMA -+ bool "JFFS2 LZMA compression support" if JFFS2_COMPRESSION_OPTIONS -+ select LZMA_COMPRESS -+ select LZMA_DECOMPRESS -+ depends on JFFS2_FS -+ default n -+ help -+ JFFS2 wrapper to the LZMA C SDK -+ - config JFFS2_RTIME - bool "JFFS2 RTIME compression support" if JFFS2_COMPRESSION_OPTIONS - depends on JFFS2_FS ---- a/fs/jffs2/Makefile -+++ b/fs/jffs2/Makefile -@@ -19,4 +19,7 @@ jffs2-$(CONFIG_JFFS2_RUBIN) += compr_rub - jffs2-$(CONFIG_JFFS2_RTIME) += compr_rtime.o - jffs2-$(CONFIG_JFFS2_ZLIB) += compr_zlib.o - jffs2-$(CONFIG_JFFS2_LZO) += compr_lzo.o -+jffs2-$(CONFIG_JFFS2_LZMA) += compr_lzma.o - jffs2-$(CONFIG_JFFS2_SUMMARY) += summary.o -+ -+CFLAGS_compr_lzma.o += -Iinclude/linux -Ilib/lzma ---- a/fs/jffs2/compr.c -+++ b/fs/jffs2/compr.c -@@ -378,6 +378,9 @@ int __init jffs2_compressors_init(void) - #ifdef CONFIG_JFFS2_LZO - jffs2_lzo_init(); - #endif -+#ifdef CONFIG_JFFS2_LZMA -+ jffs2_lzma_init(); -+#endif - /* Setting default compression mode */ - #ifdef CONFIG_JFFS2_CMODE_NONE - jffs2_compression_mode = JFFS2_COMPR_MODE_NONE; -@@ -401,6 +404,9 @@ int __init jffs2_compressors_init(void) - int jffs2_compressors_exit(void) - { - /* Unregistering compressors */ -+#ifdef CONFIG_JFFS2_LZMA -+ jffs2_lzma_exit(); -+#endif - #ifdef CONFIG_JFFS2_LZO - jffs2_lzo_exit(); - #endif ---- a/fs/jffs2/compr.h -+++ b/fs/jffs2/compr.h -@@ -29,9 +29,9 @@ - #define JFFS2_DYNRUBIN_PRIORITY 20 - #define JFFS2_LZARI_PRIORITY 30 - #define JFFS2_RTIME_PRIORITY 50 --#define JFFS2_ZLIB_PRIORITY 60 --#define JFFS2_LZO_PRIORITY 80 -- -+#define JFFS2_LZMA_PRIORITY 70 -+#define JFFS2_ZLIB_PRIORITY 80 -+#define JFFS2_LZO_PRIORITY 90 - - #define JFFS2_RUBINMIPS_DISABLED /* RUBINs will be used only */ - #define JFFS2_DYNRUBIN_DISABLED /* for decompression */ -@@ -101,5 +101,9 @@ void jffs2_zlib_exit(void); - int jffs2_lzo_init(void); - void jffs2_lzo_exit(void); - #endif -+#ifdef CONFIG_JFFS2_LZMA -+int jffs2_lzma_init(void); -+void jffs2_lzma_exit(void); -+#endif - - #endif /* __JFFS2_COMPR_H__ */ ---- /dev/null -+++ b/fs/jffs2/compr_lzma.c -@@ -0,0 +1,128 @@ -+/* -+ * JFFS2 -- Journalling Flash File System, Version 2. -+ * -+ * For licensing information, see the file 'LICENCE' in this directory. -+ * -+ * JFFS2 wrapper to the LZMA C SDK -+ * -+ */ -+ -+#include -+#include "compr.h" -+ -+#ifdef __KERNEL__ -+ static DEFINE_MUTEX(deflate_mutex); -+#endif -+ -+CLzmaEncHandle *p; -+Byte propsEncoded[LZMA_PROPS_SIZE]; -+SizeT propsSize = sizeof(propsEncoded); -+ -+STATIC void lzma_free_workspace(void) -+{ -+ LzmaEnc_Destroy(p, &lzma_alloc, &lzma_alloc); -+} -+ -+STATIC int INIT lzma_alloc_workspace(CLzmaEncProps *props) -+{ -+ if ((p = (CLzmaEncHandle *)LzmaEnc_Create(&lzma_alloc)) == NULL) -+ { -+ PRINT_ERROR("Failed to allocate lzma deflate workspace\n"); -+ return -ENOMEM; -+ } -+ -+ if (LzmaEnc_SetProps(p, props) != SZ_OK) -+ { -+ lzma_free_workspace(); -+ return -1; -+ } -+ -+ if (LzmaEnc_WriteProperties(p, propsEncoded, &propsSize) != SZ_OK) -+ { -+ lzma_free_workspace(); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+STATIC int jffs2_lzma_compress(unsigned char *data_in, unsigned char *cpage_out, -+ uint32_t *sourcelen, uint32_t *dstlen) -+{ -+ SizeT compress_size = (SizeT)(*dstlen); -+ int ret; -+ -+ #ifdef __KERNEL__ -+ mutex_lock(&deflate_mutex); -+ #endif -+ -+ ret = LzmaEnc_MemEncode(p, cpage_out, &compress_size, data_in, *sourcelen, -+ 0, NULL, &lzma_alloc, &lzma_alloc); -+ -+ #ifdef __KERNEL__ -+ mutex_unlock(&deflate_mutex); -+ #endif -+ -+ if (ret != SZ_OK) -+ return -1; -+ -+ *dstlen = (uint32_t)compress_size; -+ -+ return 0; -+} -+ -+STATIC int jffs2_lzma_decompress(unsigned char *data_in, unsigned char *cpage_out, -+ uint32_t srclen, uint32_t destlen) -+{ -+ int ret; -+ SizeT dl = (SizeT)destlen; -+ SizeT sl = (SizeT)srclen; -+ ELzmaStatus status; -+ -+ ret = LzmaDecode(cpage_out, &dl, data_in, &sl, propsEncoded, -+ propsSize, LZMA_FINISH_ANY, &status, &lzma_alloc); -+ -+ if (ret != SZ_OK || status == LZMA_STATUS_NOT_FINISHED || dl != (SizeT)destlen) -+ return -1; -+ -+ return 0; -+} -+ -+static struct jffs2_compressor jffs2_lzma_comp = { -+ .priority = JFFS2_LZMA_PRIORITY, -+ .name = "lzma", -+ .compr = JFFS2_COMPR_LZMA, -+ .compress = &jffs2_lzma_compress, -+ .decompress = &jffs2_lzma_decompress, -+ .disabled = 0, -+}; -+ -+int INIT jffs2_lzma_init(void) -+{ -+ int ret; -+ CLzmaEncProps props; -+ LzmaEncProps_Init(&props); -+ -+ props.dictSize = LZMA_BEST_DICT(0x2000); -+ props.level = LZMA_BEST_LEVEL; -+ props.lc = LZMA_BEST_LC; -+ props.lp = LZMA_BEST_LP; -+ props.pb = LZMA_BEST_PB; -+ props.fb = LZMA_BEST_FB; -+ -+ ret = lzma_alloc_workspace(&props); -+ if (ret < 0) -+ return ret; -+ -+ ret = jffs2_register_compressor(&jffs2_lzma_comp); -+ if (ret) -+ lzma_free_workspace(); -+ -+ return ret; -+} -+ -+void jffs2_lzma_exit(void) -+{ -+ jffs2_unregister_compressor(&jffs2_lzma_comp); -+ lzma_free_workspace(); -+} ---- a/fs/jffs2/super.c -+++ b/fs/jffs2/super.c -@@ -374,14 +374,41 @@ static int __init init_jffs2_fs(void) - BUILD_BUG_ON(sizeof(struct jffs2_raw_inode) != 68); - BUILD_BUG_ON(sizeof(struct jffs2_raw_summary) != 32); - -- pr_info("version 2.2." -+ pr_info("version 2.2" - #ifdef CONFIG_JFFS2_FS_WRITEBUFFER - " (NAND)" - #endif - #ifdef CONFIG_JFFS2_SUMMARY -- " (SUMMARY) " -+ " (SUMMARY)" - #endif -- " © 2001-2006 Red Hat, Inc.\n"); -+#ifdef CONFIG_JFFS2_ZLIB -+ " (ZLIB)" -+#endif -+#ifdef CONFIG_JFFS2_LZO -+ " (LZO)" -+#endif -+#ifdef CONFIG_JFFS2_LZMA -+ " (LZMA)" -+#endif -+#ifdef CONFIG_JFFS2_RTIME -+ " (RTIME)" -+#endif -+#ifdef CONFIG_JFFS2_RUBIN -+ " (RUBIN)" -+#endif -+#ifdef CONFIG_JFFS2_CMODE_NONE -+ " (CMODE_NONE)" -+#endif -+#ifdef CONFIG_JFFS2_CMODE_PRIORITY -+ " (CMODE_PRIORITY)" -+#endif -+#ifdef CONFIG_JFFS2_CMODE_SIZE -+ " (CMODE_SIZE)" -+#endif -+#ifdef CONFIG_JFFS2_CMODE_FAVOURLZO -+ " (CMODE_FAVOURLZO)" -+#endif -+ " (c) 2001-2006 Red Hat, Inc.\n"); - - jffs2_inode_cachep = kmem_cache_create("jffs2_i", - sizeof(struct jffs2_inode_info), ---- /dev/null -+++ b/include/linux/lzma.h -@@ -0,0 +1,62 @@ -+#ifndef __LZMA_H__ -+#define __LZMA_H__ -+ -+#ifdef __KERNEL__ -+ #include -+ #include -+ #include -+ #include -+ #include -+ #define LZMA_MALLOC vmalloc -+ #define LZMA_FREE vfree -+ #define PRINT_ERROR(msg) printk(KERN_WARNING #msg) -+ #define INIT __init -+ #define STATIC static -+#else -+ #include -+ #include -+ #include -+ #include -+ #include -+ #include -+ #include -+ #include -+ #ifndef PAGE_SIZE -+ extern int page_size; -+ #define PAGE_SIZE page_size -+ #endif -+ #define LZMA_MALLOC malloc -+ #define LZMA_FREE free -+ #define PRINT_ERROR(msg) fprintf(stderr, msg) -+ #define INIT -+ #define STATIC -+#endif -+ -+#include "lzma/LzmaDec.h" -+#include "lzma/LzmaEnc.h" -+ -+#define LZMA_BEST_LEVEL (9) -+#define LZMA_BEST_LC (0) -+#define LZMA_BEST_LP (0) -+#define LZMA_BEST_PB (0) -+#define LZMA_BEST_FB (273) -+ -+#define LZMA_BEST_DICT(n) (((int)((n) / 2)) * 2) -+ -+static void *p_lzma_malloc(void *p, size_t size) -+{ -+ if (size == 0) -+ return NULL; -+ -+ return LZMA_MALLOC(size); -+} -+ -+static void p_lzma_free(void *p, void *address) -+{ -+ if (address != NULL) -+ LZMA_FREE(address); -+} -+ -+static ISzAlloc lzma_alloc = { .Alloc = p_lzma_malloc, .Free = p_lzma_free }; -+ -+#endif ---- /dev/null -+++ b/include/linux/lzma/LzFind.h -@@ -0,0 +1,98 @@ -+/* LzFind.h -- Match finder for LZ algorithms -+2009-04-22 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZ_FIND_H -+#define __LZ_FIND_H -+ -+#include "Types.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+typedef UInt32 CLzRef; -+ -+typedef struct _CMatchFinder -+{ -+ Byte *buffer; -+ UInt32 pos; -+ UInt32 posLimit; -+ UInt32 streamPos; -+ UInt32 lenLimit; -+ -+ UInt32 cyclicBufferPos; -+ UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ -+ -+ UInt32 matchMaxLen; -+ CLzRef *hash; -+ CLzRef *son; -+ UInt32 hashMask; -+ UInt32 cutValue; -+ -+ Byte *bufferBase; -+ ISeqInStream *stream; -+ int streamEndWasReached; -+ -+ UInt32 blockSize; -+ UInt32 keepSizeBefore; -+ UInt32 keepSizeAfter; -+ -+ UInt32 numHashBytes; -+ int directInput; -+ size_t directInputRem; -+ int btMode; -+ int bigHash; -+ UInt32 historySize; -+ UInt32 fixedHashSize; -+ UInt32 hashSizeSum; -+ UInt32 numSons; -+ SRes result; -+ UInt32 crc[256]; -+} CMatchFinder; -+ -+#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) -+#define Inline_MatchFinder_GetIndexByte(p, index) ((p)->buffer[(Int32)(index)]) -+ -+#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) -+ -+void MatchFinder_Construct(CMatchFinder *p); -+ -+/* Conditions: -+ historySize <= 3 GB -+ keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB -+*/ -+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, -+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, -+ ISzAlloc *alloc); -+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc); -+ -+/* -+Conditions: -+ Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. -+ Mf_GetPointerToCurrentPos_Func's result must be used only before any other function -+*/ -+ -+typedef void (*Mf_Init_Func)(void *object); -+typedef Byte (*Mf_GetIndexByte_Func)(void *object, Int32 index); -+typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); -+typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); -+typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); -+typedef void (*Mf_Skip_Func)(void *object, UInt32); -+ -+typedef struct _IMatchFinder -+{ -+ Mf_Init_Func Init; -+ Mf_GetIndexByte_Func GetIndexByte; -+ Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; -+ Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; -+ Mf_GetMatches_Func GetMatches; -+ Mf_Skip_Func Skip; -+} IMatchFinder; -+ -+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif ---- /dev/null -+++ b/include/linux/lzma/LzHash.h -@@ -0,0 +1,54 @@ -+/* LzHash.h -- HASH functions for LZ algorithms -+2009-02-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZ_HASH_H -+#define __LZ_HASH_H -+ -+#define kHash2Size (1 << 10) -+#define kHash3Size (1 << 16) -+#define kHash4Size (1 << 20) -+ -+#define kFix3HashSize (kHash2Size) -+#define kFix4HashSize (kHash2Size + kHash3Size) -+#define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) -+ -+#define HASH2_CALC hashValue = cur[0] | ((UInt32)cur[1] << 8); -+ -+#define HASH3_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hashValue = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } -+ -+#define HASH4_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ -+ hashValue = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & p->hashMask; } -+ -+#define HASH5_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ -+ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)); \ -+ hashValue = (hash4Value ^ (p->crc[cur[4]] << 3)) & p->hashMask; \ -+ hash4Value &= (kHash4Size - 1); } -+ -+/* #define HASH_ZIP_CALC hashValue = ((cur[0] | ((UInt32)cur[1] << 8)) ^ p->crc[cur[2]]) & 0xFFFF; */ -+#define HASH_ZIP_CALC hashValue = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; -+ -+ -+#define MT_HASH2_CALC \ -+ hash2Value = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); -+ -+#define MT_HASH3_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } -+ -+#define MT_HASH4_CALC { \ -+ UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ -+ hash2Value = temp & (kHash2Size - 1); \ -+ hash3Value = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); \ -+ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); } -+ -+#endif ---- /dev/null -+++ b/include/linux/lzma/LzmaDec.h -@@ -0,0 +1,130 @@ -+/* LzmaDec.h -- LZMA Decoder -+2009-02-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZMA_DEC_H -+#define __LZMA_DEC_H -+ -+#include "Types.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/* #define _LZMA_PROB32 */ -+/* _LZMA_PROB32 can increase the speed on some CPUs, -+ but memory usage for CLzmaDec::probs will be doubled in that case */ -+ -+#ifdef _LZMA_PROB32 -+#define CLzmaProb UInt32 -+#else -+#define CLzmaProb UInt16 -+#endif -+ -+ -+/* ---------- LZMA Properties ---------- */ -+ -+#define LZMA_PROPS_SIZE 5 -+ -+typedef struct _CLzmaProps -+{ -+ unsigned lc, lp, pb; -+ UInt32 dicSize; -+} CLzmaProps; -+ -+ -+/* ---------- LZMA Decoder state ---------- */ -+ -+/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. -+ Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ -+ -+#define LZMA_REQUIRED_INPUT_MAX 20 -+ -+typedef struct -+{ -+ CLzmaProps prop; -+ CLzmaProb *probs; -+ Byte *dic; -+ const Byte *buf; -+ UInt32 range, code; -+ SizeT dicPos; -+ SizeT dicBufSize; -+ UInt32 processedPos; -+ UInt32 checkDicSize; -+ unsigned state; -+ UInt32 reps[4]; -+ unsigned remainLen; -+ int needFlush; -+ int needInitState; -+ UInt32 numProbs; -+ unsigned tempBufSize; -+ Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; -+} CLzmaDec; -+ -+#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; } -+ -+/* There are two types of LZMA streams: -+ 0) Stream with end mark. That end mark adds about 6 bytes to compressed size. -+ 1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */ -+ -+typedef enum -+{ -+ LZMA_FINISH_ANY, /* finish at any point */ -+ LZMA_FINISH_END /* block must be finished at the end */ -+} ELzmaFinishMode; -+ -+/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! -+ -+ You must use LZMA_FINISH_END, when you know that current output buffer -+ covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. -+ -+ If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, -+ and output value of destLen will be less than output buffer size limit. -+ You can check status result also. -+ -+ You can use multiple checks to test data integrity after full decompression: -+ 1) Check Result and "status" variable. -+ 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. -+ 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. -+ You must use correct finish mode in that case. */ -+ -+typedef enum -+{ -+ LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ -+ LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ -+ LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ -+ LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ -+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ -+} ELzmaStatus; -+ -+/* ELzmaStatus is used only as output value for function call */ -+ -+/* ---------- One Call Interface ---------- */ -+ -+/* LzmaDecode -+ -+finishMode: -+ It has meaning only if the decoding reaches output limit (*destLen). -+ LZMA_FINISH_ANY - Decode just destLen bytes. -+ LZMA_FINISH_END - Stream must be finished after (*destLen). -+ -+Returns: -+ SZ_OK -+ status: -+ LZMA_STATUS_FINISHED_WITH_MARK -+ LZMA_STATUS_NOT_FINISHED -+ LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK -+ SZ_ERROR_DATA - Data error -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_UNSUPPORTED - Unsupported properties -+ SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). -+*/ -+ -+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, -+ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, -+ ELzmaStatus *status, ISzAlloc *alloc); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif ---- /dev/null -+++ b/include/linux/lzma/LzmaEnc.h -@@ -0,0 +1,60 @@ -+/* LzmaEnc.h -- LZMA Encoder -+2009-02-07 : Igor Pavlov : Public domain */ -+ -+#ifndef __LZMA_ENC_H -+#define __LZMA_ENC_H -+ -+#include "Types.h" -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#define LZMA_PROPS_SIZE 5 -+ -+typedef struct _CLzmaEncProps -+{ -+ int level; /* 0 <= level <= 9 */ -+ UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version -+ (1 << 12) <= dictSize <= (1 << 30) for 64-bit version -+ default = (1 << 24) */ -+ int lc; /* 0 <= lc <= 8, default = 3 */ -+ int lp; /* 0 <= lp <= 4, default = 0 */ -+ int pb; /* 0 <= pb <= 4, default = 2 */ -+ int algo; /* 0 - fast, 1 - normal, default = 1 */ -+ int fb; /* 5 <= fb <= 273, default = 32 */ -+ int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ -+ int numHashBytes; /* 2, 3 or 4, default = 4 */ -+ UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ -+ unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ -+ int numThreads; /* 1 or 2, default = 2 */ -+} CLzmaEncProps; -+ -+void LzmaEncProps_Init(CLzmaEncProps *p); -+ -+/* ---------- CLzmaEncHandle Interface ---------- */ -+ -+/* LzmaEnc_* functions can return the following exit codes: -+Returns: -+ SZ_OK - OK -+ SZ_ERROR_MEM - Memory allocation error -+ SZ_ERROR_PARAM - Incorrect paramater in props -+ SZ_ERROR_WRITE - Write callback error. -+ SZ_ERROR_PROGRESS - some break from progress callback -+ SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -+*/ -+ -+typedef void * CLzmaEncHandle; -+ -+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc); -+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig); -+SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); -+SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); -+SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -+ int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif ---- /dev/null -+++ b/include/linux/lzma/Types.h -@@ -0,0 +1,226 @@ -+/* Types.h -- Basic types -+2009-11-23 : Igor Pavlov : Public domain */ -+ -+#ifndef __7Z_TYPES_H -+#define __7Z_TYPES_H -+ -+#include -+ -+#ifdef _WIN32 -+#include -+#endif -+ -+#ifndef EXTERN_C_BEGIN -+#ifdef __cplusplus -+#define EXTERN_C_BEGIN extern "C" { -+#define EXTERN_C_END } -+#else -+#define EXTERN_C_BEGIN -+#define EXTERN_C_END -+#endif -+#endif -+ -+EXTERN_C_BEGIN -+ -+#define SZ_OK 0 -+ -+#define SZ_ERROR_DATA 1 -+#define SZ_ERROR_MEM 2 -+#define SZ_ERROR_CRC 3 -+#define SZ_ERROR_UNSUPPORTED 4 -+#define SZ_ERROR_PARAM 5 -+#define SZ_ERROR_INPUT_EOF 6 -+#define SZ_ERROR_OUTPUT_EOF 7 -+#define SZ_ERROR_READ 8 -+#define SZ_ERROR_WRITE 9 -+#define SZ_ERROR_PROGRESS 10 -+#define SZ_ERROR_FAIL 11 -+#define SZ_ERROR_THREAD 12 -+ -+#define SZ_ERROR_ARCHIVE 16 -+#define SZ_ERROR_NO_ARCHIVE 17 -+ -+typedef int SRes; -+ -+#ifdef _WIN32 -+typedef DWORD WRes; -+#else -+typedef int WRes; -+#endif -+ -+#ifndef RINOK -+#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } -+#endif -+ -+typedef unsigned char Byte; -+typedef short Int16; -+typedef unsigned short UInt16; -+ -+#ifdef _LZMA_UINT32_IS_ULONG -+typedef long Int32; -+typedef unsigned long UInt32; -+#else -+typedef int Int32; -+typedef unsigned int UInt32; -+#endif -+ -+#ifdef _SZ_NO_INT_64 -+ -+/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. -+ NOTES: Some code will work incorrectly in that case! */ -+ -+typedef long Int64; -+typedef unsigned long UInt64; -+ -+#else -+ -+#if defined(_MSC_VER) || defined(__BORLANDC__) -+typedef __int64 Int64; -+typedef unsigned __int64 UInt64; -+#else -+typedef long long int Int64; -+typedef unsigned long long int UInt64; -+#endif -+ -+#endif -+ -+#ifdef _LZMA_NO_SYSTEM_SIZE_T -+typedef UInt32 SizeT; -+#else -+typedef size_t SizeT; -+#endif -+ -+typedef int Bool; -+#define True 1 -+#define False 0 -+ -+ -+#ifdef _WIN32 -+#define MY_STD_CALL __stdcall -+#else -+#define MY_STD_CALL -+#endif -+ -+#ifdef _MSC_VER -+ -+#if _MSC_VER >= 1300 -+#define MY_NO_INLINE __declspec(noinline) -+#else -+#define MY_NO_INLINE -+#endif -+ -+#define MY_CDECL __cdecl -+#define MY_FAST_CALL __fastcall -+ -+#else -+ -+#define MY_CDECL -+#define MY_FAST_CALL -+ -+#endif -+ -+ -+/* The following interfaces use first parameter as pointer to structure */ -+ -+typedef struct -+{ -+ SRes (*Read)(void *p, void *buf, size_t *size); -+ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. -+ (output(*size) < input(*size)) is allowed */ -+} ISeqInStream; -+ -+/* it can return SZ_ERROR_INPUT_EOF */ -+SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size); -+SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType); -+SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf); -+ -+typedef struct -+{ -+ size_t (*Write)(void *p, const void *buf, size_t size); -+ /* Returns: result - the number of actually written bytes. -+ (result < size) means error */ -+} ISeqOutStream; -+ -+typedef enum -+{ -+ SZ_SEEK_SET = 0, -+ SZ_SEEK_CUR = 1, -+ SZ_SEEK_END = 2 -+} ESzSeek; -+ -+typedef struct -+{ -+ SRes (*Read)(void *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ -+ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); -+} ISeekInStream; -+ -+typedef struct -+{ -+ SRes (*Look)(void *p, void **buf, size_t *size); -+ /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. -+ (output(*size) > input(*size)) is not allowed -+ (output(*size) < input(*size)) is allowed */ -+ SRes (*Skip)(void *p, size_t offset); -+ /* offset must be <= output(*size) of Look */ -+ -+ SRes (*Read)(void *p, void *buf, size_t *size); -+ /* reads directly (without buffer). It's same as ISeqInStream::Read */ -+ SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin); -+} ILookInStream; -+ -+SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size); -+SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset); -+ -+/* reads via ILookInStream::Read */ -+SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType); -+SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size); -+ -+#define LookToRead_BUF_SIZE (1 << 14) -+ -+typedef struct -+{ -+ ILookInStream s; -+ ISeekInStream *realStream; -+ size_t pos; -+ size_t size; -+ Byte buf[LookToRead_BUF_SIZE]; -+} CLookToRead; -+ -+void LookToRead_CreateVTable(CLookToRead *p, int lookahead); -+void LookToRead_Init(CLookToRead *p); -+ -+typedef struct -+{ -+ ISeqInStream s; -+ ILookInStream *realStream; -+} CSecToLook; -+ -+void SecToLook_CreateVTable(CSecToLook *p); -+ -+typedef struct -+{ -+ ISeqInStream s; -+ ILookInStream *realStream; -+} CSecToRead; -+ -+void SecToRead_CreateVTable(CSecToRead *p); -+ -+typedef struct -+{ -+ SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize); -+ /* Returns: result. (result != SZ_OK) means break. -+ Value (UInt64)(Int64)-1 for size means unknown value. */ -+} ICompressProgress; -+ -+typedef struct -+{ -+ void *(*Alloc)(void *p, size_t size); -+ void (*Free)(void *p, void *address); /* address can be 0 */ -+} ISzAlloc; -+ -+#define IAlloc_Alloc(p, size) (p)->Alloc((p), size) -+#define IAlloc_Free(p, a) (p)->Free((p), a) -+ -+EXTERN_C_END -+ -+#endif ---- a/include/uapi/linux/jffs2.h -+++ b/include/uapi/linux/jffs2.h -@@ -46,6 +46,7 @@ - #define JFFS2_COMPR_DYNRUBIN 0x05 - #define JFFS2_COMPR_ZLIB 0x06 - #define JFFS2_COMPR_LZO 0x07 -+#define JFFS2_COMPR_LZMA 0x08 - /* Compatibility flags. */ - #define JFFS2_COMPAT_MASK 0xc000 /* What do to if an unknown nodetype is found */ - #define JFFS2_NODE_ACCURATE 0x2000 ---- a/lib/Kconfig -+++ b/lib/Kconfig -@@ -346,6 +346,12 @@ config ZSTD_DECOMPRESS - - source "lib/xz/Kconfig" - -+config LZMA_COMPRESS -+ tristate -+ -+config LZMA_DECOMPRESS -+ tristate -+ - # - # These all provide a common interface (hence the apparent duplication with - # ZLIB_INFLATE; DECOMPRESS_GZIP is just a wrapper.) ---- a/lib/Makefile -+++ b/lib/Makefile -@@ -136,6 +136,16 @@ CFLAGS_kobject.o += -DDEBUG - CFLAGS_kobject_uevent.o += -DDEBUG - endif - -+ifdef CONFIG_JFFS2_ZLIB -+ CONFIG_ZLIB_INFLATE:=y -+ CONFIG_ZLIB_DEFLATE:=y -+endif -+ -+ifdef CONFIG_JFFS2_LZMA -+ CONFIG_LZMA_DECOMPRESS:=y -+ CONFIG_LZMA_COMPRESS:=y -+endif -+ - obj-$(CONFIG_DEBUG_INFO_REDUCED) += debug_info.o - CFLAGS_debug_info.o += $(call cc-option, -femit-struct-debug-detailed=any) - -@@ -194,6 +204,8 @@ obj-$(CONFIG_ZSTD_COMPRESS) += zstd/ - obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd/ - obj-$(CONFIG_XZ_DEC) += xz/ - obj-$(CONFIG_RAID6_PQ) += raid6/ -+obj-$(CONFIG_LZMA_COMPRESS) += lzma/ -+obj-$(CONFIG_LZMA_DECOMPRESS) += lzma/ - - lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o - lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o ---- /dev/null -+++ b/lib/lzma/LzFind.c -@@ -0,0 +1,522 @@ -+/* LzFind.c -- Match finder for LZ algorithms -+2009-04-22 : Igor Pavlov : Public domain */ -+ -+#include -+ -+#include "LzFind.h" -+#include "LzHash.h" -+ -+#define kEmptyHashValue 0 -+#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) -+#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ -+#define kNormalizeMask (~(kNormalizeStepMin - 1)) -+#define kMaxHistorySize ((UInt32)3 << 30) -+ -+#define kStartMaxLen 3 -+ -+#if 0 -+#define DIRECT_INPUT p->directInput -+#else -+#define DIRECT_INPUT 1 -+#endif -+ -+static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc) -+{ -+ if (!DIRECT_INPUT) -+ { -+ alloc->Free(alloc, p->bufferBase); -+ p->bufferBase = 0; -+ } -+} -+ -+/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ -+ -+static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc) -+{ -+ UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; -+ if (DIRECT_INPUT) -+ { -+ p->blockSize = blockSize; -+ return 1; -+ } -+ if (p->bufferBase == 0 || p->blockSize != blockSize) -+ { -+ LzInWindow_Free(p, alloc); -+ p->blockSize = blockSize; -+ p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize); -+ } -+ return (p->bufferBase != 0); -+} -+ -+static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } -+static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; } -+ -+static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } -+ -+static void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) -+{ -+ p->posLimit -= subValue; -+ p->pos -= subValue; -+ p->streamPos -= subValue; -+} -+ -+static void MatchFinder_ReadBlock(CMatchFinder *p) -+{ -+ if (p->streamEndWasReached || p->result != SZ_OK) -+ return; -+ if (DIRECT_INPUT) -+ { -+ UInt32 curSize = 0xFFFFFFFF - p->streamPos; -+ if (curSize > p->directInputRem) -+ curSize = (UInt32)p->directInputRem; -+ p->directInputRem -= curSize; -+ p->streamPos += curSize; -+ if (p->directInputRem == 0) -+ p->streamEndWasReached = 1; -+ return; -+ } -+ for (;;) -+ { -+ Byte *dest = p->buffer + (p->streamPos - p->pos); -+ size_t size = (p->bufferBase + p->blockSize - dest); -+ if (size == 0) -+ return; -+ p->result = p->stream->Read(p->stream, dest, &size); -+ if (p->result != SZ_OK) -+ return; -+ if (size == 0) -+ { -+ p->streamEndWasReached = 1; -+ return; -+ } -+ p->streamPos += (UInt32)size; -+ if (p->streamPos - p->pos > p->keepSizeAfter) -+ return; -+ } -+} -+ -+static void MatchFinder_MoveBlock(CMatchFinder *p) -+{ -+ memmove(p->bufferBase, -+ p->buffer - p->keepSizeBefore, -+ (size_t)(p->streamPos - p->pos + p->keepSizeBefore)); -+ p->buffer = p->bufferBase + p->keepSizeBefore; -+} -+ -+static int MatchFinder_NeedMove(CMatchFinder *p) -+{ -+ if (DIRECT_INPUT) -+ return 0; -+ /* if (p->streamEndWasReached) return 0; */ -+ return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); -+} -+ -+static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) -+{ -+ if (MatchFinder_NeedMove(p)) -+ MatchFinder_MoveBlock(p); -+ MatchFinder_ReadBlock(p); -+} -+ -+static void MatchFinder_SetDefaultSettings(CMatchFinder *p) -+{ -+ p->cutValue = 32; -+ p->btMode = 1; -+ p->numHashBytes = 4; -+ p->bigHash = 0; -+} -+ -+#define kCrcPoly 0xEDB88320 -+ -+void MatchFinder_Construct(CMatchFinder *p) -+{ -+ UInt32 i; -+ p->bufferBase = 0; -+ p->directInput = 0; -+ p->hash = 0; -+ MatchFinder_SetDefaultSettings(p); -+ -+ for (i = 0; i < 256; i++) -+ { -+ UInt32 r = i; -+ int j; -+ for (j = 0; j < 8; j++) -+ r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1)); -+ p->crc[i] = r; -+ } -+} -+ -+static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->hash); -+ p->hash = 0; -+} -+ -+void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc) -+{ -+ MatchFinder_FreeThisClassMemory(p, alloc); -+ LzInWindow_Free(p, alloc); -+} -+ -+static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc) -+{ -+ size_t sizeInBytes = (size_t)num * sizeof(CLzRef); -+ if (sizeInBytes / sizeof(CLzRef) != num) -+ return 0; -+ return (CLzRef *)alloc->Alloc(alloc, sizeInBytes); -+} -+ -+int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, -+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, -+ ISzAlloc *alloc) -+{ -+ UInt32 sizeReserv; -+ if (historySize > kMaxHistorySize) -+ { -+ MatchFinder_Free(p, alloc); -+ return 0; -+ } -+ sizeReserv = historySize >> 1; -+ if (historySize > ((UInt32)2 << 30)) -+ sizeReserv = historySize >> 2; -+ sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); -+ -+ p->keepSizeBefore = historySize + keepAddBufferBefore + 1; -+ p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; -+ /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ -+ if (LzInWindow_Create(p, sizeReserv, alloc)) -+ { -+ UInt32 newCyclicBufferSize = historySize + 1; -+ UInt32 hs; -+ p->matchMaxLen = matchMaxLen; -+ { -+ p->fixedHashSize = 0; -+ if (p->numHashBytes == 2) -+ hs = (1 << 16) - 1; -+ else -+ { -+ hs = historySize - 1; -+ hs |= (hs >> 1); -+ hs |= (hs >> 2); -+ hs |= (hs >> 4); -+ hs |= (hs >> 8); -+ hs >>= 1; -+ hs |= 0xFFFF; /* don't change it! It's required for Deflate */ -+ if (hs > (1 << 24)) -+ { -+ if (p->numHashBytes == 3) -+ hs = (1 << 24) - 1; -+ else -+ hs >>= 1; -+ } -+ } -+ p->hashMask = hs; -+ hs++; -+ if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; -+ if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; -+ if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size; -+ hs += p->fixedHashSize; -+ } -+ -+ { -+ UInt32 prevSize = p->hashSizeSum + p->numSons; -+ UInt32 newSize; -+ p->historySize = historySize; -+ p->hashSizeSum = hs; -+ p->cyclicBufferSize = newCyclicBufferSize; -+ p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize); -+ newSize = p->hashSizeSum + p->numSons; -+ if (p->hash != 0 && prevSize == newSize) -+ return 1; -+ MatchFinder_FreeThisClassMemory(p, alloc); -+ p->hash = AllocRefs(newSize, alloc); -+ if (p->hash != 0) -+ { -+ p->son = p->hash + p->hashSizeSum; -+ return 1; -+ } -+ } -+ } -+ MatchFinder_Free(p, alloc); -+ return 0; -+} -+ -+static void MatchFinder_SetLimits(CMatchFinder *p) -+{ -+ UInt32 limit = kMaxValForNormalize - p->pos; -+ UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; -+ if (limit2 < limit) -+ limit = limit2; -+ limit2 = p->streamPos - p->pos; -+ if (limit2 <= p->keepSizeAfter) -+ { -+ if (limit2 > 0) -+ limit2 = 1; -+ } -+ else -+ limit2 -= p->keepSizeAfter; -+ if (limit2 < limit) -+ limit = limit2; -+ { -+ UInt32 lenLimit = p->streamPos - p->pos; -+ if (lenLimit > p->matchMaxLen) -+ lenLimit = p->matchMaxLen; -+ p->lenLimit = lenLimit; -+ } -+ p->posLimit = p->pos + limit; -+} -+ -+static void MatchFinder_Init(CMatchFinder *p) -+{ -+ UInt32 i; -+ for (i = 0; i < p->hashSizeSum; i++) -+ p->hash[i] = kEmptyHashValue; -+ p->cyclicBufferPos = 0; -+ p->buffer = p->bufferBase; -+ p->pos = p->streamPos = p->cyclicBufferSize; -+ p->result = SZ_OK; -+ p->streamEndWasReached = 0; -+ MatchFinder_ReadBlock(p); -+ MatchFinder_SetLimits(p); -+} -+ -+static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) -+{ -+ return (p->pos - p->historySize - 1) & kNormalizeMask; -+} -+ -+static void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems) -+{ -+ UInt32 i; -+ for (i = 0; i < numItems; i++) -+ { -+ UInt32 value = items[i]; -+ if (value <= subValue) -+ value = kEmptyHashValue; -+ else -+ value -= subValue; -+ items[i] = value; -+ } -+} -+ -+static void MatchFinder_Normalize(CMatchFinder *p) -+{ -+ UInt32 subValue = MatchFinder_GetSubValue(p); -+ MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons); -+ MatchFinder_ReduceOffsets(p, subValue); -+} -+ -+static void MatchFinder_CheckLimits(CMatchFinder *p) -+{ -+ if (p->pos == kMaxValForNormalize) -+ MatchFinder_Normalize(p); -+ if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) -+ MatchFinder_CheckAndMoveAndRead(p); -+ if (p->cyclicBufferPos == p->cyclicBufferSize) -+ p->cyclicBufferPos = 0; -+ MatchFinder_SetLimits(p); -+} -+ -+static UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, -+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, -+ UInt32 *distances, UInt32 maxLen) -+{ -+ CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; -+ CLzRef *ptr1 = son + (_cyclicBufferPos << 1); -+ UInt32 len0 = 0, len1 = 0; -+ for (;;) -+ { -+ UInt32 delta = pos - curMatch; -+ if (cutValue-- == 0 || delta >= _cyclicBufferSize) -+ { -+ *ptr0 = *ptr1 = kEmptyHashValue; -+ return distances; -+ } -+ { -+ CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); -+ const Byte *pb = cur - delta; -+ UInt32 len = (len0 < len1 ? len0 : len1); -+ if (pb[len] == cur[len]) -+ { -+ if (++len != lenLimit && pb[len] == cur[len]) -+ while (++len != lenLimit) -+ if (pb[len] != cur[len]) -+ break; -+ if (maxLen < len) -+ { -+ *distances++ = maxLen = len; -+ *distances++ = delta - 1; -+ if (len == lenLimit) -+ { -+ *ptr1 = pair[0]; -+ *ptr0 = pair[1]; -+ return distances; -+ } -+ } -+ } -+ if (pb[len] < cur[len]) -+ { -+ *ptr1 = curMatch; -+ ptr1 = pair + 1; -+ curMatch = *ptr1; -+ len1 = len; -+ } -+ else -+ { -+ *ptr0 = curMatch; -+ ptr0 = pair; -+ curMatch = *ptr0; -+ len0 = len; -+ } -+ } -+ } -+} -+ -+static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, -+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) -+{ -+ CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1; -+ CLzRef *ptr1 = son + (_cyclicBufferPos << 1); -+ UInt32 len0 = 0, len1 = 0; -+ for (;;) -+ { -+ UInt32 delta = pos - curMatch; -+ if (cutValue-- == 0 || delta >= _cyclicBufferSize) -+ { -+ *ptr0 = *ptr1 = kEmptyHashValue; -+ return; -+ } -+ { -+ CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); -+ const Byte *pb = cur - delta; -+ UInt32 len = (len0 < len1 ? len0 : len1); -+ if (pb[len] == cur[len]) -+ { -+ while (++len != lenLimit) -+ if (pb[len] != cur[len]) -+ break; -+ { -+ if (len == lenLimit) -+ { -+ *ptr1 = pair[0]; -+ *ptr0 = pair[1]; -+ return; -+ } -+ } -+ } -+ if (pb[len] < cur[len]) -+ { -+ *ptr1 = curMatch; -+ ptr1 = pair + 1; -+ curMatch = *ptr1; -+ len1 = len; -+ } -+ else -+ { -+ *ptr0 = curMatch; -+ ptr0 = pair; -+ curMatch = *ptr0; -+ len0 = len; -+ } -+ } -+ } -+} -+ -+#define MOVE_POS \ -+ ++p->cyclicBufferPos; \ -+ p->buffer++; \ -+ if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); -+ -+static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } -+ -+#define MOVE_POS_RET MatchFinder_MovePos(p); return offset; -+ -+#define GET_MATCHES_HEADER2(minLen, ret_op) \ -+ UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \ -+ lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ -+ cur = p->buffer; -+ -+#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) -+#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) -+ -+#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue -+ -+#define GET_MATCHES_FOOTER(offset, maxLen) \ -+ offset = (UInt32)(GetMatchesSpec1(lenLimit, curMatch, MF_PARAMS(p), \ -+ distances + offset, maxLen) - distances); MOVE_POS_RET; -+ -+#define SKIP_FOOTER \ -+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MatchFinder_MovePos(p); -+ -+static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -+{ -+ UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset; -+ GET_MATCHES_HEADER(4) -+ -+ HASH4_CALC; -+ -+ delta2 = p->pos - p->hash[ hash2Value]; -+ delta3 = p->pos - p->hash[kFix3HashSize + hash3Value]; -+ curMatch = p->hash[kFix4HashSize + hashValue]; -+ -+ p->hash[ hash2Value] = -+ p->hash[kFix3HashSize + hash3Value] = -+ p->hash[kFix4HashSize + hashValue] = p->pos; -+ -+ maxLen = 1; -+ offset = 0; -+ if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur) -+ { -+ distances[0] = maxLen = 2; -+ distances[1] = delta2 - 1; -+ offset = 2; -+ } -+ if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur) -+ { -+ maxLen = 3; -+ distances[offset + 1] = delta3 - 1; -+ offset += 2; -+ delta2 = delta3; -+ } -+ if (offset != 0) -+ { -+ for (; maxLen != lenLimit; maxLen++) -+ if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen]) -+ break; -+ distances[offset - 2] = maxLen; -+ if (maxLen == lenLimit) -+ { -+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); -+ MOVE_POS_RET; -+ } -+ } -+ if (maxLen < 3) -+ maxLen = 3; -+ GET_MATCHES_FOOTER(offset, maxLen) -+} -+ -+static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -+{ -+ do -+ { -+ UInt32 hash2Value, hash3Value; -+ SKIP_HEADER(4) -+ HASH4_CALC; -+ curMatch = p->hash[kFix4HashSize + hashValue]; -+ p->hash[ hash2Value] = -+ p->hash[kFix3HashSize + hash3Value] = p->pos; -+ p->hash[kFix4HashSize + hashValue] = p->pos; -+ SKIP_FOOTER -+ } -+ while (--num != 0); -+} -+ -+void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) -+{ -+ vTable->Init = (Mf_Init_Func)MatchFinder_Init; -+ vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte; -+ vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; -+ vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; -+ vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; -+ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; -+} ---- /dev/null -+++ b/lib/lzma/LzmaDec.c -@@ -0,0 +1,925 @@ -+/* LzmaDec.c -- LZMA Decoder -+2009-09-20 : Igor Pavlov : Public domain */ -+ -+#include "LzmaDec.h" -+ -+#include -+ -+#define kNumTopBits 24 -+#define kTopValue ((UInt32)1 << kNumTopBits) -+ -+#define kNumBitModelTotalBits 11 -+#define kBitModelTotal (1 << kNumBitModelTotalBits) -+#define kNumMoveBits 5 -+ -+#define RC_INIT_SIZE 5 -+ -+#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } -+ -+#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) -+#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); -+#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); -+#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ -+ { UPDATE_0(p); i = (i + i); A0; } else \ -+ { UPDATE_1(p); i = (i + i) + 1; A1; } -+#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;) -+ -+#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); } -+#define TREE_DECODE(probs, limit, i) \ -+ { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } -+ -+/* #define _LZMA_SIZE_OPT */ -+ -+#ifdef _LZMA_SIZE_OPT -+#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) -+#else -+#define TREE_6_DECODE(probs, i) \ -+ { i = 1; \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ TREE_GET_BIT(probs, i); \ -+ i -= 0x40; } -+#endif -+ -+#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); } -+ -+#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound) -+#define UPDATE_0_CHECK range = bound; -+#define UPDATE_1_CHECK range -= bound; code -= bound; -+#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ -+ { UPDATE_0_CHECK; i = (i + i); A0; } else \ -+ { UPDATE_1_CHECK; i = (i + i) + 1; A1; } -+#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) -+#define TREE_DECODE_CHECK(probs, limit, i) \ -+ { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } -+ -+ -+#define kNumPosBitsMax 4 -+#define kNumPosStatesMax (1 << kNumPosBitsMax) -+ -+#define kLenNumLowBits 3 -+#define kLenNumLowSymbols (1 << kLenNumLowBits) -+#define kLenNumMidBits 3 -+#define kLenNumMidSymbols (1 << kLenNumMidBits) -+#define kLenNumHighBits 8 -+#define kLenNumHighSymbols (1 << kLenNumHighBits) -+ -+#define LenChoice 0 -+#define LenChoice2 (LenChoice + 1) -+#define LenLow (LenChoice2 + 1) -+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits)) -+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits)) -+#define kNumLenProbs (LenHigh + kLenNumHighSymbols) -+ -+ -+#define kNumStates 12 -+#define kNumLitStates 7 -+ -+#define kStartPosModelIndex 4 -+#define kEndPosModelIndex 14 -+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) -+ -+#define kNumPosSlotBits 6 -+#define kNumLenToPosStates 4 -+ -+#define kNumAlignBits 4 -+#define kAlignTableSize (1 << kNumAlignBits) -+ -+#define kMatchMinLen 2 -+#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) -+ -+#define IsMatch 0 -+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax)) -+#define IsRepG0 (IsRep + kNumStates) -+#define IsRepG1 (IsRepG0 + kNumStates) -+#define IsRepG2 (IsRepG1 + kNumStates) -+#define IsRep0Long (IsRepG2 + kNumStates) -+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax)) -+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) -+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex) -+#define LenCoder (Align + kAlignTableSize) -+#define RepLenCoder (LenCoder + kNumLenProbs) -+#define Literal (RepLenCoder + kNumLenProbs) -+ -+#define LZMA_BASE_SIZE 1846 -+#define LZMA_LIT_SIZE 768 -+ -+#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) -+ -+#if Literal != LZMA_BASE_SIZE -+StopCompilingDueBUG -+#endif -+ -+#define LZMA_DIC_MIN (1 << 12) -+ -+/* First LZMA-symbol is always decoded. -+And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization -+Out: -+ Result: -+ SZ_OK - OK -+ SZ_ERROR_DATA - Error -+ p->remainLen: -+ < kMatchSpecLenStart : normal remain -+ = kMatchSpecLenStart : finished -+ = kMatchSpecLenStart + 1 : Flush marker -+ = kMatchSpecLenStart + 2 : State Init Marker -+*/ -+ -+static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -+{ -+ CLzmaProb *probs = p->probs; -+ -+ unsigned state = p->state; -+ UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; -+ unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; -+ unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1; -+ unsigned lc = p->prop.lc; -+ -+ Byte *dic = p->dic; -+ SizeT dicBufSize = p->dicBufSize; -+ SizeT dicPos = p->dicPos; -+ -+ UInt32 processedPos = p->processedPos; -+ UInt32 checkDicSize = p->checkDicSize; -+ unsigned len = 0; -+ -+ const Byte *buf = p->buf; -+ UInt32 range = p->range; -+ UInt32 code = p->code; -+ -+ do -+ { -+ CLzmaProb *prob; -+ UInt32 bound; -+ unsigned ttt; -+ unsigned posState = processedPos & pbMask; -+ -+ prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0(prob) -+ { -+ unsigned symbol; -+ UPDATE_0(prob); -+ prob = probs + Literal; -+ if (checkDicSize != 0 || processedPos != 0) -+ prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) + -+ (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc)))); -+ -+ if (state < kNumLitStates) -+ { -+ state -= (state < 4) ? state : 3; -+ symbol = 1; -+ do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100); -+ } -+ else -+ { -+ unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; -+ unsigned offs = 0x100; -+ state -= (state < 10) ? 3 : 6; -+ symbol = 1; -+ do -+ { -+ unsigned bit; -+ CLzmaProb *probLit; -+ matchByte <<= 1; -+ bit = (matchByte & offs); -+ probLit = prob + offs + bit + symbol; -+ GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit) -+ } -+ while (symbol < 0x100); -+ } -+ dic[dicPos++] = (Byte)symbol; -+ processedPos++; -+ continue; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ prob = probs + IsRep + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ state += kNumStates; -+ prob = probs + LenCoder; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ if (checkDicSize == 0 && processedPos == 0) -+ return SZ_ERROR_DATA; -+ prob = probs + IsRepG0 + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; -+ dicPos++; -+ processedPos++; -+ state = state < kNumLitStates ? 9 : 11; -+ continue; -+ } -+ UPDATE_1(prob); -+ } -+ else -+ { -+ UInt32 distance; -+ UPDATE_1(prob); -+ prob = probs + IsRepG1 + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ distance = rep1; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ prob = probs + IsRepG2 + state; -+ IF_BIT_0(prob) -+ { -+ UPDATE_0(prob); -+ distance = rep2; -+ } -+ else -+ { -+ UPDATE_1(prob); -+ distance = rep3; -+ rep3 = rep2; -+ } -+ rep2 = rep1; -+ } -+ rep1 = rep0; -+ rep0 = distance; -+ } -+ state = state < kNumLitStates ? 8 : 11; -+ prob = probs + RepLenCoder; -+ } -+ { -+ unsigned limit, offset; -+ CLzmaProb *probLen = prob + LenChoice; -+ IF_BIT_0(probLen) -+ { -+ UPDATE_0(probLen); -+ probLen = prob + LenLow + (posState << kLenNumLowBits); -+ offset = 0; -+ limit = (1 << kLenNumLowBits); -+ } -+ else -+ { -+ UPDATE_1(probLen); -+ probLen = prob + LenChoice2; -+ IF_BIT_0(probLen) -+ { -+ UPDATE_0(probLen); -+ probLen = prob + LenMid + (posState << kLenNumMidBits); -+ offset = kLenNumLowSymbols; -+ limit = (1 << kLenNumMidBits); -+ } -+ else -+ { -+ UPDATE_1(probLen); -+ probLen = prob + LenHigh; -+ offset = kLenNumLowSymbols + kLenNumMidSymbols; -+ limit = (1 << kLenNumHighBits); -+ } -+ } -+ TREE_DECODE(probLen, limit, len); -+ len += offset; -+ } -+ -+ if (state >= kNumStates) -+ { -+ UInt32 distance; -+ prob = probs + PosSlot + -+ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); -+ TREE_6_DECODE(prob, distance); -+ if (distance >= kStartPosModelIndex) -+ { -+ unsigned posSlot = (unsigned)distance; -+ int numDirectBits = (int)(((distance >> 1) - 1)); -+ distance = (2 | (distance & 1)); -+ if (posSlot < kEndPosModelIndex) -+ { -+ distance <<= numDirectBits; -+ prob = probs + SpecPos + distance - posSlot - 1; -+ { -+ UInt32 mask = 1; -+ unsigned i = 1; -+ do -+ { -+ GET_BIT2(prob + i, i, ; , distance |= mask); -+ mask <<= 1; -+ } -+ while (--numDirectBits != 0); -+ } -+ } -+ else -+ { -+ numDirectBits -= kNumAlignBits; -+ do -+ { -+ NORMALIZE -+ range >>= 1; -+ -+ { -+ UInt32 t; -+ code -= range; -+ t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ -+ distance = (distance << 1) + (t + 1); -+ code += range & t; -+ } -+ /* -+ distance <<= 1; -+ if (code >= range) -+ { -+ code -= range; -+ distance |= 1; -+ } -+ */ -+ } -+ while (--numDirectBits != 0); -+ prob = probs + Align; -+ distance <<= kNumAlignBits; -+ { -+ unsigned i = 1; -+ GET_BIT2(prob + i, i, ; , distance |= 1); -+ GET_BIT2(prob + i, i, ; , distance |= 2); -+ GET_BIT2(prob + i, i, ; , distance |= 4); -+ GET_BIT2(prob + i, i, ; , distance |= 8); -+ } -+ if (distance == (UInt32)0xFFFFFFFF) -+ { -+ len += kMatchSpecLenStart; -+ state -= kNumStates; -+ break; -+ } -+ } -+ } -+ rep3 = rep2; -+ rep2 = rep1; -+ rep1 = rep0; -+ rep0 = distance + 1; -+ if (checkDicSize == 0) -+ { -+ if (distance >= processedPos) -+ return SZ_ERROR_DATA; -+ } -+ else if (distance >= checkDicSize) -+ return SZ_ERROR_DATA; -+ state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; -+ } -+ -+ len += kMatchMinLen; -+ -+ if (limit == dicPos) -+ return SZ_ERROR_DATA; -+ { -+ SizeT rem = limit - dicPos; -+ unsigned curLen = ((rem < len) ? (unsigned)rem : len); -+ SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0); -+ -+ processedPos += curLen; -+ -+ len -= curLen; -+ if (pos + curLen <= dicBufSize) -+ { -+ Byte *dest = dic + dicPos; -+ ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; -+ const Byte *lim = dest + curLen; -+ dicPos += curLen; -+ do -+ *(dest) = (Byte)*(dest + src); -+ while (++dest != lim); -+ } -+ else -+ { -+ do -+ { -+ dic[dicPos++] = dic[pos]; -+ if (++pos == dicBufSize) -+ pos = 0; -+ } -+ while (--curLen != 0); -+ } -+ } -+ } -+ } -+ while (dicPos < limit && buf < bufLimit); -+ NORMALIZE; -+ p->buf = buf; -+ p->range = range; -+ p->code = code; -+ p->remainLen = len; -+ p->dicPos = dicPos; -+ p->processedPos = processedPos; -+ p->reps[0] = rep0; -+ p->reps[1] = rep1; -+ p->reps[2] = rep2; -+ p->reps[3] = rep3; -+ p->state = state; -+ -+ return SZ_OK; -+} -+ -+static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) -+{ -+ if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart) -+ { -+ Byte *dic = p->dic; -+ SizeT dicPos = p->dicPos; -+ SizeT dicBufSize = p->dicBufSize; -+ unsigned len = p->remainLen; -+ UInt32 rep0 = p->reps[0]; -+ if (limit - dicPos < len) -+ len = (unsigned)(limit - dicPos); -+ -+ if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) -+ p->checkDicSize = p->prop.dicSize; -+ -+ p->processedPos += len; -+ p->remainLen -= len; -+ while (len-- != 0) -+ { -+ dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)]; -+ dicPos++; -+ } -+ p->dicPos = dicPos; -+ } -+} -+ -+static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -+{ -+ do -+ { -+ SizeT limit2 = limit; -+ if (p->checkDicSize == 0) -+ { -+ UInt32 rem = p->prop.dicSize - p->processedPos; -+ if (limit - p->dicPos > rem) -+ limit2 = p->dicPos + rem; -+ } -+ RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit)); -+ if (p->processedPos >= p->prop.dicSize) -+ p->checkDicSize = p->prop.dicSize; -+ LzmaDec_WriteRem(p, limit); -+ } -+ while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart); -+ -+ if (p->remainLen > kMatchSpecLenStart) -+ { -+ p->remainLen = kMatchSpecLenStart; -+ } -+ return 0; -+} -+ -+typedef enum -+{ -+ DUMMY_ERROR, /* unexpected end of input stream */ -+ DUMMY_LIT, -+ DUMMY_MATCH, -+ DUMMY_REP -+} ELzmaDummy; -+ -+static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize) -+{ -+ UInt32 range = p->range; -+ UInt32 code = p->code; -+ const Byte *bufLimit = buf + inSize; -+ CLzmaProb *probs = p->probs; -+ unsigned state = p->state; -+ ELzmaDummy res; -+ -+ { -+ CLzmaProb *prob; -+ UInt32 bound; -+ unsigned ttt; -+ unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1); -+ -+ prob = probs + IsMatch + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK -+ -+ /* if (bufLimit - buf >= 7) return DUMMY_LIT; */ -+ -+ prob = probs + Literal; -+ if (p->checkDicSize != 0 || p->processedPos != 0) -+ prob += (LZMA_LIT_SIZE * -+ ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) + -+ (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); -+ -+ if (state < kNumLitStates) -+ { -+ unsigned symbol = 1; -+ do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); -+ } -+ else -+ { -+ unsigned matchByte = p->dic[p->dicPos - p->reps[0] + -+ ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)]; -+ unsigned offs = 0x100; -+ unsigned symbol = 1; -+ do -+ { -+ unsigned bit; -+ CLzmaProb *probLit; -+ matchByte <<= 1; -+ bit = (matchByte & offs); -+ probLit = prob + offs + bit + symbol; -+ GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit) -+ } -+ while (symbol < 0x100); -+ } -+ res = DUMMY_LIT; -+ } -+ else -+ { -+ unsigned len; -+ UPDATE_1_CHECK; -+ -+ prob = probs + IsRep + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ state = 0; -+ prob = probs + LenCoder; -+ res = DUMMY_MATCH; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ res = DUMMY_REP; -+ prob = probs + IsRepG0 + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ NORMALIZE_CHECK; -+ return DUMMY_REP; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ } -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ prob = probs + IsRepG1 + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ prob = probs + IsRepG2 + state; -+ IF_BIT_0_CHECK(prob) -+ { -+ UPDATE_0_CHECK; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ } -+ } -+ } -+ state = kNumStates; -+ prob = probs + RepLenCoder; -+ } -+ { -+ unsigned limit, offset; -+ CLzmaProb *probLen = prob + LenChoice; -+ IF_BIT_0_CHECK(probLen) -+ { -+ UPDATE_0_CHECK; -+ probLen = prob + LenLow + (posState << kLenNumLowBits); -+ offset = 0; -+ limit = 1 << kLenNumLowBits; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ probLen = prob + LenChoice2; -+ IF_BIT_0_CHECK(probLen) -+ { -+ UPDATE_0_CHECK; -+ probLen = prob + LenMid + (posState << kLenNumMidBits); -+ offset = kLenNumLowSymbols; -+ limit = 1 << kLenNumMidBits; -+ } -+ else -+ { -+ UPDATE_1_CHECK; -+ probLen = prob + LenHigh; -+ offset = kLenNumLowSymbols + kLenNumMidSymbols; -+ limit = 1 << kLenNumHighBits; -+ } -+ } -+ TREE_DECODE_CHECK(probLen, limit, len); -+ len += offset; -+ } -+ -+ if (state < 4) -+ { -+ unsigned posSlot; -+ prob = probs + PosSlot + -+ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << -+ kNumPosSlotBits); -+ TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); -+ if (posSlot >= kStartPosModelIndex) -+ { -+ int numDirectBits = ((posSlot >> 1) - 1); -+ -+ /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */ -+ -+ if (posSlot < kEndPosModelIndex) -+ { -+ prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1; -+ } -+ else -+ { -+ numDirectBits -= kNumAlignBits; -+ do -+ { -+ NORMALIZE_CHECK -+ range >>= 1; -+ code -= range & (((code - range) >> 31) - 1); -+ /* if (code >= range) code -= range; */ -+ } -+ while (--numDirectBits != 0); -+ prob = probs + Align; -+ numDirectBits = kNumAlignBits; -+ } -+ { -+ unsigned i = 1; -+ do -+ { -+ GET_BIT_CHECK(prob + i, i); -+ } -+ while (--numDirectBits != 0); -+ } -+ } -+ } -+ } -+ } -+ NORMALIZE_CHECK; -+ return res; -+} -+ -+ -+static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data) -+{ -+ p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]); -+ p->range = 0xFFFFFFFF; -+ p->needFlush = 0; -+} -+ -+static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState) -+{ -+ p->needFlush = 1; -+ p->remainLen = 0; -+ p->tempBufSize = 0; -+ -+ if (initDic) -+ { -+ p->processedPos = 0; -+ p->checkDicSize = 0; -+ p->needInitState = 1; -+ } -+ if (initState) -+ p->needInitState = 1; -+} -+ -+static void LzmaDec_Init(CLzmaDec *p) -+{ -+ p->dicPos = 0; -+ LzmaDec_InitDicAndState(p, True, True); -+} -+ -+static void LzmaDec_InitStateReal(CLzmaDec *p) -+{ -+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp)); -+ UInt32 i; -+ CLzmaProb *probs = p->probs; -+ for (i = 0; i < numProbs; i++) -+ probs[i] = kBitModelTotal >> 1; -+ p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; -+ p->state = 0; -+ p->needInitState = 0; -+} -+ -+static SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, -+ ELzmaFinishMode finishMode, ELzmaStatus *status) -+{ -+ SizeT inSize = *srcLen; -+ (*srcLen) = 0; -+ LzmaDec_WriteRem(p, dicLimit); -+ -+ *status = LZMA_STATUS_NOT_SPECIFIED; -+ -+ while (p->remainLen != kMatchSpecLenStart) -+ { -+ int checkEndMarkNow; -+ -+ if (p->needFlush != 0) -+ { -+ for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) -+ p->tempBuf[p->tempBufSize++] = *src++; -+ if (p->tempBufSize < RC_INIT_SIZE) -+ { -+ *status = LZMA_STATUS_NEEDS_MORE_INPUT; -+ return SZ_OK; -+ } -+ if (p->tempBuf[0] != 0) -+ return SZ_ERROR_DATA; -+ -+ LzmaDec_InitRc(p, p->tempBuf); -+ p->tempBufSize = 0; -+ } -+ -+ checkEndMarkNow = 0; -+ if (p->dicPos >= dicLimit) -+ { -+ if (p->remainLen == 0 && p->code == 0) -+ { -+ *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; -+ return SZ_OK; -+ } -+ if (finishMode == LZMA_FINISH_ANY) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_OK; -+ } -+ if (p->remainLen != 0) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_ERROR_DATA; -+ } -+ checkEndMarkNow = 1; -+ } -+ -+ if (p->needInitState) -+ LzmaDec_InitStateReal(p); -+ -+ if (p->tempBufSize == 0) -+ { -+ SizeT processed; -+ const Byte *bufLimit; -+ if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) -+ { -+ int dummyRes = LzmaDec_TryDummy(p, src, inSize); -+ if (dummyRes == DUMMY_ERROR) -+ { -+ memcpy(p->tempBuf, src, inSize); -+ p->tempBufSize = (unsigned)inSize; -+ (*srcLen) += inSize; -+ *status = LZMA_STATUS_NEEDS_MORE_INPUT; -+ return SZ_OK; -+ } -+ if (checkEndMarkNow && dummyRes != DUMMY_MATCH) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_ERROR_DATA; -+ } -+ bufLimit = src; -+ } -+ else -+ bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; -+ p->buf = src; -+ if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0) -+ return SZ_ERROR_DATA; -+ processed = (SizeT)(p->buf - src); -+ (*srcLen) += processed; -+ src += processed; -+ inSize -= processed; -+ } -+ else -+ { -+ unsigned rem = p->tempBufSize, lookAhead = 0; -+ while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize) -+ p->tempBuf[rem++] = src[lookAhead++]; -+ p->tempBufSize = rem; -+ if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) -+ { -+ int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem); -+ if (dummyRes == DUMMY_ERROR) -+ { -+ (*srcLen) += lookAhead; -+ *status = LZMA_STATUS_NEEDS_MORE_INPUT; -+ return SZ_OK; -+ } -+ if (checkEndMarkNow && dummyRes != DUMMY_MATCH) -+ { -+ *status = LZMA_STATUS_NOT_FINISHED; -+ return SZ_ERROR_DATA; -+ } -+ } -+ p->buf = p->tempBuf; -+ if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0) -+ return SZ_ERROR_DATA; -+ lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf)); -+ (*srcLen) += lookAhead; -+ src += lookAhead; -+ inSize -= lookAhead; -+ p->tempBufSize = 0; -+ } -+ } -+ if (p->code == 0) -+ *status = LZMA_STATUS_FINISHED_WITH_MARK; -+ return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA; -+} -+ -+static void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->probs); -+ p->probs = 0; -+} -+ -+static SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) -+{ -+ UInt32 dicSize; -+ Byte d; -+ -+ if (size < LZMA_PROPS_SIZE) -+ return SZ_ERROR_UNSUPPORTED; -+ else -+ dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); -+ -+ if (dicSize < LZMA_DIC_MIN) -+ dicSize = LZMA_DIC_MIN; -+ p->dicSize = dicSize; -+ -+ d = data[0]; -+ if (d >= (9 * 5 * 5)) -+ return SZ_ERROR_UNSUPPORTED; -+ -+ p->lc = d % 9; -+ d /= 9; -+ p->pb = d / 5; -+ p->lp = d % 5; -+ -+ return SZ_OK; -+} -+ -+static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc) -+{ -+ UInt32 numProbs = LzmaProps_GetNumProbs(propNew); -+ if (p->probs == 0 || numProbs != p->numProbs) -+ { -+ LzmaDec_FreeProbs(p, alloc); -+ p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb)); -+ p->numProbs = numProbs; -+ if (p->probs == 0) -+ return SZ_ERROR_MEM; -+ } -+ return SZ_OK; -+} -+ -+static SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc) -+{ -+ CLzmaProps propNew; -+ RINOK(LzmaProps_Decode(&propNew, props, propsSize)); -+ RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); -+ p->prop = propNew; -+ return SZ_OK; -+} -+ -+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, -+ const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, -+ ELzmaStatus *status, ISzAlloc *alloc) -+{ -+ CLzmaDec p; -+ SRes res; -+ SizeT inSize = *srcLen; -+ SizeT outSize = *destLen; -+ *srcLen = *destLen = 0; -+ if (inSize < RC_INIT_SIZE) -+ return SZ_ERROR_INPUT_EOF; -+ -+ LzmaDec_Construct(&p); -+ res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc); -+ if (res != 0) -+ return res; -+ p.dic = dest; -+ p.dicBufSize = outSize; -+ -+ LzmaDec_Init(&p); -+ -+ *srcLen = inSize; -+ res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); -+ -+ if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) -+ res = SZ_ERROR_INPUT_EOF; -+ -+ (*destLen) = p.dicPos; -+ LzmaDec_FreeProbs(&p, alloc); -+ return res; -+} ---- /dev/null -+++ b/lib/lzma/LzmaEnc.c -@@ -0,0 +1,2123 @@ -+/* LzmaEnc.c -- LZMA Encoder -+2009-11-24 : Igor Pavlov : Public domain */ -+ -+#include -+ -+/* #define SHOW_STAT */ -+/* #define SHOW_STAT2 */ -+ -+#if defined(SHOW_STAT) || defined(SHOW_STAT2) -+#include -+#endif -+ -+#include "LzmaEnc.h" -+ -+/* disable MT */ -+#define _7ZIP_ST -+ -+#include "LzFind.h" -+#ifndef _7ZIP_ST -+#include "LzFindMt.h" -+#endif -+ -+#ifdef SHOW_STAT -+static int ttt = 0; -+#endif -+ -+#define kBlockSizeMax ((1 << LZMA_NUM_BLOCK_SIZE_BITS) - 1) -+ -+#define kBlockSize (9 << 10) -+#define kUnpackBlockSize (1 << 18) -+#define kMatchArraySize (1 << 21) -+#define kMatchRecordMaxSize ((LZMA_MATCH_LEN_MAX * 2 + 3) * LZMA_MATCH_LEN_MAX) -+ -+#define kNumMaxDirectBits (31) -+ -+#define kNumTopBits 24 -+#define kTopValue ((UInt32)1 << kNumTopBits) -+ -+#define kNumBitModelTotalBits 11 -+#define kBitModelTotal (1 << kNumBitModelTotalBits) -+#define kNumMoveBits 5 -+#define kProbInitValue (kBitModelTotal >> 1) -+ -+#define kNumMoveReducingBits 4 -+#define kNumBitPriceShiftBits 4 -+#define kBitPrice (1 << kNumBitPriceShiftBits) -+ -+void LzmaEncProps_Init(CLzmaEncProps *p) -+{ -+ p->level = 5; -+ p->dictSize = p->mc = 0; -+ p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; -+ p->writeEndMark = 0; -+} -+ -+static void LzmaEncProps_Normalize(CLzmaEncProps *p) -+{ -+ int level = p->level; -+ if (level < 0) level = 5; -+ p->level = level; -+ if (p->dictSize == 0) p->dictSize = (level <= 5 ? (1 << (level * 2 + 14)) : (level == 6 ? (1 << 25) : (1 << 26))); -+ if (p->lc < 0) p->lc = 3; -+ if (p->lp < 0) p->lp = 0; -+ if (p->pb < 0) p->pb = 2; -+ if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); -+ if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); -+ if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); -+ if (p->numHashBytes < 0) p->numHashBytes = 4; -+ if (p->mc == 0) p->mc = (16 + (p->fb >> 1)) >> (p->btMode ? 0 : 1); -+ if (p->numThreads < 0) -+ p->numThreads = -+ #ifndef _7ZIP_ST -+ ((p->btMode && p->algo) ? 2 : 1); -+ #else -+ 1; -+ #endif -+} -+ -+static UInt32 __maybe_unused LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) -+{ -+ CLzmaEncProps props = *props2; -+ LzmaEncProps_Normalize(&props); -+ return props.dictSize; -+} -+ -+/* #define LZMA_LOG_BSR */ -+/* Define it for Intel's CPU */ -+ -+ -+#ifdef LZMA_LOG_BSR -+ -+#define kDicLogSizeMaxCompress 30 -+ -+#define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); } -+ -+static UInt32 GetPosSlot1(UInt32 pos) -+{ -+ UInt32 res; -+ BSR2_RET(pos, res); -+ return res; -+} -+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -+#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } -+ -+#else -+ -+#define kNumLogBits (9 + (int)sizeof(size_t) / 2) -+#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) -+ -+static void LzmaEnc_FastPosInit(Byte *g_FastPos) -+{ -+ int c = 2, slotFast; -+ g_FastPos[0] = 0; -+ g_FastPos[1] = 1; -+ -+ for (slotFast = 2; slotFast < kNumLogBits * 2; slotFast++) -+ { -+ UInt32 k = (1 << ((slotFast >> 1) - 1)); -+ UInt32 j; -+ for (j = 0; j < k; j++, c++) -+ g_FastPos[c] = (Byte)slotFast; -+ } -+} -+ -+#define BSR2_RET(pos, res) { UInt32 i = 6 + ((kNumLogBits - 1) & \ -+ (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ -+ res = p->g_FastPos[pos >> i] + (i * 2); } -+/* -+#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ -+ p->g_FastPos[pos >> 6] + 12 : \ -+ p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } -+*/ -+ -+#define GetPosSlot1(pos) p->g_FastPos[pos] -+#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -+#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos]; else BSR2_RET(pos, res); } -+ -+#endif -+ -+ -+#define LZMA_NUM_REPS 4 -+ -+typedef unsigned CState; -+ -+typedef struct -+{ -+ UInt32 price; -+ -+ CState state; -+ int prev1IsChar; -+ int prev2; -+ -+ UInt32 posPrev2; -+ UInt32 backPrev2; -+ -+ UInt32 posPrev; -+ UInt32 backPrev; -+ UInt32 backs[LZMA_NUM_REPS]; -+} COptimal; -+ -+#define kNumOpts (1 << 12) -+ -+#define kNumLenToPosStates 4 -+#define kNumPosSlotBits 6 -+#define kDicLogSizeMin 0 -+#define kDicLogSizeMax 32 -+#define kDistTableSizeMax (kDicLogSizeMax * 2) -+ -+ -+#define kNumAlignBits 4 -+#define kAlignTableSize (1 << kNumAlignBits) -+#define kAlignMask (kAlignTableSize - 1) -+ -+#define kStartPosModelIndex 4 -+#define kEndPosModelIndex 14 -+#define kNumPosModels (kEndPosModelIndex - kStartPosModelIndex) -+ -+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) -+ -+#ifdef _LZMA_PROB32 -+#define CLzmaProb UInt32 -+#else -+#define CLzmaProb UInt16 -+#endif -+ -+#define LZMA_PB_MAX 4 -+#define LZMA_LC_MAX 8 -+#define LZMA_LP_MAX 4 -+ -+#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) -+ -+ -+#define kLenNumLowBits 3 -+#define kLenNumLowSymbols (1 << kLenNumLowBits) -+#define kLenNumMidBits 3 -+#define kLenNumMidSymbols (1 << kLenNumMidBits) -+#define kLenNumHighBits 8 -+#define kLenNumHighSymbols (1 << kLenNumHighBits) -+ -+#define kLenNumSymbolsTotal (kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols) -+ -+#define LZMA_MATCH_LEN_MIN 2 -+#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) -+ -+#define kNumStates 12 -+ -+typedef struct -+{ -+ CLzmaProb choice; -+ CLzmaProb choice2; -+ CLzmaProb low[LZMA_NUM_PB_STATES_MAX << kLenNumLowBits]; -+ CLzmaProb mid[LZMA_NUM_PB_STATES_MAX << kLenNumMidBits]; -+ CLzmaProb high[kLenNumHighSymbols]; -+} CLenEnc; -+ -+typedef struct -+{ -+ CLenEnc p; -+ UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; -+ UInt32 tableSize; -+ UInt32 counters[LZMA_NUM_PB_STATES_MAX]; -+} CLenPriceEnc; -+ -+typedef struct -+{ -+ UInt32 range; -+ Byte cache; -+ UInt64 low; -+ UInt64 cacheSize; -+ Byte *buf; -+ Byte *bufLim; -+ Byte *bufBase; -+ ISeqOutStream *outStream; -+ UInt64 processed; -+ SRes res; -+} CRangeEnc; -+ -+typedef struct -+{ -+ CLzmaProb *litProbs; -+ -+ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ CLzmaProb isRep[kNumStates]; -+ CLzmaProb isRepG0[kNumStates]; -+ CLzmaProb isRepG1[kNumStates]; -+ CLzmaProb isRepG2[kNumStates]; -+ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ -+ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; -+ CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; -+ CLzmaProb posAlignEncoder[1 << kNumAlignBits]; -+ -+ CLenPriceEnc lenEnc; -+ CLenPriceEnc repLenEnc; -+ -+ UInt32 reps[LZMA_NUM_REPS]; -+ UInt32 state; -+} CSaveState; -+ -+typedef struct -+{ -+ IMatchFinder matchFinder; -+ void *matchFinderObj; -+ -+ #ifndef _7ZIP_ST -+ Bool mtMode; -+ CMatchFinderMt matchFinderMt; -+ #endif -+ -+ CMatchFinder matchFinderBase; -+ -+ #ifndef _7ZIP_ST -+ Byte pad[128]; -+ #endif -+ -+ UInt32 optimumEndIndex; -+ UInt32 optimumCurrentIndex; -+ -+ UInt32 longestMatchLength; -+ UInt32 numPairs; -+ UInt32 numAvail; -+ COptimal opt[kNumOpts]; -+ -+ #ifndef LZMA_LOG_BSR -+ Byte g_FastPos[1 << kNumLogBits]; -+ #endif -+ -+ UInt32 ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; -+ UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; -+ UInt32 numFastBytes; -+ UInt32 additionalOffset; -+ UInt32 reps[LZMA_NUM_REPS]; -+ UInt32 state; -+ -+ UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; -+ UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; -+ UInt32 alignPrices[kAlignTableSize]; -+ UInt32 alignPriceCount; -+ -+ UInt32 distTableSize; -+ -+ unsigned lc, lp, pb; -+ unsigned lpMask, pbMask; -+ -+ CLzmaProb *litProbs; -+ -+ CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ CLzmaProb isRep[kNumStates]; -+ CLzmaProb isRepG0[kNumStates]; -+ CLzmaProb isRepG1[kNumStates]; -+ CLzmaProb isRepG2[kNumStates]; -+ CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; -+ -+ CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; -+ CLzmaProb posEncoders[kNumFullDistances - kEndPosModelIndex]; -+ CLzmaProb posAlignEncoder[1 << kNumAlignBits]; -+ -+ CLenPriceEnc lenEnc; -+ CLenPriceEnc repLenEnc; -+ -+ unsigned lclp; -+ -+ Bool fastMode; -+ -+ CRangeEnc rc; -+ -+ Bool writeEndMark; -+ UInt64 nowPos64; -+ UInt32 matchPriceCount; -+ Bool finished; -+ Bool multiThread; -+ -+ SRes result; -+ UInt32 dictSize; -+ UInt32 matchFinderCycles; -+ -+ int needInit; -+ -+ CSaveState saveState; -+} CLzmaEnc; -+ -+SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ CLzmaEncProps props = *props2; -+ LzmaEncProps_Normalize(&props); -+ -+ if (props.lc > LZMA_LC_MAX || props.lp > LZMA_LP_MAX || props.pb > LZMA_PB_MAX || -+ props.dictSize > (1 << kDicLogSizeMaxCompress) || props.dictSize > (1 << 30)) -+ return SZ_ERROR_PARAM; -+ p->dictSize = props.dictSize; -+ p->matchFinderCycles = props.mc; -+ { -+ unsigned fb = props.fb; -+ if (fb < 5) -+ fb = 5; -+ if (fb > LZMA_MATCH_LEN_MAX) -+ fb = LZMA_MATCH_LEN_MAX; -+ p->numFastBytes = fb; -+ } -+ p->lc = props.lc; -+ p->lp = props.lp; -+ p->pb = props.pb; -+ p->fastMode = (props.algo == 0); -+ p->matchFinderBase.btMode = props.btMode; -+ { -+ UInt32 numHashBytes = 4; -+ if (props.btMode) -+ { -+ if (props.numHashBytes < 2) -+ numHashBytes = 2; -+ else if (props.numHashBytes < 4) -+ numHashBytes = props.numHashBytes; -+ } -+ p->matchFinderBase.numHashBytes = numHashBytes; -+ } -+ -+ p->matchFinderBase.cutValue = props.mc; -+ -+ p->writeEndMark = props.writeEndMark; -+ -+ #ifndef _7ZIP_ST -+ /* -+ if (newMultiThread != _multiThread) -+ { -+ ReleaseMatchFinder(); -+ _multiThread = newMultiThread; -+ } -+ */ -+ p->multiThread = (props.numThreads > 1); -+ #endif -+ -+ return SZ_OK; -+} -+ -+static const int kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; -+static const int kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; -+static const int kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; -+static const int kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; -+ -+#define IsCharState(s) ((s) < 7) -+ -+#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) -+ -+#define kInfinityPrice (1 << 30) -+ -+static void RangeEnc_Construct(CRangeEnc *p) -+{ -+ p->outStream = 0; -+ p->bufBase = 0; -+} -+ -+#define RangeEnc_GetProcessed(p) ((p)->processed + ((p)->buf - (p)->bufBase) + (p)->cacheSize) -+ -+#define RC_BUF_SIZE (1 << 16) -+static int RangeEnc_Alloc(CRangeEnc *p, ISzAlloc *alloc) -+{ -+ if (p->bufBase == 0) -+ { -+ p->bufBase = (Byte *)alloc->Alloc(alloc, RC_BUF_SIZE); -+ if (p->bufBase == 0) -+ return 0; -+ p->bufLim = p->bufBase + RC_BUF_SIZE; -+ } -+ return 1; -+} -+ -+static void RangeEnc_Free(CRangeEnc *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->bufBase); -+ p->bufBase = 0; -+} -+ -+static void RangeEnc_Init(CRangeEnc *p) -+{ -+ /* Stream.Init(); */ -+ p->low = 0; -+ p->range = 0xFFFFFFFF; -+ p->cacheSize = 1; -+ p->cache = 0; -+ -+ p->buf = p->bufBase; -+ -+ p->processed = 0; -+ p->res = SZ_OK; -+} -+ -+static void RangeEnc_FlushStream(CRangeEnc *p) -+{ -+ size_t num; -+ if (p->res != SZ_OK) -+ return; -+ num = p->buf - p->bufBase; -+ if (num != p->outStream->Write(p->outStream, p->bufBase, num)) -+ p->res = SZ_ERROR_WRITE; -+ p->processed += num; -+ p->buf = p->bufBase; -+} -+ -+static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) -+{ -+ if ((UInt32)p->low < (UInt32)0xFF000000 || (int)(p->low >> 32) != 0) -+ { -+ Byte temp = p->cache; -+ do -+ { -+ Byte *buf = p->buf; -+ *buf++ = (Byte)(temp + (Byte)(p->low >> 32)); -+ p->buf = buf; -+ if (buf == p->bufLim) -+ RangeEnc_FlushStream(p); -+ temp = 0xFF; -+ } -+ while (--p->cacheSize != 0); -+ p->cache = (Byte)((UInt32)p->low >> 24); -+ } -+ p->cacheSize++; -+ p->low = (UInt32)p->low << 8; -+} -+ -+static void RangeEnc_FlushData(CRangeEnc *p) -+{ -+ int i; -+ for (i = 0; i < 5; i++) -+ RangeEnc_ShiftLow(p); -+} -+ -+static void RangeEnc_EncodeDirectBits(CRangeEnc *p, UInt32 value, int numBits) -+{ -+ do -+ { -+ p->range >>= 1; -+ p->low += p->range & (0 - ((value >> --numBits) & 1)); -+ if (p->range < kTopValue) -+ { -+ p->range <<= 8; -+ RangeEnc_ShiftLow(p); -+ } -+ } -+ while (numBits != 0); -+} -+ -+static void RangeEnc_EncodeBit(CRangeEnc *p, CLzmaProb *prob, UInt32 symbol) -+{ -+ UInt32 ttt = *prob; -+ UInt32 newBound = (p->range >> kNumBitModelTotalBits) * ttt; -+ if (symbol == 0) -+ { -+ p->range = newBound; -+ ttt += (kBitModelTotal - ttt) >> kNumMoveBits; -+ } -+ else -+ { -+ p->low += newBound; -+ p->range -= newBound; -+ ttt -= ttt >> kNumMoveBits; -+ } -+ *prob = (CLzmaProb)ttt; -+ if (p->range < kTopValue) -+ { -+ p->range <<= 8; -+ RangeEnc_ShiftLow(p); -+ } -+} -+ -+static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol) -+{ -+ symbol |= 0x100; -+ do -+ { -+ RangeEnc_EncodeBit(p, probs + (symbol >> 8), (symbol >> 7) & 1); -+ symbol <<= 1; -+ } -+ while (symbol < 0x10000); -+} -+ -+static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol, UInt32 matchByte) -+{ -+ UInt32 offs = 0x100; -+ symbol |= 0x100; -+ do -+ { -+ matchByte <<= 1; -+ RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (symbol >> 8)), (symbol >> 7) & 1); -+ symbol <<= 1; -+ offs &= ~(matchByte ^ symbol); -+ } -+ while (symbol < 0x10000); -+} -+ -+static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices) -+{ -+ UInt32 i; -+ for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits)) -+ { -+ const int kCyclesBits = kNumBitPriceShiftBits; -+ UInt32 w = i; -+ UInt32 bitCount = 0; -+ int j; -+ for (j = 0; j < kCyclesBits; j++) -+ { -+ w = w * w; -+ bitCount <<= 1; -+ while (w >= ((UInt32)1 << 16)) -+ { -+ w >>= 1; -+ bitCount++; -+ } -+ } -+ ProbPrices[i >> kNumMoveReducingBits] = ((kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); -+ } -+} -+ -+ -+#define GET_PRICE(prob, symbol) \ -+ p->ProbPrices[((prob) ^ (((-(int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; -+ -+#define GET_PRICEa(prob, symbol) \ -+ ProbPrices[((prob) ^ ((-((int)(symbol))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; -+ -+#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] -+#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] -+ -+#define GET_PRICE_0a(prob) ProbPrices[(prob) >> kNumMoveReducingBits] -+#define GET_PRICE_1a(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] -+ -+static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 symbol, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ symbol |= 0x100; -+ do -+ { -+ price += GET_PRICEa(probs[symbol >> 8], (symbol >> 7) & 1); -+ symbol <<= 1; -+ } -+ while (symbol < 0x10000); -+ return price; -+} -+ -+static UInt32 LitEnc_GetPriceMatched(const CLzmaProb *probs, UInt32 symbol, UInt32 matchByte, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ UInt32 offs = 0x100; -+ symbol |= 0x100; -+ do -+ { -+ matchByte <<= 1; -+ price += GET_PRICEa(probs[offs + (matchByte & offs) + (symbol >> 8)], (symbol >> 7) & 1); -+ symbol <<= 1; -+ offs &= ~(matchByte ^ symbol); -+ } -+ while (symbol < 0x10000); -+ return price; -+} -+ -+ -+static void RcTree_Encode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) -+{ -+ UInt32 m = 1; -+ int i; -+ for (i = numBitLevels; i != 0;) -+ { -+ UInt32 bit; -+ i--; -+ bit = (symbol >> i) & 1; -+ RangeEnc_EncodeBit(rc, probs + m, bit); -+ m = (m << 1) | bit; -+ } -+} -+ -+static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, int numBitLevels, UInt32 symbol) -+{ -+ UInt32 m = 1; -+ int i; -+ for (i = 0; i < numBitLevels; i++) -+ { -+ UInt32 bit = symbol & 1; -+ RangeEnc_EncodeBit(rc, probs + m, bit); -+ m = (m << 1) | bit; -+ symbol >>= 1; -+ } -+} -+ -+static UInt32 RcTree_GetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ symbol |= (1 << numBitLevels); -+ while (symbol != 1) -+ { -+ price += GET_PRICEa(probs[symbol >> 1], symbol & 1); -+ symbol >>= 1; -+ } -+ return price; -+} -+ -+static UInt32 RcTree_ReverseGetPrice(const CLzmaProb *probs, int numBitLevels, UInt32 symbol, UInt32 *ProbPrices) -+{ -+ UInt32 price = 0; -+ UInt32 m = 1; -+ int i; -+ for (i = numBitLevels; i != 0; i--) -+ { -+ UInt32 bit = symbol & 1; -+ symbol >>= 1; -+ price += GET_PRICEa(probs[m], bit); -+ m = (m << 1) | bit; -+ } -+ return price; -+} -+ -+ -+static void LenEnc_Init(CLenEnc *p) -+{ -+ unsigned i; -+ p->choice = p->choice2 = kProbInitValue; -+ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumLowBits); i++) -+ p->low[i] = kProbInitValue; -+ for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << kLenNumMidBits); i++) -+ p->mid[i] = kProbInitValue; -+ for (i = 0; i < kLenNumHighSymbols; i++) -+ p->high[i] = kProbInitValue; -+} -+ -+static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState) -+{ -+ if (symbol < kLenNumLowSymbols) -+ { -+ RangeEnc_EncodeBit(rc, &p->choice, 0); -+ RcTree_Encode(rc, p->low + (posState << kLenNumLowBits), kLenNumLowBits, symbol); -+ } -+ else -+ { -+ RangeEnc_EncodeBit(rc, &p->choice, 1); -+ if (symbol < kLenNumLowSymbols + kLenNumMidSymbols) -+ { -+ RangeEnc_EncodeBit(rc, &p->choice2, 0); -+ RcTree_Encode(rc, p->mid + (posState << kLenNumMidBits), kLenNumMidBits, symbol - kLenNumLowSymbols); -+ } -+ else -+ { -+ RangeEnc_EncodeBit(rc, &p->choice2, 1); -+ RcTree_Encode(rc, p->high, kLenNumHighBits, symbol - kLenNumLowSymbols - kLenNumMidSymbols); -+ } -+ } -+} -+ -+static void LenEnc_SetPrices(CLenEnc *p, UInt32 posState, UInt32 numSymbols, UInt32 *prices, UInt32 *ProbPrices) -+{ -+ UInt32 a0 = GET_PRICE_0a(p->choice); -+ UInt32 a1 = GET_PRICE_1a(p->choice); -+ UInt32 b0 = a1 + GET_PRICE_0a(p->choice2); -+ UInt32 b1 = a1 + GET_PRICE_1a(p->choice2); -+ UInt32 i = 0; -+ for (i = 0; i < kLenNumLowSymbols; i++) -+ { -+ if (i >= numSymbols) -+ return; -+ prices[i] = a0 + RcTree_GetPrice(p->low + (posState << kLenNumLowBits), kLenNumLowBits, i, ProbPrices); -+ } -+ for (; i < kLenNumLowSymbols + kLenNumMidSymbols; i++) -+ { -+ if (i >= numSymbols) -+ return; -+ prices[i] = b0 + RcTree_GetPrice(p->mid + (posState << kLenNumMidBits), kLenNumMidBits, i - kLenNumLowSymbols, ProbPrices); -+ } -+ for (; i < numSymbols; i++) -+ prices[i] = b1 + RcTree_GetPrice(p->high, kLenNumHighBits, i - kLenNumLowSymbols - kLenNumMidSymbols, ProbPrices); -+} -+ -+static void MY_FAST_CALL LenPriceEnc_UpdateTable(CLenPriceEnc *p, UInt32 posState, UInt32 *ProbPrices) -+{ -+ LenEnc_SetPrices(&p->p, posState, p->tableSize, p->prices[posState], ProbPrices); -+ p->counters[posState] = p->tableSize; -+} -+ -+static void LenPriceEnc_UpdateTables(CLenPriceEnc *p, UInt32 numPosStates, UInt32 *ProbPrices) -+{ -+ UInt32 posState; -+ for (posState = 0; posState < numPosStates; posState++) -+ LenPriceEnc_UpdateTable(p, posState, ProbPrices); -+} -+ -+static void LenEnc_Encode2(CLenPriceEnc *p, CRangeEnc *rc, UInt32 symbol, UInt32 posState, Bool updatePrice, UInt32 *ProbPrices) -+{ -+ LenEnc_Encode(&p->p, rc, symbol, posState); -+ if (updatePrice) -+ if (--p->counters[posState] == 0) -+ LenPriceEnc_UpdateTable(p, posState, ProbPrices); -+} -+ -+ -+ -+ -+static void MovePos(CLzmaEnc *p, UInt32 num) -+{ -+ #ifdef SHOW_STAT -+ ttt += num; -+ printf("\n MovePos %d", num); -+ #endif -+ if (num != 0) -+ { -+ p->additionalOffset += num; -+ p->matchFinder.Skip(p->matchFinderObj, num); -+ } -+} -+ -+static UInt32 ReadMatchDistances(CLzmaEnc *p, UInt32 *numDistancePairsRes) -+{ -+ UInt32 lenRes = 0, numPairs; -+ p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); -+ numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); -+ #ifdef SHOW_STAT -+ printf("\n i = %d numPairs = %d ", ttt, numPairs / 2); -+ ttt++; -+ { -+ UInt32 i; -+ for (i = 0; i < numPairs; i += 2) -+ printf("%2d %6d | ", p->matches[i], p->matches[i + 1]); -+ } -+ #endif -+ if (numPairs > 0) -+ { -+ lenRes = p->matches[numPairs - 2]; -+ if (lenRes == p->numFastBytes) -+ { -+ const Byte *pby = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ UInt32 distance = p->matches[numPairs - 1] + 1; -+ UInt32 numAvail = p->numAvail; -+ if (numAvail > LZMA_MATCH_LEN_MAX) -+ numAvail = LZMA_MATCH_LEN_MAX; -+ { -+ const Byte *pby2 = pby - distance; -+ for (; lenRes < numAvail && pby[lenRes] == pby2[lenRes]; lenRes++); -+ } -+ } -+ } -+ p->additionalOffset++; -+ *numDistancePairsRes = numPairs; -+ return lenRes; -+} -+ -+ -+#define MakeAsChar(p) (p)->backPrev = (UInt32)(-1); (p)->prev1IsChar = False; -+#define MakeAsShortRep(p) (p)->backPrev = 0; (p)->prev1IsChar = False; -+#define IsShortRep(p) ((p)->backPrev == 0) -+ -+static UInt32 GetRepLen1Price(CLzmaEnc *p, UInt32 state, UInt32 posState) -+{ -+ return -+ GET_PRICE_0(p->isRepG0[state]) + -+ GET_PRICE_0(p->isRep0Long[state][posState]); -+} -+ -+static UInt32 GetPureRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 state, UInt32 posState) -+{ -+ UInt32 price; -+ if (repIndex == 0) -+ { -+ price = GET_PRICE_0(p->isRepG0[state]); -+ price += GET_PRICE_1(p->isRep0Long[state][posState]); -+ } -+ else -+ { -+ price = GET_PRICE_1(p->isRepG0[state]); -+ if (repIndex == 1) -+ price += GET_PRICE_0(p->isRepG1[state]); -+ else -+ { -+ price += GET_PRICE_1(p->isRepG1[state]); -+ price += GET_PRICE(p->isRepG2[state], repIndex - 2); -+ } -+ } -+ return price; -+} -+ -+static UInt32 GetRepPrice(CLzmaEnc *p, UInt32 repIndex, UInt32 len, UInt32 state, UInt32 posState) -+{ -+ return p->repLenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN] + -+ GetPureRepPrice(p, repIndex, state, posState); -+} -+ -+static UInt32 Backward(CLzmaEnc *p, UInt32 *backRes, UInt32 cur) -+{ -+ UInt32 posMem = p->opt[cur].posPrev; -+ UInt32 backMem = p->opt[cur].backPrev; -+ p->optimumEndIndex = cur; -+ do -+ { -+ if (p->opt[cur].prev1IsChar) -+ { -+ MakeAsChar(&p->opt[posMem]) -+ p->opt[posMem].posPrev = posMem - 1; -+ if (p->opt[cur].prev2) -+ { -+ p->opt[posMem - 1].prev1IsChar = False; -+ p->opt[posMem - 1].posPrev = p->opt[cur].posPrev2; -+ p->opt[posMem - 1].backPrev = p->opt[cur].backPrev2; -+ } -+ } -+ { -+ UInt32 posPrev = posMem; -+ UInt32 backCur = backMem; -+ -+ backMem = p->opt[posPrev].backPrev; -+ posMem = p->opt[posPrev].posPrev; -+ -+ p->opt[posPrev].backPrev = backCur; -+ p->opt[posPrev].posPrev = cur; -+ cur = posPrev; -+ } -+ } -+ while (cur != 0); -+ *backRes = p->opt[0].backPrev; -+ p->optimumCurrentIndex = p->opt[0].posPrev; -+ return p->optimumCurrentIndex; -+} -+ -+#define LIT_PROBS(pos, prevByte) (p->litProbs + ((((pos) & p->lpMask) << p->lc) + ((prevByte) >> (8 - p->lc))) * 0x300) -+ -+static UInt32 GetOptimum(CLzmaEnc *p, UInt32 position, UInt32 *backRes) -+{ -+ UInt32 numAvail, mainLen, numPairs, repMaxIndex, i, posState, lenEnd, len, cur; -+ UInt32 matchPrice, repMatchPrice, normalMatchPrice; -+ UInt32 reps[LZMA_NUM_REPS], repLens[LZMA_NUM_REPS]; -+ UInt32 *matches; -+ const Byte *data; -+ Byte curByte, matchByte; -+ if (p->optimumEndIndex != p->optimumCurrentIndex) -+ { -+ const COptimal *opt = &p->opt[p->optimumCurrentIndex]; -+ UInt32 lenRes = opt->posPrev - p->optimumCurrentIndex; -+ *backRes = opt->backPrev; -+ p->optimumCurrentIndex = opt->posPrev; -+ return lenRes; -+ } -+ p->optimumCurrentIndex = p->optimumEndIndex = 0; -+ -+ if (p->additionalOffset == 0) -+ mainLen = ReadMatchDistances(p, &numPairs); -+ else -+ { -+ mainLen = p->longestMatchLength; -+ numPairs = p->numPairs; -+ } -+ -+ numAvail = p->numAvail; -+ if (numAvail < 2) -+ { -+ *backRes = (UInt32)(-1); -+ return 1; -+ } -+ if (numAvail > LZMA_MATCH_LEN_MAX) -+ numAvail = LZMA_MATCH_LEN_MAX; -+ -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ repMaxIndex = 0; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 lenTest; -+ const Byte *data2; -+ reps[i] = p->reps[i]; -+ data2 = data - (reps[i] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ { -+ repLens[i] = 0; -+ continue; -+ } -+ for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); -+ repLens[i] = lenTest; -+ if (lenTest > repLens[repMaxIndex]) -+ repMaxIndex = i; -+ } -+ if (repLens[repMaxIndex] >= p->numFastBytes) -+ { -+ UInt32 lenRes; -+ *backRes = repMaxIndex; -+ lenRes = repLens[repMaxIndex]; -+ MovePos(p, lenRes - 1); -+ return lenRes; -+ } -+ -+ matches = p->matches; -+ if (mainLen >= p->numFastBytes) -+ { -+ *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; -+ MovePos(p, mainLen - 1); -+ return mainLen; -+ } -+ curByte = *data; -+ matchByte = *(data - (reps[0] + 1)); -+ -+ if (mainLen < 2 && curByte != matchByte && repLens[repMaxIndex] < 2) -+ { -+ *backRes = (UInt32)-1; -+ return 1; -+ } -+ -+ p->opt[0].state = (CState)p->state; -+ -+ posState = (position & p->pbMask); -+ -+ { -+ const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); -+ p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + -+ (!IsCharState(p->state) ? -+ LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : -+ LitEnc_GetPrice(probs, curByte, p->ProbPrices)); -+ } -+ -+ MakeAsChar(&p->opt[1]); -+ -+ matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); -+ repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); -+ -+ if (matchByte == curByte) -+ { -+ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, p->state, posState); -+ if (shortRepPrice < p->opt[1].price) -+ { -+ p->opt[1].price = shortRepPrice; -+ MakeAsShortRep(&p->opt[1]); -+ } -+ } -+ lenEnd = ((mainLen >= repLens[repMaxIndex]) ? mainLen : repLens[repMaxIndex]); -+ -+ if (lenEnd < 2) -+ { -+ *backRes = p->opt[1].backPrev; -+ return 1; -+ } -+ -+ p->opt[1].posPrev = 0; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ p->opt[0].backs[i] = reps[i]; -+ -+ len = lenEnd; -+ do -+ p->opt[len--].price = kInfinityPrice; -+ while (len >= 2); -+ -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 repLen = repLens[i]; -+ UInt32 price; -+ if (repLen < 2) -+ continue; -+ price = repMatchPrice + GetPureRepPrice(p, i, p->state, posState); -+ do -+ { -+ UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][repLen - 2]; -+ COptimal *opt = &p->opt[repLen]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = 0; -+ opt->backPrev = i; -+ opt->prev1IsChar = False; -+ } -+ } -+ while (--repLen >= 2); -+ } -+ -+ normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); -+ -+ len = ((repLens[0] >= 2) ? repLens[0] + 1 : 2); -+ if (len <= mainLen) -+ { -+ UInt32 offs = 0; -+ while (len > matches[offs]) -+ offs += 2; -+ for (; ; len++) -+ { -+ COptimal *opt; -+ UInt32 distance = matches[offs + 1]; -+ -+ UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][len - LZMA_MATCH_LEN_MIN]; -+ UInt32 lenToPosState = GetLenToPosState(len); -+ if (distance < kNumFullDistances) -+ curAndLenPrice += p->distancesPrices[lenToPosState][distance]; -+ else -+ { -+ UInt32 slot; -+ GetPosSlot2(distance, slot); -+ curAndLenPrice += p->alignPrices[distance & kAlignMask] + p->posSlotPrices[lenToPosState][slot]; -+ } -+ opt = &p->opt[len]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = 0; -+ opt->backPrev = distance + LZMA_NUM_REPS; -+ opt->prev1IsChar = False; -+ } -+ if (len == matches[offs]) -+ { -+ offs += 2; -+ if (offs == numPairs) -+ break; -+ } -+ } -+ } -+ -+ cur = 0; -+ -+ #ifdef SHOW_STAT2 -+ if (position >= 0) -+ { -+ unsigned i; -+ printf("\n pos = %4X", position); -+ for (i = cur; i <= lenEnd; i++) -+ printf("\nprice[%4X] = %d", position - cur + i, p->opt[i].price); -+ } -+ #endif -+ -+ for (;;) -+ { -+ UInt32 numAvailFull, newLen, numPairs, posPrev, state, posState, startLen; -+ UInt32 curPrice, curAnd1Price, matchPrice, repMatchPrice; -+ Bool nextIsChar; -+ Byte curByte, matchByte; -+ const Byte *data; -+ COptimal *curOpt; -+ COptimal *nextOpt; -+ -+ cur++; -+ if (cur == lenEnd) -+ return Backward(p, backRes, cur); -+ -+ newLen = ReadMatchDistances(p, &numPairs); -+ if (newLen >= p->numFastBytes) -+ { -+ p->numPairs = numPairs; -+ p->longestMatchLength = newLen; -+ return Backward(p, backRes, cur); -+ } -+ position++; -+ curOpt = &p->opt[cur]; -+ posPrev = curOpt->posPrev; -+ if (curOpt->prev1IsChar) -+ { -+ posPrev--; -+ if (curOpt->prev2) -+ { -+ state = p->opt[curOpt->posPrev2].state; -+ if (curOpt->backPrev2 < LZMA_NUM_REPS) -+ state = kRepNextStates[state]; -+ else -+ state = kMatchNextStates[state]; -+ } -+ else -+ state = p->opt[posPrev].state; -+ state = kLiteralNextStates[state]; -+ } -+ else -+ state = p->opt[posPrev].state; -+ if (posPrev == cur - 1) -+ { -+ if (IsShortRep(curOpt)) -+ state = kShortRepNextStates[state]; -+ else -+ state = kLiteralNextStates[state]; -+ } -+ else -+ { -+ UInt32 pos; -+ const COptimal *prevOpt; -+ if (curOpt->prev1IsChar && curOpt->prev2) -+ { -+ posPrev = curOpt->posPrev2; -+ pos = curOpt->backPrev2; -+ state = kRepNextStates[state]; -+ } -+ else -+ { -+ pos = curOpt->backPrev; -+ if (pos < LZMA_NUM_REPS) -+ state = kRepNextStates[state]; -+ else -+ state = kMatchNextStates[state]; -+ } -+ prevOpt = &p->opt[posPrev]; -+ if (pos < LZMA_NUM_REPS) -+ { -+ UInt32 i; -+ reps[0] = prevOpt->backs[pos]; -+ for (i = 1; i <= pos; i++) -+ reps[i] = prevOpt->backs[i - 1]; -+ for (; i < LZMA_NUM_REPS; i++) -+ reps[i] = prevOpt->backs[i]; -+ } -+ else -+ { -+ UInt32 i; -+ reps[0] = (pos - LZMA_NUM_REPS); -+ for (i = 1; i < LZMA_NUM_REPS; i++) -+ reps[i] = prevOpt->backs[i - 1]; -+ } -+ } -+ curOpt->state = (CState)state; -+ -+ curOpt->backs[0] = reps[0]; -+ curOpt->backs[1] = reps[1]; -+ curOpt->backs[2] = reps[2]; -+ curOpt->backs[3] = reps[3]; -+ -+ curPrice = curOpt->price; -+ nextIsChar = False; -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ curByte = *data; -+ matchByte = *(data - (reps[0] + 1)); -+ -+ posState = (position & p->pbMask); -+ -+ curAnd1Price = curPrice + GET_PRICE_0(p->isMatch[state][posState]); -+ { -+ const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); -+ curAnd1Price += -+ (!IsCharState(state) ? -+ LitEnc_GetPriceMatched(probs, curByte, matchByte, p->ProbPrices) : -+ LitEnc_GetPrice(probs, curByte, p->ProbPrices)); -+ } -+ -+ nextOpt = &p->opt[cur + 1]; -+ -+ if (curAnd1Price < nextOpt->price) -+ { -+ nextOpt->price = curAnd1Price; -+ nextOpt->posPrev = cur; -+ MakeAsChar(nextOpt); -+ nextIsChar = True; -+ } -+ -+ matchPrice = curPrice + GET_PRICE_1(p->isMatch[state][posState]); -+ repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); -+ -+ if (matchByte == curByte && !(nextOpt->posPrev < cur && nextOpt->backPrev == 0)) -+ { -+ UInt32 shortRepPrice = repMatchPrice + GetRepLen1Price(p, state, posState); -+ if (shortRepPrice <= nextOpt->price) -+ { -+ nextOpt->price = shortRepPrice; -+ nextOpt->posPrev = cur; -+ MakeAsShortRep(nextOpt); -+ nextIsChar = True; -+ } -+ } -+ numAvailFull = p->numAvail; -+ { -+ UInt32 temp = kNumOpts - 1 - cur; -+ if (temp < numAvailFull) -+ numAvailFull = temp; -+ } -+ -+ if (numAvailFull < 2) -+ continue; -+ numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); -+ -+ if (!nextIsChar && matchByte != curByte) /* speed optimization */ -+ { -+ /* try Literal + rep0 */ -+ UInt32 temp; -+ UInt32 lenTest2; -+ const Byte *data2 = data - (reps[0] + 1); -+ UInt32 limit = p->numFastBytes + 1; -+ if (limit > numAvailFull) -+ limit = numAvailFull; -+ -+ for (temp = 1; temp < limit && data[temp] == data2[temp]; temp++); -+ lenTest2 = temp - 1; -+ if (lenTest2 >= 2) -+ { -+ UInt32 state2 = kLiteralNextStates[state]; -+ UInt32 posStateNext = (position + 1) & p->pbMask; -+ UInt32 nextRepMatchPrice = curAnd1Price + -+ GET_PRICE_1(p->isMatch[state2][posStateNext]) + -+ GET_PRICE_1(p->isRep[state2]); -+ /* for (; lenTest2 >= 2; lenTest2--) */ -+ { -+ UInt32 curAndLenPrice; -+ COptimal *opt; -+ UInt32 offset = cur + 1 + lenTest2; -+ while (lenEnd < offset) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); -+ opt = &p->opt[offset]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur + 1; -+ opt->backPrev = 0; -+ opt->prev1IsChar = True; -+ opt->prev2 = False; -+ } -+ } -+ } -+ } -+ -+ startLen = 2; /* speed optimization */ -+ { -+ UInt32 repIndex; -+ for (repIndex = 0; repIndex < LZMA_NUM_REPS; repIndex++) -+ { -+ UInt32 lenTest; -+ UInt32 lenTestTemp; -+ UInt32 price; -+ const Byte *data2 = data - (reps[repIndex] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ continue; -+ for (lenTest = 2; lenTest < numAvail && data[lenTest] == data2[lenTest]; lenTest++); -+ while (lenEnd < cur + lenTest) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ lenTestTemp = lenTest; -+ price = repMatchPrice + GetPureRepPrice(p, repIndex, state, posState); -+ do -+ { -+ UInt32 curAndLenPrice = price + p->repLenEnc.prices[posState][lenTest - 2]; -+ COptimal *opt = &p->opt[cur + lenTest]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur; -+ opt->backPrev = repIndex; -+ opt->prev1IsChar = False; -+ } -+ } -+ while (--lenTest >= 2); -+ lenTest = lenTestTemp; -+ -+ if (repIndex == 0) -+ startLen = lenTest + 1; -+ -+ /* if (_maxMode) */ -+ { -+ UInt32 lenTest2 = lenTest + 1; -+ UInt32 limit = lenTest2 + p->numFastBytes; -+ UInt32 nextRepMatchPrice; -+ if (limit > numAvailFull) -+ limit = numAvailFull; -+ for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); -+ lenTest2 -= lenTest + 1; -+ if (lenTest2 >= 2) -+ { -+ UInt32 state2 = kRepNextStates[state]; -+ UInt32 posStateNext = (position + lenTest) & p->pbMask; -+ UInt32 curAndLenCharPrice = -+ price + p->repLenEnc.prices[posState][lenTest - 2] + -+ GET_PRICE_0(p->isMatch[state2][posStateNext]) + -+ LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), -+ data[lenTest], data2[lenTest], p->ProbPrices); -+ state2 = kLiteralNextStates[state2]; -+ posStateNext = (position + lenTest + 1) & p->pbMask; -+ nextRepMatchPrice = curAndLenCharPrice + -+ GET_PRICE_1(p->isMatch[state2][posStateNext]) + -+ GET_PRICE_1(p->isRep[state2]); -+ -+ /* for (; lenTest2 >= 2; lenTest2--) */ -+ { -+ UInt32 curAndLenPrice; -+ COptimal *opt; -+ UInt32 offset = cur + lenTest + 1 + lenTest2; -+ while (lenEnd < offset) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); -+ opt = &p->opt[offset]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur + lenTest + 1; -+ opt->backPrev = 0; -+ opt->prev1IsChar = True; -+ opt->prev2 = True; -+ opt->posPrev2 = cur; -+ opt->backPrev2 = repIndex; -+ } -+ } -+ } -+ } -+ } -+ } -+ /* for (UInt32 lenTest = 2; lenTest <= newLen; lenTest++) */ -+ if (newLen > numAvail) -+ { -+ newLen = numAvail; -+ for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); -+ matches[numPairs] = newLen; -+ numPairs += 2; -+ } -+ if (newLen >= startLen) -+ { -+ UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); -+ UInt32 offs, curBack, posSlot; -+ UInt32 lenTest; -+ while (lenEnd < cur + newLen) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ -+ offs = 0; -+ while (startLen > matches[offs]) -+ offs += 2; -+ curBack = matches[offs + 1]; -+ GetPosSlot2(curBack, posSlot); -+ for (lenTest = /*2*/ startLen; ; lenTest++) -+ { -+ UInt32 curAndLenPrice = normalMatchPrice + p->lenEnc.prices[posState][lenTest - LZMA_MATCH_LEN_MIN]; -+ UInt32 lenToPosState = GetLenToPosState(lenTest); -+ COptimal *opt; -+ if (curBack < kNumFullDistances) -+ curAndLenPrice += p->distancesPrices[lenToPosState][curBack]; -+ else -+ curAndLenPrice += p->posSlotPrices[lenToPosState][posSlot] + p->alignPrices[curBack & kAlignMask]; -+ -+ opt = &p->opt[cur + lenTest]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur; -+ opt->backPrev = curBack + LZMA_NUM_REPS; -+ opt->prev1IsChar = False; -+ } -+ -+ if (/*_maxMode && */lenTest == matches[offs]) -+ { -+ /* Try Match + Literal + Rep0 */ -+ const Byte *data2 = data - (curBack + 1); -+ UInt32 lenTest2 = lenTest + 1; -+ UInt32 limit = lenTest2 + p->numFastBytes; -+ UInt32 nextRepMatchPrice; -+ if (limit > numAvailFull) -+ limit = numAvailFull; -+ for (; lenTest2 < limit && data[lenTest2] == data2[lenTest2]; lenTest2++); -+ lenTest2 -= lenTest + 1; -+ if (lenTest2 >= 2) -+ { -+ UInt32 state2 = kMatchNextStates[state]; -+ UInt32 posStateNext = (position + lenTest) & p->pbMask; -+ UInt32 curAndLenCharPrice = curAndLenPrice + -+ GET_PRICE_0(p->isMatch[state2][posStateNext]) + -+ LitEnc_GetPriceMatched(LIT_PROBS(position + lenTest, data[lenTest - 1]), -+ data[lenTest], data2[lenTest], p->ProbPrices); -+ state2 = kLiteralNextStates[state2]; -+ posStateNext = (posStateNext + 1) & p->pbMask; -+ nextRepMatchPrice = curAndLenCharPrice + -+ GET_PRICE_1(p->isMatch[state2][posStateNext]) + -+ GET_PRICE_1(p->isRep[state2]); -+ -+ /* for (; lenTest2 >= 2; lenTest2--) */ -+ { -+ UInt32 offset = cur + lenTest + 1 + lenTest2; -+ UInt32 curAndLenPrice; -+ COptimal *opt; -+ while (lenEnd < offset) -+ p->opt[++lenEnd].price = kInfinityPrice; -+ curAndLenPrice = nextRepMatchPrice + GetRepPrice(p, 0, lenTest2, state2, posStateNext); -+ opt = &p->opt[offset]; -+ if (curAndLenPrice < opt->price) -+ { -+ opt->price = curAndLenPrice; -+ opt->posPrev = cur + lenTest + 1; -+ opt->backPrev = 0; -+ opt->prev1IsChar = True; -+ opt->prev2 = True; -+ opt->posPrev2 = cur; -+ opt->backPrev2 = curBack + LZMA_NUM_REPS; -+ } -+ } -+ } -+ offs += 2; -+ if (offs == numPairs) -+ break; -+ curBack = matches[offs + 1]; -+ if (curBack >= kNumFullDistances) -+ GetPosSlot2(curBack, posSlot); -+ } -+ } -+ } -+ } -+} -+ -+#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) -+ -+static UInt32 GetOptimumFast(CLzmaEnc *p, UInt32 *backRes) -+{ -+ UInt32 numAvail, mainLen, mainDist, numPairs, repIndex, repLen, i; -+ const Byte *data; -+ const UInt32 *matches; -+ -+ if (p->additionalOffset == 0) -+ mainLen = ReadMatchDistances(p, &numPairs); -+ else -+ { -+ mainLen = p->longestMatchLength; -+ numPairs = p->numPairs; -+ } -+ -+ numAvail = p->numAvail; -+ *backRes = (UInt32)-1; -+ if (numAvail < 2) -+ return 1; -+ if (numAvail > LZMA_MATCH_LEN_MAX) -+ numAvail = LZMA_MATCH_LEN_MAX; -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ -+ repLen = repIndex = 0; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 len; -+ const Byte *data2 = data - (p->reps[i] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ continue; -+ for (len = 2; len < numAvail && data[len] == data2[len]; len++); -+ if (len >= p->numFastBytes) -+ { -+ *backRes = i; -+ MovePos(p, len - 1); -+ return len; -+ } -+ if (len > repLen) -+ { -+ repIndex = i; -+ repLen = len; -+ } -+ } -+ -+ matches = p->matches; -+ if (mainLen >= p->numFastBytes) -+ { -+ *backRes = matches[numPairs - 1] + LZMA_NUM_REPS; -+ MovePos(p, mainLen - 1); -+ return mainLen; -+ } -+ -+ mainDist = 0; /* for GCC */ -+ if (mainLen >= 2) -+ { -+ mainDist = matches[numPairs - 1]; -+ while (numPairs > 2 && mainLen == matches[numPairs - 4] + 1) -+ { -+ if (!ChangePair(matches[numPairs - 3], mainDist)) -+ break; -+ numPairs -= 2; -+ mainLen = matches[numPairs - 2]; -+ mainDist = matches[numPairs - 1]; -+ } -+ if (mainLen == 2 && mainDist >= 0x80) -+ mainLen = 1; -+ } -+ -+ if (repLen >= 2 && ( -+ (repLen + 1 >= mainLen) || -+ (repLen + 2 >= mainLen && mainDist >= (1 << 9)) || -+ (repLen + 3 >= mainLen && mainDist >= (1 << 15)))) -+ { -+ *backRes = repIndex; -+ MovePos(p, repLen - 1); -+ return repLen; -+ } -+ -+ if (mainLen < 2 || numAvail <= 2) -+ return 1; -+ -+ p->longestMatchLength = ReadMatchDistances(p, &p->numPairs); -+ if (p->longestMatchLength >= 2) -+ { -+ UInt32 newDistance = matches[p->numPairs - 1]; -+ if ((p->longestMatchLength >= mainLen && newDistance < mainDist) || -+ (p->longestMatchLength == mainLen + 1 && !ChangePair(mainDist, newDistance)) || -+ (p->longestMatchLength > mainLen + 1) || -+ (p->longestMatchLength + 1 >= mainLen && mainLen >= 3 && ChangePair(newDistance, mainDist))) -+ return 1; -+ } -+ -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; -+ for (i = 0; i < LZMA_NUM_REPS; i++) -+ { -+ UInt32 len, limit; -+ const Byte *data2 = data - (p->reps[i] + 1); -+ if (data[0] != data2[0] || data[1] != data2[1]) -+ continue; -+ limit = mainLen - 1; -+ for (len = 2; len < limit && data[len] == data2[len]; len++); -+ if (len >= limit) -+ return 1; -+ } -+ *backRes = mainDist + LZMA_NUM_REPS; -+ MovePos(p, mainLen - 2); -+ return mainLen; -+} -+ -+static void WriteEndMarker(CLzmaEnc *p, UInt32 posState) -+{ -+ UInt32 len; -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); -+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); -+ p->state = kMatchNextStates[p->state]; -+ len = LZMA_MATCH_LEN_MIN; -+ LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); -+ RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, (1 << kNumPosSlotBits) - 1); -+ RangeEnc_EncodeDirectBits(&p->rc, (((UInt32)1 << 30) - 1) >> kNumAlignBits, 30 - kNumAlignBits); -+ RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); -+} -+ -+static SRes CheckErrors(CLzmaEnc *p) -+{ -+ if (p->result != SZ_OK) -+ return p->result; -+ if (p->rc.res != SZ_OK) -+ p->result = SZ_ERROR_WRITE; -+ if (p->matchFinderBase.result != SZ_OK) -+ p->result = SZ_ERROR_READ; -+ if (p->result != SZ_OK) -+ p->finished = True; -+ return p->result; -+} -+ -+static SRes Flush(CLzmaEnc *p, UInt32 nowPos) -+{ -+ /* ReleaseMFStream(); */ -+ p->finished = True; -+ if (p->writeEndMark) -+ WriteEndMarker(p, nowPos & p->pbMask); -+ RangeEnc_FlushData(&p->rc); -+ RangeEnc_FlushStream(&p->rc); -+ return CheckErrors(p); -+} -+ -+static void FillAlignPrices(CLzmaEnc *p) -+{ -+ UInt32 i; -+ for (i = 0; i < kAlignTableSize; i++) -+ p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); -+ p->alignPriceCount = 0; -+} -+ -+static void FillDistancesPrices(CLzmaEnc *p) -+{ -+ UInt32 tempPrices[kNumFullDistances]; -+ UInt32 i, lenToPosState; -+ for (i = kStartPosModelIndex; i < kNumFullDistances; i++) -+ { -+ UInt32 posSlot = GetPosSlot1(i); -+ UInt32 footerBits = ((posSlot >> 1) - 1); -+ UInt32 base = ((2 | (posSlot & 1)) << footerBits); -+ tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base - posSlot - 1, footerBits, i - base, p->ProbPrices); -+ } -+ -+ for (lenToPosState = 0; lenToPosState < kNumLenToPosStates; lenToPosState++) -+ { -+ UInt32 posSlot; -+ const CLzmaProb *encoder = p->posSlotEncoder[lenToPosState]; -+ UInt32 *posSlotPrices = p->posSlotPrices[lenToPosState]; -+ for (posSlot = 0; posSlot < p->distTableSize; posSlot++) -+ posSlotPrices[posSlot] = RcTree_GetPrice(encoder, kNumPosSlotBits, posSlot, p->ProbPrices); -+ for (posSlot = kEndPosModelIndex; posSlot < p->distTableSize; posSlot++) -+ posSlotPrices[posSlot] += ((((posSlot >> 1) - 1) - kNumAlignBits) << kNumBitPriceShiftBits); -+ -+ { -+ UInt32 *distancesPrices = p->distancesPrices[lenToPosState]; -+ UInt32 i; -+ for (i = 0; i < kStartPosModelIndex; i++) -+ distancesPrices[i] = posSlotPrices[i]; -+ for (; i < kNumFullDistances; i++) -+ distancesPrices[i] = posSlotPrices[GetPosSlot1(i)] + tempPrices[i]; -+ } -+ } -+ p->matchPriceCount = 0; -+} -+ -+static void LzmaEnc_Construct(CLzmaEnc *p) -+{ -+ RangeEnc_Construct(&p->rc); -+ MatchFinder_Construct(&p->matchFinderBase); -+ #ifndef _7ZIP_ST -+ MatchFinderMt_Construct(&p->matchFinderMt); -+ p->matchFinderMt.MatchFinder = &p->matchFinderBase; -+ #endif -+ -+ { -+ CLzmaEncProps props; -+ LzmaEncProps_Init(&props); -+ LzmaEnc_SetProps(p, &props); -+ } -+ -+ #ifndef LZMA_LOG_BSR -+ LzmaEnc_FastPosInit(p->g_FastPos); -+ #endif -+ -+ LzmaEnc_InitPriceTables(p->ProbPrices); -+ p->litProbs = 0; -+ p->saveState.litProbs = 0; -+} -+ -+CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc) -+{ -+ void *p; -+ p = alloc->Alloc(alloc, sizeof(CLzmaEnc)); -+ if (p != 0) -+ LzmaEnc_Construct((CLzmaEnc *)p); -+ return p; -+} -+ -+static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc) -+{ -+ alloc->Free(alloc, p->litProbs); -+ alloc->Free(alloc, p->saveState.litProbs); -+ p->litProbs = 0; -+ p->saveState.litProbs = 0; -+} -+ -+static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ #ifndef _7ZIP_ST -+ MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); -+ #endif -+ MatchFinder_Free(&p->matchFinderBase, allocBig); -+ LzmaEnc_FreeLits(p, alloc); -+ RangeEnc_Free(&p->rc, alloc); -+} -+ -+void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); -+ alloc->Free(alloc, p); -+} -+ -+static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, Bool useLimits, UInt32 maxPackSize, UInt32 maxUnpackSize) -+{ -+ UInt32 nowPos32, startPos32; -+ if (p->needInit) -+ { -+ p->matchFinder.Init(p->matchFinderObj); -+ p->needInit = 0; -+ } -+ -+ if (p->finished) -+ return p->result; -+ RINOK(CheckErrors(p)); -+ -+ nowPos32 = (UInt32)p->nowPos64; -+ startPos32 = nowPos32; -+ -+ if (p->nowPos64 == 0) -+ { -+ UInt32 numPairs; -+ Byte curByte; -+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) -+ return Flush(p, nowPos32); -+ ReadMatchDistances(p, &numPairs); -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][0], 0); -+ p->state = kLiteralNextStates[p->state]; -+ curByte = p->matchFinder.GetIndexByte(p->matchFinderObj, 0 - p->additionalOffset); -+ LitEnc_Encode(&p->rc, p->litProbs, curByte); -+ p->additionalOffset--; -+ nowPos32++; -+ } -+ -+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) -+ for (;;) -+ { -+ UInt32 pos, len, posState; -+ -+ if (p->fastMode) -+ len = GetOptimumFast(p, &pos); -+ else -+ len = GetOptimum(p, nowPos32, &pos); -+ -+ #ifdef SHOW_STAT2 -+ printf("\n pos = %4X, len = %d pos = %d", nowPos32, len, pos); -+ #endif -+ -+ posState = nowPos32 & p->pbMask; -+ if (len == 1 && pos == (UInt32)-1) -+ { -+ Byte curByte; -+ CLzmaProb *probs; -+ const Byte *data; -+ -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 0); -+ data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; -+ curByte = *data; -+ probs = LIT_PROBS(nowPos32, *(data - 1)); -+ if (IsCharState(p->state)) -+ LitEnc_Encode(&p->rc, probs, curByte); -+ else -+ LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0] - 1)); -+ p->state = kLiteralNextStates[p->state]; -+ } -+ else -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isMatch[p->state][posState], 1); -+ if (pos < LZMA_NUM_REPS) -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 1); -+ if (pos == 0) -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 0); -+ RangeEnc_EncodeBit(&p->rc, &p->isRep0Long[p->state][posState], ((len == 1) ? 0 : 1)); -+ } -+ else -+ { -+ UInt32 distance = p->reps[pos]; -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG0[p->state], 1); -+ if (pos == 1) -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 0); -+ else -+ { -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG1[p->state], 1); -+ RangeEnc_EncodeBit(&p->rc, &p->isRepG2[p->state], pos - 2); -+ if (pos == 3) -+ p->reps[3] = p->reps[2]; -+ p->reps[2] = p->reps[1]; -+ } -+ p->reps[1] = p->reps[0]; -+ p->reps[0] = distance; -+ } -+ if (len == 1) -+ p->state = kShortRepNextStates[p->state]; -+ else -+ { -+ LenEnc_Encode2(&p->repLenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); -+ p->state = kRepNextStates[p->state]; -+ } -+ } -+ else -+ { -+ UInt32 posSlot; -+ RangeEnc_EncodeBit(&p->rc, &p->isRep[p->state], 0); -+ p->state = kMatchNextStates[p->state]; -+ LenEnc_Encode2(&p->lenEnc, &p->rc, len - LZMA_MATCH_LEN_MIN, posState, !p->fastMode, p->ProbPrices); -+ pos -= LZMA_NUM_REPS; -+ GetPosSlot(pos, posSlot); -+ RcTree_Encode(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], kNumPosSlotBits, posSlot); -+ -+ if (posSlot >= kStartPosModelIndex) -+ { -+ UInt32 footerBits = ((posSlot >> 1) - 1); -+ UInt32 base = ((2 | (posSlot & 1)) << footerBits); -+ UInt32 posReduced = pos - base; -+ -+ if (posSlot < kEndPosModelIndex) -+ RcTree_ReverseEncode(&p->rc, p->posEncoders + base - posSlot - 1, footerBits, posReduced); -+ else -+ { -+ RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); -+ RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); -+ p->alignPriceCount++; -+ } -+ } -+ p->reps[3] = p->reps[2]; -+ p->reps[2] = p->reps[1]; -+ p->reps[1] = p->reps[0]; -+ p->reps[0] = pos; -+ p->matchPriceCount++; -+ } -+ } -+ p->additionalOffset -= len; -+ nowPos32 += len; -+ if (p->additionalOffset == 0) -+ { -+ UInt32 processed; -+ if (!p->fastMode) -+ { -+ if (p->matchPriceCount >= (1 << 7)) -+ FillDistancesPrices(p); -+ if (p->alignPriceCount >= kAlignTableSize) -+ FillAlignPrices(p); -+ } -+ if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) -+ break; -+ processed = nowPos32 - startPos32; -+ if (useLimits) -+ { -+ if (processed + kNumOpts + 300 >= maxUnpackSize || -+ RangeEnc_GetProcessed(&p->rc) + kNumOpts * 2 >= maxPackSize) -+ break; -+ } -+ else if (processed >= (1 << 15)) -+ { -+ p->nowPos64 += nowPos32 - startPos32; -+ return CheckErrors(p); -+ } -+ } -+ } -+ p->nowPos64 += nowPos32 - startPos32; -+ return Flush(p, nowPos32); -+} -+ -+#define kBigHashDicLimit ((UInt32)1 << 24) -+ -+static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ UInt32 beforeSize = kNumOpts; -+ Bool btMode; -+ if (!RangeEnc_Alloc(&p->rc, alloc)) -+ return SZ_ERROR_MEM; -+ btMode = (p->matchFinderBase.btMode != 0); -+ #ifndef _7ZIP_ST -+ p->mtMode = (p->multiThread && !p->fastMode && btMode); -+ #endif -+ -+ { -+ unsigned lclp = p->lc + p->lp; -+ if (p->litProbs == 0 || p->saveState.litProbs == 0 || p->lclp != lclp) -+ { -+ LzmaEnc_FreeLits(p, alloc); -+ p->litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); -+ p->saveState.litProbs = (CLzmaProb *)alloc->Alloc(alloc, (0x300 << lclp) * sizeof(CLzmaProb)); -+ if (p->litProbs == 0 || p->saveState.litProbs == 0) -+ { -+ LzmaEnc_FreeLits(p, alloc); -+ return SZ_ERROR_MEM; -+ } -+ p->lclp = lclp; -+ } -+ } -+ -+ p->matchFinderBase.bigHash = (p->dictSize > kBigHashDicLimit); -+ -+ if (beforeSize + p->dictSize < keepWindowSize) -+ beforeSize = keepWindowSize - p->dictSize; -+ -+ #ifndef _7ZIP_ST -+ if (p->mtMode) -+ { -+ RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)); -+ p->matchFinderObj = &p->matchFinderMt; -+ MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); -+ } -+ else -+ #endif -+ { -+ if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) -+ return SZ_ERROR_MEM; -+ p->matchFinderObj = &p->matchFinderBase; -+ MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); -+ } -+ return SZ_OK; -+} -+ -+static void LzmaEnc_Init(CLzmaEnc *p) -+{ -+ UInt32 i; -+ p->state = 0; -+ for (i = 0 ; i < LZMA_NUM_REPS; i++) -+ p->reps[i] = 0; -+ -+ RangeEnc_Init(&p->rc); -+ -+ -+ for (i = 0; i < kNumStates; i++) -+ { -+ UInt32 j; -+ for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) -+ { -+ p->isMatch[i][j] = kProbInitValue; -+ p->isRep0Long[i][j] = kProbInitValue; -+ } -+ p->isRep[i] = kProbInitValue; -+ p->isRepG0[i] = kProbInitValue; -+ p->isRepG1[i] = kProbInitValue; -+ p->isRepG2[i] = kProbInitValue; -+ } -+ -+ { -+ UInt32 num = 0x300 << (p->lp + p->lc); -+ for (i = 0; i < num; i++) -+ p->litProbs[i] = kProbInitValue; -+ } -+ -+ { -+ for (i = 0; i < kNumLenToPosStates; i++) -+ { -+ CLzmaProb *probs = p->posSlotEncoder[i]; -+ UInt32 j; -+ for (j = 0; j < (1 << kNumPosSlotBits); j++) -+ probs[j] = kProbInitValue; -+ } -+ } -+ { -+ for (i = 0; i < kNumFullDistances - kEndPosModelIndex; i++) -+ p->posEncoders[i] = kProbInitValue; -+ } -+ -+ LenEnc_Init(&p->lenEnc.p); -+ LenEnc_Init(&p->repLenEnc.p); -+ -+ for (i = 0; i < (1 << kNumAlignBits); i++) -+ p->posAlignEncoder[i] = kProbInitValue; -+ -+ p->optimumEndIndex = 0; -+ p->optimumCurrentIndex = 0; -+ p->additionalOffset = 0; -+ -+ p->pbMask = (1 << p->pb) - 1; -+ p->lpMask = (1 << p->lp) - 1; -+} -+ -+static void LzmaEnc_InitPrices(CLzmaEnc *p) -+{ -+ if (!p->fastMode) -+ { -+ FillDistancesPrices(p); -+ FillAlignPrices(p); -+ } -+ -+ p->lenEnc.tableSize = -+ p->repLenEnc.tableSize = -+ p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; -+ LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, p->ProbPrices); -+ LenPriceEnc_UpdateTables(&p->repLenEnc, 1 << p->pb, p->ProbPrices); -+} -+ -+static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ UInt32 i; -+ for (i = 0; i < (UInt32)kDicLogSizeMaxCompress; i++) -+ if (p->dictSize <= ((UInt32)1 << i)) -+ break; -+ p->distTableSize = i * 2; -+ -+ p->finished = False; -+ p->result = SZ_OK; -+ RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); -+ LzmaEnc_Init(p); -+ LzmaEnc_InitPrices(p); -+ p->nowPos64 = 0; -+ return SZ_OK; -+} -+ -+static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) -+{ -+ p->matchFinderBase.directInput = 1; -+ p->matchFinderBase.bufferBase = (Byte *)src; -+ p->matchFinderBase.directInputRem = srcLen; -+} -+ -+static SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, -+ UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ LzmaEnc_SetInputBuf(p, src, srcLen); -+ p->needInit = 1; -+ -+ return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); -+} -+ -+static void LzmaEnc_Finish(CLzmaEncHandle pp) -+{ -+ #ifndef _7ZIP_ST -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ if (p->mtMode) -+ MatchFinderMt_ReleaseStream(&p->matchFinderMt); -+ #else -+ pp = pp; -+ #endif -+} -+ -+typedef struct -+{ -+ ISeqOutStream funcTable; -+ Byte *data; -+ SizeT rem; -+ Bool overflow; -+} CSeqOutStreamBuf; -+ -+static size_t MyWrite(void *pp, const void *data, size_t size) -+{ -+ CSeqOutStreamBuf *p = (CSeqOutStreamBuf *)pp; -+ if (p->rem < size) -+ { -+ size = p->rem; -+ p->overflow = True; -+ } -+ memcpy(p->data, data, size); -+ p->rem -= size; -+ p->data += size; -+ return size; -+} -+ -+static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) -+{ -+ SRes res = SZ_OK; -+ -+ #ifndef _7ZIP_ST -+ Byte allocaDummy[0x300]; -+ int i = 0; -+ for (i = 0; i < 16; i++) -+ allocaDummy[i] = (Byte)i; -+ #endif -+ -+ for (;;) -+ { -+ res = LzmaEnc_CodeOneBlock(p, False, 0, 0); -+ if (res != SZ_OK || p->finished != 0) -+ break; -+ if (progress != 0) -+ { -+ res = progress->Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); -+ if (res != SZ_OK) -+ { -+ res = SZ_ERROR_PROGRESS; -+ break; -+ } -+ } -+ } -+ LzmaEnc_Finish(p); -+ return res; -+} -+ -+SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) -+{ -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ int i; -+ UInt32 dictSize = p->dictSize; -+ if (*size < LZMA_PROPS_SIZE) -+ return SZ_ERROR_PARAM; -+ *size = LZMA_PROPS_SIZE; -+ props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); -+ -+ for (i = 11; i <= 30; i++) -+ { -+ if (dictSize <= ((UInt32)2 << i)) -+ { -+ dictSize = (2 << i); -+ break; -+ } -+ if (dictSize <= ((UInt32)3 << i)) -+ { -+ dictSize = (3 << i); -+ break; -+ } -+ } -+ -+ for (i = 0; i < 4; i++) -+ props[1 + i] = (Byte)(dictSize >> (8 * i)); -+ return SZ_OK; -+} -+ -+SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, -+ int writeEndMark, ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig) -+{ -+ SRes res; -+ CLzmaEnc *p = (CLzmaEnc *)pp; -+ -+ CSeqOutStreamBuf outStream; -+ -+ LzmaEnc_SetInputBuf(p, src, srcLen); -+ -+ outStream.funcTable.Write = MyWrite; -+ outStream.data = dest; -+ outStream.rem = *destLen; -+ outStream.overflow = False; -+ -+ p->writeEndMark = writeEndMark; -+ -+ p->rc.outStream = &outStream.funcTable; -+ res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig); -+ if (res == SZ_OK) -+ res = LzmaEnc_Encode2(p, progress); -+ -+ *destLen -= outStream.rem; -+ if (outStream.overflow) -+ return SZ_ERROR_OUTPUT_EOF; -+ return res; -+} ---- /dev/null -+++ b/lib/lzma/Makefile -@@ -0,0 +1,7 @@ -+lzma_compress-objs := LzFind.o LzmaEnc.o -+lzma_decompress-objs := LzmaDec.o -+ -+obj-$(CONFIG_LZMA_COMPRESS) += lzma_compress.o -+obj-$(CONFIG_LZMA_DECOMPRESS) += lzma_decompress.o -+ -+EXTRA_CFLAGS += -Iinclude/linux -Iinclude/linux/lzma -include types.h diff --git a/target/linux/generic/pending-5.19/532-jffs2_eofdetect.patch b/target/linux/generic/pending-5.19/532-jffs2_eofdetect.patch deleted file mode 100644 index 744fbd0e2..000000000 --- a/target/linux/generic/pending-5.19/532-jffs2_eofdetect.patch +++ /dev/null @@ -1,65 +0,0 @@ -From: Felix Fietkau -Subject: fs: jffs2: EOF marker - -Signed-off-by: Felix Fietkau ---- - fs/jffs2/build.c | 10 ++++++++++ - fs/jffs2/scan.c | 21 +++++++++++++++++++-- - 2 files changed, 29 insertions(+), 2 deletions(-) - ---- a/fs/jffs2/build.c -+++ b/fs/jffs2/build.c -@@ -117,6 +117,16 @@ static int jffs2_build_filesystem(struct - dbg_fsbuild("scanned flash completely\n"); - jffs2_dbg_dump_block_lists_nolock(c); - -+ if (c->flags & (1 << 7)) { -+ printk("%s(): unlocking the mtd device... ", __func__); -+ mtd_unlock(c->mtd, 0, c->mtd->size); -+ printk("done.\n"); -+ -+ printk("%s(): erasing all blocks after the end marker... ", __func__); -+ jffs2_erase_pending_blocks(c, -1); -+ printk("done.\n"); -+ } -+ - dbg_fsbuild("pass 1 starting\n"); - c->flags |= JFFS2_SB_FLAG_BUILDING; - /* Now scan the directory tree, increasing nlink according to every dirent found. */ ---- a/fs/jffs2/scan.c -+++ b/fs/jffs2/scan.c -@@ -148,8 +148,14 @@ int jffs2_scan_medium(struct jffs2_sb_in - /* reset summary info for next eraseblock scan */ - jffs2_sum_reset_collected(s); - -- ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset), -- buf_size, s); -+ if (c->flags & (1 << 7)) { -+ if (mtd_block_isbad(c->mtd, jeb->offset)) -+ ret = BLK_STATE_BADBLOCK; -+ else -+ ret = BLK_STATE_ALLFF; -+ } else -+ ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset), -+ buf_size, s); - - if (ret < 0) - goto out; -@@ -567,6 +573,17 @@ full_scan: - return err; - } - -+ if ((buf[0] == 0xde) && -+ (buf[1] == 0xad) && -+ (buf[2] == 0xc0) && -+ (buf[3] == 0xde)) { -+ /* end of filesystem. erase everything after this point */ -+ printk("%s(): End of filesystem marker found at 0x%x\n", __func__, jeb->offset); -+ c->flags |= (1 << 7); -+ -+ return BLK_STATE_ALLFF; -+ } -+ - /* We temporarily use 'ofs' as a pointer into the buffer/jeb */ - ofs = 0; - max_ofs = EMPTY_SCAN_SIZE(c->sector_size); diff --git a/target/linux/generic/pending-5.19/600-netfilter_conntrack_flush.patch b/target/linux/generic/pending-5.19/600-netfilter_conntrack_flush.patch deleted file mode 100644 index e4b03b9c5..000000000 --- a/target/linux/generic/pending-5.19/600-netfilter_conntrack_flush.patch +++ /dev/null @@ -1,88 +0,0 @@ -From: Felix Fietkau -Subject: netfilter: add support for flushing conntrack via /proc - -lede-commit 8193bbe59a74d34d6a26d4a8cb857b1952905314 -Signed-off-by: Felix Fietkau ---- - net/netfilter/nf_conntrack_standalone.c | 59 ++++++++++++++++++++++++++++++++- - 1 file changed, 58 insertions(+), 1 deletion(-) - ---- a/net/netfilter/nf_conntrack_standalone.c -+++ b/net/netfilter/nf_conntrack_standalone.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - #include - #ifdef CONFIG_SYSCTL - #include -@@ -465,6 +466,56 @@ static int ct_cpu_seq_show(struct seq_fi - return 0; - } - -+struct kill_request { -+ u16 family; -+ union nf_inet_addr addr; -+}; -+ -+static int kill_matching(struct nf_conn *i, void *data) -+{ -+ struct kill_request *kr = data; -+ struct nf_conntrack_tuple *t1 = &i->tuplehash[IP_CT_DIR_ORIGINAL].tuple; -+ struct nf_conntrack_tuple *t2 = &i->tuplehash[IP_CT_DIR_REPLY].tuple; -+ -+ if (!kr->family) -+ return 1; -+ -+ if (t1->src.l3num != kr->family) -+ return 0; -+ -+ return (nf_inet_addr_cmp(&kr->addr, &t1->src.u3) || -+ nf_inet_addr_cmp(&kr->addr, &t1->dst.u3) || -+ nf_inet_addr_cmp(&kr->addr, &t2->src.u3) || -+ nf_inet_addr_cmp(&kr->addr, &t2->dst.u3)); -+} -+ -+static int ct_file_write(struct file *file, char *buf, size_t count) -+{ -+ struct seq_file *seq = file->private_data; -+ struct net *net = seq_file_net(seq); -+ struct kill_request kr = { }; -+ -+ if (count == 0) -+ return 0; -+ -+ if (count >= INET6_ADDRSTRLEN) -+ count = INET6_ADDRSTRLEN - 1; -+ -+ if (strnchr(buf, count, ':')) { -+ kr.family = AF_INET6; -+ if (!in6_pton(buf, count, (void *)&kr.addr, '\n', NULL)) -+ return -EINVAL; -+ } else if (strnchr(buf, count, '.')) { -+ kr.family = AF_INET; -+ if (!in4_pton(buf, count, (void *)&kr.addr, '\n', NULL)) -+ return -EINVAL; -+ } -+ -+ -+ -+ return 0; -+} -+ - static const struct seq_operations ct_cpu_seq_ops = { - .start = ct_cpu_seq_start, - .next = ct_cpu_seq_next, -@@ -478,8 +529,9 @@ static int nf_conntrack_standalone_init_ - kuid_t root_uid; - kgid_t root_gid; - -- pde = proc_create_net("nf_conntrack", 0440, net->proc_net, &ct_seq_ops, -- sizeof(struct ct_iter_state)); -+ pde = proc_create_net_data_write("nf_conntrack", 0440, net->proc_net, -+ &ct_seq_ops, &ct_file_write, -+ sizeof(struct ct_iter_state), NULL); - if (!pde) - goto out_nf_conntrack; - diff --git a/target/linux/generic/pending-5.19/610-netfilter_match_bypass_default_checks.patch b/target/linux/generic/pending-5.19/610-netfilter_match_bypass_default_checks.patch deleted file mode 100644 index 67aec69bf..000000000 --- a/target/linux/generic/pending-5.19/610-netfilter_match_bypass_default_checks.patch +++ /dev/null @@ -1,110 +0,0 @@ -From: Felix Fietkau -Subject: kernel: add a new version of my netfilter speedup patches for linux 2.6.39 and 3.0 - -Signed-off-by: Felix Fietkau ---- - include/uapi/linux/netfilter_ipv4/ip_tables.h | 1 + - net/ipv4/netfilter/ip_tables.c | 37 +++++++++++++++++++++++++++ - 2 files changed, 38 insertions(+) - ---- a/include/uapi/linux/netfilter_ipv4/ip_tables.h -+++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h -@@ -89,6 +89,7 @@ struct ipt_ip { - #define IPT_F_FRAG 0x01 /* Set if rule is a fragment rule */ - #define IPT_F_GOTO 0x02 /* Set if jump is a goto */ - #define IPT_F_MASK 0x03 /* All possible flag bits mask. */ -+#define IPT_F_NO_DEF_MATCH 0x80 /* Internal: no default match rules present */ - - /* Values for "inv" field in struct ipt_ip. */ - #define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */ ---- a/net/ipv4/netfilter/ip_tables.c -+++ b/net/ipv4/netfilter/ip_tables.c -@@ -50,6 +50,9 @@ ip_packet_match(const struct iphdr *ip, - { - unsigned long ret; - -+ if (ipinfo->flags & IPT_F_NO_DEF_MATCH) -+ return true; -+ - if (NF_INVF(ipinfo, IPT_INV_SRCIP, - (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) || - NF_INVF(ipinfo, IPT_INV_DSTIP, -@@ -80,6 +83,29 @@ ip_packet_match(const struct iphdr *ip, - return true; - } - -+static void -+ip_checkdefault(struct ipt_ip *ip) -+{ -+ static const char iface_mask[IFNAMSIZ] = {}; -+ -+ if (ip->invflags || ip->flags & IPT_F_FRAG) -+ return; -+ -+ if (memcmp(ip->iniface_mask, iface_mask, IFNAMSIZ) != 0) -+ return; -+ -+ if (memcmp(ip->outiface_mask, iface_mask, IFNAMSIZ) != 0) -+ return; -+ -+ if (ip->smsk.s_addr || ip->dmsk.s_addr) -+ return; -+ -+ if (ip->proto) -+ return; -+ -+ ip->flags |= IPT_F_NO_DEF_MATCH; -+} -+ - static bool - ip_checkentry(const struct ipt_ip *ip) - { -@@ -525,6 +551,8 @@ find_check_entry(struct ipt_entry *e, st - struct xt_mtchk_param mtpar; - struct xt_entry_match *ematch; - -+ ip_checkdefault(&e->ip); -+ - if (!xt_percpu_counter_alloc(alloc_state, &e->counters)) - return -ENOMEM; - -@@ -819,6 +847,7 @@ copy_entries_to_user(unsigned int total_ - const struct xt_table_info *private = table->private; - int ret = 0; - const void *loc_cpu_entry; -+ u8 flags; - - counters = alloc_counters(table); - if (IS_ERR(counters)) -@@ -846,6 +875,14 @@ copy_entries_to_user(unsigned int total_ - goto free_counters; - } - -+ flags = e->ip.flags & IPT_F_MASK; -+ if (copy_to_user(userptr + off -+ + offsetof(struct ipt_entry, ip.flags), -+ &flags, sizeof(flags)) != 0) { -+ ret = -EFAULT; -+ goto free_counters; -+ } -+ - for (i = sizeof(struct ipt_entry); - i < e->target_offset; - i += m->u.match_size) { -@@ -1224,12 +1261,15 @@ compat_copy_entry_to_user(struct ipt_ent - compat_uint_t origsize; - const struct xt_entry_match *ematch; - int ret = 0; -+ u8 flags = e->ip.flags & IPT_F_MASK; - - origsize = *size; - ce = *dstptr; - if (copy_to_user(ce, e, sizeof(struct ipt_entry)) != 0 || - copy_to_user(&ce->counters, &counters[i], -- sizeof(counters[i])) != 0) -+ sizeof(counters[i])) != 0 || -+ copy_to_user(&ce->ip.flags, &flags, -+ sizeof(flags)) != 0) - return -EFAULT; - - *dstptr += sizeof(struct compat_ipt_entry); diff --git a/target/linux/generic/pending-5.19/611-netfilter_match_bypass_default_table.patch b/target/linux/generic/pending-5.19/611-netfilter_match_bypass_default_table.patch deleted file mode 100644 index dd557fd3e..000000000 --- a/target/linux/generic/pending-5.19/611-netfilter_match_bypass_default_table.patch +++ /dev/null @@ -1,106 +0,0 @@ -From: Felix Fietkau -Subject: netfilter: match bypass default table - -Signed-off-by: Felix Fietkau ---- - net/ipv4/netfilter/ip_tables.c | 79 +++++++++++++++++++++++++++++++----------- - 1 file changed, 58 insertions(+), 21 deletions(-) - ---- a/net/ipv4/netfilter/ip_tables.c -+++ b/net/ipv4/netfilter/ip_tables.c -@@ -246,6 +246,33 @@ struct ipt_entry *ipt_next_entry(const s - return (void *)entry + entry->next_offset; - } - -+static bool -+ipt_handle_default_rule(struct ipt_entry *e, unsigned int *verdict) -+{ -+ struct xt_entry_target *t; -+ struct xt_standard_target *st; -+ -+ if (e->target_offset != sizeof(struct ipt_entry)) -+ return false; -+ -+ if (!(e->ip.flags & IPT_F_NO_DEF_MATCH)) -+ return false; -+ -+ t = ipt_get_target(e); -+ if (t->u.kernel.target->target) -+ return false; -+ -+ st = (struct xt_standard_target *) t; -+ if (st->verdict == XT_RETURN) -+ return false; -+ -+ if (st->verdict >= 0) -+ return false; -+ -+ *verdict = (unsigned)(-st->verdict) - 1; -+ return true; -+} -+ - /* Returns one of the generic firewall policies, like NF_ACCEPT. */ - unsigned int - ipt_do_table(void *priv, -@@ -267,27 +294,28 @@ ipt_do_table(void *priv, - unsigned int addend; - - /* Initialization */ -+ WARN_ON(!(table->valid_hooks & (1 << hook))); -+ local_bh_disable(); -+ private = READ_ONCE(table->private); /* Address dependency. */ -+ cpu = smp_processor_id(); -+ table_base = private->entries; -+ -+ e = get_entry(table_base, private->hook_entry[hook]); -+ if (ipt_handle_default_rule(e, &verdict)) { -+ struct xt_counters *counter; -+ -+ counter = xt_get_this_cpu_counter(&e->counters); -+ ADD_COUNTER(*counter, skb->len, 1); -+ local_bh_enable(); -+ return verdict; -+ } -+ - stackidx = 0; - ip = ip_hdr(skb); - indev = state->in ? state->in->name : nulldevname; - outdev = state->out ? state->out->name : nulldevname; -- /* We handle fragments by dealing with the first fragment as -- * if it was a normal packet. All other fragments are treated -- * normally, except that they will NEVER match rules that ask -- * things we don't know, ie. tcp syn flag or ports). If the -- * rule is also a fragment-specific rule, non-fragments won't -- * match it. */ -- acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET; -- acpar.thoff = ip_hdrlen(skb); -- acpar.hotdrop = false; -- acpar.state = state; - -- WARN_ON(!(table->valid_hooks & (1 << hook))); -- local_bh_disable(); - addend = xt_write_recseq_begin(); -- private = READ_ONCE(table->private); /* Address dependency. */ -- cpu = smp_processor_id(); -- table_base = private->entries; - jumpstack = (struct ipt_entry **)private->jumpstack[cpu]; - - /* Switch to alternate jumpstack if we're being invoked via TEE. -@@ -300,7 +328,16 @@ ipt_do_table(void *priv, - if (static_key_false(&xt_tee_enabled)) - jumpstack += private->stacksize * __this_cpu_read(nf_skb_duplicated); - -- e = get_entry(table_base, private->hook_entry[hook]); -+ /* We handle fragments by dealing with the first fragment as -+ * if it was a normal packet. All other fragments are treated -+ * normally, except that they will NEVER match rules that ask -+ * things we don't know, ie. tcp syn flag or ports). If the -+ * rule is also a fragment-specific rule, non-fragments won't -+ * match it. */ -+ acpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET; -+ acpar.thoff = ip_hdrlen(skb); -+ acpar.hotdrop = false; -+ acpar.state = state; - - do { - const struct xt_entry_target *t; diff --git a/target/linux/generic/pending-5.19/612-netfilter_match_reduce_memory_access.patch b/target/linux/generic/pending-5.19/612-netfilter_match_reduce_memory_access.patch deleted file mode 100644 index 79da6778b..000000000 --- a/target/linux/generic/pending-5.19/612-netfilter_match_reduce_memory_access.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: Felix Fietkau -Subject: netfilter: reduce match memory access - -Signed-off-by: Felix Fietkau ---- - net/ipv4/netfilter/ip_tables.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/net/ipv4/netfilter/ip_tables.c -+++ b/net/ipv4/netfilter/ip_tables.c -@@ -53,9 +53,9 @@ ip_packet_match(const struct iphdr *ip, - if (ipinfo->flags & IPT_F_NO_DEF_MATCH) - return true; - -- if (NF_INVF(ipinfo, IPT_INV_SRCIP, -+ if (NF_INVF(ipinfo, IPT_INV_SRCIP, ipinfo->smsk.s_addr && - (ip->saddr & ipinfo->smsk.s_addr) != ipinfo->src.s_addr) || -- NF_INVF(ipinfo, IPT_INV_DSTIP, -+ NF_INVF(ipinfo, IPT_INV_DSTIP, ipinfo->dmsk.s_addr && - (ip->daddr & ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr)) - return false; - diff --git a/target/linux/generic/pending-5.19/613-netfilter_optional_tcp_window_check.patch b/target/linux/generic/pending-5.19/613-netfilter_optional_tcp_window_check.patch deleted file mode 100644 index 328440f4f..000000000 --- a/target/linux/generic/pending-5.19/613-netfilter_optional_tcp_window_check.patch +++ /dev/null @@ -1,83 +0,0 @@ -From: Felix Fietkau -Subject: netfilter: optional tcp window check - -Signed-off-by: Felix Fietkau -Signed-off-by: Christian 'Ansuel' Marangi ---- - net/netfilter/nf_conntrack_proto_tcp.c | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - ---- a/net/netfilter/nf_conntrack_proto_tcp.c -+++ b/net/netfilter/nf_conntrack_proto_tcp.c -@@ -490,6 +490,9 @@ static bool tcp_in_window(struct nf_conn - s32 receiver_offset; - bool res, in_recv_win; - -+ if (tn->tcp_no_window_check) -+ return true; -+ - /* - * Get the required data from the packet. - */ -@@ -1161,7 +1164,7 @@ int nf_conntrack_tcp_packet(struct nf_co - IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED && - timeouts[new_state] > timeouts[TCP_CONNTRACK_UNACK]) - timeout = timeouts[TCP_CONNTRACK_UNACK]; -- else if (ct->proto.tcp.last_win == 0 && -+ else if (!tn->tcp_no_window_check && ct->proto.tcp.last_win == 0 && - timeouts[new_state] > timeouts[TCP_CONNTRACK_RETRANS]) - timeout = timeouts[TCP_CONNTRACK_RETRANS]; - else -@@ -1477,6 +1480,9 @@ void nf_conntrack_tcp_init_net(struct ne - */ - tn->tcp_be_liberal = 0; - -+ /* Skip Windows Check */ -+ tn->tcp_no_window_check = 0; -+ - /* If it's non-zero, we turn off RST sequence number check */ - tn->tcp_ignore_invalid_rst = 0; - ---- a/net/netfilter/nf_conntrack_standalone.c -+++ b/net/netfilter/nf_conntrack_standalone.c -@@ -636,6 +636,7 @@ enum nf_ct_sysctl_index { - #endif - NF_SYSCTL_CT_PROTO_TCP_LOOSE, - NF_SYSCTL_CT_PROTO_TCP_LIBERAL, -+ NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK, - NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST, - NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS, - NF_SYSCTL_CT_PROTO_TIMEOUT_UDP, -@@ -852,6 +853,14 @@ static struct ctl_table nf_ct_sysctl_tab - .extra1 = SYSCTL_ZERO, - .extra2 = SYSCTL_ONE, - }, -+ [NF_SYSCTL_CT_PROTO_TCP_NO_WINDOW_CHECK] = { -+ .procname = "nf_conntrack_tcp_no_window_check", -+ .maxlen = sizeof(u8), -+ .mode = 0644, -+ .proc_handler = proc_dou8vec_minmax, -+ .extra1 = SYSCTL_ZERO, -+ .extra2 = SYSCTL_ONE, -+ }, - [NF_SYSCTL_CT_PROTO_TCP_IGNORE_INVALID_RST] = { - .procname = "nf_conntrack_tcp_ignore_invalid_rst", - .maxlen = sizeof(u8), -@@ -1068,6 +1077,7 @@ static void nf_conntrack_standalone_init - - XASSIGN(LOOSE, &tn->tcp_loose); - XASSIGN(LIBERAL, &tn->tcp_be_liberal); -+ XASSIGN(NO_WINDOW_CHECK, &tn->tcp_no_window_check); - XASSIGN(MAX_RETRANS, &tn->tcp_max_retrans); - XASSIGN(IGNORE_INVALID_RST, &tn->tcp_ignore_invalid_rst); - #undef XASSIGN ---- a/include/net/netns/conntrack.h -+++ b/include/net/netns/conntrack.h -@@ -26,6 +26,7 @@ struct nf_tcp_net { - unsigned int timeouts[TCP_CONNTRACK_TIMEOUT_MAX]; - u8 tcp_loose; - u8 tcp_be_liberal; -+ u8 tcp_no_window_check; - u8 tcp_max_retrans; - u8 tcp_ignore_invalid_rst; - #if IS_ENABLED(CONFIG_NF_FLOW_TABLE) diff --git a/target/linux/generic/pending-5.19/620-net_sched-codel-do-not-defer-queue-length-update.patch b/target/linux/generic/pending-5.19/620-net_sched-codel-do-not-defer-queue-length-update.patch deleted file mode 100644 index 4b4825ae3..000000000 --- a/target/linux/generic/pending-5.19/620-net_sched-codel-do-not-defer-queue-length-update.patch +++ /dev/null @@ -1,86 +0,0 @@ -From: Konstantin Khlebnikov -Date: Mon, 21 Aug 2017 11:14:14 +0300 -Subject: [PATCH] net_sched/codel: do not defer queue length update - -When codel wants to drop last packet in ->dequeue() it cannot call -qdisc_tree_reduce_backlog() right away - it will notify parent qdisc -about zero qlen and HTB/HFSC will deactivate class. The same class will -be deactivated second time by caller of ->dequeue(). Currently codel and -fq_codel defer update. This triggers warning in HFSC when it's qlen != 0 -but there is no active classes. - -This patch update parent queue length immediately: just temporary increase -qlen around qdisc_tree_reduce_backlog() to prevent first class deactivation -if we have skb to return. - -This might open another problem in HFSC - now operation peek could fail and -deactivate parent class. - -Signed-off-by: Konstantin Khlebnikov -Link: https://bugzilla.kernel.org/show_bug.cgi?id=109581 ---- - ---- a/net/sched/sch_codel.c -+++ b/net/sched/sch_codel.c -@@ -95,11 +95,17 @@ static struct sk_buff *codel_qdisc_deque - &q->stats, qdisc_pkt_len, codel_get_enqueue_time, - drop_func, dequeue_func); - -- /* We cant call qdisc_tree_reduce_backlog() if our qlen is 0, -- * or HTB crashes. Defer it for next round. -+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate -+ * parent class, dequeue in parent qdisc will do the same if we -+ * return skb. Temporary increment qlen if we have skb. - */ -- if (q->stats.drop_count && sch->q.qlen) { -- qdisc_tree_reduce_backlog(sch, q->stats.drop_count, q->stats.drop_len); -+ if (q->stats.drop_count) { -+ if (skb) -+ sch->q.qlen++; -+ qdisc_tree_reduce_backlog(sch, q->stats.drop_count, -+ q->stats.drop_len); -+ if (skb) -+ sch->q.qlen--; - q->stats.drop_count = 0; - q->stats.drop_len = 0; - } ---- a/net/sched/sch_fq_codel.c -+++ b/net/sched/sch_fq_codel.c -@@ -304,6 +304,21 @@ begin: - &flow->cvars, &q->cstats, qdisc_pkt_len, - codel_get_enqueue_time, drop_func, dequeue_func); - -+ /* If our qlen is 0 qdisc_tree_reduce_backlog() will deactivate -+ * parent class, dequeue in parent qdisc will do the same if we -+ * return skb. Temporary increment qlen if we have skb. -+ */ -+ if (q->cstats.drop_count) { -+ if (skb) -+ sch->q.qlen++; -+ qdisc_tree_reduce_backlog(sch, q->cstats.drop_count, -+ q->cstats.drop_len); -+ if (skb) -+ sch->q.qlen--; -+ q->cstats.drop_count = 0; -+ q->cstats.drop_len = 0; -+ } -+ - if (!skb) { - /* force a pass through old_flows to prevent starvation */ - if ((head == &q->new_flows) && !list_empty(&q->old_flows)) -@@ -314,15 +329,6 @@ begin: - } - qdisc_bstats_update(sch, skb); - flow->deficit -= qdisc_pkt_len(skb); -- /* We cant call qdisc_tree_reduce_backlog() if our qlen is 0, -- * or HTB crashes. Defer it for next round. -- */ -- if (q->cstats.drop_count && sch->q.qlen) { -- qdisc_tree_reduce_backlog(sch, q->cstats.drop_count, -- q->cstats.drop_len); -- q->cstats.drop_count = 0; -- q->cstats.drop_len = 0; -- } - return skb; - } - diff --git a/target/linux/generic/pending-5.19/630-packet_socket_type.patch b/target/linux/generic/pending-5.19/630-packet_socket_type.patch deleted file mode 100644 index b11d87af2..000000000 --- a/target/linux/generic/pending-5.19/630-packet_socket_type.patch +++ /dev/null @@ -1,138 +0,0 @@ -From: Felix Fietkau -Subject: net: add an optimization for dealing with raw sockets - -lede-commit: 4898039703d7315f0f3431c860123338ec3be0f6 -Signed-off-by: Felix Fietkau ---- - include/uapi/linux/if_packet.h | 3 +++ - net/packet/af_packet.c | 34 +++++++++++++++++++++++++++------- - net/packet/internal.h | 1 + - 3 files changed, 31 insertions(+), 7 deletions(-) - ---- a/include/uapi/linux/if_packet.h -+++ b/include/uapi/linux/if_packet.h -@@ -33,6 +33,8 @@ struct sockaddr_ll { - #define PACKET_KERNEL 7 /* To kernel space */ - /* Unused, PACKET_FASTROUTE and PACKET_LOOPBACK are invisible to user space */ - #define PACKET_FASTROUTE 6 /* Fastrouted frame */ -+#define PACKET_MASK_ANY 0xffffffff /* mask for packet type bits */ -+ - - /* Packet socket options */ - -@@ -59,6 +61,7 @@ struct sockaddr_ll { - #define PACKET_ROLLOVER_STATS 21 - #define PACKET_FANOUT_DATA 22 - #define PACKET_IGNORE_OUTGOING 23 -+#define PACKET_RECV_TYPE 24 - - #define PACKET_FANOUT_HASH 0 - #define PACKET_FANOUT_LB 1 ---- a/net/packet/af_packet.c -+++ b/net/packet/af_packet.c -@@ -1861,6 +1861,7 @@ static int packet_rcv_spkt(struct sk_buf - { - struct sock *sk; - struct sockaddr_pkt *spkt; -+ struct packet_sock *po; - - /* - * When we registered the protocol we saved the socket in the data -@@ -1868,6 +1869,7 @@ static int packet_rcv_spkt(struct sk_buf - */ - - sk = pt->af_packet_priv; -+ po = pkt_sk(sk); - - /* - * Yank back the headers [hope the device set this -@@ -1880,7 +1882,7 @@ static int packet_rcv_spkt(struct sk_buf - * so that this procedure is noop. - */ - -- if (skb->pkt_type == PACKET_LOOPBACK) -+ if (!(po->pkt_type & (1 << skb->pkt_type))) - goto out; - - if (!net_eq(dev_net(dev), sock_net(sk))) -@@ -2128,12 +2130,12 @@ static int packet_rcv(struct sk_buff *sk - unsigned int snaplen, res; - bool is_drop_n_account = false; - -- if (skb->pkt_type == PACKET_LOOPBACK) -- goto drop; -- - sk = pt->af_packet_priv; - po = pkt_sk(sk); - -+ if (!(po->pkt_type & (1 << skb->pkt_type))) -+ goto drop; -+ - if (!net_eq(dev_net(dev), sock_net(sk))) - goto drop; - -@@ -2260,12 +2262,12 @@ static int tpacket_rcv(struct sk_buff *s - BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32); - BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48); - -- if (skb->pkt_type == PACKET_LOOPBACK) -- goto drop; -- - sk = pt->af_packet_priv; - po = pkt_sk(sk); - -+ if (!(po->pkt_type & (1 << skb->pkt_type))) -+ goto drop; -+ - if (!net_eq(dev_net(dev), sock_net(sk))) - goto drop; - -@@ -3372,6 +3374,7 @@ static int packet_create(struct net *net - mutex_init(&po->pg_vec_lock); - po->rollover = NULL; - po->prot_hook.func = packet_rcv; -+ po->pkt_type = PACKET_MASK_ANY & ~(1 << PACKET_LOOPBACK); - - if (sock->type == SOCK_PACKET) - po->prot_hook.func = packet_rcv_spkt; -@@ -4011,6 +4014,16 @@ packet_setsockopt(struct socket *sock, i - po->xmit = val ? packet_direct_xmit : dev_queue_xmit; - return 0; - } -+ case PACKET_RECV_TYPE: -+ { -+ unsigned int val; -+ if (optlen != sizeof(val)) -+ return -EINVAL; -+ if (copy_from_sockptr(&val, optval, sizeof(val))) -+ return -EFAULT; -+ po->pkt_type = val & ~BIT(PACKET_LOOPBACK); -+ return 0; -+ } - default: - return -ENOPROTOOPT; - } -@@ -4067,6 +4080,13 @@ static int packet_getsockopt(struct sock - case PACKET_VNET_HDR: - val = po->has_vnet_hdr; - break; -+ case PACKET_RECV_TYPE: -+ if (len > sizeof(unsigned int)) -+ len = sizeof(unsigned int); -+ val = po->pkt_type; -+ -+ data = &val; -+ break; - case PACKET_VERSION: - val = po->tp_version; - break; ---- a/net/packet/internal.h -+++ b/net/packet/internal.h -@@ -137,6 +137,7 @@ struct packet_sock { - int (*xmit)(struct sk_buff *skb); - struct packet_type prot_hook ____cacheline_aligned_in_smp; - atomic_t tp_drops ____cacheline_aligned_in_smp; -+ unsigned int pkt_type; - }; - - static inline struct packet_sock *pkt_sk(struct sock *sk) diff --git a/target/linux/generic/pending-5.19/655-increase_skb_pad.patch b/target/linux/generic/pending-5.19/655-increase_skb_pad.patch deleted file mode 100644 index a6c5a35e1..000000000 --- a/target/linux/generic/pending-5.19/655-increase_skb_pad.patch +++ /dev/null @@ -1,20 +0,0 @@ -From: Felix Fietkau -Subject: kernel: add a few patches for avoiding unnecessary skb reallocations - significantly improves ethernet<->wireless performance - -lede-commit: 6f89cffc9add6939d44a6b54cf9a5e77849aa7fd -Signed-off-by: Felix Fietkau ---- - include/linux/skbuff.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -3123,7 +3123,7 @@ static inline int pskb_network_may_pull( - * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8) - */ - #ifndef NET_SKB_PAD --#define NET_SKB_PAD max(32, L1_CACHE_BYTES) -+#define NET_SKB_PAD max(64, L1_CACHE_BYTES) - #endif - - int ___pskb_trim(struct sk_buff *skb, unsigned int len); diff --git a/target/linux/generic/pending-5.19/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch b/target/linux/generic/pending-5.19/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch deleted file mode 100644 index 2ff4ae6ea..000000000 --- a/target/linux/generic/pending-5.19/666-Add-support-for-MAP-E-FMRs-mesh-mode.patch +++ /dev/null @@ -1,511 +0,0 @@ -From: Steven Barth -Subject: Add support for MAP-E FMRs (mesh mode) - -MAP-E FMRs (draft-ietf-softwire-map-10) are rules for IPv4-communication -between MAP CEs (mesh mode) without the need to forward such data to a -border relay. This is similar to how 6rd works but for IPv4 over IPv6. - -Signed-off-by: Steven Barth ---- - include/net/ip6_tunnel.h | 13 ++ - include/uapi/linux/if_tunnel.h | 13 ++ - net/ipv6/ip6_tunnel.c | 276 +++++++++++++++++++++++++++++++++++++++-- - 3 files changed, 291 insertions(+), 11 deletions(-) - ---- a/include/net/ip6_tunnel.h -+++ b/include/net/ip6_tunnel.h -@@ -18,6 +18,18 @@ - /* determine capability on a per-packet basis */ - #define IP6_TNL_F_CAP_PER_PACKET 0x40000 - -+/* IPv6 tunnel FMR */ -+struct __ip6_tnl_fmr { -+ struct __ip6_tnl_fmr *next; /* next fmr in list */ -+ struct in6_addr ip6_prefix; -+ struct in_addr ip4_prefix; -+ -+ __u8 ip6_prefix_len; -+ __u8 ip4_prefix_len; -+ __u8 ea_len; -+ __u8 offset; -+}; -+ - struct __ip6_tnl_parm { - char name[IFNAMSIZ]; /* name of tunnel device */ - int link; /* ifindex of underlying L2 interface */ -@@ -29,6 +41,7 @@ struct __ip6_tnl_parm { - __u32 flags; /* tunnel flags */ - struct in6_addr laddr; /* local tunnel end-point address */ - struct in6_addr raddr; /* remote tunnel end-point address */ -+ struct __ip6_tnl_fmr *fmrs; /* FMRs */ - - __be16 i_flags; - __be16 o_flags; ---- a/include/uapi/linux/if_tunnel.h -+++ b/include/uapi/linux/if_tunnel.h -@@ -77,10 +77,23 @@ enum { - IFLA_IPTUN_ENCAP_DPORT, - IFLA_IPTUN_COLLECT_METADATA, - IFLA_IPTUN_FWMARK, -+ IFLA_IPTUN_FMRS, - __IFLA_IPTUN_MAX, - }; - #define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1) - -+enum { -+ IFLA_IPTUN_FMR_UNSPEC, -+ IFLA_IPTUN_FMR_IP6_PREFIX, -+ IFLA_IPTUN_FMR_IP4_PREFIX, -+ IFLA_IPTUN_FMR_IP6_PREFIX_LEN, -+ IFLA_IPTUN_FMR_IP4_PREFIX_LEN, -+ IFLA_IPTUN_FMR_EA_LEN, -+ IFLA_IPTUN_FMR_OFFSET, -+ __IFLA_IPTUN_FMR_MAX, -+}; -+#define IFLA_IPTUN_FMR_MAX (__IFLA_IPTUN_FMR_MAX - 1) -+ - enum tunnel_encap_types { - TUNNEL_ENCAP_NONE, - TUNNEL_ENCAP_FOU, ---- a/net/ipv6/ip6_tunnel.c -+++ b/net/ipv6/ip6_tunnel.c -@@ -11,6 +11,9 @@ - * linux/net/ipv6/sit.c and linux/net/ipv4/ipip.c - * - * RFC 2473 -+ * -+ * Changes: -+ * Steven Barth : MAP-E FMR support - */ - - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -@@ -67,9 +70,9 @@ static bool log_ecn_error = true; - module_param(log_ecn_error, bool, 0644); - MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN"); - --static u32 HASH(const struct in6_addr *addr1, const struct in6_addr *addr2) -+static u32 HASH(const struct in6_addr *addr) - { -- u32 hash = ipv6_addr_hash(addr1) ^ ipv6_addr_hash(addr2); -+ u32 hash = ipv6_addr_hash(addr); - - return hash_32(hash, IP6_TUNNEL_HASH_SIZE_SHIFT); - } -@@ -114,17 +117,33 @@ static struct ip6_tnl * - ip6_tnl_lookup(struct net *net, int link, - const struct in6_addr *remote, const struct in6_addr *local) - { -- unsigned int hash = HASH(remote, local); -+ unsigned int hash = HASH(local); - struct ip6_tnl *t, *cand = NULL; - struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); - struct in6_addr any; - - for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) { - if (!ipv6_addr_equal(local, &t->parms.laddr) || -- !ipv6_addr_equal(remote, &t->parms.raddr) || - !(t->dev->flags & IFF_UP)) - continue; - -+ if (!ipv6_addr_equal(remote, &t->parms.raddr)) { -+ struct __ip6_tnl_fmr *fmr; -+ bool found = false; -+ -+ for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) { -+ if (!ipv6_prefix_equal(remote, &fmr->ip6_prefix, -+ fmr->ip6_prefix_len)) -+ continue; -+ -+ found = true; -+ break; -+ } -+ -+ if (!found) -+ continue; -+ } -+ - if (link == t->parms.link) - return t; - else -@@ -132,7 +151,7 @@ ip6_tnl_lookup(struct net *net, int link - } - - memset(&any, 0, sizeof(any)); -- hash = HASH(&any, local); -+ hash = HASH(local); - for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) { - if (!ipv6_addr_equal(local, &t->parms.laddr) || - !ipv6_addr_any(&t->parms.raddr) || -@@ -145,7 +164,7 @@ ip6_tnl_lookup(struct net *net, int link - cand = t; - } - -- hash = HASH(remote, &any); -+ hash = HASH(&any); - for_each_ip6_tunnel_rcu(ip6n->tnls_r_l[hash]) { - if (!ipv6_addr_equal(remote, &t->parms.raddr) || - !ipv6_addr_any(&t->parms.laddr) || -@@ -194,7 +213,7 @@ ip6_tnl_bucket(struct ip6_tnl_net *ip6n, - - if (!ipv6_addr_any(remote) || !ipv6_addr_any(local)) { - prio = 1; -- h = HASH(remote, local); -+ h = HASH(local); - } - return &ip6n->tnls[prio][h]; - } -@@ -376,6 +395,12 @@ ip6_tnl_dev_uninit(struct net_device *de - struct net *net = t->net; - struct ip6_tnl_net *ip6n = net_generic(net, ip6_tnl_net_id); - -+ while (t->parms.fmrs) { -+ struct __ip6_tnl_fmr *next = t->parms.fmrs->next; -+ kfree(t->parms.fmrs); -+ t->parms.fmrs = next; -+ } -+ - if (dev == ip6n->fb_tnl_dev) - RCU_INIT_POINTER(ip6n->tnls_wc[0], NULL); - else -@@ -788,6 +813,107 @@ int ip6_tnl_rcv_ctl(struct ip6_tnl *t, - } - EXPORT_SYMBOL_GPL(ip6_tnl_rcv_ctl); - -+/** -+ * ip4ip6_fmr_calc - calculate target / source IPv6-address based on FMR -+ * @dest: destination IPv6 address buffer -+ * @skb: received socket buffer -+ * @fmr: MAP FMR -+ * @xmit: Calculate for xmit or rcv -+ **/ -+static void ip4ip6_fmr_calc(struct in6_addr *dest, -+ const struct iphdr *iph, const uint8_t *end, -+ const struct __ip6_tnl_fmr *fmr, bool xmit) -+{ -+ int psidlen = fmr->ea_len - (32 - fmr->ip4_prefix_len); -+ u8 *portp = NULL; -+ bool use_dest_addr; -+ const struct iphdr *dsth = iph; -+ -+ if ((u8*)dsth >= end) -+ return; -+ -+ /* find significant IP header */ -+ if (iph->protocol == IPPROTO_ICMP) { -+ struct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4); -+ if (ih && ((u8*)&ih[1]) <= end && ( -+ ih->type == ICMP_DEST_UNREACH || -+ ih->type == ICMP_SOURCE_QUENCH || -+ ih->type == ICMP_TIME_EXCEEDED || -+ ih->type == ICMP_PARAMETERPROB || -+ ih->type == ICMP_REDIRECT)) -+ dsth = (const struct iphdr*)&ih[1]; -+ } -+ -+ /* in xmit-path use dest port by default and source port only if -+ this is an ICMP reply to something else; vice versa in rcv-path */ -+ use_dest_addr = (xmit && dsth == iph) || (!xmit && dsth != iph); -+ -+ /* get dst port */ -+ if (((u8*)&dsth[1]) <= end && ( -+ dsth->protocol == IPPROTO_UDP || -+ dsth->protocol == IPPROTO_TCP || -+ dsth->protocol == IPPROTO_SCTP || -+ dsth->protocol == IPPROTO_DCCP)) { -+ /* for UDP, TCP, SCTP and DCCP source and dest port -+ follow IPv4 header directly */ -+ portp = ((u8*)dsth) + dsth->ihl * 4; -+ -+ if (use_dest_addr) -+ portp += sizeof(u16); -+ } else if (iph->protocol == IPPROTO_ICMP) { -+ struct icmphdr *ih = (struct icmphdr*)(((u8*)dsth) + dsth->ihl * 4); -+ -+ /* use icmp identifier as port */ -+ if (((u8*)&ih) <= end && ( -+ (use_dest_addr && ( -+ ih->type == ICMP_ECHOREPLY || -+ ih->type == ICMP_TIMESTAMPREPLY || -+ ih->type == ICMP_INFO_REPLY || -+ ih->type == ICMP_ADDRESSREPLY)) || -+ (!use_dest_addr && ( -+ ih->type == ICMP_ECHO || -+ ih->type == ICMP_TIMESTAMP || -+ ih->type == ICMP_INFO_REQUEST || -+ ih->type == ICMP_ADDRESS) -+ ))) -+ portp = (u8*)&ih->un.echo.id; -+ } -+ -+ if ((portp && &portp[2] <= end) || psidlen == 0) { -+ int frombyte = fmr->ip6_prefix_len / 8; -+ int fromrem = fmr->ip6_prefix_len % 8; -+ int bytes = sizeof(struct in6_addr) - frombyte; -+ const u32 *addr = (use_dest_addr) ? &iph->daddr : &iph->saddr; -+ u64 eabits = ((u64)ntohl(*addr)) << (32 + fmr->ip4_prefix_len); -+ u64 t = 0; -+ -+ /* extract PSID from port and add it to eabits */ -+ u16 psidbits = 0; -+ if (psidlen > 0) { -+ psidbits = ((u16)portp[0]) << 8 | ((u16)portp[1]); -+ psidbits >>= 16 - psidlen - fmr->offset; -+ psidbits = (u16)(psidbits << (16 - psidlen)); -+ eabits |= ((u64)psidbits) << (48 - (fmr->ea_len - psidlen)); -+ } -+ -+ /* rewrite destination address */ -+ *dest = fmr->ip6_prefix; -+ memcpy(&dest->s6_addr[10], addr, sizeof(*addr)); -+ dest->s6_addr16[7] = htons(psidbits >> (16 - psidlen)); -+ -+ if (bytes > sizeof(u64)) -+ bytes = sizeof(u64); -+ -+ /* insert eabits */ -+ memcpy(&t, &dest->s6_addr[frombyte], bytes); -+ t = be64_to_cpu(t) & ~(((((u64)1) << fmr->ea_len) - 1) -+ << (64 - fmr->ea_len - fromrem)); -+ t = cpu_to_be64(t | (eabits >> fromrem)); -+ memcpy(&dest->s6_addr[frombyte], &t, bytes); -+ } -+} -+ -+ - static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb, - const struct tnl_ptk_info *tpi, - struct metadata_dst *tun_dst, -@@ -841,6 +967,27 @@ static int __ip6_tnl_rcv(struct ip6_tnl - skb_reset_network_header(skb); - memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); - -+ if (tpi->proto == htons(ETH_P_IP) && tunnel->parms.fmrs && -+ !ipv6_addr_equal(&ipv6h->saddr, &tunnel->parms.raddr)) { -+ /* Packet didn't come from BR, so lookup FMR */ -+ struct __ip6_tnl_fmr *fmr; -+ struct in6_addr expected = tunnel->parms.raddr; -+ for (fmr = tunnel->parms.fmrs; fmr; fmr = fmr->next) -+ if (ipv6_prefix_equal(&ipv6h->saddr, -+ &fmr->ip6_prefix, fmr->ip6_prefix_len)) -+ break; -+ -+ /* Check that IPv6 matches IPv4 source to prevent spoofing */ -+ if (fmr) -+ ip4ip6_fmr_calc(&expected, ip_hdr(skb), -+ skb_tail_pointer(skb), fmr, false); -+ -+ if (!ipv6_addr_equal(&ipv6h->saddr, &expected)) { -+ rcu_read_unlock(); -+ goto drop; -+ } -+ } -+ - __skb_tunnel_rx(skb, tunnel->dev, tunnel->net); - - err = dscp_ecn_decapsulate(tunnel, ipv6h, skb); -@@ -992,6 +1139,7 @@ static void init_tel_txopt(struct ipv6_t - opt->ops.opt_nflen = 8; - } - -+ - /** - * ip6_tnl_addr_conflict - compare packet addresses to tunnel's own - * @t: the outgoing tunnel device -@@ -1280,6 +1428,7 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str - u8 protocol) - { - struct ip6_tnl *t = netdev_priv(dev); -+ struct __ip6_tnl_fmr *fmr; - struct ipv6hdr *ipv6h; - const struct iphdr *iph; - int encap_limit = -1; -@@ -1379,6 +1528,18 @@ ipxip6_tnl_xmit(struct sk_buff *skb, str - fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL); - dsfield = INET_ECN_encapsulate(dsfield, orig_dsfield); - -+ /* try to find matching FMR */ -+ for (fmr = t->parms.fmrs; fmr; fmr = fmr->next) { -+ unsigned mshift = 32 - fmr->ip4_prefix_len; -+ if (ntohl(fmr->ip4_prefix.s_addr) >> mshift == -+ ntohl(ip_hdr(skb)->daddr) >> mshift) -+ break; -+ } -+ -+ /* change dstaddr according to FMR */ -+ if (fmr) -+ ip4ip6_fmr_calc(&fl6.daddr, ip_hdr(skb), skb_tail_pointer(skb), fmr, true); -+ - if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) - return -1; - -@@ -1531,6 +1692,14 @@ ip6_tnl_change(struct ip6_tnl *t, const - t->parms.link = p->link; - t->parms.proto = p->proto; - t->parms.fwmark = p->fwmark; -+ -+ while (t->parms.fmrs) { -+ struct __ip6_tnl_fmr *next = t->parms.fmrs->next; -+ kfree(t->parms.fmrs); -+ t->parms.fmrs = next; -+ } -+ t->parms.fmrs = p->fmrs; -+ - dst_cache_reset(&t->dst_cache); - ip6_tnl_link_config(t); - return 0; -@@ -1569,6 +1738,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_ - p->flowinfo = u->flowinfo; - p->link = u->link; - p->proto = u->proto; -+ p->fmrs = NULL; - memcpy(p->name, u->name, sizeof(u->name)); - } - -@@ -1955,6 +2125,15 @@ static int ip6_tnl_validate(struct nlatt - return 0; - } - -+static const struct nla_policy ip6_tnl_fmr_policy[IFLA_IPTUN_FMR_MAX + 1] = { -+ [IFLA_IPTUN_FMR_IP6_PREFIX] = { .len = sizeof(struct in6_addr) }, -+ [IFLA_IPTUN_FMR_IP4_PREFIX] = { .len = sizeof(struct in_addr) }, -+ [IFLA_IPTUN_FMR_IP6_PREFIX_LEN] = { .type = NLA_U8 }, -+ [IFLA_IPTUN_FMR_IP4_PREFIX_LEN] = { .type = NLA_U8 }, -+ [IFLA_IPTUN_FMR_EA_LEN] = { .type = NLA_U8 }, -+ [IFLA_IPTUN_FMR_OFFSET] = { .type = NLA_U8 } -+}; -+ - static void ip6_tnl_netlink_parms(struct nlattr *data[], - struct __ip6_tnl_parm *parms) - { -@@ -1992,6 +2171,46 @@ static void ip6_tnl_netlink_parms(struct - - if (data[IFLA_IPTUN_FWMARK]) - parms->fwmark = nla_get_u32(data[IFLA_IPTUN_FWMARK]); -+ -+ if (data[IFLA_IPTUN_FMRS]) { -+ unsigned rem; -+ struct nlattr *fmr; -+ nla_for_each_nested(fmr, data[IFLA_IPTUN_FMRS], rem) { -+ struct nlattr *fmrd[IFLA_IPTUN_FMR_MAX + 1], *c; -+ struct __ip6_tnl_fmr *nfmr; -+ -+ nla_parse_nested(fmrd, IFLA_IPTUN_FMR_MAX, -+ fmr, ip6_tnl_fmr_policy, NULL); -+ -+ if (!(nfmr = kzalloc(sizeof(*nfmr), GFP_KERNEL))) -+ continue; -+ -+ nfmr->offset = 6; -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX])) -+ nla_memcpy(&nfmr->ip6_prefix, fmrd[IFLA_IPTUN_FMR_IP6_PREFIX], -+ sizeof(nfmr->ip6_prefix)); -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX])) -+ nla_memcpy(&nfmr->ip4_prefix, fmrd[IFLA_IPTUN_FMR_IP4_PREFIX], -+ sizeof(nfmr->ip4_prefix)); -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_IP6_PREFIX_LEN])) -+ nfmr->ip6_prefix_len = nla_get_u8(c); -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_IP4_PREFIX_LEN])) -+ nfmr->ip4_prefix_len = nla_get_u8(c); -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_EA_LEN])) -+ nfmr->ea_len = nla_get_u8(c); -+ -+ if ((c = fmrd[IFLA_IPTUN_FMR_OFFSET])) -+ nfmr->offset = nla_get_u8(c); -+ -+ nfmr->next = parms->fmrs; -+ parms->fmrs = nfmr; -+ } -+ } - } - - static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[], -@@ -2107,6 +2326,12 @@ static void ip6_tnl_dellink(struct net_d - - static size_t ip6_tnl_get_size(const struct net_device *dev) - { -+ const struct ip6_tnl *t = netdev_priv(dev); -+ struct __ip6_tnl_fmr *c; -+ int fmrs = 0; -+ for (c = t->parms.fmrs; c; c = c->next) -+ ++fmrs; -+ - return - /* IFLA_IPTUN_LINK */ - nla_total_size(4) + -@@ -2136,6 +2361,24 @@ static size_t ip6_tnl_get_size(const str - nla_total_size(0) + - /* IFLA_IPTUN_FWMARK */ - nla_total_size(4) + -+ /* IFLA_IPTUN_FMRS */ -+ nla_total_size(0) + -+ ( -+ /* nest */ -+ nla_total_size(0) + -+ /* IFLA_IPTUN_FMR_IP6_PREFIX */ -+ nla_total_size(sizeof(struct in6_addr)) + -+ /* IFLA_IPTUN_FMR_IP4_PREFIX */ -+ nla_total_size(sizeof(struct in_addr)) + -+ /* IFLA_IPTUN_FMR_EA_LEN */ -+ nla_total_size(1) + -+ /* IFLA_IPTUN_FMR_IP6_PREFIX_LEN */ -+ nla_total_size(1) + -+ /* IFLA_IPTUN_FMR_IP4_PREFIX_LEN */ -+ nla_total_size(1) + -+ /* IFLA_IPTUN_FMR_OFFSET */ -+ nla_total_size(1) -+ ) * fmrs + - 0; - } - -@@ -2143,6 +2386,9 @@ static int ip6_tnl_fill_info(struct sk_b - { - struct ip6_tnl *tunnel = netdev_priv(dev); - struct __ip6_tnl_parm *parm = &tunnel->parms; -+ struct __ip6_tnl_fmr *c; -+ int fmrcnt = 0; -+ struct nlattr *fmrs; - - if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) || - nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) || -@@ -2152,9 +2398,27 @@ static int ip6_tnl_fill_info(struct sk_b - nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) || - nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) || - nla_put_u8(skb, IFLA_IPTUN_PROTO, parm->proto) || -- nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark)) -+ nla_put_u32(skb, IFLA_IPTUN_FWMARK, parm->fwmark) || -+ !(fmrs = nla_nest_start(skb, IFLA_IPTUN_FMRS))) - goto nla_put_failure; - -+ for (c = parm->fmrs; c; c = c->next) { -+ struct nlattr *fmr = nla_nest_start(skb, ++fmrcnt); -+ if (!fmr || -+ nla_put(skb, IFLA_IPTUN_FMR_IP6_PREFIX, -+ sizeof(c->ip6_prefix), &c->ip6_prefix) || -+ nla_put(skb, IFLA_IPTUN_FMR_IP4_PREFIX, -+ sizeof(c->ip4_prefix), &c->ip4_prefix) || -+ nla_put_u8(skb, IFLA_IPTUN_FMR_IP6_PREFIX_LEN, c->ip6_prefix_len) || -+ nla_put_u8(skb, IFLA_IPTUN_FMR_IP4_PREFIX_LEN, c->ip4_prefix_len) || -+ nla_put_u8(skb, IFLA_IPTUN_FMR_EA_LEN, c->ea_len) || -+ nla_put_u8(skb, IFLA_IPTUN_FMR_OFFSET, c->offset)) -+ goto nla_put_failure; -+ -+ nla_nest_end(skb, fmr); -+ } -+ nla_nest_end(skb, fmrs); -+ - if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, tunnel->encap.type) || - nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, tunnel->encap.sport) || - nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) || -@@ -2194,6 +2458,7 @@ static const struct nla_policy ip6_tnl_p - [IFLA_IPTUN_ENCAP_DPORT] = { .type = NLA_U16 }, - [IFLA_IPTUN_COLLECT_METADATA] = { .type = NLA_FLAG }, - [IFLA_IPTUN_FWMARK] = { .type = NLA_U32 }, -+ [IFLA_IPTUN_FMRS] = { .type = NLA_NESTED }, - }; - - static struct rtnl_link_ops ip6_link_ops __read_mostly = { diff --git a/target/linux/generic/pending-5.19/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch b/target/linux/generic/pending-5.19/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch deleted file mode 100644 index c3980518a..000000000 --- a/target/linux/generic/pending-5.19/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch +++ /dev/null @@ -1,263 +0,0 @@ -From: Jonas Gorski -Subject: ipv6: allow rejecting with "source address failed policy" - -RFC6204 L-14 requires rejecting traffic from invalid addresses with -ICMPv6 Destination Unreachable, Code 5 (Source address failed ingress/ -egress policy) on the LAN side, so add an appropriate rule for that. - -Signed-off-by: Jonas Gorski ---- - include/net/netns/ipv6.h | 1 + - include/uapi/linux/fib_rules.h | 4 +++ - include/uapi/linux/rtnetlink.h | 1 + - net/ipv4/fib_semantics.c | 4 +++ - net/ipv4/fib_trie.c | 1 + - net/ipv4/ipmr.c | 1 + - net/ipv6/fib6_rules.c | 4 +++ - net/ipv6/ip6mr.c | 2 ++ - net/ipv6/route.c | 58 +++++++++++++++++++++++++++++++++++++++++- - 9 files changed, 75 insertions(+), 1 deletion(-) - ---- a/include/net/netns/ipv6.h -+++ b/include/net/netns/ipv6.h -@@ -85,6 +85,7 @@ struct netns_ipv6 { - unsigned int fib6_routes_require_src; - #endif - struct rt6_info *ip6_prohibit_entry; -+ struct rt6_info *ip6_policy_failed_entry; - struct rt6_info *ip6_blk_hole_entry; - struct fib6_table *fib6_local_tbl; - struct fib_rules_ops *fib6_rules_ops; ---- a/include/uapi/linux/fib_rules.h -+++ b/include/uapi/linux/fib_rules.h -@@ -82,6 +82,10 @@ enum { - FR_ACT_BLACKHOLE, /* Drop without notification */ - FR_ACT_UNREACHABLE, /* Drop with ENETUNREACH */ - FR_ACT_PROHIBIT, /* Drop with EACCES */ -+ FR_ACT_RES9, -+ FR_ACT_RES10, -+ FR_ACT_RES11, -+ FR_ACT_POLICY_FAILED, /* Drop with EACCES */ - __FR_ACT_MAX, - }; - ---- a/include/uapi/linux/rtnetlink.h -+++ b/include/uapi/linux/rtnetlink.h -@@ -265,6 +265,7 @@ enum { - RTN_THROW, /* Not in this table */ - RTN_NAT, /* Translate this address */ - RTN_XRESOLVE, /* Use external resolver */ -+ RTN_POLICY_FAILED, /* Failed ingress/egress policy */ - __RTN_MAX - }; - ---- a/net/ipv4/fib_semantics.c -+++ b/net/ipv4/fib_semantics.c -@@ -144,6 +144,10 @@ const struct fib_prop fib_props[RTN_MAX - .error = -EINVAL, - .scope = RT_SCOPE_NOWHERE, - }, -+ [RTN_POLICY_FAILED] = { -+ .error = -EACCES, -+ .scope = RT_SCOPE_UNIVERSE, -+ }, - }; - - static void rt_fibinfo_free(struct rtable __rcu **rtp) ---- a/net/ipv4/fib_trie.c -+++ b/net/ipv4/fib_trie.c -@@ -2776,6 +2776,7 @@ static const char *const rtn_type_names[ - [RTN_THROW] = "THROW", - [RTN_NAT] = "NAT", - [RTN_XRESOLVE] = "XRESOLVE", -+ [RTN_POLICY_FAILED] = "POLICY_FAILED", - }; - - static inline const char *rtn_type(char *buf, size_t len, unsigned int t) ---- a/net/ipv4/ipmr.c -+++ b/net/ipv4/ipmr.c -@@ -175,6 +175,7 @@ static int ipmr_rule_action(struct fib_r - case FR_ACT_UNREACHABLE: - return -ENETUNREACH; - case FR_ACT_PROHIBIT: -+ case FR_ACT_POLICY_FAILED: - return -EACCES; - case FR_ACT_BLACKHOLE: - default: ---- a/net/ipv6/fib6_rules.c -+++ b/net/ipv6/fib6_rules.c -@@ -221,6 +221,10 @@ static int __fib6_rule_action(struct fib - err = -EACCES; - rt = net->ipv6.ip6_prohibit_entry; - goto discard_pkt; -+ case FR_ACT_POLICY_FAILED: -+ err = -EACCES; -+ rt = net->ipv6.ip6_policy_failed_entry; -+ goto discard_pkt; - } - - tb_id = fib_rule_get_table(rule, arg); ---- a/net/ipv6/ip6mr.c -+++ b/net/ipv6/ip6mr.c -@@ -163,6 +163,8 @@ static int ip6mr_rule_action(struct fib_ - return -ENETUNREACH; - case FR_ACT_PROHIBIT: - return -EACCES; -+ case FR_ACT_POLICY_FAILED: -+ return -EACCES; - case FR_ACT_BLACKHOLE: - default: - return -EINVAL; ---- a/net/ipv6/route.c -+++ b/net/ipv6/route.c -@@ -97,6 +97,8 @@ static int ip6_pkt_discard(struct sk_bu - static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb); - static int ip6_pkt_prohibit(struct sk_buff *skb); - static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb); -+static int ip6_pkt_policy_failed(struct sk_buff *skb); -+static int ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb); - static void ip6_link_failure(struct sk_buff *skb); - static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, - struct sk_buff *skb, u32 mtu, -@@ -317,6 +319,18 @@ static const struct rt6_info ip6_prohibi - .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), - }; - -+static const struct rt6_info ip6_policy_failed_entry_template = { -+ .dst = { -+ .__refcnt = ATOMIC_INIT(1), -+ .__use = 1, -+ .obsolete = DST_OBSOLETE_FORCE_CHK, -+ .error = -EACCES, -+ .input = ip6_pkt_policy_failed, -+ .output = ip6_pkt_policy_failed_out, -+ }, -+ .rt6i_flags = (RTF_REJECT | RTF_NONEXTHOP), -+}; -+ - static const struct rt6_info ip6_blk_hole_entry_template = { - .dst = { - .__refcnt = ATOMIC_INIT(1), -@@ -1036,6 +1050,7 @@ static const int fib6_prop[RTN_MAX + 1] - [RTN_BLACKHOLE] = -EINVAL, - [RTN_UNREACHABLE] = -EHOSTUNREACH, - [RTN_PROHIBIT] = -EACCES, -+ [RTN_POLICY_FAILED] = -EACCES, - [RTN_THROW] = -EAGAIN, - [RTN_NAT] = -EINVAL, - [RTN_XRESOLVE] = -EINVAL, -@@ -1071,6 +1086,10 @@ static void ip6_rt_init_dst_reject(struc - rt->dst.output = ip6_pkt_prohibit_out; - rt->dst.input = ip6_pkt_prohibit; - break; -+ case RTN_POLICY_FAILED: -+ rt->dst.output = ip6_pkt_policy_failed_out; -+ rt->dst.input = ip6_pkt_policy_failed; -+ break; - case RTN_THROW: - case RTN_UNREACHABLE: - default: -@@ -4539,6 +4558,17 @@ static int ip6_pkt_prohibit_out(struct n - return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES); - } - -+static int ip6_pkt_policy_failed(struct sk_buff *skb) -+{ -+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_INNOROUTES); -+} -+ -+static int ip6_pkt_policy_failed_out(struct net *net, struct sock *sk, struct sk_buff *skb) -+{ -+ skb->dev = skb_dst(skb)->dev; -+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_OUTNOROUTES); -+} -+ - /* - * Allocate a dst for local (unicast / anycast) address. - */ -@@ -5032,7 +5062,8 @@ static int rtm_to_fib6_config(struct sk_ - if (rtm->rtm_type == RTN_UNREACHABLE || - rtm->rtm_type == RTN_BLACKHOLE || - rtm->rtm_type == RTN_PROHIBIT || -- rtm->rtm_type == RTN_THROW) -+ rtm->rtm_type == RTN_THROW || -+ rtm->rtm_type == RTN_POLICY_FAILED) - cfg->fc_flags |= RTF_REJECT; - - if (rtm->rtm_type == RTN_LOCAL) -@@ -6285,6 +6316,8 @@ static int ip6_route_dev_notify(struct n - #ifdef CONFIG_IPV6_MULTIPLE_TABLES - net->ipv6.ip6_prohibit_entry->dst.dev = dev; - net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev); -+ net->ipv6.ip6_policy_failed_entry->dst.dev = dev; -+ net->ipv6.ip6_policy_failed_entry->rt6i_idev = in6_dev_get(dev); - net->ipv6.ip6_blk_hole_entry->dst.dev = dev; - net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev); - #endif -@@ -6296,6 +6329,7 @@ static int ip6_route_dev_notify(struct n - in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev); - #ifdef CONFIG_IPV6_MULTIPLE_TABLES - in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev); -+ in6_dev_put_clear(&net->ipv6.ip6_policy_failed_entry->rt6i_idev); - in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev); - #endif - } -@@ -6487,6 +6521,8 @@ static int __net_init ip6_route_net_init - - #ifdef CONFIG_IPV6_MULTIPLE_TABLES - net->ipv6.fib6_has_custom_rules = false; -+ -+ - net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template, - sizeof(*net->ipv6.ip6_prohibit_entry), - GFP_KERNEL); -@@ -6497,11 +6533,21 @@ static int __net_init ip6_route_net_init - ip6_template_metrics, true); - INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->rt6i_uncached); - -+ net->ipv6.ip6_policy_failed_entry = -+ kmemdup(&ip6_policy_failed_entry_template, -+ sizeof(*net->ipv6.ip6_policy_failed_entry), GFP_KERNEL); -+ if (!net->ipv6.ip6_policy_failed_entry) -+ goto out_ip6_prohibit_entry; -+ net->ipv6.ip6_policy_failed_entry->dst.ops = &net->ipv6.ip6_dst_ops; -+ dst_init_metrics(&net->ipv6.ip6_policy_failed_entry->dst, -+ ip6_template_metrics, true); -+ INIT_LIST_HEAD(&net->ipv6.ip6_policy_failed_entry->rt6i_uncached); -+ - net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template, - sizeof(*net->ipv6.ip6_blk_hole_entry), - GFP_KERNEL); - if (!net->ipv6.ip6_blk_hole_entry) -- goto out_ip6_prohibit_entry; -+ goto out_ip6_policy_failed_entry; - net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops; - dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst, - ip6_template_metrics, true); -@@ -6528,6 +6574,8 @@ out: - return ret; - - #ifdef CONFIG_IPV6_MULTIPLE_TABLES -+out_ip6_policy_failed_entry: -+ kfree(net->ipv6.ip6_policy_failed_entry); - out_ip6_prohibit_entry: - kfree(net->ipv6.ip6_prohibit_entry); - out_ip6_null_entry: -@@ -6547,6 +6595,7 @@ static void __net_exit ip6_route_net_exi - kfree(net->ipv6.ip6_null_entry); - #ifdef CONFIG_IPV6_MULTIPLE_TABLES - kfree(net->ipv6.ip6_prohibit_entry); -+ kfree(net->ipv6.ip6_policy_failed_entry); - kfree(net->ipv6.ip6_blk_hole_entry); - #endif - dst_entries_destroy(&net->ipv6.ip6_dst_ops); -@@ -6624,6 +6673,9 @@ void __init ip6_route_init_special_entri - init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); - init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev; - init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev); -+ init_net.ipv6.ip6_policy_failed_entry->dst.dev = init_net.loopback_dev; -+ init_net.ipv6.ip6_policy_failed_entry->rt6i_idev = -+ in6_dev_get(init_net.loopback_dev); - #endif - } - diff --git a/target/linux/generic/pending-5.19/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch b/target/linux/generic/pending-5.19/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch deleted file mode 100644 index 94416a5d7..000000000 --- a/target/linux/generic/pending-5.19/671-net-provide-defines-for-_POLICY_FAILED-until-all-cod.patch +++ /dev/null @@ -1,50 +0,0 @@ -From: Jonas Gorski -Subject: net: provide defines for _POLICY_FAILED until all code is updated - -Upstream introduced ICMPV6_POLICY_FAIL for code 5 of destination -unreachable, conflicting with our name. - -Add appropriate defines to allow our code to build with the new -name until we have updated our local patches for older kernels -and userspace packages. - -Signed-off-by: Jonas Gorski ---- - include/uapi/linux/fib_rules.h | 2 ++ - include/uapi/linux/icmpv6.h | 2 ++ - include/uapi/linux/rtnetlink.h | 2 ++ - 3 files changed, 6 insertions(+) - ---- a/include/uapi/linux/fib_rules.h -+++ b/include/uapi/linux/fib_rules.h -@@ -89,6 +89,8 @@ enum { - __FR_ACT_MAX, - }; - -+#define FR_ACT_FAILED_POLICY FR_ACT_POLICY_FAILED -+ - #define FR_ACT_MAX (__FR_ACT_MAX - 1) - - #endif ---- a/include/uapi/linux/icmpv6.h -+++ b/include/uapi/linux/icmpv6.h -@@ -126,6 +126,8 @@ struct icmp6hdr { - #define ICMPV6_POLICY_FAIL 5 - #define ICMPV6_REJECT_ROUTE 6 - -+#define ICMPV6_FAILED_POLICY ICMPV6_POLICY_FAIL -+ - /* - * Codes for Time Exceeded - */ ---- a/include/uapi/linux/rtnetlink.h -+++ b/include/uapi/linux/rtnetlink.h -@@ -269,6 +269,8 @@ enum { - __RTN_MAX - }; - -+#define RTN_FAILED_POLICY RTN_POLICY_FAILED -+ - #define RTN_MAX (__RTN_MAX - 1) - - diff --git a/target/linux/generic/pending-5.19/680-NET-skip-GRO-for-foreign-MAC-addresses.patch b/target/linux/generic/pending-5.19/680-NET-skip-GRO-for-foreign-MAC-addresses.patch deleted file mode 100644 index 88c78b664..000000000 --- a/target/linux/generic/pending-5.19/680-NET-skip-GRO-for-foreign-MAC-addresses.patch +++ /dev/null @@ -1,139 +0,0 @@ -From: Felix Fietkau -Subject: net: replace GRO optimization patch with a new one that supports VLANs/bridges with different MAC addresses - -Signed-off-by: Felix Fietkau ---- - include/linux/netdevice.h | 2 ++ - include/linux/skbuff.h | 3 ++- - net/core/dev.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++ - net/ethernet/eth.c | 18 +++++++++++++++++- - 4 files changed, 69 insertions(+), 2 deletions(-) - ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -2117,6 +2117,8 @@ struct net_device { - struct netdev_hw_addr_list mc; - struct netdev_hw_addr_list dev_addrs; - -+ unsigned char local_addr_mask[MAX_ADDR_LEN]; -+ - #ifdef CONFIG_SYSFS - struct kset *queues_kset; - #endif ---- a/include/linux/skbuff.h -+++ b/include/linux/skbuff.h -@@ -1124,6 +1124,7 @@ struct sk_buff { - #ifdef CONFIG_IPV6_NDISC_NODETYPE - __u8 ndisc_nodetype:2; - #endif -+ __u8 gro_skip:1; - - __u8 ipvs_property:1; - __u8 inner_protocol_type:1; ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -7596,6 +7596,48 @@ static void __netdev_adjacent_dev_unlink - &upper_dev->adj_list.lower); - } - -+static void __netdev_addr_mask(unsigned char *mask, const unsigned char *addr, -+ struct net_device *dev) -+{ -+ int i; -+ -+ for (i = 0; i < dev->addr_len; i++) -+ mask[i] |= addr[i] ^ dev->dev_addr[i]; -+} -+ -+static void __netdev_upper_mask(unsigned char *mask, struct net_device *dev, -+ struct net_device *lower) -+{ -+ struct net_device *cur; -+ struct list_head *iter; -+ -+ netdev_for_each_upper_dev_rcu(dev, cur, iter) { -+ __netdev_addr_mask(mask, cur->dev_addr, lower); -+ __netdev_upper_mask(mask, cur, lower); -+ } -+} -+ -+static void __netdev_update_addr_mask(struct net_device *dev) -+{ -+ unsigned char mask[MAX_ADDR_LEN]; -+ struct net_device *cur; -+ struct list_head *iter; -+ -+ memset(mask, 0, sizeof(mask)); -+ __netdev_upper_mask(mask, dev, dev); -+ memcpy(dev->local_addr_mask, mask, dev->addr_len); -+ -+ netdev_for_each_lower_dev(dev, cur, iter) -+ __netdev_update_addr_mask(cur); -+} -+ -+static void netdev_update_addr_mask(struct net_device *dev) -+{ -+ rcu_read_lock(); -+ __netdev_update_addr_mask(dev); -+ rcu_read_unlock(); -+} -+ - static int __netdev_upper_dev_link(struct net_device *dev, - struct net_device *upper_dev, bool master, - void *upper_priv, void *upper_info, -@@ -7647,6 +7689,7 @@ static int __netdev_upper_dev_link(struc - if (ret) - return ret; - -+ netdev_update_addr_mask(dev); - ret = call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, - &changeupper_info.info); - ret = notifier_to_errno(ret); -@@ -7738,6 +7781,7 @@ static void __netdev_upper_dev_unlink(st - - changeupper_info.master = netdev_master_upper_dev_get(dev) == upper_dev; - -+ netdev_update_addr_mask(dev); - call_netdevice_notifiers_info(NETDEV_PRECHANGEUPPER, - &changeupper_info.info); - -@@ -8795,6 +8839,7 @@ int dev_set_mac_address(struct net_devic - if (err) - return err; - dev->addr_assign_type = NET_ADDR_SET; -+ netdev_update_addr_mask(dev); - call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); - add_device_randomness(dev->dev_addr, dev->addr_len); - return 0; ---- a/net/ethernet/eth.c -+++ b/net/ethernet/eth.c -@@ -143,6 +143,18 @@ u32 eth_get_headlen(const struct net_dev - } - EXPORT_SYMBOL(eth_get_headlen); - -+static inline bool -+eth_check_local_mask(const void *addr1, const void *addr2, const void *mask) -+{ -+ const u16 *a1 = addr1; -+ const u16 *a2 = addr2; -+ const u16 *m = mask; -+ -+ return (((a1[0] ^ a2[0]) & ~m[0]) | -+ ((a1[1] ^ a2[1]) & ~m[1]) | -+ ((a1[2] ^ a2[2]) & ~m[2])); -+} -+ - /** - * eth_type_trans - determine the packet's protocol ID. - * @skb: received socket data -@@ -174,6 +186,10 @@ __be16 eth_type_trans(struct sk_buff *sk - } else { - skb->pkt_type = PACKET_OTHERHOST; - } -+ -+ if (eth_check_local_mask(eth->h_dest, dev->dev_addr, -+ dev->local_addr_mask)) -+ skb->gro_skip = 1; - } - - /* diff --git a/target/linux/generic/pending-5.19/682-of_net-add-mac-address-increment-support.patch b/target/linux/generic/pending-5.19/682-of_net-add-mac-address-increment-support.patch deleted file mode 100644 index f6ae9f31f..000000000 --- a/target/linux/generic/pending-5.19/682-of_net-add-mac-address-increment-support.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 844c273286f328acf0dab5fbd5d864366b4904dc Mon Sep 17 00:00:00 2001 -From: Ansuel Smith -Date: Tue, 30 Mar 2021 18:21:14 +0200 -Subject: [PATCH] of_net: add mac-address-increment support - -Lots of embedded devices use the mac-address of other interface -extracted from nvmem cells and increments it by one or two. Add two -bindings to integrate this and directly use the right mac-address for -the interface. Some example are some routers that use the gmac -mac-address stored in the art partition and increments it by one for the -wifi. mac-address-increment-byte bindings is used to tell what byte of -the mac-address has to be increased (if not defined the last byte is -increased) and mac-address-increment tells how much the byte decided -early has to be increased. - -Signed-off-by: Ansuel Smith ---- - net/core/of_net.c | 43 +++++++++++++++++++++++++++++++++++++++---- - 1 file changed, 39 insertions(+), 4 deletions(-) - ---- a/net/core/of_net.c -+++ b/net/core/of_net.c -@@ -119,28 +119,63 @@ static int of_get_mac_addr_nvmem(struct - * this case, the real MAC is in 'local-mac-address', and 'mac-address' exists - * but is all zeros. - * -+ * DT can tell the system to increment the mac-address after is extracted by -+ * using: -+ * - mac-address-increment-byte to decide what byte to increase -+ * (if not defined is increased the last byte) -+ * - mac-address-increment to decide how much to increase. The value WILL -+ * overflow to other bytes if the increment is over 255 or the total -+ * increment will exceed 255 of the current byte. -+ * (example 00:01:02:03:04:ff + 1 == 00:01:02:03:05:00) -+ * (example 00:01:02:03:04:fe + 5 == 00:01:02:03:05:03) -+ * - * Return: 0 on success and errno in case of error. - */ - int of_get_mac_address(struct device_node *np, u8 *addr) - { -+ u32 inc_idx, mac_inc, mac_val; - int ret; - -+ /* Check first if the increment byte is present and valid. -+ * If not set assume to increment the last byte if found. -+ */ -+ if (of_property_read_u32(np, "mac-address-increment-byte", &inc_idx)) -+ inc_idx = 5; -+ if (inc_idx < 3 || inc_idx > 5) -+ return -EINVAL; -+ - if (!np) - return -ENODEV; - - ret = of_get_mac_addr(np, "mac-address", addr); - if (!ret) -- return 0; -+ goto found; - - ret = of_get_mac_addr(np, "local-mac-address", addr); - if (!ret) -- return 0; -+ goto found; - - ret = of_get_mac_addr(np, "address", addr); - if (!ret) -- return 0; -+ goto found; -+ -+ ret = of_get_mac_addr_nvmem(np, addr); -+ if (ret) -+ return ret; -+ -+found: -+ if (!of_property_read_u32(np, "mac-address-increment", &mac_inc)) { -+ /* Convert to a contiguous value */ -+ mac_val = (addr[3] << 16) + (addr[4] << 8) + addr[5]; -+ mac_val += mac_inc << 8 * (5-inc_idx); -+ -+ /* Apply the incremented value handling overflow case */ -+ addr[3] = (mac_val >> 16) & 0xff; -+ addr[4] = (mac_val >> 8) & 0xff; -+ addr[5] = (mac_val >> 0) & 0xff; -+ } - -- return of_get_mac_addr_nvmem(np, addr); -+ return ret; - } - EXPORT_SYMBOL(of_get_mac_address); - diff --git a/target/linux/generic/pending-5.19/683-of_net-add-mac-address-to-of-tree.patch b/target/linux/generic/pending-5.19/683-of_net-add-mac-address-to-of-tree.patch deleted file mode 100644 index 88ade300a..000000000 --- a/target/linux/generic/pending-5.19/683-of_net-add-mac-address-to-of-tree.patch +++ /dev/null @@ -1,38 +0,0 @@ ---- a/net/core/of_net.c -+++ b/net/core/of_net.c -@@ -95,6 +95,27 @@ static int of_get_mac_addr_nvmem(struct - return 0; - } - -+static int of_add_mac_address(struct device_node *np, u8* addr) -+{ -+ struct property *prop; -+ -+ prop = kzalloc(sizeof(*prop), GFP_KERNEL); -+ if (!prop) -+ return -ENOMEM; -+ -+ prop->name = "mac-address"; -+ prop->length = ETH_ALEN; -+ prop->value = kmemdup(addr, ETH_ALEN, GFP_KERNEL); -+ if (!prop->value || of_update_property(np, prop)) -+ goto free; -+ -+ return 0; -+free: -+ kfree(prop->value); -+ kfree(prop); -+ return -ENOMEM; -+} -+ - /** - * of_get_mac_address() - * @np: Caller's Device Node -@@ -175,6 +196,7 @@ found: - addr[5] = (mac_val >> 0) & 0xff; - } - -+ of_add_mac_address(np, addr); - return ret; - } - EXPORT_SYMBOL(of_get_mac_address); diff --git a/target/linux/generic/pending-5.19/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch b/target/linux/generic/pending-5.19/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch deleted file mode 100644 index aeae67fab..000000000 --- a/target/linux/generic/pending-5.19/700-net-ethernet-mtk_eth_soc-avoid-creating-duplicate-of.patch +++ /dev/null @@ -1,26 +0,0 @@ -From: Felix Fietkau -Date: Thu, 8 Jul 2021 07:08:29 +0200 -Subject: [PATCH] net: ethernet: mtk_eth_soc: avoid creating duplicate offload - entries - -Sometimes multiple CLS_REPLACE calls are issued for the same connection. -rhashtable_insert_fast does not check for these duplicates, so multiple -hardware flow entries can be created. -Fix this by checking for an existing entry early - -Fixes: 502e84e2382d ("net: ethernet: mtk_eth_soc: add flow offloading support") -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -+++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c -@@ -237,6 +237,9 @@ mtk_flow_offload_replace(struct mtk_eth - if (rhashtable_lookup(ð->flow_table, &f->cookie, mtk_flow_ht_params)) - return -EEXIST; - -+ if (rhashtable_lookup(ð->flow_table, &f->cookie, mtk_flow_ht_params)) -+ return -EEXIST; -+ - if (flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_META)) { - struct flow_match_meta match; - diff --git a/target/linux/generic/pending-5.19/703-phy-add-detach-callback-to-struct-phy_driver.patch b/target/linux/generic/pending-5.19/703-phy-add-detach-callback-to-struct-phy_driver.patch deleted file mode 100644 index c50f55431..000000000 --- a/target/linux/generic/pending-5.19/703-phy-add-detach-callback-to-struct-phy_driver.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: Gabor Juhos -Subject: generic: add detach callback to struct phy_driver - -lede-commit: fe61fc2d7d0b3fb348b502f68f98243b3ddf5867 - -Signed-off-by: Gabor Juhos ---- - drivers/net/phy/phy_device.c | 3 +++ - include/linux/phy.h | 6 ++++++ - 2 files changed, 9 insertions(+) - ---- a/drivers/net/phy/phy_device.c -+++ b/drivers/net/phy/phy_device.c -@@ -1746,6 +1746,9 @@ void phy_detach(struct phy_device *phyde - struct module *ndev_owner = NULL; - struct mii_bus *bus; - -+ if (phydev->drv && phydev->drv->detach) -+ phydev->drv->detach(phydev); -+ - if (phydev->sysfs_links) { - if (dev) - sysfs_remove_link(&dev->dev.kobj, "phydev"); ---- a/include/linux/phy.h -+++ b/include/linux/phy.h -@@ -827,6 +827,12 @@ struct phy_driver { - /** @handle_interrupt: Override default interrupt handling */ - irqreturn_t (*handle_interrupt)(struct phy_device *phydev); - -+ /* -+ * Called before an ethernet device is detached -+ * from the PHY. -+ */ -+ void (*detach)(struct phy_device *phydev); -+ - /** @remove: Clears up any memory if needed */ - void (*remove)(struct phy_device *phydev); - diff --git a/target/linux/generic/pending-5.19/735-net-phy-at803x-fix-at8033-sgmii-mode.patch b/target/linux/generic/pending-5.19/735-net-phy-at803x-fix-at8033-sgmii-mode.patch deleted file mode 100644 index 8fc90aeb9..000000000 --- a/target/linux/generic/pending-5.19/735-net-phy-at803x-fix-at8033-sgmii-mode.patch +++ /dev/null @@ -1,51 +0,0 @@ -From: Roman Yeryomin -Subject: kernel: add at803x fix for sgmii mode - -Some (possibly broken) bootloaders incorreclty initialize at8033 -phy. This patch enables sgmii autonegotiation mode. - -[john@phrozen.org: felix added this to his upstream queue] - -Signed-off-by: Roman Yeryomin ---- - drivers/net/phy/at803x.c | 25 +++++++++++++++++++++++++ - 1 file changed, 25 insertions(+) - ---- a/drivers/net/phy/at803x.c -+++ b/drivers/net/phy/at803x.c -@@ -84,6 +84,7 @@ - #define AT803X_LOC_MAC_ADDR_32_47_OFFSET 0x804A - #define AT803X_REG_CHIP_CONFIG 0x1f - #define AT803X_BT_BX_REG_SEL 0x8000 -+#define AT803X_SGMII_ANEG_EN 0x1000 - - #define AT803X_DEBUG_ADDR 0x1D - #define AT803X_DEBUG_DATA 0x1E -@@ -946,6 +947,27 @@ static int at803x_smarteee_config(struct - struct at803x_priv *priv = phydev->priv; - u16 mask = 0, val = 0; - int ret; -+ u32 v; -+ -+ if (phydev->drv->phy_id == ATH8031_PHY_ID && -+ phydev->interface == PHY_INTERFACE_MODE_SGMII) -+ { -+ v = phy_read(phydev, AT803X_REG_CHIP_CONFIG); -+ /* select SGMII/fiber page */ -+ ret = phy_write(phydev, AT803X_REG_CHIP_CONFIG, -+ v & ~AT803X_BT_BX_REG_SEL); -+ if (ret) -+ return ret; -+ /* enable SGMII autonegotiation */ -+ ret = phy_write(phydev, MII_BMCR, AT803X_SGMII_ANEG_EN); -+ if (ret) -+ return ret; -+ /* select copper page */ -+ ret = phy_write(phydev, AT803X_REG_CHIP_CONFIG, -+ v | AT803X_BT_BX_REG_SEL); -+ if (ret) -+ return ret; -+ } - - if (priv->flags & AT803X_DISABLE_SMARTEEE) - return phy_modify_mmd(phydev, MDIO_MMD_PCS, diff --git a/target/linux/generic/pending-5.19/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch b/target/linux/generic/pending-5.19/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch deleted file mode 100644 index e7a5283cc..000000000 --- a/target/linux/generic/pending-5.19/760-net-dsa-mv88e6xxx-fix-vlan-setup.patch +++ /dev/null @@ -1,27 +0,0 @@ -From a1b291f3f6c80a6c5ccad7283fc472d77a2a4763 Mon Sep 17 00:00:00 2001 -From: Russell King -Date: Sun, 22 Dec 2019 12:40:11 +0000 -Subject: [PATCH] net: dsa: mv88e6xxx: fix vlan setup - -Provide an option that drivers can set to indicate they want to receive -vlan configuration even when vlan filtering is disabled. This is safe -for Marvell DSA bridges, which do not look up ingress traffic in the -VTU if the port is in 8021Q disabled state. Whether this change is -suitable for all DSA bridges is not known. - -Signed-off-by: Russell King -Signed-off-by: DENG Qingfang ---- - drivers/net/dsa/mv88e6xxx/chip.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/net/dsa/mv88e6xxx/chip.c -+++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -3654,6 +3654,7 @@ static int mv88e6xxx_setup(struct dsa_sw - - chip->ds = ds; - ds->slave_mii_bus = mv88e6xxx_default_mdio_bus(chip); -+ ds->configure_vlan_while_not_filtering = true; - - /* Since virtual bridges are mapped in the PVT, the number we support - * depends on the physical switch topology. We need to let DSA figure diff --git a/target/linux/generic/pending-5.19/761-net-dsa-mt7530-Support-EEE-features.patch b/target/linux/generic/pending-5.19/761-net-dsa-mt7530-Support-EEE-features.patch deleted file mode 100644 index 78ae07de0..000000000 --- a/target/linux/generic/pending-5.19/761-net-dsa-mt7530-Support-EEE-features.patch +++ /dev/null @@ -1,103 +0,0 @@ -From 9cfb2d426c38272f245e9e6f62b3552d1ed5852b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= -Date: Tue, 21 Apr 2020 00:18:08 +0200 -Subject: [PATCH] net: dsa: mt7530: Support EEE features -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: René van Dorst ---- a/drivers/net/dsa/mt7530.c -+++ b/drivers/net/dsa/mt7530.c -@@ -2821,9 +2821,13 @@ static void mt753x_phylink_mac_link_up(s - switch (speed) { - case SPEED_1000: - mcr |= PMCR_FORCE_SPEED_1000; -+ if (priv->eee_enable & BIT(port)) -+ mcr |= PMCR_FORCE_EEE1G; - break; - case SPEED_100: - mcr |= PMCR_FORCE_SPEED_100; -+ if (priv->eee_enable & BIT(port)) -+ mcr |= PMCR_FORCE_EEE100; - break; - } - if (duplex == DUPLEX_FULL) { -@@ -3092,6 +3096,54 @@ static int mt753x_set_mac_eee(struct dsa - - return 0; - } -+ -+static int mt7530_get_mac_eee(struct dsa_switch *ds, int port, -+ struct ethtool_eee *e) -+{ -+ struct mt7530_priv *priv = ds->priv; -+ u32 eeecr, pmsr; -+ -+ e->eee_enabled = !!(priv->eee_enable & BIT(port)); -+ -+ if (e->eee_enabled) { -+ eeecr = mt7530_read(priv, MT7530_PMEEECR_P(port)); -+ e->tx_lpi_enabled = !(eeecr & LPI_MODE_EN); -+ e->tx_lpi_timer = (eeecr >> 4) & 0xFFF; -+ pmsr = mt7530_read(priv, MT7530_PMSR_P(port)); -+ e->eee_active = e->eee_enabled && !!(pmsr & PMSR_EEE1G); -+ } else { -+ e->tx_lpi_enabled = 0; -+ e->tx_lpi_timer = 0; -+ e->eee_active = 0; -+ } -+ -+ return 0; -+} -+ -+static int mt7530_set_mac_eee(struct dsa_switch *ds, int port, -+ struct ethtool_eee *e) -+{ -+ struct mt7530_priv *priv = ds->priv; -+ u32 eeecr; -+ -+ if (e->tx_lpi_enabled && e->tx_lpi_timer > 0xFFF) -+ return -EINVAL; -+ -+ if (e->eee_enabled) { -+ priv->eee_enable |= BIT(port); -+ //MT7530_PMEEECR_P -+ eeecr = mt7530_read(priv, MT7530_PMEEECR_P(port)); -+ eeecr &= 0xFFFF0000; -+ if (!e->tx_lpi_enabled) -+ eeecr |= LPI_MODE_EN; -+ eeecr = LPI_THRESH(e->tx_lpi_timer); -+ mt7530_write(priv, MT7530_PMEEECR_P(port), eeecr); -+ } else { -+ priv->eee_enable &= ~(BIT(port)); -+ } -+ -+ return 0; -+} - - static const struct dsa_switch_ops mt7530_switch_ops = { - .get_tag_protocol = mtk_get_tag_protocol, ---- a/drivers/net/dsa/mt7530.h -+++ b/drivers/net/dsa/mt7530.h -@@ -346,6 +346,12 @@ enum mt7530_vlan_port_acc_frm { - #define MAX_RX_PKT_LEN_1552 0x2 - #define MAX_RX_PKT_LEN_JUMBO 0x3 - -+#define MT7530_PMEEECR_P(x) (0x3004 + (x) * 0x100) -+#define WAKEUP_TIME_1000(x) ((x & 0xFF) << 24) -+#define WAKEUP_TIME_100(x) ((x & 0xFF) << 16) -+#define LPI_THRESH(x) ((x & 0xFFF) << 4) -+#define LPI_MODE_EN BIT(0) -+ - /* Register for MIB */ - #define MT7530_PORT_MIB_COUNTER(x) (0x4000 + (x) * 0x100) - #define MT7530_MIB_CCR 0x4fe0 -@@ -818,6 +824,7 @@ struct mt7530_priv { - unsigned int p5_intf_sel; - u8 mirror_rx; - u8 mirror_tx; -+ u8 eee_enable; - - struct mt7530_port ports[MT7530_NUM_PORTS]; - struct mt753x_pcs pcs[MT7530_NUM_PORTS]; diff --git a/target/linux/generic/pending-5.19/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch b/target/linux/generic/pending-5.19/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch deleted file mode 100644 index 47143726b..000000000 --- a/target/linux/generic/pending-5.19/768-net-dsa-mv88e6xxx-Request-assisted-learning-on-CPU-port.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Tobias Waldekranz -Subject: [RFC net-next 7/7] net: dsa: mv88e6xxx: Request assisted learning on CPU port -Date: Sat, 16 Jan 2021 02:25:15 +0100 -Archived-At: - -While the hardware is capable of performing learning on the CPU port, -it requires alot of additions to the bridge's forwarding path in order -to handle multi-destination traffic correctly. - -Until that is in place, opt for the next best thing and let DSA sync -the relevant addresses down to the hardware FDB. - -Signed-off-by: Tobias Waldekranz ---- - drivers/net/dsa/mv88e6xxx/chip.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/net/dsa/mv88e6xxx/chip.c -+++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -6913,6 +6913,7 @@ static int mv88e6xxx_register_switch(str - ds->ops = &mv88e6xxx_switch_ops; - ds->ageing_time_min = chip->info->age_time_coeff; - ds->ageing_time_max = chip->info->age_time_coeff * U8_MAX; -+ ds->assisted_learning_on_cpu_port = true; - - /* Some chips support up to 32, but that requires enabling the - * 5-bit port mode, which we do not support. 640k^W16 ought to diff --git a/target/linux/generic/pending-5.19/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch b/target/linux/generic/pending-5.19/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch deleted file mode 100644 index fcf7892c0..000000000 --- a/target/linux/generic/pending-5.19/780-ARM-kirkwood-add-missing-linux-if_ether.h-for-ETH_AL.patch +++ /dev/null @@ -1,61 +0,0 @@ -From patchwork Thu Aug 5 22:23:30 2021 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Daniel Golle -X-Patchwork-Id: 12422209 -Date: Thu, 5 Aug 2021 23:23:30 +0100 -From: Daniel Golle -To: linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org, - linux-kernel@vger.kernel.org -Cc: "David S. Miller" , Andrew Lunn , - Michael Walle -Subject: [PATCH] ARM: kirkwood: add missing for ETH_ALEN -Message-ID: -MIME-Version: 1.0 -Content-Disposition: inline -X-BeenThere: linux-arm-kernel@lists.infradead.org -X-Mailman-Version: 2.1.34 -Precedence: list -List-Id: -List-Archive: -Sender: "linux-arm-kernel" - -After commit 83216e3988cd1 ("of: net: pass the dst buffer to -of_get_mac_address()") build fails for kirkwood as ETH_ALEN is not -defined. - -arch/arm/mach-mvebu/kirkwood.c: In function 'kirkwood_dt_eth_fixup': -arch/arm/mach-mvebu/kirkwood.c:87:13: error: 'ETH_ALEN' undeclared (first use in this function); did you mean 'ESTALE'? - u8 tmpmac[ETH_ALEN]; - ^~~~~~~~ - ESTALE -arch/arm/mach-mvebu/kirkwood.c:87:13: note: each undeclared identifier is reported only once for each function it appears in -arch/arm/mach-mvebu/kirkwood.c:87:6: warning: unused variable 'tmpmac' [-Wunused-variable] - u8 tmpmac[ETH_ALEN]; - ^~~~~~ -make[5]: *** [scripts/Makefile.build:262: arch/arm/mach-mvebu/kirkwood.o] Error 1 -make[5]: *** Waiting for unfinished jobs.... - -Add missing #include to fix this. - -Cc: David S. Miller -Cc: Andrew Lunn -Cc: Michael Walle -Reported-by: https://buildbot.openwrt.org/master/images/#/builders/56/builds/220/steps/44/logs/stdio -Fixes: 83216e3988cd1 ("of: net: pass the dst buffer to of_get_mac_address()") -Signed-off-by: Daniel Golle ---- - arch/arm/mach-mvebu/kirkwood.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/arch/arm/mach-mvebu/kirkwood.c -+++ b/arch/arm/mach-mvebu/kirkwood.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - #include - #include - #include diff --git a/target/linux/generic/pending-5.19/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch b/target/linux/generic/pending-5.19/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch deleted file mode 100644 index 478a2cb27..000000000 --- a/target/linux/generic/pending-5.19/800-bcma-get-SoC-device-struct-copy-its-DMA-params-to-th.patch +++ /dev/null @@ -1,73 +0,0 @@ -From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -Subject: [PATCH] bcma: get SoC device struct & copy its DMA params to the - subdevices -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -For bus devices to be fully usable it's required to set their DMA -parameters. - -For years it has been missing and remained unnoticed because of -mips_dma_alloc_coherent() silently handling the empty coherent_dma_mask. -Kernel 4.19 came with a lot of DMA changes and caused a regression on -the bcm47xx. Starting with the commit f8c55dc6e828 ("MIPS: use generic -dma noncoherent ops for simple noncoherent platforms") DMA coherent -allocations just fail. Example: -[ 1.114914] bgmac_bcma bcma0:2: Allocation of TX ring 0x200 failed -[ 1.121215] bgmac_bcma bcma0:2: Unable to alloc memory for DMA -[ 1.127626] bgmac_bcma: probe of bcma0:2 failed with error -12 -[ 1.133838] bgmac_bcma: Broadcom 47xx GBit MAC driver loaded - -This change fixes above regression in addition to the MIPS bcm47xx -commit 321c46b91550 ("MIPS: BCM47XX: Setup struct device for the SoC"). - -It also fixes another *old* GPIO regression caused by a parent pointing -to the NULL: -[ 0.157054] missing gpiochip .dev parent pointer -[ 0.157287] bcma: bus0: Error registering GPIO driver: -22 -introduced by the commit 74f4e0cc6108 ("bcma: switch GPIO portions to -use GPIOLIB_IRQCHIP"). - -Fixes: f8c55dc6e828 ("MIPS: use generic dma noncoherent ops for simple noncoherent platforms") -Fixes: 74f4e0cc6108 ("bcma: switch GPIO portions to use GPIOLIB_IRQCHIP") -Cc: linux-mips@linux-mips.org -Cc: Christoph Hellwig -Cc: Linus Walleij -Signed-off-by: Rafał Miłecki ---- - ---- a/drivers/bcma/host_soc.c -+++ b/drivers/bcma/host_soc.c -@@ -191,6 +191,8 @@ int __init bcma_host_soc_init(struct bcm - struct bcma_bus *bus = &soc->bus; - int err; - -+ bus->dev = soc->dev; -+ - /* Scan bus and initialize it */ - err = bcma_bus_early_register(bus); - if (err) ---- a/drivers/bcma/main.c -+++ b/drivers/bcma/main.c -@@ -236,13 +236,17 @@ EXPORT_SYMBOL(bcma_core_irq); - - void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core) - { -- device_initialize(&core->dev); -+ struct device *dev = &core->dev; -+ -+ device_initialize(dev); - core->dev.release = bcma_release_core_dev; - core->dev.bus = &bcma_bus_type; -- dev_set_name(&core->dev, "bcma%d:%d", bus->num, core->core_index); -+ dev_set_name(dev, "bcma%d:%d", bus->num, core->core_index); - core->dev.parent = bus->dev; -- if (bus->dev) -+ if (bus->dev) { - bcma_of_fill_device(bus->dev, core); -+ dma_coerce_mask_and_coherent(dev, bus->dev->coherent_dma_mask); -+ } - - switch (bus->hosttype) { - case BCMA_HOSTTYPE_PCI: diff --git a/target/linux/generic/pending-5.19/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch b/target/linux/generic/pending-5.19/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch deleted file mode 100644 index 61685237e..000000000 --- a/target/linux/generic/pending-5.19/801-gpio-gpio-cascade-add-generic-GPIO-cascade.patch +++ /dev/null @@ -1,222 +0,0 @@ -From fc23ea48ba52c24f201fe5ca0132ee1a3de5a70a Mon Sep 17 00:00:00 2001 -From: Mauri Sandberg -Date: Thu, 25 Mar 2021 11:48:05 +0200 -Subject: [PATCH 2/2] gpio: gpio-cascade: add generic GPIO cascade - -Adds support for building cascades of GPIO lines. That is, it allows -setups when there is one upstream line and multiple cascaded lines, out -of which one can be chosen at a time. The status of the upstream line -can be conveyed to the selected cascaded line or, vice versa, the status -of the cascaded line can be conveyed to the upstream line. - -A multiplexer is being used to select, which cascaded GPIO line is being -used at any given time. - -At the moment only input direction is supported. In future it should be -possible to add support for output direction, too. - -Signed-off-by: Mauri Sandberg -Reviewed-by: Linus Walleij -Reviewed-by: Andy Shevchenko ---- -v7 -> v8: - - rearrange members in struct gpio_cascade - - cosmetic changes in file header and in one function declaration - - added Reviewed-by tags by Linus and Andy -v6 -> v7: - - In Kconfig add info about module name - - adhere to new convention that allows lines longer than 80 chars - - use dev_probe_err with upstream gpio line too - - refactor for cleaner exit of probe function. -v5 -> v6: - - In Kconfig, remove dependency to OF_GPIO and select only MULTIPLEXER - - refactor code preferring one-liners - - clean up prints, removing them from success-path. - - don't explicitly set gpio_chip.of_node as it's done in the GPIO library - - use devm_gpiochip_add_data instead of gpiochip_add -v4 -> v5: - - renamed gpio-mux-input -> gpio-cascade. refactored code accordingly - here and there and changed to use new bindings and compatible string - - ambigious and vague 'pin' was rename to 'upstream_line' - - dropped Tested-by and Reviewed-by due to changes in bindings - - dropped Reported-by suggested by an automatic bot as it was not really - appropriate to begin with - - functionally it's the same as v4 -v3 -> v4: - - Changed author email - - Included Tested-by and Reviewed-by from Drew -v2 -> v3: - - use managed device resources - - update Kconfig description -v1 -> v2: - - removed .owner from platform_driver as per test bot's instruction - - added MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE - - added gpio_mux_input_get_direction as it's recommended for all chips - - removed because this is input only chip: gpio_mux_input_set_value - - removed because they are not needed for input/output only chips: - gpio_mux_input_direction_input - gpio_mux_input_direction_output - - fixed typo in an error message - - added info message about successful registration - - removed can_sleep flag as this does not sleep while getting GPIO value - like I2C or SPI do - - Updated description in Kconfig ---- - drivers/gpio/Kconfig | 15 +++++ - drivers/gpio/Makefile | 1 + - drivers/gpio/gpio-cascade.c | 117 ++++++++++++++++++++++++++++++++++++ - 3 files changed, 133 insertions(+) - create mode 100644 drivers/gpio/gpio-cascade.c - ---- a/drivers/gpio/Kconfig -+++ b/drivers/gpio/Kconfig -@@ -1710,4 +1710,19 @@ config GPIO_SIM - - endmenu - -+comment "Other GPIO expanders" -+ -+config GPIO_CASCADE -+ tristate "General GPIO cascade" -+ select MULTIPLEXER -+ help -+ Say yes here to enable support for generic GPIO cascade. -+ -+ This allows building one-to-many cascades of GPIO lines using -+ different types of multiplexers readily available. At the -+ moment only input lines are supported. -+ -+ To build the driver as a module choose 'm' and the resulting module -+ will be called 'gpio-cascade'. -+ - endif ---- a/drivers/gpio/Makefile -+++ b/drivers/gpio/Makefile -@@ -44,6 +44,7 @@ obj-$(CONFIG_GPIO_BD9571MWV) += gpio-bd - obj-$(CONFIG_GPIO_BRCMSTB) += gpio-brcmstb.o - obj-$(CONFIG_GPIO_BT8XX) += gpio-bt8xx.o - obj-$(CONFIG_GPIO_CADENCE) += gpio-cadence.o -+obj-$(CONFIG_GPIO_CASCADE) += gpio-cascade.o - obj-$(CONFIG_GPIO_CLPS711X) += gpio-clps711x.o - obj-$(CONFIG_GPIO_SNPS_CREG) += gpio-creg-snps.o - obj-$(CONFIG_GPIO_CRYSTAL_COVE) += gpio-crystalcove.o ---- /dev/null -+++ b/drivers/gpio/gpio-cascade.c -@@ -0,0 +1,117 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * A generic GPIO cascade driver -+ * -+ * Copyright (C) 2021 Mauri Sandberg -+ * -+ * This allows building cascades of GPIO lines in a manner illustrated -+ * below: -+ * -+ * /|---- Cascaded GPIO line 0 -+ * Upstream | |---- Cascaded GPIO line 1 -+ * GPIO line ----+ | . -+ * | | . -+ * \|---- Cascaded GPIO line n -+ * -+ * A multiplexer is being used to select, which cascaded line is being -+ * addressed at any given time. -+ * -+ * At the moment only input mode is supported due to lack of means for -+ * testing output functionality. At least theoretically output should be -+ * possible with open drain constructions. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+struct gpio_cascade { -+ struct gpio_chip gpio_chip; -+ struct device *parent; -+ struct mux_control *mux_control; -+ struct gpio_desc *upstream_line; -+}; -+ -+static struct gpio_cascade *chip_to_cascade(struct gpio_chip *gc) -+{ -+ return container_of(gc, struct gpio_cascade, gpio_chip); -+} -+ -+static int gpio_cascade_get_direction(struct gpio_chip *gc, unsigned int offset) -+{ -+ return GPIO_LINE_DIRECTION_IN; -+} -+ -+static int gpio_cascade_get_value(struct gpio_chip *gc, unsigned int offset) -+{ -+ struct gpio_cascade *cas = chip_to_cascade(gc); -+ int ret; -+ -+ ret = mux_control_select(cas->mux_control, offset); -+ if (ret) -+ return ret; -+ -+ ret = gpiod_get_value(cas->upstream_line); -+ mux_control_deselect(cas->mux_control); -+ return ret; -+} -+ -+static int gpio_cascade_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct gpio_cascade *cas; -+ struct mux_control *mc; -+ struct gpio_desc *upstream; -+ struct gpio_chip *gc; -+ -+ cas = devm_kzalloc(dev, sizeof(*cas), GFP_KERNEL); -+ if (!cas) -+ return -ENOMEM; -+ -+ mc = devm_mux_control_get(dev, NULL); -+ if (IS_ERR(mc)) -+ return dev_err_probe(dev, PTR_ERR(mc), "unable to get mux-control\n"); -+ -+ cas->mux_control = mc; -+ upstream = devm_gpiod_get(dev, "upstream", GPIOD_IN); -+ if (IS_ERR(upstream)) -+ return dev_err_probe(dev, PTR_ERR(upstream), "unable to claim upstream GPIO line\n"); -+ -+ cas->upstream_line = upstream; -+ cas->parent = dev; -+ -+ gc = &cas->gpio_chip; -+ gc->get = gpio_cascade_get_value; -+ gc->get_direction = gpio_cascade_get_direction; -+ gc->base = -1; -+ gc->ngpio = mux_control_states(mc); -+ gc->label = dev_name(cas->parent); -+ gc->parent = cas->parent; -+ gc->owner = THIS_MODULE; -+ -+ platform_set_drvdata(pdev, cas); -+ return devm_gpiochip_add_data(dev, &cas->gpio_chip, NULL); -+} -+ -+static const struct of_device_id gpio_cascade_id[] = { -+ { .compatible = "gpio-cascade" }, -+ { /* sentinel */ } -+}; -+MODULE_DEVICE_TABLE(of, gpio_cascade_id); -+ -+static struct platform_driver gpio_cascade_driver = { -+ .driver = { -+ .name = "gpio-cascade", -+ .of_match_table = gpio_cascade_id, -+ }, -+ .probe = gpio_cascade_probe, -+}; -+module_platform_driver(gpio_cascade_driver); -+ -+MODULE_AUTHOR("Mauri Sandberg "); -+MODULE_DESCRIPTION("Generic GPIO cascade"); -+MODULE_LICENSE("GPL"); diff --git a/target/linux/generic/pending-5.19/810-pci_disable_common_quirks.patch b/target/linux/generic/pending-5.19/810-pci_disable_common_quirks.patch deleted file mode 100644 index 3f444e44f..000000000 --- a/target/linux/generic/pending-5.19/810-pci_disable_common_quirks.patch +++ /dev/null @@ -1,62 +0,0 @@ -From: Gabor Juhos -Subject: debloat: add kernel config option to disabling common PCI quirks - -Signed-off-by: Gabor Juhos ---- - drivers/pci/Kconfig | 6 ++++++ - drivers/pci/quirks.c | 6 ++++++ - 2 files changed, 12 insertions(+) - ---- a/drivers/pci/Kconfig -+++ b/drivers/pci/Kconfig -@@ -118,6 +118,13 @@ config XEN_PCIDEV_FRONTEND - The PCI device frontend driver allows the kernel to import arbitrary - PCI devices from a PCI backend to support PCI driver domains. - -+config PCI_DISABLE_COMMON_QUIRKS -+ bool "PCI disable common quirks" -+ depends on PCI -+ help -+ If you don't know what to do here, say N. -+ -+ - config PCI_ATS - bool - ---- a/drivers/pci/quirks.c -+++ b/drivers/pci/quirks.c -@@ -207,6 +207,7 @@ static void quirk_mmio_always_on(struct - DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_ANY_ID, PCI_ANY_ID, - PCI_CLASS_BRIDGE_HOST, 8, quirk_mmio_always_on); - -+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS - /* - * The Mellanox Tavor device gives false positive parity errors. Disable - * parity error reporting. -@@ -3364,6 +3365,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata); - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata); - -+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */ -+ - /* - * Ivytown NTB BAR sizes are misreported by the hardware due to an erratum. - * To work around this, query the size it should be configured to by the -@@ -3389,6 +3392,8 @@ static void quirk_intel_ntb(struct pci_d - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e08, quirk_intel_ntb); - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0e0d, quirk_intel_ntb); - -+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS -+ - /* - * Some BIOS implementations leave the Intel GPU interrupts enabled, even - * though no one is handling them (e.g., if the i915 driver is never -@@ -3427,6 +3432,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN - DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq); - DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq); - -+#endif /* !CONFIG_PCI_DISABLE_COMMON_QUIRKS */ -+ - /* - * PCI devices which are on Intel chips can skip the 10ms delay - * before entering D3 mode. diff --git a/target/linux/generic/pending-5.19/811-pci_disable_usb_common_quirks.patch b/target/linux/generic/pending-5.19/811-pci_disable_usb_common_quirks.patch deleted file mode 100644 index b498d9f70..000000000 --- a/target/linux/generic/pending-5.19/811-pci_disable_usb_common_quirks.patch +++ /dev/null @@ -1,115 +0,0 @@ -From: Felix Fietkau -Subject: debloat: disable common USB quirks - -Signed-off-by: Felix Fietkau ---- - drivers/usb/host/pci-quirks.c | 16 ++++++++++++++++ - drivers/usb/host/pci-quirks.h | 18 +++++++++++++++++- - include/linux/usb/hcd.h | 7 +++++++ - 3 files changed, 40 insertions(+), 1 deletion(-) - ---- a/drivers/usb/host/pci-quirks.c -+++ b/drivers/usb/host/pci-quirks.c -@@ -128,6 +128,8 @@ struct amd_chipset_type { - u8 rev; - }; - -+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS -+ - static struct amd_chipset_info { - struct pci_dev *nb_dev; - struct pci_dev *smbus_dev; -@@ -633,6 +635,10 @@ bool usb_amd_pt_check_port(struct device - } - EXPORT_SYMBOL_GPL(usb_amd_pt_check_port); - -+#endif /* CONFIG_PCI_DISABLE_COMMON_QUIRKS */ -+ -+#if IS_ENABLED(CONFIG_USB_UHCI_HCD) -+ - /* - * Make sure the controller is completely inactive, unable to - * generate interrupts or do DMA. -@@ -712,8 +718,17 @@ reset_needed: - uhci_reset_hc(pdev, base); - return 1; - } -+#else -+int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base) -+{ -+ return 0; -+} -+ -+#endif - EXPORT_SYMBOL_GPL(uhci_check_and_reset_hc); - -+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS -+ - static inline int io_type_enabled(struct pci_dev *pdev, unsigned int mask) - { - u16 cmd; -@@ -1285,3 +1300,4 @@ static void quirk_usb_early_handoff(stru - } - DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID, - PCI_CLASS_SERIAL_USB, 8, quirk_usb_early_handoff); -+#endif ---- a/drivers/usb/host/pci-quirks.h -+++ b/drivers/usb/host/pci-quirks.h -@@ -5,6 +5,9 @@ - #ifdef CONFIG_USB_PCI - void uhci_reset_hc(struct pci_dev *pdev, unsigned long base); - int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base); -+#endif /* CONFIG_USB_PCI */ -+ -+#if defined(CONFIG_USB_PCI) && !defined(CONFIG_PCI_DISABLE_COMMON_QUIRKS) - int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev); - bool usb_amd_hang_symptom_quirk(void); - bool usb_amd_prefetch_quirk(void); -@@ -19,6 +22,18 @@ void sb800_prefetch(struct device *dev, - bool usb_amd_pt_check_port(struct device *device, int port); - #else - struct pci_dev; -+static inline int usb_amd_quirk_pll_check(void) -+{ -+ return 0; -+} -+static inline bool usb_amd_hang_symptom_quirk(void) -+{ -+ return false; -+} -+static inline bool usb_amd_prefetch_quirk(void) -+{ -+ return false; -+} - static inline void usb_amd_quirk_pll_disable(void) {} - static inline void usb_amd_quirk_pll_enable(void) {} - static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {} -@@ -29,6 +44,11 @@ static inline bool usb_amd_pt_check_port - { - return false; - } -+static inline void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev) {} -+static inline bool usb_xhci_needs_pci_reset(struct pci_dev *pdev) -+{ -+ return false; -+} - #endif /* CONFIG_USB_PCI */ - - #endif /* __LINUX_USB_PCI_QUIRKS_H */ ---- a/include/linux/usb/hcd.h -+++ b/include/linux/usb/hcd.h -@@ -498,7 +498,14 @@ extern int usb_hcd_pci_probe(struct pci_ - extern void usb_hcd_pci_remove(struct pci_dev *dev); - extern void usb_hcd_pci_shutdown(struct pci_dev *dev); - -+#ifndef CONFIG_PCI_DISABLE_COMMON_QUIRKS - extern int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev); -+#else -+static inline int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *dev) -+{ -+ return 0; -+} -+#endif - - #ifdef CONFIG_PM - extern const struct dev_pm_ops usb_hcd_pci_pm_ops; diff --git a/target/linux/generic/pending-5.19/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch b/target/linux/generic/pending-5.19/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch deleted file mode 100644 index 33eb34c91..000000000 --- a/target/linux/generic/pending-5.19/820-w1-gpio-fix-problem-with-platfom-data-in-w1-gpio.patch +++ /dev/null @@ -1,26 +0,0 @@ -From d9c8bc8c1408f3e8529db6e4e04017b4c579c342 Mon Sep 17 00:00:00 2001 -From: Pawel Dembicki -Date: Sun, 18 Feb 2018 17:08:04 +0100 -Subject: [PATCH] w1: gpio: fix problem with platfom data in w1-gpio - -In devices, where fdt is used, is impossible to apply platform data -without proper fdt node. - -This patch allow to use platform data in devices with fdt. - -Signed-off-by: Pawel Dembicki ---- - drivers/w1/masters/w1-gpio.c | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) - ---- a/drivers/w1/masters/w1-gpio.c -+++ b/drivers/w1/masters/w1-gpio.c -@@ -76,7 +76,7 @@ static int w1_gpio_probe(struct platform - enum gpiod_flags gflags = GPIOD_OUT_LOW_OPEN_DRAIN; - int err; - -- if (of_have_populated_dt()) { -+ if (of_have_populated_dt() && !dev_get_platdata(&pdev->dev)) { - pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); - if (!pdata) - return -ENOMEM; diff --git a/target/linux/generic/pending-5.19/834-ledtrig-libata.patch b/target/linux/generic/pending-5.19/834-ledtrig-libata.patch deleted file mode 100644 index 4f0d3975e..000000000 --- a/target/linux/generic/pending-5.19/834-ledtrig-libata.patch +++ /dev/null @@ -1,149 +0,0 @@ -From: Daniel Golle -Subject: libata: add ledtrig support - -This adds a LED trigger for each ATA port indicating disk activity. - -As this is needed only on specific platforms (NAS SoCs and such), -these platforms should define ARCH_WANTS_LIBATA_LEDS if there -are boards with LED(s) intended to indicate ATA disk activity and -need the OS to take care of that. -In that way, if not selected, LED trigger support not will be -included in libata-core and both, codepaths and structures remain -untouched. - -Signed-off-by: Daniel Golle ---- - drivers/ata/Kconfig | 16 ++++++++++++++++ - drivers/ata/libata-core.c | 41 +++++++++++++++++++++++++++++++++++++++++ - include/linux/libata.h | 9 +++++++++ - 3 files changed, 66 insertions(+) - ---- a/drivers/ata/Kconfig -+++ b/drivers/ata/Kconfig -@@ -67,6 +67,22 @@ config ATA_FORCE - - If unsure, say Y. - -+config ARCH_WANT_LIBATA_LEDS -+ bool -+ -+config ATA_LEDS -+ bool "support ATA port LED triggers" -+ depends on ARCH_WANT_LIBATA_LEDS -+ select NEW_LEDS -+ select LEDS_CLASS -+ select LEDS_TRIGGERS -+ default y -+ help -+ This option adds a LED trigger for each registered ATA port. -+ It is used to drive disk activity leds connected via GPIO. -+ -+ If unsure, say N. -+ - config ATA_ACPI - bool "ATA ACPI Support" - depends on ACPI ---- a/drivers/ata/libata-core.c -+++ b/drivers/ata/libata-core.c -@@ -663,6 +663,19 @@ u64 ata_tf_read_block(const struct ata_t - return block; - } - -+#ifdef CONFIG_ATA_LEDS -+#define LIBATA_BLINK_DELAY 20 /* ms */ -+static inline void ata_led_act(struct ata_port *ap) -+{ -+ unsigned long led_delay = LIBATA_BLINK_DELAY; -+ -+ if (unlikely(!ap->ledtrig)) -+ return; -+ -+ led_trigger_blink_oneshot(ap->ledtrig, &led_delay, &led_delay, 0); -+} -+#endif -+ - /** - * ata_build_rw_tf - Build ATA taskfile for given read/write request - * @tf: Target ATA taskfile -@@ -4621,6 +4634,9 @@ void __ata_qc_complete(struct ata_queued - link->active_tag = ATA_TAG_POISON; - ap->nr_active_links--; - } -+#ifdef CONFIG_ATA_LEDS -+ ata_led_act(ap); -+#endif - - /* clear exclusive status */ - if (unlikely(qc->flags & ATA_QCFLAG_CLEAR_EXCL && -@@ -5327,6 +5343,9 @@ struct ata_port *ata_port_alloc(struct a - ap->stats.unhandled_irq = 1; - ap->stats.idle_irq = 1; - #endif -+#ifdef CONFIG_ATA_LEDS -+ ap->ledtrig = kzalloc(sizeof(struct led_trigger), GFP_KERNEL); -+#endif - ata_sff_port_init(ap); - - return ap; -@@ -5362,6 +5381,12 @@ static void ata_host_release(struct kref - - kfree(ap->pmp_link); - kfree(ap->slave_link); -+#ifdef CONFIG_ATA_LEDS -+ if (ap->ledtrig) { -+ led_trigger_unregister(ap->ledtrig); -+ kfree(ap->ledtrig); -+ }; -+#endif - kfree(ap); - host->ports[i] = NULL; - } -@@ -5764,7 +5789,23 @@ int ata_host_register(struct ata_host *h - host->ports[i]->print_id = atomic_inc_return(&ata_print_id); - host->ports[i]->local_port_no = i + 1; - } -+#ifdef CONFIG_ATA_LEDS -+ for (i = 0; i < host->n_ports; i++) { -+ if (unlikely(!host->ports[i]->ledtrig)) -+ continue; - -+ snprintf(host->ports[i]->ledtrig_name, -+ sizeof(host->ports[i]->ledtrig_name), "ata%u", -+ host->ports[i]->print_id); -+ -+ host->ports[i]->ledtrig->name = host->ports[i]->ledtrig_name; -+ -+ if (led_trigger_register(host->ports[i]->ledtrig)) { -+ kfree(host->ports[i]->ledtrig); -+ host->ports[i]->ledtrig = NULL; -+ } -+ } -+#endif - /* Create associated sysfs transport objects */ - for (i = 0; i < host->n_ports; i++) { - rc = ata_tport_add(host->dev,host->ports[i]); ---- a/include/linux/libata.h -+++ b/include/linux/libata.h -@@ -23,6 +23,9 @@ - #include - #include - #include -+#ifdef CONFIG_ATA_LEDS -+#include -+#endif - - /* - * Define if arch has non-standard setup. This is a _PCI_ standard -@@ -860,6 +863,12 @@ struct ata_port { - #ifdef CONFIG_ATA_ACPI - struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */ - #endif -+ -+#ifdef CONFIG_ATA_LEDS -+ struct led_trigger *ledtrig; -+ char ledtrig_name[8]; -+#endif -+ - /* owned by EH */ - u8 sector_buf[ATA_SECT_SIZE] ____cacheline_aligned; - }; diff --git a/target/linux/generic/pending-5.19/840-hwrng-bcm2835-set-quality-to-1000.patch b/target/linux/generic/pending-5.19/840-hwrng-bcm2835-set-quality-to-1000.patch deleted file mode 100644 index 5ca8933d6..000000000 --- a/target/linux/generic/pending-5.19/840-hwrng-bcm2835-set-quality-to-1000.patch +++ /dev/null @@ -1,26 +0,0 @@ -From d6988cf1d16faac56899918bb2b1be8d85155e3f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= -Date: Sat, 20 Feb 2021 18:36:38 +0100 -Subject: [PATCH] hwrng: bcm2835: set quality to 1000 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This allows devices without a high precission timer to reduce boot from >100s -to <30s. - -Signed-off-by: Álvaro Fernández Rojas ---- - drivers/char/hw_random/bcm2835-rng.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/char/hw_random/bcm2835-rng.c -+++ b/drivers/char/hw_random/bcm2835-rng.c -@@ -170,6 +170,7 @@ static int bcm2835_rng_probe(struct plat - priv->rng.init = bcm2835_rng_init; - priv->rng.read = bcm2835_rng_read; - priv->rng.cleanup = bcm2835_rng_cleanup; -+ priv->rng.quality = 1000; - - if (dev_of_node(dev)) { - rng_id = of_match_node(bcm2835_rng_of_match, dev->of_node); diff --git a/target/linux/generic/pending-5.19/920-mangle_bootargs.patch b/target/linux/generic/pending-5.19/920-mangle_bootargs.patch deleted file mode 100644 index 30d5de253..000000000 --- a/target/linux/generic/pending-5.19/920-mangle_bootargs.patch +++ /dev/null @@ -1,71 +0,0 @@ -From: Imre Kaloz -Subject: init: add CONFIG_MANGLE_BOOTARGS and disable it by default - -Enabling this option renames the bootloader supplied root= -and rootfstype= variables, which might have to be know but -would break the automatisms OpenWrt uses. - -Signed-off-by: Imre Kaloz ---- - init/Kconfig | 9 +++++++++ - init/main.c | 24 ++++++++++++++++++++++++ - 2 files changed, 33 insertions(+) - ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -1808,6 +1808,15 @@ config EMBEDDED - an embedded system so certain expert options are available - for configuration. - -+config MANGLE_BOOTARGS -+ bool "Rename offending bootargs" -+ depends on EXPERT -+ help -+ Sometimes the bootloader passed bogus root= and rootfstype= -+ parameters to the kernel, and while you want to ignore them, -+ you need to know the values f.e. to support dual firmware -+ layouts on the flash. -+ - config HAVE_PERF_EVENTS - bool - help ---- a/init/main.c -+++ b/init/main.c -@@ -607,6 +607,29 @@ static inline void setup_nr_cpu_ids(void - static inline void smp_prepare_cpus(unsigned int maxcpus) { } - #endif - -+#ifdef CONFIG_MANGLE_BOOTARGS -+static void __init mangle_bootargs(char *command_line) -+{ -+ char *rootdev; -+ char *rootfs; -+ -+ rootdev = strstr(command_line, "root=/dev/mtdblock"); -+ -+ if (rootdev) -+ strncpy(rootdev, "mangled_rootblock=", 18); -+ -+ rootfs = strstr(command_line, "rootfstype"); -+ -+ if (rootfs) -+ strncpy(rootfs, "mangled_fs", 10); -+ -+} -+#else -+static void __init mangle_bootargs(char *command_line) -+{ -+} -+#endif -+ - /* - * We need to store the untouched command line for future reference. - * We also need to store the touched command line since the parameter -@@ -950,6 +973,7 @@ asmlinkage __visible void __init __no_sa - pr_notice("%s", linux_banner); - early_security_init(); - setup_arch(&command_line); -+ mangle_bootargs(command_line); - setup_boot_config(); - setup_command_line(command_line); - setup_nr_cpu_ids(); diff --git a/target/linux/silicon/armv8/config-5.19 b/target/linux/silicon/armv8/config-5.19 deleted file mode 100644 index 8bd9ea04e..000000000 --- a/target/linux/silicon/armv8/config-5.19 +++ /dev/null @@ -1,510 +0,0 @@ -CONFIG_64BIT=y -# CONFIG_AIO is not set -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_ARCH_KEEP_MEMBLOCK=y -CONFIG_ARCH_APPLE=y -CONFIG_ARCH_MMAP_RND_BITS=18 -CONFIG_ARCH_MMAP_RND_BITS_MAX=33 -CONFIG_ARCH_MMAP_RND_BITS_MIN=18 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 -CONFIG_ARCH_PROC_KCORE_TEXT=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_STACKWALK=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARM64=y -CONFIG_ARM64_4K_PAGES=y -CONFIG_ARM64_CNP=y -CONFIG_ARM64_ERRATUM_1165522=y -CONFIG_ARM64_ERRATUM_1286807=y -CONFIG_ARM64_ERRATUM_819472=y -CONFIG_ARM64_ERRATUM_824069=y -CONFIG_ARM64_ERRATUM_826319=y -CONFIG_ARM64_ERRATUM_827319=y -CONFIG_ARM64_ERRATUM_843419=y -CONFIG_ARM64_ERRATUM_858921=y -CONFIG_ARM64_HW_AFDBM=y -CONFIG_ARM64_MODULE_PLTS=y -CONFIG_ARM64_PAGE_SHIFT=12 -CONFIG_ARM64_PAN=y -CONFIG_ARM64_PA_BITS=48 -CONFIG_ARM64_PA_BITS_48=y -CONFIG_ARM64_PMEM=y -CONFIG_ARM64_PTR_AUTH=y -CONFIG_ARM64_SVE=y -# CONFIG_ARM64_SW_TTBR0_PAN is not set -CONFIG_ARM64_TAGGED_ADDR_ABI=y -CONFIG_ARM64_UAO=y -CONFIG_ARM64_VA_BITS=48 -# CONFIG_ARM64_VA_BITS_39 is not set -CONFIG_ARM64_VA_BITS_48=y -CONFIG_ARM64_VHE=y -CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y -CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y -CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y -CONFIG_ARM_AMBA=y -CONFIG_ARM_ARCH_TIMER=y -CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y -CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y -CONFIG_ARM_GIC=y -CONFIG_ARM_GIC_V3=y -CONFIG_ARM_GIC_V3_ITS=y -CONFIG_ARM_PSCI_FW=y -# CONFIG_ARM_SCMI_PROTOCOL is not set -CONFIG_ARM_SCPI_POWER_DOMAIN=y -CONFIG_ARM_SCPI_PROTOCOL=y -CONFIG_ASN1=y -CONFIG_ASSOCIATIVE_ARRAY=y -CONFIG_ASYMMETRIC_KEY_TYPE=y -CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y -CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y -CONFIG_BLK_DEBUG_FS=y -# CONFIG_BLK_DEV_INITRD is not set -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_SD=y -CONFIG_BLK_PM=y -CONFIG_BLK_SCSI_REQUEST=y -CONFIG_CAVIUM_TX2_ERRATUM_219=y -# CONFIG_CEC_CH7322 is not set -# CONFIG_CEC_MESON_AO is not set -# CONFIG_CEC_MESON_G12A_AO is not set -CONFIG_CLKDEV_LOOKUP=y -CONFIG_CLK_QORIQ=y -CONFIG_CLONE_BACKWARDS=y -CONFIG_CLZ_TAB=y -CONFIG_CMA=y -CONFIG_CMA_ALIGNMENT=8 -CONFIG_CMA_AREAS=7 -# CONFIG_CMA_DEBUG is not set -# CONFIG_CMA_DEBUGFS is not set -CONFIG_CMA_SIZE_MBYTES=16 -# CONFIG_CMA_SIZE_SEL_MAX is not set -CONFIG_CMA_SIZE_SEL_MBYTES=y -# CONFIG_CMA_SIZE_SEL_MIN is not set -# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set -CONFIG_COMMON_CLK=y -CONFIG_COMMON_CLK_AXG=y -# CONFIG_COMMON_CLK_AXG_AUDIO is not set -CONFIG_COMMON_CLK_CS2000_CP=y -CONFIG_COMMON_CLK_G12A=y -CONFIG_COMMON_CLK_GXBB=y -CONFIG_COMMON_CLK_MESON_AO_CLKC=y -CONFIG_COMMON_CLK_MESON_CPU_DYNDIV=y -CONFIG_COMMON_CLK_MESON_DUALDIV=y -CONFIG_COMMON_CLK_MESON_EE_CLKC=y -CONFIG_COMMON_CLK_MESON_MPLL=y -CONFIG_COMMON_CLK_MESON_PLL=y -CONFIG_COMMON_CLK_MESON_REGMAP=y -CONFIG_COMMON_CLK_MESON_VID_PLL_DIV=y -CONFIG_COMMON_CLK_PWM=y -CONFIG_COMMON_CLK_SCPI=y -CONFIG_COMMON_CLK_XGENE=y -# CONFIG_COMPAT_32BIT_TIME is not set -CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_CONTIG_ALLOC=y -CONFIG_COREDUMP=y -CONFIG_CPU_RMAP=y -CONFIG_CRC16=y -CONFIG_CRC7=y -CONFIG_CRC_ITU_T=y -CONFIG_CRYPTO_AEAD=y -CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_AKCIPHER=y -CONFIG_CRYPTO_AKCIPHER2=y -CONFIG_CRYPTO_CCM=y -CONFIG_CRYPTO_CMAC=y -CONFIG_CRYPTO_CRC32=y -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_CTR=y -CONFIG_CRYPTO_DRBG=y -CONFIG_CRYPTO_DRBG_HMAC=y -CONFIG_CRYPTO_DRBG_MENU=y -CONFIG_CRYPTO_GCM=y -CONFIG_CRYPTO_GF128MUL=y -CONFIG_CRYPTO_GHASH=y -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -CONFIG_CRYPTO_HASH_INFO=y -CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_JITTERENTROPY=y -CONFIG_CRYPTO_LIB_SHA256=y -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -CONFIG_CRYPTO_NULL=y -CONFIG_CRYPTO_NULL2=y -CONFIG_CRYPTO_RNG=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_RNG_DEFAULT=y -CONFIG_CRYPTO_RSA=y -CONFIG_CRYPTO_SEQIV=y -CONFIG_CRYPTO_SHA256=y -CONFIG_DCACHE_WORD_ACCESS=y -CONFIG_DEBUG_INFO=y -CONFIG_DMA_CMA=y -CONFIG_DMA_DIRECT_REMAP=y -CONFIG_DMA_REMAP=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DRM=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_DW_HDMI=y -# CONFIG_DRM_DW_HDMI_I2S_AUDIO is not set -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=100 -CONFIG_DRM_GEM_CMA_HELPER=y -CONFIG_DRM_KMS_CMA_HELPER=y -CONFIG_DRM_KMS_FB_HELPER=y -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MALI_DISPLAY=y -CONFIG_DRM_MESON=y -CONFIG_DRM_MESON_DW_HDMI=y -CONFIG_DRM_PANEL=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_DTC=y -CONFIG_DUMMY_CONSOLE=y -CONFIG_DVB_CORE=y -CONFIG_DWMAC_DWC_QOS_ETH=y -# CONFIG_DWMAC_GENERIC is not set -CONFIG_DWMAC_MESON=y -CONFIG_EDAC_SUPPORT=y -CONFIG_ELF_CORE=y -# CONFIG_ENABLE_DEFAULT_TRACERS is not set -CONFIG_EXT4_FS=y -CONFIG_EXT4_FS_SECURITY=y -CONFIG_EXTCON=y -CONFIG_F2FS_FS=y -CONFIG_F2FS_FS_POSIX_ACL=y -CONFIG_FB=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_CMDLINE=y -CONFIG_FB_DEFERRED_IO=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_SYS_IMAGEBLIT=y -CONFIG_FIXED_PHY=y -CONFIG_FIX_EARLYCON_MEM=y -# CONFIG_FLATMEM_MANUAL is not set -CONFIG_FONT_8x16=y -CONFIG_FONT_8x8=y -CONFIG_FONT_SUPPORT=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -CONFIG_FRAME_POINTER=y -CONFIG_FSL_ERRATUM_A008585=y -CONFIG_FS_IOMAP=y -CONFIG_FS_MBCACHE=y -CONFIG_FS_POSIX_ACL=y -CONFIG_FTRACE=y -# CONFIG_FTRACE_SYSCALLS is not set -CONFIG_FUJITSU_ERRATUM_010001=y -CONFIG_FW_LOADER_PAGED_BUF=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_GENERIC_ARCH_TOPOLOGY=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_GENERIC_CSUM=y -CONFIG_GENERIC_EARLY_IOREMAP=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_IDLE_POLL_SETUP=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MULTI_HANDLER=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_IRQ_SHOW_LEVEL=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_GENERIC_PHY=y -CONFIG_GENERIC_PINCONF=y -CONFIG_GENERIC_PINCTRL_GROUPS=y -CONFIG_GENERIC_PINMUX_FUNCTIONS=y -CONFIG_GENERIC_SCHED_CLOCK=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GLOB=y -CONFIG_GPIOLIB=y -CONFIG_HANDLE_DOMAIN_IRQ=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_HAS_DMA=y -CONFIG_HAS_IOMEM=y -CONFIG_HDMI=y -CONFIG_HISILICON_ERRATUM_161010101=y -# CONFIG_HIST_TRIGGERS is not set -CONFIG_HOLES_IN_ZONE=y -CONFIG_HWMON=y -CONFIG_HW_CONSOLE=y -CONFIG_HW_RANDOM=y -CONFIG_HW_RANDOM_MESON=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_MESON=y -CONFIG_ICPLUS_PHY=y -CONFIG_IIO=y -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -CONFIG_INPUT=y -CONFIG_IPV6=y -CONFIG_IPV6_MROUTE=y -CONFIG_IPV6_MULTIPLE_TABLES=y -# CONFIG_IPV6_PIMSM_V2 is not set -CONFIG_IPV6_SUBTREES=y -CONFIG_IP_MROUTE_COMMON=y -CONFIG_IRQCHIP=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_IRQ_WORK=y -# CONFIG_IR_IMON_RAW is not set -CONFIG_IR_MESON=y -# CONFIG_IR_SERIAL is not set -# CONFIG_IR_SIR is not set -# CONFIG_IR_TOY is not set -CONFIG_JBD2=y -CONFIG_KCMP=y -CONFIG_KEYS=y -# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set -CONFIG_LEDS_GPIO=y -CONFIG_LIBFDT=y -# CONFIG_LIRC is not set -CONFIG_LLD_VERSION=0 -CONFIG_LOCK_DEBUGGING_SUPPORT=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_MAGIC_SYSRQ=y -CONFIG_MAILBOX=y -# CONFIG_MAILBOX_TEST is not set -CONFIG_MDIO_BITBANG=y -CONFIG_MDIO_BUS=y -CONFIG_MDIO_BUS_MUX=y -# CONFIG_MDIO_BUS_MUX_MESON_G12A is not set -CONFIG_MDIO_BUS_MUX_MMIOREG=y -CONFIG_MDIO_DEVICE=y -CONFIG_MDIO_DEVRES=y -# CONFIG_MDIO_GPIO is not set -CONFIG_MEDIA_ANALOG_TV_SUPPORT=y -CONFIG_MEDIA_ATTACH=y -CONFIG_MEDIA_CAMERA_SUPPORT=y -CONFIG_MEDIA_CEC_SUPPORT=y -CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y -CONFIG_MEDIA_PLATFORM_SUPPORT=y -CONFIG_MEDIA_RADIO_SUPPORT=y -CONFIG_MEDIA_SDR_SUPPORT=y -CONFIG_MEDIA_SUPPORT=y -CONFIG_MEDIA_TEST_SUPPORT=y -CONFIG_MEDIA_TUNER=y -CONFIG_MEMFD_CREATE=y -CONFIG_MEMORY_ISOLATION=y -CONFIG_MESON_CANVAS=y -CONFIG_MESON_CLK_MEASURE=y -CONFIG_MESON_EE_PM_DOMAINS=y -CONFIG_MESON_EFUSE=y -CONFIG_MESON_GXBB_WATCHDOG=y -CONFIG_MESON_GXL_PHY=y -CONFIG_MESON_GX_PM_DOMAINS=y -CONFIG_MESON_GX_SOCINFO=y -CONFIG_MESON_IRQ_GPIO=y -# CONFIG_MESON_MX_EFUSE is not set -CONFIG_MESON_MX_SOCINFO=y -CONFIG_MESON_SARADC=y -CONFIG_MESON_SECURE_PM_DOMAINS=y -CONFIG_MESON_SM=y -CONFIG_MESON_WATCHDOG=y -# CONFIG_MFD_KHADAS_MCU is not set -CONFIG_MFD_SYSCON=y -CONFIG_MIGRATION=y -CONFIG_MMC=y -CONFIG_MMC_ARMMMCI=y -CONFIG_MMC_BLOCK=y -CONFIG_MMC_BLOCK_MINORS=32 -CONFIG_MMC_CQHCI=y -CONFIG_MMC_DW=y -# CONFIG_MMC_DW_BLUEFIELD is not set -# CONFIG_MMC_DW_EXYNOS is not set -# CONFIG_MMC_DW_HI3798CV200 is not set -CONFIG_MMC_DW_K3=y -CONFIG_MMC_DW_PLTFM=y -CONFIG_MMC_MESON_GX=y -# CONFIG_MMC_MESON_MX_SDIO is not set -CONFIG_MMC_SDHCI=y -CONFIG_MMC_SDHCI_OF_ARASAN=y -CONFIG_MMC_SDHCI_PLTFM=y -CONFIG_MMC_SPI=y -CONFIG_MMC_STM32_SDMMC=y -CONFIG_MODULES_USE_ELF_RELA=y -CONFIG_MPILIB=y -CONFIG_MQ_IOSCHED_DEADLINE=y -CONFIG_MQ_IOSCHED_KYBER=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_NEED_SG_DMA_LENGTH=y -CONFIG_NET_CLS_ACT=y -CONFIG_NET_EMATCH=y -CONFIG_NET_FLOW_LIMIT=y -CONFIG_NET_PTP_CLASSIFY=y -CONFIG_NLS=y -CONFIG_NO_HZ_COMMON=y -CONFIG_NO_HZ_IDLE=y -CONFIG_NO_IOPORT_MAP=y -CONFIG_NR_CPUS=8 -CONFIG_NVMEM=y -CONFIG_OF=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_FLATTREE=y -CONFIG_OF_GPIO=y -CONFIG_OF_IRQ=y -CONFIG_OF_KOBJ=y -CONFIG_OF_MDIO=y -CONFIG_OF_NET=y -CONFIG_OID_REGISTRY=y -CONFIG_PADATA=y -CONFIG_PAGE_POOL=y -CONFIG_PARTITION_PERCPU=y -CONFIG_PCS_XPCS=y -CONFIG_PGTABLE_LEVELS=4 -CONFIG_PHYLIB=y -CONFIG_PHYLINK=y -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_PHY_MESON8B_USB2=y -CONFIG_PHY_MESON_AXG_MIPI_PCIE_ANALOG=y -CONFIG_PHY_MESON_AXG_PCIE=y -# CONFIG_PHY_MESON_G12A_USB2 is not set -# CONFIG_PHY_MESON_G12A_USB3_PCIE is not set -CONFIG_PHY_MESON_GXL_USB2=y -CONFIG_PINCTRL=y -CONFIG_PINCTRL_MESON=y -CONFIG_PINCTRL_MESON8_PMX=y -# CONFIG_PINCTRL_MESON_A1 is not set -# CONFIG_PINCTRL_MESON_AXG is not set -# CONFIG_PINCTRL_MESON_G12A is not set -CONFIG_PINCTRL_MESON_GXBB=y -CONFIG_PINCTRL_MESON_GXL=y -CONFIG_PKCS7_MESSAGE_PARSER=y -# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set -CONFIG_PLATFORM_MHU=y -CONFIG_PM=y -CONFIG_PM_CLK=y -CONFIG_PM_GENERIC_DOMAINS=y -CONFIG_PM_GENERIC_DOMAINS_OF=y -CONFIG_POSIX_MQUEUE=y -CONFIG_POSIX_MQUEUE_SYSCTL=y -CONFIG_POWER_RESET=y -CONFIG_POWER_SUPPLY=y -CONFIG_POWER_SUPPLY_HWMON=y -CONFIG_PPS=y -CONFIG_PRINTK_TIME=y -CONFIG_PTP_1588_CLOCK=y -CONFIG_PWM=y -CONFIG_PWM_MESON=y -CONFIG_PWM_SYSFS=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_RATIONAL=y -CONFIG_RCU_NEED_SEGCBLIST=y -CONFIG_RCU_STALL_COMMON=y -CONFIG_RC_CORE=y -CONFIG_RC_DEVICES=y -# CONFIG_RC_XBOX_DVD is not set -CONFIG_REALTEK_AUTOPM=y -CONFIG_REALTEK_PHY=y -CONFIG_REGMAP=y -CONFIG_REGMAP_MMIO=y -CONFIG_REGULATOR=y -CONFIG_REGULATOR_DEBUG=y -CONFIG_REGULATOR_FIXED_VOLTAGE=y -CONFIG_REGULATOR_GPIO=y -CONFIG_RESET_CONTROLLER=y -CONFIG_RESET_MESON=y -# CONFIG_RESET_MESON_AUDIO_ARB is not set -CONFIG_RFS_ACCEL=y -CONFIG_RODATA_FULL_DEFAULT_ENABLED=y -CONFIG_RPS=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -CONFIG_SCSI=y -CONFIG_SDIO_UART=y -# CONFIG_SECONDARY_TRUSTED_KEYRING is not set -CONFIG_SENSORS_ARM_SCPI=y -CONFIG_SERIAL_8250_FSL=y -CONFIG_SERIAL_MCTRL_GPIO=y -CONFIG_SERIAL_MESON=y -CONFIG_SERIAL_MESON_CONSOLE=y -CONFIG_SG_POOL=y -CONFIG_SMP=y -CONFIG_SOC_BUS=y -CONFIG_SPARSEMEM=y -CONFIG_SPARSEMEM_EXTREME=y -CONFIG_SPARSEMEM_MANUAL=y -CONFIG_SPARSEMEM_VMEMMAP=y -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_SPARSE_IRQ=y -CONFIG_SPI=y -CONFIG_SPI_MASTER=y -CONFIG_SPI_MESON_SPICC=y -CONFIG_SPI_MESON_SPIFC=y -CONFIG_SRCU=y -CONFIG_STACKTRACE=y -CONFIG_STMMAC_ETH=y -CONFIG_STMMAC_PLATFORM=y -# CONFIG_STMMAC_SELFTESTS is not set -CONFIG_SWIOTLB=y -CONFIG_SWPHY=y -CONFIG_SYNC_FILE=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set -CONFIG_SYSTEM_TRUSTED_KEYRING=y -CONFIG_SYS_SUPPORTS_HUGETLBFS=y -CONFIG_THREAD_INFO_IN_TASK=y -CONFIG_TICK_CPU_ACCOUNTING=y -CONFIG_TIMER_OF=y -CONFIG_TIMER_PROBE=y -CONFIG_TREE_RCU=y -CONFIG_TREE_SRCU=y -CONFIG_TUN=y -CONFIG_UNMAP_KERNEL_AT_EL0=y -CONFIG_USB=y -CONFIG_USB_COMMON=y -CONFIG_USB_DWC2=y -CONFIG_USB_DWC2_DUAL_ROLE=y -CONFIG_USB_DWC3=y -CONFIG_USB_DWC3_DUAL_ROLE=y -# CONFIG_USB_DWC3_GADGET is not set -# CONFIG_USB_DWC3_HOST is not set -CONFIG_USB_DWC3_MESON_G12A=y -CONFIG_USB_DWC3_OF_SIMPLE=y -CONFIG_USB_EHCI_HCD=y -CONFIG_USB_EHCI_HCD_PLATFORM=y -# CONFIG_USB_ETH is not set -CONFIG_USB_GADGET=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_OHCI_HCD_PLATFORM=y -CONFIG_USB_OTG=y -CONFIG_USB_OTG_FSM=y -CONFIG_USB_PHY=y -# CONFIG_USB_PULSE8_CEC is not set -# CONFIG_USB_RAINSHADOW_CEC is not set -CONFIG_USB_ROLE_SWITCH=y -CONFIG_USB_STORAGE=y -CONFIG_USB_STORAGE_REALTEK=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_ULPI=y -CONFIG_USB_ULPI_VIEWPORT=y -CONFIG_USB_XHCI_HCD=y -CONFIG_USB_XHCI_PLATFORM=y -CONFIG_VIDEOMODE_HELPERS=y -CONFIG_VMAP_STACK=y -CONFIG_VT=y -CONFIG_VT_CONSOLE=y -CONFIG_VT_HW_CONSOLE_BINDING=y -CONFIG_WATCHDOG_CORE=y -CONFIG_X509_CERTIFICATE_PARSER=y -CONFIG_XPS=y -CONFIG_ZONE_DMA32=y \ No newline at end of file diff --git a/target/linux/silicon/patches-5.19/0001-arm64-dts-apple-Add-CPU-topology-cpufreq-nodes-for-t.patch b/target/linux/silicon/patches-5.19/0001-arm64-dts-apple-Add-CPU-topology-cpufreq-nodes-for-t.patch deleted file mode 100644 index 63b1539be..000000000 --- a/target/linux/silicon/patches-5.19/0001-arm64-dts-apple-Add-CPU-topology-cpufreq-nodes-for-t.patch +++ /dev/null @@ -1,313 +0,0 @@ -From 6515c017a89844b13e041b739cba63ca1fd5dcb2 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 3 May 2022 00:08:56 +0900 -Subject: [PATCH 001/171] arm64: dts: apple: Add CPU topology & cpufreq nodes - for t8103 - -Add the missing CPU topology/capacity information and the cpufreq nodes, -so we can have CPU frequency scaling and the scheduler has the -information it needs to make the correct decisions. - -Boost states are commented out, as they are not yet available (that -requires CPU deep sleep support, to be eventually done via PSCI). -The driver supports them fine; the hardware will just refuse to ever -go into them at this time, so don't expose them to users until that's -done. - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103.dtsi | 203 +++++++++++++++++++++++++-- - 1 file changed, 193 insertions(+), 10 deletions(-) - -diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/apple/t8103.dtsi -index 9f8f4145db88..3df126a5a7dd 100644 ---- a/arch/arm64/boot/dts/apple/t8103.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103.dtsi -@@ -22,71 +22,245 @@ cpus { - #address-cells = <2>; - #size-cells = <0>; - -- cpu0: cpu@0 { -+ cpu-map { -+ cluster0 { -+ core0 { -+ cpu = <&cpu_e0>; -+ }; -+ core1 { -+ cpu = <&cpu_e1>; -+ }; -+ core2 { -+ cpu = <&cpu_e2>; -+ }; -+ core3 { -+ cpu = <&cpu_e3>; -+ }; -+ }; -+ -+ cluster1 { -+ core0 { -+ cpu = <&cpu_p0>; -+ }; -+ core1 { -+ cpu = <&cpu_p1>; -+ }; -+ core2 { -+ cpu = <&cpu_p2>; -+ }; -+ core3 { -+ cpu = <&cpu_p3>; -+ }; -+ }; -+ }; -+ -+ cpu_e0: cpu@0 { - compatible = "apple,icestorm"; - device_type = "cpu"; - reg = <0x0 0x0>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 0>; - }; - -- cpu1: cpu@1 { -+ cpu_e1: cpu@1 { - compatible = "apple,icestorm"; - device_type = "cpu"; - reg = <0x0 0x1>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 0>; - }; - -- cpu2: cpu@2 { -+ cpu_e2: cpu@2 { - compatible = "apple,icestorm"; - device_type = "cpu"; - reg = <0x0 0x2>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 0>; - }; - -- cpu3: cpu@3 { -+ cpu_e3: cpu@3 { - compatible = "apple,icestorm"; - device_type = "cpu"; - reg = <0x0 0x3>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 0>; - }; - -- cpu4: cpu@10100 { -+ cpu_p0: cpu@10100 { - compatible = "apple,firestorm"; - device_type = "cpu"; - reg = <0x0 0x10100>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; - }; - -- cpu5: cpu@10101 { -+ cpu_p1: cpu@10101 { - compatible = "apple,firestorm"; - device_type = "cpu"; - reg = <0x0 0x10101>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; - }; - -- cpu6: cpu@10102 { -+ cpu_p2: cpu@10102 { - compatible = "apple,firestorm"; - device_type = "cpu"; - reg = <0x0 0x10102>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; - }; - -- cpu7: cpu@10103 { -+ cpu_p3: cpu@10103 { - compatible = "apple,firestorm"; - device_type = "cpu"; - reg = <0x0 0x10103>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; -+ }; -+ }; -+ -+ ecluster_opp: opp-table-0 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp01 { -+ opp-hz = /bits/ 64 <600000000>; -+ opp-level = <1>; -+ clock-latency-ns = <7500>; -+ }; -+ opp02 { -+ opp-hz = /bits/ 64 <972000000>; -+ opp-level = <2>; -+ clock-latency-ns = <22000>; -+ }; -+ opp03 { -+ opp-hz = /bits/ 64 <1332000000>; -+ opp-level = <3>; -+ clock-latency-ns = <27000>; -+ }; -+ opp04 { -+ opp-hz = /bits/ 64 <1704000000>; -+ opp-level = <4>; -+ clock-latency-ns = <33000>; -+ }; -+ opp05 { -+ opp-hz = /bits/ 64 <2064000000>; -+ opp-level = <5>; -+ clock-latency-ns = <50000>; - }; - }; - -+ pcluster_opp: opp-table-1 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp01 { -+ opp-hz = /bits/ 64 <600000000>; -+ opp-level = <1>; -+ clock-latency-ns = <8000>; -+ }; -+ opp02 { -+ opp-hz = /bits/ 64 <828000000>; -+ opp-level = <2>; -+ clock-latency-ns = <19000>; -+ }; -+ opp03 { -+ opp-hz = /bits/ 64 <1056000000>; -+ opp-level = <3>; -+ clock-latency-ns = <21000>; -+ }; -+ opp04 { -+ opp-hz = /bits/ 64 <1284000000>; -+ opp-level = <4>; -+ clock-latency-ns = <23000>; -+ }; -+ opp05 { -+ opp-hz = /bits/ 64 <1500000000>; -+ opp-level = <5>; -+ clock-latency-ns = <24000>; -+ }; -+ opp06 { -+ opp-hz = /bits/ 64 <1728000000>; -+ opp-level = <6>; -+ clock-latency-ns = <29000>; -+ }; -+ opp07 { -+ opp-hz = /bits/ 64 <1956000000>; -+ opp-level = <7>; -+ clock-latency-ns = <31000>; -+ }; -+ opp08 { -+ opp-hz = /bits/ 64 <2184000000>; -+ opp-level = <8>; -+ clock-latency-ns = <34000>; -+ }; -+ opp09 { -+ opp-hz = /bits/ 64 <2388000000>; -+ opp-level = <9>; -+ clock-latency-ns = <36000>; -+ }; -+ opp10 { -+ opp-hz = /bits/ 64 <2592000000>; -+ opp-level = <10>; -+ clock-latency-ns = <51000>; -+ }; -+ opp11 { -+ opp-hz = /bits/ 64 <2772000000>; -+ opp-level = <11>; -+ clock-latency-ns = <54000>; -+ }; -+ opp12 { -+ opp-hz = /bits/ 64 <2988000000>; -+ opp-level = <12>; -+ clock-latency-ns = <55000>; -+ }; -+#if 0 -+ /* Not available until CPU deep sleep is implemented */ -+ opp13 { -+ opp-hz = /bits/ 64 <3096000000>; -+ opp-level = <13>; -+ clock-latency-ns = <55000>; -+ turbo-mode; -+ }; -+ opp14 { -+ opp-hz = /bits/ 64 <3144000000>; -+ opp-level = <14>; -+ clock-latency-ns = <56000>; -+ turbo-mode; -+ }; -+ opp15 { -+ opp-hz = /bits/ 64 <3204000000>; -+ opp-level = <15>; -+ clock-latency-ns = <56000>; -+ turbo-mode; -+ }; -+#endif -+ }; -+ - timer { - compatible = "arm,armv8-timer"; - interrupt-parent = <&aic>; -@@ -124,6 +298,15 @@ soc { - ranges; - nonposted-mmio; - -+ cpufreq_hw: cpufreq@210e20000 { -+ compatible = "apple,t8103-soc-cpufreq", "apple,soc-cpufreq"; -+ reg = <0x2 0x10e20000 0 0x1000>, -+ <0x2 0x11e20000 0 0x1000>; -+ reg-names = "cluster0", "cluster1"; -+ -+ #freq-domain-cells = <1>; -+ }; -+ - i2c0: i2c@235010000 { - compatible = "apple,t8103-i2c", "apple,i2c"; - reg = <0x2 0x35010000 0x0 0x4000>; -@@ -229,12 +412,12 @@ aic: interrupt-controller@23b100000 { - affinities { - e-core-pmu-affinity { - apple,fiq-index = ; -- cpus = <&cpu0 &cpu1 &cpu2 &cpu3>; -+ cpus = <&cpu_e0 &cpu_e1 &cpu_e2 &cpu_e3>; - }; - - p-core-pmu-affinity { - apple,fiq-index = ; -- cpus = <&cpu4 &cpu5 &cpu6 &cpu7>; -+ cpus = <&cpu_p0 &cpu_p1 &cpu_p2 &cpu_p3>; - }; - }; - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0002-arm64-dts-apple-t8103-Add-ANS2-nodes.patch b/target/linux/silicon/patches-5.19/0002-arm64-dts-apple-t8103-Add-ANS2-nodes.patch deleted file mode 100644 index d2930c20a..000000000 --- a/target/linux/silicon/patches-5.19/0002-arm64-dts-apple-t8103-Add-ANS2-nodes.patch +++ /dev/null @@ -1,56 +0,0 @@ -From a994e9c9c1e45fbffeb9844c182e27c58c208404 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Thu, 9 Dec 2021 17:22:51 +0100 -Subject: [PATCH 002/171] arm64: dts: apple: t8103: Add ANS2 nodes - ---- - arch/arm64/boot/dts/apple/t8103.dtsi | 33 ++++++++++++++++++++++++++++ - 1 file changed, 33 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/apple/t8103.dtsi -index 3df126a5a7dd..66544e39a20a 100644 ---- a/arch/arm64/boot/dts/apple/t8103.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103.dtsi -@@ -561,6 +561,39 @@ pinctrl_aop: pinctrl@24a820000 { - ; - }; - -+ ans_mbox: mbox@277408000 { -+ compatible = "apple,t8103-asc-mailbox", "apple,asc-mailbox-v4"; -+ reg = <0x2 0x77408000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ ; -+ interrupt-names = "send-empty", "send-not-empty", -+ "recv-empty", "recv-not-empty"; -+ #mbox-cells = <0>; -+ power-domains = <&ps_ans2>; -+ }; -+ -+ sart: sart@27bc50000 { -+ compatible = "apple,t8103-sart", "apple,sart2"; -+ reg = <0x2 0x7bc50000 0x0 0x10000>; -+ power-domains = <&ps_ans2>; -+ }; -+ -+ nvme@27bcc0000 { -+ compatible = "apple,t8103-nvme-ans2", "apple,nvme-ans2"; -+ reg = <0x2 0x7bcc0000 0x0 0x40000>, -+ <0x2 0x77400000 0x0 0x4000>; -+ reg-names = "nvme", "ans"; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ mboxes = <&ans_mbox>; -+ apple,sart = <&sart>; -+ power-domains = <&ps_ans2>; -+ resets = <&ps_ans2>; -+ }; -+ - pcie0_dart_0: dart@681008000 { - compatible = "apple,t8103-dart"; - reg = <0x6 0x81008000 0x0 0x4000>; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0003-arm64-dts-apple-t8103-Add-dwc3-nodes.patch b/target/linux/silicon/patches-5.19/0003-arm64-dts-apple-t8103-Add-dwc3-nodes.patch deleted file mode 100644 index 8f0b65ae1..000000000 --- a/target/linux/silicon/patches-5.19/0003-arm64-dts-apple-t8103-Add-dwc3-nodes.patch +++ /dev/null @@ -1,274 +0,0 @@ -From ba2a0e6cfe463e97ee1056dd45d7fd4eee24bf09 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 26 Nov 2021 15:37:23 +0900 -Subject: [PATCH 003/171] arm64: dts: apple: t8103: Add dwc3 nodes - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103-j274.dts | 12 +++++ - arch/arm64/boot/dts/apple/t8103-j293.dts | 12 +++++ - arch/arm64/boot/dts/apple/t8103-j313.dts | 12 +++++ - arch/arm64/boot/dts/apple/t8103-j456.dts | 12 +++++ - arch/arm64/boot/dts/apple/t8103-j457.dts | 12 +++++ - arch/arm64/boot/dts/apple/t8103-jxxx.dtsi | 51 +++++++++++++++++++ - arch/arm64/boot/dts/apple/t8103.dtsi | 60 +++++++++++++++++++++++ - 7 files changed, 171 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103-j274.dts b/arch/arm64/boot/dts/apple/t8103-j274.dts -index 2cd429efba5b..214476814797 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j274.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j274.dts -@@ -21,6 +21,18 @@ aliases { - }; - }; - -+/* -+ * Provide labels for the USB type C ports. -+ */ -+ -+&typec0 { -+ label = "USB-C Back-left"; -+}; -+ -+&typec1 { -+ label = "USB-C Back-right"; -+}; -+ - /* - * Force the bus number assignments so that we can declare some of the - * on-board devices and properties that are populated by the bootloader -diff --git a/arch/arm64/boot/dts/apple/t8103-j293.dts b/arch/arm64/boot/dts/apple/t8103-j293.dts -index 49cdf4b560a3..6f08fd64f482 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j293.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j293.dts -@@ -17,6 +17,18 @@ / { - model = "Apple MacBook Pro (13-inch, M1, 2020)"; - }; - -+/* -+ * Provide labels for the USB type C ports. -+ */ -+ -+&typec0 { -+ label = "USB-C Left-back"; -+}; -+ -+&typec1 { -+ label = "USB-C Left-front"; -+}; -+ - /* - * Remove unused PCIe ports and disable the associated DARTs. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-j313.dts b/arch/arm64/boot/dts/apple/t8103-j313.dts -index b0ebb45bdb6f..114aa87c8cb4 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j313.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j313.dts -@@ -17,6 +17,18 @@ / { - model = "Apple MacBook Air (M1, 2020)"; - }; - -+/* -+ * Provide labels for the USB type C ports. -+ */ -+ -+&typec0 { -+ label = "USB-C Left-back"; -+}; -+ -+&typec1 { -+ label = "USB-C Left-front"; -+}; -+ - /* - * Remove unused PCIe ports and disable the associated DARTs. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-j456.dts b/arch/arm64/boot/dts/apple/t8103-j456.dts -index 884fddf7d363..9814c97cd9ba 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j456.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j456.dts -@@ -39,6 +39,18 @@ hpm3: usb-pd@3c { - }; - }; - -+/* -+ * Provide labels for the USB type C ports. -+ */ -+ -+&typec0 { -+ label = "USB-C Back-right"; -+}; -+ -+&typec1 { -+ label = "USB-C Back-right-middle"; -+}; -+ - /* - * Force the bus number assignments so that we can declare some of the - * on-board devices and properties that are populated by the bootloader -diff --git a/arch/arm64/boot/dts/apple/t8103-j457.dts b/arch/arm64/boot/dts/apple/t8103-j457.dts -index d7c622931627..0f4cc643741c 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j457.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j457.dts -@@ -21,6 +21,18 @@ aliases { - }; - }; - -+/* -+ * Provide labels for the USB type C ports. -+ */ -+ -+&typec0 { -+ label = "USB-C Back-right"; -+}; -+ -+&typec1 { -+ label = "USB-C Back-left"; -+}; -+ - /* - * Force the bus number assignments so that we can declare some of the - * on-board devices and properties that are populated by the bootloader -diff --git a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -index fe2ae40fa9dd..020a9d8b31e9 100644 ---- a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -@@ -52,6 +52,23 @@ hpm0: usb-pd@38 { - interrupt-parent = <&pinctrl_ap>; - interrupts = <106 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec0: connector { -+ compatible = "usb-c-connector"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec0_con_hs: endpoint { -+ remote-endpoint = <&typec0_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - hpm1: usb-pd@3f { -@@ -60,6 +77,40 @@ hpm1: usb-pd@3f { - interrupt-parent = <&pinctrl_ap>; - interrupts = <106 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec1: connector { -+ compatible = "usb-c-connector"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec1_con_hs: endpoint { -+ remote-endpoint = <&typec1_usb_hs>; -+ }; -+ }; -+ }; -+ }; -+ }; -+}; -+ -+/* USB controllers */ -+&dwc3_0 { -+ port { -+ typec0_usb_hs: endpoint { -+ remote-endpoint = <&typec0_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_1 { -+ port { -+ typec1_usb_hs: endpoint { -+ remote-endpoint = <&typec1_con_hs>; -+ }; - }; - }; - -diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/apple/t8103.dtsi -index 66544e39a20a..ec7234cdc861 100644 ---- a/arch/arm64/boot/dts/apple/t8103.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103.dtsi -@@ -594,6 +594,66 @@ nvme@27bcc0000 { - resets = <&ps_ans2>; - }; - -+ dwc3_0: usb@382280000 { -+ compatible = "apple,t8103-dwc3", "apple,dwc3", "snps,dwc3"; -+ reg = <0x3 0x82280000 0x0 0x100000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ dr_mode = "otg"; -+ usb-role-switch; -+ role-switch-default-mode = "host"; -+ iommus = <&dwc3_0_dart_0 0>, <&dwc3_0_dart_1 1>; -+ power-domains = <&ps_atc0_usb>; -+ }; -+ -+ dwc3_0_dart_0: iommu@382f00000 { -+ compatible = "apple,t8103-dart"; -+ reg = <0x3 0x82f00000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_atc0_usb>; -+ }; -+ -+ dwc3_0_dart_1: iommu@382f80000 { -+ compatible = "apple,t8103-dart"; -+ reg = <0x3 0x82f80000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_atc0_usb>; -+ }; -+ -+ dwc3_1: usb@502280000 { -+ compatible = "apple,t8103-dwc3", "apple,dwc3", "snps,dwc3"; -+ reg = <0x5 0x02280000 0x0 0x100000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ dr_mode = "otg"; -+ usb-role-switch; -+ role-switch-default-mode = "host"; -+ iommus = <&dwc3_1_dart_0 0>, <&dwc3_1_dart_1 1>; -+ power-domains = <&ps_atc1_usb>; -+ }; -+ -+ dwc3_1_dart_0: iommu@502f00000 { -+ compatible = "apple,t8103-dart"; -+ reg = <0x5 0x02f00000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_atc1_usb>; -+ }; -+ -+ dwc3_1_dart_1: iommu@502f80000 { -+ compatible = "apple,t8103-dart"; -+ reg = <0x5 0x02f80000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_atc1_usb>; -+ }; -+ - pcie0_dart_0: dart@681008000 { - compatible = "apple,t8103-dart"; - reg = <0x6 0x81008000 0x0 0x4000>; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0004-arm64-dts-apple-t8103-Add-spi3-keyboard-nodes.patch b/target/linux/silicon/patches-5.19/0004-arm64-dts-apple-t8103-Add-spi3-keyboard-nodes.patch deleted file mode 100644 index 13513d6bc..000000000 --- a/target/linux/silicon/patches-5.19/0004-arm64-dts-apple-t8103-Add-spi3-keyboard-nodes.patch +++ /dev/null @@ -1,133 +0,0 @@ -From 226311814eda36c1ad693189e5402ced55e91f11 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Fri, 26 Nov 2021 00:24:15 +0100 -Subject: [PATCH 004/171] arm64: dts: apple: t8103: Add spi3/keyboard nodes - -Enables keyboard and touchpad input on MacBook Air (M1, 2020) and -MacBook Pro (13-inch, M1, 2020). - -Signed-off-by: Janne Grunau ---- - arch/arm64/boot/dts/apple/t8103-j293.dts | 20 +++++++++++++++++ - arch/arm64/boot/dts/apple/t8103-j313.dts | 20 +++++++++++++++++ - arch/arm64/boot/dts/apple/t8103.dtsi | 28 ++++++++++++++++++++++++ - 3 files changed, 68 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103-j293.dts b/arch/arm64/boot/dts/apple/t8103-j293.dts -index 6f08fd64f482..9405e97a85f2 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j293.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j293.dts -@@ -29,6 +29,26 @@ &typec1 { - label = "USB-C Left-front"; - }; - -+&spi3 { -+ status = "okay"; -+ -+ hid-transport@0 { -+ compatible = "apple,spi-hid-transport"; -+ reg = <0>; -+ spi-max-frequency = <8000000>; -+ /* -+ * cs-setup and cs-hold delays are derived from Apple's ADT -+ * Mac OS driver meta data secify 45 us for 'cs to clock' and -+ * 'clock to cs' delays. -+ */ -+ spi-cs-setup-delay-ns = <20000>; -+ spi-cs-hold-delay-ns = <20000>; -+ spi-cs-inactive-delay-ns = <250000>; -+ spien-gpios = <&pinctrl_ap 195 0>; -+ interrupts-extended = <&pinctrl_nub 13 IRQ_TYPE_LEVEL_LOW>; -+ }; -+}; -+ - /* - * Remove unused PCIe ports and disable the associated DARTs. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-j313.dts b/arch/arm64/boot/dts/apple/t8103-j313.dts -index 114aa87c8cb4..bc84f8af0b1d 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j313.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j313.dts -@@ -29,6 +29,26 @@ &typec1 { - label = "USB-C Left-front"; - }; - -+&spi3 { -+ status = "okay"; -+ -+ hid-transport@0 { -+ compatible = "apple,spi-hid-transport"; -+ reg = <0>; -+ spi-max-frequency = <8000000>; -+ /* -+ * cs-setup and cs-hold delays are derived from Apple's ADT -+ * Mac OS driver meta data secify 45 us for 'cs to clock' and -+ * 'clock to cs' delays. -+ */ -+ spi-cs-setup-delay-ns = <20000>; -+ spi-cs-hold-delay-ns = <20000>; -+ spi-cs-inactive-delay-ns = <250000>; -+ spien-gpios = <&pinctrl_ap 195 0>; -+ interrupts-extended = <&pinctrl_nub 13 IRQ_TYPE_LEVEL_LOW>; -+ }; -+}; -+ - /* - * Remove unused PCIe ports and disable the associated DARTs. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/apple/t8103.dtsi -index ec7234cdc861..9750438c30dd 100644 ---- a/arch/arm64/boot/dts/apple/t8103.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103.dtsi -@@ -290,6 +290,13 @@ clkref: clock-ref { - clock-output-names = "clkref"; - }; - -+ clk_120m: clock-120m { -+ compatible = "fixed-clock"; -+ #clock-cells = <0>; -+ clock-frequency = <120000000>; -+ clock-output-names = "clk_120m"; -+ }; -+ - soc { - compatible = "simple-bus"; - #address-cells = <2>; -@@ -374,6 +381,20 @@ i2c4: i2c@235020000 { - status = "disabled"; /* only used in J293 */ - }; - -+ spi3: spi@23510c000 { -+ compatible = "apple,t8103-spi", "apple,spi"; -+ reg = <0x2 0x3510c000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ clocks = <&clk_120m>; -+ pinctrl-0 = <&spi3_pins>; -+ pinctrl-names = "default"; -+ power-domains = <&ps_spi3>; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ status = "disabled"; /* only used in J293/J313 */ -+ }; -+ - serial0: serial@235200000 { - compatible = "apple,s5l-uart"; - reg = <0x2 0x35200000 0x0 0x1000>; -@@ -475,6 +496,13 @@ i2c4_pins: i2c4-pins { - ; - }; - -+ spi3_pins: spi3-pins { -+ pinmux = , -+ , -+ , -+ ; -+ }; -+ - pcie_pins: pcie-pins { - pinmux = , - , --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0005-arm64-dts-apple-Fix-j45x-model-years.patch b/target/linux/silicon/patches-5.19/0005-arm64-dts-apple-Fix-j45x-model-years.patch deleted file mode 100644 index 0f4a19625..000000000 --- a/target/linux/silicon/patches-5.19/0005-arm64-dts-apple-Fix-j45x-model-years.patch +++ /dev/null @@ -1,40 +0,0 @@ -From d1cc45edca0943c77a7125cb9de0300329314169 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sat, 19 Mar 2022 05:50:47 +0900 -Subject: [PATCH 005/171] arm64: dts: apple: Fix j45x model years - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103-j456.dts | 2 +- - arch/arm64/boot/dts/apple/t8103-j457.dts | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/arch/arm64/boot/dts/apple/t8103-j456.dts b/arch/arm64/boot/dts/apple/t8103-j456.dts -index 9814c97cd9ba..bb48255250c7 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j456.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j456.dts -@@ -14,7 +14,7 @@ - - / { - compatible = "apple,j456", "apple,t8103", "apple,arm-platform"; -- model = "Apple iMac (24-inch, 4x USB-C, M1, 2020)"; -+ model = "Apple iMac (24-inch, 4x USB-C, M1, 2021)"; - - aliases { - ethernet0 = ðernet0; -diff --git a/arch/arm64/boot/dts/apple/t8103-j457.dts b/arch/arm64/boot/dts/apple/t8103-j457.dts -index 0f4cc643741c..80600c3fa769 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j457.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j457.dts -@@ -14,7 +14,7 @@ - - / { - compatible = "apple,j457", "apple,t8103", "apple,arm-platform"; -- model = "Apple iMac (24-inch, 2x USB-C, M1, 2020)"; -+ model = "Apple iMac (24-inch, 2x USB-C, M1, 2021)"; - - aliases { - ethernet0 = ðernet0; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0006-arm64-dts-apple-Add-WiFi-module-and-antenna-properti.patch b/target/linux/silicon/patches-5.19/0006-arm64-dts-apple-Add-WiFi-module-and-antenna-properti.patch deleted file mode 100644 index fb5a1ce83..000000000 --- a/target/linux/silicon/patches-5.19/0006-arm64-dts-apple-Add-WiFi-module-and-antenna-properti.patch +++ /dev/null @@ -1,112 +0,0 @@ -From 30c1cffd27d0154787eba4a4a2e9c6a3e7504879 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:07:17 +0900 -Subject: [PATCH 006/171] arm64: dts: apple: Add WiFi module and antenna - properties - -Add the new module-instance/antenna-sku properties required to select -WiFi firmwares properly to all board device trees. - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103-j274.dts | 4 ++++ - arch/arm64/boot/dts/apple/t8103-j293.dts | 4 ++++ - arch/arm64/boot/dts/apple/t8103-j313.dts | 4 ++++ - arch/arm64/boot/dts/apple/t8103-j456.dts | 4 ++++ - arch/arm64/boot/dts/apple/t8103-j457.dts | 4 ++++ - arch/arm64/boot/dts/apple/t8103-jxxx.dtsi | 2 ++ - 6 files changed, 22 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103-j274.dts b/arch/arm64/boot/dts/apple/t8103-j274.dts -index 214476814797..aaa3019a4db2 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j274.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j274.dts -@@ -21,6 +21,10 @@ aliases { - }; - }; - -+&wifi0 { -+ brcm,board-type = "apple,atlantisb"; -+}; -+ - /* - * Provide labels for the USB type C ports. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-j293.dts b/arch/arm64/boot/dts/apple/t8103-j293.dts -index 9405e97a85f2..4f5f7d38e799 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j293.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j293.dts -@@ -17,6 +17,10 @@ / { - model = "Apple MacBook Pro (13-inch, M1, 2020)"; - }; - -+&wifi0 { -+ brcm,board-type = "apple,honshu"; -+}; -+ - /* - * Provide labels for the USB type C ports. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-j313.dts b/arch/arm64/boot/dts/apple/t8103-j313.dts -index bc84f8af0b1d..d6722d8809d1 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j313.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j313.dts -@@ -17,6 +17,10 @@ / { - model = "Apple MacBook Air (M1, 2020)"; - }; - -+&wifi0 { -+ brcm,board-type = "apple,shikoku"; -+}; -+ - /* - * Provide labels for the USB type C ports. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-j456.dts b/arch/arm64/boot/dts/apple/t8103-j456.dts -index bb48255250c7..3d0a91ac29ae 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j456.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j456.dts -@@ -21,6 +21,10 @@ aliases { - }; - }; - -+&wifi0 { -+ brcm,board-type = "apple,capri"; -+}; -+ - &i2c0 { - hpm2: usb-pd@3b { - compatible = "apple,cd321x"; -diff --git a/arch/arm64/boot/dts/apple/t8103-j457.dts b/arch/arm64/boot/dts/apple/t8103-j457.dts -index 80600c3fa769..7e3a0e95e837 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j457.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j457.dts -@@ -21,6 +21,10 @@ aliases { - }; - }; - -+&wifi0 { -+ brcm,board-type = "apple,santorini"; -+}; -+ - /* - * Provide labels for the USB type C ports. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -index 020a9d8b31e9..4fb89066bd17 100644 ---- a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -@@ -122,8 +122,10 @@ typec1_usb_hs: endpoint { - &port00 { - bus-range = <1 1>; - wifi0: network@0,0 { -+ compatible = "pci14e4,4425"; - reg = <0x10000 0x0 0x0 0x0 0x0>; - /* To be filled by the loader */ - local-mac-address = [00 00 00 00 00 00]; -+ apple,antenna-sku = "XX"; - }; - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0007-arm64-dts-apple-Add-PCI-power-enable-GPIOs.patch b/target/linux/silicon/patches-5.19/0007-arm64-dts-apple-Add-PCI-power-enable-GPIOs.patch deleted file mode 100644 index d45d6df8c..000000000 --- a/target/linux/silicon/patches-5.19/0007-arm64-dts-apple-Add-PCI-power-enable-GPIOs.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 8d2ddaeace21e3960326fb52a052083b5a1f5e1d Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 6 Feb 2022 21:22:29 +0900 -Subject: [PATCH 007/171] arm64: dts: apple: Add PCI power enable GPIOs - -t8103: -- WLAN (SMC PMU GPIO #13) -t600x: -- WLAN (SMC PMU GPIO #13) -- SD (SMC PMU GPIO #26) - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103-jxxx.dtsi | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -index 4fb89066bd17..e62664b6e450 100644 ---- a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -@@ -121,6 +121,7 @@ typec1_usb_hs: endpoint { - */ - &port00 { - bus-range = <1 1>; -+ pwren-gpios = <&smc_gpio 13 GPIO_ACTIVE_HIGH>; - wifi0: network@0,0 { - compatible = "pci14e4,4425"; - reg = <0x10000 0x0 0x0 0x0 0x0>; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0008-arm64-dts-apple-Add-SMC-node-to-t8103-t6001-devicetr.patch b/target/linux/silicon/patches-5.19/0008-arm64-dts-apple-Add-SMC-node-to-t8103-t6001-devicetr.patch deleted file mode 100644 index 3e45d123a..000000000 --- a/target/linux/silicon/patches-5.19/0008-arm64-dts-apple-Add-SMC-node-to-t8103-t6001-devicetr.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 6728598e7a5a5fb2cb05c65294269b6844b1ea5d Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 4 Feb 2022 12:59:39 +0900 -Subject: [PATCH 008/171] arm64: dts: apple: Add SMC node to t8103/t6001 - devicetrees - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103.dtsi | 26 ++++++++++++++++++++++++++ - 1 file changed, 26 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/apple/t8103.dtsi -index 9750438c30dd..23cc325a49bb 100644 ---- a/arch/arm64/boot/dts/apple/t8103.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103.dtsi -@@ -547,6 +547,32 @@ wdt: watchdog@23d2b0000 { - interrupts = ; - }; - -+ smc_mbox: mbox@23e408000 { -+ compatible = "apple,t8103-asc-mailbox", "apple,asc-mailbox-v4"; -+ reg = <0x2 0x3e408000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ ; -+ interrupt-names = "send-empty", "send-not-empty", -+ "recv-empty", "recv-not-empty"; -+ #mbox-cells = <0>; -+ }; -+ -+ smc: smc@23e400000 { -+ compatible = "apple,t8103-smc", "apple,smc"; -+ reg = <0x2 0x3e400000 0x0 0x4000>, -+ <0x2 0x3fe00000 0x0 0x100000>; -+ reg-names = "smc", "sram"; -+ mboxes = <&smc_mbox>; -+ -+ smc_gpio: gpio { -+ gpio-controller; -+ #gpio-cells = <2>; -+ }; -+ }; -+ - pinctrl_smc: pinctrl@23e820000 { - compatible = "apple,t8103-pinctrl", "apple,pinctrl"; - reg = <0x2 0x3e820000 0x0 0x4000>; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0009-arm64-dts-apple-Add-PMU-NVMEM-and-SMC-RTC-reboot-nod.patch b/target/linux/silicon/patches-5.19/0009-arm64-dts-apple-Add-PMU-NVMEM-and-SMC-RTC-reboot-nod.patch deleted file mode 100644 index c104beacf..000000000 --- a/target/linux/silicon/patches-5.19/0009-arm64-dts-apple-Add-PMU-NVMEM-and-SMC-RTC-reboot-nod.patch +++ /dev/null @@ -1,127 +0,0 @@ -From aee7c563697559e06f306d8a9e1b5a33c5c330d9 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 18:54:35 +0900 -Subject: [PATCH 009/171] arm64: dts: apple: Add PMU NVMEM and SMC RTC/reboot - nodes - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103.dtsi | 88 ++++++++++++++++++++++++++++ - 1 file changed, 88 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/apple/t8103.dtsi -index 23cc325a49bb..c2fb4f32590c 100644 ---- a/arch/arm64/boot/dts/apple/t8103.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103.dtsi -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - - / { - compatible = "apple,t8103", "apple,arm-platform"; -@@ -510,6 +511,81 @@ pcie_pins: pcie-pins { - }; - }; - -+ nub_spmi: spmi@23d0d9300 { -+ compatible = "apple,t8103-spmi", "apple,spmi"; -+ reg = <0x2 0x3d0d9300 0x0 0x100>; -+ #address-cells = <2>; -+ #size-cells = <0>; -+ -+ pmu1: pmu@f { -+ compatible = "apple,sera-pmu", "apple,spmi-pmu"; -+ reg = <0xf SPMI_USID>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ rtc_nvmem@d000 { -+ compatible = "apple,spmi-pmu-nvmem"; -+ reg = <0xd000 0x300>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ pm_setting: pm-setting@1 { -+ reg = <0x1 0x1>; -+ }; -+ -+ rtc_offset: rtc-offset@100 { -+ reg = <0x100 0x6>; -+ }; -+ }; -+ -+ legacy_nvmem@9f00 { -+ compatible = "apple,spmi-pmu-nvmem"; -+ reg = <0x9f00 0x20>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ boot_stage: boot-stage@1 { -+ reg = <0x1 0x1>; -+ }; -+ -+ boot_error_count: boot-error-count@2 { -+ reg = <0x2 0x1>; -+ bits = <0 4>; -+ }; -+ -+ panic_count: panic-count@2 { -+ reg = <0x2 0x1>; -+ bits = <4 4>; -+ }; -+ -+ boot_error_stage: boot-error-stage@3 { -+ reg = <0x3 0x1>; -+ }; -+ -+ shutdown_flag: shutdown-flag@f { -+ reg = <0xf 0x1>; -+ bits = <3 1>; -+ }; -+ }; -+ -+ scrpad_nvmem@a000 { -+ compatible = "apple,spmi-pmu-nvmem"; -+ reg = <0xa000 0x1000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ fault_shadow: fault-shadow@67b { -+ reg = <0x67b 0x10>; -+ }; -+ -+ socd: socd@b00 { -+ reg = <0xb00 0x400>; -+ }; -+ }; -+ -+ }; -+ }; -+ - pinctrl_nub: pinctrl@23d1f0000 { - compatible = "apple,t8103-pinctrl", "apple,pinctrl"; - reg = <0x2 0x3d1f0000 0x0 0x4000>; -@@ -571,6 +647,18 @@ smc_gpio: gpio { - gpio-controller; - #gpio-cells = <2>; - }; -+ -+ smc_rtc: rtc { -+ nvmem-cells = <&rtc_offset>; -+ nvmem-cell-names = "rtc_offset"; -+ }; -+ -+ smc_reboot: reboot { -+ nvmem-cells = <&shutdown_flag>, <&boot_stage>, -+ <&boot_error_count>, <&panic_count>, <&pm_setting>; -+ nvmem-cell-names = "shutdown_flag", "boot_stage", -+ "boot_error_count", "panic_count", "pm_setting"; -+ }; - }; - - pinctrl_smc: pinctrl@23e820000 { --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0010-arm64-dts-apple-Re-parent-ANS2-power-domains.patch b/target/linux/silicon/patches-5.19/0010-arm64-dts-apple-Re-parent-ANS2-power-domains.patch deleted file mode 100644 index 48855df5d..000000000 --- a/target/linux/silicon/patches-5.19/0010-arm64-dts-apple-Re-parent-ANS2-power-domains.patch +++ /dev/null @@ -1,56 +0,0 @@ -From ed05baab200d58bdc024e7797780a1d95677dce3 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Wed, 2 Mar 2022 23:23:51 +0900 -Subject: [PATCH 010/171] arm64: dts: apple: Re-parent ANS2 power domains - -Turns out that the APCIE_ST*_SYS domains do hard-depend on ANS2, so -without this they refuse to power up. - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103-pmgr.dtsi | 7 +------ - arch/arm64/boot/dts/apple/t8103.dtsi | 3 ++- - 2 files changed, 3 insertions(+), 7 deletions(-) - -diff --git a/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi b/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -index fc51bc872468..a6dbb1f485d8 100644 ---- a/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -@@ -725,11 +725,6 @@ ps_ans2: power-controller@3f0 { - #power-domain-cells = <0>; - #reset-cells = <0>; - label = "ans2"; -- /* -- * The ADT makes ps_apcie_st depend on ps_ans2 instead, but this -- * doesn't make much sense since ANS2 uses APCIE_ST. -- */ -- power-domains = <&ps_apcie_st>; - }; - - ps_gfx: power-controller@3f8 { -@@ -836,7 +831,7 @@ ps_apcie_st: power-controller@418 { - #power-domain-cells = <0>; - #reset-cells = <0>; - label = "apcie_st"; -- power-domains = <&ps_apcie>; -+ power-domains = <&ps_apcie>, <&ps_ans2>; - }; - - ps_ane_sys: power-controller@470 { -diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/apple/t8103.dtsi -index c2fb4f32590c..f96a732e6211 100644 ---- a/arch/arm64/boot/dts/apple/t8103.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103.dtsi -@@ -732,7 +732,8 @@ nvme@27bcc0000 { - interrupts = ; - mboxes = <&ans_mbox>; - apple,sart = <&sart>; -- power-domains = <&ps_ans2>; -+ power-domains = <&ps_ans2>, <&ps_apcie_st>; -+ power-domain-names = "ans", "apcie0"; - resets = <&ps_ans2>; - }; - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0011-arm64-dts-apple-Mark-ATC-USB-AON-domains-as-always-o.patch b/target/linux/silicon/patches-5.19/0011-arm64-dts-apple-Mark-ATC-USB-AON-domains-as-always-o.patch deleted file mode 100644 index 7fa12f92f..000000000 --- a/target/linux/silicon/patches-5.19/0011-arm64-dts-apple-Mark-ATC-USB-AON-domains-as-always-o.patch +++ /dev/null @@ -1,39 +0,0 @@ -From b348548945561245a2aea95ef9a9b5afe1efa78c Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 3 Mar 2022 02:20:39 +0900 -Subject: [PATCH 011/171] arm64: dts: apple: Mark ATC USB AON domains as - always-on - -Shutting these down breaks dwc3 init done by the firmware. We probably -never want to do this anyway. It might be possible remove this once -a PHY driver is in place to do the init properly, but it may not be -worth it. - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103-pmgr.dtsi | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi b/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -index a6dbb1f485d8..926b1e54b64b 100644 ---- a/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -@@ -1103,6 +1103,7 @@ ps_atc0_usb_aon: power-controller@88 { - #power-domain-cells = <0>; - #reset-cells = <0>; - label = "atc0_usb_aon"; -+ apple,always-on; /* Needs to stay on for dwc3 to work */ - }; - - ps_atc1_usb_aon: power-controller@90 { -@@ -1111,6 +1112,7 @@ ps_atc1_usb_aon: power-controller@90 { - #power-domain-cells = <0>; - #reset-cells = <0>; - label = "atc1_usb_aon"; -+ apple,always-on; /* Needs to stay on for dwc3 to work */ - }; - - ps_atc0_usb: power-controller@98 { --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0012-arm64-dts-apple-Add-backlight-node-to-j293-j313.patch b/target/linux/silicon/patches-5.19/0012-arm64-dts-apple-Add-backlight-node-to-j293-j313.patch deleted file mode 100644 index 4408019ff..000000000 --- a/target/linux/silicon/patches-5.19/0012-arm64-dts-apple-Add-backlight-node-to-j293-j313.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 470d9385f7c772c4cb88e0fdfa3484baba9d15c9 Mon Sep 17 00:00:00 2001 -From: Thomas Glanzmann -Date: Mon, 21 Feb 2022 23:01:36 +0100 -Subject: [PATCH 012/171] arm64: dts: apple: Add backlight node to j293/j313 - -It can be turned off with: - -echo 1 > /sys/class/backlight/backlight/bl_power - -It can be turned on with: - -echo 0 > /sys/class/backlight/backlight/bl_power - -Needs CONFIG_BACKLIGHT_GPIO=m. - -Signed-off-by: Thomas Glanzmann ---- - arch/arm64/boot/dts/apple/t8103-j293.dts | 12 ++++++++++++ - arch/arm64/boot/dts/apple/t8103-j313.dts | 12 ++++++++++++ - 2 files changed, 24 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103-j293.dts b/arch/arm64/boot/dts/apple/t8103-j293.dts -index 4f5f7d38e799..6f1050185a80 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j293.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j293.dts -@@ -75,3 +75,15 @@ &i2c2 { - &i2c4 { - status = "okay"; - }; -+ -+/ { -+ backlight: gpio-bl { -+ compatible = "gpio-backlight"; -+ gpios = <&smc_gpio 18 GPIO_ACTIVE_HIGH>; -+ default-on; -+ }; -+}; -+ -+&framebuffer0 { -+ backlight = <&backlight>; -+}; -diff --git a/arch/arm64/boot/dts/apple/t8103-j313.dts b/arch/arm64/boot/dts/apple/t8103-j313.dts -index d6722d8809d1..3e4045c05905 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j313.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j313.dts -@@ -67,3 +67,15 @@ &pcie0_dart_2 { - - /delete-node/ &port01; - /delete-node/ &port02; -+ -+/ { -+ backlight: gpio-bl { -+ compatible = "gpio-backlight"; -+ gpios = <&smc_gpio 18 GPIO_ACTIVE_HIGH>; -+ default-on; -+ }; -+}; -+ -+&framebuffer0 { -+ backlight = <&backlight>; -+}; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0013-arm64-dts-apple-t8103-Put-in-audio-nodes.patch b/target/linux/silicon/patches-5.19/0013-arm64-dts-apple-t8103-Put-in-audio-nodes.patch deleted file mode 100644 index c8a0e4a1c..000000000 --- a/target/linux/silicon/patches-5.19/0013-arm64-dts-apple-t8103-Put-in-audio-nodes.patch +++ /dev/null @@ -1,438 +0,0 @@ -From 3af244a2705f3894814a305428501a614c26fb7a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Sat, 19 Feb 2022 09:49:59 +0100 -Subject: [PATCH 013/171] arm64: dts: apple: t8103*: Put in audio nodes -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Martin Povišer ---- - arch/arm64/boot/dts/apple/t8103-j274.dts | 52 +++++++++++++++ - arch/arm64/boot/dts/apple/t8103-j293.dts | 85 ++++++++++++++++++++++++ - arch/arm64/boot/dts/apple/t8103-j313.dts | 61 +++++++++++++++++ - arch/arm64/boot/dts/apple/t8103-j456.dts | 31 +++++++++ - arch/arm64/boot/dts/apple/t8103-j457.dts | 40 +++++++++++ - arch/arm64/boot/dts/apple/t8103.dtsi | 73 ++++++++++++++++++++ - 6 files changed, 342 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103-j274.dts b/arch/arm64/boot/dts/apple/t8103-j274.dts -index aaa3019a4db2..811008bd73f3 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j274.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j274.dts -@@ -56,6 +56,58 @@ ethernet0: ethernet@0,0 { - }; - }; - -+&i2c1 { -+ speaker_amp: codec@31 { -+ compatible = "ti,tas5770l", "ti,tas2770"; -+ reg = <0x31>; -+ shutdown-gpios = <&pinctrl_ap 181 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ }; -+}; -+ - &i2c2 { - status = "okay"; -+ -+ jack_codec: codec@48 { -+ compatible = "cirrus,cs42l83", "cirrus,cs42l42"; -+ reg = <0x48>; -+ reset-gpios = <&pinctrl_nub 11 GPIO_ACTIVE_HIGH>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <183 IRQ_TYPE_LEVEL_LOW>; -+ #sound-dai-cells = <0>; -+ cirrus,ts-inv = <1>; -+ sound-name-prefix = "Jack"; -+ }; -+}; -+ -+/ { -+ sound { -+ compatible = "apple,j274-macaudio", "apple,macaudio"; -+ model = "Mac mini J274 integrated audio"; -+ -+ dai-link@0 { -+ link-name = "Speaker"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 0>; -+ }; -+ codec { -+ sound-dai = <&speaker_amp>; -+ }; -+ }; -+ -+ dai-link@1 { -+ link-name = "Headphone Jack"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 2>; -+ }; -+ codec { -+ sound-dai = <&jack_codec>; -+ }; -+ }; -+ -+ }; - }; -diff --git a/arch/arm64/boot/dts/apple/t8103-j293.dts b/arch/arm64/boot/dts/apple/t8103-j293.dts -index 6f1050185a80..7eb98e6b947c 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j293.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j293.dts -@@ -68,8 +68,54 @@ &pcie0_dart_2 { - /delete-node/ &port01; - /delete-node/ &port02; - -+&i2c1 { -+ speaker_left_rear: codec@31 { -+ compatible = "ti,tas5770l", "ti,tas2770"; -+ reg = <0x31>; -+ shutdown-gpios = <&pinctrl_ap 181 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Left Rear"; -+ }; -+ -+ speaker_left_front: codec@32 { -+ compatible = "ti,tas5770l", "ti,tas2770"; -+ reg = <0x32>; -+ shutdown-gpios = <&pinctrl_ap 181 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Left Front"; -+ }; -+}; -+ - &i2c2 { - status = "okay"; -+ -+ jack_codec: codec@48 { -+ compatible = "cirrus,cs42l83", "cirrus,cs42l42"; -+ reg = <0x48>; -+ reset-gpios = <&pinctrl_nub 11 GPIO_ACTIVE_HIGH>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <183 IRQ_TYPE_LEVEL_LOW>; -+ #sound-dai-cells = <0>; -+ cirrus,ts-inv = <1>; -+ }; -+}; -+ -+&i2c3 { -+ speaker_right_rear: codec@34 { -+ compatible = "ti,tas5770l", "ti,tas2770"; -+ reg = <0x34>; -+ shutdown-gpios = <&pinctrl_ap 181 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Right Rear"; -+ }; -+ -+ speaker_right_front: codec@35 { -+ compatible = "ti,tas5770l", "ti,tas2770"; -+ reg = <0x35>; -+ shutdown-gpios = <&pinctrl_ap 181 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Right Front"; -+ }; - }; - - &i2c4 { -@@ -82,6 +128,45 @@ backlight: gpio-bl { - gpios = <&smc_gpio 18 GPIO_ACTIVE_HIGH>; - default-on; - }; -+ -+ sound { -+ compatible = "apple,j293-macaudio", "apple,macaudio"; -+ model = "MacBook Pro J293 integrated audio"; -+ -+ dai-link@0 { -+ /* -+ * DANGER ZONE: You can blow your speakers! -+ * -+ * The drivers are not ready, and unless you are careful -+ * to attenuate the audio stream, you run the risk of -+ * blowing your speakers. -+ */ -+ status = "disabled"; -+ -+ link-name = "Speakers"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 0>, <&mca 1>; -+ }; -+ codec { -+ sound-dai = <&speaker_left_front>, <&speaker_right_front>, -+ <&speaker_left_rear>, <&speaker_right_rear>; -+ }; -+ }; -+ -+ dai-link@1 { -+ link-name = "Headphone Jack"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 2>; -+ }; -+ codec { -+ sound-dai = <&jack_codec>; -+ }; -+ }; -+ }; - }; - - &framebuffer0 { -diff --git a/arch/arm64/boot/dts/apple/t8103-j313.dts b/arch/arm64/boot/dts/apple/t8103-j313.dts -index 3e4045c05905..ad3a6edeb651 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j313.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j313.dts -@@ -68,12 +68,73 @@ &pcie0_dart_2 { - /delete-node/ &port01; - /delete-node/ &port02; - -+&i2c1 { -+ speaker_left: codec@31 { -+ compatible = "ti,tas5770l", "ti,tas2770"; -+ reg = <0x31>; -+ shutdown-gpios = <&pinctrl_ap 181 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Left"; -+ -+ }; -+}; -+ -+&i2c3 { -+ speaker_right: codec@34 { -+ compatible = "ti,tas5770l", "ti,tas2770"; -+ reg = <0x34>; -+ shutdown-gpios = <&pinctrl_ap 181 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Right"; -+ }; -+ -+ jack_codec: codec@48 { -+ compatible = "cirrus,cs42l83", "cirrus,cs42l42"; -+ reg = <0x48>; -+ reset-gpios = <&pinctrl_nub 11 GPIO_ACTIVE_HIGH>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <183 IRQ_TYPE_LEVEL_LOW>; -+ #sound-dai-cells = <0>; -+ cirrus,ts-inv = <1>; -+ sound-name-prefix = "Jack"; -+ }; -+}; -+ - / { - backlight: gpio-bl { - compatible = "gpio-backlight"; - gpios = <&smc_gpio 18 GPIO_ACTIVE_HIGH>; - default-on; - }; -+ -+ sound { -+ compatible = "apple,j313-macaudio", "apple,macaudio"; -+ model = "MacBook Air J313 integrated audio"; -+ -+ dai-link@0 { -+ link-name = "Speakers"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 0>, <&mca 1>; -+ }; -+ codec { -+ sound-dai = <&speaker_left>, <&speaker_right>; -+ }; -+ }; -+ -+ dai-link@1 { -+ link-name = "Headphone Jack"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 2>; -+ }; -+ codec { -+ sound-dai = <&jack_codec>; -+ }; -+ }; -+ }; - }; - - &framebuffer0 { -diff --git a/arch/arm64/boot/dts/apple/t8103-j456.dts b/arch/arm64/boot/dts/apple/t8103-j456.dts -index 3d0a91ac29ae..e65053f3bd2c 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j456.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j456.dts -@@ -73,3 +73,34 @@ ethernet0: ethernet@0,0 { - local-mac-address = [00 10 18 00 00 00]; - }; - }; -+ -+&i2c1 { -+ jack_codec: codec@48 { -+ compatible = "cirrus,cs42l83", "cirrus,cs42l42"; -+ reg = <0x48>; -+ reset-gpios = <&pinctrl_nub 11 GPIO_ACTIVE_HIGH>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <183 IRQ_TYPE_LEVEL_LOW>; -+ #sound-dai-cells = <0>; -+ cirrus,ts-inv = <1>; -+ }; -+}; -+ -+/ { -+ sound { -+ compatible = "apple,j456-macaudio", "apple,macaudio"; -+ model = "iMac J456 integrated audio"; -+ -+ dai-link@0 { -+ link-name = "Headphone Jack"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 2>; -+ }; -+ codec { -+ sound-dai = <&jack_codec>; -+ }; -+ }; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t8103-j457.dts b/arch/arm64/boot/dts/apple/t8103-j457.dts -index 7e3a0e95e837..925fe4058055 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j457.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j457.dts -@@ -61,3 +61,43 @@ &pcie0_dart_1 { - }; - - /delete-node/ &port01; -+ -+&i2c1 { -+ jack_codec: codec@48 { -+ compatible = "cirrus,cs42l83", "cirrus,cs42l42"; -+ reg = <0x48>; -+ reset-gpios = <&pinctrl_nub 11 GPIO_ACTIVE_HIGH>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <183 IRQ_TYPE_LEVEL_LOW>; -+ #sound-dai-cells = <0>; -+ cirrus,ts-inv = <1>; -+ }; -+}; -+ -+/ { -+ sound { -+ compatible = "simple-audio-card"; -+ simple-audio-card,name = "iMac integrated audio"; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ -+ simple-audio-card,dai-link@0 { -+ bitclock-inversion; -+ frame-inversion; -+ reg = <0>; -+ format = "i2s"; -+ mclk-fs = <64>; -+ tdm-slot-width = <32>; -+ -+ link0_cpu: cpu { -+ sound-dai = <&mca 2>; -+ bitclock-master; -+ frame-master; -+ }; -+ -+ link0_codec: codec { -+ sound-dai = <&jack_codec>; -+ }; -+ }; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/apple/t8103.dtsi -index f96a732e6211..afb0688cb1c2 100644 ---- a/arch/arm64/boot/dts/apple/t8103.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103.dtsi -@@ -917,6 +917,79 @@ port02: pci@2,0 { - <0 0 0 4 &port02 0 0 0 3>; - }; - }; -+ -+ dart_sio: iommu@235004000 { -+ compatible = "apple,t8103-dart", "apple,dart"; -+ reg = <0x2 0x35004000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_sio_cpu>; -+ }; -+ -+ nco_inp: clock-ref { -+ compatible = "fixed-factor-clock"; -+ clocks = <&clkref>; -+ #clock-cells = <0>; -+ clock-mult = <75>; -+ clock-div = <2>; // 24 MHz * (75/2) = 900 MHz -+ clock-output-names = "nco_inp"; -+ }; -+ -+ nco: nco@23b044000 { -+ compatible = "apple,t8103-nco", "apple,nco"; -+ reg = <0x2 0x3b044000 0x0 0x14000>; -+ clocks = <&nco_inp>; -+ #clock-cells = <1>; -+ apple,nchannels = <5>; -+ }; -+ -+ admac: dma-controller@238200000 { -+ compatible = "apple,t8103-admac", "apple,admac"; -+ reg = <0x2 0x38200000 0x0 0x34000>; -+ dma-channels = <24>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #dma-cells = <1>; -+ iommus = <&dart_sio 2>; -+ power-domains = <&ps_sio_adma>; -+ apple,internal-irq-destination = <1>; -+ }; -+ -+ mca: mca@38400000 { -+ compatible = "apple,t8103-mca", "apple,mca"; -+ reg = <0x2 0x38400000 0x0 0x18000>, -+ <0x2 0x38300000 0x0 0x30000>; -+ reg-names = "clusters", "switch"; -+ -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ , -+ , -+ ; -+ -+ clocks = <&nco 0>, <&nco 1>, <&nco 2>, -+ <&nco 3>, <&nco 4>, <&nco 4>; -+ power-domains = <&ps_audio_p>, <&ps_mca0>, <&ps_mca1>, -+ <&ps_mca2>, <&ps_mca3>, <&ps_mca4>, <&ps_mca5>; -+ dmas = <&admac 0>, <&admac 1>, <&admac 2>, <&admac 3>, -+ <&admac 4>, <&admac 5>, <&admac 6>, <&admac 7>, -+ <&admac 8>, <&admac 9>, <&admac 10>, <&admac 11>, -+ <&admac 12>, <&admac 13>, <&admac 14>, <&admac 15>, -+ <&admac 16>, <&admac 17>, <&admac 18>, <&admac 19>, -+ <&admac 20>, <&admac 21>, <&admac 22>, <&admac 23>; -+ dma-names = "tx0a", "rx0a", "tx0b", "rx0b", -+ "tx1a", "rx1a", "tx1b", "rx1b", -+ "tx2a", "rx2a", "tx2b", "rx2b", -+ "tx3a", "rx3a", "tx3b", "rx3b", -+ "tx4a", "rx4a", "tx4b", "rx4b", -+ "tx5a", "rx5a", "tx5b", "rx5b"; -+ -+ #sound-dai-cells = <1>; -+ apple,nclusters = <6>; -+ }; - }; - }; - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0014-arm64-dts-apple-t8103-j313-Also-disable-speakers.patch b/target/linux/silicon/patches-5.19/0014-arm64-dts-apple-t8103-j313-Also-disable-speakers.patch deleted file mode 100644 index 6c86d6bf4..000000000 --- a/target/linux/silicon/patches-5.19/0014-arm64-dts-apple-t8103-j313-Also-disable-speakers.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 461322f8b15d66dc8860c4f940c3f8f4f36bb3a3 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sat, 12 Mar 2022 21:00:22 +0900 -Subject: [PATCH 014/171] arm64: dts: apple: t8103-j313: Also disable speakers - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103-j313.dts | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103-j313.dts b/arch/arm64/boot/dts/apple/t8103-j313.dts -index ad3a6edeb651..d1f65e48699f 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j313.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j313.dts -@@ -112,6 +112,15 @@ sound { - model = "MacBook Air J313 integrated audio"; - - dai-link@0 { -+ /* -+ * DANGER ZONE: You can blow your speakers! -+ * -+ * The drivers are not ready, and unless you are careful -+ * to attenuate the audio stream, you run the risk of -+ * blowing your speakers. -+ */ -+ status = "disabled"; -+ - link-name = "Speakers"; - mclk-fs = <64>; - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0015-arm64-dts-apple-Keep-PCIe-power-domain-on.patch b/target/linux/silicon/patches-5.19/0015-arm64-dts-apple-Keep-PCIe-power-domain-on.patch deleted file mode 100644 index e8fd03aca..000000000 --- a/target/linux/silicon/patches-5.19/0015-arm64-dts-apple-Keep-PCIe-power-domain-on.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 79b1406346a1f0bdf8bd326a005e288511ebfaf6 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 17 Mar 2022 23:49:07 +0900 -Subject: [PATCH 015/171] arm64: dts: apple: Keep PCIe power domain on - -This causes flakiness if shut down; don't do it until we find out -what's going on. - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103-pmgr.dtsi | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi b/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -index 926b1e54b64b..68ae594bf5e9 100644 ---- a/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -@@ -717,6 +717,7 @@ ps_apcie_gp: power-controller@3e8 { - #reset-cells = <0>; - label = "apcie_gp"; - power-domains = <&ps_apcie>; -+ apple,always-on; /* Breaks things if shut down */ - }; - - ps_ans2: power-controller@3f0 { --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0016-arm64-dts-apple-Add-initial-t6000-t6001-t6002-DTs.patch b/target/linux/silicon/patches-5.19/0016-arm64-dts-apple-Add-initial-t6000-t6001-t6002-DTs.patch deleted file mode 100644 index 9f9b8a41e..000000000 --- a/target/linux/silicon/patches-5.19/0016-arm64-dts-apple-Add-initial-t6000-t6001-t6002-DTs.patch +++ /dev/null @@ -1,3024 +0,0 @@ -From 8fb4c09b034f66e7ba1e3c1b16dfb2e3854af312 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Wed, 10 Nov 2021 19:07:41 +0900 -Subject: [PATCH 016/171] arm64: dts: apple: Add initial t6000/t6001/t6002 DTs - -t6002 is two die version of t6001. Devices on the second die are at a -consistent offset compared to the first die. Use "ranges" properties -to translate the MMIO addresses. To avoid duplication all devices are -separate *.dtsi. C preprocessor macros are used to assign unique node -names and labels. -Devices are split into devices present on die 0, devices present on all -dies and NVMe. -It's unclear if devices on die 1 are fused out or just not used on the -single machine with t6002. - -The M1 Ultra SoC consists of two M1 Max dies. The multi die device -nodes are distributed to include files based on whether they are used -on both dies or just the primary die on the Mac Studio M1 Ultra. -The NVMe is a noteable exception since it is only on the second die. -It seems to be a special case since its interrupt is routed as it were -on die 0. - -t6000 is a cut-down version of t6001, so the former just includes the -latter and disables the missing bits (This is currently just one PMGR -node and all of its domains. - -Signed-off-by: Hector Martin -Co-developed-by: Janne Grunau -Signed-off-by: Janne Grunau ---- - arch/arm64/boot/dts/apple/multi-die-cpp.h | 19 + - arch/arm64/boot/dts/apple/t6000.dtsi | 18 + - arch/arm64/boot/dts/apple/t6001.dtsi | 63 + - arch/arm64/boot/dts/apple/t6002.dtsi | 180 ++ - arch/arm64/boot/dts/apple/t600x-common.dtsi | 128 ++ - arch/arm64/boot/dts/apple/t600x-die0.dtsi | 298 +++ - arch/arm64/boot/dts/apple/t600x-dieX.dtsi | 103 + - .../arm64/boot/dts/apple/t600x-gpio-pins.dtsi | 45 + - arch/arm64/boot/dts/apple/t600x-nvme.dtsi | 42 + - arch/arm64/boot/dts/apple/t600x-pmgr.dtsi | 2013 +++++++++++++++++ - 10 files changed, 2909 insertions(+) - create mode 100644 arch/arm64/boot/dts/apple/multi-die-cpp.h - create mode 100644 arch/arm64/boot/dts/apple/t6000.dtsi - create mode 100644 arch/arm64/boot/dts/apple/t6001.dtsi - create mode 100644 arch/arm64/boot/dts/apple/t6002.dtsi - create mode 100644 arch/arm64/boot/dts/apple/t600x-common.dtsi - create mode 100644 arch/arm64/boot/dts/apple/t600x-die0.dtsi - create mode 100644 arch/arm64/boot/dts/apple/t600x-dieX.dtsi - create mode 100644 arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi - create mode 100644 arch/arm64/boot/dts/apple/t600x-nvme.dtsi - create mode 100644 arch/arm64/boot/dts/apple/t600x-pmgr.dtsi - -diff --git a/arch/arm64/boot/dts/apple/multi-die-cpp.h b/arch/arm64/boot/dts/apple/multi-die-cpp.h -new file mode 100644 -index 000000000000..19b565bb6e0e ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/multi-die-cpp.h -@@ -0,0 +1,19 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * C preprocessor macros for t600x multi die support. -+ */ -+ -+#ifndef __DTS_APPLE_MULTI_DIE_CPP_H -+#define __DTS_APPLE_MULTI_DIE_CPP_H -+ -+/* copied include/linux/stringify.h */ -+#define __stringify_1(x...) #x -+#define __stringify(x...) __stringify_1(x) -+ -+#define __concat_1(x, y...) x ## y -+#define __concat(x, y...) __concat_1(x, y) -+ -+#define DIE_NODE(a) __concat(a, DIE) -+#define DIE_LABEL(a) __stringify(__concat(a, DIE)) -+ -+#endif /* !__LINUX_STRINGIFY_H */ -diff --git a/arch/arm64/boot/dts/apple/t6000.dtsi b/arch/arm64/boot/dts/apple/t6000.dtsi -new file mode 100644 -index 000000000000..89c3b211b116 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t6000.dtsi -@@ -0,0 +1,18 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Apple T6000 "M1 Pro" SoC -+ * -+ * Other names: H13J, "Jade Chop" -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/* This chip is just a cut down version of t6001, so include it and disable the missing parts */ -+ -+#include "t6001.dtsi" -+ -+/ { -+ compatible = "apple,t6000", "apple,arm-platform"; -+}; -+ -+/delete-node/ &pmgr_south; -diff --git a/arch/arm64/boot/dts/apple/t6001.dtsi b/arch/arm64/boot/dts/apple/t6001.dtsi -new file mode 100644 -index 000000000000..620b17e4031f ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t6001.dtsi -@@ -0,0 +1,63 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Apple T6001 "M1 Max" SoC -+ * -+ * Other names: H13J, "Jade" -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include "multi-die-cpp.h" -+ -+#include "t600x-common.dtsi" -+ -+/ { -+ compatible = "apple,t6001", "apple,arm-platform"; -+ -+ soc { -+ compatible = "simple-bus"; -+ #address-cells = <2>; -+ #size-cells = <2>; -+ -+ ranges; -+ nonposted-mmio; -+ -+ // filled via templated includes at the end of the file -+ }; -+}; -+ -+#define DIE -+#define DIE_NO 0 -+ -+&{/soc} { -+ #include "t600x-die0.dtsi" -+ #include "t600x-dieX.dtsi" -+ #include "t600x-nvme.dtsi" -+}; -+ -+#include "t600x-gpio-pins.dtsi" -+#include "t600x-pmgr.dtsi" -+ -+#undef DIE -+#undef DIE_NO -+ -+ -+&aic { -+ affinities { -+ e-core-pmu-affinity { -+ apple,fiq-index = ; -+ cpus = <&cpu_e00 &cpu_e01>; -+ }; -+ -+ p-core-pmu-affinity { -+ apple,fiq-index = ; -+ cpus = <&cpu_p00 &cpu_p01 &cpu_p02 &cpu_p03 -+ &cpu_p10 &cpu_p11 &cpu_p12 &cpu_p13>; -+ }; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6002.dtsi b/arch/arm64/boot/dts/apple/t6002.dtsi -new file mode 100644 -index 000000000000..736f16aad70f ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t6002.dtsi -@@ -0,0 +1,180 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Apple T6002 "M1 Ultra" SoC -+ * -+ * Other names: H13J, "Jade 2C" -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include "multi-die-cpp.h" -+ -+#include "t600x-common.dtsi" -+ -+/ { -+ compatible = "apple,t6002", "apple,arm-platform"; -+ -+ #address-cells = <2>; -+ #size-cells = <2>; -+ -+ cpus { -+ cpu_e10: cpu@800 { -+ compatible = "apple,icestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x800>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_e11: cpu@801 { -+ compatible = "apple,icestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x801>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p20: cpu@10900 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10900>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p21: cpu@10901 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10901>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p22: cpu@10902 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10902>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p23: cpu@10903 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10903>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p30: cpu@10a00 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10a00>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p31: cpu@10a01 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10a01>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p32: cpu@10a02 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10a02>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p33: cpu@10a03 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10a03>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ }; -+ -+ soc { -+ compatible = "simple-bus"; -+ #address-cells = <2>; -+ #size-cells = <2>; -+ -+ ranges; -+ nonposted-mmio; -+ -+ die0 { -+ compatible = "simple-bus"; -+ #address-cells = <2>; -+ #size-cells = <2>; -+ ranges; -+ nonposted-mmio; -+ -+ // filled via templated includes at the end of the file -+ }; -+ -+ die1 { -+ compatible = "simple-bus"; -+ #address-cells = <2>; -+ #size-cells = <2>; -+ ranges = <0x2 0x0 0x22 0x0 0x4 0x0>, -+ <0x7 0x0 0x27 0x0 0xf 0x80000000>; -+ nonposted-mmio; -+ -+ // filled via templated includes at the end of the file -+ }; -+ }; -+}; -+ -+#define DIE -+#define DIE_NO 0 -+ -+&{/soc/die0} { -+ #include "t600x-die0.dtsi" -+ #include "t600x-dieX.dtsi" -+}; -+ -+#include "t600x-pmgr.dtsi" -+#include "t600x-gpio-pins.dtsi" -+ -+#undef DIE -+#undef DIE_NO -+ -+#define DIE _die1 -+#define DIE_NO 1 -+ -+&{/soc/die1} { -+ #include "t600x-dieX.dtsi" -+ #include "t600x-nvme.dtsi" -+}; -+ -+#include "t600x-pmgr.dtsi" -+ -+#undef DIE -+#undef DIE_NO -+ -+ -+&aic { -+ affinities { -+ e-core-pmu-affinity { -+ cpus = <&cpu_e00 &cpu_e01 -+ &cpu_e10 &cpu_e11>; -+ }; -+ -+ p-core-pmu-affinity { -+ cpus = <&cpu_p00 &cpu_p01 &cpu_p02 &cpu_p03 -+ &cpu_p10 &cpu_p11 &cpu_p12 &cpu_p13 -+ &cpu_p20 &cpu_p21 &cpu_p22 &cpu_p23 -+ &cpu_p30 &cpu_p31 &cpu_p32 &cpu_p33>; -+ }; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t600x-common.dtsi b/arch/arm64/boot/dts/apple/t600x-common.dtsi -new file mode 100644 -index 000000000000..e29b88e2c853 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t600x-common.dtsi -@@ -0,0 +1,128 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Common Apple T6000 / T6001 / T6002 "M1 Pro/Max/Ultra" SoC -+ * -+ * Other names: H13J, "Jade Chop", "Jade", "Jade 2C" -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/ { -+ #address-cells = <2>; -+ #size-cells = <2>; -+ -+ cpus { -+ #address-cells = <2>; -+ #size-cells = <0>; -+ -+ cpu_e00: cpu@0 { -+ compatible = "apple,icestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x0>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_e01: cpu@1 { -+ compatible = "apple,icestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x1>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p00: cpu@10100 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10100>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p01: cpu@10101 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10101>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p02: cpu@10102 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10102>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p03: cpu@10103 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10103>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p10: cpu@10200 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10200>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p11: cpu@10201 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10201>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p12: cpu@10202 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10202>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ -+ cpu_p13: cpu@10203 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10203>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ }; -+ }; -+ -+ pmu-e { -+ compatible = "apple,icestorm-pmu"; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ }; -+ -+ pmu-p { -+ compatible = "apple,firestorm-pmu"; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ }; -+ -+ timer { -+ compatible = "arm,armv8-timer"; -+ interrupt-parent = <&aic>; -+ interrupt-names = "phys", "virt", "hyp-phys", "hyp-virt"; -+ interrupts = , -+ , -+ , -+ ; -+ }; -+ -+ clkref: clock-ref { -+ compatible = "fixed-clock"; -+ #clock-cells = <0>; -+ clock-frequency = <24000000>; -+ clock-output-names = "clkref"; -+ }; -+ -+}; -diff --git a/arch/arm64/boot/dts/apple/t600x-die0.dtsi b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -new file mode 100644 -index 000000000000..8131352e3ccd ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -@@ -0,0 +1,298 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Devices used on die 0 on the Apple T6002 "M1 Ultra" SoC and present on -+ * Apple T6000 / T6001 "M1 Pro" / "M1 Max". -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+ -+ aic: interrupt-controller@28e100000 { -+ compatible = "apple,t6000-aic", "apple,aic2"; -+ #interrupt-cells = <4>; -+ interrupt-controller; -+ reg = <0x2 0x8e100000 0x0 0xc000>, -+ <0x2 0x8e10c000 0x0 0x4>; -+ reg-names = "core", "event"; -+ power-domains = <&ps_aic>; -+ }; -+ -+ pinctrl_smc: pinctrl@290820000 { -+ compatible = "apple,t6000-pinctrl", "apple,pinctrl"; -+ reg = <0x2 0x90820000 0x0 0x4000>; -+ -+ gpio-controller; -+ #gpio-cells = <2>; -+ gpio-ranges = <&pinctrl_smc 0 0 30>; -+ apple,npins = <30>; -+ -+ interrupt-controller; -+ #interrupt-cells = <2>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ , -+ , -+ , -+ ; -+ }; -+ -+ wdt: watchdog@2922b0000 { -+ compatible = "apple,t6000-wdt", "apple,wdt"; -+ reg = <0x2 0x922b0000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ }; -+ -+ i2c0: i2c@39b040000 { -+ compatible = "apple,t6000-i2c", "apple,i2c"; -+ reg = <0x3 0x9b040000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c0_pins>; -+ pinctrl-names = "default"; -+ power-domains = <&ps_i2c0>; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ }; -+ -+ i2c1: i2c@39b044000 { -+ compatible = "apple,t6000-i2c", "apple,i2c"; -+ reg = <0x3 0x9b044000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c1_pins>; -+ pinctrl-names = "default"; -+ power-domains = <&ps_i2c1>; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ status = "disabled"; -+ }; -+ -+ i2c2: i2c@39b048000 { -+ compatible = "apple,t6000-i2c", "apple,i2c"; -+ reg = <0x3 0x9b048000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c2_pins>; -+ pinctrl-names = "default"; -+ power-domains = <&ps_i2c2>; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ status = "disabled"; -+ }; -+ -+ i2c3: i2c@39b04c000 { -+ compatible = "apple,t6000-i2c", "apple,i2c"; -+ reg = <0x3 0x9b04c000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c3_pins>; -+ pinctrl-names = "default"; -+ power-domains = <&ps_i2c3>; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ status = "disabled"; -+ }; -+ -+ i2c4: i2c@39b050000 { -+ compatible = "apple,t6000-i2c", "apple,i2c"; -+ reg = <0x3 0x9b050000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c4_pins>; -+ pinctrl-names = "default"; -+ power-domains = <&ps_i2c4>; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ status = "disabled"; -+ }; -+ -+ i2c5: i2c@39b054000 { -+ compatible = "apple,t6000-i2c", "apple,i2c"; -+ reg = <0x3 0x9b054000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c5_pins>; -+ pinctrl-names = "default"; -+ power-domains = <&ps_i2c5>; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ status = "disabled"; -+ }; -+ -+ serial0: serial@39b200000 { -+ compatible = "apple,s5l-uart"; -+ reg = <0x3 0x9b200000 0x0 0x1000>; -+ reg-io-width = <4>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ /* -+ * TODO: figure out the clocking properly, there may -+ * be a third selectable clock. -+ */ -+ clocks = <&clkref>, <&clkref>; -+ clock-names = "uart", "clk_uart_baud0"; -+ power-domains = <&ps_uart0>; -+ status = "disabled"; -+ }; -+ -+ pcie0_dart_0: dart@581008000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0x5 0x81008000 0x0 0x4000>; -+ #iommu-cells = <1>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&ps_apcie_gp_sys>; -+ }; -+ -+ pcie0_dart_1: dart@582008000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0x5 0x82008000 0x0 0x4000>; -+ #iommu-cells = <1>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&ps_apcie_gp_sys>; -+ }; -+ -+ pcie0_dart_2: dart@583008000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0x5 0x83008000 0x0 0x4000>; -+ #iommu-cells = <1>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&ps_apcie_gp_sys>; -+ }; -+ -+ pcie0_dart_3: dart@584008000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0x5 0x84008000 0x0 0x4000>; -+ #iommu-cells = <1>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&ps_apcie_gp_sys>; -+ }; -+ -+ pcie0: pcie@590000000 { -+ compatible = "apple,t6000-pcie", "apple,pcie"; -+ device_type = "pci"; -+ -+ reg = <0x5 0x90000000 0x0 0x1000000>, -+ <0x5 0x80000000 0x0 0x100000>, -+ <0x5 0x81000000 0x0 0x4000>, -+ <0x5 0x82000000 0x0 0x4000>, -+ <0x5 0x83000000 0x0 0x4000>, -+ <0x5 0x84000000 0x0 0x4000>; -+ reg-names = "config", "rc", "port0", "port1", "port2", "port3"; -+ -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ ; -+ -+ msi-controller; -+ msi-parent = <&pcie0>; -+ msi-ranges = <&aic AIC_IRQ 0 1581 IRQ_TYPE_EDGE_RISING 32>; -+ -+ -+ iommu-map = <0x100 &pcie0_dart_0 1 1>, -+ <0x200 &pcie0_dart_1 1 1>, -+ <0x300 &pcie0_dart_2 1 1>, -+ <0x400 &pcie0_dart_3 1 1>; -+ iommu-map-mask = <0xff00>; -+ -+ bus-range = <0 4>; -+ #address-cells = <3>; -+ #size-cells = <2>; -+ ranges = <0x43000000 0x5 0xa0000000 0x5 0xa0000000 0x0 0x20000000>, -+ <0x02000000 0x0 0xc0000000 0x5 0xc0000000 0x0 0x40000000>; -+ -+ power-domains = <&ps_apcie_gp_sys>; -+ pinctrl-0 = <&pcie_pins>; -+ pinctrl-names = "default"; -+ -+ port00: pci@0,0 { -+ device_type = "pci"; -+ reg = <0x0 0x0 0x0 0x0 0x0>; -+ reset-gpios = <&pinctrl_ap 4 GPIO_ACTIVE_LOW>; -+ -+ #address-cells = <3>; -+ #size-cells = <2>; -+ ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port00 0 0 0 0>, -+ <0 0 0 2 &port00 0 0 0 1>, -+ <0 0 0 3 &port00 0 0 0 2>, -+ <0 0 0 4 &port00 0 0 0 3>; -+ }; -+ -+ port01: pci@1,0 { -+ device_type = "pci"; -+ reg = <0x800 0x0 0x0 0x0 0x0>; -+ reset-gpios = <&pinctrl_ap 5 GPIO_ACTIVE_LOW>; -+ -+ #address-cells = <3>; -+ #size-cells = <2>; -+ ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port01 0 0 0 0>, -+ <0 0 0 2 &port01 0 0 0 1>, -+ <0 0 0 3 &port01 0 0 0 2>, -+ <0 0 0 4 &port01 0 0 0 3>; -+ }; -+ -+ port02: pci@2,0 { -+ device_type = "pci"; -+ reg = <0x1000 0x0 0x0 0x0 0x0>; -+ reset-gpios = <&pinctrl_ap 6 GPIO_ACTIVE_LOW>; -+ -+ #address-cells = <3>; -+ #size-cells = <2>; -+ ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port02 0 0 0 0>, -+ <0 0 0 2 &port02 0 0 0 1>, -+ <0 0 0 3 &port02 0 0 0 2>, -+ <0 0 0 4 &port02 0 0 0 3>; -+ }; -+ -+ port03: pci@3,0 { -+ device_type = "pci"; -+ reg = <0x1800 0x0 0x0 0x0 0x0>; -+ reset-gpios = <&pinctrl_ap 7 GPIO_ACTIVE_LOW>; -+ -+ #address-cells = <3>; -+ #size-cells = <2>; -+ ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port03 0 0 0 0>, -+ <0 0 0 2 &port03 0 0 0 1>, -+ <0 0 0 3 &port03 0 0 0 2>, -+ <0 0 0 4 &port03 0 0 0 3>; -+ }; -+ }; -diff --git a/arch/arm64/boot/dts/apple/t600x-dieX.dtsi b/arch/arm64/boot/dts/apple/t600x-dieX.dtsi -new file mode 100644 -index 000000000000..0a437b68e86c ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t600x-dieX.dtsi -@@ -0,0 +1,103 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Devices used on both dies on the Apple T6002 "M1 Ultra" and present on -+ * Apple T6000/T6001 "M1 Pro/Max". -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+ DIE_NODE(pmgr): power-management@28e080000 { -+ compatible = "apple,t6000-pmgr", "apple,pmgr", "syscon", "simple-mfd"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ reg = <0x2 0x8e080000 0 0x4000>; -+ }; -+ -+ DIE_NODE(pmgr_east): power-management@28e580000 { -+ compatible = "apple,t6000-pmgr", "apple,pmgr", "syscon", "simple-mfd"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ reg = <0x2 0x8e580000 0 0xc000>; -+ }; -+ -+ DIE_NODE(pmgr_south): power-management@28e680000 { -+ compatible = "apple,t6000-pmgr", "apple,pmgr", "syscon", "simple-mfd"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ reg = <0x2 0x8e680000 0 0xc000>; -+ }; -+ -+ DIE_NODE(pinctrl_nub): pinctrl@2921f0000 { -+ compatible = "apple,t6000-pinctrl", "apple,pinctrl"; -+ reg = <0x2 0x921f0000 0x0 0x4000>; -+ power-domains = <&DIE_NODE(ps_nub_gpio)>; -+ -+ gpio-controller; -+ #gpio-cells = <2>; -+ gpio-ranges = <&DIE_NODE(pinctrl_nub) 0 0 16>; -+ apple,npins = <16>; -+ -+ interrupt-controller; -+ #interrupt-cells = <2>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ , -+ , -+ , -+ ; -+ }; -+ -+ DIE_NODE(pmgr_mini): power-management@292280000 { -+ compatible = "apple,t6000-pmgr", "apple,pmgr", "syscon", "simple-mfd"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ reg = <0x2 0x92280000 0 0x4000>; -+ }; -+ -+ DIE_NODE(pinctrl_aop): pinctrl@293820000 { -+ compatible = "apple,t6000-pinctrl", "apple,pinctrl"; -+ reg = <0x2 0x93820000 0x0 0x4000>; -+ -+ gpio-controller; -+ #gpio-cells = <2>; -+ gpio-ranges = <&DIE_NODE(pinctrl_aop) 0 0 63>; -+ apple,npins = <63>; -+ -+ interrupt-controller; -+ #interrupt-cells = <2>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ , -+ , -+ , -+ ; -+ }; -+ -+ DIE_NODE(pinctrl_ap): pinctrl@39b028000 { -+ compatible = "apple,t6000-pinctrl", "apple,pinctrl"; -+ reg = <0x3 0x9b028000 0x0 0x4000>; -+ -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ , -+ , -+ , -+ ; -+ -+ clocks = <&clkref>; -+ power-domains = <&DIE_NODE(ps_gpio)>; -+ -+ gpio-controller; -+ #gpio-cells = <2>; -+ gpio-ranges = <&DIE_NODE(pinctrl_ap) 0 0 255>; -+ apple,npins = <255>; -+ -+ interrupt-controller; -+ #interrupt-cells = <2>; -+ }; -diff --git a/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi b/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi -new file mode 100644 -index 000000000000..b31f1a7a2b3f ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi -@@ -0,0 +1,45 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * GPIO pin mappings for Apple T600x SoCs. -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+&pinctrl_ap { -+ i2c0_pins: i2c0-pins { -+ pinmux = , -+ ; -+ }; -+ -+ i2c1_pins: i2c1-pins { -+ pinmux = , -+ ; -+ }; -+ -+ i2c2_pins: i2c2-pins { -+ pinmux = , -+ ; -+ }; -+ -+ i2c3_pins: i2c3-pins { -+ pinmux = , -+ ; -+ }; -+ -+ i2c4_pins: i2c4-pins { -+ pinmux = , -+ ; -+ }; -+ -+ i2c5_pins: i2c5-pins { -+ pinmux = , -+ ; -+ }; -+ -+ pcie_pins: pcie-pins { -+ pinmux = , -+ , -+ , -+ ; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t600x-nvme.dtsi b/arch/arm64/boot/dts/apple/t600x-nvme.dtsi -new file mode 100644 -index 000000000000..04c89593735d ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t600x-nvme.dtsi -@@ -0,0 +1,42 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * NVMe related devices for Apple T600x SoCs. -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+ DIE_NODE(ans_mbox): mbox@38f408000 { -+ compatible = "apple,t6000-asc-mailbox", "apple,asc-mailbox-v4"; -+ reg = <0x3 0x8f408000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ ; -+ interrupt-names = "send-empty", "send-not-empty", -+ "recv-empty", "recv-not-empty"; -+ power-domains = <&DIE_NODE(ps_ans2)>; -+ #mbox-cells = <0>; -+ }; -+ -+ DIE_NODE(sart): sart@393c50000 { -+ compatible = "apple,t6000-sart", "apple,sart3"; -+ reg = <0x3 0x93c50000 0x0 0x10000>; -+ power-domains = <&DIE_NODE(ps_ans2)>; -+ }; -+ -+ DIE_NODE(nvme): nvme@393cc0000 { -+ compatible = "apple,t6000-nvme-ans2", "apple,nvme-ans2"; -+ reg = <0x3 0x93cc0000 0x0 0x40000>, <0x3 0x8f400000 0x0 0x4000>; -+ reg-names = "nvme", "ans"; -+ interrupt-parent = <&aic>; -+ /* The NVME interrupt is always routed to die */ -+ interrupts = ; -+ mboxes = <&DIE_NODE(ans_mbox)>; -+ apple,sart = <&DIE_NODE(sart)>; -+ power-domains = <&DIE_NODE(ps_ans2)>, -+ <&DIE_NODE(ps_apcie_st_sys)>, -+ <&DIE_NODE(ps_apcie_st1_sys)>; -+ power-domain-names = "ans", "apcie0", "apcie1"; -+ resets = <&DIE_NODE(ps_ans2)>; -+ }; -diff --git a/arch/arm64/boot/dts/apple/t600x-pmgr.dtsi b/arch/arm64/boot/dts/apple/t600x-pmgr.dtsi -new file mode 100644 -index 000000000000..5a041501da5b ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t600x-pmgr.dtsi -@@ -0,0 +1,2013 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * PMGR Power domains for the Apple T6001 "M1 Max" SoC -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+&DIE_NODE(pmgr) { -+ DIE_NODE(ps_pms_bridge): power-controller@100 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x100 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(pms_bridge); -+ apple,always-on; /* Core device */ -+ }; -+ -+ DIE_NODE(ps_aic): power-controller@108 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x108 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(aic); -+ apple,always-on; /* Core device */ -+ }; -+ -+ DIE_NODE(ps_dwi): power-controller@110 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x110 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dwi); -+ apple,always-on; /* Core device */ -+ }; -+ -+ DIE_NODE(ps_pms): power-controller@118 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x118 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(pms); -+ apple,always-on; /* Core device */ -+ }; -+ -+ DIE_NODE(ps_gpio): power-controller@120 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x120 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(gpio); -+ power-domains = <&DIE_NODE(ps_pms)>, <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_soc_dpe): power-controller@128 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x128 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(soc_dpe); -+ apple,always-on; /* Core device */ -+ }; -+ -+ DIE_NODE(ps_pmgr_soc_ocla): power-controller@130 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x130 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(pmgr_soc_ocla); -+ power-domains = <&DIE_NODE(ps_pms)>; -+ }; -+ -+ DIE_NODE(ps_pcie0_ref): power-controller@138 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x138 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(pcie0_ref); -+ }; -+ -+ DIE_NODE(ps_pcie1_ref): power-controller@140 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x140 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(pcie1_ref); -+ }; -+ -+ DIE_NODE(ps_apcie_st): power-controller@148 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x148 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(apcie_st); -+ power-domains = <&DIE_NODE(ps_pcie1_ref)>; -+ }; -+ -+ DIE_NODE(ps_apcie_gp): power-controller@150 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x150 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(apcie_gp); -+ power-domains = <&DIE_NODE(ps_pcie0_ref)>; -+ }; -+ -+ DIE_NODE(ps_devc0_ivdmc): power-controller@180 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x180 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(devc0_ivdmc); -+ }; -+ -+ DIE_NODE(ps_amcc0): power-controller@188 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x188 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(amcc0); -+ apple,always-on; /* Memory controller */ -+ }; -+ -+ DIE_NODE(ps_amcc2): power-controller@190 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x190 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(amcc2); -+ apple,always-on; /* Memory controller */ -+ }; -+ -+ DIE_NODE(ps_dcs_00): power-controller@198 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x198 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_00); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_01): power-controller@1a0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1a0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_01); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_02): power-controller@1a8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1a8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_02); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_03): power-controller@1b0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1b0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_03); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_08): power-controller@1b8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1b8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_08); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_09): power-controller@1c0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1c0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_09); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_10): power-controller@1c8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1c8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_10); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_11): power-controller@1d0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1d0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_11); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_afi): power-controller@1d8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1d8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afi); -+ apple,always-on; /* Apple Fabric, CPU inteface is here */ -+ }; -+ -+ DIE_NODE(ps_afc): power-controller@1e0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1e0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afc); -+ apple,always-on; /* Apple Fabric, CPU inteface is here */ -+ }; -+ -+ DIE_NODE(ps_afr): power-controller@1e8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1e8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afr); -+ /* Apple Fabric, media DIE_NODE(stuff): this can power down */ -+ }; -+ -+ DIE_NODE(ps_afnc1_ioa): power-controller@1f0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1f0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc1_ioa); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afi)>; -+ }; -+ -+ DIE_NODE(ps_afnc0_ioa): power-controller@1f8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1f8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc0_ioa); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afi)>; -+ }; -+ -+ DIE_NODE(ps_afnc1_ls): power-controller@200 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x200 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc1_ls); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc1_ioa)>; -+ }; -+ -+ DIE_NODE(ps_afnc0_ls): power-controller@208 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x208 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc0_ls); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc0_ioa)>; -+ }; -+ -+ DIE_NODE(ps_afnc1_lw0): power-controller@210 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x210 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc1_lw0); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc1_ls)>; -+ }; -+ -+ DIE_NODE(ps_afnc1_lw1): power-controller@218 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x218 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc1_lw1); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc1_ls)>; -+ }; -+ -+ DIE_NODE(ps_afnc1_lw2): power-controller@220 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x220 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc1_lw2); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc1_ls)>; -+ }; -+ -+ DIE_NODE(ps_afnc0_lw0): power-controller@228 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x228 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc0_lw0); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc0_ls)>; -+ }; -+ -+ DIE_NODE(ps_scodec): power-controller@230 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x230 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(scodec); -+ power-domains = <&DIE_NODE(ps_afnc1_lw0)>; -+ }; -+ -+ DIE_NODE(ps_atc0_common): power-controller@238 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x238 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc0_common); -+ power-domains = <&DIE_NODE(ps_afnc1_lw1)>; -+ }; -+ -+ DIE_NODE(ps_atc1_common): power-controller@240 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x240 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc1_common); -+ power-domains = <&DIE_NODE(ps_afnc1_lw1)>; -+ }; -+ -+ DIE_NODE(ps_c0_usb31drd): power-controller@248 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x248 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(c0_usb31drd); -+ power-domains = <&DIE_NODE(ps_usb)>; -+ }; -+ -+ DIE_NODE(ps_c1_usb31drd): power-controller@250 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x250 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(c1_usb31drd); -+ power-domains = <&DIE_NODE(ps_usb)>; -+ }; -+ -+ DIE_NODE(ps_dispext0_fe): power-controller@258 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x258 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dispext0_fe); -+ power-domains = <&DIE_NODE(ps_afi)>; -+ }; -+ -+ DIE_NODE(ps_dispext1_fe): power-controller@260 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x260 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dispext1_fe); -+ power-domains = <&DIE_NODE(ps_afi)>; -+ }; -+ -+ DIE_NODE(ps_ane_sys): power-controller@268 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x268 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(ane_sys); -+ power-domains = <&DIE_NODE(ps_afr)>; -+ }; -+ -+ DIE_NODE(ps_avd_sys): power-controller@270 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x270 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(avd_sys); -+ power-domains = <&DIE_NODE(ps_afr)>; -+ }; -+ -+ DIE_NODE(ps_dispext0_cpu0): power-controller@280 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x280 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dispext0_cpu0); -+ power-domains = <&DIE_NODE(ps_dispext0_fe)>; -+ }; -+ -+ DIE_NODE(ps_dispext1_cpu0): power-controller@2a8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2a8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dispext1_cpu0); -+ power-domains = <&DIE_NODE(ps_dispext1_fe)>; -+ }; -+ -+ DIE_NODE(ps_ane_sys_cpu): power-controller@2c8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2c8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(ane_sys_cpu); -+ power-domains = <&DIE_NODE(ps_ane_sys)>; -+ }; -+ -+#if DIE_NO == 0 -+ /* PMP is only present on die 0 of the M1 Ultra */ -+ DIE_NODE(ps_pmp): power-controller@2d8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2d8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(pmp); -+ }; -+#endif -+ -+ DIE_NODE(ps_pms_sram): power-controller@2e0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2e0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(pms_sram); -+ }; -+ -+ DIE_NODE(ps_apcie_st_sys): power-controller@2e8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2e8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(apcie_st_sys); -+ power-domains = <&DIE_NODE(ps_apcie_st)>, <&DIE_NODE(ps_ans2)>; -+ }; -+ -+ DIE_NODE(ps_apcie_st1_sys): power-controller@2f0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2f0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(apcie_st1_sys); -+ power-domains = <&DIE_NODE(ps_apcie_st)>, <&DIE_NODE(ps_ans2)>; -+ }; -+ -+ DIE_NODE(ps_atc2_common): power-controller@2f8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2f8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc2_common); -+ power-domains = <&DIE_NODE(ps_afnc1_lw1)>; -+ }; -+ -+ DIE_NODE(ps_atc3_common): power-controller@300 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x300 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc3_common); -+ power-domains = <&DIE_NODE(ps_afnc1_lw1)>; -+ }; -+ -+ DIE_NODE(ps_usb): power-controller@318 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x318 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(usb); -+ power-domains = <&DIE_NODE(ps_afnc1_lw2)>; -+ }; -+ -+ DIE_NODE(ps_apcie_gp_sys): power-controller@320 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x320 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(apcie_gp_sys); -+ power-domains = <&DIE_NODE(ps_afnc1_lw2)>, <&DIE_NODE(ps_apcie_gp)>; -+ apple,always-on; /* Breaks things if shut down */ -+ }; -+ -+ DIE_NODE(ps_atc0_cio): power-controller@328 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x328 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc0_cio); -+ power-domains = <&DIE_NODE(ps_atc0_common)>; -+ }; -+ -+ DIE_NODE(ps_atc0_pcie): power-controller@330 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x330 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc0_pcie); -+ power-domains = <&DIE_NODE(ps_atc0_common)>; -+ }; -+ -+ DIE_NODE(ps_atc1_cio): power-controller@338 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x338 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc1_cio); -+ power-domains = <&DIE_NODE(ps_atc1_common)>; -+ }; -+ -+ DIE_NODE(ps_atc1_pcie): power-controller@340 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x340 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc1_pcie); -+ power-domains = <&DIE_NODE(ps_atc1_common)>; -+ }; -+ -+ DIE_NODE(ps_atc2_cio): power-controller@348 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x348 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc2_cio); -+ power-domains = <&DIE_NODE(ps_atc2_common)>; -+ }; -+ -+ DIE_NODE(ps_atc2_pcie): power-controller@350 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x350 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc2_pcie); -+ power-domains = <&DIE_NODE(ps_atc2_common)>; -+ }; -+ -+ DIE_NODE(ps_atc3_cio): power-controller@358 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x358 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc3_cio); -+ power-domains = <&DIE_NODE(ps_atc3_common)>; -+ }; -+ -+ DIE_NODE(ps_atc3_pcie): power-controller@360 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x360 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc3_pcie); -+ power-domains = <&DIE_NODE(ps_atc3_common)>; -+ }; -+ -+ DIE_NODE(ps_c0_usbctl): power-controller@368 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x368 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(c0_usbctl); -+ power-domains = <&DIE_NODE(ps_usb)>; -+ }; -+ -+ DIE_NODE(ps_c1_usbctl): power-controller@370 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x370 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(c1_usbctl); -+ power-domains = <&DIE_NODE(ps_usb)>; -+ }; -+ -+ DIE_NODE(ps_atc0_cio_pcie): power-controller@378 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x378 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc0_cio_pcie); -+ power-domains = <&DIE_NODE(ps_atc0_cio)>; -+ }; -+ -+ DIE_NODE(ps_atc0_cio_usb): power-controller@380 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x380 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc0_cio_usb); -+ power-domains = <&DIE_NODE(ps_atc0_cio)>; -+ }; -+ -+ DIE_NODE(ps_atc1_cio_pcie): power-controller@388 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x388 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc1_cio_pcie); -+ power-domains = <&DIE_NODE(ps_atc1_cio)>; -+ }; -+ -+ DIE_NODE(ps_atc1_cio_usb): power-controller@390 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x390 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc1_cio_usb); -+ power-domains = <&DIE_NODE(ps_atc1_cio)>; -+ }; -+ -+ DIE_NODE(ps_atc2_cio_pcie): power-controller@398 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x398 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc2_cio_pcie); -+ power-domains = <&DIE_NODE(ps_atc2_cio)>; -+ }; -+ -+ DIE_NODE(ps_atc2_cio_usb): power-controller@3a0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3a0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc2_cio_usb); -+ power-domains = <&DIE_NODE(ps_atc2_cio)>; -+ }; -+ -+ DIE_NODE(ps_atc3_cio_pcie): power-controller@3a8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3a8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc3_cio_pcie); -+ power-domains = <&DIE_NODE(ps_atc3_cio)>; -+ }; -+ -+ DIE_NODE(ps_atc3_cio_usb): power-controller@3b0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3b0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc3_cio_usb); -+ power-domains = <&DIE_NODE(ps_atc3_cio)>; -+ }; -+ -+ DIE_NODE(ps_trace_fab): power-controller@3b8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3b8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(trace_fab); -+ }; -+}; -+ -+&DIE_NODE(pmgr_east) { -+ DIE_NODE(ps_clvr_spmi0): power-controller@100 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x100 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(clvr_spmi0); -+ apple,always-on; /* PCPU voltage regulator interface (used by SMC) */ -+ }; -+ -+ DIE_NODE(ps_clvr_spmi1): power-controller@108 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x108 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(clvr_spmi1); -+ apple,always-on; /* GPU voltage regulator interface (used by SMC) */ -+ }; -+ -+ DIE_NODE(ps_clvr_spmi2): power-controller@110 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x110 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(clvr_spmi2); -+ apple,always-on; /* ANE, fabric, AFR voltage regulator interface (used by SMC) */ -+ }; -+ -+ DIE_NODE(ps_clvr_spmi3): power-controller@118 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x118 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(clvr_spmi3); -+ apple,always-on; /* Additional voltage regulator, probably used on T6001 (SMC) */ -+ }; -+ -+ DIE_NODE(ps_clvr_spmi4): power-controller@120 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x120 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(clvr_spmi4); -+ apple,always-on; /* Additional voltage regulator, probably used on T6001 (SMC) */ -+ }; -+ -+ DIE_NODE(ps_ispsens0): power-controller@128 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x128 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(ispsens0); -+ }; -+ -+ DIE_NODE(ps_ispsens1): power-controller@130 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x130 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(ispsens1); -+ }; -+ -+ DIE_NODE(ps_ispsens2): power-controller@138 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x138 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(ispsens2); -+ }; -+ -+ DIE_NODE(ps_ispsens3): power-controller@140 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x140 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(ispsens3); -+ }; -+ -+ DIE_NODE(ps_afnc2_ioa): power-controller@148 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x148 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc2_ioa); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afi)>; -+ }; -+ -+ DIE_NODE(ps_afnc2_ls): power-controller@150 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x150 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc2_ls); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc2_ioa)>; -+ }; -+ -+ DIE_NODE(ps_afnc2_lw0): power-controller@158 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x158 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc2_lw0); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc2_ls)>; -+ }; -+ -+ DIE_NODE(ps_afnc2_lw1): power-controller@160 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x160 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc2_lw1); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc2_ls)>; -+ }; -+ -+ DIE_NODE(ps_afnc3_ioa): power-controller@168 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x168 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc3_ioa); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afi)>; -+ }; -+ -+ DIE_NODE(ps_afnc3_ls): power-controller@170 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x170 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc3_ls); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc3_ioa)>; -+ }; -+ -+ DIE_NODE(ps_afnc3_lw0): power-controller@178 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x178 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc3_lw0); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc3_ls)>; -+ }; -+ -+ DIE_NODE(ps_sio): power-controller@180 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x180 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(sio); -+ power-domains = <&DIE_NODE(ps_afnc2_lw1)>; -+ }; -+ -+ DIE_NODE(ps_sio_cpu): power-controller@188 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x188 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(sio_cpu); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_fpwm0): power-controller@190 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x190 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(fpwm0); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_fpwm1): power-controller@198 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x198 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(fpwm1); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_fpwm2): power-controller@1a0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1a0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(fpwm2); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_i2c0): power-controller@1a8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1a8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(i2c0); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_i2c1): power-controller@1b0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1b0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(i2c1); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_i2c2): power-controller@1b8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1b8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(i2c2); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_i2c3): power-controller@1c0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1c0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(i2c3); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_i2c4): power-controller@1c8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1c8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(i2c4); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_i2c5): power-controller@1d0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1d0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(i2c5); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_i2c6): power-controller@1d8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1d8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(i2c6); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_i2c7): power-controller@1e0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1e0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(i2c7); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_spi_p): power-controller@1e8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1e8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(spi_p); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_spi0): power-controller@1f0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1f0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(spi0); -+ power-domains = <&DIE_NODE(ps_spi_p)>; -+ }; -+ -+ DIE_NODE(ps_spi1): power-controller@1f8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1f8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(spi1); -+ power-domains = <&DIE_NODE(ps_spi_p)>; -+ }; -+ -+ DIE_NODE(ps_spi2): power-controller@200 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x200 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(spi2); -+ power-domains = <&DIE_NODE(ps_spi_p)>; -+ }; -+ -+ DIE_NODE(ps_spi3): power-controller@208 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x208 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(spi3); -+ power-domains = <&DIE_NODE(ps_spi_p)>; -+ }; -+ -+ DIE_NODE(ps_spi4): power-controller@210 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x210 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(spi4); -+ power-domains = <&DIE_NODE(ps_spi_p)>; -+ }; -+ -+ DIE_NODE(ps_sio_spmi0): power-controller@218 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x218 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(sio_spmi0); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_sio_spmi1): power-controller@220 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x220 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(sio_spmi1); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_sio_spmi2): power-controller@228 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x228 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(sio_spmi2); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_uart_p): power-controller@230 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x230 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(uart_p); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_uart_n): power-controller@238 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x238 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(uart_n); -+ power-domains = <&DIE_NODE(ps_uart_p)>; -+ }; -+ -+ DIE_NODE(ps_uart0): power-controller@240 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x240 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(uart0); -+ power-domains = <&DIE_NODE(ps_uart_p)>; -+ }; -+ -+ DIE_NODE(ps_uart1): power-controller@248 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x248 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(uart1); -+ power-domains = <&DIE_NODE(ps_uart_p)>; -+ }; -+ -+ DIE_NODE(ps_uart2): power-controller@250 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x250 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(uart2); -+ power-domains = <&DIE_NODE(ps_uart_p)>; -+ }; -+ -+ DIE_NODE(ps_uart3): power-controller@258 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x258 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(uart3); -+ power-domains = <&DIE_NODE(ps_uart_p)>; -+ }; -+ -+ DIE_NODE(ps_uart4): power-controller@260 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x260 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(uart4); -+ power-domains = <&DIE_NODE(ps_uart_p)>; -+ }; -+ -+ DIE_NODE(ps_uart6): power-controller@268 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x268 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(uart6); -+ power-domains = <&DIE_NODE(ps_uart_p)>; -+ }; -+ -+ DIE_NODE(ps_uart7): power-controller@270 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x270 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(uart7); -+ power-domains = <&DIE_NODE(ps_uart_p)>; -+ }; -+ -+ DIE_NODE(ps_audio_p): power-controller@278 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x278 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(audio_p); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_sio_adma): power-controller@280 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x280 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(sio_adma); -+ power-domains = <&DIE_NODE(ps_audio_p)>, <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_mca0): power-controller@288 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x288 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(mca0); -+ power-domains = <&DIE_NODE(ps_audio_p)>, <&DIE_NODE(ps_sio_adma)>; -+ }; -+ -+ DIE_NODE(ps_mca1): power-controller@290 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x290 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(mca1); -+ power-domains = <&DIE_NODE(ps_audio_p)>, <&DIE_NODE(ps_sio_adma)>; -+ }; -+ -+ DIE_NODE(ps_mca2): power-controller@298 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x298 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(mca2); -+ power-domains = <&DIE_NODE(ps_audio_p)>, <&DIE_NODE(ps_sio_adma)>; -+ }; -+ -+ DIE_NODE(ps_mca3): power-controller@2a0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2a0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(mca3); -+ power-domains = <&DIE_NODE(ps_audio_p)>, <&DIE_NODE(ps_sio_adma)>; -+ }; -+ -+ DIE_NODE(ps_dpa0): power-controller@2a8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2a8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dpa0); -+ power-domains = <&DIE_NODE(ps_audio_p)>; -+ }; -+ -+ DIE_NODE(ps_dpa1): power-controller@2b0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2b0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dpa1); -+ power-domains = <&DIE_NODE(ps_audio_p)>; -+ }; -+ -+ DIE_NODE(ps_dpa2): power-controller@2b8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2b8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dpa2); -+ power-domains = <&DIE_NODE(ps_audio_p)>; -+ }; -+ -+ DIE_NODE(ps_dpa3): power-controller@2c0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2c0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dpa3); -+ power-domains = <&DIE_NODE(ps_audio_p)>; -+ }; -+ -+ DIE_NODE(ps_dpa4): power-controller@2c8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2c8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dpa4); -+ power-domains = <&DIE_NODE(ps_audio_p)>; -+ }; -+ -+ DIE_NODE(ps_aes): power-controller@2d0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2d0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(aes); -+ power-domains = <&DIE_NODE(ps_sio)>; -+ }; -+ -+ DIE_NODE(ps_amcc1): power-controller@2d8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2d8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(amcc1); -+ apple,always-on; /* Memory controller */ -+ }; -+ -+ DIE_NODE(ps_amcc3): power-controller@2e0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2e0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(amcc3); -+ apple,always-on; /* Memory controller */ -+ }; -+ -+ DIE_NODE(ps_dcs_04): power-controller@2e8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2e8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_04); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_05): power-controller@2f0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2f0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_05); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_06): power-controller@2f8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2f8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_06); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_07): power-controller@300 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x300 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_07); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_12): power-controller@308 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x308 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_12); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_13): power-controller@310 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x310 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_13); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_14): power-controller@318 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x318 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_14); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_15): power-controller@320 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x320 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_15); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_disp0_fe): power-controller@328 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x328 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(disp0_fe); -+ power-domains = <&DIE_NODE(ps_afnc2_lw0)>; -+ apple,always-on; /* TODO: figure out if we can enable PM here */ -+ }; -+ -+ DIE_NODE(ps_disp0_cpu0): power-controller@350 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x350 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(disp0_cpu0); -+ power-domains = <&DIE_NODE(ps_disp0_fe)>; -+ apple,always-on; /* TODO: figure out if we can enable PM here */ -+ apple,min-state = <4>; -+ }; -+ -+ DIE_NODE(ps_dispdfr_fe): power-controller@378 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x378 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dispdfr_fe); -+ power-domains = <&DIE_NODE(ps_afnc2_lw1)>; -+ }; -+ -+ DIE_NODE(ps_dispdfr_be): power-controller@380 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x380 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dispdfr_be); -+ power-domains = <&DIE_NODE(ps_dispdfr_fe)>; -+ }; -+ -+ DIE_NODE(ps_mipi_dsi): power-controller@388 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x388 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(mipi_dsi); -+ power-domains = <&DIE_NODE(ps_dispdfr_be)>; -+ }; -+ -+ DIE_NODE(ps_jpg): power-controller@390 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x390 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(jpg); -+ power-domains = <&DIE_NODE(ps_afr)>; -+ }; -+ -+ DIE_NODE(ps_msr0): power-controller@398 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x398 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(msr0); -+ power-domains = <&DIE_NODE(ps_afr)>; -+ }; -+ -+ DIE_NODE(ps_msr0_ase_core): power-controller@3a0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3a0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(msr0_ase_core); -+ power-domains = <&DIE_NODE(ps_msr0)>; -+ }; -+ -+ DIE_NODE(ps_isp_sys): power-controller@3a8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3a8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(isp_sys); -+ power-domains = <&DIE_NODE(ps_afnc2_lw1)>; -+ }; -+ -+ DIE_NODE(ps_venc_sys): power-controller@3b0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3b0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc_sys); -+ power-domains = <&DIE_NODE(ps_afr)>; -+ }; -+ -+ DIE_NODE(ps_ans2): power-controller@3b8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3b8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(ans2); -+ /* -+ * The ADT makes ps_apcie_st[1]_sys depend on ps_ans2 instead, -+ * but we'd rather have a single power domain for the downstream -+ * device to depend on, so use this node as the child. -+ * This makes more sense anyway (since ANS2 uses APCIE_ST). -+ */ -+ power-domains = <&DIE_NODE(ps_afnc2_lw0)>; -+ }; -+ -+ DIE_NODE(ps_gfx): power-controller@3c0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3c0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(gfx); -+ power-domains = <&DIE_NODE(ps_afr)>; -+ }; -+ -+ DIE_NODE(ps_sep): power-controller@c00 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xc00 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(sep); -+ apple,always-on; /* Locked on */ -+ }; -+ -+ DIE_NODE(ps_venc_dma): power-controller@8000 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8000 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc_dma); -+ power-domains = <&DIE_NODE(ps_venc_sys)>; -+ }; -+ -+ DIE_NODE(ps_venc_pipe4): power-controller@8008 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8008 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc_pipe4); -+ power-domains = <&DIE_NODE(ps_venc_dma)>; -+ }; -+ -+ DIE_NODE(ps_venc_pipe5): power-controller@8010 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8010 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc_pipe5); -+ power-domains = <&DIE_NODE(ps_venc_dma)>; -+ }; -+ -+ DIE_NODE(ps_venc_me0): power-controller@8018 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8018 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc_me0); -+ power-domains = <&DIE_NODE(ps_venc_pipe5)>, <&DIE_NODE(ps_venc_pipe4)>; -+ }; -+ -+ DIE_NODE(ps_venc_me1): power-controller@8020 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8020 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc_me1); -+ power-domains = <&DIE_NODE(ps_venc_me0)>; -+ }; -+}; -+ -+&DIE_NODE(pmgr_south) { -+ DIE_NODE(ps_amcc4): power-controller@100 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x100 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(amcc4); -+ apple,always-on; /* Memory controller */ -+ }; -+ -+ DIE_NODE(ps_amcc5): power-controller@108 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x108 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(amcc5); -+ apple,always-on; /* Memory controller */ -+ }; -+ -+ DIE_NODE(ps_amcc6): power-controller@110 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x110 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(amcc6); -+ apple,always-on; /* Memory controller */ -+ }; -+ -+ DIE_NODE(ps_amcc7): power-controller@118 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x118 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(amcc7); -+ apple,always-on; /* Memory controller */ -+ }; -+ -+ DIE_NODE(ps_dcs_16): power-controller@120 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x120 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_16); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_17): power-controller@128 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x128 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_17); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_18): power-controller@130 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x130 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_18); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_19): power-controller@138 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x138 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_19); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_20): power-controller@140 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x140 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_20); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_21): power-controller@148 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x148 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_21); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_22): power-controller@150 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x150 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_22); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_23): power-controller@158 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x158 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_23); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_24): power-controller@160 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x160 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_24); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_25): power-controller@168 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x168 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_25); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_26): power-controller@170 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x170 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_26); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_27): power-controller@178 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x178 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_27); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_28): power-controller@180 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x180 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_28); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_29): power-controller@188 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x188 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_29); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_30): power-controller@190 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x190 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_30); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_dcs_31): power-controller@198 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x198 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dcs_31); -+ apple,always-on; /* LPDDR5 interface */ -+ }; -+ -+ DIE_NODE(ps_afnc4_ioa): power-controller@1a0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1a0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc4_ioa); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afi)>; -+ }; -+ -+ DIE_NODE(ps_afnc4_ls): power-controller@1a8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1a8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc4_ls); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc4_ioa)>; -+ }; -+ -+ DIE_NODE(ps_afnc4_lw0): power-controller@1b0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1b0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc4_lw0); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc4_ls)>; -+ }; -+ -+ DIE_NODE(ps_afnc5_ioa): power-controller@1b8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1b8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc5_ioa); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afi)>; -+ }; -+ -+ DIE_NODE(ps_afnc5_ls): power-controller@1c0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1c0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc5_ls); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc5_ioa)>; -+ }; -+ -+ DIE_NODE(ps_afnc5_lw0): power-controller@1c8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1c8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(afnc5_lw0); -+ apple,always-on; /* Apple Fabric */ -+ power-domains = <&DIE_NODE(ps_afnc5_ls)>; -+ }; -+ -+ DIE_NODE(ps_dispext2_fe): power-controller@1d0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1d0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dispext2_fe); -+ power-domains = <&DIE_NODE(ps_afnc4_lw0)>; -+ }; -+ -+ DIE_NODE(ps_dispext2_cpu0): power-controller@1e8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1e8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dispext2_cpu0); -+ power-domains = <&DIE_NODE(ps_dispext2_fe)>; -+ }; -+ -+ DIE_NODE(ps_dispext3_fe): power-controller@210 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x210 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dispext3_fe); -+ power-domains = <&DIE_NODE(ps_afnc4_lw0)>; -+ }; -+ -+ DIE_NODE(ps_dispext3_cpu0): power-controller@228 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x228 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(dispext3_cpu0); -+ power-domains = <&DIE_NODE(ps_dispext3_fe)>; -+ }; -+ -+ DIE_NODE(ps_msr1): power-controller@250 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x250 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(msr1); -+ power-domains = <&DIE_NODE(ps_afnc5_lw0)>, <&DIE_NODE(ps_afr)>; -+ }; -+ -+ DIE_NODE(ps_msr1_ase_core): power-controller@258 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x258 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(msr1_ase_core); -+ power-domains = <&DIE_NODE(ps_msr1)>; -+ }; -+ -+ DIE_NODE(ps_venc1_sys): power-controller@260 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x260 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc1_sys); -+ power-domains = <&DIE_NODE(ps_afnc5_lw0)>, <&DIE_NODE(ps_afr)>; -+ }; -+ -+ /* Seems to be disabled on shipping hardware */ -+#if 0 -+ DIE_NODE(ps_ane1_sys): power-controller@268 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x268 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(ane1_sys); -+ power-domains = <&DIE_NODE(ps_afnc5_lw0)>; -+ }; -+ -+ DIE_NODE(ps_ane1_sys_cpu): power-controller@270 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x270 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(ane1_sys_cpu); -+ power-domains = <&DIE_NODE(ps_ane1_sys)>; -+ }; -+#endif -+ -+ DIE_NODE(ps_venc1_dma): power-controller@8000 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8000 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc1_dma); -+ power-domains = <&DIE_NODE(ps_venc1_sys)>; -+ }; -+ -+ DIE_NODE(ps_venc1_pipe4): power-controller@8008 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8008 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc1_pipe4); -+ power-domains = <&DIE_NODE(ps_venc1_dma)>; -+ }; -+ -+ DIE_NODE(ps_venc1_pipe5): power-controller@8010 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8010 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc1_pipe5); -+ power-domains = <&DIE_NODE(ps_venc1_dma)>; -+ }; -+ -+ DIE_NODE(ps_venc1_me0): power-controller@8018 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8018 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc1_me0); -+ power-domains = <&DIE_NODE(ps_venc1_pipe4)>, <&DIE_NODE(ps_venc1_pipe5)>; -+ }; -+ -+ DIE_NODE(ps_venc1_me1): power-controller@8020 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8020 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(venc1_me1); -+ power-domains = <&DIE_NODE(ps_venc1_me0)>; -+ }; -+ -+ DIE_NODE(ps_prores): power-controller@c000 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xc000 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(prores); -+ power-domains = <&DIE_NODE(ps_afnc4_lw0)>; -+ }; -+}; -+ -+&DIE_NODE(pmgr_mini) { -+ DIE_NODE(ps_debug): power-controller@58 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x58 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(debug); -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ DIE_NODE(ps_nub_spmi0): power-controller@60 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x60 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(nub_spmi0); -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ DIE_NODE(ps_nub_spmi1): power-controller@68 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x68 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(nub_spmi1); -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ DIE_NODE(ps_nub_aon): power-controller@70 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x70 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(nub_aon); -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ DIE_NODE(ps_msg): power-controller@78 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x78 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(msg); -+ }; -+ -+ DIE_NODE(ps_nub_gpio): power-controller@80 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x80 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(nub_gpio); -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ DIE_NODE(ps_atc0_usb_aon): power-controller@88 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x88 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc0_usb_aon); -+ apple,always-on; /* Needs to stay on for dwc3 to work */ -+ }; -+ -+ DIE_NODE(ps_atc1_usb_aon): power-controller@90 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x90 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc1_usb_aon); -+ apple,always-on; /* Needs to stay on for dwc3 to work */ -+ }; -+ -+ DIE_NODE(ps_atc2_usb_aon): power-controller@98 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x98 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc2_usb_aon); -+ apple,always-on; /* Needs to stay on for dwc3 to work */ -+ }; -+ -+ DIE_NODE(ps_atc3_usb_aon): power-controller@a0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xa0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc3_usb_aon); -+ apple,always-on; /* Needs to stay on for dwc3 to work */ -+ }; -+ -+ DIE_NODE(ps_gp_usb_aon): power-controller@a8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xa8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(gp_usb_aon); -+ }; -+ -+ DIE_NODE(ps_nub_fabric): power-controller@b0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xb0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(nub_fabric); -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ DIE_NODE(ps_nub_sram): power-controller@b8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xb8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(nub_sram); -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ DIE_NODE(ps_debug_usb): power-controller@c0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xc0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(debug_usb); -+ apple,always-on; /* Core AON device */ -+ power-domains = <&DIE_NODE(ps_debug)>; -+ }; -+ -+ DIE_NODE(ps_debug_auth): power-controller@c8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xc8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(debug_auth); -+ apple,always-on; /* Core AON device */ -+ power-domains = <&DIE_NODE(ps_debug)>; -+ }; -+ -+ DIE_NODE(ps_atc0_usb): power-controller@d0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xd0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc0_usb); -+ power-domains = <&DIE_NODE(ps_atc0_usb_aon)>, <&DIE_NODE(ps_atc0_common)>; -+ }; -+ -+ DIE_NODE(ps_atc1_usb): power-controller@d8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xd8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc1_usb); -+ power-domains = <&DIE_NODE(ps_atc1_usb_aon)>, <&DIE_NODE(ps_atc1_common)>; -+ }; -+ -+ DIE_NODE(ps_atc2_usb): power-controller@e0 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xe0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc2_usb); -+ power-domains = <&DIE_NODE(ps_atc2_usb_aon)>, <&DIE_NODE(ps_atc2_common)>; -+ }; -+ -+ DIE_NODE(ps_atc3_usb): power-controller@e8 { -+ compatible = "apple,t6000-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xe8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = DIE_LABEL(atc3_usb); -+ power-domains = <&DIE_NODE(ps_atc3_usb_aon)>, <&DIE_NODE(ps_atc3_common)>; -+ }; -+}; -+ --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0017-arm64-dts-apple-Add-J314-and-J316-devicetrees.patch b/target/linux/silicon/patches-5.19/0017-arm64-dts-apple-Add-J314-and-J316-devicetrees.patch deleted file mode 100644 index 23f4c2405..000000000 --- a/target/linux/silicon/patches-5.19/0017-arm64-dts-apple-Add-J314-and-J316-devicetrees.patch +++ /dev/null @@ -1,250 +0,0 @@ -From ea9e6404ec5b3f1ce636e0ac67293528b87c8578 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Wed, 10 Nov 2021 19:08:25 +0900 -Subject: [PATCH 017/171] arm64: dts: apple: Add J314 and J316 devicetrees - -These are the 14-inch and 16-inch 2021 MacBooks, in both M1 Pro and M1 -Max variants (t6000 and t6001). - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/Makefile | 4 + - arch/arm64/boot/dts/apple/t6000-j314s.dts | 18 +++ - arch/arm64/boot/dts/apple/t6000-j316s.dts | 18 +++ - arch/arm64/boot/dts/apple/t6001-j314c.dts | 18 +++ - arch/arm64/boot/dts/apple/t6001-j316c.dts | 18 +++ - .../arm64/boot/dts/apple/t600x-j314-j316.dtsi | 110 ++++++++++++++++++ - 6 files changed, 186 insertions(+) - create mode 100644 arch/arm64/boot/dts/apple/t6000-j314s.dts - create mode 100644 arch/arm64/boot/dts/apple/t6000-j316s.dts - create mode 100644 arch/arm64/boot/dts/apple/t6001-j314c.dts - create mode 100644 arch/arm64/boot/dts/apple/t6001-j316c.dts - create mode 100644 arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi - -diff --git a/arch/arm64/boot/dts/apple/Makefile b/arch/arm64/boot/dts/apple/Makefile -index c0510c25ca6a..b021931b0a17 100644 ---- a/arch/arm64/boot/dts/apple/Makefile -+++ b/arch/arm64/boot/dts/apple/Makefile -@@ -4,3 +4,7 @@ dtb-$(CONFIG_ARCH_APPLE) += t8103-j293.dtb - dtb-$(CONFIG_ARCH_APPLE) += t8103-j313.dtb - dtb-$(CONFIG_ARCH_APPLE) += t8103-j456.dtb - dtb-$(CONFIG_ARCH_APPLE) += t8103-j457.dtb -+dtb-$(CONFIG_ARCH_APPLE) += t6000-j314s.dtb -+dtb-$(CONFIG_ARCH_APPLE) += t6001-j314c.dtb -+dtb-$(CONFIG_ARCH_APPLE) += t6000-j316s.dtb -+dtb-$(CONFIG_ARCH_APPLE) += t6001-j316c.dtb -diff --git a/arch/arm64/boot/dts/apple/t6000-j314s.dts b/arch/arm64/boot/dts/apple/t6000-j314s.dts -new file mode 100644 -index 000000000000..c9e192848fe3 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t6000-j314s.dts -@@ -0,0 +1,18 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * MacBook Pro (14-inch, M1 Pro, 2021) -+ * -+ * target-type: J314s -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/dts-v1/; -+ -+#include "t6000.dtsi" -+#include "t600x-j314-j316.dtsi" -+ -+/ { -+ compatible = "apple,j314s", "apple,t6000", "apple,arm-platform"; -+ model = "Apple MacBook Pro (14-inch, M1 Pro, 2021)"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6000-j316s.dts b/arch/arm64/boot/dts/apple/t6000-j316s.dts -new file mode 100644 -index 000000000000..ff1803ce2300 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t6000-j316s.dts -@@ -0,0 +1,18 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * MacBook Pro (16-inch, M1 Pro, 2021) -+ * -+ * target-type: J316s -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/dts-v1/; -+ -+#include "t6000.dtsi" -+#include "t600x-j314-j316.dtsi" -+ -+/ { -+ compatible = "apple,j316s", "apple,t6000", "apple,arm-platform"; -+ model = "Apple MacBook Pro (16-inch, M1 Pro, 2021)"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6001-j314c.dts b/arch/arm64/boot/dts/apple/t6001-j314c.dts -new file mode 100644 -index 000000000000..1761d15b98c1 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t6001-j314c.dts -@@ -0,0 +1,18 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * MacBook Pro (14-inch, M1 Max, 2021) -+ * -+ * target-type: J314c -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/dts-v1/; -+ -+#include "t6001.dtsi" -+#include "t600x-j314-j316.dtsi" -+ -+/ { -+ compatible = "apple,j314c", "apple,t6001", "apple,arm-platform"; -+ model = "Apple MacBook Pro (14-inch, M1 Max, 2021)"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6001-j316c.dts b/arch/arm64/boot/dts/apple/t6001-j316c.dts -new file mode 100644 -index 000000000000..750e9beeffc0 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t6001-j316c.dts -@@ -0,0 +1,18 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * MacBook Pro (16-inch, M1 Max, 2021) -+ * -+ * target-type: J316c -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/dts-v1/; -+ -+#include "t6001.dtsi" -+#include "t600x-j314-j316.dtsi" -+ -+/ { -+ compatible = "apple,j316c", "apple,t6001", "apple,arm-platform"; -+ model = "Apple MacBook Pro (16-inch, M1 Max, 2021)"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -new file mode 100644 -index 000000000000..8079200aeb12 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -@@ -0,0 +1,110 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * MacBook Pro (14/16-inch, 2021) -+ * -+ * This file contains the parts common to J314 and J316 devices with both t6000 and t6001. -+ * -+ * target-type: J314s / J314c / J316s / J316c -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/ { -+ aliases { -+ serial0 = &serial0; -+ wifi0 = &wifi0; -+ }; -+ -+ chosen { -+ #address-cells = <2>; -+ #size-cells = <2>; -+ ranges; -+ -+ stdout-path = "serial0"; -+ -+ framebuffer0: framebuffer@0 { -+ compatible = "apple,simple-framebuffer", "simple-framebuffer"; -+ reg = <0 0 0 0>; /* To be filled by loader */ -+ /* Format properties will be added by loader */ -+ status = "disabled"; -+ }; -+ }; -+ -+ memory@10000000000 { -+ device_type = "memory"; -+ reg = <0x100 0 0x2 0>; /* To be filled by loader */ -+ }; -+}; -+ -+&serial0 { -+ status = "okay"; -+}; -+ -+/* USB Type C */ -+&i2c0 { -+ hpm0: usb-pd@38 { -+ compatible = "apple,cd321x"; -+ reg = <0x38>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ hpm1: usb-pd@3f { -+ compatible = "apple,cd321x"; -+ reg = <0x3f>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ hpm2: usb-pd@3b { -+ compatible = "apple,cd321x"; -+ reg = <0x3b>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ /* MagSafe port */ -+ hpm5: usb-pd@3a { -+ compatible = "apple,cd321x"; -+ reg = <0x3a>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+}; -+ -+/* PCIe devices */ -+&port00 { -+ /* WLAN */ -+ bus-range = <1 1>; -+ wifi0: wifi@0,0 { -+ reg = <0x10000 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-mac-address = [00 10 18 00 00 10]; -+ }; -+}; -+ -+&port01 { -+ /* SD card reader */ -+ bus-range = <2 2>; -+ sdhci0: mmc@0,0 { -+ compatible = "pci17a0,9755"; -+ reg = <0x20000 0x0 0x0 0x0 0x0>; -+ cd-inverted; -+ wp-inverted; -+ }; -+}; -+ -+&pcie0_dart_2 { -+ status = "disabled"; -+}; -+ -+&pcie0_dart_3 { -+ status = "disabled"; -+}; -+ -+/delete-node/ &port02; -+/delete-node/ &port03; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0018-arm64-dts-apple-Add-devicetree-for-Apple-Mac-Studio-.patch b/target/linux/silicon/patches-5.19/0018-arm64-dts-apple-Add-devicetree-for-Apple-Mac-Studio-.patch deleted file mode 100644 index ffc230aa0..000000000 --- a/target/linux/silicon/patches-5.19/0018-arm64-dts-apple-Add-devicetree-for-Apple-Mac-Studio-.patch +++ /dev/null @@ -1,149 +0,0 @@ -From ab01e260000502f8e1f814e05fcbf35667cc1167 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Tue, 3 May 2022 22:05:25 +0200 -Subject: [PATCH 018/171] arm64: dts: apple: Add devicetree for Apple Mac - Studio M1 Max - -Signed-off-by: Janne Grunau ---- - arch/arm64/boot/dts/apple/Makefile | 1 + - arch/arm64/boot/dts/apple/t6001-j375c.dts | 118 ++++++++++++++++++++++ - 2 files changed, 119 insertions(+) - create mode 100644 arch/arm64/boot/dts/apple/t6001-j375c.dts - -diff --git a/arch/arm64/boot/dts/apple/Makefile b/arch/arm64/boot/dts/apple/Makefile -index b021931b0a17..b3ed42594ecd 100644 ---- a/arch/arm64/boot/dts/apple/Makefile -+++ b/arch/arm64/boot/dts/apple/Makefile -@@ -8,3 +8,4 @@ dtb-$(CONFIG_ARCH_APPLE) += t6000-j314s.dtb - dtb-$(CONFIG_ARCH_APPLE) += t6001-j314c.dtb - dtb-$(CONFIG_ARCH_APPLE) += t6000-j316s.dtb - dtb-$(CONFIG_ARCH_APPLE) += t6001-j316c.dtb -+dtb-$(CONFIG_ARCH_APPLE) += t6001-j375c.dtb -diff --git a/arch/arm64/boot/dts/apple/t6001-j375c.dts b/arch/arm64/boot/dts/apple/t6001-j375c.dts -new file mode 100644 -index 000000000000..961104d6bd9a ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t6001-j375c.dts -@@ -0,0 +1,118 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Mac Studio (M1 Max, 2022) -+ * -+ * target-type: J375c -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/dts-v1/; -+ -+#include "t6001.dtsi" -+ -+/ { -+ compatible = "apple,j375c", "apple,t6001", "apple,arm-platform"; -+ model = "Apple Mac Studio (M1 Max, 2022)"; -+ -+ aliases { -+ serial0 = &serial0; -+ wifi0 = &wifi0; -+ }; -+ -+ chosen { -+ #address-cells = <2>; -+ #size-cells = <2>; -+ ranges; -+ -+ stdout-path = "serial0"; -+ -+ framebuffer0: framebuffer@0 { -+ compatible = "apple,simple-framebuffer", "simple-framebuffer"; -+ reg = <0 0 0 0>; /* To be filled by loader */ -+ /* Format properties will be added by loader */ -+ status = "disabled"; -+ }; -+ }; -+ -+ memory@10000000000 { -+ device_type = "memory"; -+ reg = <0x100 0 0x2 0>; /* To be filled by loader */ -+ }; -+}; -+ -+&serial0 { -+ status = "okay"; -+}; -+ -+/* USB Type C */ -+&i2c0 { -+ hpm0: usb-pd@38 { -+ compatible = "apple,cd321x"; -+ reg = <0x38>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ hpm1: usb-pd@3f { -+ compatible = "apple,cd321x"; -+ reg = <0x3f>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ hpm2: usb-pd@3b { -+ compatible = "apple,cd321x"; -+ reg = <0x3b>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ hpm3: usb-pd@3c { -+ compatible = "apple,cd321x"; -+ reg = <0x3c>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+}; -+ -+/* PCIe devices */ -+&port00 { -+ /* WLAN */ -+ bus-range = <1 1>; -+ wifi0: wifi@0,0 { -+ reg = <0x10000 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-mac-address = [00 10 18 00 00 10]; -+ }; -+}; -+ -+&port01 { -+ /* SD card reader */ -+ bus-range = <2 2>; -+ sdhci0: mmc@0,0 { -+ compatible = "pci17a0,9755"; -+ reg = <0x20000 0x0 0x0 0x0 0x0>; -+ cd-inverted; -+ wp-inverted; -+ }; -+}; -+ -+&port02 { -+ /* 10 Gbit Ethernet */ -+ bus-range = <3 3>; -+ ethernet0: ethernet@0,0 { -+ reg = <0x30000 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-mac-address = [00 10 18 00 00 00]; -+ }; -+}; -+ -+&port03 { -+ /* USB xHCI */ -+ bus-range = <4 4>; -+}; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0019-arm64-dts-apple-Add-devicetree-for-Apple-Mac-Studio-.patch b/target/linux/silicon/patches-5.19/0019-arm64-dts-apple-Add-devicetree-for-Apple-Mac-Studio-.patch deleted file mode 100644 index 1b68e4252..000000000 --- a/target/linux/silicon/patches-5.19/0019-arm64-dts-apple-Add-devicetree-for-Apple-Mac-Studio-.patch +++ /dev/null @@ -1,178 +0,0 @@ -From 973a9df0042bad7ee5fa7534f4d74f6f5d44f1c8 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Thu, 24 Mar 2022 17:04:24 +0100 -Subject: [PATCH 019/171] arm64: dts: apple: Add devicetree for Apple Mac - Studio M1 Ultra - -Signed-off-by: Janne Grunau ---- - arch/arm64/boot/dts/apple/Makefile | 1 + - arch/arm64/boot/dts/apple/t6002-j375d.dts | 147 ++++++++++++++++++++++ - 2 files changed, 148 insertions(+) - create mode 100644 arch/arm64/boot/dts/apple/t6002-j375d.dts - -diff --git a/arch/arm64/boot/dts/apple/Makefile b/arch/arm64/boot/dts/apple/Makefile -index b3ed42594ecd..5a7506ff5ea3 100644 ---- a/arch/arm64/boot/dts/apple/Makefile -+++ b/arch/arm64/boot/dts/apple/Makefile -@@ -9,3 +9,4 @@ dtb-$(CONFIG_ARCH_APPLE) += t6001-j314c.dtb - dtb-$(CONFIG_ARCH_APPLE) += t6000-j316s.dtb - dtb-$(CONFIG_ARCH_APPLE) += t6001-j316c.dtb - dtb-$(CONFIG_ARCH_APPLE) += t6001-j375c.dtb -+dtb-$(CONFIG_ARCH_APPLE) += t6002-j375d.dtb -diff --git a/arch/arm64/boot/dts/apple/t6002-j375d.dts b/arch/arm64/boot/dts/apple/t6002-j375d.dts -new file mode 100644 -index 000000000000..95e0c3243818 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t6002-j375d.dts -@@ -0,0 +1,147 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Mac Studio (M1 Ultra, 2022) -+ * -+ * target-type: J375d -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/dts-v1/; -+ -+#include "t6002.dtsi" -+ -+/ { -+ compatible = "apple,j375d", "apple,t6002", "apple,arm-platform"; -+ model = "Apple Mac Studio (M1 Ultra, 2022)"; -+ -+ aliases { -+ serial0 = &serial0; -+ wifi0 = &wifi0; -+ }; -+ -+ chosen { -+ #address-cells = <2>; -+ #size-cells = <2>; -+ ranges; -+ -+ stdout-path = "serial0"; -+ -+ framebuffer0: framebuffer@0 { -+ compatible = "apple,simple-framebuffer", "simple-framebuffer"; -+ reg = <0 0 0 0>; /* To be filled by loader */ -+ /* Format properties will be added by loader */ -+ status = "disabled"; -+ }; -+ }; -+ -+ memory@10000000000 { -+ device_type = "memory"; -+ reg = <0x100 0 0x2 0>; /* To be filled by loader */ -+ }; -+}; -+ -+&serial0 { -+ status = "okay"; -+}; -+ -+/* USB Type C */ -+&i2c0 { -+ hpm0: usb-pd@38 { -+ compatible = "apple,cd321x"; -+ reg = <0x38>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ hpm1: usb-pd@3f { -+ compatible = "apple,cd321x"; -+ reg = <0x3f>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ hpm2: usb-pd@3b { -+ compatible = "apple,cd321x"; -+ reg = <0x3b>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ hpm3: usb-pd@3c { -+ compatible = "apple,cd321x"; -+ reg = <0x3c>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ /* front-right */ -+ hpm4: usb-pd@39 { -+ compatible = "apple,cd321x"; -+ reg = <0x39>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+ -+ /* front-left */ -+ hpm5: usb-pd@3a { -+ compatible = "apple,cd321x"; -+ reg = <0x3a>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+}; -+ -+/* PCIe devices */ -+&port00 { -+ /* WLAN */ -+ bus-range = <1 1>; -+ wifi0: wifi@0,0 { -+ reg = <0x10000 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-mac-address = [00 10 18 00 00 10]; -+ }; -+}; -+ -+&port01 { -+ /* SD card reader */ -+ bus-range = <2 2>; -+ sdhci0: mmc@0,0 { -+ compatible = "pci17a0,9755"; -+ reg = <0x20000 0x0 0x0 0x0 0x0>; -+ cd-inverted; -+ wp-inverted; -+ }; -+}; -+ -+&port02 { -+ /* 10 Gbit Ethernet */ -+ bus-range = <3 3>; -+ ethernet0: ethernet@0,0 { -+ reg = <0x30000 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-mac-address = [00 10 18 00 00 00]; -+ }; -+}; -+ -+&port03 { -+ /* USB xHCI */ -+ bus-range = <4 4>; -+}; -+ -+/* delete unused always-on power-domains on die 1 */ -+ -+/delete-node/ &ps_atc2_usb_aon_die1; -+/delete-node/ &ps_atc2_usb_die1; -+ -+/delete-node/ &ps_atc3_usb_aon_die1; -+/delete-node/ &ps_atc3_usb_die1; -+ -+/delete-node/ &ps_disp0_cpu0_die1; -+/delete-node/ &ps_disp0_fe_die1; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0020-arm64-dts-apple-Add-CPUfreq-nodes-for-t6001.patch b/target/linux/silicon/patches-5.19/0020-arm64-dts-apple-Add-CPUfreq-nodes-for-t6001.patch deleted file mode 100644 index a73338cc5..000000000 --- a/target/linux/silicon/patches-5.19/0020-arm64-dts-apple-Add-CPUfreq-nodes-for-t6001.patch +++ /dev/null @@ -1,486 +0,0 @@ -From 0bea0800d5e0e32323bbbe2b2edfe16e08116bc9 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 21:34:10 +0900 -Subject: [PATCH 020/171] arm64: dts: apple: Add CPUfreq nodes for t6001 - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t6001.dtsi | 7 + - arch/arm64/boot/dts/apple/t6002.dtsi | 81 +++++++++ - arch/arm64/boot/dts/apple/t600x-common.dtsi | 188 ++++++++++++++++++++ - arch/arm64/boot/dts/apple/t600x-die0.dtsi | 4 + - 4 files changed, 280 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t6001.dtsi b/arch/arm64/boot/dts/apple/t6001.dtsi -index 620b17e4031f..832e9bedc1fb 100644 ---- a/arch/arm64/boot/dts/apple/t6001.dtsi -+++ b/arch/arm64/boot/dts/apple/t6001.dtsi -@@ -47,6 +47,13 @@ soc { - #undef DIE_NO - - -+&cpufreq_hw { -+ reg = <0x2 0x10e20000 0 0x1000>, -+ <0x2 0x11e20000 0 0x1000>, -+ <0x2 0x12e20000 0 0x1000>; -+ reg-names = "cluster0", "cluster1", "cluster2"; -+}; -+ - &aic { - affinities { - e-core-pmu-affinity { -diff --git a/arch/arm64/boot/dts/apple/t6002.dtsi b/arch/arm64/boot/dts/apple/t6002.dtsi -index 736f16aad70f..f3618df00518 100644 ---- a/arch/arm64/boot/dts/apple/t6002.dtsi -+++ b/arch/arm64/boot/dts/apple/t6002.dtsi -@@ -23,12 +23,56 @@ / { - #size-cells = <2>; - - cpus { -+ cpu-map { -+ cluster3 { -+ core0 { -+ cpu = <&cpu_e10>; -+ }; -+ core1 { -+ cpu = <&cpu_e11>; -+ }; -+ }; -+ -+ cluster4 { -+ core0 { -+ cpu = <&cpu_p20>; -+ }; -+ core1 { -+ cpu = <&cpu_p21>; -+ }; -+ core2 { -+ cpu = <&cpu_p22>; -+ }; -+ core3 { -+ cpu = <&cpu_p23>; -+ }; -+ }; -+ -+ cluster5 { -+ core0 { -+ cpu = <&cpu_p30>; -+ }; -+ core1 { -+ cpu = <&cpu_p31>; -+ }; -+ core2 { -+ cpu = <&cpu_p32>; -+ }; -+ core3 { -+ cpu = <&cpu_p33>; -+ }; -+ }; -+ }; -+ - cpu_e10: cpu@800 { - compatible = "apple,icestorm"; - device_type = "cpu"; - reg = <0x0 0x800>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&icestorm_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 3>; - }; - - cpu_e11: cpu@801 { -@@ -37,6 +81,9 @@ cpu_e11: cpu@801 { - reg = <0x0 0x801>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&icestorm_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 3>; - }; - - cpu_p20: cpu@10900 { -@@ -45,6 +92,9 @@ cpu_p20: cpu@10900 { - reg = <0x0 0x10900>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 4>; - }; - - cpu_p21: cpu@10901 { -@@ -53,6 +103,9 @@ cpu_p21: cpu@10901 { - reg = <0x0 0x10901>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 4>; - }; - - cpu_p22: cpu@10902 { -@@ -61,6 +114,9 @@ cpu_p22: cpu@10902 { - reg = <0x0 0x10902>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 4>; - }; - - cpu_p23: cpu@10903 { -@@ -69,6 +125,9 @@ cpu_p23: cpu@10903 { - reg = <0x0 0x10903>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 4>; - }; - - cpu_p30: cpu@10a00 { -@@ -77,6 +136,9 @@ cpu_p30: cpu@10a00 { - reg = <0x0 0x10a00>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 5>; - }; - - cpu_p31: cpu@10a01 { -@@ -85,6 +147,9 @@ cpu_p31: cpu@10a01 { - reg = <0x0 0x10a01>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 5>; - }; - - cpu_p32: cpu@10a02 { -@@ -93,6 +158,9 @@ cpu_p32: cpu@10a02 { - reg = <0x0 0x10a02>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 5>; - }; - - cpu_p33: cpu@10a03 { -@@ -101,6 +169,9 @@ cpu_p33: cpu@10a03 { - reg = <0x0 0x10a03>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 5>; - }; - }; - -@@ -162,6 +233,16 @@ die1 { - #undef DIE - #undef DIE_NO - -+&cpufreq_hw { -+ reg = <0x2 0x10e20000 0 0x1000>, -+ <0x2 0x11e20000 0 0x1000>, -+ <0x2 0x12e20000 0 0x1000>, -+ <0x22 0x10e20000 0 0x1000>, -+ <0x22 0x11e20000 0 0x1000>, -+ <0x22 0x12e20000 0 0x1000>; -+ reg-names = "cluster0", "cluster1", "cluster2", -+ "cluster3", "cluster4", "cluster5"; -+}; - - &aic { - affinities { -diff --git a/arch/arm64/boot/dts/apple/t600x-common.dtsi b/arch/arm64/boot/dts/apple/t600x-common.dtsi -index e29b88e2c853..06e160880407 100644 ---- a/arch/arm64/boot/dts/apple/t600x-common.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-common.dtsi -@@ -15,12 +15,56 @@ cpus { - #address-cells = <2>; - #size-cells = <0>; - -+ cpu-map { -+ cluster0 { -+ core0 { -+ cpu = <&cpu_e00>; -+ }; -+ core1 { -+ cpu = <&cpu_e01>; -+ }; -+ }; -+ -+ cluster1 { -+ core0 { -+ cpu = <&cpu_p00>; -+ }; -+ core1 { -+ cpu = <&cpu_p01>; -+ }; -+ core2 { -+ cpu = <&cpu_p02>; -+ }; -+ core3 { -+ cpu = <&cpu_p03>; -+ }; -+ }; -+ -+ cluster2 { -+ core0 { -+ cpu = <&cpu_p10>; -+ }; -+ core1 { -+ cpu = <&cpu_p11>; -+ }; -+ core2 { -+ cpu = <&cpu_p12>; -+ }; -+ core3 { -+ cpu = <&cpu_p13>; -+ }; -+ }; -+ }; -+ - cpu_e00: cpu@0 { - compatible = "apple,icestorm"; - device_type = "cpu"; - reg = <0x0 0x0>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&icestorm_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 0>; - }; - - cpu_e01: cpu@1 { -@@ -29,6 +73,9 @@ cpu_e01: cpu@1 { - reg = <0x0 0x1>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&icestorm_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 0>; - }; - - cpu_p00: cpu@10100 { -@@ -37,6 +84,9 @@ cpu_p00: cpu@10100 { - reg = <0x0 0x10100>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; - }; - - cpu_p01: cpu@10101 { -@@ -45,6 +95,9 @@ cpu_p01: cpu@10101 { - reg = <0x0 0x10101>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; - }; - - cpu_p02: cpu@10102 { -@@ -53,6 +106,9 @@ cpu_p02: cpu@10102 { - reg = <0x0 0x10102>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; - }; - - cpu_p03: cpu@10103 { -@@ -61,6 +117,9 @@ cpu_p03: cpu@10103 { - reg = <0x0 0x10103>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; - }; - - cpu_p10: cpu@10200 { -@@ -69,6 +128,9 @@ cpu_p10: cpu@10200 { - reg = <0x0 0x10200>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 2>; - }; - - cpu_p11: cpu@10201 { -@@ -77,6 +139,9 @@ cpu_p11: cpu@10201 { - reg = <0x0 0x10201>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 2>; - }; - - cpu_p12: cpu@10202 { -@@ -85,6 +150,9 @@ cpu_p12: cpu@10202 { - reg = <0x0 0x10202>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 2>; - }; - - cpu_p13: cpu@10203 { -@@ -93,7 +161,127 @@ cpu_p13: cpu@10203 { - reg = <0x0 0x10203>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&firestorm_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 2>; -+ }; -+ }; -+ -+ icestorm_opp: opp-table-0 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp01 { -+ opp-hz = /bits/ 64 <600000000>; -+ opp-level = <1>; -+ clock-latency-ns = <7500>; -+ }; -+ opp02 { -+ opp-hz = /bits/ 64 <972000000>; -+ opp-level = <2>; -+ clock-latency-ns = <23000>; -+ }; -+ opp03 { -+ opp-hz = /bits/ 64 <1332000000>; -+ opp-level = <3>; -+ clock-latency-ns = <29000>; -+ }; -+ opp04 { -+ opp-hz = /bits/ 64 <1704000000>; -+ opp-level = <4>; -+ clock-latency-ns = <40000>; -+ }; -+ opp05 { -+ opp-hz = /bits/ 64 <2064000000>; -+ opp-level = <5>; -+ clock-latency-ns = <50000>; -+ }; -+ }; -+ -+ firestorm_opp: opp-table-1 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp01 { -+ opp-hz = /bits/ 64 <600000000>; -+ opp-level = <1>; -+ clock-latency-ns = <8000>; -+ }; -+ opp02 { -+ opp-hz = /bits/ 64 <828000000>; -+ opp-level = <2>; -+ clock-latency-ns = <18000>; -+ }; -+ opp03 { -+ opp-hz = /bits/ 64 <1056000000>; -+ opp-level = <3>; -+ clock-latency-ns = <19000>; -+ }; -+ opp04 { -+ opp-hz = /bits/ 64 <1296000000>; -+ opp-level = <4>; -+ clock-latency-ns = <23000>; -+ }; -+ opp05 { -+ opp-hz = /bits/ 64 <1524000000>; -+ opp-level = <5>; -+ clock-latency-ns = <24000>; -+ }; -+ opp06 { -+ opp-hz = /bits/ 64 <1752000000>; -+ opp-level = <6>; -+ clock-latency-ns = <28000>; -+ }; -+ opp07 { -+ opp-hz = /bits/ 64 <1980000000>; -+ opp-level = <7>; -+ clock-latency-ns = <31000>; -+ }; -+ opp08 { -+ opp-hz = /bits/ 64 <2208000000>; -+ opp-level = <8>; -+ clock-latency-ns = <45000>; -+ }; -+ opp09 { -+ opp-hz = /bits/ 64 <2448000000>; -+ opp-level = <9>; -+ clock-latency-ns = <49000>; -+ }; -+ opp10 { -+ opp-hz = /bits/ 64 <2676000000>; -+ opp-level = <10>; -+ clock-latency-ns = <53000>; -+ }; -+ opp11 { -+ opp-hz = /bits/ 64 <2904000000>; -+ opp-level = <11>; -+ clock-latency-ns = <56000>; -+ }; -+ opp12 { -+ opp-hz = /bits/ 64 <3036000000>; -+ opp-level = <12>; -+ clock-latency-ns = <56000>; -+ }; -+ /* Not available until CPU deep sleep is implemented -+ opp13 { -+ opp-hz = /bits/ 64 <3132000000>; -+ opp-level = <13>; -+ clock-latency-ns = <56000>; -+ turbo-mode; -+ }; -+ opp14 { -+ opp-hz = /bits/ 64 <3168000000>; -+ opp-level = <14>; -+ clock-latency-ns = <56000>; -+ turbo-mode; -+ }; -+ opp15 { -+ opp-hz = /bits/ 64 <3228000000>; -+ opp-level = <15>; -+ clock-latency-ns = <56000>; -+ turbo-mode; - }; -+ */ - }; - - pmu-e { -diff --git a/arch/arm64/boot/dts/apple/t600x-die0.dtsi b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -index 8131352e3ccd..129984bd9a8b 100644 ---- a/arch/arm64/boot/dts/apple/t600x-die0.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -@@ -6,6 +6,10 @@ - * Copyright The Asahi Linux Contributors - */ - -+ cpufreq_hw: cpufreq@210e20000 { -+ compatible = "apple,t6000-soc-cpufreq", "apple,soc-cpufreq"; -+ #freq-domain-cells = <1>; -+ }; - - aic: interrupt-controller@28e100000 { - compatible = "apple,t6000-aic", "apple,aic2"; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0021-arm64-dts-apple-Add-SMC-node-to-t600x-devicetrees.patch b/target/linux/silicon/patches-5.19/0021-arm64-dts-apple-Add-SMC-node-to-t600x-devicetrees.patch deleted file mode 100644 index a203802cc..000000000 --- a/target/linux/silicon/patches-5.19/0021-arm64-dts-apple-Add-SMC-node-to-t600x-devicetrees.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 7946dbabbfec3116b542268cbb3dcb6b4a5bd9c2 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 4 Feb 2022 12:59:39 +0900 -Subject: [PATCH 021/171] arm64: dts: apple: Add SMC node to t600x devicetrees - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t600x-die0.dtsi | 26 +++++++++++++++++++++++ - 1 file changed, 26 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t600x-die0.dtsi b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -index 129984bd9a8b..6c9649d5a26c 100644 ---- a/arch/arm64/boot/dts/apple/t600x-die0.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -@@ -21,6 +21,32 @@ aic: interrupt-controller@28e100000 { - power-domains = <&ps_aic>; - }; - -+ smc_mbox: mbox@290408000 { -+ compatible = "apple,t6000-asc-mailbox", "apple,asc-mailbox-v4"; -+ reg = <0x2 0x90408000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ ; -+ interrupt-names = "send-empty", "send-not-empty", -+ "recv-empty", "recv-not-empty"; -+ #mbox-cells = <0>; -+ }; -+ -+ smc: smc@290400000 { -+ compatible = "apple,t6000-smc", "apple,smc"; -+ reg = <0x2 0x90400000 0x0 0x4000>, -+ <0x2 0x91e00000 0x0 0x100000>; -+ reg-names = "smc", "sram"; -+ mboxes = <&smc_mbox>; -+ -+ smc_gpio: gpio { -+ gpio-controller; -+ #gpio-cells = <2>; -+ }; -+ }; -+ - pinctrl_smc: pinctrl@290820000 { - compatible = "apple,t6000-pinctrl", "apple,pinctrl"; - reg = <0x2 0x90820000 0x0 0x4000>; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0022-arm64-dts-apple-Add-PMU-NVMEM-and-SMC-RTC-reboot-nod.patch b/target/linux/silicon/patches-5.19/0022-arm64-dts-apple-Add-PMU-NVMEM-and-SMC-RTC-reboot-nod.patch deleted file mode 100644 index 514b2b1b9..000000000 --- a/target/linux/silicon/patches-5.19/0022-arm64-dts-apple-Add-PMU-NVMEM-and-SMC-RTC-reboot-nod.patch +++ /dev/null @@ -1,145 +0,0 @@ -From d2759ec3852ae04e5a6a87d78dd5a52e67e36bbf Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 18:54:35 +0900 -Subject: [PATCH 022/171] arm64: dts: apple: Add PMU NVMEM and SMC RTC/reboot - nodes - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t6001.dtsi | 1 + - arch/arm64/boot/dts/apple/t6002.dtsi | 1 + - arch/arm64/boot/dts/apple/t600x-die0.dtsi | 87 +++++++++++++++++++++++ - 3 files changed, 89 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t6001.dtsi b/arch/arm64/boot/dts/apple/t6001.dtsi -index 832e9bedc1fb..6b50a9fa68e7 100644 ---- a/arch/arm64/boot/dts/apple/t6001.dtsi -+++ b/arch/arm64/boot/dts/apple/t6001.dtsi -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - - #include "multi-die-cpp.h" - -diff --git a/arch/arm64/boot/dts/apple/t6002.dtsi b/arch/arm64/boot/dts/apple/t6002.dtsi -index f3618df00518..31e2de7fb2ea 100644 ---- a/arch/arm64/boot/dts/apple/t6002.dtsi -+++ b/arch/arm64/boot/dts/apple/t6002.dtsi -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - - #include "multi-die-cpp.h" - -diff --git a/arch/arm64/boot/dts/apple/t600x-die0.dtsi b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -index 6c9649d5a26c..928da6734371 100644 ---- a/arch/arm64/boot/dts/apple/t600x-die0.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -@@ -45,6 +45,18 @@ smc_gpio: gpio { - gpio-controller; - #gpio-cells = <2>; - }; -+ -+ smc_rtc: rtc { -+ nvmem-cells = <&rtc_offset>; -+ nvmem-cell-names = "rtc_offset"; -+ }; -+ -+ smc_reboot: reboot { -+ nvmem-cells = <&shutdown_flag>, <&boot_stage>, -+ <&boot_error_count>, <&panic_count>, <&pm_setting>; -+ nvmem-cell-names = "shutdown_flag", "boot_stage", -+ "boot_error_count", "panic_count", "pm_setting"; -+ }; - }; - - pinctrl_smc: pinctrl@290820000 { -@@ -76,6 +88,81 @@ wdt: watchdog@2922b0000 { - interrupts = ; - }; - -+ nub_spmi0: spmi@2920a1300 { -+ compatible = "apple,t6000-spmi", "apple,spmi"; -+ reg = <0x2 0x920a1300 0x0 0x100>; -+ #address-cells = <2>; -+ #size-cells = <0>; -+ -+ pmu1: pmu@f { -+ compatible = "apple,maverick-pmu", "apple,spmi-pmu"; -+ reg = <0xf SPMI_USID>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ rtc_nvmem@1400 { -+ compatible = "apple,spmi-pmu-nvmem"; -+ reg = <0x1400 0x20>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ pm_setting: pm-setting@5 { -+ reg = <0x5 0x1>; -+ }; -+ -+ rtc_offset: rtc-offset@11 { -+ reg = <0x11 0x6>; -+ }; -+ }; -+ -+ legacy_nvmem@6000 { -+ compatible = "apple,spmi-pmu-nvmem"; -+ reg = <0x6000 0x20>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ boot_stage: boot-stage@1 { -+ reg = <0x1 0x1>; -+ }; -+ -+ boot_error_count: boot-error-count@2 { -+ reg = <0x2 0x1>; -+ bits = <0 4>; -+ }; -+ -+ panic_count: panic-count@2 { -+ reg = <0x2 0x1>; -+ bits = <4 4>; -+ }; -+ -+ boot_error_stage: boot-error-stage@3 { -+ reg = <0x3 0x1>; -+ }; -+ -+ shutdown_flag: shutdown-flag@f { -+ reg = <0xf 0x1>; -+ bits = <3 1>; -+ }; -+ }; -+ -+ scrpad_nvmem@8000 { -+ compatible = "apple,spmi-pmu-nvmem"; -+ reg = <0x8000 0x1000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ fault_shadow: fault-shadow@67b { -+ reg = <0x67b 0x10>; -+ }; -+ -+ socd: socd@b00 { -+ reg = <0xb00 0x400>; -+ }; -+ }; -+ -+ }; -+ }; -+ - i2c0: i2c@39b040000 { - compatible = "apple,t6000-i2c", "apple,i2c"; - reg = <0x3 0x9b040000 0x0 0x4000>; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0023-arm64-dts-apple-t6000-Add-spi1-node.patch b/target/linux/silicon/patches-5.19/0023-arm64-dts-apple-t6000-Add-spi1-node.patch deleted file mode 100644 index 400c56cee..000000000 --- a/target/linux/silicon/patches-5.19/0023-arm64-dts-apple-t6000-Add-spi1-node.patch +++ /dev/null @@ -1,74 +0,0 @@ -From b04e8cf77375704a101a7bcaa485973702cbbc92 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 9 Dec 2021 21:58:10 +0900 -Subject: [PATCH 023/171] arm64: dts: apple: t6000: Add spi1 node - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t600x-common.dtsi | 7 +++++++ - arch/arm64/boot/dts/apple/t600x-die0.dtsi | 14 ++++++++++++++ - arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi | 7 +++++++ - 3 files changed, 28 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t600x-common.dtsi b/arch/arm64/boot/dts/apple/t600x-common.dtsi -index 06e160880407..c5ee0c2da778 100644 ---- a/arch/arm64/boot/dts/apple/t600x-common.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-common.dtsi -@@ -313,4 +313,11 @@ clkref: clock-ref { - clock-output-names = "clkref"; - }; - -+ clk_200m: clock-200m { -+ compatible = "fixed-clock"; -+ #clock-cells = <0>; -+ clock-frequency = <200000000>; -+ clock-output-names = "clk_200m"; -+ }; -+ - }; -diff --git a/arch/arm64/boot/dts/apple/t600x-die0.dtsi b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -index 928da6734371..96f8c2189f03 100644 ---- a/arch/arm64/boot/dts/apple/t600x-die0.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -@@ -246,6 +246,20 @@ i2c5: i2c@39b054000 { - status = "disabled"; - }; - -+ spi1: spi@39b104000 { -+ compatible = "apple,t6000-spi", "apple,spi"; -+ reg = <0x3 0x9b104000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ clocks = <&clk_200m>; -+ pinctrl-0 = <&spi1_pins>; -+ pinctrl-names = "default"; -+ power-domains = <&ps_spi1>; -+ status = "disabled"; -+ }; -+ - serial0: serial@39b200000 { - compatible = "apple,s5l-uart"; - reg = <0x3 0x9b200000 0x0 0x1000>; -diff --git a/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi b/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi -index b31f1a7a2b3f..855dcf30a502 100644 ---- a/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi -@@ -36,6 +36,13 @@ i2c5_pins: i2c5-pins { - ; - }; - -+ spi1_pins: spi1-pins { -+ pinmux = , -+ , -+ , -+ ; -+ }; -+ - pcie_pins: pcie-pins { - pinmux = , - , --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0024-arm64-dts-apple-t600x-j314-j316-Add-NOR-flash-node.patch b/target/linux/silicon/patches-5.19/0024-arm64-dts-apple-t600x-j314-j316-Add-NOR-flash-node.patch deleted file mode 100644 index bef7a0f32..000000000 --- a/target/linux/silicon/patches-5.19/0024-arm64-dts-apple-t600x-j314-j316-Add-NOR-flash-node.patch +++ /dev/null @@ -1,37 +0,0 @@ -From e2a083f709ff6669836587d592b313d7349d0525 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 9 Dec 2021 21:58:29 +0900 -Subject: [PATCH 024/171] arm64: dts: apple: t600x-j314-j316: Add NOR flash - node - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -index 8079200aeb12..55457892c38e 100644 ---- a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -@@ -76,6 +76,18 @@ hpm5: usb-pd@3a { - }; - }; - -+&spi1 { -+ status = "disabled"; -+ -+ flash@0 { -+ compatible = "jedec,spi-nor"; -+ reg = <0x0>; -+ spi-max-frequency = <25000000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ }; -+}; -+ - /* PCIe devices */ - &port00 { - /* WLAN */ --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0025-arm64-dts-apple-t600x-Add-spi3-node.patch b/target/linux/silicon/patches-5.19/0025-arm64-dts-apple-t600x-Add-spi3-node.patch deleted file mode 100644 index 8fc71f522..000000000 --- a/target/linux/silicon/patches-5.19/0025-arm64-dts-apple-t600x-Add-spi3-node.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 2beaa67dcf1275232f6f52f104d321818289c159 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Thu, 11 Nov 2021 21:31:21 +0100 -Subject: [PATCH 025/171] arm64: dts: apple: t600x: Add spi3 node - -Used for keyboard and touchpad input on MacBook Pro (14/16-inch, -M1 Pro/Max, 2021). - -Signed-off-by: Janne Grunau ---- - arch/arm64/boot/dts/apple/t600x-die0.dtsi | 14 ++++++++++++++ - arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi | 7 +++++++ - 2 files changed, 21 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t600x-die0.dtsi b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -index 96f8c2189f03..b549059a3320 100644 ---- a/arch/arm64/boot/dts/apple/t600x-die0.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -@@ -260,6 +260,20 @@ spi1: spi@39b104000 { - status = "disabled"; - }; - -+ spi3: spi@39b10c000 { -+ compatible = "apple,t6000-spi", "apple,spi"; -+ reg = <0x3 0x9b10c000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ clocks = <&clkref>; -+ pinctrl-0 = <&spi3_pins>; -+ pinctrl-names = "default"; -+ power-domains = <&ps_spi3>; -+ status = "disabled"; -+ }; -+ - serial0: serial@39b200000 { - compatible = "apple,s5l-uart"; - reg = <0x3 0x9b200000 0x0 0x1000>; -diff --git a/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi b/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi -index 855dcf30a502..1a994c3c1b79 100644 ---- a/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-gpio-pins.dtsi -@@ -43,6 +43,13 @@ spi1_pins: spi1-pins { - ; - }; - -+ spi3_pins: spi3-pins { -+ pinmux = , -+ , -+ , -+ ; -+ }; -+ - pcie_pins: pcie-pins { - pinmux = , - , --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0026-arm64-dts-apple-j31-46-Add-keyboard-nodes.patch b/target/linux/silicon/patches-5.19/0026-arm64-dts-apple-j31-46-Add-keyboard-nodes.patch deleted file mode 100644 index 3c87f3188..000000000 --- a/target/linux/silicon/patches-5.19/0026-arm64-dts-apple-j31-46-Add-keyboard-nodes.patch +++ /dev/null @@ -1,47 +0,0 @@ -From aec68ba09ead15a0b2b0fc47809146e2fa28ccf5 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Thu, 11 Nov 2021 21:31:21 +0100 -Subject: [PATCH 026/171] arm64: dts: apple: j31[46]: Add keyboard nodes - -Enables keyboard and touchpad input on MacBook Pro (14/16-inch, -M1 Pro/Max, 2021). - -Signed-off-by: Janne Grunau ---- - .../arm64/boot/dts/apple/t600x-j314-j316.dtsi | 20 +++++++++++++++++++ - 1 file changed, 20 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -index 55457892c38e..64280ed76feb 100644 ---- a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -@@ -88,6 +88,26 @@ flash@0 { - }; - }; - -+&spi3 { -+ status = "okay"; -+ -+ hid-transport@0 { -+ compatible = "apple,spi-hid-transport"; -+ reg = <0>; -+ spi-max-frequency = <8000000>; -+ /* -+ * cs-setup and cs-hold delays are derived from Apple's ADT -+ * Mac OS driver meta data secify 45 us for 'cs to clock' and -+ * 'clock to cs' delays. -+ */ -+ spi-cs-setup-delay-ns = <20000>; -+ spi-cs-hold-delay-ns = <20000>; -+ spi-cs-inactive-delay-ns = <250000>; -+ spien-gpios = <&pinctrl_ap 194 0>; -+ interrupts-extended = <&pinctrl_nub 6 IRQ_TYPE_LEVEL_LOW>; -+ }; -+}; -+ - /* PCIe devices */ - &port00 { - /* WLAN */ --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0027-arm64-dts-apple-t600x-Add-dwc3-nodes.patch b/target/linux/silicon/patches-5.19/0027-arm64-dts-apple-t600x-Add-dwc3-nodes.patch deleted file mode 100644 index 60903303e..000000000 --- a/target/linux/silicon/patches-5.19/0027-arm64-dts-apple-t600x-Add-dwc3-nodes.patch +++ /dev/null @@ -1,631 +0,0 @@ -From e000de0d79a99fe707b8c86b8ae4f19b6e6cc78e Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Tue, 17 May 2022 23:54:26 +0200 -Subject: [PATCH 027/171] arm64: dts: apple: t600x: Add dwc3 nodes - -Signed-off-by: Janne Grunau ---- - arch/arm64/boot/dts/apple/t6001-j375c.dts | 105 +++++++++++ - arch/arm64/boot/dts/apple/t6002-j375d.dts | 168 ++++++++++++++++++ - arch/arm64/boot/dts/apple/t600x-dieX.dtsi | 124 +++++++++++++ - .../arm64/boot/dts/apple/t600x-j314-j316.dtsi | 92 ++++++++++ - 4 files changed, 489 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t6001-j375c.dts b/arch/arm64/boot/dts/apple/t6001-j375c.dts -index 961104d6bd9a..7ab07808a5e9 100644 ---- a/arch/arm64/boot/dts/apple/t6001-j375c.dts -+++ b/arch/arm64/boot/dts/apple/t6001-j375c.dts -@@ -53,6 +53,24 @@ hpm0: usb-pd@38 { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec0: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Back Left"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec0_con_hs: endpoint { -+ remote-endpoint = <&typec0_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - hpm1: usb-pd@3f { -@@ -61,6 +79,24 @@ hpm1: usb-pd@3f { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec1: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Back Left Middle"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec1_con_hs: endpoint { -+ remote-endpoint = <&typec1_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - hpm2: usb-pd@3b { -@@ -69,6 +105,24 @@ hpm2: usb-pd@3b { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec2: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Back Right Middle"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec2_con_hs: endpoint { -+ remote-endpoint = <&typec2_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - hpm3: usb-pd@3c { -@@ -77,6 +131,24 @@ hpm3: usb-pd@3c { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec3: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Back Right"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec3_con_hs: endpoint { -+ remote-endpoint = <&typec3_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - }; - -@@ -116,3 +188,36 @@ &port03 { - /* USB xHCI */ - bus-range = <4 4>; - }; -+ -+/* USB controllers */ -+&dwc3_0 { -+ port { -+ typec0_usb_hs: endpoint { -+ remote-endpoint = <&typec0_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_1 { -+ port { -+ typec1_usb_hs: endpoint { -+ remote-endpoint = <&typec1_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_2 { -+ port { -+ typec2_usb_hs: endpoint { -+ remote-endpoint = <&typec2_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_3 { -+ port { -+ typec3_usb_hs: endpoint { -+ remote-endpoint = <&typec3_con_hs>; -+ }; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6002-j375d.dts b/arch/arm64/boot/dts/apple/t6002-j375d.dts -index 95e0c3243818..ed88e1eaf7bb 100644 ---- a/arch/arm64/boot/dts/apple/t6002-j375d.dts -+++ b/arch/arm64/boot/dts/apple/t6002-j375d.dts -@@ -53,6 +53,24 @@ hpm0: usb-pd@38 { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec0: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Back Left"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec0_con_hs: endpoint { -+ remote-endpoint = <&typec0_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - hpm1: usb-pd@3f { -@@ -61,6 +79,24 @@ hpm1: usb-pd@3f { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec1: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Back Left Middle"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec1_con_hs: endpoint { -+ remote-endpoint = <&typec1_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - hpm2: usb-pd@3b { -@@ -69,6 +105,24 @@ hpm2: usb-pd@3b { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec2: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Back Right Middle"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec2_con_hs: endpoint { -+ remote-endpoint = <&typec2_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - hpm3: usb-pd@3c { -@@ -77,6 +131,24 @@ hpm3: usb-pd@3c { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec3: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Back Right"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec3_con_hs: endpoint { -+ remote-endpoint = <&typec3_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - /* front-right */ -@@ -86,6 +158,24 @@ hpm4: usb-pd@39 { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec4: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Front Right"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec4_con_hs: endpoint { -+ remote-endpoint = <&typec4_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - /* front-left */ -@@ -95,6 +185,24 @@ hpm5: usb-pd@3a { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec5: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Front Left"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec5_con_hs: endpoint { -+ remote-endpoint = <&typec5_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - }; - -@@ -135,6 +243,66 @@ &port03 { - bus-range = <4 4>; - }; - -+/* USB controllers */ -+&dwc3_0 { -+ port { -+ typec0_usb_hs: endpoint { -+ remote-endpoint = <&typec0_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_1 { -+ port { -+ typec1_usb_hs: endpoint { -+ remote-endpoint = <&typec1_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_2 { -+ port { -+ typec2_usb_hs: endpoint { -+ remote-endpoint = <&typec2_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_3 { -+ port { -+ typec3_usb_hs: endpoint { -+ remote-endpoint = <&typec3_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_0_die1 { -+ port { -+ typec4_usb_hs: endpoint { -+ remote-endpoint = <&typec4_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_1_die1 { -+ port { -+ typec5_usb_hs: endpoint { -+ remote-endpoint = <&typec5_con_hs>; -+ }; -+ }; -+}; -+ -+/* delete unused USB nodes on die 1 */ -+ -+/delete-node/ &dwc3_2_dart_0_die1; -+/delete-node/ &dwc3_2_dart_1_die1; -+/delete-node/ &dwc3_2_die1; -+ -+/delete-node/ &dwc3_3_dart_0_die1; -+/delete-node/ &dwc3_3_dart_1_die1; -+/delete-node/ &dwc3_3_die1; -+ -+ - /* delete unused always-on power-domains on die 1 */ - - /delete-node/ &ps_atc2_usb_aon_die1; -diff --git a/arch/arm64/boot/dts/apple/t600x-dieX.dtsi b/arch/arm64/boot/dts/apple/t600x-dieX.dtsi -index 0a437b68e86c..6ada6c7f50fa 100644 ---- a/arch/arm64/boot/dts/apple/t600x-dieX.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-dieX.dtsi -@@ -101,3 +101,127 @@ DIE_NODE(pinctrl_ap): pinctrl@39b028000 { - interrupt-controller; - #interrupt-cells = <2>; - }; -+ -+ DIE_NODE(dwc3_0_dart_0): iommu@702f00000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0x7 0x02f00000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&DIE_NODE(ps_atc0_usb)>; -+ #iommu-cells = <1>; -+ }; -+ -+ DIE_NODE(dwc3_0_dart_1): iommu@702f80000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0x7 0x02f80000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&DIE_NODE(ps_atc0_usb)>; -+ #iommu-cells = <1>; -+ }; -+ -+ DIE_NODE(dwc3_0): usb@702280000 { -+ compatible = "apple,t6000-dwc3", "apple,dwc3", "snps,dwc3"; -+ reg = <0x7 0x02280000 0x0 0x100000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ /* dr_mode = "otg"; */ -+ usb-role-switch; -+ role-switch-default-mode = "host"; -+ iommus = <&DIE_NODE(dwc3_0_dart_0) 0>, -+ <&DIE_NODE(dwc3_0_dart_1) 1>; -+ power-domains = <&DIE_NODE(ps_atc0_usb)>; -+ }; -+ -+ DIE_NODE(dwc3_1_dart_0): iommu@b02f00000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0xb 0x02f00000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&DIE_NODE(ps_atc1_usb)>; -+ #iommu-cells = <1>; -+ }; -+ -+ DIE_NODE(dwc3_1_dart_1): iommu@b02f80000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0xb 0x02f80000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&DIE_NODE(ps_atc1_usb)>; -+ #iommu-cells = <1>; -+ }; -+ -+ DIE_NODE(dwc3_1): usb@b02280000 { -+ compatible = "apple,t6000-dwc3", "apple,dwc3", "snps,dwc3"; -+ reg = <0xb 0x02280000 0x0 0x100000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ /* dr_mode = "otg"; */ -+ usb-role-switch; -+ role-switch-default-mode = "host"; -+ iommus = <&DIE_NODE(dwc3_1_dart_0) 0>, -+ <&DIE_NODE(dwc3_1_dart_1) 1>; -+ power-domains = <&DIE_NODE(ps_atc1_usb)>; -+ }; -+ -+ DIE_NODE(dwc3_2_dart_0): iommu@f02f00000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0xf 0x02f00000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&DIE_NODE(ps_atc2_usb)>; -+ #iommu-cells = <1>; -+ }; -+ -+ DIE_NODE(dwc3_2_dart_1): iommu@f02f80000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0xf 0x02f80000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&DIE_NODE(ps_atc2_usb)>; -+ #iommu-cells = <1>; -+ }; -+ -+ DIE_NODE(dwc3_2): usb@f02280000 { -+ compatible = "apple,t6000-dwc3", "apple,dwc3", "snps,dwc3"; -+ reg = <0xf 0x02280000 0x0 0x100000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ /* dr_mode = "otg"; */ -+ usb-role-switch; -+ role-switch-default-mode = "host"; -+ iommus = <&DIE_NODE(dwc3_2_dart_0) 0>, -+ <&DIE_NODE(dwc3_2_dart_1) 1>; -+ power-domains = <&DIE_NODE(ps_atc2_usb)>; -+ }; -+ -+ DIE_NODE(dwc3_3_dart_0): iommu@1302f00000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0x13 0x02f00000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&DIE_NODE(ps_atc3_usb)>; -+ #iommu-cells = <1>; -+ }; -+ -+ DIE_NODE(dwc3_3_dart_1): iommu@1302f80000 { -+ compatible = "apple,t6000-dart"; -+ reg = <0x13 0x02f80000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&DIE_NODE(ps_atc3_usb)>; -+ #iommu-cells = <1>; -+ }; -+ -+ DIE_NODE(dwc3_3): usb@1302280000 { -+ compatible = "apple,t6000-dwc3", "apple,dwc3", "snps,dwc3"; -+ reg = <0x13 0x02280000 0x0 0x100000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ /* dr_mode = "otg"; */ -+ usb-role-switch; -+ role-switch-default-mode = "host"; -+ iommus = <&DIE_NODE(dwc3_3_dart_0) 0>, -+ <&DIE_NODE(dwc3_3_dart_1) 1>; -+ power-domains = <&DIE_NODE(ps_atc3_usb)>; -+ }; -diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -index 64280ed76feb..1582a4caccdb 100644 ---- a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -@@ -48,6 +48,24 @@ hpm0: usb-pd@38 { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec0: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Left Rear"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec0_con_hs: endpoint { -+ remote-endpoint = <&typec0_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - hpm1: usb-pd@3f { -@@ -56,6 +74,24 @@ hpm1: usb-pd@3f { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec1: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Left Front"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec1_con_hs: endpoint { -+ remote-endpoint = <&typec1_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - hpm2: usb-pd@3b { -@@ -64,6 +100,24 @@ hpm2: usb-pd@3b { - interrupt-parent = <&pinctrl_ap>; - interrupts = <174 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; -+ -+ typec2: connector { -+ compatible = "usb-c-connector"; -+ label = "USB-C Right"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec2_con_hs: endpoint { -+ remote-endpoint = <&typec2_usb_hs>; -+ }; -+ }; -+ }; -+ }; - }; - - /* MagSafe port */ -@@ -140,3 +194,41 @@ &pcie0_dart_3 { - - /delete-node/ &port02; - /delete-node/ &port03; -+ -+/* USB controllers */ -+&dwc3_0 { -+ port { -+ typec0_usb_hs: endpoint { -+ remote-endpoint = <&typec0_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_1 { -+ port { -+ typec1_usb_hs: endpoint { -+ remote-endpoint = <&typec1_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_2 { -+ port { -+ typec2_usb_hs: endpoint { -+ remote-endpoint = <&typec2_con_hs>; -+ }; -+ }; -+}; -+ -+/* ATC3 is used for DisplayPort -> HDMI only */ -+&dwc3_3_dart_0 { -+ status = "disabled"; -+}; -+ -+&dwc3_3_dart_1 { -+ status = "disabled"; -+}; -+ -+&dwc3_3 { -+ status = "disabled"; -+}; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0028-arm64-dts-apple-Add-WiFi-module-and-antenna-properti.patch b/target/linux/silicon/patches-5.19/0028-arm64-dts-apple-Add-WiFi-module-and-antenna-properti.patch deleted file mode 100644 index fbb38dd06..000000000 --- a/target/linux/silicon/patches-5.19/0028-arm64-dts-apple-Add-WiFi-module-and-antenna-properti.patch +++ /dev/null @@ -1,141 +0,0 @@ -From 114701eecdf46c638d373e6cd3c7af3a6f61dbfe Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:07:17 +0900 -Subject: [PATCH 028/171] arm64: dts: apple: Add WiFi module and antenna - properties - -Add the new module-instance/antenna-sku properties required to select -WiFi firmwares properly to all board device trees. - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t6000-j314s.dts | 4 ++++ - arch/arm64/boot/dts/apple/t6000-j316s.dts | 4 ++++ - arch/arm64/boot/dts/apple/t6001-j314c.dts | 4 ++++ - arch/arm64/boot/dts/apple/t6001-j316c.dts | 4 ++++ - arch/arm64/boot/dts/apple/t6001-j375c.dts | 6 ++++++ - arch/arm64/boot/dts/apple/t6002-j375d.dts | 6 ++++++ - arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi | 2 ++ - 7 files changed, 30 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t6000-j314s.dts b/arch/arm64/boot/dts/apple/t6000-j314s.dts -index c9e192848fe3..ac35870ca129 100644 ---- a/arch/arm64/boot/dts/apple/t6000-j314s.dts -+++ b/arch/arm64/boot/dts/apple/t6000-j314s.dts -@@ -16,3 +16,7 @@ / { - compatible = "apple,j314s", "apple,t6000", "apple,arm-platform"; - model = "Apple MacBook Pro (14-inch, M1 Pro, 2021)"; - }; -+ -+&wifi0 { -+ brcm,board-type = "apple,maldives"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6000-j316s.dts b/arch/arm64/boot/dts/apple/t6000-j316s.dts -index ff1803ce2300..77d6d8c14d74 100644 ---- a/arch/arm64/boot/dts/apple/t6000-j316s.dts -+++ b/arch/arm64/boot/dts/apple/t6000-j316s.dts -@@ -16,3 +16,7 @@ / { - compatible = "apple,j316s", "apple,t6000", "apple,arm-platform"; - model = "Apple MacBook Pro (16-inch, M1 Pro, 2021)"; - }; -+ -+&wifi0 { -+ brcm,board-type = "apple,madagascar"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6001-j314c.dts b/arch/arm64/boot/dts/apple/t6001-j314c.dts -index 1761d15b98c1..0a5655792a8f 100644 ---- a/arch/arm64/boot/dts/apple/t6001-j314c.dts -+++ b/arch/arm64/boot/dts/apple/t6001-j314c.dts -@@ -16,3 +16,7 @@ / { - compatible = "apple,j314c", "apple,t6001", "apple,arm-platform"; - model = "Apple MacBook Pro (14-inch, M1 Max, 2021)"; - }; -+ -+&wifi0 { -+ brcm,board-type = "apple,maldives"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6001-j316c.dts b/arch/arm64/boot/dts/apple/t6001-j316c.dts -index 750e9beeffc0..9c215531ea54 100644 ---- a/arch/arm64/boot/dts/apple/t6001-j316c.dts -+++ b/arch/arm64/boot/dts/apple/t6001-j316c.dts -@@ -16,3 +16,7 @@ / { - compatible = "apple,j316c", "apple,t6001", "apple,arm-platform"; - model = "Apple MacBook Pro (16-inch, M1 Max, 2021)"; - }; -+ -+&wifi0 { -+ brcm,board-type = "apple,madagascar"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6001-j375c.dts b/arch/arm64/boot/dts/apple/t6001-j375c.dts -index 7ab07808a5e9..15d26674a310 100644 ---- a/arch/arm64/boot/dts/apple/t6001-j375c.dts -+++ b/arch/arm64/boot/dts/apple/t6001-j375c.dts -@@ -157,9 +157,11 @@ &port00 { - /* WLAN */ - bus-range = <1 1>; - wifi0: wifi@0,0 { -+ compatible = "pci14e4,4433"; - reg = <0x10000 0x0 0x0 0x0 0x0>; - /* To be filled by the loader */ - local-mac-address = [00 10 18 00 00 10]; -+ apple,antenna-sku = "XX"; - }; - }; - -@@ -189,6 +191,10 @@ &port03 { - bus-range = <4 4>; - }; - -+&wifi0 { -+ brcm,board-type = "apple,okinawa"; -+}; -+ - /* USB controllers */ - &dwc3_0 { - port { -diff --git a/arch/arm64/boot/dts/apple/t6002-j375d.dts b/arch/arm64/boot/dts/apple/t6002-j375d.dts -index ed88e1eaf7bb..4b84652e0334 100644 ---- a/arch/arm64/boot/dts/apple/t6002-j375d.dts -+++ b/arch/arm64/boot/dts/apple/t6002-j375d.dts -@@ -211,9 +211,11 @@ &port00 { - /* WLAN */ - bus-range = <1 1>; - wifi0: wifi@0,0 { -+ compatible = "pci14e4,4433"; - reg = <0x10000 0x0 0x0 0x0 0x0>; - /* To be filled by the loader */ - local-mac-address = [00 10 18 00 00 10]; -+ apple,antenna-sku = "XX"; - }; - }; - -@@ -243,6 +245,10 @@ &port03 { - bus-range = <4 4>; - }; - -+&wifi0 { -+ brcm,board-type = "apple,okinawa"; -+}; -+ - /* USB controllers */ - &dwc3_0 { - port { -diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -index 1582a4caccdb..0296506c043b 100644 ---- a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -@@ -167,9 +167,11 @@ &port00 { - /* WLAN */ - bus-range = <1 1>; - wifi0: wifi@0,0 { -+ compatible = "pci14e4,4433"; - reg = <0x10000 0x0 0x0 0x0 0x0>; - /* To be filled by the loader */ - local-mac-address = [00 10 18 00 00 10]; -+ apple,antenna-sku = "XX"; - }; - }; - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0029-arm64-dts-apple-Add-PCI-power-enable-GPIOs.patch b/target/linux/silicon/patches-5.19/0029-arm64-dts-apple-Add-PCI-power-enable-GPIOs.patch deleted file mode 100644 index 9af585153..000000000 --- a/target/linux/silicon/patches-5.19/0029-arm64-dts-apple-Add-PCI-power-enable-GPIOs.patch +++ /dev/null @@ -1,97 +0,0 @@ -From e1a42fe74f4db0536b104053abc6e28097803873 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 6 Feb 2022 21:22:29 +0900 -Subject: [PATCH 029/171] arm64: dts: apple: Add PCI power enable GPIOs - -t8103: -- WLAN (SMC PMU GPIO #13) -t600x: -- WLAN (SMC PMU GPIO #13) -- SD (SMC PMU GPIO #26) - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t6001-j375c.dts | 3 +++ - arch/arm64/boot/dts/apple/t6002-j375d.dts | 3 +++ - arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi | 2 ++ - 3 files changed, 8 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t6001-j375c.dts b/arch/arm64/boot/dts/apple/t6001-j375c.dts -index 15d26674a310..561a9a4c2bc1 100644 ---- a/arch/arm64/boot/dts/apple/t6001-j375c.dts -+++ b/arch/arm64/boot/dts/apple/t6001-j375c.dts -@@ -156,6 +156,7 @@ typec3_con_hs: endpoint { - &port00 { - /* WLAN */ - bus-range = <1 1>; -+ pwren-gpios = <&smc_gpio 13 GPIO_ACTIVE_HIGH>; - wifi0: wifi@0,0 { - compatible = "pci14e4,4433"; - reg = <0x10000 0x0 0x0 0x0 0x0>; -@@ -168,6 +169,7 @@ wifi0: wifi@0,0 { - &port01 { - /* SD card reader */ - bus-range = <2 2>; -+ pwren-gpios = <&smc_gpio 26 GPIO_ACTIVE_HIGH>; - sdhci0: mmc@0,0 { - compatible = "pci17a0,9755"; - reg = <0x20000 0x0 0x0 0x0 0x0>; -@@ -189,6 +191,7 @@ ethernet0: ethernet@0,0 { - &port03 { - /* USB xHCI */ - bus-range = <4 4>; -+ pwren-gpios = <&smc_gpio 20 GPIO_ACTIVE_HIGH>; - }; - - &wifi0 { -diff --git a/arch/arm64/boot/dts/apple/t6002-j375d.dts b/arch/arm64/boot/dts/apple/t6002-j375d.dts -index 4b84652e0334..72070e9a3277 100644 ---- a/arch/arm64/boot/dts/apple/t6002-j375d.dts -+++ b/arch/arm64/boot/dts/apple/t6002-j375d.dts -@@ -210,6 +210,7 @@ typec5_con_hs: endpoint { - &port00 { - /* WLAN */ - bus-range = <1 1>; -+ pwren-gpios = <&smc_gpio 13 GPIO_ACTIVE_HIGH>; - wifi0: wifi@0,0 { - compatible = "pci14e4,4433"; - reg = <0x10000 0x0 0x0 0x0 0x0>; -@@ -222,6 +223,7 @@ wifi0: wifi@0,0 { - &port01 { - /* SD card reader */ - bus-range = <2 2>; -+ pwren-gpios = <&smc_gpio 26 GPIO_ACTIVE_HIGH>; - sdhci0: mmc@0,0 { - compatible = "pci17a0,9755"; - reg = <0x20000 0x0 0x0 0x0 0x0>; -@@ -243,6 +245,7 @@ ethernet0: ethernet@0,0 { - &port03 { - /* USB xHCI */ - bus-range = <4 4>; -+ pwren-gpios = <&smc_gpio 20 GPIO_ACTIVE_HIGH>; - }; - - &wifi0 { -diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -index 0296506c043b..21608ca46a55 100644 ---- a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -@@ -166,6 +166,7 @@ hid-transport@0 { - &port00 { - /* WLAN */ - bus-range = <1 1>; -+ pwren-gpios = <&smc_gpio 13 GPIO_ACTIVE_HIGH>; - wifi0: wifi@0,0 { - compatible = "pci14e4,4433"; - reg = <0x10000 0x0 0x0 0x0 0x0>; -@@ -178,6 +179,7 @@ wifi0: wifi@0,0 { - &port01 { - /* SD card reader */ - bus-range = <2 2>; -+ pwren-gpios = <&smc_gpio 26 GPIO_ACTIVE_HIGH>; - sdhci0: mmc@0,0 { - compatible = "pci17a0,9755"; - reg = <0x20000 0x0 0x0 0x0 0x0>; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0030-arm64-dts-apple-Add-backlight-node-to-j314-j316.patch b/target/linux/silicon/patches-5.19/0030-arm64-dts-apple-Add-backlight-node-to-j314-j316.patch deleted file mode 100644 index c8082955a..000000000 --- a/target/linux/silicon/patches-5.19/0030-arm64-dts-apple-Add-backlight-node-to-j314-j316.patch +++ /dev/null @@ -1,37 +0,0 @@ -From fa4bcbf275b4c864bdf5506e44369e9a982d8bc4 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 3 Mar 2022 03:24:36 +0900 -Subject: [PATCH 030/171] arm64: dts: apple: Add backlight node to j314/j316 - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -index 21608ca46a55..c5241d5515cf 100644 ---- a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -@@ -26,6 +26,7 @@ framebuffer0: framebuffer@0 { - compatible = "apple,simple-framebuffer", "simple-framebuffer"; - reg = <0 0 0 0>; /* To be filled by loader */ - /* Format properties will be added by loader */ -+ backlight = <&backlight>; - status = "disabled"; - }; - }; -@@ -236,3 +237,11 @@ &dwc3_3_dart_1 { - &dwc3_3 { - status = "disabled"; - }; -+ -+/ { -+ backlight: gpio-bl { -+ compatible = "gpio-backlight"; -+ gpios = <&smc_gpio 19 GPIO_ACTIVE_HIGH>; -+ default-on; -+ }; -+}; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0031-arm64-dts-apple-t600-Put-in-audio-nodes.patch b/target/linux/silicon/patches-5.19/0031-arm64-dts-apple-t600-Put-in-audio-nodes.patch deleted file mode 100644 index ccf0836a4..000000000 --- a/target/linux/silicon/patches-5.19/0031-arm64-dts-apple-t600-Put-in-audio-nodes.patch +++ /dev/null @@ -1,96 +0,0 @@ -From c0ab64753e9a149b5c97f42110b5ff21d0d6322f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Fri, 11 Mar 2022 22:16:25 +0100 -Subject: [PATCH 031/171] arm64: dts: apple: t600*: Put in audio nodes -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Martin Povišer ---- - arch/arm64/boot/dts/apple/t600x-die0.dtsi | 72 +++++++++++++++++++++++ - 1 file changed, 72 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t600x-die0.dtsi b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -index b549059a3320..b24dd6ed0a37 100644 ---- a/arch/arm64/boot/dts/apple/t600x-die0.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -@@ -441,3 +441,75 @@ port03: pci@3,0 { - <0 0 0 4 &port03 0 0 0 3>; - }; - }; -+ -+ dart_sio_0: iommu@39b004000 { -+ compatible = "apple,t6000-dart", "apple,dart"; -+ reg = <0x3 0x9b004000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_sio_cpu>; -+ }; -+ -+ dart_sio_1: iommu@39b008000 { -+ compatible = "apple,t6000-dart", "apple,dart"; -+ reg = <0x3 0x9b008000 0x0 0x8000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_sio_cpu>; -+ }; -+ -+ nco_clkref: clock-ref { -+ compatible = "fixed-clock"; -+ #clock-cells = <0>; -+ clock-frequency = <1068000000>; -+ clock-output-names = "nco_ref"; -+ }; -+ -+ nco: nco@28e03c000 { -+ compatible = "apple,t6000-nco", "apple,nco"; -+ reg = <0x2 0x8e03c000 0x0 0x14000>; -+ clocks = <&nco_clkref>; -+ #clock-cells = <1>; -+ }; -+ -+ admac: dma-controller@39b400000 { -+ compatible = "apple,t6000-admac", "apple,admac"; -+ reg = <0x3 0x9b400000 0x0 0x34000>; -+ dma-channels = <16>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #dma-cells = <1>; -+ iommus = <&dart_sio_0 2>, <&dart_sio_1 2>; -+ power-domains = <&ps_sio_adma>; -+ apple,internal-irq-destination = <1>; -+ }; -+ -+ mca: mca@9b600000 { -+ compatible = "apple,t6000-mca", "apple,mca"; -+ reg = <0x3 0x9b600000 0x0 0x10000>, -+ <0x3 0x9b500000 0x0 0x20000>; -+ reg-names = "clusters", "switch"; -+ -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ ; -+ -+ clocks = <&nco 0>, <&nco 1>, <&nco 2>, <&nco 3>; -+ power-domains = <&ps_audio_p>, <&ps_mca0>, <&ps_mca1>, -+ <&ps_mca2>, <&ps_mca3>; -+ dmas = <&admac 0>, <&admac 1>, <&admac 2>, <&admac 3>, -+ <&admac 4>, <&admac 5>, <&admac 6>, <&admac 7>, -+ <&admac 8>, <&admac 9>, <&admac 10>, <&admac 11>, -+ <&admac 12>, <&admac 13>, <&admac 14>, <&admac 15>; -+ dma-names = "tx0a", "rx0a", "tx0b", "rx0b", -+ "tx1a", "rx1a", "tx1b", "rx1b", -+ "tx2a", "rx2a", "tx2b", "rx2b", -+ "tx3a", "rx3a", "tx3b", "rx3b"; -+ -+ #sound-dai-cells = <1>; -+ apple,nclusters = <4>; -+ }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0032-arm64-dts-apple-t600-Put-in-audio-nodes.patch b/target/linux/silicon/patches-5.19/0032-arm64-dts-apple-t600-Put-in-audio-nodes.patch deleted file mode 100644 index 9f912ac5f..000000000 --- a/target/linux/silicon/patches-5.19/0032-arm64-dts-apple-t600-Put-in-audio-nodes.patch +++ /dev/null @@ -1,231 +0,0 @@ -From c390136c1f033e36969ea59352034603aca42071 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Fri, 11 Mar 2022 22:16:25 +0100 -Subject: [PATCH 032/171] arm64: dts: apple: t600*: Put in audio nodes -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Martin Povišer ---- - arch/arm64/boot/dts/apple/t6001-j375c.dts | 40 +++++++++ - arch/arm64/boot/dts/apple/t6002-j375d.dts | 40 +++++++++ - .../arm64/boot/dts/apple/t600x-j314-j316.dtsi | 87 +++++++++++++++++++ - 3 files changed, 167 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t6001-j375c.dts b/arch/arm64/boot/dts/apple/t6001-j375c.dts -index 561a9a4c2bc1..84be4c83f4d4 100644 ---- a/arch/arm64/boot/dts/apple/t6001-j375c.dts -+++ b/arch/arm64/boot/dts/apple/t6001-j375c.dts -@@ -152,6 +152,18 @@ typec3_con_hs: endpoint { - }; - }; - -+/* Audio */ -+&i2c1 { -+ status = "okay"; -+ -+ speaker: codec@38 { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x38>; -+ shutdown-gpios = <&pinctrl_ap 178 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ }; -+}; -+ - /* PCIe devices */ - &port00 { - /* WLAN */ -@@ -230,3 +242,31 @@ typec3_usb_hs: endpoint { - }; - }; - }; -+ -+/ { -+ sound { -+ compatible = "apple,j375-macaudio", "apple,macaudio"; -+ model = "Mac Studio J375 integrated audio"; -+ -+ /* -+ * DANGER ZONE: You can blow your speakers! -+ * -+ * The drivers are not ready, and unless you are careful -+ * to attenuate the audio stream, you run the risk of -+ * blowing your speakers. -+ */ -+ status = "disabled"; -+ -+ dai-link@0 { -+ link-name = "Speaker"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 0>; -+ }; -+ codec { -+ sound-dai = <&speaker>; -+ }; -+ }; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6002-j375d.dts b/arch/arm64/boot/dts/apple/t6002-j375d.dts -index 72070e9a3277..58463d957d09 100644 ---- a/arch/arm64/boot/dts/apple/t6002-j375d.dts -+++ b/arch/arm64/boot/dts/apple/t6002-j375d.dts -@@ -206,6 +206,18 @@ typec5_con_hs: endpoint { - }; - }; - -+/* Audio */ -+&i2c1 { -+ status = "okay"; -+ -+ speaker: codec@38 { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x38>; -+ shutdown-gpios = <&pinctrl_ap 178 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ }; -+}; -+ - /* PCIe devices */ - &port00 { - /* WLAN */ -@@ -322,3 +334,31 @@ typec5_usb_hs: endpoint { - - /delete-node/ &ps_disp0_cpu0_die1; - /delete-node/ &ps_disp0_fe_die1; -+ -+/ { -+ sound { -+ compatible = "apple,j375-macaudio", "apple,macaudio"; -+ model = "Mac Studio J375 integrated audio"; -+ -+ /* -+ * DANGER ZONE: You can blow your speakers! -+ * -+ * The drivers are not ready, and unless you are careful -+ * to attenuate the audio stream, you run the risk of -+ * blowing your speakers. -+ */ -+ status = "disabled"; -+ -+ dai-link@0 { -+ link-name = "Speaker"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 0>; -+ }; -+ codec { -+ sound-dai = <&speaker>; -+ }; -+ }; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -index c5241d5515cf..666183f385b5 100644 ---- a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -@@ -131,6 +131,62 @@ hpm5: usb-pd@3a { - }; - }; - -+&i2c1 { -+ status = "okay"; -+ -+ speaker_left_tweet: codec@3a { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x3a>; -+ shutdown-gpios = <&pinctrl_ap 178 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Left Tweeter"; -+ }; -+ -+ speaker_left_woof1: codec@38 { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x38>; -+ shutdown-gpios = <&pinctrl_ap 178 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Left Woofer 1"; -+ }; -+ -+ speaker_left_woof2: codec@39 { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x39>; -+ shutdown-gpios = <&pinctrl_ap 178 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Left Woofer 2"; -+ }; -+}; -+ -+&i2c3 { -+ status = "okay"; -+ -+ speaker_right_tweet: codec@3d { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x3d>; -+ shutdown-gpios = <&pinctrl_ap 178 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Right Tweeter"; -+ }; -+ -+ speaker_right_woof1: codec@3b { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x3b>; -+ shutdown-gpios = <&pinctrl_ap 178 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Right Woofer 1"; -+ }; -+ -+ speaker_right_woof2: codec@3c { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x3c>; -+ shutdown-gpios = <&pinctrl_ap 178 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Right Woofer 2"; -+ }; -+}; -+ - &spi1 { - status = "disabled"; - -@@ -244,4 +300,35 @@ backlight: gpio-bl { - gpios = <&smc_gpio 19 GPIO_ACTIVE_HIGH>; - default-on; - }; -+ -+ sound { -+ compatible = "apple,j314-macaudio", "apple,macaudio"; -+ model = "MacBook Pro J314/6 integrated audio"; -+ -+ /* -+ * DANGER ZONE: You can blow your speakers! -+ * -+ * The drivers are not ready, and unless you are careful -+ * to attenuate the audio stream, you run the risk of -+ * blowing your speakers. -+ */ -+ status = "disabled"; -+ -+ dai-link@0 { -+ link-name = "Speakers"; -+ mclk-fs = <256>; -+ -+ cpu { -+ sound-dai = <&mca 0>, <&mca 1>; -+ }; -+ codec { -+ sound-dai = <&speaker_left_woof1>, -+ <&speaker_right_woof1>, -+ <&speaker_left_tweet>, -+ <&speaker_right_tweet>, -+ <&speaker_left_woof2>, -+ <&speaker_right_woof2>; -+ }; -+ }; -+ }; - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0033-arm64-dts-apple-t600-Add-t8103-compat-to-cpufreq-nod.patch b/target/linux/silicon/patches-5.19/0033-arm64-dts-apple-t600-Add-t8103-compat-to-cpufreq-nod.patch deleted file mode 100644 index 65ba27266..000000000 --- a/target/linux/silicon/patches-5.19/0033-arm64-dts-apple-t600-Add-t8103-compat-to-cpufreq-nod.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0672eebb472aaef8449aec4cb064acc86e3aae37 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 30 Jun 2022 21:48:46 +0900 -Subject: [PATCH 033/171] arm64: dts: apple: t600*: Add t8103 compat to cpufreq - node - -t600x seems to be fully compatible with t8103, but t8112 introduced -minor changes which means we can't provide full functionality with the -common compatible. Let t600x claim t8103 compatibility, treating the -latter as the common baseline for this SoC family. - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t600x-die0.dtsi | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/arm64/boot/dts/apple/t600x-die0.dtsi b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -index b24dd6ed0a37..4c203778aa89 100644 ---- a/arch/arm64/boot/dts/apple/t600x-die0.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-die0.dtsi -@@ -7,7 +7,7 @@ - */ - - cpufreq_hw: cpufreq@210e20000 { -- compatible = "apple,t6000-soc-cpufreq", "apple,soc-cpufreq"; -+ compatible = "apple,t6000-soc-cpufreq", "apple,t8103-soc-cpufreq", "apple,soc-cpufreq"; - #freq-domain-cells = <1>; - }; - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0034-arm64-dts-apple-t8103-Fix-spi4-power-domain-sort-ord.patch b/target/linux/silicon/patches-5.19/0034-arm64-dts-apple-t8103-Fix-spi4-power-domain-sort-ord.patch deleted file mode 100644 index 2e3d04e1d..000000000 --- a/target/linux/silicon/patches-5.19/0034-arm64-dts-apple-t8103-Fix-spi4-power-domain-sort-ord.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 6b11a54eb684f097803307b96eb5681c9168b506 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 27 Jun 2022 22:21:34 +0900 -Subject: [PATCH 034/171] arm64: dts: apple: t8103: Fix spi4 power domain sort - order - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103-pmgr.dtsi | 18 +++++++++--------- - 1 file changed, 9 insertions(+), 9 deletions(-) - -diff --git a/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi b/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -index 68ae594bf5e9..df7f56483ee8 100644 ---- a/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103-pmgr.dtsi -@@ -387,6 +387,15 @@ ps_spi3: power-controller@258 { - power-domains = <&ps_sio>, <&ps_spi_p>; - }; - -+ ps_spi4: power-controller@260 { -+ compatible = "apple,t8103-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x260 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "spi4"; -+ power-domains = <&ps_sio>, <&ps_spi_p>; -+ }; -+ - ps_uart_n: power-controller@268 { - compatible = "apple,t8103-pmgr-pwrstate", "apple,pmgr-pwrstate"; - reg = <0x268 4>; -@@ -558,15 +567,6 @@ ps_mcc: power-controller@2f8 { - apple,always-on; /* Memory controller */ - }; - -- ps_spi4: power-controller@260 { -- compatible = "apple,t8103-pmgr-pwrstate", "apple,pmgr-pwrstate"; -- reg = <0x260 4>; -- #power-domain-cells = <0>; -- #reset-cells = <0>; -- label = "spi4"; -- power-domains = <&ps_sio>, <&ps_spi_p>; -- }; -- - ps_dcs0: power-controller@300 { - compatible = "apple,t8103-pmgr-pwrstate", "apple,pmgr-pwrstate"; - reg = <0x300 4>; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0035-arm64-dts-apple-t8103-Add-bluetooth-device-trees.patch b/target/linux/silicon/patches-5.19/0035-arm64-dts-apple-t8103-Add-bluetooth-device-trees.patch deleted file mode 100644 index c112e420b..000000000 --- a/target/linux/silicon/patches-5.19/0035-arm64-dts-apple-t8103-Add-bluetooth-device-trees.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 3b6593525fd6fe8d09e46e8543fcce20088de1e0 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Wed, 6 Jul 2022 20:04:20 +0200 -Subject: [PATCH 035/171] arm64: dts: apple: t8103: Add bluetooth device trees - -Signed-off-by: Sven Peter ---- - arch/arm64/boot/dts/apple/t8103-j274.dts | 4 ++++ - arch/arm64/boot/dts/apple/t8103-j293.dts | 4 ++++ - arch/arm64/boot/dts/apple/t8103-j313.dts | 4 ++++ - arch/arm64/boot/dts/apple/t8103-j456.dts | 4 ++++ - arch/arm64/boot/dts/apple/t8103-j457.dts | 4 ++++ - arch/arm64/boot/dts/apple/t8103-jxxx.dtsi | 8 ++++++++ - 6 files changed, 28 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t8103-j274.dts b/arch/arm64/boot/dts/apple/t8103-j274.dts -index 811008bd73f3..4efbb085e407 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j274.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j274.dts -@@ -25,6 +25,10 @@ &wifi0 { - brcm,board-type = "apple,atlantisb"; - }; - -+&bluetooth0 { -+ brcm,board-type = "apple,atlantisb"; -+}; -+ - /* - * Provide labels for the USB type C ports. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-j293.dts b/arch/arm64/boot/dts/apple/t8103-j293.dts -index 7eb98e6b947c..3a5ae54f0b9f 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j293.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j293.dts -@@ -21,6 +21,10 @@ &wifi0 { - brcm,board-type = "apple,honshu"; - }; - -+&bluetooth0 { -+ brcm,board-type = "apple,honshu"; -+}; -+ - /* - * Provide labels for the USB type C ports. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-j313.dts b/arch/arm64/boot/dts/apple/t8103-j313.dts -index d1f65e48699f..b51f651d2326 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j313.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j313.dts -@@ -21,6 +21,10 @@ &wifi0 { - brcm,board-type = "apple,shikoku"; - }; - -+&bluetooth0 { -+ brcm,board-type = "apple,shikoku"; -+}; -+ - /* - * Provide labels for the USB type C ports. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-j456.dts b/arch/arm64/boot/dts/apple/t8103-j456.dts -index e65053f3bd2c..5e098e8056e1 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j456.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j456.dts -@@ -25,6 +25,10 @@ &wifi0 { - brcm,board-type = "apple,capri"; - }; - -+&bluetooth0 { -+ brcm,board-type = "apple,capri"; -+}; -+ - &i2c0 { - hpm2: usb-pd@3b { - compatible = "apple,cd321x"; -diff --git a/arch/arm64/boot/dts/apple/t8103-j457.dts b/arch/arm64/boot/dts/apple/t8103-j457.dts -index 925fe4058055..f67c0b52075a 100644 ---- a/arch/arm64/boot/dts/apple/t8103-j457.dts -+++ b/arch/arm64/boot/dts/apple/t8103-j457.dts -@@ -25,6 +25,10 @@ &wifi0 { - brcm,board-type = "apple,santorini"; - }; - -+&bluetooth0 { -+ brcm,board-type = "apple,santorini"; -+}; -+ - /* - * Provide labels for the USB type C ports. - */ -diff --git a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -index e62664b6e450..7a814c7abe0c 100644 ---- a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi -@@ -11,6 +11,7 @@ - - / { - aliases { -+ bluetooth0 = &bluetooth0; - serial0 = &serial0; - serial2 = &serial2; - wifi0 = &wifi0; -@@ -129,4 +130,11 @@ wifi0: network@0,0 { - local-mac-address = [00 00 00 00 00 00]; - apple,antenna-sku = "XX"; - }; -+ -+ bluetooth0: network@0,1 { -+ compatible = "pci14e4,5f69"; -+ reg = <0x10100 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-bd-address = [00 00 00 00 00 00]; -+ }; - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0036-arm64-dts-apple-t600x-Add-bluetooth-device-trees.patch b/target/linux/silicon/patches-5.19/0036-arm64-dts-apple-t600x-Add-bluetooth-device-trees.patch deleted file mode 100644 index f596259d0..000000000 --- a/target/linux/silicon/patches-5.19/0036-arm64-dts-apple-t600x-Add-bluetooth-device-trees.patch +++ /dev/null @@ -1,167 +0,0 @@ -From 14fa82e8f1e6e379983d8222ed3214552c4b5c48 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 11 Jul 2022 20:05:02 +0900 -Subject: [PATCH 036/171] arm64: dts: apple: t600x: Add bluetooth device trees - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t6000-j314s.dts | 4 ++++ - arch/arm64/boot/dts/apple/t6000-j316s.dts | 4 ++++ - arch/arm64/boot/dts/apple/t6001-j314c.dts | 4 ++++ - arch/arm64/boot/dts/apple/t6001-j316c.dts | 4 ++++ - arch/arm64/boot/dts/apple/t6001-j375c.dts | 12 ++++++++++++ - arch/arm64/boot/dts/apple/t6002-j375d.dts | 12 ++++++++++++ - arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi | 8 ++++++++ - 7 files changed, 48 insertions(+) - -diff --git a/arch/arm64/boot/dts/apple/t6000-j314s.dts b/arch/arm64/boot/dts/apple/t6000-j314s.dts -index ac35870ca129..1430b91ff1b1 100644 ---- a/arch/arm64/boot/dts/apple/t6000-j314s.dts -+++ b/arch/arm64/boot/dts/apple/t6000-j314s.dts -@@ -20,3 +20,7 @@ / { - &wifi0 { - brcm,board-type = "apple,maldives"; - }; -+ -+&bluetooth0 { -+ brcm,board-type = "apple,maldives"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6000-j316s.dts b/arch/arm64/boot/dts/apple/t6000-j316s.dts -index 77d6d8c14d74..da0cbe7d9673 100644 ---- a/arch/arm64/boot/dts/apple/t6000-j316s.dts -+++ b/arch/arm64/boot/dts/apple/t6000-j316s.dts -@@ -20,3 +20,7 @@ / { - &wifi0 { - brcm,board-type = "apple,madagascar"; - }; -+ -+&bluetooth0 { -+ brcm,board-type = "apple,madagascar"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6001-j314c.dts b/arch/arm64/boot/dts/apple/t6001-j314c.dts -index 0a5655792a8f..c37097dcfdb3 100644 ---- a/arch/arm64/boot/dts/apple/t6001-j314c.dts -+++ b/arch/arm64/boot/dts/apple/t6001-j314c.dts -@@ -20,3 +20,7 @@ / { - &wifi0 { - brcm,board-type = "apple,maldives"; - }; -+ -+&bluetooth0 { -+ brcm,board-type = "apple,maldives"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6001-j316c.dts b/arch/arm64/boot/dts/apple/t6001-j316c.dts -index 9c215531ea54..3bc6e0c3294c 100644 ---- a/arch/arm64/boot/dts/apple/t6001-j316c.dts -+++ b/arch/arm64/boot/dts/apple/t6001-j316c.dts -@@ -20,3 +20,7 @@ / { - &wifi0 { - brcm,board-type = "apple,madagascar"; - }; -+ -+&bluetooth0 { -+ brcm,board-type = "apple,madagascar"; -+}; -diff --git a/arch/arm64/boot/dts/apple/t6001-j375c.dts b/arch/arm64/boot/dts/apple/t6001-j375c.dts -index 84be4c83f4d4..0f278170bd7a 100644 ---- a/arch/arm64/boot/dts/apple/t6001-j375c.dts -+++ b/arch/arm64/boot/dts/apple/t6001-j375c.dts -@@ -18,6 +18,7 @@ / { - aliases { - serial0 = &serial0; - wifi0 = &wifi0; -+ bluetooth0 = &bluetooth0; - }; - - chosen { -@@ -176,6 +177,13 @@ wifi0: wifi@0,0 { - local-mac-address = [00 10 18 00 00 10]; - apple,antenna-sku = "XX"; - }; -+ -+ bluetooth0: network@0,1 { -+ compatible = "pci14e4,5f71"; -+ reg = <0x10100 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-bd-address = [00 00 00 00 00 00]; -+ }; - }; - - &port01 { -@@ -210,6 +218,10 @@ &wifi0 { - brcm,board-type = "apple,okinawa"; - }; - -+&bluetooth0 { -+ brcm,board-type = "apple,okinawa"; -+}; -+ - /* USB controllers */ - &dwc3_0 { - port { -diff --git a/arch/arm64/boot/dts/apple/t6002-j375d.dts b/arch/arm64/boot/dts/apple/t6002-j375d.dts -index 58463d957d09..e3a554c6aa5e 100644 ---- a/arch/arm64/boot/dts/apple/t6002-j375d.dts -+++ b/arch/arm64/boot/dts/apple/t6002-j375d.dts -@@ -18,6 +18,7 @@ / { - aliases { - serial0 = &serial0; - wifi0 = &wifi0; -+ bluetooth0 = &bluetooth0; - }; - - chosen { -@@ -230,6 +231,13 @@ wifi0: wifi@0,0 { - local-mac-address = [00 10 18 00 00 10]; - apple,antenna-sku = "XX"; - }; -+ -+ bluetooth0: network@0,1 { -+ compatible = "pci14e4,5f71"; -+ reg = <0x10100 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-bd-address = [00 00 00 00 00 00]; -+ }; - }; - - &port01 { -@@ -264,6 +272,10 @@ &wifi0 { - brcm,board-type = "apple,okinawa"; - }; - -+&bluetooth0 { -+ brcm,board-type = "apple,okinawa"; -+}; -+ - /* USB controllers */ - &dwc3_0 { - port { -diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -index 666183f385b5..bbe66ea64f09 100644 ---- a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -+++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi -@@ -13,6 +13,7 @@ / { - aliases { - serial0 = &serial0; - wifi0 = &wifi0; -+ bluetooth0 = &bluetooth0; - }; - - chosen { -@@ -231,6 +232,13 @@ wifi0: wifi@0,0 { - local-mac-address = [00 10 18 00 00 10]; - apple,antenna-sku = "XX"; - }; -+ -+ bluetooth0: network@0,1 { -+ compatible = "pci14e4,5f71"; -+ reg = <0x10100 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-bd-address = [00 00 00 00 00 00]; -+ }; - }; - - &port01 { --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0037-arm64-dts-apple-t8112-Initial-t8112-M2-device-trees.patch b/target/linux/silicon/patches-5.19/0037-arm64-dts-apple-t8112-Initial-t8112-M2-device-trees.patch deleted file mode 100644 index 9f65909e5..000000000 --- a/target/linux/silicon/patches-5.19/0037-arm64-dts-apple-t8112-Initial-t8112-M2-device-trees.patch +++ /dev/null @@ -1,2800 +0,0 @@ -From 820a0e0e2e8a3772a61340016b1ebac1b937eaa4 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 27 Jun 2022 22:21:14 +0900 -Subject: [PATCH 037/171] arm64: dts: apple: t8112: Initial t8112 (M2) device - trees - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/Makefile | 2 + - arch/arm64/boot/dts/apple/t8112-j413.dts | 182 ++++ - arch/arm64/boot/dts/apple/t8112-j493.dts | 171 +++ - arch/arm64/boot/dts/apple/t8112-jxxx.dtsi | 145 +++ - arch/arm64/boot/dts/apple/t8112-pmgr.dtsi | 1141 +++++++++++++++++++++ - arch/arm64/boot/dts/apple/t8112.dtsi | 1097 ++++++++++++++++++++ - 6 files changed, 2738 insertions(+) - create mode 100644 arch/arm64/boot/dts/apple/t8112-j413.dts - create mode 100644 arch/arm64/boot/dts/apple/t8112-j493.dts - create mode 100644 arch/arm64/boot/dts/apple/t8112-jxxx.dtsi - create mode 100644 arch/arm64/boot/dts/apple/t8112-pmgr.dtsi - create mode 100644 arch/arm64/boot/dts/apple/t8112.dtsi - -diff --git a/arch/arm64/boot/dts/apple/Makefile b/arch/arm64/boot/dts/apple/Makefile -index 5a7506ff5ea3..9d002bbbe98f 100644 ---- a/arch/arm64/boot/dts/apple/Makefile -+++ b/arch/arm64/boot/dts/apple/Makefile -@@ -10,3 +10,5 @@ dtb-$(CONFIG_ARCH_APPLE) += t6000-j316s.dtb - dtb-$(CONFIG_ARCH_APPLE) += t6001-j316c.dtb - dtb-$(CONFIG_ARCH_APPLE) += t6001-j375c.dtb - dtb-$(CONFIG_ARCH_APPLE) += t6002-j375d.dtb -+dtb-$(CONFIG_ARCH_APPLE) += t8112-j413.dtb -+dtb-$(CONFIG_ARCH_APPLE) += t8112-j493.dtb -diff --git a/arch/arm64/boot/dts/apple/t8112-j413.dts b/arch/arm64/boot/dts/apple/t8112-j413.dts -new file mode 100644 -index 000000000000..0cc993c0a5b4 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t8112-j413.dts -@@ -0,0 +1,182 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Apple MacBook Air (M2, 2022) -+ * -+ * target-type: J413 -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/dts-v1/; -+ -+#include "t8112.dtsi" -+#include "t8112-jxxx.dtsi" -+ -+/ { -+ compatible = "apple,j413", "apple,t8112", "apple,arm-platform"; -+ model = "Apple MacBook Air (13-inch, M2, 2022)"; -+ -+ aliases { -+ wifi0 = &wifi0; -+ bluetooth0 = &bluetooth0; -+ }; -+}; -+ -+/* -+ * Force the bus number assignments so that we can declare some of the -+ * on-board devices and properties that are populated by the bootloader -+ * (such as MAC addresses). -+ */ -+&port00 { -+ bus-range = <1 1>; -+ pwren-gpios = <&smc_gpio 13 GPIO_ACTIVE_HIGH>; -+ wifi0: wifi@0,0 { -+ compatible = "pci14e4,4433"; -+ reg = <0x10000 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-mac-address = [00 10 18 00 00 10]; -+ apple,antenna-sku = "XX"; -+ brcm,board-type = "apple,hokkaido"; -+ }; -+ -+ bluetooth0: network@0,1 { -+ compatible = "pci14e4,5f71"; -+ reg = <0x10100 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-bd-address = [00 00 00 00 00 00]; -+ brcm,board-type = "apple,hokkaido"; -+ }; -+}; -+ -+/* -+ * Provide labels for the USB type C ports. -+ */ -+ -+&typec0 { -+ label = "USB-C Left-back"; -+}; -+ -+&typec1 { -+ label = "USB-C Left-front"; -+}; -+ -+/* -+ * Remove unused PCIe ports and disable the associated DARTs. -+ */ -+ -+/delete-node/ &port01; -+/delete-node/ &port02; -+/delete-node/ &port03; -+ -+&i2c0 { -+ /* MagSafe port */ -+ hpm5: usb-pd@3a { -+ compatible = "apple,cd321x"; -+ reg = <0x3a>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ }; -+}; -+ -+&i2c1 { -+ speaker_left_rear: codec@38 { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x38>; -+ shutdown-gpios = <&pinctrl_ap 88 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Left Rear"; -+ }; -+ -+ speaker_left_front: codec@39 { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x39>; -+ shutdown-gpios = <&pinctrl_ap 88 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Left Front"; -+ }; -+}; -+ -+&i2c2 { -+ status = "okay"; -+}; -+ -+&i2c3 { -+ speaker_right_rear: codec@3b { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x3b>; -+ shutdown-gpios = <&pinctrl_ap 88 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Right Rear"; -+ }; -+ -+ speaker_right_front: codec@3c { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x3c>; -+ shutdown-gpios = <&pinctrl_ap 88 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Right Front"; -+ }; -+}; -+ -+&i2c4 { -+ status = "okay"; -+}; -+ -+/ { -+ backlight: gpio-bl { -+ compatible = "gpio-backlight"; -+ gpios = <&smc_gpio 18 GPIO_ACTIVE_HIGH>; -+ default-on; -+ }; -+ -+ sound { -+ compatible = "apple,j413-macaudio", "apple,macaudio"; -+ model = "MacBook Pro J413 integrated audio"; -+ -+ dai-link@0 { -+ /* -+ * DANGER ZONE: You can blow your speakers! -+ * -+ * The drivers are not ready, and unless you are careful -+ * to attenuate the audio stream, you run the risk of -+ * blowing your speakers. -+ */ -+ status = "disabled"; -+ -+ link-name = "Speakers"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 0>, <&mca 1>; -+ }; -+ codec { -+ sound-dai = <&speaker_left_front>, <&speaker_right_front>, -+ <&speaker_left_rear>, <&speaker_right_rear>; -+ }; -+ }; -+#if 0 -+ dai-link@1 { -+ link-name = "Headphone Jack"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 2>; -+ }; -+ codec { -+ sound-dai = <&jack_codec>; -+ }; -+ }; -+#endif -+ }; -+}; -+ -+&framebuffer0 { -+ backlight = <&backlight>; -+}; -+ -+&mtp_hid { -+ multi-touch { -+ firmware-name = "apple/tpmtfw-j413.bin"; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t8112-j493.dts b/arch/arm64/boot/dts/apple/t8112-j493.dts -new file mode 100644 -index 000000000000..aa8c045cd1ac ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t8112-j493.dts -@@ -0,0 +1,171 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Apple MacBook Pro (13-inch, M1, 2022) -+ * -+ * target-type: J493 -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/dts-v1/; -+ -+#include "t8112.dtsi" -+#include "t8112-jxxx.dtsi" -+ -+/ { -+ compatible = "apple,j493", "apple,t8112", "apple,arm-platform"; -+ model = "Apple MacBook Pro (13-inch, M2, 2022)"; -+ -+ aliases { -+ wifi0 = &wifi0; -+ bluetooth0 = &bluetooth0; -+ }; -+}; -+ -+/* -+ * Force the bus number assignments so that we can declare some of the -+ * on-board devices and properties that are populated by the bootloader -+ * (such as MAC addresses). -+ */ -+&port00 { -+ bus-range = <1 1>; -+ pwren-gpios = <&smc_gpio 13 GPIO_ACTIVE_HIGH>; -+ wifi0: network@0,0 { -+ compatible = "pci14e4,4425"; -+ reg = <0x10000 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-mac-address = [00 00 00 00 00 00]; -+ apple,antenna-sku = "XX"; -+ brcm,board-type = "apple,kyushu"; -+ }; -+ -+ bluetooth0: network@0,1 { -+ compatible = "pci14e4,5f69"; -+ reg = <0x10100 0x0 0x0 0x0 0x0>; -+ /* To be filled by the loader */ -+ local-bd-address = [00 00 00 00 00 00]; -+ brcm,board-type = "apple,kyushu"; -+ }; -+}; -+ -+/* -+ * Provide labels for the USB type C ports. -+ */ -+ -+&typec0 { -+ label = "USB-C Left-back"; -+}; -+ -+&typec1 { -+ label = "USB-C Left-front"; -+}; -+ -+/* -+ * Remove unused PCIe ports and disable the associated DARTs. -+ */ -+ -+/delete-node/ &port01; -+/delete-node/ &port02; -+/delete-node/ &port03; -+ -+&i2c1 { -+ speaker_left_rear: codec@38 { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x38>; -+ shutdown-gpios = <&pinctrl_ap 88 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Left Rear"; -+ }; -+ -+ speaker_left_front: codec@39 { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x39>; -+ shutdown-gpios = <&pinctrl_ap 88 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Left Front"; -+ }; -+}; -+ -+&i2c2 { -+ status = "okay"; -+}; -+ -+&i2c3 { -+ speaker_right_rear: codec@3b { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x3b>; -+ shutdown-gpios = <&pinctrl_ap 88 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Right Rear"; -+ }; -+ -+ speaker_right_front: codec@3c { -+ compatible = "ti,sn012776", "ti,tas2764"; -+ reg = <0x3c>; -+ shutdown-gpios = <&pinctrl_ap 88 GPIO_ACTIVE_HIGH>; -+ #sound-dai-cells = <0>; -+ sound-name-prefix = "Right Front"; -+ }; -+}; -+ -+&i2c4 { -+ status = "okay"; -+}; -+ -+/ { -+ backlight: gpio-bl { -+ compatible = "gpio-backlight"; -+ gpios = <&smc_gpio 18 GPIO_ACTIVE_HIGH>; -+ default-on; -+ }; -+ -+ sound { -+ compatible = "apple,j493-macaudio", "apple,macaudio"; -+ model = "MacBook Pro J493 integrated audio"; -+ -+ dai-link@0 { -+ /* -+ * DANGER ZONE: You can blow your speakers! -+ * -+ * The drivers are not ready, and unless you are careful -+ * to attenuate the audio stream, you run the risk of -+ * blowing your speakers. -+ */ -+ status = "disabled"; -+ -+ link-name = "Speakers"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 0>, <&mca 1>; -+ }; -+ codec { -+ sound-dai = <&speaker_left_front>, <&speaker_right_front>, -+ <&speaker_left_rear>, <&speaker_right_rear>; -+ }; -+ }; -+#if 0 -+ dai-link@1 { -+ link-name = "Headphone Jack"; -+ mclk-fs = <64>; -+ -+ cpu { -+ sound-dai = <&mca 2>; -+ }; -+ codec { -+ sound-dai = <&jack_codec>; -+ }; -+ }; -+#endif -+ }; -+}; -+ -+&framebuffer0 { -+ backlight = <&backlight>; -+}; -+ -+&mtp_hid { -+ multi-touch { -+ firmware-name = "apple/tpmtfw-j493.bin"; -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t8112-jxxx.dtsi b/arch/arm64/boot/dts/apple/t8112-jxxx.dtsi -new file mode 100644 -index 000000000000..a66f14f795b1 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t8112-jxxx.dtsi -@@ -0,0 +1,145 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Apple M2 MacBook Air/Pro (M2, 2022) -+ * -+ * This file contains parts common to all Apple M2 devices using the t8112. -+ * -+ * target-type: J493, J413 -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+/ { -+ aliases { -+ serial0 = &serial0; -+ serial2 = &serial2; -+ }; -+ -+ chosen { -+ #address-cells = <2>; -+ #size-cells = <2>; -+ ranges; -+ -+ stdout-path = "serial0"; -+ -+ framebuffer0: framebuffer@0 { -+ compatible = "apple,simple-framebuffer", "simple-framebuffer"; -+ reg = <0 0 0 0>; /* To be filled by loader */ -+ /* Format properties will be added by loader */ -+ status = "disabled"; -+ }; -+ }; -+ -+ memory@800000000 { -+ device_type = "memory"; -+ reg = <0x8 0 0x2 0>; /* To be filled by loader */ -+ }; -+}; -+ -+&serial0 { -+ status = "okay"; -+}; -+ -+&serial2 { -+ status = "okay"; -+}; -+ -+&i2c0 { -+ hpm0: usb-pd@38 { -+ compatible = "apple,cd321x"; -+ reg = <0x38>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <8 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ -+ typec0: connector { -+ compatible = "usb-c-connector"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec0_con_hs: endpoint { -+ remote-endpoint = <&typec0_usb_hs>; -+ }; -+ }; -+ }; -+ }; -+ }; -+ -+ hpm1: usb-pd@3f { -+ compatible = "apple,cd321x"; -+ reg = <0x3f>; -+ interrupt-parent = <&pinctrl_ap>; -+ interrupts = <8 IRQ_TYPE_LEVEL_LOW>; -+ interrupt-names = "irq"; -+ -+ typec1: connector { -+ compatible = "usb-c-connector"; -+ power-role = "dual"; -+ data-role = "dual"; -+ -+ ports { -+ #address-cells = <1>; -+ #size-cells = <0>; -+ port@0 { -+ reg = <0>; -+ typec1_con_hs: endpoint { -+ remote-endpoint = <&typec1_usb_hs>; -+ }; -+ }; -+ }; -+ }; -+ }; -+}; -+ -+/* USB controllers */ -+&dwc3_0 { -+ port { -+ typec0_usb_hs: endpoint { -+ remote-endpoint = <&typec0_con_hs>; -+ }; -+ }; -+}; -+ -+&dwc3_1 { -+ port { -+ typec1_usb_hs: endpoint { -+ remote-endpoint = <&typec1_con_hs>; -+ }; -+ }; -+}; -+ -+&mtp { -+ status = "okay"; -+}; -+&mtp_mbox{ -+ status = "okay"; -+}; -+&mtp_dart { -+ status = "okay"; -+}; -+&mtp_dockchannel { -+ status = "okay"; -+}; -+&mtp_hid { -+ multi-touch { -+ apple,afe-reset-gpios = <&smc_gpio 8 GPIO_ACTIVE_LOW>; -+ }; -+ -+ keyboard { -+ }; -+ -+ stm { -+ apple,stm-reset-gpios = <&smc_gpio 24 GPIO_ACTIVE_LOW>; -+ }; -+ -+ actuator { -+ }; -+ -+ tp_accel { -+ }; -+}; -diff --git a/arch/arm64/boot/dts/apple/t8112-pmgr.dtsi b/arch/arm64/boot/dts/apple/t8112-pmgr.dtsi -new file mode 100644 -index 000000000000..0f2d810921c8 ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t8112-pmgr.dtsi -@@ -0,0 +1,1141 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * PMGR Power domains for the Apple T8112 "M2" SoC -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+ -+&pmgr { -+ ps_sbr: power-controller@100 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x100 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "sbr"; -+ apple,always-on; /* Core device */ -+ }; -+ -+ ps_aic: power-controller@108 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x108 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "aic"; -+ apple,always-on; /* Core device */ -+ }; -+ -+ ps_dwi: power-controller@110 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x110 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dwi"; -+ apple,always-on; /* Core device */ -+ }; -+ -+ ps_soc_spmi0: power-controller@118 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x118 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "soc_spmi0"; -+ }; -+ -+ ps_gpio: power-controller@120 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x120 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "gpio"; -+ }; -+ -+ ps_pms_busif: power-controller@128 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x128 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "pms_busif"; -+ apple,always-on; /* Core device */ -+ }; -+ -+ ps_pms: power-controller@130 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x130 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "pms"; -+ apple,always-on; /* Core device */ -+ }; -+ -+ ps_pms_c1ppt: power-controller@160 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x160 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "pms_c1ppt"; -+ power-domains = <&ps_pms>; -+ }; -+ -+ ps_soc_dpe: power-controller@168 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x168 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "soc_dpe"; -+ apple,always-on; /* Core device */ -+ }; -+ -+ ps_pmgr_soc_ocla: power-controller@170 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x170 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "pmgr_soc_ocla"; -+ power-domains = <&ps_pms>; -+ }; -+ -+ ps_ispsens0: power-controller@178 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x178 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "ispsens0"; -+ }; -+ -+ ps_ispsens1: power-controller@180 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x180 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "ispsens1"; -+ }; -+ -+ ps_ispsens2: power-controller@188 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x188 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "ispsens2"; -+ }; -+ -+ ps_ispsens3: power-controller@190 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x190 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "ispsens3"; -+ }; -+ -+ ps_pcie_ref: power-controller@198 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x198 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "pcie_ref"; -+ }; -+ -+ ps_aft0: power-controller@1a0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1a0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "aft0"; -+ }; -+ -+ ps_imx: power-controller@1a8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1a8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "imx"; -+ apple,always-on; /* Apple fabric, critical block */ -+ }; -+ -+ ps_sio_busif: power-controller@1b0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1b0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "sio_busif"; -+ }; -+ -+ ps_sio: power-controller@1b8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1b8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "sio"; -+ apple,always-on; -+ power-domains = <&ps_sio_busif>; -+ }; -+ -+ ps_sio_cpu: power-controller@1c0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1c0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "sio_cpu"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_fpwm0: power-controller@1c8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1c8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "fpwm0"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_fpwm1: power-controller@1d0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1d0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "fpwm1"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_fpwm2: power-controller@1d8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1d8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "fpwm2"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_i2c0: power-controller@1e0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1e0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "i2c0"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_i2c1: power-controller@1e8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1e8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "i2c1"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_i2c2: power-controller@1f0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1f0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "i2c2"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_i2c3: power-controller@1f8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x1f8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "i2c3"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_i2c4: power-controller@200 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x200 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "i2c4"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_spi_p: power-controller@208 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x208 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "spi_p"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_uart_p: power-controller@210 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x210 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart_p"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_audio_p: power-controller@218 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x218 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "audio_p"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_aes: power-controller@220 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x220 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "aes"; -+ power-domains = <&ps_sio>; -+ }; -+ -+ ps_spi0: power-controller@228 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x228 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "spi0"; -+ power-domains = <&ps_spi_p>; -+ }; -+ -+ ps_spi1: power-controller@230 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x230 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "spi1"; -+ power-domains = <&ps_spi_p>; -+ }; -+ -+ ps_spi2: power-controller@238 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x238 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "spi2"; -+ power-domains = <&ps_spi_p>; -+ }; -+ -+ ps_spi3: power-controller@240 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x240 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "spi3"; -+ power-domains = <&ps_spi_p>; -+ }; -+ -+ ps_spi4: power-controller@248 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x248 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "spi4"; -+ power-domains = <&ps_spi_p>; -+ }; -+ -+ ps_spi5: power-controller@250 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x250 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "spi5"; -+ power-domains = <&ps_spi_p>; -+ }; -+ -+ ps_uart_n: power-controller@258 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x258 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart_n"; -+ power-domains = <&ps_uart_p>; -+ }; -+ -+ ps_uart0: power-controller@260 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x260 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart0"; -+ power-domains = <&ps_uart_p>; -+ }; -+ -+ ps_uart1: power-controller@268 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x268 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart1"; -+ power-domains = <&ps_uart_p>; -+ }; -+ -+ ps_uart2: power-controller@270 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x270 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart2"; -+ power-domains = <&ps_uart_p>; -+ }; -+ -+ ps_uart3: power-controller@278 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x278 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart3"; -+ power-domains = <&ps_uart_p>; -+ }; -+ -+ ps_uart4: power-controller@280 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x280 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart4"; -+ power-domains = <&ps_uart_p>; -+ }; -+ -+ ps_uart5: power-controller@288 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x288 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart5"; -+ power-domains = <&ps_uart_p>; -+ }; -+ -+ ps_uart6: power-controller@290 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x290 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart6"; -+ power-domains = <&ps_uart_p>; -+ }; -+ -+ ps_uart7: power-controller@298 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x298 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart7"; -+ power-domains = <&ps_uart_p>; -+ }; -+ -+ ps_uart8: power-controller@2a0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2a0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "uart8"; -+ power-domains = <&ps_uart_p>; -+ }; -+ -+ ps_sio_adma: power-controller@2a8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2a8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "sio_adma"; -+ power-domains = <&ps_spi_p>, <&ps_audio_p>; -+ }; -+ -+ ps_dpa0: power-controller@2b0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2b0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dpa0"; -+ power-domains = <&ps_audio_p>; -+ }; -+ -+ ps_dpa1: power-controller@2b8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2b8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dpa1"; -+ power-domains = <&ps_audio_p>; -+ }; -+ -+ ps_mca0: power-controller@2c0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2c0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "mca0"; -+ power-domains = <&ps_sio_adma>, <&ps_audio_p>; -+ }; -+ -+ ps_mca1: power-controller@2c8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2c8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "mca1"; -+ power-domains = <&ps_sio_adma>, <&ps_audio_p>; -+ }; -+ -+ ps_mca2: power-controller@2d0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2d0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "mca2"; -+ power-domains = <&ps_sio_adma>, <&ps_audio_p>; -+ }; -+ -+ ps_mca3: power-controller@2d8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2d8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "mca3"; -+ power-domains = <&ps_sio_adma>, <&ps_audio_p>; -+ }; -+ -+ ps_mca4: power-controller@2e0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2e0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "mca4"; -+ power-domains = <&ps_sio_adma>, <&ps_audio_p>; -+ }; -+ -+ ps_mca5: power-controller@2e8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2e8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "mca5"; -+ power-domains = <&ps_sio_adma>, <&ps_audio_p>; -+ }; -+ -+ ps_mcc: power-controller@2f0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2f0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "mcc"; -+ apple,always-on; /* Memory controller */ -+ }; -+ -+ ps_dcs0: power-controller@2f8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x2f8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dcs0"; -+ apple,always-on; /* LPDDR4 interface */ -+ }; -+ -+ ps_dcs2: power-controller@300 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x300 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dcs2"; -+ apple,always-on; /* LPDDR4 interface */ -+ }; -+ -+ ps_dcs1: power-controller@308 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x308 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dcs1"; -+ apple,always-on; /* LPDDR4 interface */ -+ }; -+ -+ ps_dcs3: power-controller@310 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x310 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dcs3"; -+ apple,always-on; /* LPDDR4 interface */ -+ }; -+ -+ ps_dcs4: power-controller@318 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x318 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dcs4"; -+ apple,always-on; /* LPDDR4 interface */ -+ }; -+ -+ ps_dcs5: power-controller@320 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x320 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dcs5"; -+ apple,always-on; /* LPDDR4 interface */ -+ }; -+ -+ ps_dcs6: power-controller@328 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x328 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dcs6"; -+ apple,always-on; /* LPDDR4 interface */ -+ }; -+ -+ ps_dcs7: power-controller@330 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x330 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dcs7"; -+ apple,always-on; /* LPDDR4 interface */ -+ }; -+ -+ ps_smx0: power-controller@338 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x338 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "smx0"; -+ apple,always-on; /* Apple fabric, critical block */ -+ }; -+ -+ ps_smx1: power-controller@340 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x340 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "smx1"; -+ apple,always-on; /* Apple fabric, critical block */ -+ }; -+ -+ ps_apcie: power-controller@348 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x348 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "apcie"; -+ power-domains = <&ps_imx>, <&ps_pcie_ref>; -+ }; -+ -+ ps_rmx0: power-controller@350 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x350 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "rmx0"; -+ /* Apple Fabric, display/image stuff: this can power down */ -+ }; -+ -+ ps_rmx1: power-controller@358 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x358 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "rmx1"; -+ /* Apple Fabric, display/image stuff: this can power down */ -+ }; -+ -+ ps_cmx: power-controller@360 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x360 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "cmx"; -+ apple,always-on; /* Apple fabric, critical block */ -+ }; -+ -+ ps_mmx: power-controller@368 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x368 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "mmx"; -+ /* Apple Fabric, media stuff: this can power down */ -+ }; -+ -+ ps_disp0_sys: power-controller@370 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x370 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "disp0_sys"; -+ power-domains = <&ps_rmx1>; -+ apple,always-on; /* TODO: figure out if we can enable PM here */ -+ }; -+ -+ ps_disp0_fe: power-controller@378 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x378 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "disp0_fe"; -+ power-domains = <&ps_disp0_sys>; -+ apple,always-on; /* TODO: figure out if we can enable PM here */ -+ }; -+ -+ ps_dispext_sys: power-controller@380 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x380 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dispext_sys"; -+ power-domains = <&ps_rmx0>; -+ }; -+ -+ ps_dispext_fe: power-controller@388 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x388 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dispext_fe"; -+ power-domains = <&ps_dispext_sys>; -+ }; -+ -+ ps_dispext_cpu0: power-controller@3c8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3c8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dispext_cpu0"; -+ power-domains = <&ps_dispext_fe>; -+ apple,min-state = <4>; -+ }; -+ -+ ps_dptx_ext_phy: power-controller@3d8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3d8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dptx_ext_phy"; -+ }; -+ -+ ps_dispdfr_fe: power-controller@3e0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3e0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dispdfr_fe"; -+ power-domains = <&ps_rmx0>; -+ }; -+ -+ ps_dispdfr_be: power-controller@3e8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3e8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "dispdfr_be"; -+ power-domains = <&ps_dispdfr_fe>; -+ }; -+ -+ ps_mipi_dsi: power-controller@3f0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3f0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "mipi_dsi"; -+ power-domains = <&ps_dispdfr_be>; -+ }; -+ -+ ps_jpg: power-controller@3f8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x3f8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "jpg"; -+ power-domains = <&ps_cmx>; -+ }; -+ -+ ps_apcie_gp: power-controller@400 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x400 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "apcie_gp"; -+ power-domains = <&ps_apcie>; -+ apple,always-on; /* Breaks things if shut down */ -+ }; -+ -+ ps_msr: power-controller@408 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x408 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "msr"; -+ power-domains = <&ps_imx>; -+ }; -+ -+ ps_pmp: power-controller@410 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x410 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "pmp"; -+ apple,always-on; -+ }; -+ -+ ps_pms_sram: power-controller@418 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x418 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "pms_sram"; -+ apple,always-on; -+ }; -+ -+ ps_msr_ase_core: power-controller@420 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x420 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "msr_ase_core"; -+ power-domains = <&ps_msr>; -+ }; -+ -+ ps_ans: power-controller@428 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x428 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "ans"; -+ power-domains = <&ps_imx>; -+ }; -+ -+ ps_gfx: power-controller@430 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x430 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "gfx"; -+ }; -+ -+ ps_isp_sys: power-controller@438 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x438 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "isp_sys"; -+ power-domains = <&ps_rmx1>; -+ }; -+ -+ ps_venc_sys: power-controller@440 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x440 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "venc_sys"; -+ power-domains = <&ps_rmx1>; -+ }; -+ -+ ps_avd_sys: power-controller@448 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x448 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "avd_sys"; -+ power-domains = <&ps_mmx>; -+ }; -+ -+ ps_apcie_st: power-controller@450 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x450 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "apcie_st"; -+ power-domains = <&ps_apcie>, <&ps_ans>; -+ }; -+ -+ ps_atc0_common: power-controller@458 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x458 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc0_common"; -+ power-domains = <&ps_imx>; -+ }; -+ -+ ps_atc0_pcie: power-controller@460 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x460 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc0_pcie"; -+ power-domains = <&ps_atc0_common>; -+ }; -+ -+ ps_atc0_cio: power-controller@468 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x468 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc0_cio"; -+ power-domains = <&ps_atc0_common>; -+ }; -+ -+ ps_atc0_cio_pcie: power-controller@470 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x470 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc0_cio_pcie"; -+ power-domains = <&ps_atc0_cio>; -+ }; -+ -+ ps_atc0_cio_usb: power-controller@478 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x478 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc0_cio_usb"; -+ power-domains = <&ps_atc0_cio>; -+ }; -+ -+ ps_atc1_common: power-controller@480 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x480 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc1_common"; -+ power-domains = <&ps_rmx0>; -+ }; -+ -+ ps_atc1_pcie: power-controller@488 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x488 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc1_pcie"; -+ power-domains = <&ps_atc1_common>; -+ }; -+ -+ ps_atc1_cio: power-controller@490 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x490 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc1_cio"; -+ power-domains = <&ps_atc1_common>; -+ }; -+ -+ ps_atc1_cio_pcie: power-controller@498 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x498 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc1_cio_pcie"; -+ power-domains = <&ps_atc1_cio>; -+ }; -+ -+ ps_atc1_cio_usb: power-controller@4a0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x4a0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc1_cio_usb"; -+ power-domains = <&ps_atc1_cio>; -+ }; -+ -+ ps_ane_sys: power-controller@4a8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x4a8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "ane_sys"; -+ power-domains = <&ps_mmx>; -+ }; -+ -+ ps_scodec: power-controller@4b0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x4b0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "scodec"; -+ power-domains = <&ps_rmx0>; -+ }; -+ -+ ps_sep: power-controller@c00 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xc00 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "sep"; -+ apple,always-on; -+ }; -+ -+ ps_venc_dma: power-controller@8000 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8000 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "venc_dma"; -+ power-domains = <&ps_venc_sys>; -+ }; -+ -+ ps_venc_pipe4: power-controller@8008 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8008 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "venc_pipe4"; -+ power-domains = <&ps_venc_dma>; -+ }; -+ -+ ps_venc_pipe5: power-controller@8010 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8010 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "venc_pipe5"; -+ power-domains = <&ps_venc_dma>; -+ }; -+ -+ ps_venc_me0: power-controller@8018 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8018 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "venc_me0"; -+ power-domains = <&ps_venc_pipe5>, <&ps_venc_pipe4>; -+ }; -+ -+ ps_venc_me1: power-controller@8020 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x8020 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "venc_me1"; -+ power-domains = <&ps_venc_pipe5>, <&ps_venc_pipe4>; -+ }; -+ -+ ps_disp0_cpu0: power-controller@10000 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x10000 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "disp0_cpu0"; -+ power-domains = <&ps_disp0_fe>; -+ apple,min-state = <4>; -+ }; -+}; -+ -+&pmgr_mini { -+ -+ ps_debug_gated: power-controller@58 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x58 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "debug_gated"; -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ ps_nub_spmi0: power-controller@60 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x60 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "nub_spmi0"; -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ ps_nub_spmi1: power-controller@68 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x68 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "nub_spmi1"; -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ ps_nub_aon: power-controller@70 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x70 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "nub_aon"; -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ ps_msg: power-controller@78 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x78 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "msg"; -+ }; -+ -+ ps_nub_gpio: power-controller@80 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x80 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "nub_gpio"; -+ apple,always-on; -+ }; -+ -+ ps_atc0_usb_aon: power-controller@88 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x88 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc0_usb_aon"; -+ apple,always-on; /* Needs to stay on for dwc3 to work */ -+ }; -+ -+ ps_atc1_usb_aon: power-controller@90 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x90 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc1_usb_aon"; -+ apple,always-on; /* Needs to stay on for dwc3 to work */ -+ }; -+ -+ ps_atc0_usb: power-controller@98 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0x98 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc0_usb"; -+ power-domains = <&ps_atc0_usb_aon>, <&ps_atc0_common>; -+ }; -+ -+ ps_atc1_usb: power-controller@a0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xa0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "atc1_usb"; -+ power-domains = <&ps_atc1_usb_aon>, <&ps_atc1_common>; -+ }; -+ -+ ps_nub_fabric: power-controller@a8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xa8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "nub_fabric"; -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ ps_nub_sram: power-controller@b0 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xb0 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "nub_sram"; -+ apple,always-on; /* Core AON device */ -+ }; -+ -+ ps_debug_switch: power-controller@b8 { -+ compatible = "apple,t8112-pmgr-pwrstate", "apple,pmgr-pwrstate"; -+ reg = <0xb8 4>; -+ #power-domain-cells = <0>; -+ #reset-cells = <0>; -+ label = "debug_switch"; -+ apple,always-on; /* Core AON device */ -+ }; -+}; -+ -diff --git a/arch/arm64/boot/dts/apple/t8112.dtsi b/arch/arm64/boot/dts/apple/t8112.dtsi -new file mode 100644 -index 000000000000..852937ec80ea ---- /dev/null -+++ b/arch/arm64/boot/dts/apple/t8112.dtsi -@@ -0,0 +1,1097 @@ -+// SPDX-License-Identifier: GPL-2.0+ OR MIT -+/* -+ * Apple T8112 "M2" SoC -+ * -+ * Other names: H14G -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+/ { -+ compatible = "apple,t8112", "apple,arm-platform"; -+ -+ #address-cells = <2>; -+ #size-cells = <2>; -+ -+ cpus { -+ #address-cells = <2>; -+ #size-cells = <0>; -+ -+ cpu-map { -+ cluster0 { -+ core0 { -+ cpu = <&cpu_e0>; -+ }; -+ core1 { -+ cpu = <&cpu_e1>; -+ }; -+ core2 { -+ cpu = <&cpu_e2>; -+ }; -+ core3 { -+ cpu = <&cpu_e3>; -+ }; -+ }; -+ -+ cluster1 { -+ core0 { -+ cpu = <&cpu_p0>; -+ }; -+ core1 { -+ cpu = <&cpu_p1>; -+ }; -+ core2 { -+ cpu = <&cpu_p2>; -+ }; -+ core3 { -+ cpu = <&cpu_p3>; -+ }; -+ }; -+ }; -+ -+ cpu_e0: cpu@0 { -+ compatible = "apple,blizzard"; -+ device_type = "cpu"; -+ reg = <0x0 0x0>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; // TODO -+ apple,freq-domain = <&cpufreq_hw 0>; -+ }; -+ -+ cpu_e1: cpu@1 { -+ compatible = "apple,blizzard"; -+ device_type = "cpu"; -+ reg = <0x0 0x1>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; // TODO -+ apple,freq-domain = <&cpufreq_hw 0>; -+ }; -+ -+ cpu_e2: cpu@2 { -+ compatible = "apple,blizzard"; -+ device_type = "cpu"; -+ reg = <0x0 0x2>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; // TODO -+ apple,freq-domain = <&cpufreq_hw 0>; -+ }; -+ -+ cpu_e3: cpu@3 { -+ compatible = "apple,blizzard"; -+ device_type = "cpu"; -+ reg = <0x0 0x3>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; // TODO -+ apple,freq-domain = <&cpufreq_hw 0>; -+ }; -+ -+ cpu_p0: cpu@10100 { -+ compatible = "apple,avalanche"; -+ device_type = "cpu"; -+ reg = <0x0 0x10100>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; -+ }; -+ -+ cpu_p1: cpu@10101 { -+ compatible = "apple,avalanche"; -+ device_type = "cpu"; -+ reg = <0x0 0x10101>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; -+ }; -+ -+ cpu_p2: cpu@10102 { -+ compatible = "apple,avalanche"; -+ device_type = "cpu"; -+ reg = <0x0 0x10102>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; -+ }; -+ -+ cpu_p3: cpu@10103 { -+ compatible = "apple,avalanche"; -+ device_type = "cpu"; -+ reg = <0x0 0x10103>; -+ enable-method = "spin-table"; -+ cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; -+ }; -+ }; -+ -+ ecluster_opp: opp-table-0 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp01 { -+ opp-hz = /bits/ 64 <600000000>; -+ opp-level = <1>; -+ clock-latency-ns = <7500>; -+ }; -+ opp02 { -+ opp-hz = /bits/ 64 <912000000>; -+ opp-level = <2>; -+ clock-latency-ns = <20000>; -+ }; -+ opp03 { -+ opp-hz = /bits/ 64 <1284000000>; -+ opp-level = <3>; -+ clock-latency-ns = <22000>; -+ }; -+ opp04 { -+ opp-hz = /bits/ 64 <1752000000>; -+ opp-level = <4>; -+ clock-latency-ns = <30000>; -+ }; -+ opp05 { -+ opp-hz = /bits/ 64 <2004000000>; -+ opp-level = <5>; -+ clock-latency-ns = <35000>; -+ }; -+ opp06 { -+ opp-hz = /bits/ 64 <2256000000>; -+ opp-level = <6>; -+ clock-latency-ns = <39000>; -+ }; -+ opp07 { -+ opp-hz = /bits/ 64 <2424000000>; -+ opp-level = <7>; -+ clock-latency-ns = <53000>; -+ }; -+ }; -+ -+ pcluster_opp: opp-table-1 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp01 { -+ opp-hz = /bits/ 64 <660000000>; -+ opp-level = <1>; -+ clock-latency-ns = <9000>; -+ }; -+ opp02 { -+ opp-hz = /bits/ 64 <924000000>; -+ opp-level = <2>; -+ clock-latency-ns = <19000>; -+ }; -+ opp03 { -+ opp-hz = /bits/ 64 <1188000000>; -+ opp-level = <3>; -+ clock-latency-ns = <22000>; -+ }; -+ opp04 { -+ opp-hz = /bits/ 64 <1452000000>; -+ opp-level = <4>; -+ clock-latency-ns = <24000>; -+ }; -+ opp05 { -+ opp-hz = /bits/ 64 <1704000000>; -+ opp-level = <5>; -+ clock-latency-ns = <26000>; -+ }; -+ opp06 { -+ opp-hz = /bits/ 64 <1968000000>; -+ opp-level = <6>; -+ clock-latency-ns = <28000>; -+ }; -+ opp07 { -+ opp-hz = /bits/ 64 <2208000000>; -+ opp-level = <7>; -+ clock-latency-ns = <30000>; -+ }; -+ opp08 { -+ opp-hz = /bits/ 64 <2400000000>; -+ opp-level = <8>; -+ clock-latency-ns = <33000>; -+ }; -+ opp09 { -+ opp-hz = /bits/ 64 <2568000000>; -+ opp-level = <9>; -+ clock-latency-ns = <34000>; -+ }; -+ opp10 { -+ opp-hz = /bits/ 64 <2724000000>; -+ opp-level = <10>; -+ clock-latency-ns = <36000>; -+ }; -+ opp11 { -+ opp-hz = /bits/ 64 <2868000000>; -+ opp-level = <11>; -+ clock-latency-ns = <41000>; -+ }; -+ opp12 { -+ opp-hz = /bits/ 64 <2988000000>; -+ opp-level = <12>; -+ clock-latency-ns = <42000>; -+ }; -+ opp13 { -+ opp-hz = /bits/ 64 <3096000000>; -+ opp-level = <13>; -+ clock-latency-ns = <44000>; -+ }; -+ opp14 { -+ opp-hz = /bits/ 64 <3204000000>; -+ opp-level = <14>; -+ clock-latency-ns = <46000>; -+ }; -+ /* Not available until CPU deep sleep is implemented */ -+#if 0 -+ opp15 { -+ opp-hz = /bits/ 64 <3324000000>; -+ opp-level = <15>; -+ clock-latency-ns = <62000>; -+ turbo-mode; -+ }; -+ opp16 { -+ opp-hz = /bits/ 64 <3408000000>; -+ opp-level = <16>; -+ clock-latency-ns = <62000>; -+ turbo-mode; -+ }; -+ opp17 { -+ opp-hz = /bits/ 64 <3504000000>; -+ opp-level = <17>; -+ clock-latency-ns = <62000>; -+ turbo-mode; -+ }; -+#endif -+ }; -+ -+ timer { -+ compatible = "arm,armv8-timer"; -+ interrupt-parent = <&aic>; -+ interrupt-names = "phys", "virt", "hyp-phys", "hyp-virt"; -+ interrupts = , -+ , -+ , -+ ; -+ }; -+ -+ pmu-e { -+ compatible = "apple,blizzard-pmu"; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ }; -+ -+ pmu-p { -+ compatible = "apple,avalanche-pmu"; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ }; -+ -+ clkref: clock-ref { -+ compatible = "fixed-clock"; -+ #clock-cells = <0>; -+ clock-frequency = <24000000>; -+ clock-output-names = "clkref"; -+ }; -+ -+ clk_120m: clock-120m { -+ compatible = "fixed-clock"; -+ #clock-cells = <0>; -+ clock-frequency = <120000000>; -+ clock-output-names = "clk_120m"; -+ }; -+ -+ soc { -+ compatible = "simple-bus"; -+ #address-cells = <2>; -+ #size-cells = <2>; -+ -+ ranges; -+ nonposted-mmio; -+ -+ cpufreq_hw: cpufreq@210e20000 { -+ compatible = "apple,t8112-soc-cpufreq", "apple,soc-cpufreq"; -+ reg = <0x2 0x10e20000 0 0x1000>, -+ <0x2 0x11e20000 0 0x1000>; -+ reg-names = "cluster0", "cluster1"; -+ -+ #freq-domain-cells = <1>; -+ }; -+ -+ i2c0: i2c@235010000 { -+ compatible = "apple,t8112-i2c", "apple,i2c"; -+ reg = <0x2 0x35010000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c0_pins>; -+ pinctrl-names = "default"; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ power-domains = <&ps_i2c0>; -+ }; -+ -+ i2c1: i2c@235014000 { -+ compatible = "apple,t8112-i2c", "apple,i2c"; -+ reg = <0x2 0x35014000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c1_pins>; -+ pinctrl-names = "default"; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ power-domains = <&ps_i2c1>; -+ }; -+ -+ i2c2: i2c@235018000 { -+ compatible = "apple,t8112-i2c", "apple,i2c"; -+ reg = <0x2 0x35018000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c2_pins>; -+ pinctrl-names = "default"; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ status = "disabled"; /* not used in all devices */ -+ power-domains = <&ps_i2c2>; -+ }; -+ -+ i2c3: i2c@23501c000 { -+ compatible = "apple,t8112-i2c", "apple,i2c"; -+ reg = <0x2 0x3501c000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c3_pins>; -+ pinctrl-names = "default"; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ power-domains = <&ps_i2c3>; -+ }; -+ -+ i2c4: i2c@235020000 { -+ compatible = "apple,t8112-i2c", "apple,i2c"; -+ reg = <0x2 0x35020000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ pinctrl-0 = <&i2c4_pins>; -+ pinctrl-names = "default"; -+ #address-cells = <0x1>; -+ #size-cells = <0x0>; -+ power-domains = <&ps_i2c4>; -+ status = "disabled"; -+ }; -+ -+ spi3: spi@23510c000 { -+ compatible = "apple,t8112-spi", "apple,spi"; -+ reg = <0x2 0x3510c000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ clocks = <&clk_120m>; -+ pinctrl-0 = <&spi3_pins>; -+ pinctrl-names = "default"; -+ power-domains = <&ps_spi3>; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ status = "disabled"; -+ }; -+ -+ serial0: serial@235200000 { -+ compatible = "apple,s5l-uart"; -+ reg = <0x2 0x35200000 0x0 0x1000>; -+ reg-io-width = <4>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ /* -+ * TODO: figure out the clocking properly, there may -+ * be a third selectable clock. -+ */ -+ clocks = <&clkref>, <&clkref>; -+ clock-names = "uart", "clk_uart_baud0"; -+ power-domains = <&ps_uart0>; -+ status = "disabled"; -+ }; -+ -+ serial2: serial@235208000 { -+ compatible = "apple,s5l-uart"; -+ reg = <0x2 0x35208000 0x0 0x1000>; -+ reg-io-width = <4>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ clocks = <&clkref>, <&clkref>; -+ clock-names = "uart", "clk_uart_baud0"; -+ power-domains = <&ps_uart2>; -+ status = "disabled"; -+ }; -+ -+ aic: interrupt-controller@23b0c0000 { -+ compatible = "apple,t8112-aic", "apple,aic2"; -+ #interrupt-cells = <3>; -+ interrupt-controller; -+ reg = <0x2 0x3b0c0000 0x0 0x8000>, -+ <0x2 0x3b0c8000 0x0 0x4>; -+ reg-names = "core", "event"; -+ power-domains = <&ps_aic>; -+ -+ affinities { -+ e-core-pmu-affinity { -+ apple,fiq-index = ; -+ cpus = <&cpu_e0 &cpu_e1 &cpu_e2 &cpu_e3>; -+ }; -+ -+ p-core-pmu-affinity { -+ apple,fiq-index = ; -+ cpus = <&cpu_p0 &cpu_p1 &cpu_p2 &cpu_p3>; -+ }; -+ }; -+ }; -+ -+ pmgr: power-management@23b700000 { -+ compatible = "apple,t8112-pmgr", "apple,pmgr", "syscon", "simple-mfd"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ reg = <0x2 0x3b700000 0 0x10000>; -+ }; -+ -+ pinctrl_ap: pinctrl@23c100000 { -+ compatible = "apple,t8112-pinctrl", "apple,pinctrl"; -+ reg = <0x2 0x3c100000 0x0 0x100000>; -+ power-domains = <&ps_gpio>; -+ -+ gpio-controller; -+ #gpio-cells = <2>; -+ gpio-ranges = <&pinctrl_ap 0 0 213>; -+ apple,npins = <213>; -+ -+ interrupt-controller; -+ #interrupt-cells = <2>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ , -+ , -+ , -+ ; -+ -+ i2c0_pins: i2c0-pins { -+ pinmux = , -+ ; -+ }; -+ -+ i2c1_pins: i2c1-pins { -+ pinmux = , -+ ; -+ }; -+ -+ i2c2_pins: i2c2-pins { -+ pinmux = , -+ ; -+ }; -+ -+ i2c3_pins: i2c3-pins { -+ pinmux = , -+ ; -+ }; -+ -+ i2c4_pins: i2c4-pins { -+ pinmux = , -+ ; -+ }; -+ -+ spi3_pins: spi3-pins { -+ pinmux = , -+ , -+ , -+ ; -+ }; -+ -+ pcie_pins: pcie-pins { -+ pinmux = ; -+ // TODO: 3 more CLKREQs -+ }; -+ }; -+ -+ nub_spmi: spmi@23d0d9300 { -+ compatible = "apple,t8112-spmi", "apple,spmi"; -+ reg = <0x2 0x3d714000 0x0 0x100>; -+ #address-cells = <2>; -+ #size-cells = <0>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ ; -+ -+ pmu1: pmu@e { -+ compatible = "apple,stowe-pmu", "apple,spmi-pmu"; -+ reg = <0xe SPMI_USID>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ rtc_nvmem@f800 { -+ compatible = "apple,spmi-pmu-nvmem"; -+ reg = <0xf800 0x300>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ pm_setting: pm-setting@1 { -+ reg = <0x1 0x1>; -+ }; -+ -+ rtc_offset: rtc-offset@100 { -+ reg = <0x100 0x6>; -+ }; -+ }; -+ -+ legacy_nvmem@f700 { -+ compatible = "apple,spmi-pmu-nvmem"; -+ reg = <0xf700 0x20>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ boot_stage: boot-stage@1 { -+ reg = <0x1 0x1>; -+ }; -+ -+ boot_error_count: boot-error-count@2 { -+ reg = <0x2 0x1>; -+ bits = <0 4>; -+ }; -+ -+ panic_count: panic-count@2 { -+ reg = <0x2 0x1>; -+ bits = <4 4>; -+ }; -+ -+ boot_error_stage: boot-error-stage@3 { -+ reg = <0x3 0x1>; -+ }; -+ -+ shutdown_flag: shutdown-flag@f { -+ reg = <0xf 0x1>; -+ bits = <3 1>; -+ }; -+ }; -+ -+ scrpad_nvmem@8000 { -+ compatible = "apple,spmi-pmu-nvmem"; -+ reg = <0x8000 0x2800>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ fault_shadow: fault-shadow@67b { -+ reg = <0x67b 0x10>; -+ }; -+ -+ socd: socd@b00 { -+ reg = <0xb00 0x400>; -+ }; -+ }; -+ -+ }; -+ }; -+ -+ pinctrl_nub: pinctrl@23d1f0000 { -+ compatible = "apple,t8112-pinctrl", "apple,pinctrl"; -+ reg = <0x2 0x3d1f0000 0x0 0x4000>; -+ power-domains = <&ps_nub_gpio>; -+ -+ gpio-controller; -+ #gpio-cells = <2>; -+ gpio-ranges = <&pinctrl_nub 0 0 24>; -+ apple,npins = <24>; -+ -+ interrupt-controller; -+ #interrupt-cells = <2>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ , -+ , -+ , -+ ; -+ }; -+ -+ pmgr_mini: power-management@23d280000 { -+ compatible = "apple,t8112-pmgr", "apple,pmgr", "syscon", "simple-mfd"; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ reg = <0x2 0x3d280000 0 0x4000>; -+ }; -+ -+ wdt: watchdog@23d2b0000 { -+ compatible = "apple,t8112-wdt", "apple,wdt"; -+ reg = <0x2 0x3d2b0000 0x0 0x4000>; -+ clocks = <&clkref>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ }; -+ -+ smc_mbox: mbox@23e408000 { -+ compatible = "apple,t8112-asc-mailbox", "apple,asc-mailbox-v4"; -+ reg = <0x2 0x3e408000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ ; -+ interrupt-names = "send-empty", "send-not-empty", -+ "recv-empty", "recv-not-empty"; -+ #mbox-cells = <0>; -+ }; -+ -+ smc: smc@23e400000 { -+ compatible = "apple,t8112-smc", "apple,smc"; -+ reg = <0x2 0x3e400000 0x0 0x4000>, -+ <0x2 0x3fe00000 0x0 0x100000>; -+ reg-names = "smc", "sram"; -+ mboxes = <&smc_mbox>; -+ -+ smc_gpio: gpio { -+ gpio-controller; -+ #gpio-cells = <2>; -+ }; -+ -+ smc_rtc: rtc { -+ nvmem-cells = <&rtc_offset>; -+ nvmem-cell-names = "rtc_offset"; -+ }; -+ -+ smc_reboot: reboot { -+ nvmem-cells = <&shutdown_flag>, <&boot_stage>, -+ <&boot_error_count>, <&panic_count>, <&pm_setting>; -+ nvmem-cell-names = "shutdown_flag", "boot_stage", -+ "boot_error_count", "panic_count", "pm_setting"; -+ }; -+ }; -+ -+ pinctrl_smc: pinctrl@23e820000 { -+ compatible = "apple,t8112-pinctrl", "apple,pinctrl"; -+ reg = <0x2 0x3e820000 0x0 0x4000>; -+ -+ gpio-controller; -+ #gpio-cells = <2>; -+ gpio-ranges = <&pinctrl_smc 0 0 18>; -+ apple,npins = <18>; -+ -+ interrupt-controller; -+ #interrupt-cells = <2>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ , -+ , -+ , -+ ; -+ }; -+ -+ pinctrl_aop: pinctrl@24a820000 { -+ compatible = "apple,t8112-pinctrl", "apple,pinctrl"; -+ reg = <0x2 0x4a820000 0x0 0x4000>; -+ -+ gpio-controller; -+ #gpio-cells = <2>; -+ gpio-ranges = <&pinctrl_aop 0 0 54>; -+ apple,npins = <54>; -+ -+ interrupt-controller; -+ #interrupt-cells = <2>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ , -+ , -+ , -+ ; -+ }; -+ -+ mtp: mtp@24e400000 { -+ compatible = "apple,t8112-mtp", "apple,t8112-rtk-helper-asc4", "apple,mtp", "apple,rtk-helper-asc4"; -+ reg = <0x2 0x4e400000 0x0 0x4000>, -+ <0x2 0x4ec9c000 0x0 0x8000>; -+ reg-names = "asc", "sram"; -+ mboxes = <&mtp_mbox>; -+ iommus = <&mtp_dart 1>; -+ #helper-cells = <0>; -+ -+ status = "disabled"; -+ }; -+ -+ mtp_mbox: mbox@24e408000 { -+ compatible = "apple,t8112-asc-mailbox", "apple,asc-mailbox-v4"; -+ reg = <0x2 0x4e408000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ ; -+ interrupt-names = "send-empty", "send-not-empty", -+ "recv-empty", "recv-not-empty"; -+ #mbox-cells = <0>; -+ -+ status = "disabled"; -+ }; -+ -+ mtp_dart: iommu@24e808000 { -+ compatible = "apple,t8112-dart", "apple,t8110-dart"; -+ reg = <0x2 0x4e808000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ -+ status = "disabled"; -+ }; -+ -+ mtp_dockchannel: fifo@24eb14000 { -+ compatible = "apple,t8112-dockchannel", "apple,dockchannel"; -+ reg = <0x2 0x4eb14000 0x0 0x4000>; -+ reg-names = "irq"; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ -+ ranges = <0 0x2 0x4eb28000 0x20000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ -+ interrupt-controller; -+ #interrupt-cells = <2>; -+ -+ status = "disabled"; -+ -+ mtp_hid: input@8000 { -+ compatible = "apple,dockchannel-hid"; -+ reg = <0x8000 0x4000>, -+ <0xc000 0x4000>, -+ <0x0000 0x4000>, -+ <0x4000 0x4000>; -+ reg-names = "config", "data", -+ "rmt-config", "rmt-data"; -+ iommus = <&mtp_dart 1>; -+ interrupt-parent = <&mtp_dockchannel>; -+ interrupts = <2 IRQ_TYPE_LEVEL_HIGH>, -+ <3 IRQ_TYPE_LEVEL_HIGH>; -+ interrupt-names = "tx", "rx"; -+ -+ apple,fifo-size = <0x800>; -+ apple,helper-cpu = <&mtp>; -+ }; -+ -+ }; -+ -+ ans_mbox: mbox@277408000 { -+ compatible = "apple,t8112-asc-mailbox", "apple,asc-mailbox-v4"; -+ reg = <0x2 0x77408000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ ; -+ interrupt-names = "send-empty", "send-not-empty", -+ "recv-empty", "recv-not-empty"; -+ #mbox-cells = <0>; -+ power-domains = <&ps_ans>; -+ }; -+ -+ sart: sart@27bc50000 { -+ compatible = "apple,t8112-sart", "apple,t6000-sart"; -+ reg = <0x2 0x7bc50000 0x0 0x10000>; -+ power-domains = <&ps_ans>; -+ }; -+ -+ nvme@27bcc0000 { -+ compatible = "apple,t8112-nvme-ans2", "apple,nvme-ans2"; -+ reg = <0x2 0x7bcc0000 0x0 0x40000>, -+ <0x2 0x77400000 0x0 0x4000>; -+ reg-names = "nvme", "ans"; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ mboxes = <&ans_mbox>; -+ apple,sart = <&sart>; -+ power-domains = <&ps_ans>, <&ps_apcie_st>; -+ power-domain-names = "ans", "apcie0"; -+ resets = <&ps_ans>; -+ }; -+ -+ dwc3_0: usb@382280000 { -+ compatible = "apple,t8112-dwc3", "apple,dwc3", "snps,dwc3"; -+ reg = <0x3 0x82280000 0x0 0x100000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ dr_mode = "otg"; -+ usb-role-switch; -+ role-switch-default-mode = "host"; -+ iommus = <&dwc3_0_dart_0 0>, <&dwc3_0_dart_1 1>; -+ power-domains = <&ps_atc0_usb>; -+ }; -+ -+ dwc3_0_dart_0: iommu@382f00000 { -+ compatible = "apple,t8112-dart", "apple,t8110-dart"; -+ reg = <0x3 0x82f00000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_atc0_usb>; -+ }; -+ -+ dwc3_0_dart_1: iommu@382f80000 { -+ compatible = "apple,t8112-dart", "apple,t8110-dart"; -+ reg = <0x3 0x82f80000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_atc0_usb>; -+ }; -+ -+ dwc3_1: usb@502280000 { -+ compatible = "apple,t8112-dwc3", "apple,dwc3", "snps,dwc3"; -+ reg = <0x5 0x02280000 0x0 0x100000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ dr_mode = "otg"; -+ usb-role-switch; -+ role-switch-default-mode = "host"; -+ iommus = <&dwc3_1_dart_0 0>, <&dwc3_1_dart_1 1>; -+ power-domains = <&ps_atc1_usb>; -+ }; -+ -+ dwc3_1_dart_0: iommu@502f00000 { -+ compatible = "apple,t8112-dart", "apple,t8110-dart"; -+ reg = <0x5 0x02f00000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_atc1_usb>; -+ }; -+ -+ dwc3_1_dart_1: iommu@502f80000 { -+ compatible = "apple,t8112-dart", "apple,t8110-dart"; -+ reg = <0x5 0x02f80000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_atc1_usb>; -+ }; -+ -+ pcie0_dart: dart@681008000 { -+ compatible = "apple,t8112-dart", "apple,t8110-dart"; -+ reg = <0x6 0x81008000 0x0 0x4000>; -+ #iommu-cells = <1>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ power-domains = <&ps_apcie_gp>; -+ }; -+ -+ pcie0: pcie@690000000 { -+ compatible = "apple,t8112-pcie", "apple,pcie"; -+ device_type = "pci"; -+ -+ reg = <0x6 0x90000000 0x0 0x1000000>, -+ <0x6 0x80000000 0x0 0x100000>, -+ <0x6 0x81000000 0x0 0x4000>, -+ <0x6 0x82000000 0x0 0x4000>, -+ <0x6 0x83000000 0x0 0x4000>, -+ <0x6 0x84000000 0x0 0x4000>; -+ reg-names = "config", "rc", "port0", "port1", "port2", "port3"; -+ -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ ; -+ -+ msi-controller; -+ msi-parent = <&pcie0>; -+ msi-ranges = <&aic AIC_IRQ 793 IRQ_TYPE_EDGE_RISING 32>; -+ -+ iommu-map = <0x100 &pcie0_dart 0 1>, -+ <0x200 &pcie0_dart 1 1>, -+ <0x300 &pcie0_dart 2 1>, -+ <0x400 &pcie0_dart 3 1>; -+ iommu-map-mask = <0xff00>; -+ -+ bus-range = <0 4>; -+ #address-cells = <3>; -+ #size-cells = <2>; -+ ranges = <0x43000000 0x6 0xa0000000 0x6 0xa0000000 0x0 0x20000000>, -+ <0x02000000 0x0 0xc0000000 0x6 0xc0000000 0x0 0x40000000>; -+ -+ power-domains = <&ps_apcie_gp>; -+ pinctrl-0 = <&pcie_pins>; -+ pinctrl-names = "default"; -+ -+ port00: pci@0,0 { -+ device_type = "pci"; -+ reg = <0x0 0x0 0x0 0x0 0x0>; -+ reset-gpios = <&pinctrl_ap 166 GPIO_ACTIVE_LOW>; -+ -+ #address-cells = <3>; -+ #size-cells = <2>; -+ ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port00 0 0 0 0>, -+ <0 0 0 2 &port00 0 0 0 1>, -+ <0 0 0 3 &port00 0 0 0 2>, -+ <0 0 0 4 &port00 0 0 0 3>; -+ }; -+ -+ /* TODO: GPIOs unknown */ -+ port01: pci@1,0 { -+ device_type = "pci"; -+ reg = <0x800 0x0 0x0 0x0 0x0>; -+ //reset-gpios = <&pinctrl_ap 153 GPIO_ACTIVE_LOW>; -+ -+ #address-cells = <3>; -+ #size-cells = <2>; -+ ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port01 0 0 0 0>, -+ <0 0 0 2 &port01 0 0 0 1>, -+ <0 0 0 3 &port01 0 0 0 2>, -+ <0 0 0 4 &port01 0 0 0 3>; -+ }; -+ -+ port02: pci@2,0 { -+ device_type = "pci"; -+ reg = <0x1000 0x0 0x0 0x0 0x0>; -+ //reset-gpios = <&pinctrl_ap 33 GPIO_ACTIVE_LOW>; -+ -+ #address-cells = <3>; -+ #size-cells = <2>; -+ ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port02 0 0 0 0>, -+ <0 0 0 2 &port02 0 0 0 1>, -+ <0 0 0 3 &port02 0 0 0 2>, -+ <0 0 0 4 &port02 0 0 0 3>; -+ }; -+ -+ port03: pci@3,0 { -+ device_type = "pci"; -+ reg = <0x1800 0x0 0x0 0x0 0x0>; -+ //reset-gpios = <&pinctrl_ap 33 GPIO_ACTIVE_LOW>; -+ -+ #address-cells = <3>; -+ #size-cells = <2>; -+ ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port03 0 0 0 0>, -+ <0 0 0 2 &port03 0 0 0 1>, -+ <0 0 0 3 &port03 0 0 0 2>, -+ <0 0 0 4 &port03 0 0 0 3>; -+ }; -+ }; -+ -+ dart_sio: iommu@235004000 { -+ compatible = "apple,t8112-dart", "apple,t8110-dart", "apple,dart"; -+ reg = <0x2 0x35004000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ power-domains = <&ps_sio_cpu>; -+ }; -+ -+ nco_inp: clock-ref { -+ compatible = "fixed-factor-clock"; -+ clocks = <&clkref>; -+ #clock-cells = <0>; -+ clock-mult = <75>; -+ clock-div = <2>; // 24 MHz * (75/2) = 900 MHz -+ clock-output-names = "nco_inp"; -+ }; -+ -+ nco: nco@23b044000 { -+ compatible = "apple,t8112-nco", "apple,nco"; -+ reg = <0x2 0x3b044000 0x0 0x14000>; -+ clocks = <&nco_inp>; -+ #clock-cells = <1>; -+ apple,nchannels = <5>; -+ }; -+ -+ admac: dma-controller@238200000 { -+ compatible = "apple,t8112-admac", "apple,admac"; -+ reg = <0x2 0x38200000 0x0 0x34000>; -+ dma-channels = <24>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #dma-cells = <1>; -+ iommus = <&dart_sio 2>; -+ power-domains = <&ps_sio_adma>; -+ apple,internal-irq-destination = <1>; -+ }; -+ -+ mca: mca@38400000 { -+ compatible = "apple,t8112-mca", "apple,mca"; -+ reg = <0x2 0x38400000 0x0 0x18000>, -+ <0x2 0x38300000 0x0 0x30000>; -+ reg-names = "clusters", "switch"; -+ -+ interrupt-parent = <&aic>; -+ interrupts = , -+ , -+ , -+ , -+ , -+ ; -+ -+ clocks = <&nco 0>, <&nco 1>, <&nco 2>, -+ <&nco 3>, <&nco 4>, <&nco 4>; -+ power-domains = <&ps_audio_p>, <&ps_mca0>, <&ps_mca1>, -+ <&ps_mca2>, <&ps_mca3>, <&ps_mca4>, <&ps_mca5>; -+ dmas = <&admac 0>, <&admac 1>, <&admac 2>, <&admac 3>, -+ <&admac 4>, <&admac 5>, <&admac 6>, <&admac 7>, -+ <&admac 8>, <&admac 9>, <&admac 10>, <&admac 11>, -+ <&admac 12>, <&admac 13>, <&admac 14>, <&admac 15>, -+ <&admac 16>, <&admac 17>, <&admac 18>, <&admac 19>, -+ <&admac 20>, <&admac 21>, <&admac 22>, <&admac 23>; -+ dma-names = "tx0a", "rx0a", "tx0b", "rx0b", -+ "tx1a", "rx1a", "tx1b", "rx1b", -+ "tx2a", "rx2a", "tx2b", "rx2b", -+ "tx3a", "rx3a", "tx3b", "rx3b", -+ "tx4a", "rx4a", "tx4b", "rx4b", -+ "tx5a", "rx5a", "tx5b", "rx5b"; -+ -+ #sound-dai-cells = <1>; -+ apple,nclusters = <6>; -+ }; -+ }; -+}; -+ -+#include "t8112-pmgr.dtsi" --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0038-arm64-dts-apple-t8112-j413-Fix-IRQ-for-hpm5.patch b/target/linux/silicon/patches-5.19/0038-arm64-dts-apple-t8112-j413-Fix-IRQ-for-hpm5.patch deleted file mode 100644 index 24d5f70cd..000000000 --- a/target/linux/silicon/patches-5.19/0038-arm64-dts-apple-t8112-j413-Fix-IRQ-for-hpm5.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 792f2972bf4474af46468ab83cc7e0ab91469f2c Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 24 Jul 2022 00:11:49 +0900 -Subject: [PATCH 038/171] arm64: dts: apple: t8112-j413: Fix IRQ for hpm5 - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8112-j413.dts | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/arch/arm64/boot/dts/apple/t8112-j413.dts b/arch/arm64/boot/dts/apple/t8112-j413.dts -index 0cc993c0a5b4..0d4306a39fe8 100644 ---- a/arch/arm64/boot/dts/apple/t8112-j413.dts -+++ b/arch/arm64/boot/dts/apple/t8112-j413.dts -@@ -74,7 +74,7 @@ hpm5: usb-pd@3a { - compatible = "apple,cd321x"; - reg = <0x3a>; - interrupt-parent = <&pinctrl_ap>; -- interrupts = <174 IRQ_TYPE_LEVEL_LOW>; -+ interrupts = <8 IRQ_TYPE_LEVEL_LOW>; - interrupt-names = "irq"; - }; - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0039-MAINTAINERS-Add-Apple-dwc3-bindings-to-ARM-APPLE.patch b/target/linux/silicon/patches-5.19/0039-MAINTAINERS-Add-Apple-dwc3-bindings-to-ARM-APPLE.patch deleted file mode 100644 index 545955d6d..000000000 --- a/target/linux/silicon/patches-5.19/0039-MAINTAINERS-Add-Apple-dwc3-bindings-to-ARM-APPLE.patch +++ /dev/null @@ -1,30 +0,0 @@ -From aa4f300d5409c9a3d21787d170755ed417f95157 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 12 Dec 2021 12:28:41 +0900 -Subject: [PATCH 039/171] MAINTAINERS: Add Apple dwc3 bindings to ARM/APPLE - -This Apple dwc3 controller variance is present on Apple ARM SoCs (t8103/t600x). - -Splitting this change from the binding/driver commits to avoid merge -conflicts with other things touching this section, as usual. - -Signed-off-by: Hector Martin ---- - MAINTAINERS | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/MAINTAINERS b/MAINTAINERS -index 64379c699903..b346659f9562 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1843,6 +1843,7 @@ F: Documentation/devicetree/bindings/nvmem/apple,efuses.yaml - F: Documentation/devicetree/bindings/pci/apple,pcie.yaml - F: Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml - F: Documentation/devicetree/bindings/power/apple* -+F: Documentation/devicetree/bindings/usb/apple,dwc3.yaml - F: Documentation/devicetree/bindings/watchdog/apple,wdt.yaml - F: arch/arm64/boot/dts/apple/ - F: drivers/clk/clk-apple-nco.c --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0040-MAINTAINERS-Add-apple-spi-driver-binding-files.patch b/target/linux/silicon/patches-5.19/0040-MAINTAINERS-Add-apple-spi-driver-binding-files.patch deleted file mode 100644 index 3775039a7..000000000 --- a/target/linux/silicon/patches-5.19/0040-MAINTAINERS-Add-apple-spi-driver-binding-files.patch +++ /dev/null @@ -1,38 +0,0 @@ -From fa0ce4da1a4d60e003f808c21c008fb19ee31152 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 12 Dec 2021 12:28:41 +0900 -Subject: [PATCH 040/171] MAINTAINERS: Add apple-spi driver & binding files - -This Apple SPI controller is present on Apple ARM SoCs (t8103/t6000). - -Splitting this change from the binding/driver commits to avoid merge -conflicts with other things touching this section, as usual. - -Signed-off-by: Hector Martin ---- - MAINTAINERS | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/MAINTAINERS b/MAINTAINERS -index b346659f9562..629c1a177d3f 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1843,6 +1843,7 @@ F: Documentation/devicetree/bindings/nvmem/apple,efuses.yaml - F: Documentation/devicetree/bindings/pci/apple,pcie.yaml - F: Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml - F: Documentation/devicetree/bindings/power/apple* -+F: Documentation/devicetree/bindings/spi/apple,spi.yaml - F: Documentation/devicetree/bindings/usb/apple,dwc3.yaml - F: Documentation/devicetree/bindings/watchdog/apple,wdt.yaml - F: arch/arm64/boot/dts/apple/ -@@ -1856,6 +1857,7 @@ F: drivers/nvme/host/apple.c - F: drivers/nvmem/apple-efuses.c - F: drivers/pinctrl/pinctrl-apple-gpio.c - F: drivers/soc/apple/* -+F: drivers/spi/spi-apple.c - F: drivers/watchdog/apple_wdt.c - F: include/dt-bindings/interrupt-controller/apple-aic.h - F: include/dt-bindings/pinctrl/apple.h --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0041-mailbox-apple-Implement-flush-operation.patch b/target/linux/silicon/patches-5.19/0041-mailbox-apple-Implement-flush-operation.patch deleted file mode 100644 index 11ad2e035..000000000 --- a/target/linux/silicon/patches-5.19/0041-mailbox-apple-Implement-flush-operation.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 8a4bb71a27420d66c52e0b0347dddb5853c69a15 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 8 Feb 2022 16:57:47 +0900 -Subject: [PATCH 041/171] mailbox: apple: Implement flush() operation - -This allows clients to use the atomic-safe mailbox API style. - -Signed-off-by: Hector Martin ---- - drivers/mailbox/apple-mailbox.c | 27 +++++++++++++++++++++++++++ - 1 file changed, 27 insertions(+) - -diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c -index 496c4951ccb1..33e7acf71e3e 100644 ---- a/drivers/mailbox/apple-mailbox.c -+++ b/drivers/mailbox/apple-mailbox.c -@@ -17,6 +17,7 @@ - */ - - #include -+#include - #include - #include - #include -@@ -112,6 +113,14 @@ static bool apple_mbox_hw_can_send(struct apple_mbox *apple_mbox) - return !(mbox_ctrl & apple_mbox->hw->control_full); - } - -+static bool apple_mbox_hw_send_empty(struct apple_mbox *apple_mbox) -+{ -+ u32 mbox_ctrl = -+ readl_relaxed(apple_mbox->regs + apple_mbox->hw->a2i_control); -+ -+ return mbox_ctrl & apple_mbox->hw->control_empty; -+} -+ - static int apple_mbox_hw_send(struct apple_mbox *apple_mbox, - struct apple_mbox_msg *msg) - { -@@ -219,6 +228,23 @@ static irqreturn_t apple_mbox_recv_irq(int irq, void *data) - return IRQ_HANDLED; - } - -+static int apple_mbox_chan_flush(struct mbox_chan *chan, unsigned long timeout) -+{ -+ struct apple_mbox *apple_mbox = chan->con_priv; -+ unsigned long deadline = jiffies + msecs_to_jiffies(timeout); -+ -+ while (time_before(jiffies, deadline)) { -+ if (apple_mbox_hw_send_empty(apple_mbox)) { -+ mbox_chan_txdone(&apple_mbox->chan, 0); -+ return 0; -+ } -+ -+ udelay(1); -+ } -+ -+ return -ETIME; -+} -+ - static int apple_mbox_chan_startup(struct mbox_chan *chan) - { - struct apple_mbox *apple_mbox = chan->con_priv; -@@ -250,6 +276,7 @@ static void apple_mbox_chan_shutdown(struct mbox_chan *chan) - - static const struct mbox_chan_ops apple_mbox_ops = { - .send_data = apple_mbox_chan_send_data, -+ .flush = apple_mbox_chan_flush, - .startup = apple_mbox_chan_startup, - .shutdown = apple_mbox_chan_shutdown, - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0042-mailbox-apple-Implement-poll_data-operation.patch b/target/linux/silicon/patches-5.19/0042-mailbox-apple-Implement-poll_data-operation.patch deleted file mode 100644 index e8890e056..000000000 --- a/target/linux/silicon/patches-5.19/0042-mailbox-apple-Implement-poll_data-operation.patch +++ /dev/null @@ -1,106 +0,0 @@ -From fa28fb2edcc310f9038538b2f1d27998b01c7db7 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 8 Feb 2022 19:16:08 +0900 -Subject: [PATCH 042/171] mailbox: apple: Implement poll_data() operation - -This allows clients running in atomic context to poll for messages to -arrive. - -Signed-off-by: Hector Martin ---- - drivers/mailbox/apple-mailbox.c | 37 ++++++++++++++++++++++++++++++--- - 1 file changed, 34 insertions(+), 3 deletions(-) - -diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c -index 33e7acf71e3e..1c14ff63f3d3 100644 ---- a/drivers/mailbox/apple-mailbox.c -+++ b/drivers/mailbox/apple-mailbox.c -@@ -26,6 +26,7 @@ - #include - #include - #include -+#include - #include - - #define APPLE_ASC_MBOX_CONTROL_FULL BIT(16) -@@ -101,6 +102,7 @@ struct apple_mbox { - - struct device *dev; - struct mbox_controller controller; -+ spinlock_t rx_lock; - }; - - static const struct of_device_id apple_mbox_of_match[]; -@@ -204,13 +206,16 @@ static irqreturn_t apple_mbox_send_empty_irq(int irq, void *data) - return IRQ_HANDLED; - } - --static irqreturn_t apple_mbox_recv_irq(int irq, void *data) -+static int apple_mbox_poll(struct apple_mbox *apple_mbox) - { -- struct apple_mbox *apple_mbox = data; -+ - struct apple_mbox_msg msg; -+ int ret = 0; - -- while (apple_mbox_hw_recv(apple_mbox, &msg) == 0) -+ while (apple_mbox_hw_recv(apple_mbox, &msg) == 0) { - mbox_chan_received_data(&apple_mbox->chan, (void *)&msg); -+ ret++; -+ } - - /* - * The interrupt will keep firing even if there are no more messages -@@ -225,9 +230,33 @@ static irqreturn_t apple_mbox_recv_irq(int irq, void *data) - apple_mbox->regs + apple_mbox->hw->irq_ack); - } - -+ return ret; -+} -+ -+static irqreturn_t apple_mbox_recv_irq(int irq, void *data) -+{ -+ struct apple_mbox *apple_mbox = data; -+ -+ spin_lock(&apple_mbox->rx_lock); -+ apple_mbox_poll(apple_mbox); -+ spin_unlock(&apple_mbox->rx_lock); -+ - return IRQ_HANDLED; - } - -+static bool apple_mbox_chan_peek_data(struct mbox_chan *chan) -+{ -+ struct apple_mbox *apple_mbox = chan->con_priv; -+ unsigned long flags; -+ int ret; -+ -+ spin_lock_irqsave(&apple_mbox->rx_lock, flags); -+ ret = apple_mbox_poll(apple_mbox); -+ spin_unlock_irqrestore(&apple_mbox->rx_lock, flags); -+ -+ return ret > 0; -+} -+ - static int apple_mbox_chan_flush(struct mbox_chan *chan, unsigned long timeout) - { - struct apple_mbox *apple_mbox = chan->con_priv; -@@ -276,6 +305,7 @@ static void apple_mbox_chan_shutdown(struct mbox_chan *chan) - - static const struct mbox_chan_ops apple_mbox_ops = { - .send_data = apple_mbox_chan_send_data, -+ .peek_data = apple_mbox_chan_peek_data, - .flush = apple_mbox_chan_flush, - .startup = apple_mbox_chan_startup, - .shutdown = apple_mbox_chan_shutdown, -@@ -331,6 +361,7 @@ static int apple_mbox_probe(struct platform_device *pdev) - mbox->controller.txdone_irq = true; - mbox->controller.of_xlate = apple_mbox_of_xlate; - mbox->chan.con_priv = mbox; -+ spin_lock_init(&mbox->rx_lock); - - irqname = devm_kasprintf(dev, GFP_KERNEL, "%s-recv", dev_name(dev)); - if (!irqname) --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0043-mailbox-apple-Keep-IRQs-active-in-suspend.patch b/target/linux/silicon/patches-5.19/0043-mailbox-apple-Keep-IRQs-active-in-suspend.patch deleted file mode 100644 index 2825bd321..000000000 --- a/target/linux/silicon/patches-5.19/0043-mailbox-apple-Keep-IRQs-active-in-suspend.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 9a204cb4333ca42ebc6401f8c782f99c82f3a75d Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sat, 5 Mar 2022 01:08:33 +0900 -Subject: [PATCH 043/171] mailbox: apple: Keep IRQs active in suspend - -Some consumers (notably SMC) need to be wakeup sources for s2idle, -so the IRQs need to stay enabled during suspend. We expect -consumers to properly suspend coprocessors such that no IRQs would -be triggered where not necessary, so this can be done unconditionally. - -Signed-off-by: Hector Martin ---- - drivers/mailbox/apple-mailbox.c | 9 ++++----- - 1 file changed, 4 insertions(+), 5 deletions(-) - -diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c -index 1c14ff63f3d3..4b34b4d11bd6 100644 ---- a/drivers/mailbox/apple-mailbox.c -+++ b/drivers/mailbox/apple-mailbox.c -@@ -369,8 +369,8 @@ static int apple_mbox_probe(struct platform_device *pdev) - - ret = devm_request_threaded_irq(dev, mbox->irq_recv_not_empty, NULL, - apple_mbox_recv_irq, -- IRQF_NO_AUTOEN | IRQF_ONESHOT, irqname, -- mbox); -+ IRQF_NO_AUTOEN | IRQF_ONESHOT | IRQF_NO_SUSPEND, -+ irqname, mbox); - if (ret) - return ret; - -@@ -378,9 +378,8 @@ static int apple_mbox_probe(struct platform_device *pdev) - if (!irqname) - return -ENOMEM; - -- ret = devm_request_irq(dev, mbox->irq_send_empty, -- apple_mbox_send_empty_irq, IRQF_NO_AUTOEN, -- irqname, mbox); -+ ret = devm_request_irq(dev, mbox->irq_send_empty, apple_mbox_send_empty_irq, -+ IRQF_NO_AUTOEN | IRQF_NO_SUSPEND, irqname, mbox); - if (ret) - return ret; - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0044-mailbox-apple-Fix-races-around-poll-tx.patch b/target/linux/silicon/patches-5.19/0044-mailbox-apple-Fix-races-around-poll-tx.patch deleted file mode 100644 index bcb75ad0f..000000000 --- a/target/linux/silicon/patches-5.19/0044-mailbox-apple-Fix-races-around-poll-tx.patch +++ /dev/null @@ -1,101 +0,0 @@ -From f30928052eeecd551f0d3bbf5a7ac63913cbf6ae Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 5 May 2022 01:36:27 +0900 -Subject: [PATCH 044/171] mailbox: apple: Fix races around poll/tx - -Signed-off-by: Hector Martin ---- - drivers/mailbox/apple-mailbox.c | 33 +++++++++++++++++++++++++++++---- - 1 file changed, 29 insertions(+), 4 deletions(-) - -diff --git a/drivers/mailbox/apple-mailbox.c b/drivers/mailbox/apple-mailbox.c -index 4b34b4d11bd6..06c7ad3b1c03 100644 ---- a/drivers/mailbox/apple-mailbox.c -+++ b/drivers/mailbox/apple-mailbox.c -@@ -103,6 +103,8 @@ struct apple_mbox { - struct device *dev; - struct mbox_controller controller; - spinlock_t rx_lock; -+ spinlock_t tx_lock; -+ bool tx_pending; - }; - - static const struct of_device_id apple_mbox_of_match[]; -@@ -166,11 +168,15 @@ static int apple_mbox_chan_send_data(struct mbox_chan *chan, void *data) - { - struct apple_mbox *apple_mbox = chan->con_priv; - struct apple_mbox_msg *msg = data; -+ unsigned long flags; - int ret; - -+ spin_lock_irqsave(&apple_mbox->tx_lock, flags); -+ WARN_ON(apple_mbox->tx_pending); -+ - ret = apple_mbox_hw_send(apple_mbox, msg); - if (ret) -- return ret; -+ goto err_unlock; - - /* - * The interrupt is level triggered and will keep firing as long as the -@@ -185,9 +191,13 @@ static int apple_mbox_chan_send_data(struct mbox_chan *chan, void *data) - writel_relaxed(apple_mbox->hw->irq_bit_send_empty, - apple_mbox->regs + apple_mbox->hw->irq_ack); - } -+ apple_mbox->tx_pending = true; - enable_irq(apple_mbox->irq_send_empty); - -- return 0; -+err_unlock: -+ spin_unlock_irqrestore(&apple_mbox->tx_lock, flags); -+ -+ return ret; - } - - static irqreturn_t apple_mbox_send_empty_irq(int irq, void *data) -@@ -202,7 +212,14 @@ static irqreturn_t apple_mbox_send_empty_irq(int irq, void *data) - * it at the main controller again. - */ - disable_irq_nosync(apple_mbox->irq_send_empty); -- mbox_chan_txdone(&apple_mbox->chan, 0); -+ spin_lock(&apple_mbox->tx_lock); -+ if (apple_mbox->tx_pending) { -+ apple_mbox->tx_pending = false; -+ spin_unlock(&apple_mbox->tx_lock); -+ mbox_chan_txdone(&apple_mbox->chan, 0); -+ } else { -+ spin_unlock(&apple_mbox->tx_lock); -+ } - return IRQ_HANDLED; - } - -@@ -261,10 +278,17 @@ static int apple_mbox_chan_flush(struct mbox_chan *chan, unsigned long timeout) - { - struct apple_mbox *apple_mbox = chan->con_priv; - unsigned long deadline = jiffies + msecs_to_jiffies(timeout); -+ unsigned long flags; - - while (time_before(jiffies, deadline)) { - if (apple_mbox_hw_send_empty(apple_mbox)) { -- mbox_chan_txdone(&apple_mbox->chan, 0); -+ spin_lock_irqsave(&apple_mbox->tx_lock, flags); -+ if (apple_mbox->tx_pending) { -+ apple_mbox->tx_pending = false; -+ disable_irq_nosync(apple_mbox->irq_send_empty); -+ } -+ /* Mailbox subsystem will call txdone for us */ -+ spin_unlock_irqrestore(&apple_mbox->tx_lock, flags); - return 0; - } - -@@ -362,6 +386,7 @@ static int apple_mbox_probe(struct platform_device *pdev) - mbox->controller.of_xlate = apple_mbox_of_xlate; - mbox->chan.con_priv = mbox; - spin_lock_init(&mbox->rx_lock); -+ spin_lock_init(&mbox->tx_lock); - - irqname = devm_kasprintf(dev, GFP_KERNEL, "%s-recv", dev_name(dev)); - if (!irqname) --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0045-WIP-mailbox-fix-poll.patch b/target/linux/silicon/patches-5.19/0045-WIP-mailbox-fix-poll.patch deleted file mode 100644 index 88fee4e25..000000000 --- a/target/linux/silicon/patches-5.19/0045-WIP-mailbox-fix-poll.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 34019420175a9edf6d35b567815757eee727f078 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 5 May 2022 01:37:01 +0900 -Subject: [PATCH 045/171] WIP: mailbox: fix poll - -Signed-off-by: Hector Martin ---- - drivers/mailbox/mailbox.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c -index 4229b9b5da98..e27500e8cba9 100644 ---- a/drivers/mailbox/mailbox.c -+++ b/drivers/mailbox/mailbox.c -@@ -310,7 +310,7 @@ int mbox_flush(struct mbox_chan *chan, unsigned long timeout) - return -ENOTSUPP; - - ret = chan->mbox->ops->flush(chan, timeout); -- if (ret < 0) -+ if (ret >= 0) - tx_tick(chan, ret); - - return ret; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0046-dt-bindings-iommu-dart-add-t6000-compatible.patch b/target/linux/silicon/patches-5.19/0046-dt-bindings-iommu-dart-add-t6000-compatible.patch deleted file mode 100644 index 5e879e5cd..000000000 --- a/target/linux/silicon/patches-5.19/0046-dt-bindings-iommu-dart-add-t6000-compatible.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 88e0c4540822cbd63ec7618eaed2279126bdd042 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Tue, 2 Nov 2021 18:10:51 +0100 -Subject: [PATCH 046/171] dt-bindings: iommu: dart: add t6000 compatible - -The M1 Max/Pro SoCs come with a new DART variant that is incompatible with -the previous one. Add a new compatible for those. - -Signed-off-by: Sven Peter -Acked-by: Rob Herring - -Series-changes: 2 -- added Rob's Acked-by: - -Patch-cc: Mark Kettenis ---- - Documentation/devicetree/bindings/iommu/apple,dart.yaml | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/Documentation/devicetree/bindings/iommu/apple,dart.yaml b/Documentation/devicetree/bindings/iommu/apple,dart.yaml -index 82ad669feef7..06af2bacbe97 100644 ---- a/Documentation/devicetree/bindings/iommu/apple,dart.yaml -+++ b/Documentation/devicetree/bindings/iommu/apple,dart.yaml -@@ -22,7 +22,9 @@ description: |+ - - properties: - compatible: -- const: apple,t8103-dart -+ enum: -+ - apple,t8103-dart -+ - apple,t6000-dart - - reg: - maxItems: 1 --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0047-iommu-io-pgtable-Move-Apple-DART-support-to-its-own-.patch b/target/linux/silicon/patches-5.19/0047-iommu-io-pgtable-Move-Apple-DART-support-to-its-own-.patch deleted file mode 100644 index a64290244..000000000 --- a/target/linux/silicon/patches-5.19/0047-iommu-io-pgtable-Move-Apple-DART-support-to-its-own-.patch +++ /dev/null @@ -1,825 +0,0 @@ -From 799fd906a17a263eaad29e3246dc4b468bb1edc6 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Wed, 8 Jun 2022 19:07:49 +0200 -Subject: [PATCH 047/171] iommu/io-pgtable: Move Apple DART support to its own - file - -The pte format used by the DARTs found in the Apple M1 (t8103) is not -fully compatible with io-pgtable-arm. The 24 MSB are used for subpage -protection (mapping only parts of page) and conflict with the address -mask. In addition bit 1 is not available for tagging entries but disables -subpage protection. Subpage protection could be useful to support a CPU -granule of 4k with the fixed IOMMU page size of 16k. - -The DARTs found on Apple M1 Pro/Max/Ultra use another different pte -format which is even less compatible. To support an output address size -of 42 bit the address is shifted down by 4. Subpage protection is -mandatory and bit 1 signifies uncached mappings used by the display -controller. - -It would be advantageous to share code for all known Apple DART -variants to support common features. The page table allocator for DARTs -is less complex since it uses a two levels of translation table without -support for huge pages. - -Signed-off-by: Janne Grunau - -Series-changes: 2 -- add APPLE_DART2 io-pgtable format - -Series-changes: 3 -- move APPLE_DART to its own io-pgtable implementation, copied from - io-pgtable-arm and simplified - -Series-version: 3 -Cover-letter: -iommu: M1 Pro/Max DART support -Hej, - -this is the next attempt adding support for the DART found in Apple's -M1 Pro/Max/Ultra. This adds a separate io-pgtable implementation for -DART. As already mentioned in v2 the pte format is not fully compatible -with io-pgtable-arm. Especially the 2nd least significant bit is used -and is not available to tag tables/pages. -io-pgtable-dart.c is copied from io-pgtable-arm.c and support for -unused features is removed. Support for 4k IO pages is left for A7 to -A11 SoCs as there's work underway to run Linux on them. - -The incompatibilities between both Apple DART pte seems manageable in -their own io-pgtable implementation. A short list of the known -differences: - - - the physical addresses are shifted left by 4 bits and and have 2 more - bits inside the PTE entries - - the read/write protection flags are at a different position - - the subpage protection feature is now mandatory. For Linux we can - just configure it to always allow access to the entire page. - - BIT(1) tags "uncached" mappings (used for the display controller) - -There is second type of DART (t8110) present on M1 Pro/Max SoCs which -uses the same PTE format as t6000. -END - -Series-to: iommu@lists.linux-foundation.org -Series-cc: asahi@lists.linux.dev -Series-cc: Konrad Dybcio ---- - MAINTAINERS | 1 + - drivers/iommu/Kconfig | 11 +- - drivers/iommu/Makefile | 1 + - drivers/iommu/io-pgtable-arm.c | 63 ---- - drivers/iommu/io-pgtable-dart.c | 580 ++++++++++++++++++++++++++++++++ - drivers/iommu/io-pgtable.c | 2 + - 6 files changed, 594 insertions(+), 64 deletions(-) - create mode 100644 drivers/iommu/io-pgtable-dart.c - -diff --git a/MAINTAINERS b/MAINTAINERS -index 64379c699903..cb0ceb0b2cfc 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1849,6 +1849,7 @@ F: drivers/clk/clk-apple-nco.c - F: drivers/i2c/busses/i2c-pasemi-core.c - F: drivers/i2c/busses/i2c-pasemi-platform.c - F: drivers/iommu/apple-dart.c -+F: drivers/iommu/io-pgtable-dart.c - F: drivers/irqchip/irq-apple-aic.c - F: drivers/mailbox/apple-mailbox.c - F: drivers/nvme/host/apple.c -diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig -index c79a0df090c0..58603124dd42 100644 ---- a/drivers/iommu/Kconfig -+++ b/drivers/iommu/Kconfig -@@ -67,6 +67,15 @@ config IOMMU_IO_PGTABLE_ARMV7S_SELFTEST - - If unsure, say N here. - -+config IOMMU_IO_PGTABLE_DART -+ bool "Apple DART Formats" -+ select IOMMU_IO_PGTABLE -+ depends on ARM64 || (COMPILE_TEST && !GENERIC_ATOMIC64) -+ help -+ Enable support for the Apple DART pagetable formats. These include -+ the t8020 and t6000/t8110 DART formats used in Apple M1/M2 family -+ SoCs. -+ - endmenu - - config IOMMU_DEBUGFS -@@ -294,7 +303,7 @@ config APPLE_DART - tristate "Apple DART IOMMU Support" - depends on ARCH_APPLE || (COMPILE_TEST && !GENERIC_ATOMIC64) - select IOMMU_API -- select IOMMU_IO_PGTABLE_LPAE -+ select IOMMU_IO_PGTABLE_DART - default ARCH_APPLE - help - Support for Apple DART (Device Address Resolution Table) IOMMUs -diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile -index 44475a9b3eea..cc9f381013c3 100644 ---- a/drivers/iommu/Makefile -+++ b/drivers/iommu/Makefile -@@ -8,6 +8,7 @@ obj-$(CONFIG_IOMMU_DMA) += dma-iommu.o - obj-$(CONFIG_IOMMU_IO_PGTABLE) += io-pgtable.o - obj-$(CONFIG_IOMMU_IO_PGTABLE_ARMV7S) += io-pgtable-arm-v7s.o - obj-$(CONFIG_IOMMU_IO_PGTABLE_LPAE) += io-pgtable-arm.o -+obj-$(CONFIG_IOMMU_IO_PGTABLE_DART) += io-pgtable-dart.o - obj-$(CONFIG_IOASID) += ioasid.o - obj-$(CONFIG_IOMMU_IOVA) += iova.o - obj-$(CONFIG_OF_IOMMU) += of_iommu.o -diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c -index 94ff319ae8ac..d7f5e23da643 100644 ---- a/drivers/iommu/io-pgtable-arm.c -+++ b/drivers/iommu/io-pgtable-arm.c -@@ -130,9 +130,6 @@ - #define ARM_MALI_LPAE_MEMATTR_IMP_DEF 0x88ULL - #define ARM_MALI_LPAE_MEMATTR_WRITE_ALLOC 0x8DULL - --#define APPLE_DART_PTE_PROT_NO_WRITE (1<<7) --#define APPLE_DART_PTE_PROT_NO_READ (1<<8) -- - /* IOPTE accessors */ - #define iopte_deref(pte,d) __va(iopte_to_paddr(pte, d)) - -@@ -406,15 +403,6 @@ static arm_lpae_iopte arm_lpae_prot_to_pte(struct arm_lpae_io_pgtable *data, - { - arm_lpae_iopte pte; - -- if (data->iop.fmt == APPLE_DART) { -- pte = 0; -- if (!(prot & IOMMU_WRITE)) -- pte |= APPLE_DART_PTE_PROT_NO_WRITE; -- if (!(prot & IOMMU_READ)) -- pte |= APPLE_DART_PTE_PROT_NO_READ; -- return pte; -- } -- - if (data->iop.fmt == ARM_64_LPAE_S1 || - data->iop.fmt == ARM_32_LPAE_S1) { - pte = ARM_LPAE_PTE_nG; -@@ -1107,52 +1095,6 @@ arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) - return NULL; - } - --static struct io_pgtable * --apple_dart_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) --{ -- struct arm_lpae_io_pgtable *data; -- int i; -- -- if (cfg->oas > 36) -- return NULL; -- -- data = arm_lpae_alloc_pgtable(cfg); -- if (!data) -- return NULL; -- -- /* -- * The table format itself always uses two levels, but the total VA -- * space is mapped by four separate tables, making the MMIO registers -- * an effective "level 1". For simplicity, though, we treat this -- * equivalently to LPAE stage 2 concatenation at level 2, with the -- * additional TTBRs each just pointing at consecutive pages. -- */ -- if (data->start_level < 1) -- goto out_free_data; -- if (data->start_level == 1 && data->pgd_bits > 2) -- goto out_free_data; -- if (data->start_level > 1) -- data->pgd_bits = 0; -- data->start_level = 2; -- cfg->apple_dart_cfg.n_ttbrs = 1 << data->pgd_bits; -- data->pgd_bits += data->bits_per_level; -- -- data->pgd = __arm_lpae_alloc_pages(ARM_LPAE_PGD_SIZE(data), GFP_KERNEL, -- cfg); -- if (!data->pgd) -- goto out_free_data; -- -- for (i = 0; i < cfg->apple_dart_cfg.n_ttbrs; ++i) -- cfg->apple_dart_cfg.ttbr[i] = -- virt_to_phys(data->pgd + i * ARM_LPAE_GRANULE(data)); -- -- return &data->iop; -- --out_free_data: -- kfree(data); -- return NULL; --} -- - struct io_pgtable_init_fns io_pgtable_arm_64_lpae_s1_init_fns = { - .alloc = arm_64_lpae_alloc_pgtable_s1, - .free = arm_lpae_free_pgtable, -@@ -1178,11 +1120,6 @@ struct io_pgtable_init_fns io_pgtable_arm_mali_lpae_init_fns = { - .free = arm_lpae_free_pgtable, - }; - --struct io_pgtable_init_fns io_pgtable_apple_dart_init_fns = { -- .alloc = apple_dart_alloc_pgtable, -- .free = arm_lpae_free_pgtable, --}; -- - #ifdef CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST - - static struct io_pgtable_cfg *cfg_cookie __initdata; -diff --git a/drivers/iommu/io-pgtable-dart.c b/drivers/iommu/io-pgtable-dart.c -new file mode 100644 -index 000000000000..0c5222942c65 ---- /dev/null -+++ b/drivers/iommu/io-pgtable-dart.c -@@ -0,0 +1,580 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Apple DART page table allocator. -+ * -+ * Copyright (C) 2022 The Asahi Linux Contributors -+ * -+ * Based on io-pgtable-arm. -+ * -+ * Copyright (C) 2014 ARM Limited -+ * -+ * Author: Will Deacon -+ */ -+ -+#define pr_fmt(fmt) "dart io-pgtable: " fmt -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#define DART_MAX_ADDR_BITS 52 -+#define DART_MAX_LEVELS 3 -+ -+/* Struct accessors */ -+#define io_pgtable_to_data(x) \ -+ container_of((x), struct dart_io_pgtable, iop) -+ -+#define io_pgtable_ops_to_data(x) \ -+ io_pgtable_to_data(io_pgtable_ops_to_pgtable(x)) -+ -+/* -+ * Calculate the right shift amount to get to the portion describing level l -+ * in a virtual address mapped by the pagetable in d. -+ */ -+#define DART_LVL_SHIFT(l, d) \ -+ (((DART_MAX_LEVELS - (l)) * (d)->bits_per_level) + \ -+ ilog2(sizeof(dart_iopte))) -+ -+#define DART_GRANULE(d) \ -+ (sizeof(dart_iopte) << (d)->bits_per_level) -+#define DART_PGD_SIZE(d) \ -+ (sizeof(dart_iopte) << (d)->pgd_bits) -+ -+#define DART_PTES_PER_TABLE(d) \ -+ (DART_GRANULE(d) >> ilog2(sizeof(dart_iopte))) -+ -+/* -+ * Calculate the index at level l used to map virtual address a using the -+ * pagetable in d. -+ */ -+#define DART_PGD_IDX(l, d) \ -+ ((l) == (d)->start_level ? (d)->pgd_bits - (d)->bits_per_level : 0) -+ -+#define DART_LVL_IDX(a, l, d) \ -+ (((u64)(a) >> DART_LVL_SHIFT(l, d)) & \ -+ ((1 << ((d)->bits_per_level + DART_PGD_IDX(l, d))) - 1)) -+ -+/* Calculate the block/page mapping size at level l for pagetable in d. */ -+#define DART_BLOCK_SIZE(l, d) (1ULL << DART_LVL_SHIFT(l, d)) -+ -+#define APPLE_DART1_PADDR_MASK GENMASK_ULL(35, 12) -+ -+/* Apple DART1 protection bits */ -+#define APPLE_DART1_PTE_PROT_NO_READ BIT(8) -+#define APPLE_DART1_PTE_PROT_NO_WRITE BIT(7) -+#define APPLE_DART1_PTE_PROT_SP_DIS BIT(1) -+ -+/* marks PTE as valid */ -+#define APPLE_DART_PTE_VALID BIT(0) -+ -+/* IOPTE accessors */ -+#define iopte_deref(pte, d) __va(iopte_to_paddr(pte, d)) -+ -+struct dart_io_pgtable { -+ struct io_pgtable iop; -+ -+ int pgd_bits; -+ int start_level; -+ int bits_per_level; -+ -+ void *pgd; -+}; -+ -+typedef u64 dart_iopte; -+ -+static inline bool iopte_leaf(dart_iopte pte, int lvl, -+ enum io_pgtable_fmt fmt) -+{ -+ return (lvl == (DART_MAX_LEVELS - 1)) && (pte & APPLE_DART_PTE_VALID); -+} -+ -+static dart_iopte paddr_to_iopte(phys_addr_t paddr, -+ struct dart_io_pgtable *data) -+{ -+ return paddr & APPLE_DART1_PADDR_MASK; -+} -+ -+static phys_addr_t iopte_to_paddr(dart_iopte pte, -+ struct dart_io_pgtable *data) -+{ -+ return pte & APPLE_DART1_PADDR_MASK; -+} -+ -+static void *__dart_alloc_pages(size_t size, gfp_t gfp, -+ struct io_pgtable_cfg *cfg) -+{ -+ struct device *dev = cfg->iommu_dev; -+ int order = get_order(size); -+ struct page *p; -+ -+ VM_BUG_ON((gfp & __GFP_HIGHMEM)); -+ p = alloc_pages_node(dev ? dev_to_node(dev) : NUMA_NO_NODE, -+ gfp | __GFP_ZERO, order); -+ if (!p) -+ return NULL; -+ -+ return page_address(p); -+} -+ -+static void __dart_free_pages(void *pages, size_t size) -+{ -+ free_pages((unsigned long)pages, get_order(size)); -+} -+ -+static void __dart_init_pte(struct dart_io_pgtable *data, -+ phys_addr_t paddr, dart_iopte prot, -+ int lvl, int num_entries, dart_iopte *ptep) -+{ -+ dart_iopte pte = prot; -+ size_t sz = DART_BLOCK_SIZE(lvl, data); -+ int i; -+ -+ if (lvl == DART_MAX_LEVELS - 1) -+ pte |= APPLE_DART1_PTE_PROT_SP_DIS; -+ -+ pte |= APPLE_DART_PTE_VALID; -+ -+ for (i = 0; i < num_entries; i++) -+ ptep[i] = pte | paddr_to_iopte(paddr + i * sz, data); -+} -+ -+static int dart_init_pte(struct dart_io_pgtable *data, -+ unsigned long iova, phys_addr_t paddr, -+ dart_iopte prot, int lvl, int num_entries, -+ dart_iopte *ptep) -+{ -+ int i; -+ -+ for (i = 0; i < num_entries; i++) -+ if (iopte_leaf(ptep[i], lvl, data->iop.fmt)) { -+ /* We require an unmap first */ -+ WARN_ON(iopte_leaf(ptep[i], lvl, data->iop.fmt)); -+ return -EEXIST; -+ } -+ -+ __dart_init_pte(data, paddr, prot, lvl, num_entries, ptep); -+ return 0; -+} -+ -+static dart_iopte dart_install_table(dart_iopte *table, -+ dart_iopte *ptep, -+ dart_iopte curr, -+ struct dart_io_pgtable *data) -+{ -+ dart_iopte old, new; -+ -+ new = paddr_to_iopte(__pa(table), data) | APPLE_DART_PTE_VALID; -+ -+ /* -+ * Ensure the table itself is visible before its PTE can be. -+ * Whilst we could get away with cmpxchg64_release below, this -+ * doesn't have any ordering semantics when !CONFIG_SMP. -+ */ -+ dma_wmb(); -+ -+ old = cmpxchg64_relaxed(ptep, curr, new); -+ -+ return old; -+} -+ -+static int __dart_map(struct dart_io_pgtable *data, unsigned long iova, -+ phys_addr_t paddr, size_t size, size_t pgcount, -+ dart_iopte prot, int lvl, dart_iopte *ptep, -+ gfp_t gfp, size_t *mapped) -+{ -+ dart_iopte *cptep, pte; -+ size_t block_size = DART_BLOCK_SIZE(lvl, data); -+ size_t tblsz = DART_GRANULE(data); -+ struct io_pgtable_cfg *cfg = &data->iop.cfg; -+ int ret = 0, num_entries, max_entries, map_idx_start; -+ -+ /* Find our entry at the current level */ -+ map_idx_start = DART_LVL_IDX(iova, lvl, data); -+ ptep += map_idx_start; -+ -+ /* If we can install a leaf entry at this level, then do so */ -+ if (size == block_size) { -+ max_entries = DART_PTES_PER_TABLE(data) - map_idx_start; -+ num_entries = min_t(int, pgcount, max_entries); -+ ret = dart_init_pte(data, iova, paddr, prot, lvl, num_entries, ptep); -+ if (!ret && mapped) -+ *mapped += num_entries * size; -+ -+ return ret; -+ } -+ -+ /* We can't allocate tables at the final level */ -+ if (WARN_ON(lvl >= DART_MAX_LEVELS - 1)) -+ return -EINVAL; -+ -+ /* Grab a pointer to the next level */ -+ pte = READ_ONCE(*ptep); -+ if (!pte) { -+ cptep = __dart_alloc_pages(tblsz, gfp, cfg); -+ if (!cptep) -+ return -ENOMEM; -+ -+ pte = dart_install_table(cptep, ptep, 0, data); -+ if (pte) -+ __dart_free_pages(cptep, tblsz); -+ } -+ -+ if (pte && !iopte_leaf(pte, lvl, data->iop.fmt)) { -+ cptep = iopte_deref(pte, data); -+ } else if (pte) { -+ /* We require an unmap first */ -+ WARN_ON(pte); -+ return -EEXIST; -+ } -+ -+ /* Rinse, repeat */ -+ return __dart_map(data, iova, paddr, size, pgcount, prot, lvl + 1, -+ cptep, gfp, mapped); -+} -+ -+static dart_iopte dart_prot_to_pte(struct dart_io_pgtable *data, -+ int prot) -+{ -+ dart_iopte pte = 0; -+ -+ if (!(prot & IOMMU_WRITE)) -+ pte |= APPLE_DART1_PTE_PROT_NO_WRITE; -+ if (!(prot & IOMMU_READ)) -+ pte |= APPLE_DART1_PTE_PROT_NO_READ; -+ -+ return pte; -+} -+ -+static int dart_map_pages(struct io_pgtable_ops *ops, unsigned long iova, -+ phys_addr_t paddr, size_t pgsize, size_t pgcount, -+ int iommu_prot, gfp_t gfp, size_t *mapped) -+{ -+ struct dart_io_pgtable *data = io_pgtable_ops_to_data(ops); -+ struct io_pgtable_cfg *cfg = &data->iop.cfg; -+ dart_iopte *ptep = data->pgd; -+ int ret, lvl = data->start_level; -+ dart_iopte prot; -+ long iaext = (s64)iova >> cfg->ias; -+ -+ if (WARN_ON(!pgsize || (pgsize & cfg->pgsize_bitmap) != pgsize)) -+ return -EINVAL; -+ -+ if (WARN_ON(iaext || paddr >> cfg->oas)) -+ return -ERANGE; -+ -+ /* If no access, then nothing to do */ -+ if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE))) -+ return 0; -+ -+ prot = dart_prot_to_pte(data, iommu_prot); -+ ret = __dart_map(data, iova, paddr, pgsize, pgcount, prot, lvl, -+ ptep, gfp, mapped); -+ /* -+ * Synchronise all PTE updates for the new mapping before there's -+ * a chance for anything to kick off a table walk for the new iova. -+ */ -+ wmb(); -+ -+ return ret; -+} -+ -+static int dart_map(struct io_pgtable_ops *ops, unsigned long iova, -+ phys_addr_t paddr, size_t size, int iommu_prot, gfp_t gfp) -+{ -+ return dart_map_pages(ops, iova, paddr, size, 1, iommu_prot, gfp, -+ NULL); -+} -+ -+static void __dart_free_pgtable(struct dart_io_pgtable *data, int lvl, -+ dart_iopte *ptep) -+{ -+ dart_iopte *start, *end; -+ unsigned long table_size; -+ -+ if (lvl == data->start_level) -+ table_size = DART_PGD_SIZE(data); -+ else -+ table_size = DART_GRANULE(data); -+ -+ start = ptep; -+ -+ /* Only leaf entries at the last level */ -+ if (lvl == DART_MAX_LEVELS - 1) -+ end = ptep; -+ else -+ end = (void *)ptep + table_size; -+ -+ while (ptep != end) { -+ dart_iopte pte = *ptep++; -+ -+ if (!pte || iopte_leaf(pte, lvl, data->iop.fmt)) -+ continue; -+ -+ __dart_free_pgtable(data, lvl + 1, iopte_deref(pte, data)); -+ } -+ -+ __dart_free_pages(start, table_size); -+} -+ -+static size_t __dart_unmap(struct dart_io_pgtable *data, -+ struct iommu_iotlb_gather *gather, -+ unsigned long iova, size_t size, size_t pgcount, -+ int lvl, dart_iopte *ptep) -+{ -+ dart_iopte pte; -+ struct io_pgtable *iop = &data->iop; -+ int i = 0, num_entries, max_entries, unmap_idx_start; -+ -+ /* Something went horribly wrong and we ran out of page table */ -+ if (WARN_ON(lvl == DART_MAX_LEVELS)) -+ return 0; -+ -+ unmap_idx_start = DART_LVL_IDX(iova, lvl, data); -+ ptep += unmap_idx_start; -+ pte = READ_ONCE(*ptep); -+ if (WARN_ON(!pte)) -+ return 0; -+ -+ /* If the size matches this level, we're in the right place */ -+ if (size == DART_BLOCK_SIZE(lvl, data)) { -+ max_entries = DART_PTES_PER_TABLE(data) - unmap_idx_start; -+ num_entries = min_t(int, pgcount, max_entries); -+ -+ while (i < num_entries) { -+ pte = READ_ONCE(*ptep); -+ if (WARN_ON(!pte)) -+ break; -+ -+ /* clear pte */ -+ *ptep = 0; -+ -+ if (!iopte_leaf(pte, lvl, iop->fmt)) { -+ /* Also flush any partial walks */ -+ io_pgtable_tlb_flush_walk(iop, iova + i * size, size, -+ DART_GRANULE(data)); -+ __dart_free_pgtable(data, lvl + 1, iopte_deref(pte, data)); -+ } else if (!iommu_iotlb_gather_queued(gather)) { -+ io_pgtable_tlb_add_page(iop, gather, iova + i * size, size); -+ } -+ -+ ptep++; -+ i++; -+ } -+ -+ return i * size; -+ } -+ -+ /* Keep on walkin' */ -+ ptep = iopte_deref(pte, data); -+ return __dart_unmap(data, gather, iova, size, pgcount, lvl + 1, ptep); -+} -+ -+static size_t dart_unmap_pages(struct io_pgtable_ops *ops, unsigned long iova, -+ size_t pgsize, size_t pgcount, -+ struct iommu_iotlb_gather *gather) -+{ -+ struct dart_io_pgtable *data = io_pgtable_ops_to_data(ops); -+ struct io_pgtable_cfg *cfg = &data->iop.cfg; -+ dart_iopte *ptep = data->pgd; -+ long iaext = (s64)iova >> cfg->ias; -+ -+ if (WARN_ON(!pgsize || (pgsize & cfg->pgsize_bitmap) != pgsize || !pgcount)) -+ return 0; -+ -+ if (WARN_ON(iaext)) -+ return 0; -+ -+ return __dart_unmap(data, gather, iova, pgsize, pgcount, -+ data->start_level, ptep); -+} -+ -+static size_t dart_unmap(struct io_pgtable_ops *ops, unsigned long iova, -+ size_t size, struct iommu_iotlb_gather *gather) -+{ -+ return dart_unmap_pages(ops, iova, size, 1, gather); -+} -+ -+static phys_addr_t dart_iova_to_phys(struct io_pgtable_ops *ops, -+ unsigned long iova) -+{ -+ struct dart_io_pgtable *data = io_pgtable_ops_to_data(ops); -+ dart_iopte pte, *ptep = data->pgd; -+ int lvl = data->start_level; -+ -+ do { -+ /* Valid IOPTE pointer? */ -+ if (!ptep) -+ return 0; -+ -+ /* Grab the IOPTE we're interested in */ -+ ptep += DART_LVL_IDX(iova, lvl, data); -+ pte = READ_ONCE(*ptep); -+ -+ /* Valid entry? */ -+ if (!pte) -+ return 0; -+ -+ /* Leaf entry? */ -+ if (iopte_leaf(pte, lvl, data->iop.fmt)) -+ goto found_translation; -+ -+ /* Take it to the next level */ -+ ptep = iopte_deref(pte, data); -+ } while (++lvl < DART_MAX_LEVELS); -+ -+ /* Ran out of page tables to walk */ -+ return 0; -+ -+found_translation: -+ iova &= (DART_BLOCK_SIZE(lvl, data) - 1); -+ return iopte_to_paddr(pte, data) | iova; -+} -+ -+static void dart_restrict_pgsizes(struct io_pgtable_cfg *cfg) -+{ -+ unsigned long granule, page_sizes; -+ unsigned int max_addr_bits = 48; -+ -+ /* -+ * We need to restrict the supported page sizes to match the -+ * translation regime for a particular granule. Aim to match -+ * the CPU page size if possible, otherwise prefer smaller sizes. -+ * While we're at it, restrict the block sizes to match the -+ * chosen granule. -+ */ -+ if (cfg->pgsize_bitmap & PAGE_SIZE) -+ granule = PAGE_SIZE; -+ else if (cfg->pgsize_bitmap & ~PAGE_MASK) -+ granule = 1UL << __fls(cfg->pgsize_bitmap & ~PAGE_MASK); -+ else if (cfg->pgsize_bitmap & PAGE_MASK) -+ granule = 1UL << __ffs(cfg->pgsize_bitmap & PAGE_MASK); -+ else -+ granule = 0; -+ -+ switch (granule) { -+ case SZ_4K: -+ page_sizes = (SZ_4K | SZ_2M | SZ_1G); -+ break; -+ case SZ_16K: -+ page_sizes = (SZ_16K | SZ_32M); -+ break; -+ default: -+ page_sizes = 0; -+ } -+ -+ cfg->pgsize_bitmap &= page_sizes; -+ cfg->ias = min(cfg->ias, max_addr_bits); -+ cfg->oas = min(cfg->oas, max_addr_bits); -+} -+ -+static struct dart_io_pgtable * -+dart_alloc_pgtable(struct io_pgtable_cfg *cfg) -+{ -+ struct dart_io_pgtable *data; -+ int bits_per_level, levels, va_bits, pg_shift; -+ -+ dart_restrict_pgsizes(cfg); -+ -+ if (!(cfg->pgsize_bitmap & (SZ_4K | SZ_16K))) -+ return NULL; -+ -+ if (cfg->ias > DART_MAX_ADDR_BITS) -+ return NULL; -+ -+ if (cfg->oas > DART_MAX_ADDR_BITS) -+ return NULL; -+ -+ pg_shift = __ffs(cfg->pgsize_bitmap); -+ bits_per_level = pg_shift - ilog2(sizeof(dart_iopte)); -+ -+ va_bits = cfg->ias - pg_shift; -+ levels = DIV_ROUND_UP(va_bits, bits_per_level); -+ if (levels > DART_MAX_LEVELS) -+ return NULL; -+ -+ data = kmalloc(sizeof(*data), GFP_KERNEL); -+ if (!data) -+ return NULL; -+ -+ data->bits_per_level = bits_per_level; -+ data->start_level = DART_MAX_LEVELS - levels; -+ -+ /* Calculate the actual size of our pgd (without concatenation) */ -+ data->pgd_bits = va_bits - (data->bits_per_level * (levels - 1)); -+ -+ data->iop.ops = (struct io_pgtable_ops) { -+ .map = dart_map, -+ .map_pages = dart_map_pages, -+ .unmap = dart_unmap, -+ .unmap_pages = dart_unmap_pages, -+ .iova_to_phys = dart_iova_to_phys, -+ }; -+ -+ return data; -+} -+ -+static struct io_pgtable * -+apple_dart_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) -+{ -+ struct dart_io_pgtable *data; -+ int i; -+ -+ if (!cfg->coherent_walk) -+ return NULL; -+ -+ if (cfg->oas > 36) -+ return NULL; -+ -+ data = dart_alloc_pgtable(cfg); -+ if (!data) -+ return NULL; -+ -+ /* -+ * The table format itself always uses two levels, but the total VA -+ * space is mapped by four separate tables, making the MMIO registers -+ * an effective "level 1". For simplicity, though, we treat this -+ * equivalently to LPAE stage 2 concatenation at level 2, with the -+ * additional TTBRs each just pointing at consecutive pages. -+ */ -+ if (data->start_level == 0 && data->pgd_bits > 2) -+ goto out_free_data; -+ if (data->start_level > 0) -+ data->pgd_bits = 0; -+ data->start_level = 1; -+ cfg->apple_dart_cfg.n_ttbrs = 1 << data->pgd_bits; -+ data->pgd_bits += data->bits_per_level; -+ -+ data->pgd = __dart_alloc_pages(DART_PGD_SIZE(data), GFP_KERNEL, -+ cfg); -+ if (!data->pgd) -+ goto out_free_data; -+ -+ for (i = 0; i < cfg->apple_dart_cfg.n_ttbrs; ++i) -+ cfg->apple_dart_cfg.ttbr[i] = -+ virt_to_phys(data->pgd + i * DART_GRANULE(data)); -+ -+ return &data->iop; -+ -+out_free_data: -+ kfree(data); -+ return NULL; -+} -+ -+static void apple_dart_free_pgtable(struct io_pgtable *iop) -+{ -+ struct dart_io_pgtable *data = io_pgtable_to_data(iop); -+ -+ __dart_free_pgtable(data, data->start_level, data->pgd); -+ kfree(data); -+} -+ -+struct io_pgtable_init_fns io_pgtable_apple_dart_init_fns = { -+ .alloc = apple_dart_alloc_pgtable, -+ .free = apple_dart_free_pgtable, -+}; -diff --git a/drivers/iommu/io-pgtable.c b/drivers/iommu/io-pgtable.c -index f4bfcef98297..16205ea9272c 100644 ---- a/drivers/iommu/io-pgtable.c -+++ b/drivers/iommu/io-pgtable.c -@@ -20,6 +20,8 @@ io_pgtable_init_table[IO_PGTABLE_NUM_FMTS] = { - [ARM_64_LPAE_S1] = &io_pgtable_arm_64_lpae_s1_init_fns, - [ARM_64_LPAE_S2] = &io_pgtable_arm_64_lpae_s2_init_fns, - [ARM_MALI_LPAE] = &io_pgtable_arm_mali_lpae_init_fns, -+#endif -+#ifdef CONFIG_IOMMU_IO_PGTABLE_DART - [APPLE_DART] = &io_pgtable_apple_dart_init_fns, - #endif - #ifdef CONFIG_IOMMU_IO_PGTABLE_ARMV7S --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0048-iommu-io-pgtable-Add-DART-subpage-protection-support.patch b/target/linux/silicon/patches-5.19/0048-iommu-io-pgtable-Add-DART-subpage-protection-support.patch deleted file mode 100644 index e600568ad..000000000 --- a/target/linux/silicon/patches-5.19/0048-iommu-io-pgtable-Add-DART-subpage-protection-support.patch +++ /dev/null @@ -1,54 +0,0 @@ -From cd16901670e12ae1185f2488e74f50ce5d72c5fb Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Wed, 17 Nov 2021 19:40:16 +0100 -Subject: [PATCH 048/171] iommu/io-pgtable: Add DART subpage protection support - -DART allows to only expose a subpage to the device. While this is an -optional feature on the M1 DARTs the new ones present on the Pro/Max -models require this field in every PTE. - -Signed-off-by: Sven Peter -Signed-off-by: Janne Grunau - -Commit-changes: 3 -- apply change to io-pgtable-dart.c ---- - drivers/iommu/io-pgtable-dart.c | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/drivers/iommu/io-pgtable-dart.c b/drivers/iommu/io-pgtable-dart.c -index 0c5222942c65..fa8025c03bb5 100644 ---- a/drivers/iommu/io-pgtable-dart.c -+++ b/drivers/iommu/io-pgtable-dart.c -@@ -14,6 +14,7 @@ - #define pr_fmt(fmt) "dart io-pgtable: " fmt - - #include -+#include - #include - #include - #include -@@ -63,6 +64,9 @@ - /* Calculate the block/page mapping size at level l for pagetable in d. */ - #define DART_BLOCK_SIZE(l, d) (1ULL << DART_LVL_SHIFT(l, d)) - -+#define APPLE_DART_PTE_SUBPAGE_START GENMASK_ULL(63, 52) -+#define APPLE_DART_PTE_SUBPAGE_END GENMASK_ULL(51, 40) -+ - #define APPLE_DART1_PADDR_MASK GENMASK_ULL(35, 12) - - /* Apple DART1 protection bits */ -@@ -140,6 +144,10 @@ static void __dart_init_pte(struct dart_io_pgtable *data, - - pte |= APPLE_DART_PTE_VALID; - -+ /* subpage protection: always allow access to the entire page */ -+ pte |= FIELD_PREP(APPLE_DART_PTE_SUBPAGE_START, 0); -+ pte |= FIELD_PREP(APPLE_DART_PTE_SUBPAGE_END, 0xfff); -+ - for (i = 0; i < num_entries; i++) - ptep[i] = pte | paddr_to_iopte(paddr + i * sz, data); - } --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0049-iommu-io-pgtable-dart-Add-DART-PTE-support-for-t6000.patch b/target/linux/silicon/patches-5.19/0049-iommu-io-pgtable-dart-Add-DART-PTE-support-for-t6000.patch deleted file mode 100644 index c10dcda37..000000000 --- a/target/linux/silicon/patches-5.19/0049-iommu-io-pgtable-dart-Add-DART-PTE-support-for-t6000.patch +++ /dev/null @@ -1,158 +0,0 @@ -From 318506bc8e5c558c1df0a964ce2fe112681d3452 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Tue, 2 Nov 2021 18:10:53 +0100 -Subject: [PATCH 049/171] iommu/io-pgtable-dart: Add DART PTE support for t6000 - -The DARTs present in the M1 Pro/Max/Ultra SoC use a diffent PTE format. -They support a 42bit physical address space by shifting the paddr and -extending its mask inside the PTE. -They also come with mandatory sub-page protection now which we just -configure to always allow access to the entire page. This feature is -already present but optional on the previous DARTs which allows to -unconditionally configure it. - -Signed-off-by: Sven Peter -Co-developed-by: Janne Grunau -Signed-off-by: Janne Grunau - -Commit-changes: 2 -- add APPLE_DART2 PTE format - -Commit-changes: 3 -- apply change to io-pgtable-dart.c -- handle pte <> paddr conversion based on the pte format instead of - the output address size ---- - drivers/iommu/io-pgtable-dart.c | 51 +++++++++++++++++++++++++++------ - drivers/iommu/io-pgtable.c | 1 + - include/linux/io-pgtable.h | 1 + - 3 files changed, 45 insertions(+), 8 deletions(-) - -diff --git a/drivers/iommu/io-pgtable-dart.c b/drivers/iommu/io-pgtable-dart.c -index fa8025c03bb5..9c3c2505f3dc 100644 ---- a/drivers/iommu/io-pgtable-dart.c -+++ b/drivers/iommu/io-pgtable-dart.c -@@ -68,12 +68,19 @@ - #define APPLE_DART_PTE_SUBPAGE_END GENMASK_ULL(51, 40) - - #define APPLE_DART1_PADDR_MASK GENMASK_ULL(35, 12) -+#define APPLE_DART2_PADDR_MASK GENMASK_ULL(37, 10) -+#define APPLE_DART2_PADDR_SHIFT (4) - - /* Apple DART1 protection bits */ - #define APPLE_DART1_PTE_PROT_NO_READ BIT(8) - #define APPLE_DART1_PTE_PROT_NO_WRITE BIT(7) - #define APPLE_DART1_PTE_PROT_SP_DIS BIT(1) - -+/* Apple DART2 protection bits */ -+#define APPLE_DART2_PTE_PROT_NO_READ BIT(3) -+#define APPLE_DART2_PTE_PROT_NO_WRITE BIT(2) -+#define APPLE_DART2_PTE_PROT_NO_CACHE BIT(1) -+ - /* marks PTE as valid */ - #define APPLE_DART_PTE_VALID BIT(0) - -@@ -101,13 +108,31 @@ static inline bool iopte_leaf(dart_iopte pte, int lvl, - static dart_iopte paddr_to_iopte(phys_addr_t paddr, - struct dart_io_pgtable *data) - { -- return paddr & APPLE_DART1_PADDR_MASK; -+ dart_iopte pte; -+ -+ if (data->iop.fmt == APPLE_DART) -+ return paddr & APPLE_DART1_PADDR_MASK; -+ -+ /* format is APPLE_DART2 */ -+ pte = paddr >> APPLE_DART2_PADDR_SHIFT; -+ pte &= APPLE_DART2_PADDR_MASK; -+ -+ return pte; - } - - static phys_addr_t iopte_to_paddr(dart_iopte pte, - struct dart_io_pgtable *data) - { -- return pte & APPLE_DART1_PADDR_MASK; -+ u64 paddr; -+ -+ if (data->iop.fmt == APPLE_DART) -+ return pte & APPLE_DART1_PADDR_MASK; -+ -+ /* format is APPLE_DART2 */ -+ paddr = pte & APPLE_DART2_PADDR_MASK; -+ paddr <<= APPLE_DART2_PADDR_SHIFT; -+ -+ return paddr; - } - - static void *__dart_alloc_pages(size_t size, gfp_t gfp, -@@ -139,7 +164,7 @@ static void __dart_init_pte(struct dart_io_pgtable *data, - size_t sz = DART_BLOCK_SIZE(lvl, data); - int i; - -- if (lvl == DART_MAX_LEVELS - 1) -+ if (lvl == DART_MAX_LEVELS - 1 && data->iop.fmt == APPLE_DART) - pte |= APPLE_DART1_PTE_PROT_SP_DIS; - - pte |= APPLE_DART_PTE_VALID; -@@ -251,10 +276,20 @@ static dart_iopte dart_prot_to_pte(struct dart_io_pgtable *data, - { - dart_iopte pte = 0; - -- if (!(prot & IOMMU_WRITE)) -- pte |= APPLE_DART1_PTE_PROT_NO_WRITE; -- if (!(prot & IOMMU_READ)) -- pte |= APPLE_DART1_PTE_PROT_NO_READ; -+ if (data->iop.fmt == APPLE_DART) { -+ if (!(prot & IOMMU_WRITE)) -+ pte |= APPLE_DART1_PTE_PROT_NO_WRITE; -+ if (!(prot & IOMMU_READ)) -+ pte |= APPLE_DART1_PTE_PROT_NO_READ; -+ } -+ if (data->iop.fmt == APPLE_DART2) { -+ if (!(prot & IOMMU_WRITE)) -+ pte |= APPLE_DART2_PTE_PROT_NO_WRITE; -+ if (!(prot & IOMMU_READ)) -+ pte |= APPLE_DART2_PTE_PROT_NO_READ; -+ if (!(prot & IOMMU_CACHE)) -+ pte |= APPLE_DART2_PTE_PROT_NO_CACHE; -+ } - - return pte; - } -@@ -536,7 +571,7 @@ apple_dart_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie) - if (!cfg->coherent_walk) - return NULL; - -- if (cfg->oas > 36) -+ if (cfg->oas != 36 && cfg->oas != 42) - return NULL; - - data = dart_alloc_pgtable(cfg); -diff --git a/drivers/iommu/io-pgtable.c b/drivers/iommu/io-pgtable.c -index 16205ea9272c..49f46e1eabf7 100644 ---- a/drivers/iommu/io-pgtable.c -+++ b/drivers/iommu/io-pgtable.c -@@ -23,6 +23,7 @@ io_pgtable_init_table[IO_PGTABLE_NUM_FMTS] = { - #endif - #ifdef CONFIG_IOMMU_IO_PGTABLE_DART - [APPLE_DART] = &io_pgtable_apple_dart_init_fns, -+ [APPLE_DART2] = &io_pgtable_apple_dart_init_fns, - #endif - #ifdef CONFIG_IOMMU_IO_PGTABLE_ARMV7S - [ARM_V7S] = &io_pgtable_arm_v7s_init_fns, -diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h -index 86af6f0a00a2..76b98511cbc8 100644 ---- a/include/linux/io-pgtable.h -+++ b/include/linux/io-pgtable.h -@@ -17,6 +17,7 @@ enum io_pgtable_fmt { - ARM_MALI_LPAE, - AMD_IOMMU_V1, - APPLE_DART, -+ APPLE_DART2, - IO_PGTABLE_NUM_FMTS, - }; - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0050-iommu-dart-Support-t6000-variant.patch b/target/linux/silicon/patches-5.19/0050-iommu-dart-Support-t6000-variant.patch deleted file mode 100644 index c9d4049fd..000000000 --- a/target/linux/silicon/patches-5.19/0050-iommu-dart-Support-t6000-variant.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 69d73a2d8f767b1e1d4ea00fcd8be33f5fc8b7c0 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Tue, 2 Nov 2021 18:10:52 +0100 -Subject: [PATCH 050/171] iommu: dart: Support t6000 variant - -The M1 Pro/Max/Ultra SoCs come with a new variant of DART which -supports a larger physical address space with a different PTE format. -Pass through the correct paddr address space size and the PTE format -to the io-pgtable code which will take care of the rest. - -Signed-off-by: Sven Peter -Co-developed-by: Janne Grunau -Signed-off-by: Janne Grunau - -Commit-changes: 2 -- use APPLE_DART2 PTE format for dart-t6000 - -Commit-changes: 3 -- apply change to io-pgtable-dart.c ---- - drivers/iommu/apple-dart.c | 24 +++++++++++++++++++++--- - 1 file changed, 21 insertions(+), 3 deletions(-) - -diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c -index 8af0242a90d9..e5793c0d08b4 100644 ---- a/drivers/iommu/apple-dart.c -+++ b/drivers/iommu/apple-dart.c -@@ -81,10 +81,16 @@ - #define DART_TTBR_VALID BIT(31) - #define DART_TTBR_SHIFT 12 - -+struct apple_dart_hw { -+ u32 oas; -+ enum io_pgtable_fmt fmt; -+}; -+ - /* - * Private structure associated with each DART device. - * - * @dev: device struct -+ * @hw: SoC-specific hardware data - * @regs: mapped MMIO region - * @irq: interrupt number, can be shared with other DARTs - * @clks: clocks associated with this DART -@@ -98,6 +104,7 @@ - */ - struct apple_dart { - struct device *dev; -+ const struct apple_dart_hw *hw; - - void __iomem *regs; - -@@ -421,13 +428,13 @@ static int apple_dart_finalize_domain(struct iommu_domain *domain, - pgtbl_cfg = (struct io_pgtable_cfg){ - .pgsize_bitmap = dart->pgsize, - .ias = 32, -- .oas = 36, -+ .oas = dart->hw->oas, - .coherent_walk = 1, - .iommu_dev = dart->dev, - }; - - dart_domain->pgtbl_ops = -- alloc_io_pgtable_ops(APPLE_DART, &pgtbl_cfg, domain); -+ alloc_io_pgtable_ops(dart->hw->fmt, &pgtbl_cfg, domain); - if (!dart_domain->pgtbl_ops) { - ret = -ENOMEM; - goto done; -@@ -858,6 +865,7 @@ static int apple_dart_probe(struct platform_device *pdev) - return -ENOMEM; - - dart->dev = dev; -+ dart->hw = of_device_get_match_data(dev); - spin_lock_init(&dart->lock); - - dart->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res); -@@ -946,8 +954,18 @@ static int apple_dart_remove(struct platform_device *pdev) - return 0; - } - -+static const struct apple_dart_hw apple_dart_hw_t8103 = { -+ .oas = 36, -+ .fmt = APPLE_DART, -+}; -+static const struct apple_dart_hw apple_dart_hw_t6000 = { -+ .oas = 42, -+ .fmt = APPLE_DART2, -+}; -+ - static const struct of_device_id apple_dart_of_match[] = { -- { .compatible = "apple,t8103-dart", .data = NULL }, -+ { .compatible = "apple,t8103-dart", .data = &apple_dart_hw_t8103 }, -+ { .compatible = "apple,t6000-dart", .data = &apple_dart_hw_t6000 }, - {}, - }; - MODULE_DEVICE_TABLE(of, apple_dart_of_match); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0051-iommu-dart-Add-suspend-resume-support.patch b/target/linux/silicon/patches-5.19/0051-iommu-dart-Add-suspend-resume-support.patch deleted file mode 100644 index c73919747..000000000 --- a/target/linux/silicon/patches-5.19/0051-iommu-dart-Add-suspend-resume-support.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 6b1080a482294824b6dfb65501de061a86a1939d Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sat, 5 Mar 2022 21:17:10 +0900 -Subject: [PATCH 051/171] iommu: dart: Add suspend/resume support - -We need to save/restore the TCR/TTBR registers, since they are lost -on power gate. - -Signed-off-by: Hector Martin ---- - drivers/iommu/apple-dart.c | 50 ++++++++++++++++++++++++++++++++++++++ - 1 file changed, 50 insertions(+) - -diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c -index e5793c0d08b4..90aceb6ac774 100644 ---- a/drivers/iommu/apple-dart.c -+++ b/drivers/iommu/apple-dart.c -@@ -120,6 +120,9 @@ struct apple_dart { - - struct iommu_group *sid2group[DART_MAX_STREAMS]; - struct iommu_device iommu; -+ -+ u32 save_tcr[DART_MAX_STREAMS]; -+ u32 save_ttbr[DART_MAX_STREAMS][DART_MAX_TTBR]; - }; - - /* -@@ -963,6 +966,50 @@ static const struct apple_dart_hw apple_dart_hw_t6000 = { - .fmt = APPLE_DART2, - }; - -+#ifdef CONFIG_PM_SLEEP -+static int apple_dart_suspend(struct device *dev) -+{ -+ struct apple_dart *dart = dev_get_drvdata(dev); -+ unsigned int sid, idx; -+ -+ for (sid = 0; sid < DART_MAX_STREAMS; sid++) { -+ dart->save_tcr[sid] = readl_relaxed(dart->regs + DART_TCR(sid)); -+ for (idx = 0; idx < DART_MAX_TTBR; idx++) -+ dart->save_ttbr[sid][idx] = -+ readl_relaxed(dart->regs + DART_TTBR(sid, idx)); -+ } -+ -+ return 0; -+} -+ -+static int apple_dart_resume(struct device *dev) -+{ -+ struct apple_dart *dart = dev_get_drvdata(dev); -+ unsigned int sid, idx; -+ int ret; -+ -+ ret = apple_dart_hw_reset(dart); -+ if (ret) { -+ dev_err(dev, "Failed to reset DART on resume\n"); -+ return ret; -+ } -+ -+ for (sid = 0; sid < DART_MAX_STREAMS; sid++) { -+ for (idx = 0; idx < DART_MAX_TTBR; idx++) -+ writel_relaxed(dart->save_ttbr[sid][idx], -+ dart->regs + DART_TTBR(sid, idx)); -+ writel_relaxed(dart->save_tcr[sid], dart->regs + DART_TCR(sid)); -+ } -+ -+ return 0; -+} -+ -+static const struct dev_pm_ops apple_dart_pm_ops = { -+ .suspend = apple_dart_suspend, -+ .resume = apple_dart_resume, -+}; -+#endif -+ - static const struct of_device_id apple_dart_of_match[] = { - { .compatible = "apple,t8103-dart", .data = &apple_dart_hw_t8103 }, - { .compatible = "apple,t6000-dart", .data = &apple_dart_hw_t6000 }, -@@ -975,6 +1022,9 @@ static struct platform_driver apple_dart_driver = { - .name = "apple-dart", - .of_match_table = apple_dart_of_match, - .suppress_bind_attrs = true, -+#ifdef CONFIG_PM_SLEEP -+ .pm = &apple_dart_pm_ops, -+#endif - }, - .probe = apple_dart_probe, - .remove = apple_dart_remove, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0052-iommu-dart-Support-64-stream-IDs.patch b/target/linux/silicon/patches-5.19/0052-iommu-dart-Support-64-stream-IDs.patch deleted file mode 100644 index 805fab178..000000000 --- a/target/linux/silicon/patches-5.19/0052-iommu-dart-Support-64-stream-IDs.patch +++ /dev/null @@ -1,359 +0,0 @@ -From 82d7ff6fe9af1e8cd39bce1d46a679074b8d7749 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 28 Jun 2022 01:07:20 +0900 -Subject: [PATCH 052/171] iommu: dart: Support >64 stream IDs - -T8110 DARTs have up to 256 SIDs, so we need to switch to a bitmap to -handle them properly. - -Signed-off-by: Hector Martin ---- - drivers/iommu/apple-dart.c | 113 +++++++++++++++++++++++-------------- - 1 file changed, 70 insertions(+), 43 deletions(-) - -diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c -index 90aceb6ac774..39e6f86dd525 100644 ---- a/drivers/iommu/apple-dart.c -+++ b/drivers/iommu/apple-dart.c -@@ -33,11 +33,10 @@ - #include - #include - --#define DART_MAX_STREAMS 16 -+#define DART_MAX_STREAMS 256 - #define DART_MAX_TTBR 4 - #define MAX_DARTS_PER_DEVICE 2 - --#define DART_STREAM_ALL 0xffff - - #define DART_PARAMS1 0x00 - #define DART_PARAMS_PAGE_SHIFT GENMASK(27, 24) -@@ -84,6 +83,8 @@ - struct apple_dart_hw { - u32 oas; - enum io_pgtable_fmt fmt; -+ -+ int max_sid_count; - }; - - /* -@@ -115,6 +116,7 @@ struct apple_dart { - spinlock_t lock; - - u32 pgsize; -+ u32 num_streams; - u32 supports_bypass : 1; - u32 force_bypass : 1; - -@@ -142,11 +144,11 @@ struct apple_dart { - */ - struct apple_dart_stream_map { - struct apple_dart *dart; -- unsigned long sidmap; -+ DECLARE_BITMAP(sidmap, DART_MAX_STREAMS); - }; - struct apple_dart_atomic_stream_map { - struct apple_dart *dart; -- atomic64_t sidmap; -+ atomic_long_t sidmap[BITS_TO_LONGS(DART_MAX_STREAMS)]; - }; - - /* -@@ -204,50 +206,55 @@ static struct apple_dart_domain *to_dart_domain(struct iommu_domain *dom) - static void - apple_dart_hw_enable_translation(struct apple_dart_stream_map *stream_map) - { -+ struct apple_dart *dart = stream_map->dart; - int sid; - -- for_each_set_bit(sid, &stream_map->sidmap, DART_MAX_STREAMS) -+ for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) - writel(DART_TCR_TRANSLATE_ENABLE, -- stream_map->dart->regs + DART_TCR(sid)); -+ dart->regs + DART_TCR(sid)); - } - - static void apple_dart_hw_disable_dma(struct apple_dart_stream_map *stream_map) - { -+ struct apple_dart *dart = stream_map->dart; - int sid; - -- for_each_set_bit(sid, &stream_map->sidmap, DART_MAX_STREAMS) -- writel(0, stream_map->dart->regs + DART_TCR(sid)); -+ for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) -+ writel(0, dart->regs + DART_TCR(sid)); - } - - static void - apple_dart_hw_enable_bypass(struct apple_dart_stream_map *stream_map) - { -+ struct apple_dart *dart = stream_map->dart; - int sid; - - WARN_ON(!stream_map->dart->supports_bypass); -- for_each_set_bit(sid, &stream_map->sidmap, DART_MAX_STREAMS) -+ for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) - writel(DART_TCR_BYPASS0_ENABLE | DART_TCR_BYPASS1_ENABLE, -- stream_map->dart->regs + DART_TCR(sid)); -+ dart->regs + DART_TCR(sid)); - } - - static void apple_dart_hw_set_ttbr(struct apple_dart_stream_map *stream_map, - u8 idx, phys_addr_t paddr) - { -+ struct apple_dart *dart = stream_map->dart; - int sid; - - WARN_ON(paddr & ((1 << DART_TTBR_SHIFT) - 1)); -- for_each_set_bit(sid, &stream_map->sidmap, DART_MAX_STREAMS) -+ for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) - writel(DART_TTBR_VALID | (paddr >> DART_TTBR_SHIFT), -- stream_map->dart->regs + DART_TTBR(sid, idx)); -+ dart->regs + DART_TTBR(sid, idx)); - } - - static void apple_dart_hw_clear_ttbr(struct apple_dart_stream_map *stream_map, - u8 idx) - { -+ struct apple_dart *dart = stream_map->dart; - int sid; - -- for_each_set_bit(sid, &stream_map->sidmap, DART_MAX_STREAMS) -- writel(0, stream_map->dart->regs + DART_TTBR(sid, idx)); -+ for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) -+ writel(0, dart->regs + DART_TTBR(sid, idx)); - } - - static void -@@ -269,7 +276,7 @@ apple_dart_hw_stream_command(struct apple_dart_stream_map *stream_map, - - spin_lock_irqsave(&stream_map->dart->lock, flags); - -- writel(stream_map->sidmap, stream_map->dart->regs + DART_STREAM_SELECT); -+ writel(stream_map->sidmap[0], stream_map->dart->regs + DART_STREAM_SELECT); - writel(command, stream_map->dart->regs + DART_STREAM_COMMAND); - - ret = readl_poll_timeout_atomic( -@@ -282,7 +289,7 @@ apple_dart_hw_stream_command(struct apple_dart_stream_map *stream_map, - if (ret) { - dev_err(stream_map->dart->dev, - "busy bit did not clear after command %x for streams %lx\n", -- command, stream_map->sidmap); -+ command, stream_map->sidmap[0]); - return ret; - } - -@@ -300,6 +307,7 @@ static int apple_dart_hw_reset(struct apple_dart *dart) - { - u32 config; - struct apple_dart_stream_map stream_map; -+ int i; - - config = readl(dart->regs + DART_CONFIG); - if (config & DART_CONFIG_LOCK) { -@@ -309,12 +317,14 @@ static int apple_dart_hw_reset(struct apple_dart *dart) - } - - stream_map.dart = dart; -- stream_map.sidmap = DART_STREAM_ALL; -+ bitmap_zero(stream_map.sidmap, DART_MAX_STREAMS); -+ bitmap_set(stream_map.sidmap, 0, dart->num_streams); - apple_dart_hw_disable_dma(&stream_map); - apple_dart_hw_clear_all_ttbrs(&stream_map); - - /* enable all streams globally since TCR is used to control isolation */ -- writel(DART_STREAM_ALL, dart->regs + DART_STREAMS_ENABLE); -+ for (i = 0; i < BITS_TO_U32(dart->num_streams); i++) -+ writel(U32_MAX, dart->regs + DART_STREAMS_ENABLE); - - /* clear any pending errors before the interrupt is unmasked */ - writel(readl(dart->regs + DART_ERROR), dart->regs + DART_ERROR); -@@ -324,13 +334,16 @@ static int apple_dart_hw_reset(struct apple_dart *dart) - - static void apple_dart_domain_flush_tlb(struct apple_dart_domain *domain) - { -- int i; -+ int i, j; - struct apple_dart_atomic_stream_map *domain_stream_map; - struct apple_dart_stream_map stream_map; - - for_each_stream_map(i, domain, domain_stream_map) { - stream_map.dart = domain_stream_map->dart; -- stream_map.sidmap = atomic64_read(&domain_stream_map->sidmap); -+ -+ for (j = 0; j < BITS_TO_LONGS(stream_map.dart->num_streams); j++) -+ stream_map.sidmap[j] = atomic64_read(&domain_stream_map->sidmap[j]); -+ - apple_dart_hw_invalidate_tlb(&stream_map); - } - } -@@ -415,7 +428,7 @@ static int apple_dart_finalize_domain(struct iommu_domain *domain, - struct apple_dart *dart = cfg->stream_maps[0].dart; - struct io_pgtable_cfg pgtbl_cfg; - int ret = 0; -- int i; -+ int i, j; - - mutex_lock(&dart_domain->init_lock); - -@@ -424,8 +437,9 @@ static int apple_dart_finalize_domain(struct iommu_domain *domain, - - for (i = 0; i < MAX_DARTS_PER_DEVICE; ++i) { - dart_domain->stream_maps[i].dart = cfg->stream_maps[i].dart; -- atomic64_set(&dart_domain->stream_maps[i].sidmap, -- cfg->stream_maps[i].sidmap); -+ for (j = 0; j < BITS_TO_LONGS(dart->num_streams); j++) -+ atomic64_set(&dart_domain->stream_maps[i].sidmap[j], -+ cfg->stream_maps[i].sidmap[j]); - } - - pgtbl_cfg = (struct io_pgtable_cfg){ -@@ -460,7 +474,7 @@ apple_dart_mod_streams(struct apple_dart_atomic_stream_map *domain_maps, - struct apple_dart_stream_map *master_maps, - bool add_streams) - { -- int i; -+ int i, j; - - for (i = 0; i < MAX_DARTS_PER_DEVICE; ++i) { - if (domain_maps[i].dart != master_maps[i].dart) -@@ -470,12 +484,14 @@ apple_dart_mod_streams(struct apple_dart_atomic_stream_map *domain_maps, - for (i = 0; i < MAX_DARTS_PER_DEVICE; ++i) { - if (!domain_maps[i].dart) - break; -- if (add_streams) -- atomic64_or(master_maps[i].sidmap, -- &domain_maps[i].sidmap); -- else -- atomic64_and(~master_maps[i].sidmap, -- &domain_maps[i].sidmap); -+ for (j = 0; j < BITS_TO_LONGS(domain_maps[i].dart->num_streams); j++) { -+ if (add_streams) -+ atomic64_or(master_maps[i].sidmap[j], -+ &domain_maps[i].sidmap[j]); -+ else -+ atomic64_and(~master_maps[i].sidmap[j], -+ &domain_maps[i].sidmap[j]); -+ } - } - - return 0; -@@ -642,14 +658,14 @@ static int apple_dart_of_xlate(struct device *dev, struct of_phandle_args *args) - - for (i = 0; i < MAX_DARTS_PER_DEVICE; ++i) { - if (cfg->stream_maps[i].dart == dart) { -- cfg->stream_maps[i].sidmap |= 1 << sid; -+ set_bit(sid, cfg->stream_maps[i].sidmap); - return 0; - } - } - for (i = 0; i < MAX_DARTS_PER_DEVICE; ++i) { - if (!cfg->stream_maps[i].dart) { - cfg->stream_maps[i].dart = dart; -- cfg->stream_maps[i].sidmap = 1 << sid; -+ set_bit(sid, cfg->stream_maps[i].sidmap); - return 0; - } - } -@@ -668,7 +684,7 @@ static void apple_dart_release_group(void *iommu_data) - mutex_lock(&apple_dart_groups_lock); - - for_each_stream_map(i, group_master_cfg, stream_map) -- for_each_set_bit(sid, &stream_map->sidmap, DART_MAX_STREAMS) -+ for_each_set_bit(sid, stream_map->sidmap, stream_map->dart->num_streams) - stream_map->dart->sid2group[sid] = NULL; - - kfree(iommu_data); -@@ -687,7 +703,7 @@ static struct iommu_group *apple_dart_device_group(struct device *dev) - mutex_lock(&apple_dart_groups_lock); - - for_each_stream_map(i, cfg, stream_map) { -- for_each_set_bit(sid, &stream_map->sidmap, DART_MAX_STREAMS) { -+ for_each_set_bit(sid, stream_map->sidmap, stream_map->dart->num_streams) { - struct iommu_group *stream_group = - stream_map->dart->sid2group[sid]; - -@@ -726,7 +742,7 @@ static struct iommu_group *apple_dart_device_group(struct device *dev) - apple_dart_release_group); - - for_each_stream_map(i, cfg, stream_map) -- for_each_set_bit(sid, &stream_map->sidmap, DART_MAX_STREAMS) -+ for_each_set_bit(sid, stream_map->sidmap, stream_map->dart->num_streams) - stream_map->dart->sid2group[sid] = group; - - res = group; -@@ -893,16 +909,25 @@ static int apple_dart_probe(struct platform_device *pdev) - if (ret) - return ret; - -- ret = apple_dart_hw_reset(dart); -- if (ret) -- goto err_clk_disable; -- - dart_params[0] = readl(dart->regs + DART_PARAMS1); - dart_params[1] = readl(dart->regs + DART_PARAMS2); - dart->pgsize = 1 << FIELD_GET(DART_PARAMS_PAGE_SHIFT, dart_params[0]); - dart->supports_bypass = dart_params[1] & DART_PARAMS_BYPASS_SUPPORT; -+ -+ dart->num_streams = dart->hw->max_sid_count; -+ -+ if (dart->num_streams > DART_MAX_STREAMS) { -+ dev_err(&pdev->dev, "Too many streams (%d > %d)\n", -+ dart->num_streams, DART_MAX_STREAMS); -+ goto err_clk_disable; -+ } -+ - dart->force_bypass = dart->pgsize > PAGE_SIZE; - -+ ret = apple_dart_hw_reset(dart); -+ if (ret) -+ goto err_clk_disable; -+ - ret = request_irq(dart->irq, apple_dart_irq, IRQF_SHARED, - "apple-dart fault handler", dart); - if (ret) -@@ -925,8 +950,8 @@ static int apple_dart_probe(struct platform_device *pdev) - - dev_info( - &pdev->dev, -- "DART [pagesize %x, bypass support: %d, bypass forced: %d] initialized\n", -- dart->pgsize, dart->supports_bypass, dart->force_bypass); -+ "DART [pagesize %x, %d streams, bypass support: %d, bypass forced: %d] initialized\n", -+ dart->pgsize, dart->num_streams, dart->supports_bypass, dart->force_bypass); - return 0; - - err_sysfs_remove: -@@ -960,10 +985,12 @@ static int apple_dart_remove(struct platform_device *pdev) - static const struct apple_dart_hw apple_dart_hw_t8103 = { - .oas = 36, - .fmt = APPLE_DART, -+ .max_sid_count = 16, - }; - static const struct apple_dart_hw apple_dart_hw_t6000 = { - .oas = 42, - .fmt = APPLE_DART2, -+ .max_sid_count = 16, - }; - - #ifdef CONFIG_PM_SLEEP -@@ -972,7 +999,7 @@ static int apple_dart_suspend(struct device *dev) - struct apple_dart *dart = dev_get_drvdata(dev); - unsigned int sid, idx; - -- for (sid = 0; sid < DART_MAX_STREAMS; sid++) { -+ for (sid = 0; sid < dart->num_streams; sid++) { - dart->save_tcr[sid] = readl_relaxed(dart->regs + DART_TCR(sid)); - for (idx = 0; idx < DART_MAX_TTBR; idx++) - dart->save_ttbr[sid][idx] = -@@ -994,7 +1021,7 @@ static int apple_dart_resume(struct device *dev) - return ret; - } - -- for (sid = 0; sid < DART_MAX_STREAMS; sid++) { -+ for (sid = 0; sid < dart->num_streams; sid++) { - for (idx = 0; idx < DART_MAX_TTBR; idx++) - writel_relaxed(dart->save_ttbr[sid][idx], - dart->regs + DART_TTBR(sid, idx)); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0053-iommu-dart-Support-a-variable-number-of-TTBRs-per-st.patch b/target/linux/silicon/patches-5.19/0053-iommu-dart-Support-a-variable-number-of-TTBRs-per-st.patch deleted file mode 100644 index 45aefa743..000000000 --- a/target/linux/silicon/patches-5.19/0053-iommu-dart-Support-a-variable-number-of-TTBRs-per-st.patch +++ /dev/null @@ -1,119 +0,0 @@ -From 180390038e38222406314cb6eea2182a7817b459 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 28 Jun 2022 01:16:28 +0900 -Subject: [PATCH 053/171] iommu: dart: Support a variable number of TTBRs per - stream - -T8110 only has one TTBR per stream, so un-hardcode that. - -Signed-off-by: Hector Martin ---- - drivers/iommu/apple-dart.c | 28 +++++++++++++++++++--------- - 1 file changed, 19 insertions(+), 9 deletions(-) - -diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c -index 39e6f86dd525..9f2751c12070 100644 ---- a/drivers/iommu/apple-dart.c -+++ b/drivers/iommu/apple-dart.c -@@ -76,15 +76,21 @@ - #define DART_TCR_BYPASS0_ENABLE BIT(8) - #define DART_TCR_BYPASS1_ENABLE BIT(12) - --#define DART_TTBR(sid, idx) (0x200 + 16 * (sid) + 4 * (idx)) - #define DART_TTBR_VALID BIT(31) - #define DART_TTBR_SHIFT 12 - -+#define DART_TTBR(dart, sid, idx) (0x200 + \ -+ (((dart)->hw->ttbr_count * (sid)) << 2) + \ -+ ((idx) << 2)) -+ -+ - struct apple_dart_hw { - u32 oas; - enum io_pgtable_fmt fmt; - - int max_sid_count; -+ -+ int ttbr_count; - }; - - /* -@@ -244,7 +250,7 @@ static void apple_dart_hw_set_ttbr(struct apple_dart_stream_map *stream_map, - WARN_ON(paddr & ((1 << DART_TTBR_SHIFT) - 1)); - for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) - writel(DART_TTBR_VALID | (paddr >> DART_TTBR_SHIFT), -- dart->regs + DART_TTBR(sid, idx)); -+ dart->regs + DART_TTBR(dart, sid, idx)); - } - - static void apple_dart_hw_clear_ttbr(struct apple_dart_stream_map *stream_map, -@@ -254,7 +260,7 @@ static void apple_dart_hw_clear_ttbr(struct apple_dart_stream_map *stream_map, - int sid; - - for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) -- writel(0, dart->regs + DART_TTBR(sid, idx)); -+ writel(0, dart->regs + DART_TTBR(dart, sid, idx)); - } - - static void -@@ -262,7 +268,7 @@ apple_dart_hw_clear_all_ttbrs(struct apple_dart_stream_map *stream_map) - { - int i; - -- for (i = 0; i < DART_MAX_TTBR; ++i) -+ for (i = 0; i < stream_map->dart->hw->ttbr_count; ++i) - apple_dart_hw_clear_ttbr(stream_map, i); - } - -@@ -414,7 +420,7 @@ apple_dart_setup_translation(struct apple_dart_domain *domain, - for (i = 0; i < pgtbl_cfg->apple_dart_cfg.n_ttbrs; ++i) - apple_dart_hw_set_ttbr(stream_map, i, - pgtbl_cfg->apple_dart_cfg.ttbr[i]); -- for (; i < DART_MAX_TTBR; ++i) -+ for (; i < stream_map->dart->hw->ttbr_count; ++i) - apple_dart_hw_clear_ttbr(stream_map, i); - - apple_dart_hw_enable_translation(stream_map); -@@ -986,11 +992,15 @@ static const struct apple_dart_hw apple_dart_hw_t8103 = { - .oas = 36, - .fmt = APPLE_DART, - .max_sid_count = 16, -+ -+ .ttbr_count = 4, - }; - static const struct apple_dart_hw apple_dart_hw_t6000 = { - .oas = 42, - .fmt = APPLE_DART2, - .max_sid_count = 16, -+ -+ .ttbr_count = 4, - }; - - #ifdef CONFIG_PM_SLEEP -@@ -1001,9 +1011,9 @@ static int apple_dart_suspend(struct device *dev) - - for (sid = 0; sid < dart->num_streams; sid++) { - dart->save_tcr[sid] = readl_relaxed(dart->regs + DART_TCR(sid)); -- for (idx = 0; idx < DART_MAX_TTBR; idx++) -+ for (idx = 0; idx < dart->hw->ttbr_count; idx++) - dart->save_ttbr[sid][idx] = -- readl_relaxed(dart->regs + DART_TTBR(sid, idx)); -+ readl_relaxed(dart->regs + DART_TTBR(dart, sid, idx)); - } - - return 0; -@@ -1022,9 +1032,9 @@ static int apple_dart_resume(struct device *dev) - } - - for (sid = 0; sid < dart->num_streams; sid++) { -- for (idx = 0; idx < DART_MAX_TTBR; idx++) -+ for (idx = 0; idx < dart->hw->ttbr_count; idx++) - writel_relaxed(dart->save_ttbr[sid][idx], -- dart->regs + DART_TTBR(sid, idx)); -+ dart->regs + DART_TTBR(dart, sid, idx)); - writel_relaxed(dart->save_tcr[sid], dart->regs + DART_TCR(sid)); - } - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0054-iommu-dart-Fix-DART_PARAMS1-2-bit-define-names.patch b/target/linux/silicon/patches-5.19/0054-iommu-dart-Fix-DART_PARAMS1-2-bit-define-names.patch deleted file mode 100644 index c8d4bc03c..000000000 --- a/target/linux/silicon/patches-5.19/0054-iommu-dart-Fix-DART_PARAMS1-2-bit-define-names.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 85ab83f3cc7a4f0bfff8edd1662c2d98cda766a1 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 28 Jun 2022 01:20:52 +0900 -Subject: [PATCH 054/171] iommu: dart: Fix DART_PARAMS1/2 bit define names - -They didn't have the PARAMS reg index in them, but they should. - -Signed-off-by: Hector Martin ---- - drivers/iommu/apple-dart.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c -index 9f2751c12070..e6b641037429 100644 ---- a/drivers/iommu/apple-dart.c -+++ b/drivers/iommu/apple-dart.c -@@ -39,10 +39,10 @@ - - - #define DART_PARAMS1 0x00 --#define DART_PARAMS_PAGE_SHIFT GENMASK(27, 24) -+#define DART_PARAMS1_PAGE_SHIFT GENMASK(27, 24) - - #define DART_PARAMS2 0x04 --#define DART_PARAMS_BYPASS_SUPPORT BIT(0) -+#define DART_PARAMS2_BYPASS_SUPPORT BIT(0) - - #define DART_STREAM_COMMAND 0x20 - #define DART_STREAM_COMMAND_BUSY BIT(2) -@@ -917,8 +917,8 @@ static int apple_dart_probe(struct platform_device *pdev) - - dart_params[0] = readl(dart->regs + DART_PARAMS1); - dart_params[1] = readl(dart->regs + DART_PARAMS2); -- dart->pgsize = 1 << FIELD_GET(DART_PARAMS_PAGE_SHIFT, dart_params[0]); -- dart->supports_bypass = dart_params[1] & DART_PARAMS_BYPASS_SUPPORT; -+ dart->pgsize = 1 << FIELD_GET(DART_PARAMS1_PAGE_SHIFT, dart_params[0]); -+ dart->supports_bypass = dart_params[1] & DART_PARAMS2_BYPASS_SUPPORT; - - dart->num_streams = dart->hw->max_sid_count; - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0055-iommu-dart-Support-different-variants-with-different.patch b/target/linux/silicon/patches-5.19/0055-iommu-dart-Support-different-variants-with-different.patch deleted file mode 100644 index 7ef4b10c7..000000000 --- a/target/linux/silicon/patches-5.19/0055-iommu-dart-Support-different-variants-with-different.patch +++ /dev/null @@ -1,394 +0,0 @@ -From fbe7133a9b1e71ee18185dd7c67712c909515bfd Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 28 Jun 2022 01:27:28 +0900 -Subject: [PATCH 055/171] iommu: dart: Support different variants with - different registers - -T8110 has a new register layout. To accomodate this, first move all the -register offsets to the hw structure, and rename all the existing -registers to DART_T8020_*. - -Signed-off-by: Hector Martin ---- - drivers/iommu/apple-dart.c | 188 ++++++++++++++++++++++++------------- - 1 file changed, 125 insertions(+), 63 deletions(-) - -diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c -index e6b641037429..3f89db3f8e99 100644 ---- a/drivers/iommu/apple-dart.c -+++ b/drivers/iommu/apple-dart.c -@@ -37,6 +37,7 @@ - #define DART_MAX_TTBR 4 - #define MAX_DARTS_PER_DEVICE 2 - -+/* Common registers */ - - #define DART_PARAMS1 0x00 - #define DART_PARAMS1_PAGE_SHIFT GENMASK(27, 24) -@@ -44,52 +45,79 @@ - #define DART_PARAMS2 0x04 - #define DART_PARAMS2_BYPASS_SUPPORT BIT(0) - --#define DART_STREAM_COMMAND 0x20 --#define DART_STREAM_COMMAND_BUSY BIT(2) --#define DART_STREAM_COMMAND_INVALIDATE BIT(20) -+/* T8020/T6000 registers */ - --#define DART_STREAM_SELECT 0x34 -+#define DART_T8020_STREAM_COMMAND 0x20 -+#define DART_T8020_STREAM_COMMAND_BUSY BIT(2) -+#define DART_T8020_STREAM_COMMAND_INVALIDATE BIT(20) - --#define DART_ERROR 0x40 --#define DART_ERROR_STREAM GENMASK(27, 24) --#define DART_ERROR_CODE GENMASK(11, 0) --#define DART_ERROR_FLAG BIT(31) -+#define DART_T8020_STREAM_SELECT 0x34 - --#define DART_ERROR_READ_FAULT BIT(4) --#define DART_ERROR_WRITE_FAULT BIT(3) --#define DART_ERROR_NO_PTE BIT(2) --#define DART_ERROR_NO_PMD BIT(1) --#define DART_ERROR_NO_TTBR BIT(0) -+#define DART_T8020_ERROR 0x40 -+#define DART_T8020_ERROR_STREAM GENMASK(27, 24) -+#define DART_T8020_ERROR_CODE GENMASK(11, 0) -+#define DART_T8020_ERROR_FLAG BIT(31) - --#define DART_CONFIG 0x60 --#define DART_CONFIG_LOCK BIT(15) -+#define DART_T8020_ERROR_READ_FAULT BIT(4) -+#define DART_T8020_ERROR_WRITE_FAULT BIT(3) -+#define DART_T8020_ERROR_NO_PTE BIT(2) -+#define DART_T8020_ERROR_NO_PMD BIT(1) -+#define DART_T8020_ERROR_NO_TTBR BIT(0) -+ -+#define DART_T8020_CONFIG 0x60 -+#define DART_T8020_CONFIG_LOCK BIT(15) - - #define DART_STREAM_COMMAND_BUSY_TIMEOUT 100 - --#define DART_ERROR_ADDR_HI 0x54 --#define DART_ERROR_ADDR_LO 0x50 -+#define DART_T8020_ERROR_ADDR_HI 0x54 -+#define DART_T8020_ERROR_ADDR_LO 0x50 -+ -+#define DART_T8020_STREAMS_ENABLE 0xfc - --#define DART_STREAMS_ENABLE 0xfc -+#define DART_T8020_TCR 0x100 -+#define DART_T8020_TCR_TRANSLATE_ENABLE BIT(7) -+#define DART_T8020_TCR_BYPASS_DART BIT(8) -+#define DART_T8020_TCR_BYPASS_DAPF BIT(12) - --#define DART_TCR(sid) (0x100 + 4 * (sid)) --#define DART_TCR_TRANSLATE_ENABLE BIT(7) --#define DART_TCR_BYPASS0_ENABLE BIT(8) --#define DART_TCR_BYPASS1_ENABLE BIT(12) -+#define DART_T8020_TTBR 0x200 -+#define DART_T8020_TTBR_VALID BIT(31) -+#define DART_T8020_TTBR_ADDR_OFF 0 -+#define DART_T8020_TTBR_SHIFT 12 - --#define DART_TTBR_VALID BIT(31) --#define DART_TTBR_SHIFT 12 -+#define DART_TCR(dart, sid) ((dart)->hw->tcr + ((sid) << 2)) - --#define DART_TTBR(dart, sid, idx) (0x200 + \ -+#define DART_TTBR(dart, sid, idx) ((dart)->hw->ttbr + \ - (((dart)->hw->ttbr_count * (sid)) << 2) + \ - ((idx) << 2)) - -+struct apple_dart_stream_map; - - struct apple_dart_hw { -+ irqreturn_t (*irq_handler)(int irq, void *dev); -+ int (*invalidate_tlb)(struct apple_dart_stream_map *stream_map); -+ - u32 oas; - enum io_pgtable_fmt fmt; - - int max_sid_count; - -+ u64 lock; -+ u64 lock_bit; -+ -+ u64 error; -+ -+ u64 enable_streams; -+ u64 disable_streams; -+ -+ u64 tcr; -+ u64 tcr_enabled; -+ u64 tcr_disabled; -+ u64 tcr_bypass; -+ -+ u64 ttbr; -+ u64 ttbr_valid; -+ u64 ttbr_addr_off; -+ u64 ttbr_shift; - int ttbr_count; - }; - -@@ -216,8 +244,7 @@ apple_dart_hw_enable_translation(struct apple_dart_stream_map *stream_map) - int sid; - - for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) -- writel(DART_TCR_TRANSLATE_ENABLE, -- dart->regs + DART_TCR(sid)); -+ writel(dart->hw->tcr_enabled, dart->regs + DART_TCR(dart, sid)); - } - - static void apple_dart_hw_disable_dma(struct apple_dart_stream_map *stream_map) -@@ -226,7 +253,7 @@ static void apple_dart_hw_disable_dma(struct apple_dart_stream_map *stream_map) - int sid; - - for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) -- writel(0, dart->regs + DART_TCR(sid)); -+ writel(dart->hw->tcr_disabled, dart->regs + DART_TCR(dart, sid)); - } - - static void -@@ -237,8 +264,8 @@ apple_dart_hw_enable_bypass(struct apple_dart_stream_map *stream_map) - - WARN_ON(!stream_map->dart->supports_bypass); - for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) -- writel(DART_TCR_BYPASS0_ENABLE | DART_TCR_BYPASS1_ENABLE, -- dart->regs + DART_TCR(sid)); -+ writel(dart->hw->tcr_bypass, -+ dart->regs + DART_TCR(dart, sid)); - } - - static void apple_dart_hw_set_ttbr(struct apple_dart_stream_map *stream_map, -@@ -247,9 +274,10 @@ static void apple_dart_hw_set_ttbr(struct apple_dart_stream_map *stream_map, - struct apple_dart *dart = stream_map->dart; - int sid; - -- WARN_ON(paddr & ((1 << DART_TTBR_SHIFT) - 1)); -+ WARN_ON(paddr & ((1 << dart->hw->ttbr_shift) - 1)); - for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) -- writel(DART_TTBR_VALID | (paddr >> DART_TTBR_SHIFT), -+ writel(dart->hw->ttbr_valid | -+ (paddr >> dart->hw->ttbr_shift) << dart->hw->ttbr_addr_off, - dart->regs + DART_TTBR(dart, sid, idx)); - } - -@@ -273,7 +301,7 @@ apple_dart_hw_clear_all_ttbrs(struct apple_dart_stream_map *stream_map) - } - - static int --apple_dart_hw_stream_command(struct apple_dart_stream_map *stream_map, -+apple_dart_t8020_hw_stream_command(struct apple_dart_stream_map *stream_map, - u32 command) - { - unsigned long flags; -@@ -282,12 +310,12 @@ apple_dart_hw_stream_command(struct apple_dart_stream_map *stream_map, - - spin_lock_irqsave(&stream_map->dart->lock, flags); - -- writel(stream_map->sidmap[0], stream_map->dart->regs + DART_STREAM_SELECT); -- writel(command, stream_map->dart->regs + DART_STREAM_COMMAND); -+ writel(stream_map->sidmap[0], stream_map->dart->regs + DART_T8020_STREAM_SELECT); -+ writel(command, stream_map->dart->regs + DART_T8020_STREAM_COMMAND); - - ret = readl_poll_timeout_atomic( -- stream_map->dart->regs + DART_STREAM_COMMAND, command_reg, -- !(command_reg & DART_STREAM_COMMAND_BUSY), 1, -+ stream_map->dart->regs + DART_T8020_STREAM_COMMAND, command_reg, -+ !(command_reg & DART_T8020_STREAM_COMMAND_BUSY), 1, - DART_STREAM_COMMAND_BUSY_TIMEOUT); - - spin_unlock_irqrestore(&stream_map->dart->lock, flags); -@@ -303,10 +331,10 @@ apple_dart_hw_stream_command(struct apple_dart_stream_map *stream_map, - } - - static int --apple_dart_hw_invalidate_tlb(struct apple_dart_stream_map *stream_map) -+apple_dart_t8020_hw_invalidate_tlb(struct apple_dart_stream_map *stream_map) - { -- return apple_dart_hw_stream_command(stream_map, -- DART_STREAM_COMMAND_INVALIDATE); -+ return apple_dart_t8020_hw_stream_command( -+ stream_map, DART_T8020_STREAM_COMMAND_INVALIDATE); - } - - static int apple_dart_hw_reset(struct apple_dart *dart) -@@ -315,8 +343,8 @@ static int apple_dart_hw_reset(struct apple_dart *dart) - struct apple_dart_stream_map stream_map; - int i; - -- config = readl(dart->regs + DART_CONFIG); -- if (config & DART_CONFIG_LOCK) { -+ config = readl(dart->regs + dart->hw->lock); -+ if (config & dart->hw->lock_bit) { - dev_err(dart->dev, "DART is locked down until reboot: %08x\n", - config); - return -EINVAL; -@@ -330,12 +358,12 @@ static int apple_dart_hw_reset(struct apple_dart *dart) - - /* enable all streams globally since TCR is used to control isolation */ - for (i = 0; i < BITS_TO_U32(dart->num_streams); i++) -- writel(U32_MAX, dart->regs + DART_STREAMS_ENABLE); -+ writel(U32_MAX, dart->regs + dart->hw->enable_streams); - - /* clear any pending errors before the interrupt is unmasked */ -- writel(readl(dart->regs + DART_ERROR), dart->regs + DART_ERROR); -+ writel(readl(dart->regs + dart->hw->error), dart->regs + dart->hw->error); - -- return apple_dart_hw_invalidate_tlb(&stream_map); -+ return dart->hw->invalidate_tlb(&stream_map); - } - - static void apple_dart_domain_flush_tlb(struct apple_dart_domain *domain) -@@ -350,7 +378,7 @@ static void apple_dart_domain_flush_tlb(struct apple_dart_domain *domain) - for (j = 0; j < BITS_TO_LONGS(stream_map.dart->num_streams); j++) - stream_map.sidmap[j] = atomic64_read(&domain_stream_map->sidmap[j]); - -- apple_dart_hw_invalidate_tlb(&stream_map); -+ stream_map.dart->hw->invalidate_tlb(&stream_map); - } - } - -@@ -424,7 +452,7 @@ apple_dart_setup_translation(struct apple_dart_domain *domain, - apple_dart_hw_clear_ttbr(stream_map, i); - - apple_dart_hw_enable_translation(stream_map); -- apple_dart_hw_invalidate_tlb(stream_map); -+ stream_map->dart->hw->invalidate_tlb(stream_map); - } - - static int apple_dart_finalize_domain(struct iommu_domain *domain, -@@ -819,30 +847,30 @@ static const struct iommu_ops apple_dart_iommu_ops = { - } - }; - --static irqreturn_t apple_dart_irq(int irq, void *dev) -+static irqreturn_t apple_dart_t8020_irq(int irq, void *dev) - { - struct apple_dart *dart = dev; - const char *fault_name = NULL; -- u32 error = readl(dart->regs + DART_ERROR); -- u32 error_code = FIELD_GET(DART_ERROR_CODE, error); -- u32 addr_lo = readl(dart->regs + DART_ERROR_ADDR_LO); -- u32 addr_hi = readl(dart->regs + DART_ERROR_ADDR_HI); -+ u32 error = readl(dart->regs + DART_T8020_ERROR); -+ u32 error_code = FIELD_GET(DART_T8020_ERROR_CODE, error); -+ u32 addr_lo = readl(dart->regs + DART_T8020_ERROR_ADDR_LO); -+ u32 addr_hi = readl(dart->regs + DART_T8020_ERROR_ADDR_HI); - u64 addr = addr_lo | (((u64)addr_hi) << 32); -- u8 stream_idx = FIELD_GET(DART_ERROR_STREAM, error); -+ u8 stream_idx = FIELD_GET(DART_T8020_ERROR_STREAM, error); - -- if (!(error & DART_ERROR_FLAG)) -+ if (!(error & DART_T8020_ERROR_FLAG)) - return IRQ_NONE; - - /* there should only be a single bit set but let's use == to be sure */ -- if (error_code == DART_ERROR_READ_FAULT) -+ if (error_code == DART_T8020_ERROR_READ_FAULT) - fault_name = "READ FAULT"; -- else if (error_code == DART_ERROR_WRITE_FAULT) -+ else if (error_code == DART_T8020_ERROR_WRITE_FAULT) - fault_name = "WRITE FAULT"; -- else if (error_code == DART_ERROR_NO_PTE) -+ else if (error_code == DART_T8020_ERROR_NO_PTE) - fault_name = "NO PTE FOR IOVA"; -- else if (error_code == DART_ERROR_NO_PMD) -+ else if (error_code == DART_T8020_ERROR_NO_PMD) - fault_name = "NO PMD FOR IOVA"; -- else if (error_code == DART_ERROR_NO_TTBR) -+ else if (error_code == DART_T8020_ERROR_NO_TTBR) - fault_name = "NO TTBR FOR IOVA"; - else - fault_name = "unknown"; -@@ -852,7 +880,7 @@ static irqreturn_t apple_dart_irq(int irq, void *dev) - "translation fault: status:0x%x stream:%d code:0x%x (%s) at 0x%llx", - error, stream_idx, error_code, fault_name, addr); - -- writel(error, dart->regs + DART_ERROR); -+ writel(error, dart->regs + DART_T8020_ERROR); - return IRQ_HANDLED; - } - -@@ -934,7 +962,7 @@ static int apple_dart_probe(struct platform_device *pdev) - if (ret) - goto err_clk_disable; - -- ret = request_irq(dart->irq, apple_dart_irq, IRQF_SHARED, -+ ret = request_irq(dart->irq, dart->hw->irq_handler, IRQF_SHARED, - "apple-dart fault handler", dart); - if (ret) - goto err_clk_disable; -@@ -989,17 +1017,51 @@ static int apple_dart_remove(struct platform_device *pdev) - } - - static const struct apple_dart_hw apple_dart_hw_t8103 = { -+ .irq_handler = apple_dart_t8020_irq, -+ .invalidate_tlb = apple_dart_t8020_hw_invalidate_tlb, - .oas = 36, - .fmt = APPLE_DART, - .max_sid_count = 16, - -+ .enable_streams = DART_T8020_STREAMS_ENABLE, -+ .lock = DART_T8020_CONFIG, -+ .lock_bit = DART_T8020_CONFIG_LOCK, -+ -+ .error = DART_T8020_ERROR, -+ -+ .tcr = DART_T8020_TCR, -+ .tcr_enabled = DART_T8020_TCR_TRANSLATE_ENABLE, -+ .tcr_disabled = 0, -+ .tcr_bypass = DART_T8020_TCR_BYPASS_DAPF | DART_T8020_TCR_BYPASS_DART, -+ -+ .ttbr = DART_T8020_TTBR, -+ .ttbr_valid = DART_T8020_TTBR_VALID, -+ .ttbr_addr_off = DART_T8020_TTBR_ADDR_OFF, -+ .ttbr_shift = DART_T8020_TTBR_SHIFT, - .ttbr_count = 4, - }; - static const struct apple_dart_hw apple_dart_hw_t6000 = { -+ .irq_handler = apple_dart_t8020_irq, -+ .invalidate_tlb = apple_dart_t8020_hw_invalidate_tlb, - .oas = 42, - .fmt = APPLE_DART2, - .max_sid_count = 16, - -+ .enable_streams = DART_T8020_STREAMS_ENABLE, -+ .lock = DART_T8020_CONFIG, -+ .lock_bit = DART_T8020_CONFIG_LOCK, -+ -+ .error = DART_T8020_ERROR, -+ -+ .tcr = DART_T8020_TCR, -+ .tcr_enabled = DART_T8020_TCR_TRANSLATE_ENABLE, -+ .tcr_disabled = 0, -+ .tcr_bypass = DART_T8020_TCR_BYPASS_DAPF | DART_T8020_TCR_BYPASS_DART, -+ -+ .ttbr = DART_T8020_TTBR, -+ .ttbr_valid = DART_T8020_TTBR_VALID, -+ .ttbr_addr_off = DART_T8020_TTBR_ADDR_OFF, -+ .ttbr_shift = DART_T8020_TTBR_SHIFT, - .ttbr_count = 4, - }; - -@@ -1010,7 +1072,7 @@ static int apple_dart_suspend(struct device *dev) - unsigned int sid, idx; - - for (sid = 0; sid < dart->num_streams; sid++) { -- dart->save_tcr[sid] = readl_relaxed(dart->regs + DART_TCR(sid)); -+ dart->save_tcr[sid] = readl_relaxed(dart->regs + DART_TCR(dart, sid)); - for (idx = 0; idx < dart->hw->ttbr_count; idx++) - dart->save_ttbr[sid][idx] = - readl_relaxed(dart->regs + DART_TTBR(dart, sid, idx)); -@@ -1035,7 +1097,7 @@ static int apple_dart_resume(struct device *dev) - for (idx = 0; idx < dart->hw->ttbr_count; idx++) - writel_relaxed(dart->save_ttbr[sid][idx], - dart->regs + DART_TTBR(dart, sid, idx)); -- writel_relaxed(dart->save_tcr[sid], dart->regs + DART_TCR(sid)); -+ writel_relaxed(dart->save_tcr[sid], dart->regs + DART_TCR(dart, sid)); - } - - return 0; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0056-iommu-dart-Add-t8110-support.patch b/target/linux/silicon/patches-5.19/0056-iommu-dart-Add-t8110-support.patch deleted file mode 100644 index 0770d12fa..000000000 --- a/target/linux/silicon/patches-5.19/0056-iommu-dart-Add-t8110-support.patch +++ /dev/null @@ -1,316 +0,0 @@ -From 50f73e1258c60ccd081a09339f77176f0f9bc49c Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 28 Jun 2022 01:33:40 +0900 -Subject: [PATCH 056/171] iommu: dart: Add t8110 support - -Signed-off-by: Hector Martin ---- - drivers/iommu/apple-dart.c | 200 ++++++++++++++++++++++++++++++++++++- - 1 file changed, 197 insertions(+), 3 deletions(-) - -diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c -index 3f89db3f8e99..249798e26e5d 100644 ---- a/drivers/iommu/apple-dart.c -+++ b/drivers/iommu/apple-dart.c -@@ -84,6 +84,62 @@ - #define DART_T8020_TTBR_ADDR_OFF 0 - #define DART_T8020_TTBR_SHIFT 12 - -+/* T8110 registers */ -+ -+#define DART_T8110_PARAMS3 0x08 -+#define DART_T8110_PARAMS3_PA_WIDTH GENMASK(29, 24) -+#define DART_T8110_PARAMS3_VA_WIDTH GENMASK(21, 16) -+#define DART_T8110_PARAMS3_VER_MAJ GENMASK(15, 8) -+#define DART_T8110_PARAMS3_VER_MIN GENMASK(7, 0) -+ -+#define DART_T8110_PARAMS4 0x0c -+#define DART_T8110_PARAMS4_NUM_CLIENTS GENMASK(24, 16) -+#define DART_T8110_PARAMS4_NUM_SIDS GENMASK(8, 0) -+ -+#define DART_T8110_TLB_CMD 0x80 -+#define DART_T8110_TLB_CMD_BUSY BIT(31) -+#define DART_T8110_TLB_CMD_OP GENMASK(10, 8) -+#define DART_T8110_TLB_CMD_OP_FLUSH_ALL 0 -+#define DART_T8110_TLB_CMD_OP_FLUSH_SID 1 -+#define DART_T8110_TLB_CMD_STREAM GENMASK(7, 0) -+ -+#define DART_T8110_ERROR 0x100 -+#define DART_T8110_ERROR_STREAM GENMASK(27, 20) -+#define DART_T8110_ERROR_CODE GENMASK(14, 0) -+#define DART_T8110_ERROR_FLAG BIT(31) -+ -+#define DART_T8110_ERROR_MASK 0x104 -+ -+#define DART_T8110_ERROR_READ_FAULT BIT(4) -+#define DART_T8110_ERROR_WRITE_FAULT BIT(3) -+#define DART_T8110_ERROR_NO_PTE BIT(3) -+#define DART_T8110_ERROR_NO_PMD BIT(2) -+#define DART_T8110_ERROR_NO_PGD BIT(1) -+#define DART_T8110_ERROR_NO_TTBR BIT(0) -+ -+#define DART_T8110_ERROR_ADDR_LO 0x170 -+#define DART_T8110_ERROR_ADDR_HI 0x174 -+ -+#define DART_T8110_PROTECT 0x200 -+#define DART_T8110_UNPROTECT 0x204 -+#define DART_T8110_PROTECT_LOCK 0x208 -+#define DART_T8110_PROTECT_TTBR_TCR BIT(0) -+ -+#define DART_T8110_ENABLE_STREAMS 0xc00 -+#define DART_T8110_DISABLE_STREAMS 0xc20 -+ -+#define DART_T8110_TCR 0x1000 -+#define DART_T8110_TCR_REMAP GENMASK(11, 8) -+#define DART_T8110_TCR_REMAP_EN BIT(7) -+#define DART_T8110_TCR_BYPASS_DAPF BIT(2) -+#define DART_T8110_TCR_BYPASS_DART BIT(1) -+#define DART_T8110_TCR_TRANSLATE_ENABLE BIT(0) -+ -+#define DART_T8110_TTBR 0x1400 -+#define DART_T8110_TTBR_VALID BIT(0) -+#define DART_T8110_TTBR_ADDR_OFF 2 -+#define DART_T8110_TTBR_SHIFT 14 -+ - #define DART_TCR(dart, sid) ((dart)->hw->tcr + ((sid) << 2)) - - #define DART_TTBR(dart, sid, idx) ((dart)->hw->ttbr + \ -@@ -92,7 +148,14 @@ - - struct apple_dart_stream_map; - -+enum dart_type { -+ DART_T8020, -+ DART_T6000, -+ DART_T8110, -+}; -+ - struct apple_dart_hw { -+ enum dart_type type; - irqreturn_t (*irq_handler)(int irq, void *dev); - int (*invalidate_tlb)(struct apple_dart_stream_map *stream_map); - -@@ -149,6 +212,7 @@ struct apple_dart { - - spinlock_t lock; - -+ u32 oas; - u32 pgsize; - u32 num_streams; - u32 supports_bypass : 1; -@@ -330,6 +394,44 @@ apple_dart_t8020_hw_stream_command(struct apple_dart_stream_map *stream_map, - return 0; - } - -+static int -+apple_dart_t8110_hw_tlb_command(struct apple_dart_stream_map *stream_map, -+ u32 command) -+{ -+ struct apple_dart *dart = stream_map->dart; -+ unsigned long flags; -+ int ret = 0; -+ int sid; -+ -+ spin_lock_irqsave(&dart->lock, flags); -+ -+ for_each_set_bit(sid, stream_map->sidmap, dart->num_streams) { -+ u32 val = FIELD_PREP(DART_T8110_TLB_CMD_OP, command) | -+ FIELD_PREP(DART_T8110_TLB_CMD_STREAM, sid); -+ writel(val, dart->regs + DART_T8110_TLB_CMD); -+ -+ ret = readl_poll_timeout_atomic( -+ dart->regs + DART_T8110_TLB_CMD, val, -+ !(val & DART_T8110_TLB_CMD_BUSY), 1, -+ DART_STREAM_COMMAND_BUSY_TIMEOUT); -+ -+ if (ret) -+ break; -+ -+ } -+ -+ spin_unlock_irqrestore(&dart->lock, flags); -+ -+ if (ret) { -+ dev_err(stream_map->dart->dev, -+ "busy bit did not clear after command %x for stream %d\n", -+ command, sid); -+ return ret; -+ } -+ -+ return 0; -+} -+ - static int - apple_dart_t8020_hw_invalidate_tlb(struct apple_dart_stream_map *stream_map) - { -@@ -337,6 +439,13 @@ apple_dart_t8020_hw_invalidate_tlb(struct apple_dart_stream_map *stream_map) - stream_map, DART_T8020_STREAM_COMMAND_INVALIDATE); - } - -+static int -+apple_dart_t8110_hw_invalidate_tlb(struct apple_dart_stream_map *stream_map) -+{ -+ return apple_dart_t8110_hw_tlb_command( -+ stream_map, DART_T8110_TLB_CMD_OP_FLUSH_SID); -+} -+ - static int apple_dart_hw_reset(struct apple_dart *dart) - { - u32 config; -@@ -363,6 +472,9 @@ static int apple_dart_hw_reset(struct apple_dart *dart) - /* clear any pending errors before the interrupt is unmasked */ - writel(readl(dart->regs + dart->hw->error), dart->regs + dart->hw->error); - -+ if (dart->hw->type == DART_T8110) -+ writel(0, dart->regs + DART_T8110_ERROR_MASK); -+ - return dart->hw->invalidate_tlb(&stream_map); - } - -@@ -479,7 +591,7 @@ static int apple_dart_finalize_domain(struct iommu_domain *domain, - pgtbl_cfg = (struct io_pgtable_cfg){ - .pgsize_bitmap = dart->pgsize, - .ias = 32, -- .oas = dart->hw->oas, -+ .oas = dart->oas, - .coherent_walk = 1, - .iommu_dev = dart->dev, - }; -@@ -884,6 +996,46 @@ static irqreturn_t apple_dart_t8020_irq(int irq, void *dev) - return IRQ_HANDLED; - } - -+ -+static irqreturn_t apple_dart_t8110_irq(int irq, void *dev) -+{ -+ struct apple_dart *dart = dev; -+ const char *fault_name = NULL; -+ u32 error = readl(dart->regs + DART_T8110_ERROR); -+ u32 error_code = FIELD_GET(DART_T8110_ERROR_CODE, error); -+ u32 addr_lo = readl(dart->regs + DART_T8110_ERROR_ADDR_LO); -+ u32 addr_hi = readl(dart->regs + DART_T8110_ERROR_ADDR_HI); -+ u64 addr = addr_lo | (((u64)addr_hi) << 32); -+ u8 stream_idx = FIELD_GET(DART_T8110_ERROR_STREAM, error); -+ -+ if (!(error & DART_T8110_ERROR_FLAG)) -+ return IRQ_NONE; -+ -+ /* there should only be a single bit set but let's use == to be sure */ -+ if (error_code == DART_T8110_ERROR_READ_FAULT) -+ fault_name = "READ FAULT"; -+ else if (error_code == DART_T8110_ERROR_WRITE_FAULT) -+ fault_name = "WRITE FAULT"; -+ else if (error_code == DART_T8110_ERROR_NO_PTE) -+ fault_name = "NO PTE FOR IOVA"; -+ else if (error_code == DART_T8110_ERROR_NO_PMD) -+ fault_name = "NO PMD FOR IOVA"; -+ else if (error_code == DART_T8110_ERROR_NO_PGD) -+ fault_name = "NO PGD FOR IOVA"; -+ else if (error_code == DART_T8110_ERROR_NO_TTBR) -+ fault_name = "NO TTBR FOR IOVA"; -+ else -+ fault_name = "unknown"; -+ -+ dev_err_ratelimited( -+ dart->dev, -+ "translation fault: status:0x%x stream:%d code:0x%x (%s) at 0x%llx", -+ error, stream_idx, error_code, fault_name, addr); -+ -+ writel(error, dart->regs + DART_T8110_ERROR); -+ return IRQ_HANDLED; -+} -+ - static int apple_dart_set_bus_ops(const struct iommu_ops *ops) - { - int ret; -@@ -908,7 +1060,7 @@ static int apple_dart_set_bus_ops(const struct iommu_ops *ops) - static int apple_dart_probe(struct platform_device *pdev) - { - int ret; -- u32 dart_params[2]; -+ u32 dart_params[4]; - struct resource *res; - struct apple_dart *dart; - struct device *dev = &pdev->dev; -@@ -948,7 +1100,20 @@ static int apple_dart_probe(struct platform_device *pdev) - dart->pgsize = 1 << FIELD_GET(DART_PARAMS1_PAGE_SHIFT, dart_params[0]); - dart->supports_bypass = dart_params[1] & DART_PARAMS2_BYPASS_SUPPORT; - -- dart->num_streams = dart->hw->max_sid_count; -+ switch (dart->hw->type) { -+ case DART_T8020: -+ case DART_T6000: -+ dart->oas = dart->hw->oas; -+ dart->num_streams = dart->hw->max_sid_count; -+ break; -+ -+ case DART_T8110: -+ dart_params[2] = readl(dart->regs + DART_T8110_PARAMS3); -+ dart_params[3] = readl(dart->regs + DART_T8110_PARAMS4); -+ dart->oas = FIELD_GET(DART_T8110_PARAMS3_PA_WIDTH, dart_params[2]); -+ dart->num_streams = FIELD_GET(DART_T8110_PARAMS4_NUM_SIDS, dart_params[3]); -+ break; -+ } - - if (dart->num_streams > DART_MAX_STREAMS) { - dev_err(&pdev->dev, "Too many streams (%d > %d)\n", -@@ -1017,6 +1182,7 @@ static int apple_dart_remove(struct platform_device *pdev) - } - - static const struct apple_dart_hw apple_dart_hw_t8103 = { -+ .type = DART_T8020, - .irq_handler = apple_dart_t8020_irq, - .invalidate_tlb = apple_dart_t8020_hw_invalidate_tlb, - .oas = 36, -@@ -1041,6 +1207,7 @@ static const struct apple_dart_hw apple_dart_hw_t8103 = { - .ttbr_count = 4, - }; - static const struct apple_dart_hw apple_dart_hw_t6000 = { -+ .type = DART_T6000, - .irq_handler = apple_dart_t8020_irq, - .invalidate_tlb = apple_dart_t8020_hw_invalidate_tlb, - .oas = 42, -@@ -1065,6 +1232,32 @@ static const struct apple_dart_hw apple_dart_hw_t6000 = { - .ttbr_count = 4, - }; - -+static const struct apple_dart_hw apple_dart_hw_t8110 = { -+ .type = DART_T8110, -+ .irq_handler = apple_dart_t8110_irq, -+ .invalidate_tlb = apple_dart_t8110_hw_invalidate_tlb, -+ .fmt = APPLE_DART2, -+ .max_sid_count = 256, -+ -+ .enable_streams = DART_T8110_ENABLE_STREAMS, -+ .disable_streams = DART_T8110_DISABLE_STREAMS, -+ .lock = DART_T8110_PROTECT, -+ .lock_bit = DART_T8110_PROTECT_TTBR_TCR, -+ -+ .error = DART_T8110_ERROR, -+ -+ .tcr = DART_T8110_TCR, -+ .tcr_enabled = DART_T8110_TCR_TRANSLATE_ENABLE, -+ .tcr_disabled = 0, -+ .tcr_bypass = DART_T8110_TCR_BYPASS_DAPF | DART_T8110_TCR_BYPASS_DART, -+ -+ .ttbr = DART_T8110_TTBR, -+ .ttbr_valid = DART_T8110_TTBR_VALID, -+ .ttbr_addr_off = DART_T8110_TTBR_ADDR_OFF, -+ .ttbr_shift = DART_T8110_TTBR_SHIFT, -+ .ttbr_count = 1, -+}; -+ - #ifdef CONFIG_PM_SLEEP - static int apple_dart_suspend(struct device *dev) - { -@@ -1110,6 +1303,7 @@ static const struct dev_pm_ops apple_dart_pm_ops = { - #endif - - static const struct of_device_id apple_dart_of_match[] = { -+ { .compatible = "apple,t8110-dart", .data = &apple_dart_hw_t8110 }, - { .compatible = "apple,t8103-dart", .data = &apple_dart_hw_t8103 }, - { .compatible = "apple,t6000-dart", .data = &apple_dart_hw_t6000 }, - {}, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0057-tty-serial-samsung_tty-Support-runtime-PM.patch b/target/linux/silicon/patches-5.19/0057-tty-serial-samsung_tty-Support-runtime-PM.patch deleted file mode 100644 index 4776980f4..000000000 --- a/target/linux/silicon/patches-5.19/0057-tty-serial-samsung_tty-Support-runtime-PM.patch +++ /dev/null @@ -1,197 +0,0 @@ -From e375f9d76a88bc847d44f38157c2dba1c7e02203 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 20 Sep 2021 02:23:11 +0900 -Subject: [PATCH 057/171] tty: serial: samsung_tty: Support runtime PM - -This allows idle UART devices to be suspended using the standard -runtime-PM framework. The logic is modeled after stm32-usart. - -Signed-off-by: Hector Martin ---- - drivers/tty/serial/samsung_tty.c | 92 ++++++++++++++++++++------------ - 1 file changed, 59 insertions(+), 33 deletions(-) - -diff --git a/drivers/tty/serial/samsung_tty.c b/drivers/tty/serial/samsung_tty.c -index 1afe47b62ad5..2a4ba4f3d23c 100644 ---- a/drivers/tty/serial/samsung_tty.c -+++ b/drivers/tty/serial/samsung_tty.c -@@ -40,6 +40,7 @@ - #include - #include - #include -+#include - #include - - /* UART name and device definitions */ -@@ -1354,30 +1355,49 @@ static int apple_s5l_serial_startup(struct uart_port *port) - - /* power power management control */ - -+static int __maybe_unused s3c24xx_serial_runtime_suspend(struct device *dev) -+{ -+ struct uart_port *port = dev_get_drvdata(dev); -+ struct s3c24xx_uart_port *ourport = to_ourport(port); -+ int timeout = 10000; -+ -+ while (--timeout && !s3c24xx_serial_txempty_nofifo(port)) -+ udelay(100); -+ -+ if (!IS_ERR(ourport->baudclk)) -+ clk_disable_unprepare(ourport->baudclk); -+ -+ clk_disable_unprepare(ourport->clk); -+ return 0; -+}; -+ -+static int __maybe_unused s3c24xx_serial_runtime_resume(struct device *dev) -+{ -+ struct uart_port *port = dev_get_drvdata(dev); -+ struct s3c24xx_uart_port *ourport = to_ourport(port); -+ -+ clk_prepare_enable(ourport->clk); -+ -+ if (!IS_ERR(ourport->baudclk)) -+ clk_prepare_enable(ourport->baudclk); -+ return 0; -+}; -+ - static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level, - unsigned int old) - { - struct s3c24xx_uart_port *ourport = to_ourport(port); -- int timeout = 10000; - - ourport->pm_level = level; - - switch (level) { -- case 3: -- while (--timeout && !s3c24xx_serial_txempty_nofifo(port)) -- udelay(100); -- -- if (!IS_ERR(ourport->baudclk)) -- clk_disable_unprepare(ourport->baudclk); -- -- clk_disable_unprepare(ourport->clk); -+ case UART_PM_STATE_OFF: -+ pm_runtime_mark_last_busy(port->dev); -+ pm_runtime_put_sync(port->dev); - break; - -- case 0: -- clk_prepare_enable(ourport->clk); -- -- if (!IS_ERR(ourport->baudclk)) -- clk_prepare_enable(ourport->baudclk); -+ case UART_PM_STATE_ON: -+ pm_runtime_get_sync(port->dev); - break; - default: - dev_err(port->dev, "s3c24xx_serial: unknown pm %d\n", level); -@@ -2248,18 +2268,15 @@ static int s3c24xx_serial_probe(struct platform_device *pdev) - } - } - -+ pm_runtime_get_noresume(&pdev->dev); -+ pm_runtime_set_active(&pdev->dev); -+ pm_runtime_enable(&pdev->dev); -+ - dev_dbg(&pdev->dev, "%s: adding port\n", __func__); - uart_add_one_port(&s3c24xx_uart_drv, &ourport->port); - platform_set_drvdata(pdev, &ourport->port); - -- /* -- * Deactivate the clock enabled in s3c24xx_serial_init_port here, -- * so that a potential re-enablement through the pm-callback overlaps -- * and keeps the clock enabled in this case. -- */ -- clk_disable_unprepare(ourport->clk); -- if (!IS_ERR(ourport->baudclk)) -- clk_disable_unprepare(ourport->baudclk); -+ pm_runtime_put_sync(&pdev->dev); - - ret = s3c24xx_serial_cpufreq_register(ourport); - if (ret < 0) -@@ -2273,10 +2290,21 @@ static int s3c24xx_serial_probe(struct platform_device *pdev) - static int s3c24xx_serial_remove(struct platform_device *dev) - { - struct uart_port *port = s3c24xx_dev_to_port(&dev->dev); -+ struct s3c24xx_uart_port *ourport = to_ourport(port); - - if (port) { -+ pm_runtime_get_sync(&dev->dev); -+ - s3c24xx_serial_cpufreq_deregister(to_ourport(port)); - uart_remove_one_port(&s3c24xx_uart_drv, port); -+ -+ clk_disable_unprepare(ourport->clk); -+ if (!IS_ERR(ourport->baudclk)) -+ clk_disable_unprepare(ourport->baudclk); -+ -+ pm_runtime_disable(&dev->dev); -+ pm_runtime_set_suspended(&dev->dev); -+ pm_runtime_put_noidle(&dev->dev); - } - - uart_unregister_driver(&s3c24xx_uart_drv); -@@ -2285,8 +2313,8 @@ static int s3c24xx_serial_remove(struct platform_device *dev) - } - - /* UART power management code */ --#ifdef CONFIG_PM_SLEEP --static int s3c24xx_serial_suspend(struct device *dev) -+ -+static int __maybe_unused s3c24xx_serial_suspend(struct device *dev) - { - struct uart_port *port = s3c24xx_dev_to_port(dev); - -@@ -2296,7 +2324,7 @@ static int s3c24xx_serial_suspend(struct device *dev) - return 0; - } - --static int s3c24xx_serial_resume(struct device *dev) -+static int __maybe_unused s3c24xx_serial_resume(struct device *dev) - { - struct uart_port *port = s3c24xx_dev_to_port(dev); - struct s3c24xx_uart_port *ourport = to_ourport(port); -@@ -2316,7 +2344,7 @@ static int s3c24xx_serial_resume(struct device *dev) - return 0; - } - --static int s3c24xx_serial_resume_noirq(struct device *dev) -+static int __maybe_unused s3c24xx_serial_resume_noirq(struct device *dev) - { - struct uart_port *port = s3c24xx_dev_to_port(dev); - struct s3c24xx_uart_port *ourport = to_ourport(port); -@@ -2386,16 +2414,14 @@ static int s3c24xx_serial_resume_noirq(struct device *dev) - } - - static const struct dev_pm_ops s3c24xx_serial_pm_ops = { -+#ifdef CONFIG_PM_SLEEP - .suspend = s3c24xx_serial_suspend, - .resume = s3c24xx_serial_resume, - .resume_noirq = s3c24xx_serial_resume_noirq, -+#endif -+ SET_RUNTIME_PM_OPS(s3c24xx_serial_runtime_suspend, -+ s3c24xx_serial_runtime_resume, NULL) - }; --#define SERIAL_SAMSUNG_PM_OPS (&s3c24xx_serial_pm_ops) -- --#else /* !CONFIG_PM_SLEEP */ -- --#define SERIAL_SAMSUNG_PM_OPS NULL --#endif /* CONFIG_PM_SLEEP */ - - /* Console code */ - -@@ -2936,7 +2962,7 @@ static struct platform_driver samsung_serial_driver = { - .id_table = s3c24xx_serial_driver_ids, - .driver = { - .name = "samsung-uart", -- .pm = SERIAL_SAMSUNG_PM_OPS, -+ .pm = &s3c24xx_serial_pm_ops, - .of_match_table = of_match_ptr(s3c24xx_uart_dt_match), - }, - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0058-drm-simpledrm-Add-backlight-support.patch b/target/linux/silicon/patches-5.19/0058-drm-simpledrm-Add-backlight-support.patch deleted file mode 100644 index 16753131a..000000000 --- a/target/linux/silicon/patches-5.19/0058-drm-simpledrm-Add-backlight-support.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 33d1d04ba47ab79e38400038347b1ef04aca10fc Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 4 Mar 2022 19:19:38 +0900 -Subject: [PATCH 058/171] drm/simpledrm: Add backlight support - -Allows devicetrees to link the simplefb node to a backlight device, -and toggles power to the backlight when the display pipe is -enabled/disabled. This is sufficient for basic DPMS style functionality -in trivial devices. - -Signed-off-by: Hector Martin ---- - drivers/gpu/drm/tiny/Kconfig | 1 + - drivers/gpu/drm/tiny/simpledrm.c | 14 ++++++++++++++ - 2 files changed, 15 insertions(+) - -diff --git a/drivers/gpu/drm/tiny/Kconfig b/drivers/gpu/drm/tiny/Kconfig -index 627d637a1e7e..20c78bb1365d 100644 ---- a/drivers/gpu/drm/tiny/Kconfig -+++ b/drivers/gpu/drm/tiny/Kconfig -@@ -71,6 +71,7 @@ config DRM_SIMPLEDRM - depends on DRM && MMU - select DRM_GEM_SHMEM_HELPER - select DRM_KMS_HELPER -+ select BACKLIGHT_CLASS_DEVICE - help - DRM driver for simple platform-provided framebuffers. - -diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c -index 5422363690e7..40de01efbbd9 100644 ---- a/drivers/gpu/drm/tiny/simpledrm.c -+++ b/drivers/gpu/drm/tiny/simpledrm.c -@@ -1,5 +1,6 @@ - // SPDX-License-Identifier: GPL-2.0-only - -+#include - #include - #include - #include -@@ -225,6 +226,9 @@ struct simpledrm_device { - size_t nformats; - struct drm_connector connector; - struct drm_simple_display_pipe pipe; -+ -+ /* backlight */ -+ struct backlight_device *backlight; - }; - - static struct simpledrm_device *simpledrm_device_of_dev(struct drm_device *dev) -@@ -673,6 +677,9 @@ simpledrm_simple_display_pipe_enable(struct drm_simple_display_pipe *pipe, - dst += drm_fb_clip_offset(sdev->pitch, sdev->format, &dst_clip); - drm_fb_blit_toio(dst, sdev->pitch, sdev->format->format, vmap, fb, &src_clip); - -+ if (sdev->backlight) -+ backlight_enable(sdev->backlight); -+ - drm_dev_exit(idx); - } - -@@ -686,6 +693,9 @@ simpledrm_simple_display_pipe_disable(struct drm_simple_display_pipe *pipe) - if (!drm_dev_enter(dev, &idx)) - return; - -+ if (sdev->backlight) -+ backlight_disable(sdev->backlight); -+ - /* Clear screen to black if disabled */ - memset_io(sdev->screen_base, 0, sdev->pitch * sdev->mode.vdisplay); - -@@ -845,6 +855,10 @@ simpledrm_device_create(struct drm_driver *drv, struct platform_device *pdev) - sdev->pdev = pdev; - platform_set_drvdata(pdev, sdev); - -+ sdev->backlight = devm_of_find_backlight(&pdev->dev); -+ if (IS_ERR(sdev->backlight)) -+ sdev->backlight = NULL; -+ - ret = simpledrm_device_init_clocks(sdev); - if (ret) - return ERR_PTR(ret); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0059-of-Demote-Bad-cell-count-to-debug-message.patch b/target/linux/silicon/patches-5.19/0059-of-Demote-Bad-cell-count-to-debug-message.patch deleted file mode 100644 index 66c11e272..000000000 --- a/target/linux/silicon/patches-5.19/0059-of-Demote-Bad-cell-count-to-debug-message.patch +++ /dev/null @@ -1,29 +0,0 @@ -From a9d5ced1ff2a58014dc850ece702cc194884870d Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sat, 12 Mar 2022 00:07:09 +0900 -Subject: [PATCH 059/171] of: Demote "Bad cell count" to debug message - -This happens on the SPMI bus... TODO: figure out what the right solution -is here. - -Signed-off-by: Hector Martin ---- - drivers/of/address.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/of/address.c b/drivers/of/address.c -index 94f017d808c4..68f54ec92496 100644 ---- a/drivers/of/address.c -+++ b/drivers/of/address.c -@@ -538,7 +538,7 @@ static u64 __of_translate_address(struct device_node *dev, - pbus = of_match_bus(parent); - pbus->count_cells(dev, &pna, &pns); - if (!OF_CHECK_COUNTS(pna, pns)) { -- pr_err("Bad cell count for %pOF\n", dev); -+ pr_debug("Bad cell count for %pOF\n", dev); - break; - } - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0060-mmc-sdhci-pci-Support-external-CD-GPIO-on-all-OF-sys.patch b/target/linux/silicon/patches-5.19/0060-mmc-sdhci-pci-Support-external-CD-GPIO-on-all-OF-sys.patch deleted file mode 100644 index a9889b2b2..000000000 --- a/target/linux/silicon/patches-5.19/0060-mmc-sdhci-pci-Support-external-CD-GPIO-on-all-OF-sys.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 2c80db171f88a2c7384cfefbd20ba4b2ed570e5c Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 5 May 2022 01:40:31 +0900 -Subject: [PATCH 060/171] mmc: sdhci-pci: Support external CD GPIO on all OF - systems - -Allow OF systems to specify an external CD GPIO on all devices, -even if they have an internal CD feature. - -Signed-off-by: Hector Martin ---- - drivers/mmc/host/sdhci-pci-core.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c -index ed53276f6ad9..a711b4be3867 100644 ---- a/drivers/mmc/host/sdhci-pci-core.c -+++ b/drivers/mmc/host/sdhci-pci-core.c -@@ -2096,6 +2096,15 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot( - dev_warn(&pdev->dev, "failed to setup card detect gpio\n"); - slot->cd_idx = -1; - } -+ } else if (is_of_node(pdev->dev.fwnode)) { -+ /* Allow all OF systems to use a CD GPIO if provided */ -+ -+ ret = mmc_gpiod_request_cd(host->mmc, "cd", 0, -+ slot->cd_override_level, 0); -+ if (ret == -EPROBE_DEFER) -+ goto remove; -+ else if (ret == 0) -+ slot->cd_idx = 0; - } - - if (chip->fixes && chip->fixes->add_host) --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0061-mmc-sdhci-pci-Support-setting-CD-debounce-delay.patch b/target/linux/silicon/patches-5.19/0061-mmc-sdhci-pci-Support-setting-CD-debounce-delay.patch deleted file mode 100644 index 27773b9ce..000000000 --- a/target/linux/silicon/patches-5.19/0061-mmc-sdhci-pci-Support-setting-CD-debounce-delay.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 5f9f115872ee614c22a9417f68ae9100ec32b5c7 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 5 May 2022 02:27:35 +0900 -Subject: [PATCH 061/171] mmc: sdhci-pci: Support setting CD debounce delay - -Some systems (e.g. 2021 MacBook Pro 14/16") have noncompliant connectors -where CD activates before the card is fully inserted. We need debounce -delay support on these to avoid detection failures when the card isn't -inserted very quickly. - -Set the default to 200ms for all systems instead of 0. This is the -default on non-PCI platforms, and will probably help other systems too. -The naughty MacBooks will need closer to 750ms in the device tree to -be reliable... - -Signed-off-by: Hector Martin ---- - drivers/mmc/host/sdhci-pci-core.c | 10 ++++++++-- - 1 file changed, 8 insertions(+), 2 deletions(-) - -diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c -index a711b4be3867..2fd4221b24aa 100644 ---- a/drivers/mmc/host/sdhci-pci-core.c -+++ b/drivers/mmc/host/sdhci-pci-core.c -@@ -2015,6 +2015,7 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot( - struct sdhci_host *host; - int ret, bar = first_bar + slotno; - size_t priv_size = chip->fixes ? chip->fixes->priv_size : 0; -+ u32 cd_debounce_delay_ms; - - if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM)) { - dev_err(&pdev->dev, "BAR %d is not iomem. Aborting.\n", bar); -@@ -2081,6 +2082,10 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot( - if (host->mmc->caps & MMC_CAP_CD_WAKE) - device_init_wakeup(&pdev->dev, true); - -+ if (device_property_read_u32(&pdev->dev, "cd-debounce-delay-ms", -+ &cd_debounce_delay_ms)) -+ cd_debounce_delay_ms = 200; -+ - if (slot->cd_idx >= 0) { - ret = mmc_gpiod_request_cd(host->mmc, "cd", slot->cd_idx, - slot->cd_override_level, 0); -@@ -2088,7 +2093,7 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot( - ret = mmc_gpiod_request_cd(host->mmc, NULL, - slot->cd_idx, - slot->cd_override_level, -- 0); -+ cd_debounce_delay_ms * 1000); - if (ret == -EPROBE_DEFER) - goto remove; - -@@ -2100,7 +2105,8 @@ static struct sdhci_pci_slot *sdhci_pci_probe_slot( - /* Allow all OF systems to use a CD GPIO if provided */ - - ret = mmc_gpiod_request_cd(host->mmc, "cd", 0, -- slot->cd_override_level, 0); -+ slot->cd_override_level, -+ cd_debounce_delay_ms * 1000); - if (ret == -EPROBE_DEFER) - goto remove; - else if (ret == 0) --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0062-net-usb-ax88179_178a-Bind-only-to-vendor-specific-in.patch b/target/linux/silicon/patches-5.19/0062-net-usb-ax88179_178a-Bind-only-to-vendor-specific-in.patch deleted file mode 100644 index f59622e2a..000000000 --- a/target/linux/silicon/patches-5.19/0062-net-usb-ax88179_178a-Bind-only-to-vendor-specific-in.patch +++ /dev/null @@ -1,106 +0,0 @@ -From f60e434c0766aaf5db2d775bbcba49d896e1f518 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 2 May 2022 19:46:47 +0900 -Subject: [PATCH 062/171] net: usb: ax88179_178a: Bind only to vendor-specific - interface - -The Anker PowerExpand USB-C to Gigabit Ethernet adapter uses this -chipset, but exposes CDC Ethernet configurations as well as the -vendor specific one. This driver ends up binding first to both CDC -interfaces, tries to instantiate two Ethernet interfaces talking to -the same device, and the result is a nice fireworks show. - -Change all the ID matches to specifically match the vendor-specific -interface. By default the device comes up in CDC mode and is bound by -that driver (which works fine); users may switch it to the vendor -interface using sysfs to set bConfigurationValue, at which point the -device actually goes through a reconnect cycle and comes back as a -vendor specific only device, and then this driver binds and works too. - -The affected device uses VID/PID 0b95:1790, but we might as well change -all of them for good measure, since there is no good reason for this -driver to bind to standard CDC Ethernet interfaces. - -v3: Added VID/PID info to commit message - -Signed-off-by: Hector Martin ---- - drivers/net/usb/ax88179_178a.c | 26 +++++++++++++------------- - 1 file changed, 13 insertions(+), 13 deletions(-) - -diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c -index ac2d400d1d6c..aeb0294385ed 100644 ---- a/drivers/net/usb/ax88179_178a.c -+++ b/drivers/net/usb/ax88179_178a.c -@@ -1965,55 +1965,55 @@ static const struct driver_info at_umc2000sp_info = { - static const struct usb_device_id products[] = { - { - /* ASIX AX88179 10/100/1000 */ -- USB_DEVICE(0x0b95, 0x1790), -+ USB_DEVICE_AND_INTERFACE_INFO(0x0b95, 0x1790, 0xff, 0xff, 0), - .driver_info = (unsigned long)&ax88179_info, - }, { - /* ASIX AX88178A 10/100/1000 */ -- USB_DEVICE(0x0b95, 0x178a), -+ USB_DEVICE_AND_INTERFACE_INFO(0x0b95, 0x178a, 0xff, 0xff, 0), - .driver_info = (unsigned long)&ax88178a_info, - }, { - /* Cypress GX3 SuperSpeed to Gigabit Ethernet Bridge Controller */ -- USB_DEVICE(0x04b4, 0x3610), -+ USB_DEVICE_AND_INTERFACE_INFO(0x04b4, 0x3610, 0xff, 0xff, 0), - .driver_info = (unsigned long)&cypress_GX3_info, - }, { - /* D-Link DUB-1312 USB 3.0 to Gigabit Ethernet Adapter */ -- USB_DEVICE(0x2001, 0x4a00), -+ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x4a00, 0xff, 0xff, 0), - .driver_info = (unsigned long)&dlink_dub1312_info, - }, { - /* Sitecom USB 3.0 to Gigabit Adapter */ -- USB_DEVICE(0x0df6, 0x0072), -+ USB_DEVICE_AND_INTERFACE_INFO(0x0df6, 0x0072, 0xff, 0xff, 0), - .driver_info = (unsigned long)&sitecom_info, - }, { - /* Samsung USB Ethernet Adapter */ -- USB_DEVICE(0x04e8, 0xa100), -+ USB_DEVICE_AND_INTERFACE_INFO(0x04e8, 0xa100, 0xff, 0xff, 0), - .driver_info = (unsigned long)&samsung_info, - }, { - /* Lenovo OneLinkDock Gigabit LAN */ -- USB_DEVICE(0x17ef, 0x304b), -+ USB_DEVICE_AND_INTERFACE_INFO(0x17ef, 0x304b, 0xff, 0xff, 0), - .driver_info = (unsigned long)&lenovo_info, - }, { - /* Belkin B2B128 USB 3.0 Hub + Gigabit Ethernet Adapter */ -- USB_DEVICE(0x050d, 0x0128), -+ USB_DEVICE_AND_INTERFACE_INFO(0x050d, 0x0128, 0xff, 0xff, 0), - .driver_info = (unsigned long)&belkin_info, - }, { - /* Toshiba USB 3.0 GBit Ethernet Adapter */ -- USB_DEVICE(0x0930, 0x0a13), -+ USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x0a13, 0xff, 0xff, 0), - .driver_info = (unsigned long)&toshiba_info, - }, { - /* Magic Control Technology U3-A9003 USB 3.0 Gigabit Ethernet Adapter */ -- USB_DEVICE(0x0711, 0x0179), -+ USB_DEVICE_AND_INTERFACE_INFO(0x0711, 0x0179, 0xff, 0xff, 0), - .driver_info = (unsigned long)&mct_info, - }, { - /* Allied Telesis AT-UMC2000 USB 3.0/USB 3.1 Gen 1 to Gigabit Ethernet Adapter */ -- USB_DEVICE(0x07c9, 0x000e), -+ USB_DEVICE_AND_INTERFACE_INFO(0x07c9, 0x000e, 0xff, 0xff, 0), - .driver_info = (unsigned long)&at_umc2000_info, - }, { - /* Allied Telesis AT-UMC200 USB 3.0/USB 3.1 Gen 1 to Fast Ethernet Adapter */ -- USB_DEVICE(0x07c9, 0x000f), -+ USB_DEVICE_AND_INTERFACE_INFO(0x07c9, 0x000f, 0xff, 0xff, 0), - .driver_info = (unsigned long)&at_umc200_info, - }, { - /* Allied Telesis AT-UMC2000/SP USB 3.0/USB 3.1 Gen 1 to Gigabit Ethernet Adapter */ -- USB_DEVICE(0x07c9, 0x0010), -+ USB_DEVICE_AND_INTERFACE_INFO(0x07c9, 0x0010, 0xff, 0xff, 0), - .driver_info = (unsigned long)&at_umc2000sp_info, - }, - { }, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0063-dt-bindings-usb-Add-Apple-dwc3-bindings.patch b/target/linux/silicon/patches-5.19/0063-dt-bindings-usb-Add-Apple-dwc3-bindings.patch deleted file mode 100644 index a27985157..000000000 --- a/target/linux/silicon/patches-5.19/0063-dt-bindings-usb-Add-Apple-dwc3-bindings.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 834ab8867f3537c2a1c40853309aeb63401f7b34 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Sun, 7 Nov 2021 11:21:19 +0100 -Subject: [PATCH 063/171] dt-bindings: usb: Add Apple dwc3 bindings - -Apple Silicon SoCs such as the M1 have multiple USB controllers based on -the Synopsys DesignWare USB3 controller. -References to the ATC PHY required for SuperSpeed are left out for now -until support has been upstreamed as well. - -Signed-off-by: Sven Peter ---- - .../devicetree/bindings/usb/apple,dwc3.yaml | 64 +++++++++++++++++++ - 1 file changed, 64 insertions(+) - create mode 100644 Documentation/devicetree/bindings/usb/apple,dwc3.yaml - -diff --git a/Documentation/devicetree/bindings/usb/apple,dwc3.yaml b/Documentation/devicetree/bindings/usb/apple,dwc3.yaml -new file mode 100644 -index 000000000000..fb3b3489e6b2 ---- /dev/null -+++ b/Documentation/devicetree/bindings/usb/apple,dwc3.yaml -@@ -0,0 +1,64 @@ -+# SPDX-License-Identifier: GPL-2.0 -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/usb/apple,dwc3.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Apple Silicon DWC3 USB controller -+ -+maintainers: -+ - Sven Peter -+ -+description: -+ On Apple Silicon SoCs such as the M1 each Type-C port has a corresponding -+ USB controller based on the Synopsys DesignWare USB3 controller. -+ -+ The common content of this binding is defined in snps,dwc3.yaml. -+ -+allOf: -+ - $ref: snps,dwc3.yaml# -+ -+select: -+ properties: -+ compatible: -+ contains: -+ const: apple,dwc3 -+ required: -+ - compatible -+ -+properties: -+ compatible: -+ items: -+ - enum: -+ - apple,t8103-dwc3 -+ - apple,t6000-dwc3 -+ - const: apple,dwc3 -+ - const: snps,dwc3 -+ -+ reg: -+ maxItems: 1 -+ -+ interrupts: -+ maxItems: 1 -+ -+unevaluatedProperties: false -+ -+required: -+ - compatible -+ - reg -+ - interrupts -+ -+examples: -+ - | -+ #include -+ #include -+ -+ usb@82280000 { -+ compatible = "apple,t8103-dwc3", "apple,dwc3", "snps,dwc3"; -+ reg = <0x82280000 0x10000>; -+ interrupts = ; -+ -+ dr_mode = "otg"; -+ usb-role-switch; -+ role-switch-default-mode = "host"; -+ }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0064-usb-dwc3-Add-role-switch-reset-quirk-for-Apple-DWC3.patch b/target/linux/silicon/patches-5.19/0064-usb-dwc3-Add-role-switch-reset-quirk-for-Apple-DWC3.patch deleted file mode 100644 index 63aad9454..000000000 --- a/target/linux/silicon/patches-5.19/0064-usb-dwc3-Add-role-switch-reset-quirk-for-Apple-DWC3.patch +++ /dev/null @@ -1,172 +0,0 @@ -From bda2c5ab3f028f25bf7d0e8196ee1dee38973153 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Sun, 7 Nov 2021 11:21:20 +0100 -Subject: [PATCH 064/171] usb: dwc3: Add role switch reset quirk for Apple DWC3 - -As mad as it sounds, the dwc3 controller present on the Apple M1 must be -reset and reinitialized whenever a device is unplugged from the root port. -The only reliable unplug/plug notification available comes from the USB -PD controller through the role-switch infrastructure. - -This is required for at least two reasons: - - - The USB2 D+/D- lines are connected through a stateful eUSB2 repeater - which in turn is controlled by a variant of the TI TPS6598x USB PD - chip. When the USB PD controller detects a hotplug event it resets - the eUSB2 repeater. Afterwards, no new device is recognized before - the DWC3 core and PHY are reset as well. - - - It's possible to completely break the dwc3 controller by switching - it to device mode and unplugging the cable at just the wrong time. - Even a CORESOFTRESET is not enough to allow new devices again. - The only workaround is to trigger a hard reset of the entire - dwc3 core. - -Signed-off-by: Sven Peter ---- - drivers/usb/dwc3/core.c | 41 ++++++++++++++++++++++++++++++++++++++--- - drivers/usb/dwc3/core.h | 6 ++++++ - drivers/usb/dwc3/drd.c | 7 +++++++ - 3 files changed, 51 insertions(+), 3 deletions(-) - -diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c -index 573421984948..b4c58deccabb 100644 ---- a/drivers/usb/dwc3/core.c -+++ b/drivers/usb/dwc3/core.c -@@ -116,6 +116,9 @@ void dwc3_set_prtcap(struct dwc3 *dwc, u32 mode) - dwc->current_dr_role = mode; - } - -+static void dwc3_core_exit(struct dwc3 *dwc); -+static int dwc3_core_init_for_resume(struct dwc3 *dwc); -+ - static void __dwc3_set_mode(struct work_struct *work) - { - struct dwc3 *dwc = work_to_dwc(work); -@@ -130,10 +133,11 @@ static void __dwc3_set_mode(struct work_struct *work) - if (dwc->current_dr_role == DWC3_GCTL_PRTCAP_OTG) - dwc3_otg_update(dwc, 0); - -- if (!dwc->desired_dr_role) -+ if (!dwc->desired_dr_role && !dwc->role_switch_reset_quirk) - goto out; - -- if (dwc->desired_dr_role == dwc->current_dr_role) -+ if (dwc->desired_dr_role == dwc->current_dr_role && -+ !dwc->role_switch_reset_quirk) - goto out; - - if (dwc->desired_dr_role == DWC3_GCTL_PRTCAP_OTG && dwc->edev) -@@ -158,6 +162,34 @@ static void __dwc3_set_mode(struct work_struct *work) - break; - } - -+ if (dwc->role_switch_reset_quirk) { -+ if (dwc->current_dr_role) { -+ dwc->current_dr_role = 0; -+ dwc3_core_exit(dwc); -+ } -+ -+ if (dwc->desired_dr_role) { -+ /* -+ * the first call to __dwc3_set_mode comes from -+ * dwc3_drd_init. In that case dwc3_core_init has been -+ * called but dwc->current_dr_role is zero such that -+ * we must not reinitialize the core again here. -+ */ -+ if (dwc->role_switch_reset_quirk_initialized) { -+ ret = dwc3_core_init_for_resume(dwc); -+ if (ret) { -+ dev_err(dwc->dev, -+ "failed to reinitialize core\n"); -+ goto out; -+ } -+ } -+ -+ dwc->role_switch_reset_quirk_initialized = 1; -+ } else { -+ goto out; -+ } -+ } -+ - /* For DRD host or device mode only */ - if (dwc->desired_dr_role != DWC3_GCTL_PRTCAP_OTG) { - reg = dwc3_readl(dwc->regs, DWC3_GCTL); -@@ -1764,6 +1796,9 @@ static int dwc3_probe(struct platform_device *pdev) - return dev_err_probe(dev, PTR_ERR(dwc->susp_clk), - "could not get suspend clock\n"); - } -+ -+ if (of_device_is_compatible(dev->of_node, "apple,dwc3")) -+ dwc->role_switch_reset_quirk = true; - } - - ret = reset_control_deassert(dwc->reset); -@@ -1900,7 +1935,6 @@ static int dwc3_remove(struct platform_device *pdev) - return 0; - } - --#ifdef CONFIG_PM - static int dwc3_core_init_for_resume(struct dwc3 *dwc) - { - int ret; -@@ -1927,6 +1961,7 @@ static int dwc3_core_init_for_resume(struct dwc3 *dwc) - return ret; - } - -+#ifdef CONFIG_PM - static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg) - { - unsigned long flags; -diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h -index 81c486b3941c..ee0225ce2234 100644 ---- a/drivers/usb/dwc3/core.h -+++ b/drivers/usb/dwc3/core.h -@@ -1103,6 +1103,9 @@ struct dwc3_scratchpad_array { - * 3 - Reserved - * @dis_metastability_quirk: set to disable metastability quirk. - * @dis_split_quirk: set to disable split boundary. -+ * @role_switch_reset_quirk: set to force reinitialization after any role switch -+ * @role_switch_reset_quirk_initialized: set to true after the first role switch -+ * which is triggered from dwc3_drd_init directly - * @imod_interval: set the interrupt moderation interval in 250ns - * increments or 0 to disable. - * @max_cfg_eps: current max number of IN eps used across all USB configs. -@@ -1318,6 +1321,9 @@ struct dwc3 { - unsigned dis_split_quirk:1; - unsigned async_callbacks:1; - -+ unsigned role_switch_reset_quirk:1; -+ unsigned role_switch_reset_quirk_initialized:1; -+ - u16 imod_interval; - - int max_cfg_eps; -diff --git a/drivers/usb/dwc3/drd.c b/drivers/usb/dwc3/drd.c -index 039bf241769a..4579505cac1f 100644 ---- a/drivers/usb/dwc3/drd.c -+++ b/drivers/usb/dwc3/drd.c -@@ -461,6 +461,9 @@ static int dwc3_usb_role_switch_set(struct usb_role_switch *sw, - break; - } - -+ if (dwc->role_switch_reset_quirk && role == USB_ROLE_NONE) -+ mode = 0; -+ - dwc3_set_mode(dwc, mode); - return 0; - } -@@ -489,6 +492,10 @@ static enum usb_role dwc3_usb_role_switch_get(struct usb_role_switch *sw) - role = USB_ROLE_DEVICE; - break; - } -+ -+ if (dwc->role_switch_reset_quirk && !dwc->current_dr_role) -+ role = USB_ROLE_NONE; -+ - spin_unlock_irqrestore(&dwc->lock, flags); - return role; - } --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0065-apple-nvme-defer-cache-flushes-by-a-specified-amount.patch b/target/linux/silicon/patches-5.19/0065-apple-nvme-defer-cache-flushes-by-a-specified-amount.patch deleted file mode 100644 index 1290c64e4..000000000 --- a/target/linux/silicon/patches-5.19/0065-apple-nvme-defer-cache-flushes-by-a-specified-amount.patch +++ /dev/null @@ -1,141 +0,0 @@ -From 6c8c3ae8ce7813a315f4729865f99d0d318f678a Mon Sep 17 00:00:00 2001 -From: Jens Axboe -Date: Wed, 16 Feb 2022 12:17:58 -0700 -Subject: [PATCH 065/171] apple-nvme: defer cache flushes by a specified amount - -Cache flushes on the M1 nvme are really slow, taking 17-18 msec to -complete. This can slow down workloads considerably, pure random writes -end up being bound by the flush latency and hence run at 55-60 IOPS. - -Add a deferred flush work around to provide better performance, at a -minimal risk. By default, flushes are delayed at most 1 second, but this -is configurable. - -With this work-around, a pure random write workload runs at ~12K IOPS -rather than 56 IOPS. - -Signed-off-by: Jens Axboe ---- - drivers/nvme/host/apple.c | 69 +++++++++++++++++++++++++++++++++++++++ - 1 file changed, 69 insertions(+) - -diff --git a/drivers/nvme/host/apple.c b/drivers/nvme/host/apple.c -index d702d7d60235..46294f99a1b0 100644 ---- a/drivers/nvme/host/apple.c -+++ b/drivers/nvme/host/apple.c -@@ -195,8 +195,20 @@ struct apple_nvme { - - int irq; - spinlock_t lock; -+ -+ /* -+ * Delayed cache flush handling state -+ */ -+ struct nvme_ns *flush_ns; -+ unsigned long flush_interval; -+ unsigned long last_flush; -+ struct delayed_work flush_dwork; - }; - -+unsigned int flush_interval = 1000; -+module_param(flush_interval, uint, 0644); -+MODULE_PARM_DESC(flush_interval, "Grace period in msecs between flushes"); -+ - static_assert(sizeof(struct nvme_command) == 64); - static_assert(sizeof(struct apple_nvmmu_tcb) == 128); - -@@ -729,6 +741,26 @@ static int apple_nvme_remove_sq(struct apple_nvme *anv) - return nvme_submit_sync_cmd(anv->ctrl.admin_q, &c, NULL, 0); - } - -+static bool apple_nvme_delayed_flush(struct apple_nvme *anv, struct nvme_ns *ns, -+ struct request *req) -+{ -+ if (!anv->flush_interval || req_op(req) != REQ_OP_FLUSH) -+ return false; -+ if (delayed_work_pending(&anv->flush_dwork)) -+ return true; -+ if (time_before(jiffies, anv->last_flush + anv->flush_interval)) { -+ kblockd_mod_delayed_work_on(WORK_CPU_UNBOUND, &anv->flush_dwork, -+ anv->flush_interval); -+ if (WARN_ON_ONCE(anv->flush_ns && anv->flush_ns != ns)) -+ goto out; -+ anv->flush_ns = ns; -+ return true; -+ } -+out: -+ anv->last_flush = jiffies; -+ return false; -+} -+ - static blk_status_t apple_nvme_queue_rq(struct blk_mq_hw_ctx *hctx, - const struct blk_mq_queue_data *bd) - { -@@ -764,6 +796,12 @@ static blk_status_t apple_nvme_queue_rq(struct blk_mq_hw_ctx *hctx, - } - - blk_mq_start_request(req); -+ -+ if (apple_nvme_delayed_flush(anv, ns, req)) { -+ blk_mq_complete_request(req); -+ return BLK_STS_OK; -+ } -+ - apple_nvme_submit_cmd(q, cmnd); - return BLK_STS_OK; - -@@ -1366,6 +1404,28 @@ static int apple_nvme_attach_genpd(struct apple_nvme *anv) - return 0; - } - -+static void apple_nvme_flush_work(struct work_struct *work) -+{ -+ struct nvme_command c = { }; -+ struct apple_nvme *anv; -+ struct nvme_ns *ns; -+ int err; -+ -+ anv = container_of(work, struct apple_nvme, flush_dwork.work); -+ ns = anv->flush_ns; -+ if (WARN_ON_ONCE(!ns)) -+ return; -+ -+ c.common.opcode = nvme_cmd_flush; -+ c.common.nsid = cpu_to_le32(anv->flush_ns->head->ns_id); -+ err = nvme_submit_sync_cmd(ns->queue, &c, NULL, 0); -+ if (err) { -+ dev_err(anv->dev, "Deferred flush failed: %d\n", err); -+ } else { -+ anv->last_flush = jiffies; -+ } -+} -+ - static int apple_nvme_probe(struct platform_device *pdev) - { - struct device *dev = &pdev->dev; -@@ -1508,6 +1568,14 @@ static int apple_nvme_probe(struct platform_device *pdev) - goto put_dev; - } - -+ if (flush_interval) { -+ anv->flush_interval = msecs_to_jiffies(flush_interval); -+ anv->flush_ns = NULL; -+ anv->last_flush = jiffies - anv->flush_interval; -+ } -+ -+ INIT_DELAYED_WORK(&anv->flush_dwork, apple_nvme_flush_work); -+ - nvme_reset_ctrl(&anv->ctrl); - async_schedule(apple_nvme_async_probe, anv); - -@@ -1541,6 +1609,7 @@ static void apple_nvme_shutdown(struct platform_device *pdev) - { - struct apple_nvme *anv = platform_get_drvdata(pdev); - -+ flush_delayed_work(&anv->flush_dwork); - apple_nvme_disable(anv, true); - if (apple_rtkit_is_running(anv->rtk)) - apple_rtkit_shutdown(anv->rtk); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0066-apple-nvme-Release-power-domains-when-probe-fails.patch b/target/linux/silicon/patches-5.19/0066-apple-nvme-Release-power-domains-when-probe-fails.patch deleted file mode 100644 index a3a561655..000000000 --- a/target/linux/silicon/patches-5.19/0066-apple-nvme-Release-power-domains-when-probe-fails.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 17290bf07058d3b52c3a750be73831827af3f98d Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 27 Jun 2022 21:47:43 +0900 -Subject: [PATCH 066/171] apple-nvme: Release power domains when probe fails - -Signed-off-by: Hector Martin ---- - drivers/nvme/host/apple.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/nvme/host/apple.c b/drivers/nvme/host/apple.c -index 46294f99a1b0..67cef4dda24c 100644 ---- a/drivers/nvme/host/apple.c -+++ b/drivers/nvme/host/apple.c -@@ -1582,6 +1582,7 @@ static int apple_nvme_probe(struct platform_device *pdev) - return 0; - - put_dev: -+ apple_nvme_detach_genpd(anv); - put_device(anv->dev); - return ret; - } --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0067-MAINTAINERS-Add-apple-spi-driver-binding-files.patch b/target/linux/silicon/patches-5.19/0067-MAINTAINERS-Add-apple-spi-driver-binding-files.patch deleted file mode 100644 index 6e9fd40f6..000000000 --- a/target/linux/silicon/patches-5.19/0067-MAINTAINERS-Add-apple-spi-driver-binding-files.patch +++ /dev/null @@ -1,39 +0,0 @@ -From ef2e86f869f55da922fcb8235cd32ea78fe3e2b7 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 12 Dec 2021 12:28:41 +0900 -Subject: [PATCH 067/171] MAINTAINERS: Add apple-spi driver & binding files - -This Apple SPI controller is present on Apple ARM SoCs (t8103/t6000). - -Splitting this change from the binding/driver commits to avoid merge -conflicts with other things touching this section, as usual. - -Signed-off-by: Hector Martin ---- - MAINTAINERS | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/MAINTAINERS b/MAINTAINERS -index 64379c699903..629c1a177d3f 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1843,6 +1843,8 @@ F: Documentation/devicetree/bindings/nvmem/apple,efuses.yaml - F: Documentation/devicetree/bindings/pci/apple,pcie.yaml - F: Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml - F: Documentation/devicetree/bindings/power/apple* -+F: Documentation/devicetree/bindings/spi/apple,spi.yaml -+F: Documentation/devicetree/bindings/usb/apple,dwc3.yaml - F: Documentation/devicetree/bindings/watchdog/apple,wdt.yaml - F: arch/arm64/boot/dts/apple/ - F: drivers/clk/clk-apple-nco.c -@@ -1855,6 +1857,7 @@ F: drivers/nvme/host/apple.c - F: drivers/nvmem/apple-efuses.c - F: drivers/pinctrl/pinctrl-apple-gpio.c - F: drivers/soc/apple/* -+F: drivers/spi/spi-apple.c - F: drivers/watchdog/apple_wdt.c - F: include/dt-bindings/interrupt-controller/apple-aic.h - F: include/dt-bindings/pinctrl/apple.h --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0068-dt-bindings-spi-apple-spi-Add-binding-for-Apple-SPI-.patch b/target/linux/silicon/patches-5.19/0068-dt-bindings-spi-apple-spi-Add-binding-for-Apple-SPI-.patch deleted file mode 100644 index cfb6fa3cc..000000000 --- a/target/linux/silicon/patches-5.19/0068-dt-bindings-spi-apple-spi-Add-binding-for-Apple-SPI-.patch +++ /dev/null @@ -1,88 +0,0 @@ -From c26ea602ff1a0f7d01421320ed5bea2f611f73cd Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 12 Dec 2021 11:46:33 +0900 -Subject: [PATCH 068/171] dt-bindings: spi: apple,spi: Add binding for Apple - SPI controllers - -The Apple SPI controller is present in SoCs such as the M1 (t8103) and -M1 Pro/Max (t600x). This controller uses one IRQ and one clock, and -doesn't need any special properties, so the binding is trivial. - -Signed-off-by: Hector Martin ---- - .../devicetree/bindings/spi/apple,spi.yaml | 63 +++++++++++++++++++ - 1 file changed, 63 insertions(+) - create mode 100644 Documentation/devicetree/bindings/spi/apple,spi.yaml - -diff --git a/Documentation/devicetree/bindings/spi/apple,spi.yaml b/Documentation/devicetree/bindings/spi/apple,spi.yaml -new file mode 100644 -index 000000000000..bcbdc8943e92 ---- /dev/null -+++ b/Documentation/devicetree/bindings/spi/apple,spi.yaml -@@ -0,0 +1,63 @@ -+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/spi/apple,spi.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Apple ARM SoC SPI controller -+ -+allOf: -+ - $ref: "spi-controller.yaml#" -+ -+maintainers: -+ - Hector Martin -+ -+properties: -+ compatible: -+ items: -+ - enum: -+ - apple,t8103-spi -+ - apple,t6000-spi -+ - const: apple,spi -+ -+ reg: -+ maxItems: 1 -+ -+ clocks: -+ maxItems: 1 -+ -+ interrupts: -+ maxItems: 1 -+ -+ power-domains: -+ maxItems: 1 -+ -+required: -+ - compatible -+ - reg -+ - clocks -+ - interrupts -+ - '#address-cells' -+ - '#size-cells' -+ -+unevaluatedProperties: false -+ -+examples: -+ - | -+ #include -+ #include -+ -+ soc { -+ #address-cells = <2>; -+ #size-cells = <2>; -+ -+ spi: spi@39b104000 { -+ compatible = "apple,t6000-spi", "apple,spi"; -+ reg = <0x3 0x9b104000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #address-cells = <1>; -+ #size-cells = <0>; -+ clocks = <&clk>; -+ }; -+ }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0069-spi-apple-Add-driver-for-Apple-SPI-controller.patch b/target/linux/silicon/patches-5.19/0069-spi-apple-Add-driver-for-Apple-SPI-controller.patch deleted file mode 100644 index e83565fbc..000000000 --- a/target/linux/silicon/patches-5.19/0069-spi-apple-Add-driver-for-Apple-SPI-controller.patch +++ /dev/null @@ -1,618 +0,0 @@ -From 90521a1e8c3ebf5c2ee27d2e3f62bb81cf28e23f Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 9 Dec 2021 21:55:49 +0900 -Subject: [PATCH 069/171] spi: apple: Add driver for Apple SPI controller - -This SPI controller is present in Apple SoCs such as the M1 (t8103) and -M1 Pro/Max (t600x). It is a relatively straightforward design with two -16-entry FIFOs, arbitrary transfer sizes (up to 2**32 - 1) and fully -configurable word size up to 32 bits. It supports one hardware CS line -which can also be driven via the pinctrl/GPIO driver instead, if -desired. TX and RX can be independently enabled. - -There are a surprising number of knobs for tweaking details of the -transfer, most of which we do not use right now. Hardware CS control -is available, but we haven't found a way to make it stay low across -multiple logical transfers, so we just use software CS control for now. - -There is also a shared DMA offload coprocessor that can be used to handle -larger transfers without requiring an IRQ every 8-16 words, but that -feature depends on a bunch of scaffolding that isn't ready to be -upstreamed yet, so leave it for later. - -The hardware shares some register bit definitions with spi-s3c24xx which -suggests it has a shared legacy with Samsung SoCs, but it is too -different to warrant sharing a driver. - -Signed-off-by: Hector Martin ---- - drivers/spi/Kconfig | 8 + - drivers/spi/Makefile | 1 + - drivers/spi/spi-apple.c | 544 ++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 553 insertions(+) - create mode 100644 drivers/spi/spi-apple.c - -diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig -index 3b1044ebc400..863e215a5127 100644 ---- a/drivers/spi/Kconfig -+++ b/drivers/spi/Kconfig -@@ -79,6 +79,14 @@ config SPI_ALTERA_DFL - Altera SPI master controller. The SPI master is connected - to a SPI slave to Avalon bridge in a Intel MAX BMC. - -+config SPI_APPLE -+ tristate "Apple SoC SPI Controller platform driver" -+ depends on ARCH_APPLE || COMPILE_TEST -+ help -+ This enables support for the SPI controller present on -+ many Apple SoCs, including the t8103 (M1) and t600x -+ (M1 Pro/Max). -+ - config SPI_AR934X - tristate "Qualcomm Atheros AR934X/QCA95XX SPI controller driver" - depends on ATH79 || COMPILE_TEST -diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile -index 0f44eb6083a5..f86ba8634f77 100644 ---- a/drivers/spi/Makefile -+++ b/drivers/spi/Makefile -@@ -17,6 +17,7 @@ obj-$(CONFIG_SPI_LOOPBACK_TEST) += spi-loopback-test.o - obj-$(CONFIG_SPI_ALTERA) += spi-altera-platform.o - obj-$(CONFIG_SPI_ALTERA_CORE) += spi-altera-core.o - obj-$(CONFIG_SPI_ALTERA_DFL) += spi-altera-dfl.o -+obj-$(CONFIG_SPI_APPLE) += spi-apple.o - obj-$(CONFIG_SPI_AR934X) += spi-ar934x.o - obj-$(CONFIG_SPI_ARMADA_3700) += spi-armada-3700.o - obj-$(CONFIG_SPI_ASPEED_SMC) += spi-aspeed-smc.o -diff --git a/drivers/spi/spi-apple.c b/drivers/spi/spi-apple.c -new file mode 100644 -index 000000000000..c483ad3f69ef ---- /dev/null -+++ b/drivers/spi/spi-apple.c -@@ -0,0 +1,544 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Apple SoC SPI device driver -+ * -+ * Copyright The Asahi Linux Contributors -+ * -+ * Based on spi-sifive.c, Copyright 2018 SiFive, Inc. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define APPLE_SPI_CTRL 0x000 -+#define APPLE_SPI_CTRL_RUN BIT(0) -+#define APPLE_SPI_CTRL_TX_RESET BIT(2) -+#define APPLE_SPI_CTRL_RX_RESET BIT(3) -+ -+#define APPLE_SPI_CFG 0x004 -+#define APPLE_SPI_CFG_CPHA BIT(1) -+#define APPLE_SPI_CFG_CPOL BIT(2) -+#define APPLE_SPI_CFG_MODE GENMASK(6, 5) -+#define APPLE_SPI_CFG_MODE_POLLED 0 -+#define APPLE_SPI_CFG_MODE_IRQ 1 -+#define APPLE_SPI_CFG_MODE_DMA 2 -+#define APPLE_SPI_CFG_IE_RXCOMPLETE BIT(7) -+#define APPLE_SPI_CFG_IE_TXRXTHRESH BIT(8) -+#define APPLE_SPI_CFG_LSB_FIRST BIT(13) -+#define APPLE_SPI_CFG_WORD_SIZE GENMASK(16, 15) -+#define APPLE_SPI_CFG_WORD_SIZE_8B 0 -+#define APPLE_SPI_CFG_WORD_SIZE_16B 1 -+#define APPLE_SPI_CFG_WORD_SIZE_32B 2 -+#define APPLE_SPI_CFG_FIFO_THRESH GENMASK(18, 17) -+#define APPLE_SPI_CFG_FIFO_THRESH_8B 0 -+#define APPLE_SPI_CFG_FIFO_THRESH_4B 1 -+#define APPLE_SPI_CFG_FIFO_THRESH_1B 2 -+#define APPLE_SPI_CFG_IE_TXCOMPLETE BIT(21) -+ -+#define APPLE_SPI_STATUS 0x008 -+#define APPLE_SPI_STATUS_RXCOMPLETE BIT(0) -+#define APPLE_SPI_STATUS_TXRXTHRESH BIT(1) -+#define APPLE_SPI_STATUS_TXCOMPLETE BIT(2) -+ -+#define APPLE_SPI_PIN 0x00c -+#define APPLE_SPI_PIN_KEEP_MOSI BIT(0) -+#define APPLE_SPI_PIN_CS BIT(1) -+ -+#define APPLE_SPI_TXDATA 0x010 -+#define APPLE_SPI_RXDATA 0x020 -+#define APPLE_SPI_CLKDIV 0x030 -+#define APPLE_SPI_CLKDIV_MAX 0x7ff -+#define APPLE_SPI_RXCNT 0x034 -+#define APPLE_SPI_WORD_DELAY 0x038 -+#define APPLE_SPI_TXCNT 0x04c -+ -+#define APPLE_SPI_FIFOSTAT 0x10c -+#define APPLE_SPI_FIFOSTAT_TXFULL BIT(4) -+#define APPLE_SPI_FIFOSTAT_LEVEL_TX GENMASK(15, 8) -+#define APPLE_SPI_FIFOSTAT_RXEMPTY BIT(20) -+#define APPLE_SPI_FIFOSTAT_LEVEL_RX GENMASK(31, 24) -+ -+#define APPLE_SPI_IE_XFER 0x130 -+#define APPLE_SPI_IF_XFER 0x134 -+#define APPLE_SPI_XFER_RXCOMPLETE BIT(0) -+#define APPLE_SPI_XFER_TXCOMPLETE BIT(1) -+ -+#define APPLE_SPI_IE_FIFO 0x138 -+#define APPLE_SPI_IF_FIFO 0x13c -+#define APPLE_SPI_FIFO_RXTHRESH BIT(4) -+#define APPLE_SPI_FIFO_TXTHRESH BIT(5) -+#define APPLE_SPI_FIFO_RXFULL BIT(8) -+#define APPLE_SPI_FIFO_TXEMPTY BIT(9) -+#define APPLE_SPI_FIFO_RXUNDERRUN BIT(16) -+#define APPLE_SPI_FIFO_TXOVERFLOW BIT(17) -+ -+#define APPLE_SPI_SHIFTCFG 0x150 -+#define APPLE_SPI_SHIFTCFG_CLK_ENABLE BIT(0) -+#define APPLE_SPI_SHIFTCFG_CS_ENABLE BIT(1) -+#define APPLE_SPI_SHIFTCFG_AND_CLK_DATA BIT(8) -+#define APPLE_SPI_SHIFTCFG_CS_AS_DATA BIT(9) -+#define APPLE_SPI_SHIFTCFG_TX_ENABLE BIT(10) -+#define APPLE_SPI_SHIFTCFG_RX_ENABLE BIT(11) -+#define APPLE_SPI_SHIFTCFG_BITS GENMASK(21, 16) -+#define APPLE_SPI_SHIFTCFG_OVERRIDE_CS BIT(24) -+ -+#define APPLE_SPI_PINCFG 0x154 -+#define APPLE_SPI_PINCFG_KEEP_CLK BIT(0) -+#define APPLE_SPI_PINCFG_KEEP_CS BIT(1) -+#define APPLE_SPI_PINCFG_KEEP_MOSI BIT(2) -+#define APPLE_SPI_PINCFG_CLK_IDLE_VAL BIT(8) -+#define APPLE_SPI_PINCFG_CS_IDLE_VAL BIT(9) -+#define APPLE_SPI_PINCFG_MOSI_IDLE_VAL BIT(10) -+ -+#define APPLE_SPI_DELAY_PRE 0x160 -+#define APPLE_SPI_DELAY_POST 0x168 -+#define APPLE_SPI_DELAY_ENABLE BIT(0) -+#define APPLE_SPI_DELAY_NO_INTERBYTE BIT(1) -+#define APPLE_SPI_DELAY_SET_SCK BIT(4) -+#define APPLE_SPI_DELAY_SET_MOSI BIT(6) -+#define APPLE_SPI_DELAY_SCK_VAL BIT(8) -+#define APPLE_SPI_DELAY_MOSI_VAL BIT(12) -+ -+#define APPLE_SPI_FIFO_DEPTH 16 -+ -+/* -+ * The slowest refclock available is 24MHz, the highest divider is 0x7ff, -+ * the largest word size is 32 bits, the FIFO depth is 16, the maximum -+ * intra-word delay is 0xffff refclocks. So the maximum time a transfer -+ * cycle can take is: -+ * -+ * (0x7ff * 32 + 0xffff) * 16 / 24e6 Hz ~= 87ms -+ * -+ * Double it and round it up to 200ms for good measure. -+ */ -+#define APPLE_SPI_TIMEOUT_MS 200 -+ -+struct apple_spi { -+ void __iomem *regs; /* MMIO register address */ -+ struct clk *clk; /* bus clock */ -+ struct completion done; /* wake-up from interrupt */ -+}; -+ -+static inline void reg_write(struct apple_spi *spi, int offset, u32 value) -+{ -+ writel_relaxed(value, spi->regs + offset); -+} -+ -+static inline u32 reg_read(struct apple_spi *spi, int offset) -+{ -+ return readl_relaxed(spi->regs + offset); -+} -+ -+static inline void reg_mask(struct apple_spi *spi, int offset, u32 clear, u32 set) -+{ -+ u32 val = reg_read(spi, offset); -+ -+ val &= ~clear; -+ val |= set; -+ reg_write(spi, offset, val); -+} -+ -+static void apple_spi_init(struct apple_spi *spi) -+{ -+ /* Set CS high (inactive) and disable override and auto-CS */ -+ reg_write(spi, APPLE_SPI_PIN, APPLE_SPI_PIN_CS); -+ reg_mask(spi, APPLE_SPI_SHIFTCFG, APPLE_SPI_SHIFTCFG_OVERRIDE_CS, 0); -+ reg_mask(spi, APPLE_SPI_PINCFG, APPLE_SPI_PINCFG_CS_IDLE_VAL, APPLE_SPI_PINCFG_KEEP_CS); -+ -+ /* Reset FIFOs */ -+ reg_write(spi, APPLE_SPI_CTRL, APPLE_SPI_CTRL_RX_RESET | APPLE_SPI_CTRL_TX_RESET); -+ -+ /* Configure defaults */ -+ reg_write(spi, APPLE_SPI_CFG, -+ FIELD_PREP(APPLE_SPI_CFG_FIFO_THRESH, APPLE_SPI_CFG_FIFO_THRESH_8B) | -+ FIELD_PREP(APPLE_SPI_CFG_MODE, APPLE_SPI_CFG_MODE_IRQ) | -+ FIELD_PREP(APPLE_SPI_CFG_WORD_SIZE, APPLE_SPI_CFG_WORD_SIZE_8B)); -+ -+ /* Disable IRQs */ -+ reg_write(spi, APPLE_SPI_IE_FIFO, 0); -+ reg_write(spi, APPLE_SPI_IE_XFER, 0); -+ -+ /* Disable delays */ -+ reg_write(spi, APPLE_SPI_DELAY_PRE, 0); -+ reg_write(spi, APPLE_SPI_DELAY_POST, 0); -+} -+ -+static int apple_spi_prepare_message(struct spi_controller *ctlr, struct spi_message *msg) -+{ -+ struct apple_spi *spi = spi_controller_get_devdata(ctlr); -+ struct spi_device *device = msg->spi; -+ -+ u32 cfg = ((device->mode & SPI_CPHA ? APPLE_SPI_CFG_CPHA : 0) | -+ (device->mode & SPI_CPOL ? APPLE_SPI_CFG_CPOL : 0) | -+ (device->mode & SPI_LSB_FIRST ? APPLE_SPI_CFG_LSB_FIRST : 0)); -+ -+ /* Update core config */ -+ reg_mask(spi, APPLE_SPI_CFG, -+ APPLE_SPI_CFG_CPHA | APPLE_SPI_CFG_CPOL | APPLE_SPI_CFG_LSB_FIRST, cfg); -+ -+ return 0; -+} -+ -+static void apple_spi_set_cs(struct spi_device *device, bool is_high) -+{ -+ struct apple_spi *spi = spi_controller_get_devdata(device->controller); -+ -+ reg_mask(spi, APPLE_SPI_PIN, APPLE_SPI_PIN_CS, is_high ? APPLE_SPI_PIN_CS : 0); -+} -+ -+static bool apple_spi_prep_transfer(struct apple_spi *spi, struct spi_transfer *t) -+{ -+ u32 cr, fifo_threshold; -+ -+ /* Calculate and program the clock rate */ -+ cr = DIV_ROUND_UP(clk_get_rate(spi->clk), t->speed_hz); -+ reg_write(spi, APPLE_SPI_CLKDIV, min_t(u32, cr, APPLE_SPI_CLKDIV_MAX)); -+ -+ /* Update bits per word */ -+ reg_mask(spi, APPLE_SPI_SHIFTCFG, APPLE_SPI_SHIFTCFG_BITS, -+ FIELD_PREP(APPLE_SPI_SHIFTCFG_BITS, t->bits_per_word)); -+ -+ /* We will want to poll if the time we need to wait is -+ * less than the context switching time. -+ * Let's call that threshold 5us. The operation will take: -+ * bits_per_word * fifo_threshold / hz <= 5 * 10^-6 -+ * 200000 * bits_per_word * fifo_threshold <= hz -+ */ -+ fifo_threshold = APPLE_SPI_FIFO_DEPTH / 2; -+ return (200000 * t->bits_per_word * fifo_threshold) <= t->speed_hz; -+} -+ -+static irqreturn_t apple_spi_irq(int irq, void *dev_id) -+{ -+ struct apple_spi *spi = dev_id; -+ u32 fifo = reg_read(spi, APPLE_SPI_IF_FIFO) & reg_read(spi, APPLE_SPI_IE_FIFO); -+ u32 xfer = reg_read(spi, APPLE_SPI_IF_XFER) & reg_read(spi, APPLE_SPI_IE_XFER); -+ -+ if (fifo || xfer) { -+ /* Disable interrupts until next transfer */ -+ reg_write(spi, APPLE_SPI_IE_XFER, 0); -+ reg_write(spi, APPLE_SPI_IE_FIFO, 0); -+ complete(&spi->done); -+ return IRQ_HANDLED; -+ } -+ -+ return IRQ_NONE; -+} -+ -+static int apple_spi_wait(struct apple_spi *spi, u32 fifo_bit, u32 xfer_bit, int poll) -+{ -+ int ret = 0; -+ -+ if (poll) { -+ u32 fifo, xfer; -+ unsigned long timeout = jiffies + APPLE_SPI_TIMEOUT_MS * HZ / 1000; -+ -+ do { -+ fifo = reg_read(spi, APPLE_SPI_IF_FIFO); -+ xfer = reg_read(spi, APPLE_SPI_IF_XFER); -+ if (time_after(jiffies, timeout)) { -+ ret = -ETIMEDOUT; -+ break; -+ } -+ } while (!((fifo & fifo_bit) || (xfer & xfer_bit))); -+ } else { -+ reinit_completion(&spi->done); -+ reg_write(spi, APPLE_SPI_IE_XFER, xfer_bit); -+ reg_write(spi, APPLE_SPI_IE_FIFO, fifo_bit); -+ -+ if (!wait_for_completion_timeout(&spi->done, -+ msecs_to_jiffies(APPLE_SPI_TIMEOUT_MS))) -+ ret = -ETIMEDOUT; -+ -+ reg_write(spi, APPLE_SPI_IE_XFER, 0); -+ reg_write(spi, APPLE_SPI_IE_FIFO, 0); -+ } -+ -+ return ret; -+} -+ -+static void apple_spi_tx(struct apple_spi *spi, const void **tx_ptr, u32 *left, -+ unsigned int bytes_per_word) -+{ -+ u32 inuse, words, wrote; -+ -+ if (!*tx_ptr) -+ return; -+ -+ inuse = FIELD_GET(APPLE_SPI_FIFOSTAT_LEVEL_TX, reg_read(spi, APPLE_SPI_FIFOSTAT)); -+ words = wrote = min_t(u32, *left, APPLE_SPI_FIFO_DEPTH - inuse); -+ -+ if (!words) -+ return; -+ -+ *left -= words; -+ -+ switch (bytes_per_word) { -+ case 1: { -+ const u8 *p = *tx_ptr; -+ -+ while (words--) -+ reg_write(spi, APPLE_SPI_TXDATA, *p++); -+ break; -+ } -+ case 2: { -+ const u16 *p = *tx_ptr; -+ -+ while (words--) -+ reg_write(spi, APPLE_SPI_TXDATA, *p++); -+ break; -+ } -+ case 4: { -+ const u32 *p = *tx_ptr; -+ -+ while (words--) -+ reg_write(spi, APPLE_SPI_TXDATA, *p++); -+ break; -+ } -+ default: -+ WARN_ON(1); -+ } -+ -+ *tx_ptr = ((u8 *)*tx_ptr) + bytes_per_word * wrote; -+} -+ -+static void apple_spi_rx(struct apple_spi *spi, void **rx_ptr, u32 *left, -+ unsigned int bytes_per_word) -+{ -+ u32 words, read; -+ -+ if (!*rx_ptr) -+ return; -+ -+ words = read = FIELD_GET(APPLE_SPI_FIFOSTAT_LEVEL_RX, reg_read(spi, APPLE_SPI_FIFOSTAT)); -+ WARN_ON(words > *left); -+ -+ if (!words) -+ return; -+ -+ *left -= min_t(u32, *left, words); -+ -+ switch (bytes_per_word) { -+ case 1: { -+ u8 *p = *rx_ptr; -+ -+ while (words--) -+ *p++ = reg_read(spi, APPLE_SPI_RXDATA); -+ break; -+ } -+ case 2: { -+ u16 *p = *rx_ptr; -+ -+ while (words--) -+ *p++ = reg_read(spi, APPLE_SPI_RXDATA); -+ break; -+ } -+ case 4: { -+ u32 *p = *rx_ptr; -+ -+ while (words--) -+ *p++ = reg_read(spi, APPLE_SPI_RXDATA); -+ break; -+ } -+ default: -+ WARN_ON(1); -+ } -+ -+ *rx_ptr = ((u8 *)*rx_ptr) + bytes_per_word * read; -+} -+ -+static int apple_spi_transfer_one(struct spi_controller *ctlr, struct spi_device *device, -+ struct spi_transfer *t) -+{ -+ struct apple_spi *spi = spi_controller_get_devdata(ctlr); -+ bool poll = apple_spi_prep_transfer(spi, t); -+ const void *tx_ptr = t->tx_buf; -+ void *rx_ptr = t->rx_buf; -+ unsigned int bytes_per_word; -+ u32 words, remaining_tx, remaining_rx; -+ u32 xfer_flags = 0; -+ u32 fifo_flags; -+ int retries = 100; -+ int ret = 0; -+ -+ if (t->bits_per_word > 16) -+ bytes_per_word = 4; -+ else if (t->bits_per_word > 8) -+ bytes_per_word = 2; -+ else -+ bytes_per_word = 1; -+ -+ words = t->len / bytes_per_word; -+ remaining_tx = tx_ptr ? words : 0; -+ remaining_rx = rx_ptr ? words : 0; -+ -+ /* Reset FIFOs */ -+ reg_write(spi, APPLE_SPI_CTRL, APPLE_SPI_CTRL_RX_RESET | APPLE_SPI_CTRL_TX_RESET); -+ -+ /* Clear IRQ flags */ -+ reg_write(spi, APPLE_SPI_IF_XFER, ~0); -+ reg_write(spi, APPLE_SPI_IF_FIFO, ~0); -+ -+ /* Determine transfer completion flags we wait for */ -+ if (tx_ptr) -+ xfer_flags |= APPLE_SPI_XFER_TXCOMPLETE; -+ if (rx_ptr) -+ xfer_flags |= APPLE_SPI_XFER_RXCOMPLETE; -+ -+ /* Set transfer length */ -+ reg_write(spi, APPLE_SPI_TXCNT, remaining_tx); -+ reg_write(spi, APPLE_SPI_RXCNT, remaining_rx); -+ -+ /* Prime transmit FIFO */ -+ apple_spi_tx(spi, &tx_ptr, &remaining_tx, bytes_per_word); -+ -+ /* Start transfer */ -+ reg_write(spi, APPLE_SPI_CTRL, APPLE_SPI_CTRL_RUN); -+ -+ /* TX again since a few words get popped off immediately */ -+ apple_spi_tx(spi, &tx_ptr, &remaining_tx, bytes_per_word); -+ -+ while (xfer_flags) { -+ fifo_flags = 0; -+ -+ if (remaining_tx) -+ fifo_flags |= APPLE_SPI_FIFO_TXTHRESH; -+ if (remaining_rx) -+ fifo_flags |= APPLE_SPI_FIFO_RXTHRESH; -+ -+ /* Wait for anything to happen */ -+ ret = apple_spi_wait(spi, fifo_flags, xfer_flags, poll); -+ if (ret) { -+ dev_err(&ctlr->dev, "transfer timed out (remaining %d tx, %d rx)\n", -+ remaining_tx, remaining_rx); -+ goto err; -+ } -+ -+ /* Stop waiting on transfer halves once they complete */ -+ xfer_flags &= ~reg_read(spi, APPLE_SPI_IF_XFER); -+ -+ /* Transmit and receive everything we can */ -+ apple_spi_tx(spi, &tx_ptr, &remaining_tx, bytes_per_word); -+ apple_spi_rx(spi, &rx_ptr, &remaining_rx, bytes_per_word); -+ } -+ -+ /* -+ * Sometimes the transfer completes before the last word is in the RX FIFO. -+ * Normally one retry is all it takes to get the last word out. -+ */ -+ while (remaining_rx && retries--) -+ apple_spi_rx(spi, &rx_ptr, &remaining_rx, bytes_per_word); -+ -+ if (remaining_tx) -+ dev_err(&ctlr->dev, "transfer completed with %d words left to transmit\n", -+ remaining_tx); -+ if (remaining_rx) -+ dev_err(&ctlr->dev, "transfer completed with %d words left to receive\n", -+ remaining_rx); -+ -+err: -+ fifo_flags = reg_read(spi, APPLE_SPI_IF_FIFO); -+ WARN_ON(fifo_flags & APPLE_SPI_FIFO_TXOVERFLOW); -+ WARN_ON(fifo_flags & APPLE_SPI_FIFO_RXUNDERRUN); -+ -+ /* Stop transfer */ -+ reg_write(spi, APPLE_SPI_CTRL, 0); -+ -+ return ret; -+} -+ -+static void apple_spi_clk_disable_unprepare(void *data) -+{ -+ clk_disable_unprepare(data); -+} -+ -+static int apple_spi_probe(struct platform_device *pdev) -+{ -+ struct apple_spi *spi; -+ int ret, irq; -+ struct spi_controller *ctlr; -+ -+ ctlr = devm_spi_alloc_master(&pdev->dev, sizeof(struct apple_spi)); -+ if (!ctlr) -+ return dev_err_probe(&pdev->dev, -ENOMEM, "out of memory\n"); -+ -+ spi = spi_controller_get_devdata(ctlr); -+ init_completion(&spi->done); -+ platform_set_drvdata(pdev, ctlr); -+ -+ spi->regs = devm_platform_ioremap_resource(pdev, 0); -+ if (IS_ERR(spi->regs)) -+ return PTR_ERR(spi->regs); -+ -+ spi->clk = devm_clk_get(&pdev->dev, NULL); -+ if (IS_ERR(spi->clk)) -+ return dev_err_probe(&pdev->dev, PTR_ERR(spi->clk), "Unable to find bus clock\n"); -+ -+ irq = platform_get_irq(pdev, 0); -+ if (irq < 0) { -+ return irq; -+ } -+ -+ ret = devm_request_irq(&pdev->dev, irq, apple_spi_irq, 0, -+ dev_name(&pdev->dev), spi); -+ if (ret) -+ return dev_err_probe(&pdev->dev, ret, "Unable to bind to interrupt\n"); -+ -+ ret = clk_prepare_enable(spi->clk); -+ if (ret) -+ return dev_err_probe(&pdev->dev, ret, "Unable to enable bus clock\n"); -+ -+ ret = devm_add_action_or_reset(&pdev->dev, apple_spi_clk_disable_unprepare, spi->clk); -+ if (ret) -+ return ret; -+ -+ ctlr->dev.of_node = pdev->dev.of_node; -+ ctlr->bus_num = pdev->id; -+ ctlr->num_chipselect = 1; -+ ctlr->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST; -+ ctlr->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32); -+ ctlr->flags = 0; -+ ctlr->prepare_message = apple_spi_prepare_message; -+ ctlr->set_cs = apple_spi_set_cs; -+ ctlr->transfer_one = apple_spi_transfer_one; -+ ctlr->auto_runtime_pm = true; -+ -+ pm_runtime_set_active(&pdev->dev); -+ devm_pm_runtime_enable(&pdev->dev); -+ -+ apple_spi_init(spi); -+ -+ ret = devm_spi_register_controller(&pdev->dev, ctlr); -+ if (ret < 0) -+ return dev_err_probe(&pdev->dev, ret, "devm_spi_register_controller failed\n"); -+ -+ return 0; -+} -+ -+static const struct of_device_id apple_spi_of_match[] = { -+ { .compatible = "apple,spi", }, -+ {} -+}; -+MODULE_DEVICE_TABLE(of, apple_spi_of_match); -+ -+static struct platform_driver apple_spi_driver = { -+ .probe = apple_spi_probe, -+ .driver = { -+ .name = "apple-spi", -+ .owner = THIS_MODULE, -+ .of_match_table = apple_spi_of_match, -+ }, -+}; -+module_platform_driver(apple_spi_driver); -+ -+MODULE_AUTHOR("Hector Martin "); -+MODULE_DESCRIPTION("Apple SoC SPI driver"); -+MODULE_LICENSE("GPL"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0070-dt-bindings-dma-Add-apple-admac-binding.patch b/target/linux/silicon/patches-5.19/0070-dt-bindings-dma-Add-apple-admac-binding.patch deleted file mode 100644 index bb3c6d12d..000000000 --- a/target/linux/silicon/patches-5.19/0070-dt-bindings-dma-Add-apple-admac-binding.patch +++ /dev/null @@ -1,93 +0,0 @@ -From c67e6dd3d9c5590394faf5138021ba7ebe306343 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Sat, 19 Feb 2022 09:50:39 +0100 -Subject: [PATCH 070/171] dt-bindings: dma: Add apple,admac binding -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The Audio DMA Controller (ADMAC) is used to load and store audio -samples from/to system memory. It is present on Apple SoCs from -the "Apple Silicon" family. - -Signed-off-by: Martin Povišer ---- - .../devicetree/bindings/dma/apple,admac.yaml | 65 +++++++++++++++++++ - 1 file changed, 65 insertions(+) - create mode 100644 Documentation/devicetree/bindings/dma/apple,admac.yaml - -diff --git a/Documentation/devicetree/bindings/dma/apple,admac.yaml b/Documentation/devicetree/bindings/dma/apple,admac.yaml -new file mode 100644 -index 000000000000..34ede3b0de2c ---- /dev/null -+++ b/Documentation/devicetree/bindings/dma/apple,admac.yaml -@@ -0,0 +1,65 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/dma/apple,admac.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Apple Audio DMA Controller (ADMAC) -+ -+description: | -+ The Audio DMA Controller (ADMAC) is used to load and store audio -+ samples from/to system memory. It is present on Apple SoCs -+ from the "Apple Silicon" family. -+ -+maintainers: -+ - Martin Povišer -+ -+allOf: -+ - $ref: "dma-controller.yaml#" -+ -+properties: -+ compatible: -+ items: -+ - const: apple,t8103-admac -+ - const: apple,admac -+ -+ reg: -+ maxItems: 1 -+ -+ '#dma-cells': -+ const: 1 -+ -+ interrupts: -+ maxItems: 1 -+ -+required: -+ - compatible -+ - reg -+ - interrupts -+ - '#dma-cells' -+ - dma-channels -+ -+additionalProperties: false -+ -+examples: -+ - | -+ #include -+ #include -+ -+ dart_sio: iommu@235004000 { -+ compatible = "apple,t8103-dart", "apple,dart"; -+ reg = <0x2 0x35004000 0x0 0x4000>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #iommu-cells = <1>; -+ }; -+ -+ admac: dma-controller@238200000 { -+ compatible = "apple,t8103-admac", "apple,admac"; -+ reg = <0x2 0x38200000 0x0 0x34000>; -+ dma-channels = <12>; -+ interrupt-parent = <&aic>; -+ interrupts = ; -+ #dma-cells = <1>; -+ iommus = <&dart_sio 2>; -+ }; -\ No newline at end of file --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0071-dmaengine-apple-admac-Add-Apple-ADMAC-driver.patch b/target/linux/silicon/patches-5.19/0071-dmaengine-apple-admac-Add-Apple-ADMAC-driver.patch deleted file mode 100644 index 99b46d452..000000000 --- a/target/linux/silicon/patches-5.19/0071-dmaengine-apple-admac-Add-Apple-ADMAC-driver.patch +++ /dev/null @@ -1,806 +0,0 @@ -From 594ea25c7f3f1ee8d0e952c6547bcd06843f9045 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Sat, 19 Feb 2022 09:49:23 +0100 -Subject: [PATCH 071/171] dmaengine: apple-admac: Add Apple ADMAC driver - -Add driver for Audio DMA Controller present on Apple SoCs -from the "Apple Silicon" family. ---- - drivers/dma/Kconfig | 8 + - drivers/dma/Makefile | 1 + - drivers/dma/apple-admac.c | 752 ++++++++++++++++++++++++++++++++++++++ - 3 files changed, 761 insertions(+) - create mode 100644 drivers/dma/apple-admac.c - -diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig -index 487ed4ddc3be..bda78b8172d4 100644 ---- a/drivers/dma/Kconfig -+++ b/drivers/dma/Kconfig -@@ -85,6 +85,14 @@ config AMCC_PPC440SPE_ADMA - help - Enable support for the AMCC PPC440SPe RAID engines. - -+config APPLE_ADMAC -+ tristate "Apple ADMAC support" -+ depends on ARCH_APPLE || COMPILE_TEST -+ select DMA_ENGINE -+ default ARCH_APPLE -+ help -+ Enable support for Audio DMA Controller found on Apple Silicon chips. -+ - config AT_HDMAC - tristate "Atmel AHB DMA support" - depends on ARCH_AT91 -diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile -index 2f1b87ffd7ab..10f7d4241001 100644 ---- a/drivers/dma/Makefile -+++ b/drivers/dma/Makefile -@@ -17,6 +17,7 @@ obj-$(CONFIG_ALTERA_MSGDMA) += altera-msgdma.o - obj-$(CONFIG_AMBA_PL08X) += amba-pl08x.o - obj-$(CONFIG_AMCC_PPC440SPE_ADMA) += ppc4xx/ - obj-$(CONFIG_AMD_PTDMA) += ptdma/ -+obj-$(CONFIG_APPLE_ADMAC) += apple-admac.o - obj-$(CONFIG_AT_HDMAC) += at_hdmac.o - obj-$(CONFIG_AT_XDMAC) += at_xdmac.o - obj-$(CONFIG_AXI_DMAC) += dma-axi-dmac.o -diff --git a/drivers/dma/apple-admac.c b/drivers/dma/apple-admac.c -new file mode 100644 -index 000000000000..aa4c07bcb72a ---- /dev/null -+++ b/drivers/dma/apple-admac.c -@@ -0,0 +1,752 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "dmaengine.h" -+ -+#define NCHANNELS_MAX 64 -+ -+#define RING_WRITE_SLOT GENMASK(1, 0) -+#define RING_READ_SLOT GENMASK(5, 4) -+#define RING_FULL BIT(9) -+#define RING_EMPTY BIT(8) -+#define RING_ERR BIT(10) -+ -+#define STATUS_DESC_DONE BIT(0) -+#define STATUS_ERR BIT(6) -+ -+#define FLAG_DESC_NOTIFY BIT(16) -+ -+#define REG_TX_START 0x0000 -+#define REG_TX_STOP 0x0004 -+#define REG_RX_START 0x0008 -+#define REG_RX_STOP 0x000c -+ -+#define REG_CHAN_CTL(ch) (0x8000 + (ch)*0x200) -+#define REG_CHAN_CTL_RST_RINGS BIT(0) -+ -+#define REG_DESC_RING(ch) (0x8070 + (ch)*0x200) -+#define REG_REPORT_RING(ch) (0x8074 + (ch)*0x200) -+ -+#define REG_RESIDUE(ch) (0x8064 + (ch)*0x200) -+ -+#define REG_BUS_WIDTH(ch) (0x8040 + (ch)*0x200) -+ -+#define BUS_WIDTH_8BIT 0x00 -+#define BUS_WIDTH_16BIT 0x01 -+#define BUS_WIDTH_32BIT 0x02 -+#define BUS_WIDTH_FRAME_2_WORDS 0x10 -+#define BUS_WIDTH_FRAME_4_WORDS 0x20 -+ -+#define REG_CHAN_BURSTSIZE(ch) (0x8054 + (ch)*0x200) -+ -+#define REG_DESC_WRITE(ch) (0x10000 + (ch / 2) * 0x4 + (ch & 1) * 0x4000) -+#define REG_REPORT_READ(ch) (0x10100 + (ch / 2) * 0x4 + (ch & 1) * 0x4000) -+ -+#define IRQ_INDEX_MAX 3 -+ -+#define REG_TX_INTSTATE(idx) (0x0030 + (idx) * 4) -+#define REG_RX_INTSTATE(idx) (0x0040 + (idx) * 4) -+#define REG_CHAN_INTSTATUS(ch,idx) (0x8010 + (ch) * 0x200 + (idx) * 4) -+#define REG_CHAN_INTMASK(ch,idx) (0x8020 + (ch) * 0x200 + (idx) * 4) -+ -+struct admac_data; -+struct admac_tx; -+ -+struct admac_chan { -+ int no; -+ struct admac_data *host; -+ struct dma_chan chan; -+ struct tasklet_struct tasklet; -+ -+ spinlock_t lock; -+ struct admac_tx *current_tx; -+ int nperiod_acks; -+ -+ struct list_head submitted; -+ struct list_head issued; -+}; -+ -+struct admac_data { -+ struct dma_device dma; -+ struct device *dev; -+ __iomem void *base; -+ -+ int irq_index; -+ int nchannels; -+ struct admac_chan channels[]; -+}; -+ -+struct admac_tx { -+ struct dma_async_tx_descriptor tx; -+ bool cyclic; -+ dma_addr_t buf_addr; -+ dma_addr_t buf_end; -+ size_t buf_len; -+ size_t period_len; -+ -+ size_t submitted_pos; -+ size_t reclaimed_pos; -+ -+ struct list_head node; -+}; -+ -+static void admac_poke(struct admac_data *ad, int reg, u32 val) -+{ -+ writel_relaxed(val, ad->base + reg); -+} -+ -+static u32 admac_peek(struct admac_data *ad, int reg) -+{ -+ return readl_relaxed(ad->base + reg); -+} -+ -+static void admac_modify(struct admac_data *ad, int reg, u32 mask, u32 val) -+{ -+ void __iomem *addr = ad->base + reg; -+ u32 curr = readl_relaxed(addr); -+ -+ writel_relaxed((curr & ~mask) | (val & mask), addr); -+} -+ -+static struct admac_chan *to_admac_chan(struct dma_chan *chan) -+{ -+ return container_of(chan, struct admac_chan, chan); -+} -+ -+static struct admac_tx *to_admac_tx(struct dma_async_tx_descriptor *tx) -+{ -+ return container_of(tx, struct admac_tx, tx); -+} -+ -+static enum dma_transfer_direction admac_chan_direction(int channo) -+{ -+ return (channo & 1) ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV; -+} -+ -+static dma_cookie_t admac_tx_submit(struct dma_async_tx_descriptor *tx) -+{ -+ struct admac_tx *adtx = to_admac_tx(tx); -+ struct admac_chan *adchan = to_admac_chan(tx->chan); -+ unsigned long flags; -+ dma_cookie_t cookie; -+ -+ spin_lock_irqsave(&adchan->lock, flags); -+ cookie = dma_cookie_assign(tx); -+ list_add_tail(&adtx->node, &adchan->submitted); -+ spin_unlock_irqrestore(&adchan->lock, flags); -+ -+ return cookie; -+} -+ -+static int admac_desc_free(struct dma_async_tx_descriptor *tx) -+{ -+ struct admac_tx *adtx = to_admac_tx(tx); -+ devm_kfree(to_admac_chan(tx->chan)->host->dev, adtx); -+ return 0; -+} -+ -+static struct dma_async_tx_descriptor *admac_prep_dma_cyclic( -+ struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len, -+ size_t period_len, enum dma_transfer_direction direction, -+ unsigned long flags) -+{ -+ struct admac_chan *adchan = container_of(chan, struct admac_chan, chan); -+ struct admac_tx *adtx; -+ -+ if (direction != admac_chan_direction(adchan->no)) -+ return NULL; -+ -+ adtx = devm_kzalloc(adchan->host->dev, sizeof(*adtx), GFP_NOWAIT); -+ if (!adtx) -+ return NULL; -+ -+ adtx->cyclic = true; -+ -+ adtx->buf_addr = buf_addr; -+ adtx->buf_len = buf_len; -+ adtx->buf_end = buf_addr + buf_len; -+ adtx->period_len = period_len; -+ -+ adtx->submitted_pos = 0; -+ adtx->reclaimed_pos = 0; -+ -+ dma_async_tx_descriptor_init(&adtx->tx, chan); -+ adtx->tx.tx_submit = admac_tx_submit; -+ adtx->tx.desc_free = admac_desc_free; -+ -+ return &adtx->tx; -+} -+ -+/* -+ * Write one hardware descriptor for a dmaegine cyclic transaction. -+ */ -+static void admac_cyclic_write_one_desc(struct admac_data *ad, int channo, -+ struct admac_tx *tx) -+{ -+ dma_addr_t addr; -+ -+ if (WARN_ON(!tx->cyclic)) -+ return; -+ -+ addr = tx->buf_addr + (tx->submitted_pos % tx->buf_len); -+ WARN_ON(addr + tx->period_len > tx->buf_end); -+ -+ dev_dbg(ad->dev, "ch%d descriptor: addr=0x%llx len=0x%x flags=0x%lx\n", -+ channo, addr, (u32) tx->period_len, FLAG_DESC_NOTIFY); -+ -+ admac_poke(ad, REG_DESC_WRITE(channo), addr); -+ admac_poke(ad, REG_DESC_WRITE(channo), addr >> 32); -+ admac_poke(ad, REG_DESC_WRITE(channo), tx->period_len); -+ admac_poke(ad, REG_DESC_WRITE(channo), FLAG_DESC_NOTIFY); -+ -+ tx->submitted_pos += tx->period_len; -+ tx->submitted_pos %= 2 * tx->buf_len; -+} -+ -+/* -+ * Write all the hardware descriptors for a cyclic transaction -+ * there is space for. -+ */ -+static void admac_cyclic_write_desc(struct admac_data *ad, int channo, -+ struct admac_tx *tx) -+{ -+ int i; -+ -+ for (i = 0; i < 4; i++) { -+ if (admac_peek(ad, REG_DESC_RING(channo)) & RING_FULL) -+ break; -+ admac_cyclic_write_one_desc(ad, channo, tx); -+ } -+} -+ -+static int admac_alloc_chan_resources(struct dma_chan *chan) -+{ -+ return 0; -+} -+ -+static void admac_free_chan_resources(struct dma_chan *chan) -+{ -+ // TODO -+} -+ -+static int admac_ring_noccupied_slots(int ringval) -+{ -+ int wrslot = FIELD_GET(RING_WRITE_SLOT, ringval); -+ int rdslot = FIELD_GET(RING_READ_SLOT, ringval); -+ -+ if (wrslot != rdslot) { -+ return (wrslot + 4 - rdslot) % 4; -+ } else { -+ WARN_ON((ringval & (RING_FULL | RING_EMPTY)) == 0); -+ -+ if (ringval & RING_FULL) -+ return 4; -+ else -+ return 0; -+ } -+} -+ -+/* -+ * Read from hardware the residue of a cyclic dmaengine transaction. -+ */ -+u32 admac_cyclic_read_residue(struct admac_data *ad, int channo, struct admac_tx *adtx) -+{ -+ u32 ring1, ring2; -+ u32 residue1, residue2; -+ int nreports; -+ size_t pos; -+ -+ ring1 = admac_peek(ad, REG_REPORT_RING(channo)); -+ residue1 = admac_peek(ad, REG_RESIDUE(channo)); -+ ring2 = admac_peek(ad, REG_REPORT_RING(channo)); -+ residue2 = admac_peek(ad, REG_RESIDUE(channo)); -+ -+ if (residue2 > residue1) { -+ // engine must have loaded next descriptor between the two residue reads -+ nreports = admac_ring_noccupied_slots(ring1) + 1; -+ } else { -+ // no descriptor load between the two reads, ring2 is safe to use -+ nreports = admac_ring_noccupied_slots(ring2); -+ } -+ -+ pos = adtx->reclaimed_pos + adtx->period_len * (nreports + 1) \ -+ - residue2; -+ -+ return adtx->buf_len - pos % adtx->buf_len; -+} -+ -+static enum dma_status admac_tx_status(struct dma_chan *chan, dma_cookie_t cookie, -+ struct dma_tx_state *txstate) -+{ -+ struct admac_chan *adchan = to_admac_chan(chan); -+ struct admac_data *ad = adchan->host; -+ struct admac_tx *adtx; -+ -+ enum dma_status ret; -+ size_t residue; -+ unsigned long flags; -+ -+ ret = dma_cookie_status(chan, cookie, txstate); -+ if (ret == DMA_COMPLETE || !txstate) -+ return ret; -+ -+ spin_lock_irqsave(&adchan->lock, flags); -+ adtx = adchan->current_tx; -+ -+ if (adtx && adtx->tx.cookie == cookie) { -+ ret = DMA_IN_PROGRESS; -+ residue = admac_cyclic_read_residue(ad, adchan->no, adtx); -+ } else { -+ ret = DMA_IN_PROGRESS; -+ residue = 0; -+ list_for_each_entry(adtx, &adchan->issued, node) { -+ if (adtx->tx.cookie == cookie) { -+ residue = adtx->buf_len; -+ break; -+ } -+ } -+ } -+ spin_unlock_irqrestore(&adchan->lock, flags); -+ -+ dma_set_residue(txstate, residue); -+ return ret; -+} -+ -+static void admac_start_chan(struct admac_chan *adchan) -+{ -+ u32 startbit = 1 << (adchan->no / 2); -+ switch (admac_chan_direction(adchan->no)) { -+ case DMA_MEM_TO_DEV: -+ admac_poke(adchan->host, REG_TX_START, startbit); -+ break; -+ case DMA_DEV_TO_MEM: -+ admac_poke(adchan->host, REG_RX_START, startbit); -+ break; -+ default: -+ break; -+ } -+ dev_dbg(adchan->host->dev, "ch%d start\n", adchan->no); -+} -+ -+static void admac_stop_chan(struct admac_chan *adchan) -+{ -+ u32 stopbit = 1 << (adchan->no / 2); -+ switch (admac_chan_direction(adchan->no)) { -+ case DMA_MEM_TO_DEV: -+ admac_poke(adchan->host, REG_TX_STOP, stopbit); -+ break; -+ case DMA_DEV_TO_MEM: -+ admac_poke(adchan->host, REG_RX_STOP, stopbit); -+ break; -+ default: -+ break; -+ } -+ dev_dbg(adchan->host->dev, "ch%d stop\n", adchan->no); -+} -+ -+static void admac_start_current_tx(struct admac_chan *adchan) -+{ -+ struct admac_data *ad = adchan->host; -+ int ch = adchan->no; -+ -+ admac_poke(ad, REG_CHAN_INTSTATUS(ch, ad->irq_index), -+ STATUS_DESC_DONE | STATUS_ERR); -+ admac_poke(ad, REG_CHAN_CTL(ch), REG_CHAN_CTL_RST_RINGS); -+ admac_poke(ad, REG_CHAN_CTL(ch), 0); -+ -+ admac_cyclic_write_one_desc(ad, ch, adchan->current_tx); -+ admac_start_chan(adchan); -+ admac_cyclic_write_desc(ad, ch, adchan->current_tx); -+} -+ -+static void admac_issue_pending(struct dma_chan *chan) -+{ -+ struct admac_chan *adchan = to_admac_chan(chan); -+ struct admac_tx *tx; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&adchan->lock, flags); -+ list_splice_tail_init(&adchan->submitted, &adchan->issued); -+ if (!list_empty(&adchan->issued) && !adchan->current_tx) { -+ tx = list_first_entry(&adchan->issued, struct admac_tx, node); -+ list_del(&tx->node); -+ -+ adchan->current_tx = tx; -+ adchan->nperiod_acks = 0; -+ admac_start_current_tx(adchan); -+ } -+ spin_unlock_irqrestore(&adchan->lock, flags); -+} -+ -+static int admac_pause(struct dma_chan *chan) -+{ -+ struct admac_chan *adchan = to_admac_chan(chan); -+ -+ admac_stop_chan(adchan); -+ -+ return 0; -+} -+ -+static int admac_resume(struct dma_chan *chan) -+{ -+ struct admac_chan *adchan = to_admac_chan(chan); -+ -+ admac_start_chan(adchan); -+ -+ return 0; -+} -+ -+static int admac_terminate_all(struct dma_chan *chan) -+{ -+ struct admac_chan *adchan = to_admac_chan(chan); -+ struct admac_tx *adtx, *_adtx; -+ unsigned long flags; -+ LIST_HEAD(head); -+ -+ spin_lock_irqsave(&adchan->lock, flags); -+ admac_stop_chan(adchan); -+ adchan->current_tx = NULL; -+ list_splice_tail_init(&adchan->submitted, &head); -+ list_splice_tail_init(&adchan->issued, &head); -+ spin_unlock_irqrestore(&adchan->lock, flags); -+ -+ list_for_each_entry_safe(adtx, _adtx, &head, node) { -+ list_del(&adtx->node); -+ admac_desc_free(&adtx->tx); -+ } -+ -+ return 0; -+} -+ -+static struct dma_chan *admac_dma_of_xlate(struct of_phandle_args *dma_spec, -+ struct of_dma *ofdma) -+{ -+ struct admac_data *ad = (struct admac_data*) ofdma->of_dma_data; -+ unsigned int index; -+ -+ if (dma_spec->args_count != 1) -+ return NULL; -+ -+ index = dma_spec->args[0]; -+ -+ if (index >= ad->nchannels) { -+ dev_err(ad->dev, "channel index %u out of bounds\n", index); -+ return NULL; -+ } -+ -+ return &ad->channels[index].chan; -+} -+ -+static int admac_drain_reports(struct admac_data *ad, int channo) -+{ -+ int count; -+ -+ for (count = 0; count < 4; count++) { -+ u32 countval_hi, countval_lo, unk1, flags; -+ -+ if (admac_peek(ad, REG_REPORT_RING(channo)) & RING_EMPTY) -+ break; -+ -+ countval_lo = admac_peek(ad, REG_REPORT_READ(channo)); -+ countval_hi = admac_peek(ad, REG_REPORT_READ(channo)); -+ unk1 = admac_peek(ad, REG_REPORT_READ(channo)); -+ flags = admac_peek(ad, REG_REPORT_READ(channo)); -+ -+ dev_dbg(ad->dev, "ch%d report: countval=0x%llx unk1=0x%x flags=0x%x\n", -+ channo, ((u64) countval_hi) << 32 | countval_lo, unk1, flags); -+ } -+ -+ return count; -+} -+ -+static void admac_handle_status_err(struct admac_data *ad, int channo) -+{ -+ bool handled = false; -+ -+ if (admac_peek(ad, REG_DESC_RING(channo) & RING_ERR)) { -+ admac_poke(ad, REG_DESC_RING(channo), RING_ERR); -+ dev_err(ad->dev, "ch%d descriptor ring error\n", channo); -+ handled = true; -+ } -+ -+ if (admac_peek(ad, REG_REPORT_RING(channo)) & RING_ERR) { -+ admac_poke(ad, REG_REPORT_RING(channo), RING_ERR); -+ dev_err(ad->dev, "ch%d report ring error\n", channo); -+ handled = true; -+ } -+ -+ if (unlikely(!handled)) { -+ dev_err(ad->dev, "ch%d unknown error, masking future error interrupts\n", channo); -+ admac_modify(ad, REG_CHAN_INTMASK(channo, ad->irq_index), STATUS_ERR, 0); -+ } -+} -+ -+static void admac_handle_status_desc_done(struct admac_data *ad, int channo) -+{ -+ struct admac_chan *adchan = &ad->channels[channo]; -+ unsigned long flags; -+ int nreports; -+ -+ admac_poke(ad, REG_CHAN_INTSTATUS(channo, ad->irq_index), -+ STATUS_DESC_DONE); -+ -+ spin_lock_irqsave(&adchan->lock, flags); -+ nreports = admac_drain_reports(ad, channo); -+ -+ if (adchan->current_tx) { -+ struct admac_tx *tx = adchan->current_tx; -+ -+ adchan->nperiod_acks += nreports; -+ tx->reclaimed_pos += nreports * tx->period_len; -+ tx->reclaimed_pos %= 2 * tx->buf_len; -+ -+ admac_cyclic_write_desc(ad, channo, tx); -+ tasklet_schedule(&adchan->tasklet); -+ } -+ spin_unlock_irqrestore(&adchan->lock, flags); -+} -+ -+static void admac_handle_chan_int(struct admac_data *ad, int no) -+{ -+ u32 cause = admac_peek(ad, REG_CHAN_INTSTATUS(no, ad->irq_index)); -+ -+ if (cause & STATUS_ERR) -+ admac_handle_status_err(ad, no); -+ -+ if (cause & STATUS_DESC_DONE) -+ admac_handle_status_desc_done(ad, no); -+} -+ -+static irqreturn_t admac_interrupt(int irq, void *devid) -+{ -+ struct admac_data *ad = devid; -+ u32 rx_intstate, tx_intstate; -+ int i; -+ -+ rx_intstate = admac_peek(ad, REG_RX_INTSTATE(ad->irq_index)); -+ tx_intstate = admac_peek(ad, REG_TX_INTSTATE(ad->irq_index)); -+ -+ for (i = 0; i < ad->nchannels; i += 2) -+ if (tx_intstate & (1 << (i / 2))) -+ admac_handle_chan_int(ad, i); -+ -+ for (i = 1; i < ad->nchannels; i += 2) -+ if (rx_intstate & (1 << (i / 2))) -+ admac_handle_chan_int(ad, i); -+ -+ return (tx_intstate | rx_intstate) != 0 ? IRQ_HANDLED : IRQ_NONE; -+} -+ -+static void admac_chan_tasklet(struct tasklet_struct *t) -+{ -+ struct admac_chan *adchan = from_tasklet(adchan, t, tasklet); -+ struct admac_tx *adtx; -+ struct dmaengine_desc_callback cb; -+ struct dmaengine_result tx_result; -+ int nacks; -+ -+ spin_lock_irq(&adchan->lock); -+ adtx = adchan->current_tx; -+ nacks = adchan->nperiod_acks; -+ adchan->nperiod_acks = 0; -+ spin_unlock_irq(&adchan->lock); -+ -+ if (!adtx || !nacks) -+ return; -+ -+ tx_result.result = DMA_TRANS_NOERROR; -+ tx_result.residue = 0; -+ -+ dmaengine_desc_get_callback(&adtx->tx, &cb); -+ while (nacks--) -+ dmaengine_desc_callback_invoke(&cb, &tx_result); -+} -+ -+static int admac_device_config(struct dma_chan *chan, -+ struct dma_slave_config *config) -+{ -+ struct admac_chan *adchan = to_admac_chan(chan); -+ struct admac_data *ad = adchan->host; -+ bool is_tx = admac_chan_direction(adchan->no) == DMA_MEM_TO_DEV; -+ u32 bus_width = 0; -+ -+ -+ switch (is_tx ? config->dst_addr_width : config->src_addr_width) { -+ case DMA_SLAVE_BUSWIDTH_1_BYTE: -+ bus_width |= BUS_WIDTH_8BIT; -+ break; -+ case DMA_SLAVE_BUSWIDTH_2_BYTES: -+ bus_width |= BUS_WIDTH_16BIT; -+ break; -+ case DMA_SLAVE_BUSWIDTH_4_BYTES: -+ bus_width |= BUS_WIDTH_32BIT; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ switch (is_tx ? config->dst_port_window_size : config->src_port_window_size) { -+ case 0 ... 1: -+ break; -+ case 2: -+ bus_width |= BUS_WIDTH_FRAME_2_WORDS; -+ break; -+ case 4: -+ bus_width |= BUS_WIDTH_FRAME_4_WORDS; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ admac_poke(adchan->host, REG_BUS_WIDTH(adchan->no), bus_width); -+ -+ /* TODO: burst size */ -+ -+ admac_poke(adchan->host, REG_CHAN_BURSTSIZE(adchan->no), 0xc00060); -+ -+ /* TODO: this belongs elsewhere */ -+ admac_poke(adchan->host, REG_CHAN_INTSTATUS(adchan->no, ad->irq_index), -+ STATUS_DESC_DONE | STATUS_ERR); -+ admac_poke(adchan->host, REG_CHAN_INTMASK(adchan->no, ad->irq_index), -+ STATUS_DESC_DONE | STATUS_ERR); -+ return 0; -+} -+ -+static int admac_probe(struct platform_device *pdev) -+{ -+ struct device_node *np = pdev->dev.of_node; -+ struct admac_data *ad; -+ struct dma_device *dma; -+ int nchannels; -+ int err, irq, i; -+ -+ err = of_property_read_u32(np, "dma-channels", &nchannels); -+ if (err || nchannels > NCHANNELS_MAX) { -+ dev_err(&pdev->dev, "missing or invalid dma-channels property\n"); -+ return -EINVAL; -+ } -+ -+ ad = devm_kzalloc(&pdev->dev, struct_size(ad, channels, nchannels), GFP_KERNEL); -+ if (!ad) -+ return -ENOMEM; -+ -+ platform_set_drvdata(pdev, ad); -+ ad->dev = &pdev->dev; -+ ad->nchannels = nchannels; -+ -+ err = of_property_read_u32(np, "apple,internal-irq-destination", &ad->irq_index); -+ if (err || ad->irq_index > IRQ_INDEX_MAX) { -+ dev_err(&pdev->dev, "missing or invalid apple,internal-irq-destination property\n"); -+ return -EINVAL; -+ } -+ -+ irq = platform_get_irq(pdev, 0); -+ if (irq < 0) { -+ dev_err(&pdev->dev, "unable to obtain interrupt resource\n"); -+ return irq; -+ } -+ -+ err = devm_request_irq(&pdev->dev, irq, admac_interrupt, -+ 0, dev_name(&pdev->dev), ad); -+ if (err) { -+ dev_err(&pdev->dev, "unable to register interrupt: %d\n", err); -+ return err; -+ } -+ -+ ad->base = devm_platform_ioremap_resource(pdev, 0); -+ if (IS_ERR(ad->base)) { -+ dev_err(&pdev->dev, "unable to obtain MMIO resource\n"); -+ return PTR_ERR(ad->base); -+ } -+ -+ dma = &ad->dma; -+ -+ dma_cap_set(DMA_PRIVATE, dma->cap_mask); -+ dma_cap_set(DMA_CYCLIC, dma->cap_mask); -+ -+ dma->dev = &pdev->dev; -+ dma->device_alloc_chan_resources = admac_alloc_chan_resources; -+ dma->device_free_chan_resources = admac_free_chan_resources; -+ dma->device_tx_status = admac_tx_status; -+ dma->device_issue_pending = admac_issue_pending; -+ dma->device_terminate_all = admac_terminate_all; -+ dma->device_prep_dma_cyclic = admac_prep_dma_cyclic; -+ dma->device_config = admac_device_config; -+ dma->device_pause = admac_pause; -+ dma->device_resume = admac_resume; -+ -+ dma->directions = BIT(DMA_MEM_TO_DEV) | BIT(DMA_DEV_TO_MEM); -+ dma->residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; -+ dma->dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | -+ BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | -+ BIT(DMA_SLAVE_BUSWIDTH_4_BYTES); -+ -+ INIT_LIST_HEAD(&dma->channels); -+ for (i = 0; i < nchannels; i++) { -+ struct admac_chan *adchan = &ad->channels[i]; -+ adchan->host = ad; -+ adchan->no = i; -+ adchan->chan.device = &ad->dma; -+ dma_cookie_init(&adchan->chan); -+ spin_lock_init(&adchan->lock); -+ INIT_LIST_HEAD(&adchan->submitted); -+ INIT_LIST_HEAD(&adchan->issued); -+ list_add_tail(&adchan->chan.device_node, &dma->channels); -+ tasklet_setup(&adchan->tasklet, admac_chan_tasklet); -+ } -+ -+ err = dma_async_device_register(&ad->dma); -+ if (err) { -+ dev_err(&pdev->dev, "failed to register DMA device: %d\n", err); -+ return err; -+ } -+ -+ err = of_dma_controller_register(pdev->dev.of_node, admac_dma_of_xlate, ad); -+ if (err) { -+ dev_err(&pdev->dev, "failed to register with OF: %d\n", err); -+ dma_async_device_unregister(&ad->dma); -+ return err; -+ } -+ -+ dev_dbg(&pdev->dev, "all good, ready to go!\n"); -+ -+ return 0; -+} -+ -+static int admac_remove(struct platform_device *pdev) -+{ -+ struct admac_data *ad = platform_get_drvdata(pdev); -+ -+ of_dma_controller_free(pdev->dev.of_node); -+ dma_async_device_unregister(&ad->dma); -+ -+ return 0; -+} -+ -+static const struct of_device_id admac_of_match[] = { -+ { .compatible = "apple,admac", }, -+ { } -+}; -+MODULE_DEVICE_TABLE(of, admac_of_match); -+ -+static struct platform_driver apple_admac_driver = { -+ .driver = { -+ .name = "apple-admac", -+ .of_match_table = admac_of_match, -+ }, -+ .probe = admac_probe, -+ .remove = admac_remove, -+}; -+module_platform_driver(apple_admac_driver); -+ -+MODULE_AUTHOR("Martin Povišer "); -+MODULE_DESCRIPTION("Driver for Audio DMA Controller (ADMAC) in Apple SoCs"); -+MODULE_LICENSE("GPL v2"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0072-ASoC-apple-mca-Add-platform-driver-for-Apple-SoCs.patch b/target/linux/silicon/patches-5.19/0072-ASoC-apple-mca-Add-platform-driver-for-Apple-SoCs.patch deleted file mode 100644 index fb074a512..000000000 --- a/target/linux/silicon/patches-5.19/0072-ASoC-apple-mca-Add-platform-driver-for-Apple-SoCs.patch +++ /dev/null @@ -1,1364 +0,0 @@ -From d9574a2027fbf3a6ffd1b32ca6838cd4e77519f2 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Sat, 19 Feb 2022 10:33:16 +0100 -Subject: [PATCH 072/171] ASoC: apple-mca: Add platform driver for Apple SoCs - -Add ASoC platform driver for the MCA block found on Apple SoCs -from the "Apple Silicon" family. ---- - sound/soc/Kconfig | 1 + - sound/soc/Makefile | 1 + - sound/soc/apple/Kconfig | 11 + - sound/soc/apple/Makefile | 3 + - sound/soc/apple/mca.c | 1287 ++++++++++++++++++++++++++++++++++++++ - 5 files changed, 1303 insertions(+) - create mode 100644 sound/soc/apple/Kconfig - create mode 100644 sound/soc/apple/Makefile - create mode 100644 sound/soc/apple/mca.c - -diff --git a/sound/soc/Kconfig b/sound/soc/Kconfig -index 7d4747b6bab2..848fbae26c3b 100644 ---- a/sound/soc/Kconfig -+++ b/sound/soc/Kconfig -@@ -68,6 +68,7 @@ config SND_SOC_ACPI - # All the supported SoCs - source "sound/soc/adi/Kconfig" - source "sound/soc/amd/Kconfig" -+source "sound/soc/apple/Kconfig" - source "sound/soc/atmel/Kconfig" - source "sound/soc/au1x/Kconfig" - source "sound/soc/bcm/Kconfig" -diff --git a/sound/soc/Makefile b/sound/soc/Makefile -index d4528962ac34..9b198d4edf37 100644 ---- a/sound/soc/Makefile -+++ b/sound/soc/Makefile -@@ -34,6 +34,7 @@ obj-$(CONFIG_SND_SOC_ACPI) += snd-soc-acpi.o - obj-$(CONFIG_SND_SOC) += snd-soc-core.o - obj-$(CONFIG_SND_SOC) += codecs/ - obj-$(CONFIG_SND_SOC) += generic/ -+obj-$(CONFIG_SND_SOC) += apple/ - obj-$(CONFIG_SND_SOC) += adi/ - obj-$(CONFIG_SND_SOC) += amd/ - obj-$(CONFIG_SND_SOC) += atmel/ -diff --git a/sound/soc/apple/Kconfig b/sound/soc/apple/Kconfig -new file mode 100644 -index 000000000000..ebe66d713b96 ---- /dev/null -+++ b/sound/soc/apple/Kconfig -@@ -0,0 +1,11 @@ -+config SND_SOC_APPLE_MCA -+ tristate "Apple Silicon MCA driver" -+ depends on ARCH_APPLE || COMPILE_TEST -+ select SND_DMAENGINE_PCM -+ select CONFIG_COMMON_CLK -+ select APPLE_ADMAC -+ select APPLE_NCO -+ default ARCH_APPLE -+ help -+ This option enables an ASoC platform driver for MCA blocks found -+ on Apple Silicon SoCs. -diff --git a/sound/soc/apple/Makefile b/sound/soc/apple/Makefile -new file mode 100644 -index 000000000000..c1e492d57649 ---- /dev/null -+++ b/sound/soc/apple/Makefile -@@ -0,0 +1,3 @@ -+snd-soc-apple-mca-objs := mca.o -+ -+obj-$(CONFIG_SND_SOC_APPLE_MCA) += snd-soc-apple-mca.o -diff --git a/sound/soc/apple/mca.c b/sound/soc/apple/mca.c -new file mode 100644 -index 000000000000..846dba0383a1 ---- /dev/null -+++ b/sound/soc/apple/mca.c -@@ -0,0 +1,1287 @@ -+#define USE_RXB_FOR_CAPTURE -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+/* relative to cluster base */ -+#define REG_STATUS 0x0 -+#define STATUS_MCLK_EN BIT(0) -+#define REG_MCLK_CONF 0x4 -+#define MCLK_CONF_DIV GENMASK(11, 8) -+ -+#define REG_SYNCGEN_STATUS 0x100 -+#define SYNCGEN_STATUS_EN BIT(0) -+#define REG_SYNCGEN_MCLK_SEL 0x104 -+#define SYNCGEN_MCLK_SEL GENMASK(3, 0) -+#define REG_SYNCGEN_HI_PERIOD 0x108 -+#define REG_SYNCGEN_LO_PERIOD 0x10c -+ -+#define REG_PORT_ENABLES 0x600 -+#define PORT_ENABLES_CLOCKS GENMASK(2, 1) -+#define PORT_ENABLES_TX_DATA BIT(3) -+#define REG_PORT_CLOCK_SEL 0x604 -+#define PORT_CLOCK_SEL GENMASK(11, 8) -+#define REG_PORT_DATA_SEL 0x608 -+#define PORT_DATA_SEL_TXA(cl) (1 << ((cl)*2)) -+#define PORT_DATA_SEL_TXB(cl) (2 << ((cl)*2)) -+ -+#define REG_INTSTATE 0x700 -+#define REG_INTMASK 0x704 -+ -+/* bases of serdes units (relative to cluster) */ -+#define CLUSTER_RXA_OFF 0x200 -+#define CLUSTER_TXA_OFF 0x300 -+#define CLUSTER_RXB_OFF 0x400 -+#define CLUSTER_TXB_OFF 0x500 -+ -+#define CLUSTER_TX_OFF CLUSTER_TXA_OFF -+ -+#ifndef USE_RXB_FOR_CAPTURE -+#define CLUSTER_RX_OFF CLUSTER_RXA_OFF -+#else -+#define CLUSTER_RX_OFF CLUSTER_RXB_OFF -+#endif -+ -+/* relative to serdes unit base */ -+#define REG_SERDES_STATUS 0x00 -+#define SERDES_STATUS_EN BIT(0) -+#define SERDES_STATUS_RST BIT(1) -+#define REG_TX_SERDES_CONF 0x04 -+#define REG_RX_SERDES_CONF 0x08 -+#define SERDES_CONF_NCHANS GENMASK(3, 0) -+#define SERDES_CONF_WIDTH_MASK GENMASK(8, 4) -+#define SERDES_CONF_WIDTH_16BIT 0x40 -+#define SERDES_CONF_WIDTH_20BIT 0x80 -+#define SERDES_CONF_WIDTH_24BIT 0xc0 -+#define SERDES_CONF_WIDTH_32BIT 0x100 -+#define SERDES_CONF_BCLK_POL 0x400 -+#define SERDES_CONF_LSB_FIRST 0x800 -+#define SERDES_CONF_UNK1 BIT(12) -+#define SERDES_CONF_UNK2 BIT(13) -+#define SERDES_CONF_UNK3 BIT(14) -+#define SERDES_CONF_NO_DATA_FEEDBACK BIT(14) -+#define SERDES_CONF_SYNC_SEL GENMASK(18, 16) -+#define SERDES_CONF_SOME_RST BIT(19) -+#define REG_TX_SERDES_BITSTART 0x08 -+#define REG_RX_SERDES_BITSTART 0x0c -+#define REG_TX_SERDES_SLOTMASK 0x0c -+#define REG_RX_SERDES_SLOTMASK 0x10 -+#define REG_RX_SERDES_PORT 0x04 -+ -+/* relative to switch base */ -+#define REG_DMA_ADAPTER_A(cl) (0x8000 * (cl)) -+#define REG_DMA_ADAPTER_B(cl) (0x8000 * (cl) + 0x4000) -+#define DMA_ADAPTER_TX_LSB_PAD GENMASK(4, 0) -+#define DMA_ADAPTER_TX_NCHANS GENMASK(6, 5) -+#define DMA_ADAPTER_RX_MSB_PAD GENMASK(12, 8) -+#define DMA_ADAPTER_RX_NCHANS GENMASK(14, 13) -+#define DMA_ADAPTER_NCHANS GENMASK(22, 20) -+ -+#define SWITCH_STRIDE 0x8000 -+#define CLUSTER_STRIDE 0x4000 -+ -+#define MAX_NCLUSTERS 6 -+ -+struct mca_dai { -+ struct mca_route *in_route; -+ unsigned int tdm_slots; -+ unsigned int tdm_slot_width; -+ unsigned int tdm_tx_mask; -+ unsigned int tdm_rx_mask; -+ unsigned long set_sysclk; -+ u32 fmt_bitstart; -+ bool fmt_bclk_inv; -+}; -+ -+struct mca_cluster { -+ int no; -+ struct mca_data *host; -+ struct device *pd_dev; -+ struct clk *clk_parent; -+ struct dma_chan *dma_chans[SNDRV_PCM_STREAM_LAST + 1]; -+ struct mca_dai port; -+}; -+ -+#define mca_dai_to_cluster(dai) \ -+ container_of(dai, struct mca_cluster, port) -+ -+struct mca_data { -+ struct device *dev; -+ -+ __iomem void *base; -+ __iomem void *switch_base; -+ -+ struct device *pd_dev; -+ struct device_link *pd_link; -+ -+ int nclusters; -+ struct mca_cluster clusters[]; -+}; -+ -+struct mca_route { -+ struct mca_data *host; -+ -+ struct clk *clk_parent; -+ bool clocks_in_use[SNDRV_PCM_STREAM_LAST + 1]; -+ -+ struct device_link *pd_link; -+ -+ /* -+ * Cluster selectors for different facilities -+ * that constitute the 'route' -+ */ -+ int clock; -+ int syncgen; -+ int serdes; -+ -+ int ndais; -+ struct mca_dai *dais[]; -+}; -+ -+static struct mca_route *mca_route_for_rtd(struct snd_soc_pcm_runtime *rtd) -+{ -+ struct snd_soc_dai *dai = asoc_rtd_to_cpu(rtd, 0); -+ struct mca_data *mca = snd_soc_dai_get_drvdata(dai); -+ return mca->clusters[dai->id].port.in_route; -+} -+ -+static struct mca_dai *mca_dai_for_soc_dai(struct snd_soc_dai *dai) -+{ -+ struct mca_data *mca = snd_soc_dai_get_drvdata(dai); -+ return &mca->clusters[dai->id].port; -+} -+ -+static u32 mca_peek(struct mca_data *mca, int cluster, int regoffset) -+{ -+ int offset = (CLUSTER_STRIDE * cluster) + regoffset; -+ -+ return readl_relaxed(mca->base + offset); -+} -+ -+static void mca_poke(struct mca_data *mca, int cluster, -+ int regoffset, u32 val) -+{ -+ int offset = (CLUSTER_STRIDE * cluster) + regoffset; -+ dev_dbg(mca->dev, "regs: %x <- %x\n", offset, val); -+ writel_relaxed(val, mca->base + offset); -+} -+ -+static void mca_modify(struct mca_data *mca, int cluster, -+ int regoffset, u32 mask, u32 val) -+{ -+ int offset = (CLUSTER_STRIDE * cluster) + regoffset; -+ __iomem void *p = mca->base + offset; -+ u32 newval = (val & mask) | (readl_relaxed(p) & ~mask); -+ dev_dbg(mca->dev, "regs: %x <- %x\n", offset, newval); -+ writel_relaxed(newval, p); -+} -+ -+static int mca_reset_dais(struct mca_route *route, -+ struct snd_pcm_substream *substream, int cmd) -+{ -+ struct mca_data *mca = route->host; -+ bool is_tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; -+ int serdes_unit = is_tx ? CLUSTER_TX_OFF : CLUSTER_RX_OFF; -+ -+ switch (cmd) { -+ case SNDRV_PCM_TRIGGER_START: -+ case SNDRV_PCM_TRIGGER_RESUME: -+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: -+ mca_modify(mca, route->serdes, -+ serdes_unit + REG_SERDES_STATUS, -+ SERDES_STATUS_EN | SERDES_STATUS_RST, -+ SERDES_STATUS_RST); -+ mca_modify(mca, route->serdes, -+ serdes_unit + -+ (is_tx ? REG_TX_SERDES_CONF : REG_RX_SERDES_CONF), -+ SERDES_CONF_SOME_RST, SERDES_CONF_SOME_RST); -+ (void)mca_peek(mca, route->serdes, -+ serdes_unit + -+ (is_tx ? REG_TX_SERDES_CONF : REG_RX_SERDES_CONF)); -+ mca_modify(mca, route->serdes, -+ serdes_unit + -+ (is_tx ? REG_TX_SERDES_CONF : REG_RX_SERDES_CONF), -+ SERDES_STATUS_RST, 0); -+ WARN_ON(mca_peek(mca, route->serdes, REG_SERDES_STATUS) -+ & SERDES_STATUS_RST); -+ -+ dev_dbg(mca->dev, "trigger reset\n"); -+ break; -+ case SNDRV_PCM_TRIGGER_STOP: -+ case SNDRV_PCM_TRIGGER_SUSPEND: -+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH: -+ break; -+ default: -+ return -EINVAL; -+ } -+ return 0; -+} -+ -+static int mca_trigger_dais(struct mca_route *route, -+ struct snd_pcm_substream *substream, int cmd) -+{ -+ struct mca_data *mca = route->host; -+ bool is_tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; -+ int serdes_unit = is_tx ? CLUSTER_TX_OFF : CLUSTER_RX_OFF; -+ -+ switch (cmd) { -+ case SNDRV_PCM_TRIGGER_START: -+ case SNDRV_PCM_TRIGGER_RESUME: -+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: -+ mca_modify(mca, route->serdes, -+ serdes_unit + REG_SERDES_STATUS, -+ SERDES_STATUS_EN | SERDES_STATUS_RST, -+ SERDES_STATUS_EN); -+ -+ dev_dbg(mca->dev, "trigger start\n"); -+ break; -+ case SNDRV_PCM_TRIGGER_STOP: -+ case SNDRV_PCM_TRIGGER_SUSPEND: -+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH: -+ mca_modify(mca, route->serdes, -+ serdes_unit + REG_SERDES_STATUS, -+ SERDES_STATUS_EN, 0); -+ -+ dev_dbg(mca->dev, "trigger stop\n"); -+ break; -+ default: -+ return -EINVAL; -+ } -+ return 0; -+} -+ -+static bool mca_clocks_in_use(struct mca_route *route) -+{ -+ int stream; -+ -+ for_each_pcm_streams(stream) -+ if (route->clocks_in_use[stream]) -+ return true; -+ return false; -+} -+ -+static int mca_prepare(struct snd_soc_component *component, -+ struct snd_pcm_substream *substream) -+{ -+ struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); -+ struct mca_route *route = mca_route_for_rtd(rtd); -+ struct mca_data *mca = route->host; -+ struct mca_cluster *cluster; -+ -+ int ret; -+ -+ if (!mca_clocks_in_use(route)) { -+ ret = clk_prepare_enable(route->clk_parent); -+ if (ret) { -+ dev_err(mca->dev, "unable to enable parent clock %d: %d\n", -+ route->clock, ret); -+ return ret; -+ } -+ -+ /* -+ * We only prop-up PD of the syncgen cluster. That is okay -+ * in combination with the way we are constructing 'routes' -+ * where only single cluster needs powering up. -+ */ -+ cluster = &mca->clusters[route->syncgen]; -+ route->pd_link = device_link_add(rtd->dev, cluster->pd_dev, -+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | -+ DL_FLAG_RPM_ACTIVE); -+ if (!route->pd_link) { -+ dev_err(mca->dev, "unable to prop-up cluster's power domain " -+ "(cluster %d)\n", route->syncgen); -+ clk_disable_unprepare(route->clk_parent); -+ return -EINVAL; -+ } -+ -+ mca_poke(mca, route->syncgen, REG_SYNCGEN_MCLK_SEL, -+ route->clock + 1); -+ mca_modify(mca, route->syncgen, -+ REG_SYNCGEN_STATUS, -+ SYNCGEN_STATUS_EN, SYNCGEN_STATUS_EN); -+ mca_modify(mca, route->clock, -+ REG_STATUS, -+ STATUS_MCLK_EN, STATUS_MCLK_EN); -+ } -+ -+ route->clocks_in_use[substream->stream] = true; -+ -+ return 0; -+} -+ -+static int mca_hw_free(struct snd_soc_component *component, -+ struct snd_pcm_substream *substream) -+{ -+ struct mca_route *route = mca_route_for_rtd(asoc_substream_to_rtd(substream)); -+ struct mca_data *mca = route->host; -+ -+ if (!mca_clocks_in_use(route)) -+ return 0; /* Nothing to do */ -+ -+ route->clocks_in_use[substream->stream] = false; -+ -+ if (!mca_clocks_in_use(route)) { -+ mca_modify(mca, route->syncgen, -+ REG_SYNCGEN_STATUS, -+ SYNCGEN_STATUS_EN, 0); -+ mca_modify(mca, route->clock, -+ REG_STATUS, -+ STATUS_MCLK_EN, 0); -+ -+ device_link_del(route->pd_link); -+ clk_disable_unprepare(route->clk_parent); -+ } -+ -+ return 0; -+} -+ -+#define div_ceil(A, B) ((A)/(B) + ((A)%(B) ? 1 : 0)) -+ -+static int mca_configure_serdes(struct mca_data *mca, int cluster, int serdes_unit, -+ unsigned int mask, int slots, int nchans, int slot_width, bool is_tx, int port) -+{ -+ u32 serdes_conf; -+ -+ serdes_conf = FIELD_PREP(SERDES_CONF_NCHANS, max(slots, 1) - 1); -+ -+ switch (slot_width) { -+ case 16: -+ serdes_conf |= SERDES_CONF_WIDTH_16BIT; -+ break; -+ case 20: -+ serdes_conf |= SERDES_CONF_WIDTH_20BIT; -+ break; -+ case 24: -+ serdes_conf |= SERDES_CONF_WIDTH_24BIT; -+ break; -+ case 32: -+ serdes_conf |= SERDES_CONF_WIDTH_32BIT; -+ break; -+ default: -+ goto err; -+ } -+ -+ mca_modify(mca, cluster, -+ serdes_unit + (is_tx ? REG_TX_SERDES_CONF : REG_RX_SERDES_CONF), -+ SERDES_CONF_WIDTH_MASK | SERDES_CONF_NCHANS, serdes_conf); -+ -+ if (is_tx) { -+ mca_poke(mca, cluster, -+ serdes_unit + REG_TX_SERDES_SLOTMASK, -+ 0xffffffff); -+ /* -+ * TODO: Actually consider where the hot bits -+ * are placed in the mask, instead of assuming -+ * it's the bottom bits. -+ */ -+ mca_poke(mca, cluster, -+ serdes_unit + REG_TX_SERDES_SLOTMASK + 0x4, -+ ~((u32) mask & ((1 << nchans) - 1))); -+ mca_poke(mca, cluster, -+ serdes_unit + REG_TX_SERDES_SLOTMASK + 0x8, -+ 0xffffffff); -+ mca_poke(mca, cluster, -+ serdes_unit + REG_TX_SERDES_SLOTMASK + 0xc, -+ ~((u32) mask)); -+ } else { -+ mca_poke(mca, cluster, -+ serdes_unit + REG_RX_SERDES_SLOTMASK, -+ 0xffffffff); -+ mca_poke(mca, cluster, -+ serdes_unit + REG_RX_SERDES_SLOTMASK + 0x4, -+ ~((u32) mask)); -+ mca_poke(mca, cluster, -+ serdes_unit + REG_RX_SERDES_PORT, -+ 1 << port); -+ } -+ -+ return 0; -+ -+err: -+ dev_err(mca->dev, "unsupported SERDES configuration requested (mask=0x%x slots=%d slot_width=%d)\n", -+ mask, slots, slot_width); -+ return -EINVAL; -+} -+ -+static int mca_dai_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, -+ unsigned int rx_mask, int slots, int slot_width) -+{ -+ struct mca_dai *mdai = mca_dai_for_soc_dai(dai); -+ -+ mdai->tdm_slots = slots; -+ mdai->tdm_slot_width = slot_width; -+ mdai->tdm_tx_mask = tx_mask; -+ mdai->tdm_rx_mask = rx_mask; -+ -+ return 0; -+} -+ -+static int mca_dai_set_fmt(struct snd_soc_dai *dai, -+ unsigned int fmt) -+{ -+ struct mca_data *mca = snd_soc_dai_get_drvdata(dai); -+ struct mca_dai *mdai = mca_dai_for_soc_dai(dai); -+ struct mca_route *route = mdai->in_route; -+ bool bclk_inv = false, fpol_inv = false; -+ u32 bitstart; -+ -+ if (WARN_ON(route)) -+ return -EBUSY; -+ -+ if ((fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) != -+ SND_SOC_DAIFMT_CBC_CFC) -+ goto err; -+ -+ switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { -+ case SND_SOC_DAIFMT_I2S: -+ fpol_inv = 0; -+ bitstart = 1; -+ break; -+ case SND_SOC_DAIFMT_LEFT_J: -+ fpol_inv = 1; -+ bitstart = 0; -+ break; -+ default: -+ goto err; -+ } -+ -+ switch (fmt & SND_SOC_DAIFMT_INV_MASK) { -+ case SND_SOC_DAIFMT_NB_IF: -+ case SND_SOC_DAIFMT_IB_IF: -+ fpol_inv ^= 1; -+ break; -+ } -+ -+ switch (fmt & SND_SOC_DAIFMT_INV_MASK) { -+ case SND_SOC_DAIFMT_NB_NF: -+ case SND_SOC_DAIFMT_NB_IF: -+ bclk_inv = true; -+ } -+ -+ if (!fpol_inv) -+ goto err; -+ -+ mdai->fmt_bitstart = bitstart; -+ mdai->fmt_bclk_inv = bclk_inv; -+ -+ return 0; -+ -+err: -+ dev_err(mca->dev, "unsupported DAI format (0x%x) requested\n", fmt); -+ return -EINVAL; -+} -+ -+static int mca_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id, -+ unsigned int freq, int dir) -+{ -+ int ret; -+ -+ struct mca_dai *mdai = mca_dai_for_soc_dai(dai); -+ struct mca_route *route = mdai->in_route; -+ -+ if (freq == mdai->set_sysclk) -+ return 0; -+ -+ if (mca_clocks_in_use(route)) -+ return -EBUSY; -+ -+ ret = clk_set_rate(route->clk_parent, freq); -+ if (!ret) -+ mdai->set_sysclk = freq; -+ return ret; -+} -+ -+static const struct snd_soc_dai_ops mca_dai_ops = { -+ .set_fmt = mca_dai_set_fmt, -+ .set_sysclk = mca_dai_set_sysclk, -+ .set_tdm_slot = mca_dai_set_tdm_slot, -+}; -+ -+static int mca_set_runtime_hwparams(struct snd_soc_component *component, -+ struct snd_pcm_substream *substream, struct dma_chan *chan) -+{ -+ struct device *dma_dev = chan->device->dev; -+ struct snd_dmaengine_dai_dma_data dma_data = {}; -+ int ret; -+ -+ struct snd_pcm_hardware hw; -+ -+ memset(&hw, 0, sizeof(hw)); -+ -+ hw.info = SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | -+ SNDRV_PCM_INFO_INTERLEAVED; -+ hw.periods_min = 2; -+ hw.periods_max = UINT_MAX; -+ hw.period_bytes_min = 256; -+ hw.period_bytes_max = dma_get_max_seg_size(dma_dev); -+ hw.buffer_bytes_max = SIZE_MAX; -+ hw.fifo_size = 16; -+ -+ ret = snd_dmaengine_pcm_refine_runtime_hwparams(substream, -+ &dma_data, &hw, chan); -+ -+ if (ret) -+ return ret; -+ -+ return snd_soc_set_runtime_hwparams(substream, &hw); -+} -+ -+static int mca_pcm_open(struct snd_soc_component *component, -+ struct snd_pcm_substream *substream) -+{ -+ struct mca_data *mca = snd_soc_component_get_drvdata(component); -+ struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); -+ struct mca_route *route = mca_route_for_rtd(rtd); -+ struct dma_chan *chan = mca->clusters[route->serdes].dma_chans[substream->stream]; -+ int ret, i; -+ -+ if (WARN_ON(!route)) -+ return -EINVAL; -+ -+ for (i = 0; i < route->ndais; i++) { -+ int dai_no = mca_dai_to_cluster(route->dais[i])->no; -+ -+ mca_poke(mca, dai_no, REG_PORT_ENABLES, -+ PORT_ENABLES_CLOCKS | PORT_ENABLES_TX_DATA); -+ mca_poke(mca, dai_no, REG_PORT_CLOCK_SEL, -+ FIELD_PREP(PORT_CLOCK_SEL, route->syncgen + 1)); -+ mca_poke(mca, dai_no, REG_PORT_DATA_SEL, -+ PORT_DATA_SEL_TXA(route->serdes)); -+ } -+ -+ switch (substream->stream) { -+ case SNDRV_PCM_STREAM_PLAYBACK: -+ mca_modify(mca, route->serdes, CLUSTER_TX_OFF + REG_TX_SERDES_CONF, -+ SERDES_CONF_UNK1 | SERDES_CONF_UNK2 | SERDES_CONF_UNK3, -+ SERDES_CONF_UNK1 | SERDES_CONF_UNK2 | SERDES_CONF_UNK3); -+ mca_modify(mca, route->serdes, CLUSTER_TX_OFF + REG_TX_SERDES_CONF, -+ SERDES_CONF_SYNC_SEL, -+ FIELD_PREP(SERDES_CONF_SYNC_SEL, route->syncgen + 1)); -+ break; -+ -+ case SNDRV_PCM_STREAM_CAPTURE: -+ mca_modify(mca, route->serdes, CLUSTER_RX_OFF + REG_RX_SERDES_CONF, -+ SERDES_CONF_UNK1 | SERDES_CONF_UNK2 | SERDES_CONF_UNK3 -+ | SERDES_CONF_NO_DATA_FEEDBACK, -+ SERDES_CONF_UNK1 | SERDES_CONF_UNK2 -+ | SERDES_CONF_NO_DATA_FEEDBACK); -+ mca_modify(mca, route->serdes, CLUSTER_RX_OFF + REG_RX_SERDES_CONF, -+ SERDES_CONF_SYNC_SEL, -+ FIELD_PREP(SERDES_CONF_SYNC_SEL, route->syncgen + 1)); -+ break; -+ -+ default: -+ break; -+ } -+ -+ ret = mca_set_runtime_hwparams(component, substream, chan); -+ if (ret) -+ return ret; -+ -+ return snd_dmaengine_pcm_open(substream, chan); -+} -+ -+static int mca_hw_params_dma(struct snd_soc_component *component, -+ struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *params) -+{ -+ struct dma_chan *chan = snd_dmaengine_pcm_get_chan(substream); -+ struct dma_slave_config slave_config; -+ int ret; -+ -+ memset(&slave_config, 0, sizeof(slave_config)); -+ ret = snd_hwparams_to_dma_slave_config(substream, params, &slave_config); -+ if (ret < 0) -+ return ret; -+ -+ if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) -+ slave_config.dst_port_window_size = min((int) params_channels(params), 4); -+ else -+ slave_config.src_port_window_size = min((int) params_channels(params), 4); -+ -+ return dmaengine_slave_config(chan, &slave_config); -+} -+ -+static int mca_get_dais_tdm_slots(struct mca_route *route, bool is_tx, -+ int *slot_width, int *slots, int *mask) -+{ -+ struct mca_dai *mdai; -+ unsigned int tdm_slot_width, tdm_tx_mask, tdm_rx_mask; -+ unsigned int tdm_slots = 0; -+ int i; -+ -+#define __pick_up_dai_tdm_param(param) \ -+ { \ -+ if (tdm_slots && mdai->param != param) \ -+ return -EINVAL; \ -+ param = mdai->param; \ -+ } -+ -+ for (i = 0; i < route->ndais; i++) { -+ mdai = route->dais[i]; -+ -+ if (mdai->tdm_slots) { -+ if (is_tx) { -+ __pick_up_dai_tdm_param(tdm_tx_mask); -+ } else { -+ __pick_up_dai_tdm_param(tdm_rx_mask); -+ } -+ -+ __pick_up_dai_tdm_param(tdm_slot_width); -+ __pick_up_dai_tdm_param(tdm_slots); -+ } -+ } -+ -+ if (tdm_slots) { -+ *slots = tdm_slots; -+ *slot_width = tdm_slot_width; -+ *mask = is_tx ? tdm_tx_mask : tdm_rx_mask; -+ } -+ -+ return 0; -+} -+ -+static int mca_get_dais_sysclk(struct mca_route *route, unsigned long *sysclk) -+{ -+ struct mca_dai *mdai; -+ unsigned long set_sysclk = 0; -+ int i; -+ -+ for (i = 0; i < route->ndais; i++) { -+ mdai = route->dais[i]; -+ -+ if (!mdai->set_sysclk) -+ continue; -+ -+ if (set_sysclk && mdai->set_sysclk != set_sysclk) -+ return -EINVAL; -+ -+ set_sysclk = mdai->set_sysclk; -+ } -+ -+ if (set_sysclk) -+ *sysclk = set_sysclk; -+ -+ return 0; -+} -+ -+static int mca_hw_params_dais(struct mca_route *route, -+ struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *params) -+{ -+ struct mca_data *mca = route->host; -+ struct device *dev = route->host->dev; -+ bool is_tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; -+ unsigned int samp_rate = params_rate(params); -+ bool refine_tdm = false; -+ unsigned int tdm_slots, tdm_slot_width, tdm_mask; -+ unsigned long bclk_ratio; -+ unsigned long sysclk; -+ u32 regval, pad; -+ int ret, dai_no, nchans_ceiled; -+ -+ tdm_slot_width = 0; -+ ret = mca_get_dais_tdm_slots(route, is_tx, -+ &tdm_slot_width, &tdm_slots, &tdm_mask); -+ -+ if (ret < 0) { -+ dev_err(dev, "bad dai TDM settings\n"); -+ return ret; -+ } -+ -+ if (!tdm_slot_width) { -+ /* -+ * We were not given TDM settings from above, set initial -+ * guesses which will later be refined. -+ */ -+ tdm_slot_width = params_width(params); -+ tdm_slots = params_channels(params); -+ refine_tdm = true; -+ } -+ -+ sysclk = 0; -+ ret = mca_get_dais_sysclk(route, &sysclk); -+ -+ if (ret < 0) { -+ dev_err(dev, "bad dai sysclk settings\n"); -+ return ret; -+ } -+ -+ if (sysclk) { -+ bclk_ratio = sysclk / samp_rate; -+ } else { -+ bclk_ratio = tdm_slot_width * tdm_slots; -+ } -+ -+ if (refine_tdm) { -+ int nchannels = params_channels(params); -+ -+ if (nchannels > 2) { -+ dev_err(dev, "nchannels > 2 and no TDM\n"); -+ return -EINVAL; -+ } -+ -+ if ((bclk_ratio % nchannels) != 0) { -+ dev_err(dev, "bclk ratio (%ld) not divisible by nchannels (%d)\n", -+ bclk_ratio, nchannels); -+ return -EINVAL; -+ } -+ -+ tdm_slot_width = bclk_ratio / nchannels; -+ -+ if (tdm_slot_width > 32 && nchannels == 1) -+ tdm_slot_width = 32; -+ -+ if (tdm_slot_width < params_width(params)) { -+ dev_err(dev, "TDM slots too narrow tdm=%d params=%d\n", -+ tdm_slot_width, params_width(params)); -+ return -EINVAL; -+ } -+ -+ tdm_mask = (1 << tdm_slots) - 1; -+ } -+ -+ dai_no = mca_dai_to_cluster(route->dais[0])->no; -+ -+ ret = mca_configure_serdes(mca, route->serdes, is_tx ? CLUSTER_TX_OFF : CLUSTER_RX_OFF, -+ tdm_mask, tdm_slots, params_channels(params), -+ tdm_slot_width, is_tx, dai_no); -+ if (ret) -+ return ret; -+ -+ pad = 32 - params_width(params); -+ -+ /* -+ * TODO: Here the register semantics aren't clear. -+ */ -+ nchans_ceiled = min((int) params_channels(params), 4); -+ regval = FIELD_PREP(DMA_ADAPTER_NCHANS, nchans_ceiled) -+ | FIELD_PREP(DMA_ADAPTER_TX_NCHANS, 0x2) -+ | FIELD_PREP(DMA_ADAPTER_RX_NCHANS, 0x2) -+ | FIELD_PREP(DMA_ADAPTER_TX_LSB_PAD, pad) -+ | FIELD_PREP(DMA_ADAPTER_RX_MSB_PAD, pad); -+ -+#ifndef USE_RXB_FOR_CAPTURE -+ writel_relaxed(regval, mca->switch_base + REG_DMA_ADAPTER_A(route->serdes)); -+#else -+ if (is_tx) -+ writel_relaxed(regval, mca->switch_base + REG_DMA_ADAPTER_A(route->serdes)); -+ else -+ writel_relaxed(regval, mca->switch_base + REG_DMA_ADAPTER_B(route->serdes)); -+#endif -+ -+ if (!mca_clocks_in_use(route)) { -+ /* -+ * Set up FSYNC duty cycle to be as even as possible. -+ */ -+ mca_poke(mca, route->syncgen, -+ REG_SYNCGEN_HI_PERIOD, -+ (bclk_ratio / 2) - 1); -+ mca_poke(mca, route->syncgen, -+ REG_SYNCGEN_LO_PERIOD, -+ ((bclk_ratio + 1) / 2) - 1); -+ -+ mca_poke(mca, route->clock, -+ REG_MCLK_CONF, -+ FIELD_PREP(MCLK_CONF_DIV, 0x1)); -+ -+ ret = clk_set_rate(route->clk_parent, bclk_ratio * samp_rate); -+ if (ret) { -+ dev_err(mca->dev, "unable to set parent clock %d: %d\n", -+ route->clock, ret); -+ return ret; -+ } -+ } -+ -+ return 0; -+} -+ -+static int mca_hw_params(struct snd_soc_component *component, -+ struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *params) -+{ -+ struct mca_route *route = mca_route_for_rtd( -+ asoc_substream_to_rtd(substream)); -+ int ret; -+ -+ ret = mca_hw_params_dma(component, substream, params); -+ if (ret < 0) -+ return ret; -+ -+ return mca_hw_params_dais(route, substream, params); -+} -+ -+static int mca_close(struct snd_soc_component *component, -+ struct snd_pcm_substream *substream) -+{ -+ return snd_dmaengine_pcm_close(substream); -+} -+ -+#if 0 -+static void mca_flush_adapter_fifo(struct mca_route *route) -+{ -+ struct mca_data *mca = route->host; -+ int i; -+ u32 ptr; -+ -+ ptr = readl_relaxed(mca->switch_base + REG_DMA_ADAPTER_A(route->serdes) + 0x8); -+ dev_dbg(route->host->dev, "flush fifo: entered at %x\n", ptr); -+ -+ for (i = 0; i < 256; i++) { -+ if (ptr == 0xbc) -+ break; -+ -+ writel_relaxed(0, mca->switch_base + REG_DMA_ADAPTER_A(route->serdes) + 0xc); -+ (void) readl_relaxed(mca->switch_base + REG_DMA_ADAPTER_A(route->serdes) + 0xc); -+ -+ ptr = readl_relaxed(mca->switch_base + REG_DMA_ADAPTER_A(route->serdes) + 0x8); -+ } -+ -+ dev_dbg(route->host->dev, "flush fifo: left at %x\n", ptr); -+} -+#endif -+ -+static int mca_trigger(struct snd_soc_component *component, -+ struct snd_pcm_substream *substream, int cmd) -+{ -+ struct mca_route *route = mca_route_for_rtd(asoc_substream_to_rtd(substream)); -+ int ret; -+ -+ switch (cmd) { -+ case SNDRV_PCM_TRIGGER_START: -+ case SNDRV_PCM_TRIGGER_RESUME: -+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: -+ ret = mca_reset_dais(route, substream, cmd); -+ if (ret < 0) -+ return ret; -+ -+ //mca_flush_adapter_fifo(route); -+ -+ ret = snd_dmaengine_pcm_trigger(substream, cmd); -+ if (ret < 0) -+ return ret; -+ -+ ret = mca_trigger_dais(route, substream, cmd); -+ if (ret < 0) -+ goto revert_dmaengine; -+ return 0; -+ -+ case SNDRV_PCM_TRIGGER_STOP: -+ case SNDRV_PCM_TRIGGER_SUSPEND: -+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH: -+ ret = mca_trigger_dais(route, substream, cmd); -+ if (ret < 0) -+ return ret; -+ -+ return snd_dmaengine_pcm_trigger(substream, cmd); -+ } -+ -+revert_dmaengine: -+ switch (cmd) { -+ case SNDRV_PCM_TRIGGER_START: -+ snd_dmaengine_pcm_trigger(substream, SNDRV_PCM_TRIGGER_STOP); -+ break; -+ -+ case SNDRV_PCM_TRIGGER_RESUME: -+ snd_dmaengine_pcm_trigger(substream, SNDRV_PCM_TRIGGER_STOP); -+ break; -+ -+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: -+ snd_dmaengine_pcm_trigger(substream, SNDRV_PCM_TRIGGER_PAUSE_PUSH); -+ break; -+ } -+ -+ return ret; -+} -+ -+static snd_pcm_uframes_t mca_pointer(struct snd_soc_component *component, -+ struct snd_pcm_substream *substream) -+{ -+ return snd_dmaengine_pcm_pointer(substream); -+} -+ -+static int mca_pcm_new(struct snd_soc_component *component, -+ struct snd_soc_pcm_runtime *rtd) -+{ -+ struct mca_data *mca = snd_soc_component_get_drvdata(component); -+ struct mca_route *route; -+ struct snd_soc_dai *dai; -+ struct mca_dai *mdai; -+ struct mca_cluster *cluster; -+ unsigned int i; -+ int ret = 0; -+ -+ route = devm_kzalloc(mca->dev, struct_size(route, dais, rtd->num_cpus), GFP_KERNEL); -+ -+ if (!route) -+ return -ENOMEM; -+ -+ route->host = mca; -+ -+ for_each_rtd_cpu_dais(rtd, i, dai) { -+ if (dai->component != component) { -+ dev_err(mca->dev, "foreign CPU dai in PCM\n"); -+ goto exit_free; -+ } -+ -+ mdai = &mca->clusters[dai->id].port; -+ -+ if (WARN_ON(mdai->in_route)) { -+ ret = -EINVAL; -+ goto exit_free; -+ } -+ -+ mdai->in_route = route; -+ route->dais[i] = mdai; -+ } -+ route->ndais = rtd->num_cpus; -+ -+ /* -+ * Pick facilities from cluster of the first dai. -+ */ -+ cluster = mca_dai_to_cluster(route->dais[0]); -+ -+ route->clock = cluster->no; -+ route->syncgen = cluster->no; -+ route->serdes = cluster->no; -+ -+ route->clk_parent = cluster->clk_parent; -+ -+ for_each_pcm_streams(i) { -+ struct snd_pcm_substream *substream = rtd->pcm->streams[i].substream; -+ struct dma_chan *chan = cluster->dma_chans[i]; -+ -+ if (!substream) -+ continue; -+ -+ if (!chan) { -+ dev_err(component->dev, "missing DMA channel for stream %d " -+ "on serdes %d\n", i, route->serdes); -+ return -EINVAL; -+ } -+ -+ snd_pcm_set_managed_buffer(substream, SNDRV_DMA_TYPE_DEV_IRAM, -+ chan->device->dev, 512*1024*6, -+ SIZE_MAX); -+ } -+ -+ /* Look at the first dai for daifmt settings */ -+ mdai = route->dais[0]; -+ -+ mca_modify(mca, route->serdes, CLUSTER_TX_OFF + REG_TX_SERDES_CONF, -+ SERDES_CONF_BCLK_POL, -+ mdai->fmt_bclk_inv ? SERDES_CONF_BCLK_POL : 0); -+ mca_poke(mca, route->serdes, CLUSTER_TX_OFF + REG_TX_SERDES_BITSTART, -+ mdai->fmt_bitstart); -+ mca_modify(mca, route->serdes, CLUSTER_RX_OFF + REG_RX_SERDES_CONF, -+ SERDES_CONF_BCLK_POL, -+ mdai->fmt_bclk_inv ? SERDES_CONF_BCLK_POL : 0); -+ mca_poke(mca, route->serdes, CLUSTER_RX_OFF + REG_RX_SERDES_BITSTART, -+ mdai->fmt_bitstart); -+ -+ return ret; -+ -+exit_free: -+ devm_kfree(mca->dev, route); -+ return ret; -+} -+ -+static void mca_pcm_free(struct snd_soc_component *component, -+ struct snd_pcm *pcm) -+{ -+ struct mca_data *mca = snd_soc_component_get_drvdata(component); -+ struct mca_route *route = mca_route_for_rtd(asoc_pcm_to_rtd(pcm)); -+ int i; -+ -+ for (i = 0; i < route->ndais; i++) -+ route->dais[i]->in_route = NULL; -+ -+ devm_kfree(mca->dev, route); -+} -+ -+#if 0 -+static irqreturn_t mca_interrupt(int irq, void *devid) -+{ -+ struct mca_cluster *cl = devid; -+ struct mca_data *mca = cl->host; -+ u32 mask = mca_peek(mca, cl->no, REG_INTMASK); -+ u32 state = mca_peek(mca, cl->no, REG_INTSTATE); -+ u32 cleared; -+ -+ mca_poke(mca, cl->no, REG_INTSTATE, state & mask); -+ cleared = state & ~mca_peek(mca, cl->no, REG_INTSTATE); -+ -+ dev_dbg(mca->dev, "cl%d: took an interrupt. state=%x mask=%x unmasked=%x cleared=%x\n", -+ cl->no, state, mask, state & mask, cleared); -+ -+ mca_poke(mca, cl->no, REG_INTMASK, mask & (~state | cleared)); -+ -+ return true ? IRQ_HANDLED : IRQ_NONE; -+} -+#endif -+ -+static const struct snd_soc_component_driver mca_component = { -+ .name = "apple-mca", -+ .open = mca_pcm_open, -+ .close = mca_close, -+ .prepare = mca_prepare, -+ .hw_free = mca_hw_free, -+ .hw_params = mca_hw_params, -+ .trigger = mca_trigger, -+ .pointer = mca_pointer, -+ .pcm_construct = mca_pcm_new, -+ .pcm_destruct = mca_pcm_free, -+}; -+ -+static void apple_mca_release(struct mca_data *mca) -+{ -+ int i, stream; -+ -+ for (i = 0; i < mca->nclusters; i++) { -+ struct mca_cluster *cl = &mca->clusters[i]; -+ -+ for_each_pcm_streams(stream) { -+ if (IS_ERR_OR_NULL(cl->dma_chans[stream])) -+ continue; -+ -+ dma_release_channel(cl->dma_chans[stream]); -+ } -+ -+ if (!IS_ERR_OR_NULL(cl->clk_parent)) -+ clk_put(cl->clk_parent); -+ -+ if (!IS_ERR_OR_NULL(cl->pd_dev)) -+ dev_pm_domain_detach(cl->pd_dev, true); -+ } -+ -+ if (mca->pd_link) -+ device_link_del(mca->pd_link); -+ -+ if (!IS_ERR_OR_NULL(mca->pd_dev)) -+ dev_pm_domain_detach(mca->pd_dev, true); -+} -+ -+static int apple_mca_probe(struct platform_device *pdev) -+{ -+ struct mca_data *mca; -+ struct mca_cluster *clusters; -+ struct snd_soc_dai_driver *dai_drivers; -+ int nclusters; -+ int irq, ret, i; -+ -+ ret = of_property_read_u32(pdev->dev.of_node, "apple,nclusters", &nclusters); -+ if (ret || nclusters > MAX_NCLUSTERS) { -+ dev_err(&pdev->dev, "missing or invalid apple,nclusters property\n"); -+ return -EINVAL; -+ } -+ -+ mca = devm_kzalloc(&pdev->dev, struct_size(mca, clusters, nclusters), -+ GFP_KERNEL); -+ if (!mca) -+ return -ENOMEM; -+ -+ mca->dev = &pdev->dev; -+ mca->nclusters = nclusters; -+ platform_set_drvdata(pdev, mca); -+ clusters = mca->clusters; -+ -+ mca->base = devm_platform_ioremap_resource_byname(pdev, "clusters"); -+ if (IS_ERR(mca->base)) { -+ dev_err(&pdev->dev, "unable to obtain clusters MMIO resource: %ld\n", -+ PTR_ERR(mca->base)); -+ return PTR_ERR(mca->base); -+ } -+ -+ mca->switch_base = devm_platform_ioremap_resource_byname(pdev, "switch"); -+ if (IS_ERR(mca->switch_base)) { -+ dev_err(&pdev->dev, "unable to obtain switch MMIO resource: %ld\n", -+ PTR_ERR(mca->switch_base)); -+ return PTR_ERR(mca->switch_base); -+ } -+ -+ { -+ struct reset_control *rst; -+ rst = of_reset_control_array_get(pdev->dev.of_node, true, true, false); -+ if (IS_ERR(rst)) { -+ dev_err(&pdev->dev, "unable to obtain reset control: %ld\n", -+ PTR_ERR(rst)); -+ } else if (rst) { -+ reset_control_reset(rst); -+ reset_control_put(rst); -+ } -+ } -+ -+ dai_drivers = devm_kzalloc(&pdev->dev, sizeof(*dai_drivers) * nclusters, -+ GFP_KERNEL); -+ if (!dai_drivers) -+ return -ENOMEM; -+ -+ mca->pd_dev = dev_pm_domain_attach_by_id(&pdev->dev, 0); -+ if (IS_ERR(mca->pd_dev)) -+ return -EINVAL; -+ -+ mca->pd_link = device_link_add(&pdev->dev, mca->pd_dev, -+ DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | -+ DL_FLAG_RPM_ACTIVE); -+ if (!mca->pd_link) { -+ ret = -EINVAL; -+ goto err_release; -+ } -+ -+ for (i = 0; i < nclusters; i++) { -+ struct mca_cluster *cl = &clusters[i]; -+ struct snd_soc_dai_driver *drv = &dai_drivers[i]; -+ int stream; -+ -+ cl->host = mca; -+ cl->no = i; -+ -+ cl->clk_parent = of_clk_get(pdev->dev.of_node, i); -+ if (IS_ERR(cl->clk_parent)) { -+ dev_err(&pdev->dev, "unable to obtain clock %d: %ld\n", -+ i, PTR_ERR(cl->clk_parent)); -+ ret = PTR_ERR(cl->clk_parent); -+ goto err_release; -+ } -+ -+ cl->pd_dev = dev_pm_domain_attach_by_id(&pdev->dev, i + 1); -+ if (IS_ERR(cl->pd_dev)) { -+ dev_err(&pdev->dev, "unable to obtain cluster %d PD: %ld\n", -+ i, PTR_ERR(cl->pd_dev)); -+ ret = PTR_ERR(cl->pd_dev); -+ goto err_release; -+ } -+ -+#if 0 -+ ret = clk_rate_exclusive_get(clk); -+ if (ret) { -+ dev_err(&pdev->dev, "unable to get clock rate exclusivity\n"); -+ goto err_release; -+ } -+ -+#endif -+ -+ irq = platform_get_irq_optional(pdev, i); -+ if (irq >= 0) { -+ dev_dbg(&pdev->dev, "have IRQs for cluster %d\n", i); -+#if 0 -+ ret = devm_request_irq(&pdev->dev, irq, mca_interrupt, -+ 0, dev_name(&pdev->dev), cl); -+ if (ret) { -+ dev_err(&pdev->dev, "unable to register interrupt: %d\n", ret); -+ goto err_release; -+ } -+ mca_poke(mca, i, REG_INTMASK, 0xffffffff); -+#endif -+ } -+ -+ for_each_pcm_streams(stream) { -+ struct dma_chan *chan; -+ bool is_tx = (stream == SNDRV_PCM_STREAM_PLAYBACK); -+#ifndef USE_RXB_FOR_CAPTURE -+ char *name = devm_kasprintf(&pdev->dev, GFP_KERNEL, -+ is_tx ? "tx%da" : "rx%da", i); -+#else -+ char *name = devm_kasprintf(&pdev->dev, GFP_KERNEL, -+ is_tx ? "tx%da" : "rx%db", i); -+#endif -+ -+ chan = of_dma_request_slave_channel(pdev->dev.of_node, name); -+ if (IS_ERR(chan)) { -+ if (PTR_ERR(chan) != -EPROBE_DEFER) -+ dev_err(&pdev->dev, "no %s DMA channel: %ld\n", -+ name, PTR_ERR(chan)); -+ -+ ret = PTR_ERR(chan); -+ goto err_release; -+ } -+ -+ cl->dma_chans[stream] = chan; -+ } -+ -+ drv->id = i; -+ drv->name = devm_kasprintf(&pdev->dev, GFP_KERNEL, -+ "mca-i2s-%d", i); -+ if (!drv->name) { -+ ret = -ENOMEM; -+ goto err_release; -+ } -+ drv->ops = &mca_dai_ops; -+ drv->playback.channels_min = 1; -+ drv->playback.channels_max = 32; -+ drv->playback.rates = SNDRV_PCM_RATE_8000_192000; -+ drv->playback.formats = SNDRV_PCM_FMTBIT_S16_LE | -+ SNDRV_PCM_FMTBIT_S24_LE | -+ SNDRV_PCM_FMTBIT_S32_LE; -+ drv->capture.channels_min = 1; -+ drv->capture.channels_max = 32; -+ drv->capture.rates = SNDRV_PCM_RATE_8000_192000; -+ drv->capture.formats = SNDRV_PCM_FMTBIT_S16_LE | -+ SNDRV_PCM_FMTBIT_S24_LE | -+ SNDRV_PCM_FMTBIT_S32_LE; -+ drv->symmetric_rate = 1; -+ } -+ -+ ret = devm_snd_soc_register_component(&pdev->dev, &mca_component, -+ dai_drivers, nclusters); -+ if (ret) { -+ dev_err(&pdev->dev, "unable to register ASoC component: %d\n", ret); -+ goto err_release; -+ } -+ -+ dev_dbg(&pdev->dev, "all good, ready to go!\n"); -+ return 0; -+ -+err_release: -+ apple_mca_release(mca); -+ return ret; -+} -+ -+static int apple_mca_remove(struct platform_device *pdev) -+{ -+ struct mca_data *mca = platform_get_drvdata(pdev); -+ -+ apple_mca_release(mca); -+ /* TODO */ -+ -+ return 0; -+} -+ -+static const struct of_device_id apple_mca_of_match[] = { -+ { .compatible = "apple,mca", }, -+ {} -+}; -+MODULE_DEVICE_TABLE(of, apple_mca_of_match); -+ -+static struct platform_driver apple_mca_driver = { -+ .driver = { -+ .name = "apple-mca", -+ .owner = THIS_MODULE, -+ .of_match_table = apple_mca_of_match, -+ }, -+ .probe = apple_mca_probe, -+ .remove = apple_mca_remove, -+}; -+module_platform_driver(apple_mca_driver); -+ -+MODULE_AUTHOR("Martin Povišer "); -+MODULE_DESCRIPTION("ASoC platform driver for Apple Silicon SoCs"); -+MODULE_LICENSE("GPL"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0073-ASoC-tas2770-Set-correct-FSYNC-polarity.patch b/target/linux/silicon/patches-5.19/0073-ASoC-tas2770-Set-correct-FSYNC-polarity.patch deleted file mode 100644 index 86b9493ed..000000000 --- a/target/linux/silicon/patches-5.19/0073-ASoC-tas2770-Set-correct-FSYNC-polarity.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 25cfbd57efaf69fbbf65c4db2c4d541b8715e5f8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Sat, 19 Feb 2022 09:49:34 +0100 -Subject: [PATCH 073/171] ASoC: tas2770: Set correct FSYNC polarity -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Fix setting of FSYNC polarity for DAI formats other than I2S. Also -add support for polarity inversion. - -Signed-off-by: Martin Povišer ---- - sound/soc/codecs/tas2770.c | 21 ++++++++++++++++++++- - sound/soc/codecs/tas2770.h | 3 +++ - 2 files changed, 23 insertions(+), 1 deletion(-) - -diff --git a/sound/soc/codecs/tas2770.c b/sound/soc/codecs/tas2770.c -index c1dbd978d550..2b214223265e 100644 ---- a/sound/soc/codecs/tas2770.c -+++ b/sound/soc/codecs/tas2770.c -@@ -337,7 +337,7 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) - struct snd_soc_component *component = dai->component; - struct tas2770_priv *tas2770 = - snd_soc_component_get_drvdata(component); -- u8 tdm_rx_start_slot = 0, asi_cfg_1 = 0; -+ u8 tdm_rx_start_slot = 0, invert_fpol = 0, fpol_preinv = 0, asi_cfg_1 = 0; - int ret; - - switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { -@@ -349,9 +349,15 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) - } - - switch (fmt & SND_SOC_DAIFMT_INV_MASK) { -+ case SND_SOC_DAIFMT_NB_IF: -+ invert_fpol = 1; -+ fallthrough; - case SND_SOC_DAIFMT_NB_NF: - asi_cfg_1 |= TAS2770_TDM_CFG_REG1_RX_RSING; - break; -+ case SND_SOC_DAIFMT_IB_IF: -+ invert_fpol = 1; -+ fallthrough; - case SND_SOC_DAIFMT_IB_NF: - asi_cfg_1 |= TAS2770_TDM_CFG_REG1_RX_FALING; - break; -@@ -369,15 +375,19 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) - switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { - case SND_SOC_DAIFMT_I2S: - tdm_rx_start_slot = 1; -+ fpol_preinv = 0; - break; - case SND_SOC_DAIFMT_DSP_A: - tdm_rx_start_slot = 0; -+ fpol_preinv = 1; - break; - case SND_SOC_DAIFMT_DSP_B: - tdm_rx_start_slot = 1; -+ fpol_preinv = 1; - break; - case SND_SOC_DAIFMT_LEFT_J: - tdm_rx_start_slot = 0; -+ fpol_preinv = 1; - break; - default: - dev_err(tas2770->dev, -@@ -391,6 +401,15 @@ static int tas2770_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) - if (ret < 0) - return ret; - -+ -+ ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG0, -+ TAS2770_TDM_CFG_REG0_FPOL_MASK, -+ (fpol_preinv ^ invert_fpol) -+ ? TAS2770_TDM_CFG_REG0_FPOL_RSING -+ : TAS2770_TDM_CFG_REG0_FPOL_FALING); -+ if (ret < 0) -+ return ret; -+ - return 0; - } - -diff --git a/sound/soc/codecs/tas2770.h b/sound/soc/codecs/tas2770.h -index d156666bcc55..42277fb6bc10 100644 ---- a/sound/soc/codecs/tas2770.h -+++ b/sound/soc/codecs/tas2770.h -@@ -41,6 +41,9 @@ - #define TAS2770_TDM_CFG_REG0_31_44_1_48KHZ 0x6 - #define TAS2770_TDM_CFG_REG0_31_88_2_96KHZ 0x8 - #define TAS2770_TDM_CFG_REG0_31_176_4_192KHZ 0xa -+#define TAS2770_TDM_CFG_REG0_FPOL_MASK BIT(0) -+#define TAS2770_TDM_CFG_REG0_FPOL_RSING 0 -+#define TAS2770_TDM_CFG_REG0_FPOL_FALING 1 - /* TDM Configuration Reg1 */ - #define TAS2770_TDM_CFG_REG1 TAS2770_REG(0X0, 0x0B) - #define TAS2770_TDM_CFG_REG1_MASK GENMASK(5, 1) --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0074-HACK-ASoC-tas2770-Set-no-of-channels-to-1.patch b/target/linux/silicon/patches-5.19/0074-HACK-ASoC-tas2770-Set-no-of-channels-to-1.patch deleted file mode 100644 index a5ab344f0..000000000 --- a/target/linux/silicon/patches-5.19/0074-HACK-ASoC-tas2770-Set-no-of-channels-to-1.patch +++ /dev/null @@ -1,27 +0,0 @@ -From b65315774f730e0b8553230d6cff9912a0341ca9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Sat, 19 Feb 2022 09:49:45 +0100 -Subject: [PATCH 074/171] HACK: ASoC: tas2770: Set no of channels to 1 - ---- - sound/soc/codecs/tas2770.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/sound/soc/codecs/tas2770.c b/sound/soc/codecs/tas2770.c -index 2b214223265e..753e3f8d459a 100644 ---- a/sound/soc/codecs/tas2770.c -+++ b/sound/soc/codecs/tas2770.c -@@ -508,8 +508,8 @@ static struct snd_soc_dai_driver tas2770_dai_driver[] = { - .id = 0, - .playback = { - .stream_name = "ASI1 Playback", -- .channels_min = 2, -- .channels_max = 2, -+ .channels_min = 1, -+ .channels_max = 1, - .rates = TAS2770_RATES, - .formats = TAS2770_FORMATS, - }, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0075-HACK-ASoC-cs42l42-Disable-regcache.patch b/target/linux/silicon/patches-5.19/0075-HACK-ASoC-cs42l42-Disable-regcache.patch deleted file mode 100644 index 2d2e6b2ff..000000000 --- a/target/linux/silicon/patches-5.19/0075-HACK-ASoC-cs42l42-Disable-regcache.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 289067bf88e5b44f8e5a34535693bd01bb3adb97 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Sat, 19 Feb 2022 09:49:48 +0100 -Subject: [PATCH 075/171] HACK: ASoC: cs42l42: Disable regcache - -There's some issue that has yet to be pinned down. ---- - sound/soc/codecs/cs42l42.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c -index 4fade2388797..5fb28df85b8a 100644 ---- a/sound/soc/codecs/cs42l42.c -+++ b/sound/soc/codecs/cs42l42.c -@@ -380,7 +380,7 @@ static const struct regmap_config cs42l42_regmap = { - .max_register = CS42L42_MAX_REGISTER, - .reg_defaults = cs42l42_reg_defaults, - .num_reg_defaults = ARRAY_SIZE(cs42l42_reg_defaults), -- .cache_type = REGCACHE_RBTREE, -+ //.cache_type = REGCACHE_RBTREE, - - .use_single_read = true, - .use_single_write = true, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0076-ASoC-cs42l42-Bypass-device-ID-check.patch b/target/linux/silicon/patches-5.19/0076-ASoC-cs42l42-Bypass-device-ID-check.patch deleted file mode 100644 index eac1f0820..000000000 --- a/target/linux/silicon/patches-5.19/0076-ASoC-cs42l42-Bypass-device-ID-check.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 27fe5e0a4429c0a92635d1395a673fcea6289046 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Sat, 19 Feb 2022 09:49:50 +0100 -Subject: [PATCH 076/171] ASoC: cs42l42: Bypass device ID check - -The cs42l42 driver is also applicable to the cs42l83 part. ---- - sound/soc/codecs/cs42l42.c | 7 ++----- - 1 file changed, 2 insertions(+), 5 deletions(-) - -diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c -index 5fb28df85b8a..2a98f9bc7144 100644 ---- a/sound/soc/codecs/cs42l42.c -+++ b/sound/soc/codecs/cs42l42.c -@@ -2273,13 +2273,10 @@ static int cs42l42_i2c_probe(struct i2c_client *i2c_client) - goto err_disable; - } - -- if (devid != CS42L42_CHIP_ID) { -- ret = -ENODEV; -- dev_err(&i2c_client->dev, -+ if (devid != CS42L42_CHIP_ID) -+ dev_warn(&i2c_client->dev, - "CS42L42 Device ID (%X). Expected %X\n", - devid, CS42L42_CHIP_ID); -- goto err_disable; -- } - - ret = regmap_read(cs42l42->regmap, CS42L42_REVID, ®); - if (ret < 0) { --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0077-HACK-ASoC-Add-card-filter_controls-hook.patch b/target/linux/silicon/patches-5.19/0077-HACK-ASoC-Add-card-filter_controls-hook.patch deleted file mode 100644 index 3fa7d4271..000000000 --- a/target/linux/silicon/patches-5.19/0077-HACK-ASoC-Add-card-filter_controls-hook.patch +++ /dev/null @@ -1,205 +0,0 @@ -From 170220fc8fb15839654131612ac3dc84bb4469ea Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Sun, 20 Feb 2022 14:29:38 +0100 -Subject: [PATCH 077/171] HACK: ASoC: Add card->filter_controls hook -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Add a new ASoC card callback for filtering the kcontrols of the card's -constituent components. This lets the card take over some of the -controls, deciding their value instead of leaving it up to userspace. - -Also, and here's the HACK: part, move dapm_new_widgets call in front -of the card's late_probe call. This way all kcontrols should have been -crated by the time late_probe is called. - -Signed-off-by: Martin Povišer ---- - include/sound/soc.h | 3 +++ - sound/soc/soc-core.c | 45 +++++++++++++++++++++++++++----------------- - sound/soc/soc-dapm.c | 34 ++++++++++++++++++++++++++++----- - 3 files changed, 60 insertions(+), 22 deletions(-) - -diff --git a/include/sound/soc.h b/include/sound/soc.h -index b276dcb5d4e8..7ef168a8c759 100644 ---- a/include/sound/soc.h -+++ b/include/sound/soc.h -@@ -916,6 +916,9 @@ struct snd_soc_card { - int (*late_probe)(struct snd_soc_card *card); - int (*remove)(struct snd_soc_card *card); - -+ int (*filter_controls)(struct snd_soc_card *card, -+ struct snd_kcontrol *kcontrol); -+ - /* the pre and post PM functions are used to do any PM work before and - * after the codec and DAI's do any PM work. */ - int (*suspend_pre)(struct snd_soc_card *card); -diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c -index 9574f86dd4de..37e2a8b2af10 100644 ---- a/sound/soc/soc-core.c -+++ b/sound/soc/soc-core.c -@@ -2069,12 +2069,12 @@ static int snd_soc_bind_card(struct snd_soc_card *card) - } - } - -+ snd_soc_dapm_new_widgets(card); -+ - ret = snd_soc_card_late_probe(card); - if (ret < 0) - goto probe_end; - -- snd_soc_dapm_new_widgets(card); -- - ret = snd_card_register(card->snd_card); - if (ret < 0) { - dev_err(card->dev, "ASoC: failed to register soundcard %d\n", -@@ -2209,19 +2209,34 @@ struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template, - } - EXPORT_SYMBOL_GPL(snd_soc_cnew); - --static int snd_soc_add_controls(struct snd_card *card, struct device *dev, -+static int snd_soc_add_controls(struct snd_soc_card *card, struct device *dev, - const struct snd_kcontrol_new *controls, int num_controls, - const char *prefix, void *data) - { -- int i; -+ int i, err; - - for (i = 0; i < num_controls; i++) { -- const struct snd_kcontrol_new *control = &controls[i]; -- int err = snd_ctl_add(card, snd_soc_cnew(control, data, -- control->name, prefix)); -+ const struct snd_kcontrol_new *control_new = &controls[i]; -+ struct snd_kcontrol *control; -+ -+ control = snd_soc_cnew(control_new, data, -+ control_new->name, prefix); -+ -+ if (card->filter_controls) { -+ err = card->filter_controls(card, control); -+ if (err < 0) { -+ snd_ctl_free_one(control); -+ return err; -+ } else if (err) { -+ continue; -+ } -+ } -+ -+ err = snd_ctl_add(card->snd_card, control); -+ - if (err < 0) { - dev_err(dev, "ASoC: Failed to add %s: %d\n", -- control->name, err); -+ control_new->name, err); - return err; - } - } -@@ -2241,9 +2256,7 @@ static int snd_soc_add_controls(struct snd_card *card, struct device *dev, - int snd_soc_add_component_controls(struct snd_soc_component *component, - const struct snd_kcontrol_new *controls, unsigned int num_controls) - { -- struct snd_card *card = component->card->snd_card; -- -- return snd_soc_add_controls(card, component->dev, controls, -+ return snd_soc_add_controls(component->card, component->dev, controls, - num_controls, component->name_prefix, component); - } - EXPORT_SYMBOL_GPL(snd_soc_add_component_controls); -@@ -2258,13 +2271,11 @@ EXPORT_SYMBOL_GPL(snd_soc_add_component_controls); - * - * Return 0 for success, else error. - */ --int snd_soc_add_card_controls(struct snd_soc_card *soc_card, -+int snd_soc_add_card_controls(struct snd_soc_card *card, - const struct snd_kcontrol_new *controls, int num_controls) - { -- struct snd_card *card = soc_card->snd_card; -- -- return snd_soc_add_controls(card, soc_card->dev, controls, num_controls, -- NULL, soc_card); -+ return snd_soc_add_controls(card, card->dev, controls, num_controls, -+ NULL, card); - } - EXPORT_SYMBOL_GPL(snd_soc_add_card_controls); - -@@ -2281,7 +2292,7 @@ EXPORT_SYMBOL_GPL(snd_soc_add_card_controls); - int snd_soc_add_dai_controls(struct snd_soc_dai *dai, - const struct snd_kcontrol_new *controls, int num_controls) - { -- struct snd_card *card = dai->component->card->snd_card; -+ struct snd_soc_card *card = dai->component->card; - - return snd_soc_add_controls(card, dai->dev, controls, num_controls, - NULL, dai); -diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c -index a8e842e02cdc..c87137f364da 100644 ---- a/sound/soc/soc-dapm.c -+++ b/sound/soc/soc-dapm.c -@@ -878,7 +878,7 @@ static int dapm_create_or_share_kcontrol(struct snd_soc_dapm_widget *w, - int kci) - { - struct snd_soc_dapm_context *dapm = w->dapm; -- struct snd_card *card = dapm->card->snd_card; -+ struct snd_soc_card *card = dapm->card; - const char *prefix; - size_t prefix_len; - int shared; -@@ -962,7 +962,19 @@ static int dapm_create_or_share_kcontrol(struct snd_soc_dapm_widget *w, - goto exit_free; - } - -- ret = snd_ctl_add(card, kcontrol); -+ if (card->filter_controls) { -+ ret = card->filter_controls(card, kcontrol); -+ if (ret < 0) { -+ snd_ctl_free_one(kcontrol); -+ goto exit_free; -+ } -+ -+ if (!ret) -+ ret = snd_ctl_add(card->snd_card, kcontrol); -+ } else { -+ ret = snd_ctl_add(card->snd_card, kcontrol); -+ } -+ - if (ret < 0) { - dev_err(dapm->dev, - "ASoC: failed to add widget %s dapm kcontrol %s: %d\n", -@@ -1079,7 +1091,7 @@ static int dapm_new_pga(struct snd_soc_dapm_widget *w) - /* create new dapm dai link control */ - static int dapm_new_dai_link(struct snd_soc_dapm_widget *w) - { -- int i; -+ int i, ret; - struct snd_soc_pcm_runtime *rtd = w->priv; - - /* create control for links with > 1 config */ -@@ -1089,10 +1101,22 @@ static int dapm_new_dai_link(struct snd_soc_dapm_widget *w) - /* add kcontrol */ - for (i = 0; i < w->num_kcontrols; i++) { - struct snd_soc_dapm_context *dapm = w->dapm; -- struct snd_card *card = dapm->card->snd_card; -+ struct snd_soc_card *card = dapm->card; - struct snd_kcontrol *kcontrol = snd_soc_cnew(&w->kcontrol_news[i], - w, w->name, NULL); -- int ret = snd_ctl_add(card, kcontrol); -+ -+ if (card->filter_controls) { -+ ret = card->filter_controls(card, kcontrol); -+ if (ret < 0) { -+ snd_ctl_free_one(kcontrol); -+ return ret; -+ } -+ -+ if (!ret) -+ ret = snd_ctl_add(card->snd_card, kcontrol); -+ } else { -+ ret = snd_ctl_add(card->snd_card, kcontrol); -+ } - - if (ret < 0) { - dev_err(dapm->dev, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0078-ASoC-Add-asoc_pcm_to_rtd-utility-function.patch b/target/linux/silicon/patches-5.19/0078-ASoC-Add-asoc_pcm_to_rtd-utility-function.patch deleted file mode 100644 index 4db68b8f9..000000000 --- a/target/linux/silicon/patches-5.19/0078-ASoC-Add-asoc_pcm_to_rtd-utility-function.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 3153617d401d69c1d4f52eb3ca69f5b4b8d2086a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Thu, 24 Feb 2022 14:50:34 +0100 -Subject: [PATCH 078/171] ASoC: Add asoc_pcm_to_rtd utility function -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Martin Povišer ---- - include/sound/soc.h | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/include/sound/soc.h b/include/sound/soc.h -index 7ef168a8c759..73cc83d73163 100644 ---- a/include/sound/soc.h -+++ b/include/sound/soc.h -@@ -1101,6 +1101,8 @@ struct snd_soc_pcm_runtime { - #define asoc_rtd_to_codec(rtd, n) (rtd)->dais[n + (rtd)->num_cpus] - #define asoc_substream_to_rtd(substream) \ - (struct snd_soc_pcm_runtime *)snd_pcm_substream_chip(substream) -+#define asoc_pcm_to_rtd(pcm) \ -+ ((struct snd_soc_pcm_runtime *)pcm->private_data) - - #define for_each_rtd_components(rtd, i, component) \ - for ((i) = 0, component = NULL; \ --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0079-HACK-ASoC-Allow-an-N-cpus-to-M-codecs-link.patch b/target/linux/silicon/patches-5.19/0079-HACK-ASoC-Allow-an-N-cpus-to-M-codecs-link.patch deleted file mode 100644 index d3855866e..000000000 --- a/target/linux/silicon/patches-5.19/0079-HACK-ASoC-Allow-an-N-cpus-to-M-codecs-link.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 3a8e536be0711ee4985c227fee67e569aa93f9a7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Thu, 24 Feb 2022 14:51:00 +0100 -Subject: [PATCH 079/171] HACK: ASoC: Allow an N-cpus-to-M-codecs link -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Martin Povišer ---- - sound/soc/soc-pcm.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c -index a827cc3c158a..542c308df17c 100644 ---- a/sound/soc/soc-pcm.c -+++ b/sound/soc/soc-pcm.c -@@ -2811,9 +2811,10 @@ static int soc_get_playback_capture(struct snd_soc_pcm_runtime *rtd, - } else if (rtd->num_cpus == rtd->num_codecs) { - cpu_dai = asoc_rtd_to_cpu(rtd, i); - } else { -- dev_err(rtd->card->dev, -- "N cpus to M codecs link is not supported yet\n"); -- return -EINVAL; -+ cpu_dai = asoc_rtd_to_cpu(rtd, 0); -+ //dev_err(rtd->card->dev, -+ // "N cpus to M codecs link is not supported yet\n"); -+ //return -EINVAL; - } - - if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_PLAYBACK) && --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0080-ASoC-Add-macaudio-machine-driver.patch b/target/linux/silicon/patches-5.19/0080-ASoC-Add-macaudio-machine-driver.patch deleted file mode 100644 index ab75b8d46..000000000 --- a/target/linux/silicon/patches-5.19/0080-ASoC-Add-macaudio-machine-driver.patch +++ /dev/null @@ -1,632 +0,0 @@ -From 1bd9f82e027617111fd5a1a653dad3880f71ddf7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Sat, 19 Feb 2022 09:49:56 +0100 -Subject: [PATCH 080/171] ASoC: Add macaudio machine driver -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Martin Povišer ---- - sound/soc/apple/Kconfig | 9 + - sound/soc/apple/Makefile | 3 + - sound/soc/apple/macaudio.c | 579 +++++++++++++++++++++++++++++++++++++ - 3 files changed, 591 insertions(+) - create mode 100644 sound/soc/apple/macaudio.c - -diff --git a/sound/soc/apple/Kconfig b/sound/soc/apple/Kconfig -index ebe66d713b96..a3f6a97140e2 100644 ---- a/sound/soc/apple/Kconfig -+++ b/sound/soc/apple/Kconfig -@@ -1,3 +1,12 @@ -+ -+config SND_SOC_APPLE_SILICON -+ tristate "ASoC machine driver for Apple Silicon Macs" -+ depends on ARCH_APPLE || COMPILE_TEST -+ select SND_SOC_APPLE_MCA -+ default ARCH_APPLE -+ help -+ This option enables an ASoC machine driver for Apple Silicon Macs. -+ - config SND_SOC_APPLE_MCA - tristate "Apple Silicon MCA driver" - depends on ARCH_APPLE || COMPILE_TEST -diff --git a/sound/soc/apple/Makefile b/sound/soc/apple/Makefile -index c1e492d57649..a45cf8213c29 100644 ---- a/sound/soc/apple/Makefile -+++ b/sound/soc/apple/Makefile -@@ -1,3 +1,6 @@ - snd-soc-apple-mca-objs := mca.o -+snd-soc-apple-silicon-objs := macaudio.o - - obj-$(CONFIG_SND_SOC_APPLE_MCA) += snd-soc-apple-mca.o -+obj-$(CONFIG_SND_SOC_APPLE_SILICON) += snd-soc-apple-silicon.o -+ -diff --git a/sound/soc/apple/macaudio.c b/sound/soc/apple/macaudio.c -new file mode 100644 -index 000000000000..a1f2b1fcea1f ---- /dev/null -+++ b/sound/soc/apple/macaudio.c -@@ -0,0 +1,579 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * ASoC machine driver for Apple Silicon Macs -+ * -+ * Copyright (C) The Asahi Linux Contributors -+ * -+ * Based on sound/soc/qcom/{sc7180.c|common.c} -+ * -+ * Copyright (c) 2018, Linaro Limited. -+ * Copyright (c) 2020, The Linux Foundation. All rights reserved. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define DRIVER_NAME "snd-soc-apple-macaudio" -+ -+struct macaudio_snd_data { -+ struct snd_soc_card card; -+ struct snd_soc_jack_pin pin; -+ struct snd_soc_jack jack; -+ -+ struct macaudio_link_props { -+ unsigned int mclk_fs; -+ } *link_props; -+ -+ const struct snd_pcm_chmap_elem *speaker_chmap; -+ -+ unsigned int speaker_nchans_array[2]; -+ struct snd_pcm_hw_constraint_list speaker_nchans_list; -+ -+ struct list_head hidden_kcontrols; -+}; -+ -+static int macaudio_parse_of(struct macaudio_snd_data *ma, struct snd_soc_card *card) -+{ -+ struct device_node *np; -+ struct device_node *codec = NULL; -+ struct device_node *cpu = NULL; -+ struct device *dev = card->dev; -+ struct snd_soc_dai_link *link; -+ struct macaudio_link_props *link_props; -+ int ret, num_links; -+ int i = 0; -+ -+ ret = snd_soc_of_parse_card_name(card, "model"); -+ if (ret) { -+ dev_err(dev, "Error parsing card name: %d\n", ret); -+ return ret; -+ } -+ -+ ret = asoc_simple_parse_routing(card, NULL); -+ if (ret) { -+ return ret; -+ } -+ -+ /* Populate links */ -+ num_links = of_get_available_child_count(dev->of_node); -+ -+ /* Allocate the DAI link array */ -+ card->dai_link = devm_kcalloc(dev, num_links, sizeof(*link), GFP_KERNEL); -+ ma->link_props = devm_kcalloc(dev, num_links, sizeof(*ma->link_props), GFP_KERNEL); -+ if (!card->dai_link || !ma->link_props) -+ return -ENOMEM; -+ -+ card->num_links = num_links; -+ link = card->dai_link; -+ link_props = ma->link_props; -+ -+ for_each_available_child_of_node(dev->of_node, np) { -+ link->id = i++; -+ -+ /* CPU side is bit and frame clock master, I2S with both clocks inverted */ -+ link->dai_fmt = SND_SOC_DAIFMT_I2S | -+ SND_SOC_DAIFMT_CBC_CFC | -+ SND_SOC_DAIFMT_GATED | -+ SND_SOC_DAIFMT_IB_IF; -+ -+ ret = of_property_read_string(np, "link-name", &link->name); -+ if (ret) { -+ dev_err(card->dev, "Missing link name\n"); -+ goto err_put_np; -+ } -+ -+ cpu = of_get_child_by_name(np, "cpu"); -+ codec = of_get_child_by_name(np, "codec"); -+ -+ if (!codec || !cpu) { -+ dev_err(dev, "Missing DAI specifications for '%s'\n", link->name); -+ ret = -EINVAL; -+ goto err; -+ } -+ -+ ret = snd_soc_of_get_dai_link_codecs(dev, codec, link); -+ if (ret < 0) { -+ if (ret != -EPROBE_DEFER) -+ dev_err(card->dev, "%s: codec dai not found: %d\n", -+ link->name, ret); -+ goto err; -+ } -+ -+ ret = snd_soc_of_get_dai_link_cpus(dev, cpu, link); -+ if (ret < 0) { -+ if (ret != -EPROBE_DEFER) -+ dev_err(card->dev, "%s: cpu dai not found: %d\n", -+ link->name, ret); -+ goto err; -+ } -+ -+ link->num_platforms = 1; -+ link->platforms = devm_kzalloc(dev, sizeof(*link->platforms), -+ GFP_KERNEL); -+ if (!link->platforms) { -+ ret = -ENOMEM; -+ goto err_put_np; -+ } -+ link->platforms->of_node = link->cpus->of_node; -+ -+ of_property_read_u32(np, "mclk-fs", &link_props->mclk_fs); -+ -+ link->stream_name = link->name; -+ link++; -+ link_props++; -+ -+ of_node_put(cpu); -+ of_node_put(codec); -+ } -+ -+ /* TODO: snd_soc_of_get_dai_link_codecs cleanup */ -+ -+ return 0; -+err: -+ of_node_put(cpu); -+ of_node_put(codec); -+err_put_np: -+ of_node_put(np); -+ return ret; -+} -+ -+static int macaudio_hw_params(struct snd_pcm_substream *substream, -+ struct snd_pcm_hw_params *params) -+{ -+ struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); -+ struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(rtd->card); -+ struct macaudio_link_props *props = &ma->link_props[rtd->num]; -+ struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); -+ struct snd_soc_dai *dai; -+ int i, mclk; -+ -+ if (props->mclk_fs) { -+ mclk = params_rate(params) * props->mclk_fs; -+ -+ for_each_rtd_codec_dais(rtd, i, dai) -+ snd_soc_dai_set_sysclk(dai, 0, mclk, SND_SOC_CLOCK_IN); -+ -+ snd_soc_dai_set_sysclk(cpu_dai, 0, mclk, SND_SOC_CLOCK_OUT); -+ } -+ -+ return 0; -+} -+ -+static void macaudio_shutdown(struct snd_pcm_substream *substream) -+{ -+ struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); -+ struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(rtd->card); -+ struct macaudio_link_props *props = &ma->link_props[rtd->num]; -+ struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); -+ struct snd_soc_dai *dai; -+ int i; -+ -+ if (props->mclk_fs) { -+ for_each_rtd_codec_dais(rtd, i, dai) -+ snd_soc_dai_set_sysclk(dai, 0, 0, SND_SOC_CLOCK_IN); -+ -+ snd_soc_dai_set_sysclk(cpu_dai, 0, 0, SND_SOC_CLOCK_OUT); -+ } -+} -+ -+ -+static int macaudio_startup(struct snd_pcm_substream *substream) -+{ -+ struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); -+ struct snd_soc_card *card = rtd->card; -+ struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(card); -+ struct snd_pcm_hw_constraint_list *nchans_list = &ma->speaker_nchans_list; -+ unsigned int *nchans_array = ma->speaker_nchans_array; -+ int ret; -+ -+ if (!strcmp(rtd->dai_link->name, "Speakers")) { -+ if (rtd->num_codecs > 2) { -+ nchans_list->count = 2; -+ nchans_list->list = nchans_array; -+ nchans_array[0] = 2; -+ nchans_array[1] = rtd->num_codecs; -+ -+ ret = snd_pcm_hw_constraint_list(substream->runtime, 0, -+ SNDRV_PCM_HW_PARAM_CHANNELS, nchans_list); -+ if (ret < 0) -+ return ret; -+ } else if (rtd->num_codecs == 2) { -+ ret = snd_pcm_hw_constraint_single(substream->runtime, -+ SNDRV_PCM_HW_PARAM_CHANNELS, 2); -+ if (ret < 0) -+ return ret; -+ } -+ } -+ -+ return 0; -+} -+ -+static int macaudio_assign_tdm(struct snd_soc_pcm_runtime *rtd) -+{ -+ struct snd_soc_card *card = rtd->card; -+ struct snd_soc_dai *dai, *cpu_dai; -+ int ret, i; -+ int nchans = 0, nslots = 0, slot_width = 32; -+ -+ nslots = rtd->num_codecs; -+ -+ for_each_rtd_codec_dais(rtd, i, dai) { -+ int codec_nchans = 1; -+ int mask = ((1 << codec_nchans) - 1) << nchans; -+ -+ ret = snd_soc_dai_set_tdm_slot(dai, mask, -+ mask, nslots, slot_width); -+ if (ret == -EINVAL) -+ /* Try without the RX mask */ -+ ret = snd_soc_dai_set_tdm_slot(dai, mask, -+ 0, nslots, slot_width); -+ -+ if (ret < 0) { -+ dev_err(card->dev, "DAI %s refuses TDM settings: %d", -+ dai->name, ret); -+ return ret; -+ } -+ -+ nchans += codec_nchans; -+ } -+ -+ cpu_dai = asoc_rtd_to_cpu(rtd, 0); -+ ret = snd_soc_dai_set_tdm_slot(cpu_dai, (1 << nslots) - 1, -+ (1 << nslots) - 1, nslots, slot_width); -+ if (ret < 0) { -+ dev_err(card->dev, "CPU DAI %s refuses TDM settings: %d", -+ cpu_dai->name, ret); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static int macaudio_init(struct snd_soc_pcm_runtime *rtd) -+{ -+ struct snd_soc_card *card = rtd->card; -+ struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(card); -+ struct snd_soc_component *component; -+ int ret, i; -+ -+ if (rtd->num_codecs > 1) { -+ ret = macaudio_assign_tdm(rtd); -+ if (ret < 0) -+ return ret; -+ } -+ -+ for_each_rtd_components(rtd, i, component) -+ snd_soc_component_set_jack(component, &ma->jack, NULL); -+ -+ return 0; -+} -+ -+static void macaudio_exit(struct snd_soc_pcm_runtime *rtd) -+{ -+ struct snd_soc_component *component; -+ int i; -+ -+ for_each_rtd_components(rtd, i, component) -+ snd_soc_component_set_jack(component, NULL, NULL); -+} -+ -+struct fixed_kctl { -+ char *name; -+ char *value; -+} macaudio_fixed_kctls[] = { -+ {"ASI1 Sel", "Left"}, -+ {"Left ASI1 Sel", "Left"}, -+ {"Right ASI1 Sel", "Left"}, -+ {"Left Front ASI1 Sel", "Left"}, -+ {"Left Rear ASI1 Sel", "Left"}, -+ {"Right Front ASI1 Sel", "Left"}, -+ {"Right Rear ASI1 Sel", "Left"}, -+ {"Left Tweeter ASI1 Sel", "Left"}, -+ {"Left Woofer 1 ASI1 Sel", "Left"}, -+ {"Left Woofer 2 ASI1 Sel", "Left"}, -+ {"Right Tweeter ASI1 Sel", "Left"}, -+ {"Right Woofer 1 ASI1 Sel", "Left"}, -+ {"Right Woofer 2 ASI1 Sel", "Left"}, -+ {"Left ISENSE Switch", "Off"}, -+ {"Left VSENSE Switch", "Off"}, -+ {"Right ISENSE Switch", "Off"}, -+ {"Right VSENSE Switch", "Off"}, -+ {"Jack Mixer Volume", "63"}, -+ { } -+}; -+ -+static struct fixed_kctl *find_fixed_kctl(const char *name) -+{ -+ struct fixed_kctl *fctl; -+ -+ for (fctl = macaudio_fixed_kctls; fctl->name != NULL; fctl++) -+ if (!strcmp(fctl->name, name)) -+ return fctl; -+ -+ return NULL; -+} -+ -+static int macaudio_probe(struct snd_soc_card *card) -+{ -+ struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(card); -+ int ret; -+ -+ INIT_LIST_HEAD(&ma->hidden_kcontrols); -+ -+ ma->pin.pin = "Headphones"; -+ ma->pin.mask = SND_JACK_HEADSET | SND_JACK_HEADPHONE; -+ ret = snd_soc_card_jack_new_pins(card, ma->pin.pin, -+ SND_JACK_HEADSET | -+ SND_JACK_HEADPHONE | -+ SND_JACK_BTN_0 | SND_JACK_BTN_1 | -+ SND_JACK_BTN_2 | SND_JACK_BTN_3, -+ &ma->jack, &ma->pin, 1); -+ -+ if (ret < 0) -+ dev_err(card->dev, "jack creation failed: %d\n", ret); -+ -+ return ret; -+} -+ -+static int macaudio_remove(struct snd_soc_card *card) -+{ -+ struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(card); -+ struct snd_kcontrol *kcontrol; -+ -+ list_for_each_entry(kcontrol, &ma->hidden_kcontrols, list) -+ snd_ctl_free_one(kcontrol); -+ -+ return 0; -+} -+ -+static void snd_soc_kcontrol_set_strval(struct snd_soc_card *card, -+ struct snd_kcontrol *kcontrol, const char *strvalue) -+{ -+ struct snd_ctl_elem_value value; -+ struct snd_ctl_elem_info info; -+ int sel, i, ret; -+ -+ ret = kcontrol->info(kcontrol, &info); -+ if (ret < 0) { -+ dev_err(card->dev, "can't obtain info on control '%s': %d", -+ kcontrol->id.name, ret); -+ return; -+ } -+ -+ switch (info.type) { -+ case SNDRV_CTL_ELEM_TYPE_ENUMERATED: -+ for (sel = 0; sel < info.value.enumerated.items; sel++) { -+ info.value.enumerated.item = sel; -+ kcontrol->info(kcontrol, &info); -+ -+ if (!strcmp(strvalue, info.value.enumerated.name)) -+ break; -+ } -+ -+ if (sel == info.value.enumerated.items) -+ goto not_avail; -+ -+ for (i = 0; i < info.count; i++) -+ value.value.enumerated.item[i] = sel; -+ break; -+ -+ case SNDRV_CTL_ELEM_TYPE_BOOLEAN: -+ sel = !strcmp(strvalue, "On"); -+ -+ if (!sel && strcmp(strvalue, "Off")) -+ goto not_avail; -+ -+ for (i = 0; i < info.count; i++) /* TODO */ -+ value.value.integer.value[i] = sel; -+ break; -+ -+ case SNDRV_CTL_ELEM_TYPE_INTEGER: -+ if (kstrtoint(strvalue, 10, &sel)) -+ goto not_avail; -+ -+ for (i = 0; i < info.count; i++) -+ value.value.integer.value[i] = sel; -+ break; -+ -+ default: -+ dev_err(card->dev, "%s: control '%s' has unsupported type %d", -+ __func__, kcontrol->id.name, info.type); -+ return; -+ } -+ -+ ret = kcontrol->put(kcontrol, &value); -+ if (ret < 0) { -+ dev_err(card->dev, "can't set control '%s' to '%s': %d", -+ kcontrol->id.name, strvalue, ret); -+ return; -+ } -+ -+ dev_info(card->dev, "set '%s' to '%s'", -+ kcontrol->id.name, strvalue); -+ return; -+ -+not_avail: -+ dev_err(card->dev, "option '%s' on control '%s' not available", -+ strvalue, kcontrol->id.name); -+ return; -+ -+} -+ -+static int macaudio_late_probe(struct snd_soc_card *card) -+{ -+ struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(card); -+ struct snd_kcontrol *kcontrol; -+ struct snd_soc_pcm_runtime *rtd; -+ int ret; -+ -+ list_for_each_entry(kcontrol, &ma->hidden_kcontrols, list) { -+ struct fixed_kctl *fctl = find_fixed_kctl(kcontrol->id.name); -+ -+ if (fctl) -+ snd_soc_kcontrol_set_strval(card, kcontrol, fctl->value); -+ } -+ -+ for_each_card_rtds(card, rtd) { -+ bool speakers_link = !strcmp(rtd->dai_link->name, "Speaker") -+ || !strcmp(rtd->dai_link->name, "Speakers"); -+ -+ if (speakers_link && ma->speaker_chmap) { -+ ret = snd_pcm_add_chmap_ctls(rtd->pcm, -+ SNDRV_PCM_STREAM_PLAYBACK, ma->speaker_chmap, -+ rtd->num_codecs, 0, NULL); -+ if (ret < 0) -+ dev_err(card->dev, "failed to add channel map on '%s': %d\n", -+ rtd->dai_link->name, ret); -+ } -+ } -+ -+ return 0; -+} -+ -+static int macaudio_filter_controls(struct snd_soc_card *card, -+ struct snd_kcontrol *kcontrol) -+{ -+ struct fixed_kctl *fctl = find_fixed_kctl(kcontrol->id.name); -+ struct macaudio_snd_data *ma = snd_soc_card_get_drvdata(card); -+ -+ dev_info(card->dev, "visiting control %s, have match %d\n", -+ kcontrol->id.name, !!fctl); -+ -+ if (!fctl) -+ return 0; -+ -+ list_add_tail(&kcontrol->list, &ma->hidden_kcontrols); -+ return 1; -+} -+ -+static const struct snd_soc_ops macaudio_ops = { -+ .startup = macaudio_startup, -+ .shutdown = macaudio_shutdown, -+ .hw_params = macaudio_hw_params, -+}; -+ -+static const struct snd_soc_dapm_widget macaudio_snd_widgets[] = { -+ SND_SOC_DAPM_HP("Headphones", NULL), -+}; -+ -+static const struct snd_pcm_chmap_elem macaudio_j274_chmaps[] = { -+ { .channels = 1, -+ .map = { SNDRV_CHMAP_MONO } }, -+ { } -+}; -+ -+static const struct snd_pcm_chmap_elem macaudio_j293_chmaps[] = { -+ { .channels = 2, -+ .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } }, -+ { .channels = 4, -+ .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR, -+ SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } }, -+ { } -+}; -+ -+static const struct snd_pcm_chmap_elem macaudio_j314_chmaps[] = { -+ { .channels = 2, -+ .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } }, -+ { .channels = 6, -+ .map = { SNDRV_CHMAP_SL, SNDRV_CHMAP_SR, -+ SNDRV_CHMAP_FL, SNDRV_CHMAP_FR, -+ SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } }, -+ { } -+}; -+ -+static const struct of_device_id macaudio_snd_device_id[] = { -+ { .compatible = "apple,j274-macaudio", .data = macaudio_j274_chmaps }, -+ { .compatible = "apple,j293-macaudio", .data = macaudio_j293_chmaps }, -+ { .compatible = "apple,j314-macaudio", .data = macaudio_j314_chmaps }, -+ { .compatible = "apple,macaudio", }, -+ { } -+}; -+MODULE_DEVICE_TABLE(of, macaudio_snd_device_id); -+ -+static int macaudio_snd_platform_probe(struct platform_device *pdev) -+{ -+ struct snd_soc_card *card; -+ struct macaudio_snd_data *data; -+ struct device *dev = &pdev->dev; -+ struct snd_soc_dai_link *link; -+ const struct of_device_id *of_id; -+ int ret; -+ int i; -+ -+ of_id = of_match_device(macaudio_snd_device_id, dev); -+ if (!of_id) -+ return -EINVAL; -+ -+ /* Allocate the private data */ -+ data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); -+ if (!data) -+ return -ENOMEM; -+ -+ data->speaker_chmap = of_id->data; -+ card = &data->card; -+ snd_soc_card_set_drvdata(card, data); -+ -+ card->owner = THIS_MODULE; -+ card->driver_name = DRIVER_NAME; -+ card->dev = dev; -+ card->dapm_widgets = macaudio_snd_widgets; -+ card->num_dapm_widgets = ARRAY_SIZE(macaudio_snd_widgets); -+ card->probe = macaudio_probe; -+ card->late_probe = macaudio_late_probe; -+ card->remove = macaudio_remove; -+ card->filter_controls = macaudio_filter_controls; -+ card->remove = macaudio_remove; -+ -+ ret = macaudio_parse_of(data, card); -+ if (ret) -+ return ret; -+ -+ for_each_card_prelinks(card, i, link) { -+ link->ops = &macaudio_ops; -+ link->init = macaudio_init; -+ link->exit = macaudio_exit; -+ } -+ -+ return devm_snd_soc_register_card(dev, card); -+} -+ -+static struct platform_driver macaudio_snd_driver = { -+ .probe = macaudio_snd_platform_probe, -+ .driver = { -+ .name = DRIVER_NAME, -+ .of_match_table = macaudio_snd_device_id, -+ .pm = &snd_soc_pm_ops, -+ }, -+}; -+module_platform_driver(macaudio_snd_driver); -+ -+MODULE_AUTHOR("Martin Povišer "); -+MODULE_DESCRIPTION("Apple Silicon Macs machine sound driver"); -+MODULE_LICENSE("GPL v2"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0081-ASoC-tas2764-Extend-driver-to-SN012776.patch b/target/linux/silicon/patches-5.19/0081-ASoC-tas2764-Extend-driver-to-SN012776.patch deleted file mode 100644 index 8c0be0ef0..000000000 --- a/target/linux/silicon/patches-5.19/0081-ASoC-tas2764-Extend-driver-to-SN012776.patch +++ /dev/null @@ -1,161 +0,0 @@ -From 11d06018fefa454eff591ade9181e20a23acff48 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Fri, 11 Mar 2022 11:55:44 +0100 -Subject: [PATCH 081/171] ASoC: tas2764: Extend driver to SN012776 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -SN012776 is a speaker amp chip found in Apple's 2021 laptops. It appears -similar and more-or-less compatible to TAS2764. Extend the TAS2764 -driver with some SN012776 specifics and configure the chip assuming -it's in one of the Apple machines. - -Signed-off-by: Martin Povišer ---- - sound/soc/codecs/tas2764.c | 51 ++++++++++++++++++++++++++++++++++---- - sound/soc/codecs/tas2764.h | 3 +++ - 2 files changed, 49 insertions(+), 5 deletions(-) - -diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c -index 4cb788f3e5f7..dd36c99e633b 100644 ---- a/sound/soc/codecs/tas2764.c -+++ b/sound/soc/codecs/tas2764.c -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -25,13 +26,20 @@ - - #include "tas2764.h" - -+enum tas2764_devid { -+ DEVID_TAS2764 = 0, -+ DEVID_SN012776 = 1 -+}; -+ - struct tas2764_priv { - struct snd_soc_component *component; - struct gpio_desc *reset_gpio; - struct gpio_desc *sdz_gpio; - struct regmap *regmap; - struct device *dev; -- -+ -+ enum tas2764_devid devid; -+ - int v_sense_slot; - int i_sense_slot; - }; -@@ -502,10 +510,16 @@ static struct snd_soc_dai_driver tas2764_dai_driver[] = { - }, - }; - -+static uint8_t sn012776_bop_presets[] = { -+ 0x01, 0x32, 0x02, 0x22, 0x83, 0x2d, 0x80, 0x02, 0x06, -+ 0x32, 0x46, 0x30, 0x02, 0x06, 0x38, 0x40, 0x30, 0x02, -+ 0x06, 0x3e, 0x37, 0x30, 0xff, 0xe6 -+}; -+ - static int tas2764_codec_probe(struct snd_soc_component *component) - { - struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component); -- int ret; -+ int ret, i; - - tas2764->component = component; - -@@ -532,6 +546,23 @@ static int tas2764_codec_probe(struct snd_soc_component *component) - if (ret < 0) - return ret; - -+ if (tas2764->devid == DEVID_SN012776) { -+ ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL, -+ TAS2764_PWR_CTRL_BOP_SRC, -+ TAS2764_PWR_CTRL_BOP_SRC); -+ if (ret < 0) -+ return ret; -+ -+ for (i = 0; i < ARRAY_SIZE(sn012776_bop_presets); i++) { -+ ret = snd_soc_component_write(component, -+ TAS2764_BOP_CFG0 + i, -+ sn012776_bop_presets[i]); -+ -+ if (ret < 0) -+ return ret; -+ } -+ } -+ - return 0; - } - -@@ -631,9 +662,12 @@ static int tas2764_parse_dt(struct device *dev, struct tas2764_priv *tas2764) - return 0; - } - -+static const struct of_device_id tas2764_of_match[]; -+ - static int tas2764_i2c_probe(struct i2c_client *client) - { - struct tas2764_priv *tas2764; -+ const struct of_device_id *of_id = NULL; - int result; - - tas2764 = devm_kzalloc(&client->dev, sizeof(struct tas2764_priv), -@@ -641,6 +675,14 @@ static int tas2764_i2c_probe(struct i2c_client *client) - if (!tas2764) - return -ENOMEM; - -+ if (client->dev.of_node) -+ of_id = of_match_device(tas2764_of_match, &client->dev); -+ -+ if (of_id) -+ tas2764->devid = (enum tas2764_devid) of_id->data; -+ else -+ tas2764->devid = DEVID_TAS2764; -+ - tas2764->dev = &client->dev; - i2c_set_clientdata(client, tas2764); - dev_set_drvdata(&client->dev, tas2764); -@@ -674,13 +716,12 @@ static const struct i2c_device_id tas2764_i2c_id[] = { - }; - MODULE_DEVICE_TABLE(i2c, tas2764_i2c_id); - --#if defined(CONFIG_OF) - static const struct of_device_id tas2764_of_match[] = { -- { .compatible = "ti,tas2764" }, -+ { .compatible = "ti,tas2764", .data = (void*) DEVID_TAS2764 }, -+ { .compatible = "ti,sn012776", .data = (void*) DEVID_SN012776 }, - {}, - }; - MODULE_DEVICE_TABLE(of, tas2764_of_match); --#endif - - static struct i2c_driver tas2764_i2c_driver = { - .driver = { -diff --git a/sound/soc/codecs/tas2764.h b/sound/soc/codecs/tas2764.h -index f015f22a083b..d7e171a9480c 100644 ---- a/sound/soc/codecs/tas2764.h -+++ b/sound/soc/codecs/tas2764.h -@@ -29,6 +29,7 @@ - #define TAS2764_PWR_CTRL_ACTIVE 0x0 - #define TAS2764_PWR_CTRL_MUTE BIT(0) - #define TAS2764_PWR_CTRL_SHUTDOWN BIT(1) -+#define TAS2764_PWR_CTRL_BOP_SRC BIT(7) - - #define TAS2764_VSENSE_POWER_EN 3 - #define TAS2764_ISENSE_POWER_EN 4 -@@ -87,4 +88,6 @@ - #define TAS2764_TDM_CFG6_ISNS_ENABLE BIT(6) - #define TAS2764_TDM_CFG6_50_MASK GENMASK(5, 0) - -+#define TAS2764_BOP_CFG0 TAS2764_REG(0X0, 0x1d) -+ - #endif /* __TAS2764__ */ --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0082-ASoC-tas2764-Add-workaround-for-spurious-shutdowns-o.patch b/target/linux/silicon/patches-5.19/0082-ASoC-tas2764-Add-workaround-for-spurious-shutdowns-o.patch deleted file mode 100644 index 5df84c5b4..000000000 --- a/target/linux/silicon/patches-5.19/0082-ASoC-tas2764-Add-workaround-for-spurious-shutdowns-o.patch +++ /dev/null @@ -1,147 +0,0 @@ -From b94fc3351432c6a0a75962c4af03750d8879d205 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 13 Mar 2022 03:13:08 +0900 -Subject: [PATCH 082/171] ASoC: tas2764: Add workaround for spurious shutdowns - on SN012776 - -It seems that on SHUTDOWN -> MUTE transitions, the SN012776 can end up -in a borked state raising an overcurrent error. - -Going through the ACTIVE state seems to make it work reliably, so do -that. - -Signed-off-by: Hector Martin ---- - sound/soc/codecs/tas2764.c | 65 +++++++++++++++++++++----------------- - 1 file changed, 36 insertions(+), 29 deletions(-) - -diff --git a/sound/soc/codecs/tas2764.c b/sound/soc/codecs/tas2764.c -index dd36c99e633b..b3c99f470916 100644 ---- a/sound/soc/codecs/tas2764.c -+++ b/sound/soc/codecs/tas2764.c -@@ -58,27 +58,47 @@ static void tas2764_reset(struct tas2764_priv *tas2764) - usleep_range(1000, 2000); - } - -+static int tas2764_set_power(struct tas2764_priv *tas2764, u8 mode) -+{ -+ int ret; -+ -+ // TODO: Does this only affect the SN012776 variant? -+ if (tas2764->devid == DEVID_SN012776 && mode == TAS2764_PWR_CTRL_MUTE) { -+ ret = snd_soc_component_update_bits(tas2764->component, -+ TAS2764_PWR_CTRL, -+ TAS2764_PWR_CTRL_MASK, -+ TAS2764_PWR_CTRL_ACTIVE); -+ if (ret < 0) -+ return ret; -+ } -+ -+ ret = snd_soc_component_update_bits(tas2764->component, -+ TAS2764_PWR_CTRL, -+ TAS2764_PWR_CTRL_MASK, -+ mode); -+ if (ret < 0) -+ return ret; -+ -+ return 0; -+} -+ -+ - static int tas2764_set_bias_level(struct snd_soc_component *component, - enum snd_soc_bias_level level) - { - struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component); -+ u8 mode; - - switch (level) { - case SND_SOC_BIAS_ON: -- snd_soc_component_update_bits(component, TAS2764_PWR_CTRL, -- TAS2764_PWR_CTRL_MASK, -- TAS2764_PWR_CTRL_ACTIVE); -+ mode = TAS2764_PWR_CTRL_ACTIVE; - break; - case SND_SOC_BIAS_STANDBY: - case SND_SOC_BIAS_PREPARE: -- snd_soc_component_update_bits(component, TAS2764_PWR_CTRL, -- TAS2764_PWR_CTRL_MASK, -- TAS2764_PWR_CTRL_MUTE); -+ mode = TAS2764_PWR_CTRL_MUTE; - break; - case SND_SOC_BIAS_OFF: -- snd_soc_component_update_bits(component, TAS2764_PWR_CTRL, -- TAS2764_PWR_CTRL_MASK, -- TAS2764_PWR_CTRL_SHUTDOWN); -+ mode = TAS2764_PWR_CTRL_SHUTDOWN; - break; - - default: -@@ -87,7 +107,7 @@ static int tas2764_set_bias_level(struct snd_soc_component *component, - return -EINVAL; - } - -- return 0; -+ return tas2764_set_power(tas2764, mode); - } - - #ifdef CONFIG_PM -@@ -96,10 +116,7 @@ static int tas2764_codec_suspend(struct snd_soc_component *component) - struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component); - int ret; - -- ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL, -- TAS2764_PWR_CTRL_MASK, -- TAS2764_PWR_CTRL_SHUTDOWN); -- -+ ret = tas2764_set_power(tas2764, TAS2764_PWR_CTRL_SHUTDOWN); - if (ret < 0) - return ret; - -@@ -122,10 +139,7 @@ static int tas2764_codec_resume(struct snd_soc_component *component) - usleep_range(1000, 2000); - } - -- ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL, -- TAS2764_PWR_CTRL_MASK, -- TAS2764_PWR_CTRL_ACTIVE); -- -+ ret = tas2764_set_power(tas2764, TAS2764_PWR_CTRL_ACTIVE); - if (ret < 0) - return ret; - -@@ -154,28 +168,21 @@ static int tas2764_dac_event(struct snd_soc_dapm_widget *w, - { - struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); - struct tas2764_priv *tas2764 = snd_soc_component_get_drvdata(component); -- int ret; -+ u8 mode; - - switch (event) { - case SND_SOC_DAPM_POST_PMU: -- ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL, -- TAS2764_PWR_CTRL_MASK, -- TAS2764_PWR_CTRL_MUTE); -+ mode = TAS2764_PWR_CTRL_MUTE; - break; - case SND_SOC_DAPM_PRE_PMD: -- ret = snd_soc_component_update_bits(component, TAS2764_PWR_CTRL, -- TAS2764_PWR_CTRL_MASK, -- TAS2764_PWR_CTRL_SHUTDOWN); -+ mode = TAS2764_PWR_CTRL_SHUTDOWN; - break; - default: - dev_err(tas2764->dev, "Unsupported event\n"); - return -EINVAL; - } - -- if (ret < 0) -- return ret; -- -- return 0; -+ return tas2764_set_power(tas2764, mode); - } - - static const struct snd_kcontrol_new isense_switch = --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0083-ASoC-macaudio-State-missing-simple-card-utils-depend.patch b/target/linux/silicon/patches-5.19/0083-ASoC-macaudio-State-missing-simple-card-utils-depend.patch deleted file mode 100644 index ac64d224e..000000000 --- a/target/linux/silicon/patches-5.19/0083-ASoC-macaudio-State-missing-simple-card-utils-depend.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 91b1840731bc223fdfa0b86b0d9b1904213e3299 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Martin=20Povi=C5=A1er?= -Date: Tue, 15 Mar 2022 19:41:05 +0100 -Subject: [PATCH 083/171] ASoC: macaudio: State missing simple-card-utils - dependency - -State that the macaudio module depends on simple-card-utils to fix build -errors of the kind: - -ld.lld: error: undefined symbol: asoc_simple_parse_routing ->>> referenced by macaudio.c:59 (sound/soc/apple/macaudio.c:59) ->>> soc/apple/macaudio.o:(macaudio_snd_platform_probe) in archive ---- - sound/soc/apple/Kconfig | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/sound/soc/apple/Kconfig b/sound/soc/apple/Kconfig -index a3f6a97140e2..ce6188aa659d 100644 ---- a/sound/soc/apple/Kconfig -+++ b/sound/soc/apple/Kconfig -@@ -3,6 +3,7 @@ config SND_SOC_APPLE_SILICON - tristate "ASoC machine driver for Apple Silicon Macs" - depends on ARCH_APPLE || COMPILE_TEST - select SND_SOC_APPLE_MCA -+ select SND_SIMPLE_CARD_UTILS - default ARCH_APPLE - help - This option enables an ASoC machine driver for Apple Silicon Macs. --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0084-macaudio-Unbork-jack-volume.patch b/target/linux/silicon/patches-5.19/0084-macaudio-Unbork-jack-volume.patch deleted file mode 100644 index d9889b166..000000000 --- a/target/linux/silicon/patches-5.19/0084-macaudio-Unbork-jack-volume.patch +++ /dev/null @@ -1,25 +0,0 @@ -From ddf6983d9229819248d0373854d32b4e4a0e123d Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sat, 19 Mar 2022 06:06:20 +0900 -Subject: [PATCH 084/171] macaudio: Unbork jack volume - -Signed-off-by: Hector Martin ---- - sound/soc/apple/macaudio.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/sound/soc/apple/macaudio.c b/sound/soc/apple/macaudio.c -index a1f2b1fcea1f..d39ef638ea95 100644 ---- a/sound/soc/apple/macaudio.c -+++ b/sound/soc/apple/macaudio.c -@@ -305,7 +305,6 @@ struct fixed_kctl { - {"Left VSENSE Switch", "Off"}, - {"Right ISENSE Switch", "Off"}, - {"Right VSENSE Switch", "Off"}, -- {"Jack Mixer Volume", "63"}, - { } - }; - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0085-dt-bindings-net-bcm4329-fmac-Add-Apple-properties-ch.patch b/target/linux/silicon/patches-5.19/0085-dt-bindings-net-bcm4329-fmac-Add-Apple-properties-ch.patch deleted file mode 100644 index 29137f449..000000000 --- a/target/linux/silicon/patches-5.19/0085-dt-bindings-net-bcm4329-fmac-Add-Apple-properties-ch.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 4c5d245b445841af3cff2d861a3b461c645b3b57 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 26 Dec 2021 22:04:09 +0900 -Subject: [PATCH 085/171] dt-bindings: net: bcm4329-fmac: Add Apple properties - & chips - -This binding is currently used for SDIO devices, but these chips are -also used as PCIe devices on DT platforms and may be represented in the -DT. Re-use the existing binding and add chip compatibles used by Apple -T2 and M1 platforms (the T2 ones are not known to be used in DT -platforms, but we might as well document them). - -Then, add properties required for firmware selection and calibration on -M1 machines. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../net/wireless/brcm,bcm4329-fmac.yaml | 37 +++++++++++++++++-- - 1 file changed, 34 insertions(+), 3 deletions(-) - -diff --git a/Documentation/devicetree/bindings/net/wireless/brcm,bcm4329-fmac.yaml b/Documentation/devicetree/bindings/net/wireless/brcm,bcm4329-fmac.yaml -index c11f23b20c4c..8b4147c64355 100644 ---- a/Documentation/devicetree/bindings/net/wireless/brcm,bcm4329-fmac.yaml -+++ b/Documentation/devicetree/bindings/net/wireless/brcm,bcm4329-fmac.yaml -@@ -4,7 +4,7 @@ - $id: http://devicetree.org/schemas/net/wireless/brcm,bcm4329-fmac.yaml# - $schema: http://devicetree.org/meta-schemas/core.yaml# - --title: Broadcom BCM4329 family fullmac wireless SDIO devices -+title: Broadcom BCM4329 family fullmac wireless SDIO/PCIE devices - - maintainers: - - Arend van Spriel -@@ -42,10 +42,16 @@ properties: - - cypress,cyw43012-fmac - - const: brcm,bcm4329-fmac - - const: brcm,bcm4329-fmac -+ - enum: -+ - pci14e4,43dc # BCM4355 -+ - pci14e4,4464 # BCM4364 -+ - pci14e4,4488 # BCM4377 -+ - pci14e4,4425 # BCM4378 -+ - pci14e4,4433 # BCM4387 - - reg: -- description: SDIO function number for the device, for most cases -- this will be 1. -+ description: SDIO function number for the device (for most cases -+ this will be 1) or PCI device identifier. - - interrupts: - maxItems: 1 -@@ -75,6 +81,31 @@ properties: - items: - pattern: '^[A-Z][A-Z]-[A-Z][0-9A-Z]-[0-9]+$' - -+ brcm,cal-blob: -+ $ref: /schemas/types.yaml#/definitions/uint8-array -+ description: A per-device calibration blob for the Wi-Fi radio. This -+ should be filled in by the bootloader from platform configuration -+ data, if necessary, and will be uploaded to the device if present. -+ -+ brcm,board-type: -+ $ref: /schemas/types.yaml#/definitions/string -+ description: Overrides the board type, which is normally the compatible of -+ the root node. This can be used to decouple the overall system board or -+ device name from the board type for WiFi purposes, which is used to -+ construct firmware and NVRAM configuration filenames, allowing for -+ multiple devices that share the same module or characteristics for the -+ WiFi subsystem to share the same firmware/NVRAM files. On Apple platforms, -+ this should be the Apple module-instance codename prefixed by "apple,", -+ e.g. "apple,honshu". -+ -+ apple,antenna-sku: -+ $ref: /schemas/types.yaml#/definitions/string -+ description: Antenna SKU used to identify a specific antenna configuration -+ on Apple platforms. This is use to build firmware filenames, to allow -+ platforms with different antenna configs to have different firmware and/or -+ NVRAM. This would normally be filled in by the bootloader from platform -+ configuration data. -+ - required: - - compatible - - reg --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0086-brcmfmac-firmware-Handle-per-board-clm_blob-files.patch b/target/linux/silicon/patches-5.19/0086-brcmfmac-firmware-Handle-per-board-clm_blob-files.patch deleted file mode 100644 index 202bae11e..000000000 --- a/target/linux/silicon/patches-5.19/0086-brcmfmac-firmware-Handle-per-board-clm_blob-files.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 6e3dabd08775a78c7a6ba10779bdb9418852cd1b Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sat, 18 Dec 2021 20:52:04 +0900 -Subject: [PATCH 086/171] brcmfmac: firmware: Handle per-board clm_blob files - -Teach brcm_alt_fw_paths to correctly split off variable length -extensions, and enable alt firmware lookups for the CLM blob firmware -requests. - -Apple platforms have per-board CLM blob files. - -Acked-by: Linus Walleij -Reviewed-by: Arend van Spriel -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/firmware.c | 33 +++++++++++-------- - 1 file changed, 20 insertions(+), 13 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -index dcbe55b56e43..deacd39b3f7b 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -@@ -596,22 +596,29 @@ static int brcmf_fw_complete_request(const struct firmware *fw, - - static char *brcm_alt_fw_path(const char *path, const char *board_type) - { -- char alt_path[BRCMF_FW_NAME_LEN]; -- char suffix[5]; -+ char base[BRCMF_FW_NAME_LEN]; -+ const char *suffix; -+ char *ret; - -- strscpy(alt_path, path, BRCMF_FW_NAME_LEN); -- /* At least one character + suffix */ -- if (strlen(alt_path) < 5) -+ if (!board_type) - return NULL; - -- /* strip .txt or .bin at the end */ -- strscpy(suffix, alt_path + strlen(alt_path) - 4, 5); -- alt_path[strlen(alt_path) - 4] = 0; -- strlcat(alt_path, ".", BRCMF_FW_NAME_LEN); -- strlcat(alt_path, board_type, BRCMF_FW_NAME_LEN); -- strlcat(alt_path, suffix, BRCMF_FW_NAME_LEN); -+ suffix = strrchr(path, '.'); -+ if (!suffix || suffix == path) -+ return NULL; -+ -+ /* strip extension at the end */ -+ strscpy(base, path, BRCMF_FW_NAME_LEN); -+ base[suffix - path] = 0; -+ -+ ret = kasprintf(GFP_KERNEL, "%s.%s%s", base, board_type, suffix); -+ if (!ret) -+ brcmf_err("out of memory allocating firmware path for '%s'\n", -+ path); -+ -+ brcmf_dbg(TRACE, "FW alt path: %s\n", ret); - -- return kstrdup(alt_path, GFP_KERNEL); -+ return ret; - } - - static int brcmf_fw_request_firmware(const struct firmware **fw, -@@ -621,7 +628,7 @@ static int brcmf_fw_request_firmware(const struct firmware **fw, - int ret; - - /* Files can be board-specific, first try a board-specific path */ -- if (cur->type == BRCMF_FW_TYPE_NVRAM && fwctx->req->board_type) { -+ if (fwctx->req->board_type) { - char *alt_path; - - alt_path = brcm_alt_fw_path(cur->path, fwctx->req->board_type); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0087-brcmfmac-pcie-sdio-usb-Get-CLM-blob-via-standard-fir.patch b/target/linux/silicon/patches-5.19/0087-brcmfmac-pcie-sdio-usb-Get-CLM-blob-via-standard-fir.patch deleted file mode 100644 index df39e2a68..000000000 --- a/target/linux/silicon/patches-5.19/0087-brcmfmac-pcie-sdio-usb-Get-CLM-blob-via-standard-fir.patch +++ /dev/null @@ -1,376 +0,0 @@ -From a0e0f6cebc9a2112a11c56d0f6c55681cf2b120d Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:13:49 +0900 -Subject: [PATCH 087/171] brcmfmac: pcie/sdio/usb: Get CLM blob via standard - firmware mechanism - -Now that the firmware fetcher can handle per-board CLM files, load the -CLM blob alongside the other firmware files and change the bus API to -just return the existing blob, instead of fetching the filename. - -This enables per-board CLM blobs, which are required on Apple platforms. - -Acked-by: Linus Walleij -Reviewed-by: Arend van Spriel -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/bus.h | 19 ++++++--- - .../broadcom/brcm80211/brcmfmac/common.c | 12 +----- - .../broadcom/brcm80211/brcmfmac/pcie.c | 39 ++++++++++++------- - .../broadcom/brcm80211/brcmfmac/sdio.c | 36 ++++++++++------- - .../broadcom/brcm80211/brcmfmac/sdio.h | 2 + - .../broadcom/brcm80211/brcmfmac/usb.c | 23 +++-------- - 6 files changed, 69 insertions(+), 62 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -index 3f5da3bb6aa5..b13af8f631f3 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -@@ -7,6 +7,8 @@ - #define BRCMFMAC_BUS_H - - #include "debug.h" -+#include -+#include - - /* IDs of the 6 default common rings of msgbuf protocol */ - #define BRCMF_H2D_MSGRING_CONTROL_SUBMIT 0 -@@ -34,6 +36,11 @@ enum brcmf_bus_protocol_type { - BRCMF_PROTO_MSGBUF - }; - -+/* Firmware blobs that may be available */ -+enum brcmf_blob_type { -+ BRCMF_BLOB_CLM, -+}; -+ - struct brcmf_mp_device; - - struct brcmf_bus_dcmd { -@@ -60,7 +67,7 @@ struct brcmf_bus_dcmd { - * @wowl_config: specify if dongle is configured for wowl when going to suspend - * @get_ramsize: obtain size of device memory. - * @get_memdump: obtain device memory dump in provided buffer. -- * @get_fwname: obtain firmware name. -+ * @get_blob: obtain a firmware blob. - * - * This structure provides an abstract interface towards the - * bus specific driver. For control messages to common driver -@@ -77,8 +84,8 @@ struct brcmf_bus_ops { - void (*wowl_config)(struct device *dev, bool enabled); - size_t (*get_ramsize)(struct device *dev); - int (*get_memdump)(struct device *dev, void *data, size_t len); -- int (*get_fwname)(struct device *dev, const char *ext, -- unsigned char *fw_name); -+ int (*get_blob)(struct device *dev, const struct firmware **fw, -+ enum brcmf_blob_type type); - void (*debugfs_create)(struct device *dev); - int (*reset)(struct device *dev); - }; -@@ -220,10 +227,10 @@ int brcmf_bus_get_memdump(struct brcmf_bus *bus, void *data, size_t len) - } - - static inline --int brcmf_bus_get_fwname(struct brcmf_bus *bus, const char *ext, -- unsigned char *fw_name) -+int brcmf_bus_get_blob(struct brcmf_bus *bus, const struct firmware **fw, -+ enum brcmf_blob_type type) - { -- return bus->ops->get_fwname(bus->dev, ext, fw_name); -+ return bus->ops->get_blob(bus->dev, fw, type); - } - - static inline -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -index fe01da9e620d..95d4c133efdd 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -@@ -123,7 +123,6 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) - struct brcmf_bus *bus = drvr->bus_if; - struct brcmf_dload_data_le *chunk_buf; - const struct firmware *clm = NULL; -- u8 clm_name[BRCMF_FW_NAME_LEN]; - u32 chunk_len; - u32 datalen; - u32 cumulative_len; -@@ -133,15 +132,8 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) - - brcmf_dbg(TRACE, "Enter\n"); - -- memset(clm_name, 0, sizeof(clm_name)); -- err = brcmf_bus_get_fwname(bus, ".clm_blob", clm_name); -- if (err) { -- bphy_err(drvr, "get CLM blob file name failed (%d)\n", err); -- return err; -- } -- -- err = firmware_request_nowarn(&clm, clm_name, bus->dev); -- if (err) { -+ err = brcmf_bus_get_blob(bus, &clm, BRCMF_BLOB_CLM); -+ if (err || !clm) { - brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n", - err); - return 0; -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 97f0f13dfe50..ec73d2620ec9 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -66,6 +66,7 @@ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.txt"); - - /* per-board firmware binaries */ - MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.bin"); -+MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.clm_blob"); - - static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602), -@@ -261,6 +262,8 @@ struct brcmf_pciedev_info { - struct pci_dev *pdev; - char fw_name[BRCMF_FW_NAME_LEN]; - char nvram_name[BRCMF_FW_NAME_LEN]; -+ char clm_name[BRCMF_FW_NAME_LEN]; -+ const struct firmware *clm_fw; - void __iomem *regs; - void __iomem *tcm; - u32 ram_base; -@@ -1382,23 +1385,25 @@ static int brcmf_pcie_get_memdump(struct device *dev, void *data, size_t len) - return 0; - } - --static --int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name) -+static int brcmf_pcie_get_blob(struct device *dev, const struct firmware **fw, -+ enum brcmf_blob_type type) - { - struct brcmf_bus *bus_if = dev_get_drvdata(dev); -- struct brcmf_fw_request *fwreq; -- struct brcmf_fw_name fwnames[] = { -- { ext, fw_name }, -- }; -+ struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie; -+ struct brcmf_pciedev_info *devinfo = buspub->devinfo; - -- fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev, -- brcmf_pcie_fwnames, -- ARRAY_SIZE(brcmf_pcie_fwnames), -- fwnames, ARRAY_SIZE(fwnames)); -- if (!fwreq) -- return -ENOMEM; -+ switch (type) { -+ case BRCMF_BLOB_CLM: -+ *fw = devinfo->clm_fw; -+ devinfo->clm_fw = NULL; -+ break; -+ default: -+ return -ENOENT; -+ } -+ -+ if (!*fw) -+ return -ENOENT; - -- kfree(fwreq); - return 0; - } - -@@ -1445,7 +1450,7 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = { - .wowl_config = brcmf_pcie_wowl_config, - .get_ramsize = brcmf_pcie_get_ramsize, - .get_memdump = brcmf_pcie_get_memdump, -- .get_fwname = brcmf_pcie_get_fwname, -+ .get_blob = brcmf_pcie_get_blob, - .reset = brcmf_pcie_reset, - }; - -@@ -1731,6 +1736,7 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = { - - #define BRCMF_PCIE_FW_CODE 0 - #define BRCMF_PCIE_FW_NVRAM 1 -+#define BRCMF_PCIE_FW_CLM 2 - - static void brcmf_pcie_setup(struct device *dev, int ret, - struct brcmf_fw_request *fwreq) -@@ -1755,6 +1761,7 @@ static void brcmf_pcie_setup(struct device *dev, int ret, - fw = fwreq->items[BRCMF_PCIE_FW_CODE].binary; - nvram = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.data; - nvram_len = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.len; -+ devinfo->clm_fw = fwreq->items[BRCMF_PCIE_FW_CLM].binary; - kfree(fwreq); - - ret = brcmf_chip_get_raminfo(devinfo->ci); -@@ -1830,6 +1837,7 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) - struct brcmf_fw_name fwnames[] = { - { ".bin", devinfo->fw_name }, - { ".txt", devinfo->nvram_name }, -+ { ".clm_blob", devinfo->clm_name }, - }; - - fwreq = brcmf_fw_alloc_request(devinfo->ci->chip, devinfo->ci->chiprev, -@@ -1842,6 +1850,8 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) - fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY; - fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM; - fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL; -+ fwreq->items[BRCMF_PCIE_FW_CLM].type = BRCMF_FW_TYPE_BINARY; -+ fwreq->items[BRCMF_PCIE_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL; - fwreq->board_type = devinfo->settings->board_type; - /* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */ - fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1; -@@ -1981,6 +1991,7 @@ brcmf_pcie_remove(struct pci_dev *pdev) - brcmf_pcie_release_ringbuffers(devinfo); - brcmf_pcie_reset_device(devinfo); - brcmf_pcie_release_resource(devinfo); -+ release_firmware(devinfo->clm_fw); - - if (devinfo->ci) - brcmf_chip_detach(devinfo->ci); -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -index 212fbbe1cd7e..27dc8ed29ac8 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -@@ -4130,23 +4130,24 @@ brcmf_sdio_watchdog(struct timer_list *t) - } - } - --static --int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name) -+static int brcmf_sdio_get_blob(struct device *dev, const struct firmware **fw, -+ enum brcmf_blob_type type) - { - struct brcmf_bus *bus_if = dev_get_drvdata(dev); -- struct brcmf_fw_request *fwreq; -- struct brcmf_fw_name fwnames[] = { -- { ext, fw_name }, -- }; -+ struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; - -- fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev, -- brcmf_sdio_fwnames, -- ARRAY_SIZE(brcmf_sdio_fwnames), -- fwnames, ARRAY_SIZE(fwnames)); -- if (!fwreq) -- return -ENOMEM; -+ switch (type) { -+ case BRCMF_BLOB_CLM: -+ *fw = sdiodev->clm_fw; -+ sdiodev->clm_fw = NULL; -+ break; -+ default: -+ return -ENOENT; -+ } -+ -+ if (!*fw) -+ return -ENOENT; - -- kfree(fwreq); - return 0; - } - -@@ -4189,13 +4190,14 @@ static const struct brcmf_bus_ops brcmf_sdio_bus_ops = { - .wowl_config = brcmf_sdio_wowl_config, - .get_ramsize = brcmf_sdio_bus_get_ramsize, - .get_memdump = brcmf_sdio_bus_get_memdump, -- .get_fwname = brcmf_sdio_get_fwname, -+ .get_blob = brcmf_sdio_get_blob, - .debugfs_create = brcmf_sdio_debugfs_create, - .reset = brcmf_sdio_bus_reset - }; - - #define BRCMF_SDIO_FW_CODE 0 - #define BRCMF_SDIO_FW_NVRAM 1 -+#define BRCMF_SDIO_FW_CLM 2 - - static void brcmf_sdio_firmware_callback(struct device *dev, int err, - struct brcmf_fw_request *fwreq) -@@ -4218,6 +4220,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err, - code = fwreq->items[BRCMF_SDIO_FW_CODE].binary; - nvram = fwreq->items[BRCMF_SDIO_FW_NVRAM].nv_data.data; - nvram_len = fwreq->items[BRCMF_SDIO_FW_NVRAM].nv_data.len; -+ sdiod->clm_fw = fwreq->items[BRCMF_SDIO_FW_CLM].binary; - kfree(fwreq); - - /* try to download image and nvram to the dongle */ -@@ -4416,6 +4419,7 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus) - struct brcmf_fw_name fwnames[] = { - { ".bin", bus->sdiodev->fw_name }, - { ".txt", bus->sdiodev->nvram_name }, -+ { ".clm_blob", bus->sdiodev->clm_name }, - }; - - fwreq = brcmf_fw_alloc_request(bus->ci->chip, bus->ci->chiprev, -@@ -4427,6 +4431,8 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus) - - fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY; - fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM; -+ fwreq->items[BRCMF_SDIO_FW_CLM].type = BRCMF_FW_TYPE_BINARY; -+ fwreq->items[BRCMF_SDIO_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL; - fwreq->board_type = bus->sdiodev->settings->board_type; - - return fwreq; -@@ -4583,6 +4589,8 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus) - if (bus->sdiodev->settings) - brcmf_release_module_param(bus->sdiodev->settings); - -+ release_firmware(bus->sdiodev->clm_fw); -+ bus->sdiodev->clm_fw = NULL; - kfree(bus->rxbuf); - kfree(bus->hdrbuf); - kfree(bus); -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h -index 15d2c02fa3ec..7b74c295e4c9 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h -@@ -186,9 +186,11 @@ struct brcmf_sdio_dev { - struct sg_table sgtable; - char fw_name[BRCMF_FW_NAME_LEN]; - char nvram_name[BRCMF_FW_NAME_LEN]; -+ char clm_name[BRCMF_FW_NAME_LEN]; - bool wowl_enabled; - enum brcmf_sdiod_state state; - struct brcmf_sdiod_freezer *freezer; -+ const struct firmware *clm_fw; - }; - - /* sdio core registers */ -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c -index 9fb68c2dc7e3..85e18fb9c497 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c -@@ -1154,24 +1154,11 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo, - return NULL; - } - --static --int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name) -+static int brcmf_usb_get_blob(struct device *dev, const struct firmware **fw, -+ enum brcmf_blob_type type) - { -- struct brcmf_bus *bus = dev_get_drvdata(dev); -- struct brcmf_fw_request *fwreq; -- struct brcmf_fw_name fwnames[] = { -- { ext, fw_name }, -- }; -- -- fwreq = brcmf_fw_alloc_request(bus->chip, bus->chiprev, -- brcmf_usb_fwnames, -- ARRAY_SIZE(brcmf_usb_fwnames), -- fwnames, ARRAY_SIZE(fwnames)); -- if (!fwreq) -- return -ENOMEM; -- -- kfree(fwreq); -- return 0; -+ /* No blobs for USB devices... */ -+ return -ENOENT; - } - - static const struct brcmf_bus_ops brcmf_usb_bus_ops = { -@@ -1180,7 +1167,7 @@ static const struct brcmf_bus_ops brcmf_usb_bus_ops = { - .txdata = brcmf_usb_tx, - .txctl = brcmf_usb_tx_ctlpkt, - .rxctl = brcmf_usb_rx_ctlpkt, -- .get_fwname = brcmf_usb_get_fwname, -+ .get_blob = brcmf_usb_get_blob, - }; - - #define BRCMF_USB_FW_CODE 0 --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0088-brcmfmac-firmware-Support-passing-in-multiple-board_.patch b/target/linux/silicon/patches-5.19/0088-brcmfmac-firmware-Support-passing-in-multiple-board_.patch deleted file mode 100644 index c8ea1a0c8..000000000 --- a/target/linux/silicon/patches-5.19/0088-brcmfmac-firmware-Support-passing-in-multiple-board_.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 95500b48e476af858b0a3ae6c96d9fe8ab92cb61 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 7 Jan 2022 11:14:44 +0900 -Subject: [PATCH 088/171] brcmfmac: firmware: Support passing in multiple - board_types - -Apple platforms have firmware and config files identified with multiple -dimensions. We want to be able to find the most specific firmware -available for any given platform, progressively trying more general -firmwares. - -To do this, first add support for passing in multiple board_types, -which will be tried in sequence. - -Since this will cause more log spam due to missing firmwares, also -switch the secondary firmware fecthes to use the _nowarn variant, which -will not log if the firmware is not found. - -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/firmware.c | 53 +++++++++++++++---- - .../broadcom/brcm80211/brcmfmac/firmware.h | 4 +- - .../broadcom/brcm80211/brcmfmac/pcie.c | 4 +- - .../broadcom/brcm80211/brcmfmac/sdio.c | 2 +- - 4 files changed, 49 insertions(+), 14 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -index deacd39b3f7b..d04a59cf4a1e 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -@@ -430,6 +430,7 @@ struct brcmf_fw { - struct device *dev; - struct brcmf_fw_request *req; - u32 curpos; -+ unsigned int board_index; - void (*done)(struct device *dev, int err, struct brcmf_fw_request *req); - }; - -@@ -625,17 +626,21 @@ static int brcmf_fw_request_firmware(const struct firmware **fw, - struct brcmf_fw *fwctx) - { - struct brcmf_fw_item *cur = &fwctx->req->items[fwctx->curpos]; -+ unsigned int i; - int ret; - -- /* Files can be board-specific, first try a board-specific path */ -- if (fwctx->req->board_type) { -+ /* Files can be board-specific, first try board-specific paths */ -+ for (i = 0; i < ARRAY_SIZE(fwctx->req->board_types); i++) { - char *alt_path; - -- alt_path = brcm_alt_fw_path(cur->path, fwctx->req->board_type); -+ if (!fwctx->req->board_types[i]) -+ goto fallback; -+ alt_path = brcm_alt_fw_path(cur->path, -+ fwctx->req->board_types[i]); - if (!alt_path) - goto fallback; - -- ret = request_firmware(fw, alt_path, fwctx->dev); -+ ret = firmware_request_nowarn(fw, alt_path, fwctx->dev); - kfree(alt_path); - if (ret == 0) - return ret; -@@ -669,15 +674,40 @@ static void brcmf_fw_request_done_alt_path(const struct firmware *fw, void *ctx) - { - struct brcmf_fw *fwctx = ctx; - struct brcmf_fw_item *first = &fwctx->req->items[0]; -+ const char *board_type, *alt_path; - int ret = 0; - -- /* Fall back to canonical path if board firmware not found */ -- if (!fw) -- ret = request_firmware_nowait(THIS_MODULE, true, first->path, -+ if (fw) { -+ brcmf_fw_request_done(fw, ctx); -+ return; -+ } -+ -+ /* Try next board firmware */ -+ if (fwctx->board_index < ARRAY_SIZE(fwctx->req->board_types)) { -+ board_type = fwctx->req->board_types[fwctx->board_index++]; -+ if (!board_type) -+ goto fallback; -+ alt_path = brcm_alt_fw_path(first->path, board_type); -+ if (!alt_path) -+ goto fallback; -+ -+ ret = request_firmware_nowait(THIS_MODULE, true, alt_path, - fwctx->dev, GFP_KERNEL, fwctx, -- brcmf_fw_request_done); -+ brcmf_fw_request_done_alt_path); -+ kfree(alt_path); - -- if (fw || ret < 0) -+ if (ret < 0) -+ brcmf_fw_request_done(fw, ctx); -+ return; -+ } -+ -+fallback: -+ /* Fall back to canonical path if board firmware not found */ -+ ret = request_firmware_nowait(THIS_MODULE, true, first->path, -+ fwctx->dev, GFP_KERNEL, fwctx, -+ brcmf_fw_request_done); -+ -+ if (ret < 0) - brcmf_fw_request_done(fw, ctx); - } - -@@ -721,10 +751,11 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req, - fwctx->done = fw_cb; - - /* First try alternative board-specific path if any */ -- if (fwctx->req->board_type) -+ if (fwctx->req->board_types[0]) - alt_path = brcm_alt_fw_path(first->path, -- fwctx->req->board_type); -+ fwctx->req->board_types[0]); - if (alt_path) { -+ fwctx->board_index++; - ret = request_firmware_nowait(THIS_MODULE, true, alt_path, - fwctx->dev, GFP_KERNEL, fwctx, - brcmf_fw_request_done_alt_path); -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h -index e290dec9c53d..1266cbaee072 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h -@@ -11,6 +11,8 @@ - - #define BRCMF_FW_DEFAULT_PATH "brcm/" - -+#define BRCMF_FW_MAX_BOARD_TYPES 8 -+ - /** - * struct brcmf_firmware_mapping - Used to map chipid/revmask to firmware - * filename and nvram filename. Each bus type implementation should create -@@ -66,7 +68,7 @@ struct brcmf_fw_request { - u16 domain_nr; - u16 bus_nr; - u32 n_items; -- const char *board_type; -+ const char *board_types[BRCMF_FW_MAX_BOARD_TYPES]; - struct brcmf_fw_item items[]; - }; - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index ec73d2620ec9..2a74c9d8d46a 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -1852,11 +1852,13 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) - fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL; - fwreq->items[BRCMF_PCIE_FW_CLM].type = BRCMF_FW_TYPE_BINARY; - fwreq->items[BRCMF_PCIE_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL; -- fwreq->board_type = devinfo->settings->board_type; - /* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */ - fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1; - fwreq->bus_nr = devinfo->pdev->bus->number; - -+ brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type); -+ fwreq->board_types[0] = devinfo->settings->board_type; -+ - return fwreq; - } - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -index 27dc8ed29ac8..2b71991f7d9b 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -@@ -4433,7 +4433,7 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus) - fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM; - fwreq->items[BRCMF_SDIO_FW_CLM].type = BRCMF_FW_TYPE_BINARY; - fwreq->items[BRCMF_SDIO_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL; -- fwreq->board_type = bus->sdiodev->settings->board_type; -+ fwreq->board_types[0] = bus->sdiodev->settings->board_type; - - return fwreq; - } --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0089-brcmfmac-pcie-Read-Apple-OTP-information.patch b/target/linux/silicon/patches-5.19/0089-brcmfmac-pcie-Read-Apple-OTP-information.patch deleted file mode 100644 index e98372f37..000000000 --- a/target/linux/silicon/patches-5.19/0089-brcmfmac-pcie-Read-Apple-OTP-information.patch +++ /dev/null @@ -1,299 +0,0 @@ -From e5b8ff4d315b814e2d81e40838a6df7164f61a77 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:26:34 +0900 -Subject: [PATCH 089/171] brcmfmac: pcie: Read Apple OTP information - -On Apple platforms, the One Time Programmable ROM in the Broadcom chips -contains information about the specific board design (module, vendor, -version) that is required to select the correct NVRAM file. Parse this -OTP ROM and extract the required strings. - -Note that the user OTP offset/size is per-chip. This patch does not add -any chips yet. - -Reviewed-by: Arend van Spriel -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/pcie.c | 218 ++++++++++++++++++ - include/linux/bcma/bcma_driver_chipcommon.h | 1 + - 2 files changed, 219 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 2a74c9d8d46a..17d0353e9105 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -256,6 +256,15 @@ struct brcmf_pcie_core_info { - u32 wrapbase; - }; - -+#define BRCMF_OTP_MAX_PARAM_LEN 16 -+ -+struct brcmf_otp_params { -+ char module[BRCMF_OTP_MAX_PARAM_LEN]; -+ char vendor[BRCMF_OTP_MAX_PARAM_LEN]; -+ char version[BRCMF_OTP_MAX_PARAM_LEN]; -+ bool valid; -+}; -+ - struct brcmf_pciedev_info { - enum brcmf_pcie_state state; - bool in_irq; -@@ -283,6 +292,7 @@ struct brcmf_pciedev_info { - void (*write_ptr)(struct brcmf_pciedev_info *devinfo, u32 mem_offset, - u16 value); - struct brcmf_mp_device *settings; -+ struct brcmf_otp_params otp; - }; - - struct brcmf_pcie_ringbuf { -@@ -354,6 +364,14 @@ static void brcmf_pcie_setup(struct device *dev, int ret, - static struct brcmf_fw_request * - brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo); - -+static u16 -+brcmf_pcie_read_reg16(struct brcmf_pciedev_info *devinfo, u32 reg_offset) -+{ -+ void __iomem *address = devinfo->regs + reg_offset; -+ -+ return ioread16(address); -+} -+ - static u32 - brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset) - { -@@ -499,6 +517,8 @@ brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset, - } - - -+#define READCC32(devinfo, reg) brcmf_pcie_read_reg32(devinfo, \ -+ CHIPCREGOFFS(reg)) - #define WRITECC32(devinfo, reg, value) brcmf_pcie_write_reg32(devinfo, \ - CHIPCREGOFFS(reg), value) - -@@ -1734,6 +1754,198 @@ static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = { - .write32 = brcmf_pcie_buscore_write32, - }; - -+#define BRCMF_OTP_SYS_VENDOR 0x15 -+#define BRCMF_OTP_BRCM_CIS 0x80 -+ -+#define BRCMF_OTP_VENDOR_HDR 0x00000008 -+ -+static int -+brcmf_pcie_parse_otp_sys_vendor(struct brcmf_pciedev_info *devinfo, -+ u8 *data, size_t size) -+{ -+ int idx = 4; -+ const char *chip_params; -+ const char *board_params; -+ const char *p; -+ -+ /* 4-byte header and two empty strings */ -+ if (size < 6) -+ return -EINVAL; -+ -+ if (get_unaligned_le32(data) != BRCMF_OTP_VENDOR_HDR) -+ return -EINVAL; -+ -+ chip_params = &data[idx]; -+ -+ /* Skip first string, including terminator */ -+ idx += strnlen(chip_params, size - idx) + 1; -+ if (idx >= size) -+ return -EINVAL; -+ -+ board_params = &data[idx]; -+ -+ /* Skip to terminator of second string */ -+ idx += strnlen(board_params, size - idx); -+ if (idx >= size) -+ return -EINVAL; -+ -+ /* At this point both strings are guaranteed NUL-terminated */ -+ brcmf_dbg(PCIE, "OTP: chip_params='%s' board_params='%s'\n", -+ chip_params, board_params); -+ -+ p = skip_spaces(board_params); -+ while (*p) { -+ char tag = *p++; -+ const char *end; -+ size_t len; -+ -+ if (*p++ != '=') /* implicit NUL check */ -+ return -EINVAL; -+ -+ /* *p might be NUL here, if so end == p and len == 0 */ -+ end = strchrnul(p, ' '); -+ len = end - p; -+ -+ /* leave 1 byte for NUL in destination string */ -+ if (len > (BRCMF_OTP_MAX_PARAM_LEN - 1)) -+ return -EINVAL; -+ -+ /* Copy len characters plus a NUL terminator */ -+ switch (tag) { -+ case 'M': -+ strscpy(devinfo->otp.module, p, len + 1); -+ break; -+ case 'V': -+ strscpy(devinfo->otp.vendor, p, len + 1); -+ break; -+ case 'm': -+ strscpy(devinfo->otp.version, p, len + 1); -+ break; -+ } -+ -+ /* Skip to next arg, if any */ -+ p = skip_spaces(end); -+ } -+ -+ brcmf_dbg(PCIE, "OTP: module=%s vendor=%s version=%s\n", -+ devinfo->otp.module, devinfo->otp.vendor, -+ devinfo->otp.version); -+ -+ if (!devinfo->otp.module[0] || -+ !devinfo->otp.vendor[0] || -+ !devinfo->otp.version[0]) -+ return -EINVAL; -+ -+ devinfo->otp.valid = true; -+ return 0; -+} -+ -+static int -+brcmf_pcie_parse_otp(struct brcmf_pciedev_info *devinfo, u8 *otp, size_t size) -+{ -+ int p = 0; -+ int ret = -EINVAL; -+ -+ brcmf_dbg(PCIE, "parse_otp size=%ld\n", size); -+ -+ while (p < (size - 1)) { -+ u8 type = otp[p]; -+ u8 length = otp[p + 1]; -+ -+ if (type == 0) -+ break; -+ -+ if ((p + 2 + length) > size) -+ break; -+ -+ switch (type) { -+ case BRCMF_OTP_SYS_VENDOR: -+ brcmf_dbg(PCIE, "OTP @ 0x%x (%d): SYS_VENDOR\n", -+ p, length); -+ ret = brcmf_pcie_parse_otp_sys_vendor(devinfo, -+ &otp[p + 2], -+ length); -+ break; -+ case BRCMF_OTP_BRCM_CIS: -+ brcmf_dbg(PCIE, "OTP @ 0x%x (%d): BRCM_CIS\n", -+ p, length); -+ break; -+ default: -+ brcmf_dbg(PCIE, "OTP @ 0x%x (%d): Unknown type 0x%x\n", -+ p, length, type); -+ break; -+ } -+ -+ p += 2 + length; -+ } -+ -+ return ret; -+} -+ -+static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) -+{ -+ const struct pci_dev *pdev = devinfo->pdev; -+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev); -+ u32 coreid, base, words, idx, sromctl; -+ u16 *otp; -+ struct brcmf_core *core; -+ int ret; -+ -+ switch (devinfo->ci->chip) { -+ default: -+ /* OTP not supported on this chip */ -+ return 0; -+ } -+ -+ core = brcmf_chip_get_core(devinfo->ci, coreid); -+ if (!core) { -+ brcmf_err(bus, "No OTP core\n"); -+ return -ENODEV; -+ } -+ -+ if (coreid == BCMA_CORE_CHIPCOMMON) { -+ /* Chips with OTP accessed via ChipCommon need additional -+ * handling to access the OTP -+ */ -+ brcmf_pcie_select_core(devinfo, coreid); -+ sromctl = READCC32(devinfo, sromcontrol); -+ -+ if (!(sromctl & BCMA_CC_SROM_CONTROL_OTP_PRESENT)) { -+ /* Chip lacks OTP, try without it... */ -+ brcmf_err(bus, -+ "OTP unavailable, using default firmware\n"); -+ return 0; -+ } -+ -+ /* Map OTP to shadow area */ -+ WRITECC32(devinfo, sromcontrol, -+ sromctl | BCMA_CC_SROM_CONTROL_OTPSEL); -+ } -+ -+ otp = kcalloc(words, sizeof(u16), GFP_KERNEL); -+ if (!otp) -+ return -ENOMEM; -+ -+ /* Map bus window to SROM/OTP shadow area in core */ -+ base = brcmf_pcie_buscore_prep_addr(devinfo->pdev, base + core->base); -+ -+ brcmf_dbg(PCIE, "OTP data:\n"); -+ for (idx = 0; idx < words; idx++) { -+ otp[idx] = brcmf_pcie_read_reg16(devinfo, base + 2 * idx); -+ brcmf_dbg(PCIE, "[%8x] 0x%04x\n", base + 2 * idx, otp[idx]); -+ } -+ -+ if (coreid == BCMA_CORE_CHIPCOMMON) { -+ brcmf_pcie_select_core(devinfo, coreid); -+ WRITECC32(devinfo, sromcontrol, sromctl); -+ } -+ -+ ret = brcmf_pcie_parse_otp(devinfo, (u8 *)otp, 2 * words); -+ kfree(otp); -+ -+ return ret; -+} -+ - #define BRCMF_PCIE_FW_CODE 0 - #define BRCMF_PCIE_FW_NVRAM 1 - #define BRCMF_PCIE_FW_CLM 2 -@@ -1930,6 +2142,12 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) - if (ret) - goto fail_bus; - -+ ret = brcmf_pcie_read_otp(devinfo); -+ if (ret) { -+ brcmf_err(bus, "failed to parse OTP\n"); -+ goto fail_brcmf; -+ } -+ - fwreq = brcmf_pcie_prepare_fw_request(devinfo); - if (!fwreq) { - ret = -ENOMEM; -diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h -index e3314f746bfa..2d94c30ed439 100644 ---- a/include/linux/bcma/bcma_driver_chipcommon.h -+++ b/include/linux/bcma/bcma_driver_chipcommon.h -@@ -271,6 +271,7 @@ - #define BCMA_CC_SROM_CONTROL_OP_WRDIS 0x40000000 - #define BCMA_CC_SROM_CONTROL_OP_WREN 0x60000000 - #define BCMA_CC_SROM_CONTROL_OTPSEL 0x00000010 -+#define BCMA_CC_SROM_CONTROL_OTP_PRESENT 0x00000020 - #define BCMA_CC_SROM_CONTROL_LOCK 0x00000008 - #define BCMA_CC_SROM_CONTROL_SIZE_MASK 0x00000006 - #define BCMA_CC_SROM_CONTROL_SIZE_1K 0x00000000 --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0090-brcmfmac-of-Fetch-Apple-properties.patch b/target/linux/silicon/patches-5.19/0090-brcmfmac-of-Fetch-Apple-properties.patch deleted file mode 100644 index fd8b9803f..000000000 --- a/target/linux/silicon/patches-5.19/0090-brcmfmac-of-Fetch-Apple-properties.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 59a447e856db9a2c8312d617a6a4f89a629d1bff Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:27:19 +0900 -Subject: [PATCH 090/171] brcmfmac: of: Fetch Apple properties - -On Apple ARM64 platforms, firmware selection requires two properties -that come from system firmware: the module-instance (aka "island", a -codename representing a given hardware platform) and the antenna-sku. -We map Apple's module codenames to board_types in the form -"apple,". - -The mapped board_type is added to the DTS file in that form, while the -antenna-sku is forwarded by our bootloader from the Apple Device Tree -into the FDT. Grab them from the DT so firmware selection can use -them. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../wireless/broadcom/brcm80211/brcmfmac/common.h | 1 + - .../net/wireless/broadcom/brcm80211/brcmfmac/of.c | 12 +++++++++++- - 2 files changed, 12 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h -index 15accc88d5c0..1f678bbd87aa 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h -@@ -51,6 +51,7 @@ struct brcmf_mp_device { - struct brcmfmac_pd_cc *country_codes; - const char *board_type; - unsigned char mac[ETH_ALEN]; -+ const char *antenna_sku; - union { - struct brcmfmac_sdio_pd sdio; - } bus; -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c -index 083ac58f466d..644cc48eae40 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c -@@ -64,14 +64,24 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type, - { - struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio; - struct device_node *root, *np = dev->of_node; -+ const char *prop; - int irq; - int err; - u32 irqf; - u32 val; - -+ /* Apple ARM64 platforms have their own idea of board type, passed in -+ * via the device tree. They also have an antenna SKU parameter -+ */ -+ if (!of_property_read_string(np, "brcm,board-type", &prop)) -+ settings->board_type = prop; -+ -+ if (!of_property_read_string(np, "apple,antenna-sku", &prop)) -+ settings->antenna_sku = prop; -+ - /* Set board-type to the first string of the machine compatible prop */ - root = of_find_node_by_path("/"); -- if (root) { -+ if (root && !settings->board_type) { - int i; - char *board_type; - const char *tmp; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0091-brcmfmac-pcie-Perform-firmware-selection-for-Apple-p.patch b/target/linux/silicon/patches-5.19/0091-brcmfmac-pcie-Perform-firmware-selection-for-Apple-p.patch deleted file mode 100644 index 5f490fbbf..000000000 --- a/target/linux/silicon/patches-5.19/0091-brcmfmac-pcie-Perform-firmware-selection-for-Apple-p.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 608e39fd3521d26bfc846383626f4605d7b273a7 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:45:21 +0900 -Subject: [PATCH 091/171] brcmfmac: pcie: Perform firmware selection for Apple - platforms - -On Apple platforms, firmware selection uses the following elements: - - Property Example Source - ============== ======= ======================== -* Chip name 4378 Device ID -* Chip revision B1 OTP -* Platform shikoku DT (ARM64) or ACPI (x86) -* Module type RASP OTP -* Module vendor m OTP -* Module version 6.11 OTP -* Antenna SKU X3 DT (ARM64) or ACPI (x86) - -In macOS, these firmwares are stored using filenames in this format -under /usr/share/firmware/wifi: - - C-4378__s-B1/P-shikoku-X3_M-RASP_V-m__m-6.11.txt - -To prepare firmwares for Linux, we rename these to a scheme following -the existing brcmfmac convention: - - brcmfmac-pcie.apple,--\ - --.txt - -The NVRAM uses all the components, while the firmware and CLM blob only -use the chip/revision/platform/antenna_sku: - - brcmfmac-pcie.apple,-.bin - -e.g. - - brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m-6.11-X3.txt - brcm/brcmfmac4378b1-pcie.apple,shikoku-X3.bin - -In addition, since there are over 1000 files in total, many of which are -symlinks or outright duplicates, we deduplicate and prune the firmware -tree to reduce firmware filenames to fewer dimensions. For example, the -shikoku platform (MacBook Air M1 2020) simplifies to just 4 files: - - brcm/brcmfmac4378b1-pcie.apple,shikoku.clm_blob - brcm/brcmfmac4378b1-pcie.apple,shikoku.bin - brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m.txt - brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-u.txt - -This reduces the total file count to around 170, of which 75 are -symlinks and 95 are regular files: 7 firmware blobs, 27 CLM blobs, and -61 NVRAM config files. We also slightly process NVRAM files to correct -some formatting issues. - -To handle this, the driver must try the following path formats when -looking for firmware files: - - brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m-6.11-X3.txt - brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m-6.11.txt - brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP-m.txt - brcm/brcmfmac4378b1-pcie.apple,shikoku-RASP.txt - brcm/brcmfmac4378b1-pcie.apple,shikoku-X3.txt * - brcm/brcmfmac4378b1-pcie.apple,shikoku.txt - -* Not relevant for NVRAM, only for firmware/CLM. - -The chip revision nominally comes from OTP on Apple platforms, but it -can be mapped to the PCI revision number, so we ignore the OTP revision -and continue to use the existing PCI revision mechanism to identify chip -revisions, as the driver already does for other chips. Unfortunately, -the mapping is not consistent between different chip types, so this has -to be determined experimentally. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/pcie.c | 41 ++++++++++++++++++- - 1 file changed, 39 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 17d0353e9105..86807d990cc7 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -2068,8 +2068,45 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) - fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1; - fwreq->bus_nr = devinfo->pdev->bus->number; - -- brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type); -- fwreq->board_types[0] = devinfo->settings->board_type; -+ /* Apple platforms with fancy firmware/NVRAM selection */ -+ if (devinfo->settings->board_type && -+ devinfo->settings->antenna_sku && -+ devinfo->otp.valid) { -+ const struct brcmf_otp_params *otp = &devinfo->otp; -+ struct device *dev = &devinfo->pdev->dev; -+ const char **bt = fwreq->board_types; -+ -+ brcmf_dbg(PCIE, "Apple board: %s\n", -+ devinfo->settings->board_type); -+ -+ /* Example: apple,shikoku-RASP-m-6.11-X3 */ -+ bt[0] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s-%s-%s", -+ devinfo->settings->board_type, -+ otp->module, otp->vendor, otp->version, -+ devinfo->settings->antenna_sku); -+ bt[1] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s-%s", -+ devinfo->settings->board_type, -+ otp->module, otp->vendor, otp->version); -+ bt[2] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s", -+ devinfo->settings->board_type, -+ otp->module, otp->vendor); -+ bt[3] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s", -+ devinfo->settings->board_type, -+ otp->module); -+ bt[4] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s", -+ devinfo->settings->board_type, -+ devinfo->settings->antenna_sku); -+ bt[5] = devinfo->settings->board_type; -+ -+ if (!bt[0] || !bt[1] || !bt[2] || !bt[3] || !bt[4]) { -+ kfree(fwreq); -+ return NULL; -+ } -+ -+ } else { -+ brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type); -+ fwreq->board_types[0] = devinfo->settings->board_type; -+ } - - return fwreq; - } --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0092-brcmfmac-firmware-Allow-platform-to-override-macaddr.patch b/target/linux/silicon/patches-5.19/0092-brcmfmac-firmware-Allow-platform-to-override-macaddr.patch deleted file mode 100644 index 439980bec..000000000 --- a/target/linux/silicon/patches-5.19/0092-brcmfmac-firmware-Allow-platform-to-override-macaddr.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 76efd4b5d7adea522c649c6b44d7379e981141b5 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 23 Dec 2021 22:32:08 +0900 -Subject: [PATCH 092/171] brcmfmac: firmware: Allow platform to override - macaddr - -On Device Tree platforms, it is customary to be able to set the MAC -address via the Device Tree, as it is often stored in system firmware. -This is particularly relevant for Apple ARM64 platforms, where this -information comes from system configuration and passed through by the -bootloader into the DT. - -Implement support for this by fetching the platform MAC address and -adding or replacing the macaddr= property in nvram. This becomes the -dongle's default MAC address. - -On platforms with an SROM MAC address, this overrides it. On platforms -without one, such as Apple ARM64 devices, this is required for the -firmware to boot (it will fail if it does not have a valid MAC at all). - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/firmware.c | 28 +++++++++++++++++-- - 1 file changed, 26 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -index d04a59cf4a1e..fbfc9458d240 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -@@ -21,6 +21,8 @@ - #define BRCMF_FW_NVRAM_DEVPATH_LEN 19 /* devpath0=pcie/1/4/ */ - #define BRCMF_FW_NVRAM_PCIEDEV_LEN 10 /* pcie/1/4/ + \0 */ - #define BRCMF_FW_DEFAULT_BOARDREV "boardrev=0xff" -+#define BRCMF_FW_MACADDR_FMT "macaddr=%pM" -+#define BRCMF_FW_MACADDR_LEN (7 + ETH_ALEN * 3) - - enum nvram_parser_state { - IDLE, -@@ -57,6 +59,7 @@ struct nvram_parser { - bool multi_dev_v1; - bool multi_dev_v2; - bool boardrev_found; -+ bool strip_mac; - }; - - /* -@@ -121,6 +124,10 @@ static enum nvram_parser_state brcmf_nvram_handle_key(struct nvram_parser *nvp) - nvp->multi_dev_v2 = true; - if (strncmp(&nvp->data[nvp->entry], "boardrev", 8) == 0) - nvp->boardrev_found = true; -+ /* strip macaddr if platform MAC overrides */ -+ if (nvp->strip_mac && -+ strncmp(&nvp->data[nvp->entry], "macaddr", 7) == 0) -+ st = COMMENT; - } else if (!is_nvram_char(c) || c == ' ') { - brcmf_dbg(INFO, "warning: ln=%d:col=%d: '=' expected, skip invalid key entry\n", - nvp->line, nvp->column); -@@ -209,6 +216,7 @@ static int brcmf_init_nvram_parser(struct nvram_parser *nvp, - size = data_len; - /* Add space for properties we may add */ - size += strlen(BRCMF_FW_DEFAULT_BOARDREV) + 1; -+ size += BRCMF_FW_MACADDR_LEN + 1; - /* Alloc for extra 0 byte + roundup by 4 + length field */ - size += 1 + 3 + sizeof(u32); - nvp->nvram = kzalloc(size, GFP_KERNEL); -@@ -368,22 +376,34 @@ static void brcmf_fw_add_defaults(struct nvram_parser *nvp) - nvp->nvram_len++; - } - -+static void brcmf_fw_add_macaddr(struct nvram_parser *nvp, u8 *mac) -+{ -+ BUG_ON(snprintf(&nvp->nvram[nvp->nvram_len], BRCMF_FW_MACADDR_LEN + 1, -+ BRCMF_FW_MACADDR_FMT, mac) != BRCMF_FW_MACADDR_LEN); -+ nvp->nvram_len += BRCMF_FW_MACADDR_LEN + 1; -+} -+ - /* brcmf_nvram_strip :Takes a buffer of "=\n" lines read from a fil - * and ending in a NUL. Removes carriage returns, empty lines, comment lines, - * and converts newlines to NULs. Shortens buffer as needed and pads with NULs. - * End of buffer is completed with token identifying length of buffer. - */ - static void *brcmf_fw_nvram_strip(const u8 *data, size_t data_len, -- u32 *new_length, u16 domain_nr, u16 bus_nr) -+ u32 *new_length, u16 domain_nr, u16 bus_nr, -+ struct device *dev) - { - struct nvram_parser nvp; - u32 pad; - u32 token; - __le32 token_le; -+ u8 mac[ETH_ALEN]; - - if (brcmf_init_nvram_parser(&nvp, data, data_len) < 0) - return NULL; - -+ if (eth_platform_get_mac_address(dev, mac) == 0) -+ nvp.strip_mac = true; -+ - while (nvp.pos < data_len) { - nvp.state = nv_parser_states[nvp.state](&nvp); - if (nvp.state == END) -@@ -404,6 +424,9 @@ static void *brcmf_fw_nvram_strip(const u8 *data, size_t data_len, - - brcmf_fw_add_defaults(&nvp); - -+ if (nvp.strip_mac) -+ brcmf_fw_add_macaddr(&nvp, mac); -+ - pad = nvp.nvram_len; - *new_length = roundup(nvp.nvram_len + 1, 4); - while (pad != *new_length) { -@@ -547,7 +570,8 @@ static int brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx) - if (data) - nvram = brcmf_fw_nvram_strip(data, data_len, &nvram_length, - fwctx->req->domain_nr, -- fwctx->req->bus_nr); -+ fwctx->req->bus_nr, -+ fwctx->dev); - - if (free_bcm47xx_nvram) - bcm47xx_nvram_release_contents(data); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0093-brcmfmac-msgbuf-Increase-RX-ring-sizes-to-1024.patch b/target/linux/silicon/patches-5.19/0093-brcmfmac-msgbuf-Increase-RX-ring-sizes-to-1024.patch deleted file mode 100644 index e1eca97b6..000000000 --- a/target/linux/silicon/patches-5.19/0093-brcmfmac-msgbuf-Increase-RX-ring-sizes-to-1024.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 9fd60252c13e93ca8ff245f63faf248da6c390f4 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:39:04 +0900 -Subject: [PATCH 093/171] brcmfmac: msgbuf: Increase RX ring sizes to 1024 - -Newer chips used on Apple platforms have a max_rxbufpost greater than -512, which causes warnings when brcmf_msgbuf_rxbuf_data_fill tries to -put more entries in the ring than will fit. Increase the ring sizes -to 1024. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h -index 2e322edbb907..6a849f4a94dd 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h -@@ -8,10 +8,10 @@ - #ifdef CONFIG_BRCMFMAC_PROTO_MSGBUF - - #define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM 64 --#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_MAX_ITEM 512 -+#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_MAX_ITEM 1024 - #define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_MAX_ITEM 64 - #define BRCMF_D2H_MSGRING_TX_COMPLETE_MAX_ITEM 1024 --#define BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM 512 -+#define BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM 1024 - #define BRCMF_H2D_TXFLOWRING_MAX_ITEM 512 - - #define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE 40 --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0094-brcmfmac-pcie-Support-PCIe-core-revisions-64.patch b/target/linux/silicon/patches-5.19/0094-brcmfmac-pcie-Support-PCIe-core-revisions-64.patch deleted file mode 100644 index f2307ed02..000000000 --- a/target/linux/silicon/patches-5.19/0094-brcmfmac-pcie-Support-PCIe-core-revisions-64.patch +++ /dev/null @@ -1,265 +0,0 @@ -From aa48c835720f5e04ebbe14e3f6b053c8415fb6d9 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:25:35 +0900 -Subject: [PATCH 094/171] brcmfmac: pcie: Support PCIe core revisions >= 64 - -These newer PCIe core revisions include new sets of registers that must -be used instead of the legacy ones. Introduce a brcmf_pcie_reginfo to -hold the specific register offsets and values to use for a given -platform, and change all the register accesses to indirect through it. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/pcie.c | 125 +++++++++++++++--- - 1 file changed, 105 insertions(+), 20 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 86807d990cc7..a2ef3de834f6 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -119,6 +119,12 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - #define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0 0x140 - #define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1 0x144 - -+#define BRCMF_PCIE_64_PCIE2REG_INTMASK 0xC14 -+#define BRCMF_PCIE_64_PCIE2REG_MAILBOXINT 0xC30 -+#define BRCMF_PCIE_64_PCIE2REG_MAILBOXMASK 0xC34 -+#define BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_0 0xA20 -+#define BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_1 0xA24 -+ - #define BRCMF_PCIE2_INTA 0x01 - #define BRCMF_PCIE2_INTB 0x02 - -@@ -138,6 +144,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - #define BRCMF_PCIE_MB_INT_D2H3_DB0 0x400000 - #define BRCMF_PCIE_MB_INT_D2H3_DB1 0x800000 - -+#define BRCMF_PCIE_MB_INT_FN0 (BRCMF_PCIE_MB_INT_FN0_0 | \ -+ BRCMF_PCIE_MB_INT_FN0_1) - #define BRCMF_PCIE_MB_INT_D2H_DB (BRCMF_PCIE_MB_INT_D2H0_DB0 | \ - BRCMF_PCIE_MB_INT_D2H0_DB1 | \ - BRCMF_PCIE_MB_INT_D2H1_DB0 | \ -@@ -147,6 +155,40 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - BRCMF_PCIE_MB_INT_D2H3_DB0 | \ - BRCMF_PCIE_MB_INT_D2H3_DB1) - -+#define BRCMF_PCIE_64_MB_INT_D2H0_DB0 0x1 -+#define BRCMF_PCIE_64_MB_INT_D2H0_DB1 0x2 -+#define BRCMF_PCIE_64_MB_INT_D2H1_DB0 0x4 -+#define BRCMF_PCIE_64_MB_INT_D2H1_DB1 0x8 -+#define BRCMF_PCIE_64_MB_INT_D2H2_DB0 0x10 -+#define BRCMF_PCIE_64_MB_INT_D2H2_DB1 0x20 -+#define BRCMF_PCIE_64_MB_INT_D2H3_DB0 0x40 -+#define BRCMF_PCIE_64_MB_INT_D2H3_DB1 0x80 -+#define BRCMF_PCIE_64_MB_INT_D2H4_DB0 0x100 -+#define BRCMF_PCIE_64_MB_INT_D2H4_DB1 0x200 -+#define BRCMF_PCIE_64_MB_INT_D2H5_DB0 0x400 -+#define BRCMF_PCIE_64_MB_INT_D2H5_DB1 0x800 -+#define BRCMF_PCIE_64_MB_INT_D2H6_DB0 0x1000 -+#define BRCMF_PCIE_64_MB_INT_D2H6_DB1 0x2000 -+#define BRCMF_PCIE_64_MB_INT_D2H7_DB0 0x4000 -+#define BRCMF_PCIE_64_MB_INT_D2H7_DB1 0x8000 -+ -+#define BRCMF_PCIE_64_MB_INT_D2H_DB (BRCMF_PCIE_64_MB_INT_D2H0_DB0 | \ -+ BRCMF_PCIE_64_MB_INT_D2H0_DB1 | \ -+ BRCMF_PCIE_64_MB_INT_D2H1_DB0 | \ -+ BRCMF_PCIE_64_MB_INT_D2H1_DB1 | \ -+ BRCMF_PCIE_64_MB_INT_D2H2_DB0 | \ -+ BRCMF_PCIE_64_MB_INT_D2H2_DB1 | \ -+ BRCMF_PCIE_64_MB_INT_D2H3_DB0 | \ -+ BRCMF_PCIE_64_MB_INT_D2H3_DB1 | \ -+ BRCMF_PCIE_64_MB_INT_D2H4_DB0 | \ -+ BRCMF_PCIE_64_MB_INT_D2H4_DB1 | \ -+ BRCMF_PCIE_64_MB_INT_D2H5_DB0 | \ -+ BRCMF_PCIE_64_MB_INT_D2H5_DB1 | \ -+ BRCMF_PCIE_64_MB_INT_D2H6_DB0 | \ -+ BRCMF_PCIE_64_MB_INT_D2H6_DB1 | \ -+ BRCMF_PCIE_64_MB_INT_D2H7_DB0 | \ -+ BRCMF_PCIE_64_MB_INT_D2H7_DB1) -+ - #define BRCMF_PCIE_SHARED_VERSION_7 7 - #define BRCMF_PCIE_MIN_SHARED_VERSION 5 - #define BRCMF_PCIE_MAX_SHARED_VERSION BRCMF_PCIE_SHARED_VERSION_7 -@@ -273,6 +315,7 @@ struct brcmf_pciedev_info { - char nvram_name[BRCMF_FW_NAME_LEN]; - char clm_name[BRCMF_FW_NAME_LEN]; - const struct firmware *clm_fw; -+ const struct brcmf_pcie_reginfo *reginfo; - void __iomem *regs; - void __iomem *tcm; - u32 ram_base; -@@ -359,6 +402,36 @@ static const u32 brcmf_ring_itemsize[BRCMF_NROF_COMMON_MSGRINGS] = { - BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE - }; - -+struct brcmf_pcie_reginfo { -+ u32 intmask; -+ u32 mailboxint; -+ u32 mailboxmask; -+ u32 h2d_mailbox_0; -+ u32 h2d_mailbox_1; -+ u32 int_d2h_db; -+ u32 int_fn0; -+}; -+ -+static const struct brcmf_pcie_reginfo brcmf_reginfo_default = { -+ .intmask = BRCMF_PCIE_PCIE2REG_INTMASK, -+ .mailboxint = BRCMF_PCIE_PCIE2REG_MAILBOXINT, -+ .mailboxmask = BRCMF_PCIE_PCIE2REG_MAILBOXMASK, -+ .h2d_mailbox_0 = BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0, -+ .h2d_mailbox_1 = BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1, -+ .int_d2h_db = BRCMF_PCIE_MB_INT_D2H_DB, -+ .int_fn0 = BRCMF_PCIE_MB_INT_FN0, -+}; -+ -+static const struct brcmf_pcie_reginfo brcmf_reginfo_64 = { -+ .intmask = BRCMF_PCIE_64_PCIE2REG_INTMASK, -+ .mailboxint = BRCMF_PCIE_64_PCIE2REG_MAILBOXINT, -+ .mailboxmask = BRCMF_PCIE_64_PCIE2REG_MAILBOXMASK, -+ .h2d_mailbox_0 = BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_0, -+ .h2d_mailbox_1 = BRCMF_PCIE_64_PCIE2REG_H2D_MAILBOX_1, -+ .int_d2h_db = BRCMF_PCIE_64_MB_INT_D2H_DB, -+ .int_fn0 = 0, -+}; -+ - static void brcmf_pcie_setup(struct device *dev, int ret, - struct brcmf_fw_request *fwreq); - static struct brcmf_fw_request * -@@ -802,30 +875,29 @@ static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo, - - static void brcmf_pcie_intr_disable(struct brcmf_pciedev_info *devinfo) - { -- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK, 0); -+ brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->mailboxmask, 0); - } - - - static void brcmf_pcie_intr_enable(struct brcmf_pciedev_info *devinfo) - { -- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK, -- BRCMF_PCIE_MB_INT_D2H_DB | -- BRCMF_PCIE_MB_INT_FN0_0 | -- BRCMF_PCIE_MB_INT_FN0_1); -+ brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->mailboxmask, -+ devinfo->reginfo->int_d2h_db | -+ devinfo->reginfo->int_fn0); - } - - static void brcmf_pcie_hostready(struct brcmf_pciedev_info *devinfo) - { - if (devinfo->shared.flags & BRCMF_PCIE_SHARED_HOSTRDY_DB1) - brcmf_pcie_write_reg32(devinfo, -- BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1, 1); -+ devinfo->reginfo->h2d_mailbox_1, 1); - } - - static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg) - { - struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg; - -- if (brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT)) { -+ if (brcmf_pcie_read_reg32(devinfo, devinfo->reginfo->mailboxint)) { - brcmf_pcie_intr_disable(devinfo); - brcmf_dbg(PCIE, "Enter\n"); - return IRQ_WAKE_THREAD; -@@ -840,15 +912,14 @@ static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg) - u32 status; - - devinfo->in_irq = true; -- status = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT); -+ status = brcmf_pcie_read_reg32(devinfo, devinfo->reginfo->mailboxint); - brcmf_dbg(PCIE, "Enter %x\n", status); - if (status) { -- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, -+ brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->mailboxint, - status); -- if (status & (BRCMF_PCIE_MB_INT_FN0_0 | -- BRCMF_PCIE_MB_INT_FN0_1)) -+ if (status & devinfo->reginfo->int_fn0) - brcmf_pcie_handle_mb_data(devinfo); -- if (status & BRCMF_PCIE_MB_INT_D2H_DB) { -+ if (status & devinfo->reginfo->int_d2h_db) { - if (devinfo->state == BRCMFMAC_PCIE_STATE_UP) - brcmf_proto_msgbuf_rx_trigger( - &devinfo->pdev->dev); -@@ -907,8 +978,8 @@ static void brcmf_pcie_release_irq(struct brcmf_pciedev_info *devinfo) - if (devinfo->in_irq) - brcmf_err(bus, "Still in IRQ (processing) !!!\n"); - -- status = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT); -- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, status); -+ status = brcmf_pcie_read_reg32(devinfo, devinfo->reginfo->mailboxint); -+ brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->mailboxint, status); - - devinfo->irq_allocated = false; - } -@@ -960,7 +1031,7 @@ static int brcmf_pcie_ring_mb_ring_bell(void *ctx) - - brcmf_dbg(PCIE, "RING !\n"); - /* Any arbitrary value will do, lets use 1 */ -- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0, 1); -+ brcmf_pcie_write_reg32(devinfo, devinfo->reginfo->h2d_mailbox_0, 1); - - return 0; - } -@@ -1723,15 +1794,22 @@ static int brcmf_pcie_buscoreprep(void *ctx) - static int brcmf_pcie_buscore_reset(void *ctx, struct brcmf_chip *chip) - { - struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx; -- u32 val; -+ struct brcmf_core *core; -+ u32 val, reg; - - devinfo->ci = chip; - brcmf_pcie_reset_device(devinfo); - -- val = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT); -+ /* reginfo is not ready yet */ -+ core = brcmf_chip_get_core(chip, BCMA_CORE_PCIE2); -+ if (core->rev >= 64) -+ reg = BRCMF_PCIE_64_PCIE2REG_MAILBOXINT; -+ else -+ reg = BRCMF_PCIE_PCIE2REG_MAILBOXINT; -+ -+ val = brcmf_pcie_read_reg32(devinfo, reg); - if (val != 0xffffffff) -- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, -- val); -+ brcmf_pcie_write_reg32(devinfo, reg, val); - - return 0; - } -@@ -2119,6 +2197,7 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) - struct brcmf_pciedev_info *devinfo; - struct brcmf_pciedev *pcie_bus_dev; - struct brcmf_bus *bus; -+ struct brcmf_core *core; - - brcmf_dbg(PCIE, "Enter %x:%x\n", pdev->vendor, pdev->device); - -@@ -2137,6 +2216,12 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) - goto fail; - } - -+ core = brcmf_chip_get_core(devinfo->ci, BCMA_CORE_PCIE2); -+ if (core->rev >= 64) -+ devinfo->reginfo = &brcmf_reginfo_64; -+ else -+ devinfo->reginfo = &brcmf_reginfo_default; -+ - pcie_bus_dev = kzalloc(sizeof(*pcie_bus_dev), GFP_KERNEL); - if (pcie_bus_dev == NULL) { - ret = -ENOMEM; -@@ -2306,7 +2391,7 @@ static int brcmf_pcie_pm_leave_D3(struct device *dev) - brcmf_dbg(PCIE, "Enter, dev=%p, bus=%p\n", dev, bus); - - /* Check if device is still up and running, if so we are ready */ -- if (brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_INTMASK) != 0) { -+ if (brcmf_pcie_read_reg32(devinfo, devinfo->reginfo->intmask) != 0) { - brcmf_dbg(PCIE, "Try to wakeup device....\n"); - if (brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D0_INFORM)) - goto cleanup; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0095-brcmfmac-pcie-Add-IDs-properties-for-BCM4378.patch b/target/linux/silicon/patches-5.19/0095-brcmfmac-pcie-Add-IDs-properties-for-BCM4378.patch deleted file mode 100644 index 47ad96d42..000000000 --- a/target/linux/silicon/patches-5.19/0095-brcmfmac-pcie-Add-IDs-properties-for-BCM4378.patch +++ /dev/null @@ -1,97 +0,0 @@ -From 54af2b6f4ba6a6a477d9739d24fafe447b1235a3 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:46:40 +0900 -Subject: [PATCH 095/171] brcmfmac: pcie: Add IDs/properties for BCM4378 - -This chip is present on Apple M1 (t8103) platforms: - -* atlantisb (apple,j274): Mac mini (M1, 2020) -* honshu (apple,j293): MacBook Pro (13-inch, M1, 2020) -* shikoku (apple,j313): MacBook Air (M1, 2020) -* capri (apple,j456): iMac (24-inch, 4x USB-C, M1, 2020) -* santorini (apple,j457): iMac (24-inch, 2x USB-C, M1, 2020) - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 2 ++ - drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 8 ++++++++ - .../net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 2 ++ - 3 files changed, 12 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -index 4ec7773b6906..7f1d6cea2141 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -@@ -732,6 +732,8 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci) - return 0x160000; - case CY_CC_43752_CHIP_ID: - return 0x170000; -+ case BRCM_CC_4378_CHIP_ID: -+ return 0x352000; - default: - brcmf_err("unknown chip: %s\n", ci->pub.name); - break; -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index a2ef3de834f6..2ca2c4b603cf 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -59,6 +59,7 @@ BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie"); - BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie"); - BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie"); - BRCMF_FW_DEF(4371, "brcmfmac4371-pcie"); -+BRCMF_FW_CLM_DEF(4378B1, "brcmfmac4378b1-pcie"); - - /* firmware config files */ - MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.txt"); -@@ -88,6 +89,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C), - BRCMF_FW_ENTRY(BRCM_CC_43666_CHIP_ID, 0xFFFFFFF0, 4366C), - BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371), -+ BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFFF, 4378B1), /* 3 */ - }; - - #define BRCMF_PCIE_FW_UP_TIMEOUT 5000 /* msec */ -@@ -1970,6 +1972,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) - int ret; - - switch (devinfo->ci->chip) { -+ case BRCM_CC_4378_CHIP_ID: -+ coreid = BCMA_CORE_GCI; -+ base = 0x1120; -+ words = 0x170; -+ break; - default: - /* OTP not supported on this chip */ - return 0; -@@ -2458,6 +2465,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { - BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID), - BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID), - BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID), -+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID), - { /* end: all zeroes */ } - }; - -diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -index ed0b707f0cdf..43158a404652 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -@@ -51,6 +51,7 @@ - #define BRCM_CC_43664_CHIP_ID 43664 - #define BRCM_CC_43666_CHIP_ID 43666 - #define BRCM_CC_4371_CHIP_ID 0x4371 -+#define BRCM_CC_4378_CHIP_ID 0x4378 - #define CY_CC_4373_CHIP_ID 0x4373 - #define CY_CC_43012_CHIP_ID 43012 - #define CY_CC_43752_CHIP_ID 43752 -@@ -87,6 +88,7 @@ - #define BRCM_PCIE_4366_2G_DEVICE_ID 0x43c4 - #define BRCM_PCIE_4366_5G_DEVICE_ID 0x43c5 - #define BRCM_PCIE_4371_DEVICE_ID 0x440d -+#define BRCM_PCIE_4378_DEVICE_ID 0x4425 - - - /* brcmsmac IDs */ --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0096-ACPI-property-Support-strings-in-Apple-_DSM-props.patch b/target/linux/silicon/patches-5.19/0096-ACPI-property-Support-strings-in-Apple-_DSM-props.patch deleted file mode 100644 index 13f1fce41..000000000 --- a/target/linux/silicon/patches-5.19/0096-ACPI-property-Support-strings-in-Apple-_DSM-props.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 7107b9724f933acdb31a3cc87dc80ce7a7484bd5 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 23 Dec 2021 19:51:11 +0900 -Subject: [PATCH 096/171] ACPI / property: Support strings in Apple _DSM props - -The Wi-Fi module in Apple machines has a "module-instance" device -property that specifies the platform type and is used for firmware -selection. Its value is a string, so add support for string values in -acpi_extract_apple_properties(). - -Reviewed-by: Lukas Wunner -Acked-by: Linus Walleij -Signed-off-by: Hector Martin ---- - drivers/acpi/x86/apple.c | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/drivers/acpi/x86/apple.c b/drivers/acpi/x86/apple.c -index c285c91a5e9c..71b8f103ab0f 100644 ---- a/drivers/acpi/x86/apple.c -+++ b/drivers/acpi/x86/apple.c -@@ -70,13 +70,16 @@ void acpi_extract_apple_properties(struct acpi_device *adev) - - if ( key->type != ACPI_TYPE_STRING || - (val->type != ACPI_TYPE_INTEGER && -- val->type != ACPI_TYPE_BUFFER)) -+ val->type != ACPI_TYPE_BUFFER && -+ val->type != ACPI_TYPE_STRING)) - continue; /* skip invalid properties */ - - __set_bit(i, valid); - newsize += key->string.length + 1; - if ( val->type == ACPI_TYPE_BUFFER) - newsize += val->buffer.length; -+ else if (val->type == ACPI_TYPE_STRING) -+ newsize += val->string.length + 1; - } - - numvalid = bitmap_weight(valid, numprops); -@@ -118,6 +121,12 @@ void acpi_extract_apple_properties(struct acpi_device *adev) - newprops[v].type = val->type; - if (val->type == ACPI_TYPE_INTEGER) { - newprops[v].integer.value = val->integer.value; -+ } else if (val->type == ACPI_TYPE_STRING) { -+ newprops[v].string.length = val->string.length; -+ newprops[v].string.pointer = free_space; -+ memcpy(free_space, val->string.pointer, -+ val->string.length); -+ free_space += val->string.length + 1; - } else { - newprops[v].buffer.length = val->buffer.length; - newprops[v].buffer.pointer = free_space; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0097-brcmfmac-acpi-Add-support-for-fetching-Apple-ACPI-pr.patch b/target/linux/silicon/patches-5.19/0097-brcmfmac-acpi-Add-support-for-fetching-Apple-ACPI-pr.patch deleted file mode 100644 index 289eed869..000000000 --- a/target/linux/silicon/patches-5.19/0097-brcmfmac-acpi-Add-support-for-fetching-Apple-ACPI-pr.patch +++ /dev/null @@ -1,127 +0,0 @@ -From 30cf50137a081ece01ac609de4131e20b8cccc1c Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 23 Dec 2021 19:51:36 +0900 -Subject: [PATCH 097/171] brcmfmac: acpi: Add support for fetching Apple ACPI - properties - -On DT platforms, the module-instance and antenna-sku-info properties -are passed in the DT. On ACPI platforms, module-instance is passed via -the analogous Apple device property mechanism, while the antenna SKU -info is instead obtained via an ACPI method that grabs it from -non-volatile storage. - -Add support for this, to allow proper firmware selection on Apple -platforms. - -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/Makefile | 2 + - .../broadcom/brcm80211/brcmfmac/acpi.c | 52 +++++++++++++++++++ - .../broadcom/brcm80211/brcmfmac/common.c | 1 + - .../broadcom/brcm80211/brcmfmac/common.h | 9 ++++ - 4 files changed, 64 insertions(+) - create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile -index 13c13504a6e8..19009eb9db93 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile -@@ -47,3 +47,5 @@ brcmfmac-$(CONFIG_OF) += \ - of.o - brcmfmac-$(CONFIG_DMI) += \ - dmi.o -+brcmfmac-$(CONFIG_ACPI) += \ -+ acpi.o -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c -new file mode 100644 -index 000000000000..dec6a83d13b1 ---- /dev/null -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/acpi.c -@@ -0,0 +1,52 @@ -+// SPDX-License-Identifier: ISC -+/* -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include "debug.h" -+#include "core.h" -+#include "common.h" -+ -+void brcmf_acpi_probe(struct device *dev, enum brcmf_bus_type bus_type, -+ struct brcmf_mp_device *settings) -+{ -+ acpi_status status; -+ const union acpi_object *o; -+ struct acpi_buffer buf = {ACPI_ALLOCATE_BUFFER, NULL}; -+ struct acpi_device *adev = ACPI_COMPANION(dev); -+ -+ if (!adev) -+ return; -+ -+ if (!ACPI_FAILURE(acpi_dev_get_property(adev, "module-instance", -+ ACPI_TYPE_STRING, &o))) { -+ brcmf_dbg(INFO, "ACPI module-instance=%s\n", o->string.pointer); -+ settings->board_type = devm_kasprintf(dev, GFP_KERNEL, -+ "apple,%s", -+ o->string.pointer); -+ } else { -+ brcmf_dbg(INFO, "No ACPI module-instance\n"); -+ } -+ -+ status = acpi_evaluate_object(adev->handle, "RWCV", NULL, &buf); -+ o = buf.pointer; -+ if (!ACPI_FAILURE(status) && o && o->type == ACPI_TYPE_BUFFER && -+ o->buffer.length >= 2) { -+ char *antenna_sku = devm_kzalloc(dev, 3, GFP_KERNEL); -+ -+ if (!antenna_sku) { -+ brcmf_err("Failed to allocate antenna-sku"); -+ } else { -+ memcpy(antenna_sku, o->buffer.pointer, 2); -+ brcmf_dbg(INFO, "ACPI RWCV data=%*phN antenna-sku=%s\n", -+ (int)o->buffer.length, o->buffer.pointer, -+ antenna_sku); -+ settings->antenna_sku = antenna_sku; -+ } -+ -+ kfree(buf.pointer); -+ } else { -+ brcmf_dbg(INFO, "No ACPI antenna-sku\n"); -+ } -+} -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -index 95d4c133efdd..ea2475bfc2d7 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -@@ -448,6 +448,7 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, - /* No platform data for this device, try OF and DMI data */ - brcmf_dmi_probe(settings, chip, chiprev); - brcmf_of_probe(dev, bus_type, settings); -+ brcmf_acpi_probe(dev, bus_type, settings); - } - return settings; - } -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h -index 1f678bbd87aa..960b1042a7c2 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h -@@ -74,6 +74,15 @@ static inline void - brcmf_dmi_probe(struct brcmf_mp_device *settings, u32 chip, u32 chiprev) {} - #endif - -+#ifdef CONFIG_ACPI -+void brcmf_acpi_probe(struct device *dev, enum brcmf_bus_type bus_type, -+ struct brcmf_mp_device *settings); -+#else -+static inline void brcmf_acpi_probe(struct device *dev, -+ enum brcmf_bus_type bus_type, -+ struct brcmf_mp_device *settings) {} -+#endif -+ - u8 brcmf_map_prio_to_prec(void *cfg, u8 prio); - - u8 brcmf_map_prio_to_aci(void *cfg, u8 prio); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0098-brcmfmac-pcie-Provide-a-buffer-of-random-bytes-to-th.patch b/target/linux/silicon/patches-5.19/0098-brcmfmac-pcie-Provide-a-buffer-of-random-bytes-to-th.patch deleted file mode 100644 index 599e2314e..000000000 --- a/target/linux/silicon/patches-5.19/0098-brcmfmac-pcie-Provide-a-buffer-of-random-bytes-to-th.patch +++ /dev/null @@ -1,82 +0,0 @@ -From b696ea7c641c2172aff67297e9c0f13d8d46620f Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 23 Dec 2021 19:30:17 +0900 -Subject: [PATCH 098/171] brcmfmac: pcie: Provide a buffer of random bytes to - the device - -Newer Apple firmwares on chipsets without a hardware RNG require the -host to provide a buffer of 256 random bytes to the device on -initialization. This buffer is present immediately before NVRAM, -suffixed by a footer containing a magic number and the buffer length. - -This won't affect chips/firmwares that do not use this feature, so do it -unconditionally. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/pcie.c | 29 +++++++++++++++++++ - 1 file changed, 29 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 2ca2c4b603cf..1e2afca5a60b 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - #include - - #include -@@ -1625,6 +1626,13 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo, - return 0; - } - -+struct brcmf_random_seed_footer { -+ __le32 length; -+ __le32 magic; -+}; -+ -+#define BRCMF_RANDOM_SEED_MAGIC 0xfeedc0de -+#define BRCMF_RANDOM_SEED_LENGTH 0x100 - - static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, - const struct firmware *fw, void *nvram, -@@ -1656,11 +1664,32 @@ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo, - brcmf_pcie_write_ram32(devinfo, devinfo->ci->ramsize - 4, 0); - - if (nvram) { -+ size_t rand_len = BRCMF_RANDOM_SEED_LENGTH; -+ struct brcmf_random_seed_footer footer = { -+ .length = cpu_to_le32(rand_len), -+ .magic = cpu_to_le32(BRCMF_RANDOM_SEED_MAGIC), -+ }; -+ void *randbuf; -+ - brcmf_dbg(PCIE, "Download NVRAM %s\n", devinfo->nvram_name); - address = devinfo->ci->rambase + devinfo->ci->ramsize - - nvram_len; - memcpy_toio(devinfo->tcm + address, nvram, nvram_len); - brcmf_fw_nvram_free(nvram); -+ -+ /* Some Apple chips/firmwares expect a buffer of random data -+ * to be present before NVRAM -+ */ -+ brcmf_dbg(PCIE, "Download random seed\n"); -+ -+ address -= sizeof(footer); -+ memcpy_toio(devinfo->tcm + address, &footer, sizeof(footer)); -+ -+ address -= rand_len; -+ randbuf = kzalloc(rand_len, GFP_KERNEL); -+ get_random_bytes(randbuf, rand_len); -+ memcpy_toio(devinfo->tcm + address, randbuf, rand_len); -+ kfree(randbuf); - } else { - brcmf_dbg(PCIE, "No matching NVRAM file found %s\n", - devinfo->nvram_name); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0099-brcmfmac-pcie-Add-IDs-properties-for-BCM4355.patch b/target/linux/silicon/patches-5.19/0099-brcmfmac-pcie-Add-IDs-properties-for-BCM4355.patch deleted file mode 100644 index 5b4695e0a..000000000 --- a/target/linux/silicon/patches-5.19/0099-brcmfmac-pcie-Add-IDs-properties-for-BCM4355.patch +++ /dev/null @@ -1,93 +0,0 @@ -From f95a34b8e22248b66182a277a825dbb751f25a88 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:50:15 +0900 -Subject: [PATCH 099/171] brcmfmac: pcie: Add IDs/properties for BCM4355 - -This chip is present on at least these Apple T2 Macs: - -* hawaii: MacBook Air 13" (Late 2018) -* hawaii: MacBook Air 13" (True Tone, 2019) - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 1 + - drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 8 ++++++++ - .../net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 2 ++ - 3 files changed, 11 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -index 7f1d6cea2141..6ac6a4414eda 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -@@ -727,6 +727,7 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci) - return 0x200000; - case BRCM_CC_4359_CHIP_ID: - return (ci->pub.chiprev < 9) ? 0x180000 : 0x160000; -+ case BRCM_CC_4355_CHIP_ID: - case BRCM_CC_4364_CHIP_ID: - case CY_CC_4373_CHIP_ID: - return 0x160000; -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 1e2afca5a60b..67f79985e4b8 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -50,6 +50,7 @@ enum brcmf_pcie_state { - BRCMF_FW_DEF(43602, "brcmfmac43602-pcie"); - BRCMF_FW_DEF(4350, "brcmfmac4350-pcie"); - BRCMF_FW_DEF(4350C, "brcmfmac4350c2-pcie"); -+BRCMF_FW_CLM_DEF(4355C1, "brcmfmac4355c1-pcie"); - BRCMF_FW_CLM_DEF(4356, "brcmfmac4356-pcie"); - BRCMF_FW_CLM_DEF(43570, "brcmfmac43570-pcie"); - BRCMF_FW_DEF(4358, "brcmfmac4358-pcie"); -@@ -76,6 +77,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0x000000FF, 4350C), - BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0xFFFFFF00, 4350), - BRCMF_FW_ENTRY(BRCM_CC_43525_CHIP_ID, 0xFFFFFFF0, 4365C), -+ BRCMF_FW_ENTRY(BRCM_CC_4355_CHIP_ID, 0xFFFFFFFF, 4355C1), /* 12 */ - BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356), - BRCMF_FW_ENTRY(BRCM_CC_43567_CHIP_ID, 0xFFFFFFFF, 43570), - BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43570), -@@ -2001,6 +2003,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) - int ret; - - switch (devinfo->ci->chip) { -+ case BRCM_CC_4355_CHIP_ID: -+ coreid = BCMA_CORE_CHIPCOMMON; -+ base = 0x8c0; -+ words = 0xb2; -+ break; - case BRCM_CC_4378_CHIP_ID: - coreid = BCMA_CORE_GCI; - base = 0x1120; -@@ -2475,6 +2482,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { - BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID), - BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355), - BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_RAW_DEVICE_ID), -+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4355_DEVICE_ID), - BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID), - BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID), - BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID), -diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -index 43158a404652..81ada150ee30 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -@@ -37,6 +37,7 @@ - #define BRCM_CC_4350_CHIP_ID 0x4350 - #define BRCM_CC_43525_CHIP_ID 43525 - #define BRCM_CC_4354_CHIP_ID 0x4354 -+#define BRCM_CC_4355_CHIP_ID 0x4355 - #define BRCM_CC_4356_CHIP_ID 0x4356 - #define BRCM_CC_43566_CHIP_ID 43566 - #define BRCM_CC_43567_CHIP_ID 43567 -@@ -70,6 +71,7 @@ - #define BRCM_PCIE_4350_DEVICE_ID 0x43a3 - #define BRCM_PCIE_4354_DEVICE_ID 0x43df - #define BRCM_PCIE_4354_RAW_DEVICE_ID 0x4354 -+#define BRCM_PCIE_4355_DEVICE_ID 0x43dc - #define BRCM_PCIE_4356_DEVICE_ID 0x43ec - #define BRCM_PCIE_43567_DEVICE_ID 0x43d3 - #define BRCM_PCIE_43570_DEVICE_ID 0x43d9 --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0100-brcmfmac-pcie-Add-IDs-properties-for-BCM4377.patch b/target/linux/silicon/patches-5.19/0100-brcmfmac-pcie-Add-IDs-properties-for-BCM4377.patch deleted file mode 100644 index fe0476ae8..000000000 --- a/target/linux/silicon/patches-5.19/0100-brcmfmac-pcie-Add-IDs-properties-for-BCM4377.patch +++ /dev/null @@ -1,90 +0,0 @@ -From 3061cca00baa4d818204d3c02b6bf07a87c69150 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:51:31 +0900 -Subject: [PATCH 100/171] brcmfmac: pcie: Add IDs/properties for BCM4377 - -This chip is present on at least these Apple T2 Macs: - -* tahiti: MacBook Pro 13" (2020, 2 TB3) -* formosa: MacBook Pro 13" (Touch/2019) -* fiji: MacBook Air 13" (Scissor, 2020) - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 1 + - drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 4 ++++ - drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 2 ++ - 3 files changed, 7 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -index 6ac6a4414eda..4108108f0431 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -@@ -732,6 +732,7 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci) - case CY_CC_4373_CHIP_ID: - return 0x160000; - case CY_CC_43752_CHIP_ID: -+ case BRCM_CC_4377_CHIP_ID: - return 0x170000; - case BRCM_CC_4378_CHIP_ID: - return 0x352000; -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 67f79985e4b8..d33919fd1db9 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -61,6 +61,7 @@ BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie"); - BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie"); - BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie"); - BRCMF_FW_DEF(4371, "brcmfmac4371-pcie"); -+BRCMF_FW_CLM_DEF(4377B3, "brcmfmac4377b3-pcie"); - BRCMF_FW_CLM_DEF(4378B1, "brcmfmac4378b1-pcie"); - - /* firmware config files */ -@@ -92,6 +93,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C), - BRCMF_FW_ENTRY(BRCM_CC_43666_CHIP_ID, 0xFFFFFFF0, 4366C), - BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371), -+ BRCMF_FW_ENTRY(BRCM_CC_4377_CHIP_ID, 0xFFFFFFFF, 4377B3), /* 4 */ - BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFFF, 4378B1), /* 3 */ - }; - -@@ -2008,6 +2010,7 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) - base = 0x8c0; - words = 0xb2; - break; -+ case BRCM_CC_4377_CHIP_ID: - case BRCM_CC_4378_CHIP_ID: - coreid = BCMA_CORE_GCI; - base = 0x1120; -@@ -2502,6 +2505,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { - BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID), - BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID), - BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID), -+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4377_DEVICE_ID), - BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID), - { /* end: all zeroes */ } - }; -diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -index 81ada150ee30..6aea4a82e4db 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -@@ -52,6 +52,7 @@ - #define BRCM_CC_43664_CHIP_ID 43664 - #define BRCM_CC_43666_CHIP_ID 43666 - #define BRCM_CC_4371_CHIP_ID 0x4371 -+#define BRCM_CC_4377_CHIP_ID 0x4377 - #define BRCM_CC_4378_CHIP_ID 0x4378 - #define CY_CC_4373_CHIP_ID 0x4373 - #define CY_CC_43012_CHIP_ID 43012 -@@ -90,6 +91,7 @@ - #define BRCM_PCIE_4366_2G_DEVICE_ID 0x43c4 - #define BRCM_PCIE_4366_5G_DEVICE_ID 0x43c5 - #define BRCM_PCIE_4371_DEVICE_ID 0x440d -+#define BRCM_PCIE_4377_DEVICE_ID 0x4488 - #define BRCM_PCIE_4378_DEVICE_ID 0x4425 - - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0101-brcmfmac-pcie-Perform-correct-BCM4364-firmware-selec.patch b/target/linux/silicon/patches-5.19/0101-brcmfmac-pcie-Perform-correct-BCM4364-firmware-selec.patch deleted file mode 100644 index cb45ed38d..000000000 --- a/target/linux/silicon/patches-5.19/0101-brcmfmac-pcie-Perform-correct-BCM4364-firmware-selec.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 042f6e70e7e365ff921edd13060a638bc7c8ef77 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:51:52 +0900 -Subject: [PATCH 101/171] brcmfmac: pcie: Perform correct BCM4364 firmware - selection - -This chip exists in two revisions (B2=r3 and B3=r4) on different -platforms, and was added without regard to doing proper firmware -selection or differentiating between them. Fix this to have proper -per-revision firmwares and support Apple NVRAM selection. - -Revision B2 is present on at least these Apple T2 Macs: - -kauai: MacBook Pro 15" (Touch/2018-2019) -maui: MacBook Pro 13" (Touch/2018-2019) -lanai: Mac mini (Late 2018) -ekans: iMac Pro 27" (5K, Late 2017) - -And these non-T2 Macs: - -nihau: iMac 27" (5K, 2019) - -Revision B3 is present on at least these Apple T2 Macs: - -bali: MacBook Pro 16" (2019) -trinidad: MacBook Pro 13" (2020, 4 TB3) -borneo: MacBook Pro 16" (2019, 5600M) -kahana: Mac Pro (2019) -kahana: Mac Pro (2019, Rack) -hanauma: iMac 27" (5K, 2020) -kure: iMac 27" (5K, 2020, 5700/XT) - -Fixes: 24f0bd136264 ("brcmfmac: add the BRCM 4364 found in MacBook Pro 15,2") -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 11 +++++++++-- - 1 file changed, 9 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index d33919fd1db9..4e5964dd6c47 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -55,7 +55,8 @@ BRCMF_FW_CLM_DEF(4356, "brcmfmac4356-pcie"); - BRCMF_FW_CLM_DEF(43570, "brcmfmac43570-pcie"); - BRCMF_FW_DEF(4358, "brcmfmac4358-pcie"); - BRCMF_FW_DEF(4359, "brcmfmac4359-pcie"); --BRCMF_FW_DEF(4364, "brcmfmac4364-pcie"); -+BRCMF_FW_CLM_DEF(4364B2, "brcmfmac4364b2-pcie"); -+BRCMF_FW_CLM_DEF(4364B3, "brcmfmac4364b3-pcie"); - BRCMF_FW_DEF(4365B, "brcmfmac4365b-pcie"); - BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie"); - BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie"); -@@ -85,7 +86,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - BRCMF_FW_ENTRY(BRCM_CC_43570_CHIP_ID, 0xFFFFFFFF, 43570), - BRCMF_FW_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358), - BRCMF_FW_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359), -- BRCMF_FW_ENTRY(BRCM_CC_4364_CHIP_ID, 0xFFFFFFFF, 4364), -+ BRCMF_FW_ENTRY(BRCM_CC_4364_CHIP_ID, 0x0000000F, 4364B2), /* 3 */ -+ BRCMF_FW_ENTRY(BRCM_CC_4364_CHIP_ID, 0xFFFFFFF0, 4364B3), /* 4 */ - BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0x0000000F, 4365B), - BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C), - BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B), -@@ -2010,6 +2012,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) - base = 0x8c0; - words = 0xb2; - break; -+ case BRCM_CC_4364_CHIP_ID: -+ coreid = BCMA_CORE_CHIPCOMMON; -+ base = 0x8c0; -+ words = 0x1a0; -+ break; - case BRCM_CC_4377_CHIP_ID: - case BRCM_CC_4378_CHIP_ID: - coreid = BCMA_CORE_GCI; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0102-brcmfmac-chip-Only-disable-D11-cores-handle-an-arbit.patch b/target/linux/silicon/patches-5.19/0102-brcmfmac-chip-Only-disable-D11-cores-handle-an-arbit.patch deleted file mode 100644 index cdd582079..000000000 --- a/target/linux/silicon/patches-5.19/0102-brcmfmac-chip-Only-disable-D11-cores-handle-an-arbit.patch +++ /dev/null @@ -1,53 +0,0 @@ -From c36c6c77df947acbc4e562a7bc199bff06b79210 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 20 Dec 2021 20:00:57 +0900 -Subject: [PATCH 102/171] brcmfmac: chip: Only disable D11 cores; handle an - arbitrary number - -At least on BCM4387, the D11 cores are held in reset on cold startup and -firmware expects to release reset itself. Just assert reset here and let -firmware deassert it. Premature deassertion results in the firmware -failing to initialize properly some of the time, with strange AXI bus -errors. - -Also, BCM4387 has 3 cores, up from 2. The logic for handling that is in -brcmf_chip_ai_resetcore(), but since we aren't using that any more, just -handle it here. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 13 ++++++++----- - 1 file changed, 8 insertions(+), 5 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -index 4108108f0431..8266466283e4 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -@@ -1290,15 +1290,18 @@ static bool brcmf_chip_cm3_set_active(struct brcmf_chip_priv *chip) - static inline void - brcmf_chip_cr4_set_passive(struct brcmf_chip_priv *chip) - { -+ int i; - struct brcmf_core *core; - - brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CR4); - -- core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211); -- brcmf_chip_resetcore(core, D11_BCMA_IOCTL_PHYRESET | -- D11_BCMA_IOCTL_PHYCLOCKEN, -- D11_BCMA_IOCTL_PHYCLOCKEN, -- D11_BCMA_IOCTL_PHYCLOCKEN); -+ /* Disable the cores only and let the firmware enable them. -+ * Releasing reset ourselves breaks BCM4387 in weird ways. -+ */ -+ for (i = 0; (core = brcmf_chip_get_d11core(&chip->pub, i)); i++) -+ brcmf_chip_coredisable(core, D11_BCMA_IOCTL_PHYRESET | -+ D11_BCMA_IOCTL_PHYCLOCKEN, -+ D11_BCMA_IOCTL_PHYCLOCKEN); - } - - static bool brcmf_chip_cr4_set_active(struct brcmf_chip_priv *chip, u32 rstvec) --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0103-brcmfmac-chip-Handle-1024-unit-sizes-for-TCM-blocks.patch b/target/linux/silicon/patches-5.19/0103-brcmfmac-chip-Handle-1024-unit-sizes-for-TCM-blocks.patch deleted file mode 100644 index 2fc84cacc..000000000 --- a/target/linux/silicon/patches-5.19/0103-brcmfmac-chip-Handle-1024-unit-sizes-for-TCM-blocks.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 7ab58741bf0d62ff5600dffaf34d06634403f465 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:14:59 +0900 -Subject: [PATCH 103/171] brcmfmac: chip: Handle 1024-unit sizes for TCM blocks - -BCM4387 has trailing odd-sized blocks as part of TCM which have -their size described as a multiple of 1024 instead of 8192. Handle this -so we can compute the TCM size properly. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../wireless/broadcom/brcm80211/brcmfmac/chip.c | 17 ++++++++++++----- - 1 file changed, 12 insertions(+), 5 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -index 8266466283e4..78d835dea8d2 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -@@ -212,8 +212,8 @@ struct sbsocramregs { - #define ARMCR4_TCBANB_MASK 0xf - #define ARMCR4_TCBANB_SHIFT 0 - --#define ARMCR4_BSZ_MASK 0x3f --#define ARMCR4_BSZ_MULT 8192 -+#define ARMCR4_BSZ_MASK 0x7f -+#define ARMCR4_BLK_1K_MASK 0x200 - - struct brcmf_core_priv { - struct brcmf_core pub; -@@ -675,7 +675,8 @@ static u32 brcmf_chip_sysmem_ramsize(struct brcmf_core_priv *sysmem) - } - - /** Return the TCM-RAM size of the ARMCR4 core. */ --static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4) -+static u32 brcmf_chip_tcm_ramsize(struct brcmf_chip_priv *ci, -+ struct brcmf_core_priv *cr4) - { - u32 corecap; - u32 memsize = 0; -@@ -683,6 +684,7 @@ static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4) - u32 nbb; - u32 totb; - u32 bxinfo; -+ u32 blksize; - u32 idx; - - corecap = brcmf_chip_core_read32(cr4, ARMCR4_CAP); -@@ -694,7 +696,12 @@ static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4) - for (idx = 0; idx < totb; idx++) { - brcmf_chip_core_write32(cr4, ARMCR4_BANKIDX, idx); - bxinfo = brcmf_chip_core_read32(cr4, ARMCR4_BANKINFO); -- memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * ARMCR4_BSZ_MULT; -+ if (bxinfo & ARMCR4_BLK_1K_MASK) -+ blksize = 1024; -+ else -+ blksize = 8192; -+ -+ memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * blksize; - } - - return memsize; -@@ -753,7 +760,7 @@ int brcmf_chip_get_raminfo(struct brcmf_chip *pub) - mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_ARM_CR4); - if (mem) { - mem_core = container_of(mem, struct brcmf_core_priv, pub); -- ci->pub.ramsize = brcmf_chip_tcm_ramsize(mem_core); -+ ci->pub.ramsize = brcmf_chip_tcm_ramsize(ci, mem_core); - ci->pub.rambase = brcmf_chip_tcm_rambase(ci); - if (ci->pub.rambase == INVALID_RAMBASE) { - brcmf_err("RAM base not provided with ARM CR4 core\n"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0104-brcmfmac-cfg80211-Add-support-for-scan-params-v2.patch b/target/linux/silicon/patches-5.19/0104-brcmfmac-cfg80211-Add-support-for-scan-params-v2.patch deleted file mode 100644 index c341d5b3f..000000000 --- a/target/linux/silicon/patches-5.19/0104-brcmfmac-cfg80211-Add-support-for-scan-params-v2.patch +++ /dev/null @@ -1,336 +0,0 @@ -From 289dcba688d11fbaace7b9011ec1aab5c85f78ba Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 20 Dec 2021 03:39:44 +0900 -Subject: [PATCH 104/171] brcmfmac: cfg80211: Add support for scan params v2 - -This new API version is required for at least the BCM4387 firmware. Add -support for it, with a fallback to the v1 API. - -Acked-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/cfg80211.c | 113 ++++++++++++++---- - .../broadcom/brcm80211/brcmfmac/feature.c | 1 + - .../broadcom/brcm80211/brcmfmac/feature.h | 4 +- - .../broadcom/brcm80211/brcmfmac/fwil_types.h | 49 +++++++- - 4 files changed, 145 insertions(+), 22 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 605206abe424..3d477f2e5b20 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -770,12 +770,50 @@ void brcmf_set_mpc(struct brcmf_if *ifp, int mpc) - } - } - -+static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg, -+ struct brcmf_scan_params_v2_le *params_le, -+ struct cfg80211_scan_request *request); -+ -+static void brcmf_scan_params_v2_to_v1(struct brcmf_scan_params_v2_le *params_v2_le, -+ struct brcmf_scan_params_le *params_le) -+{ -+ size_t params_size; -+ u32 ch; -+ int n_channels, n_ssids; -+ -+ memcpy(¶ms_le->ssid_le, ¶ms_v2_le->ssid_le, -+ sizeof(params_le->ssid_le)); -+ memcpy(¶ms_le->bssid, ¶ms_v2_le->bssid, -+ sizeof(params_le->bssid)); -+ -+ params_le->bss_type = params_v2_le->bss_type; -+ params_le->scan_type = params_v2_le->scan_type; -+ params_le->nprobes = params_v2_le->nprobes; -+ params_le->active_time = params_v2_le->active_time; -+ params_le->passive_time = params_v2_le->passive_time; -+ params_le->home_time = params_v2_le->home_time; -+ params_le->channel_num = params_v2_le->channel_num; -+ -+ ch = le32_to_cpu(params_v2_le->channel_num); -+ n_channels = ch & BRCMF_SCAN_PARAMS_COUNT_MASK; -+ n_ssids = ch >> BRCMF_SCAN_PARAMS_NSSID_SHIFT; -+ -+ params_size = sizeof(u16) * n_channels; -+ if (n_ssids > 0) { -+ params_size = roundup(params_size, sizeof(u32)); -+ params_size += sizeof(struct brcmf_ssid_le) * n_ssids; -+ } -+ -+ memcpy(¶ms_le->channel_list[0], -+ ¶ms_v2_le->channel_list[0], params_size); -+} -+ - s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg, - struct brcmf_if *ifp, bool aborted, - bool fw_abort) - { - struct brcmf_pub *drvr = cfg->pub; -- struct brcmf_scan_params_le params_le; -+ struct brcmf_scan_params_v2_le params_v2_le; - struct cfg80211_scan_request *scan_request; - u64 reqid; - u32 bucket; -@@ -794,20 +832,23 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg, - if (fw_abort) { - /* Do a scan abort to stop the driver's scan engine */ - brcmf_dbg(SCAN, "ABORT scan in firmware\n"); -- memset(¶ms_le, 0, sizeof(params_le)); -- eth_broadcast_addr(params_le.bssid); -- params_le.bss_type = DOT11_BSSTYPE_ANY; -- params_le.scan_type = 0; -- params_le.channel_num = cpu_to_le32(1); -- params_le.nprobes = cpu_to_le32(1); -- params_le.active_time = cpu_to_le32(-1); -- params_le.passive_time = cpu_to_le32(-1); -- params_le.home_time = cpu_to_le32(-1); -- /* Scan is aborted by setting channel_list[0] to -1 */ -- params_le.channel_list[0] = cpu_to_le16(-1); -+ -+ brcmf_escan_prep(cfg, ¶ms_v2_le, NULL); -+ - /* E-Scan (or anyother type) can be aborted by SCAN */ -- err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCAN, -- ¶ms_le, sizeof(params_le)); -+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SCAN_V2)) { -+ err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCAN, -+ ¶ms_v2_le, -+ sizeof(params_v2_le)); -+ } else { -+ struct brcmf_scan_params_le params_le; -+ -+ brcmf_scan_params_v2_to_v1(¶ms_v2_le, ¶ms_le); -+ err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCAN, -+ ¶ms_le, -+ sizeof(params_le)); -+ } -+ - if (err) - bphy_err(drvr, "Scan abort failed\n"); - } -@@ -1027,7 +1068,7 @@ brcmf_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev, - } - - static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg, -- struct brcmf_scan_params_le *params_le, -+ struct brcmf_scan_params_v2_le *params_le, - struct cfg80211_scan_request *request) - { - u32 n_ssids; -@@ -1036,9 +1077,14 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg, - s32 offset; - u16 chanspec; - char *ptr; -+ int length; - struct brcmf_ssid_le ssid_le; - - eth_broadcast_addr(params_le->bssid); -+ -+ length = BRCMF_SCAN_PARAMS_V2_FIXED_SIZE; -+ -+ params_le->version = BRCMF_SCAN_PARAMS_VERSION_V2; - params_le->bss_type = DOT11_BSSTYPE_ANY; - params_le->scan_type = BRCMF_SCANTYPE_ACTIVE; - params_le->channel_num = 0; -@@ -1048,6 +1094,15 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg, - params_le->home_time = cpu_to_le32(-1); - memset(¶ms_le->ssid_le, 0, sizeof(params_le->ssid_le)); - -+ /* Scan abort */ -+ if (!request) { -+ length += sizeof(u16); -+ params_le->channel_num = cpu_to_le32(1); -+ params_le->channel_list[0] = cpu_to_le16(-1); -+ params_le->length = cpu_to_le16(length); -+ return; -+ } -+ - n_ssids = request->n_ssids; - n_channels = request->n_channels; - -@@ -1055,6 +1110,7 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg, - brcmf_dbg(SCAN, "### List of channelspecs to scan ### %d\n", - n_channels); - if (n_channels > 0) { -+ length += roundup(sizeof(u16) * n_channels, sizeof(u32)); - for (i = 0; i < n_channels; i++) { - chanspec = channel_to_chanspec(&cfg->d11inf, - request->channels[i]); -@@ -1065,12 +1121,14 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg, - } else { - brcmf_dbg(SCAN, "Scanning all channels\n"); - } -+ - /* Copy ssid array if applicable */ - brcmf_dbg(SCAN, "### List of SSIDs to scan ### %d\n", n_ssids); - if (n_ssids > 0) { -- offset = offsetof(struct brcmf_scan_params_le, channel_list) + -+ offset = offsetof(struct brcmf_scan_params_v2_le, channel_list) + - n_channels * sizeof(u16); - offset = roundup(offset, sizeof(u32)); -+ length += sizeof(ssid_le) * n_ssids, - ptr = (char *)params_le + offset; - for (i = 0; i < n_ssids; i++) { - memset(&ssid_le, 0, sizeof(ssid_le)); -@@ -1090,6 +1148,7 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg, - brcmf_dbg(SCAN, "Performing passive scan\n"); - params_le->scan_type = BRCMF_SCANTYPE_PASSIVE; - } -+ params_le->length = cpu_to_le16(length); - /* Adding mask to channel numbers */ - params_le->channel_num = - cpu_to_le32((n_ssids << BRCMF_SCAN_PARAMS_NSSID_SHIFT) | -@@ -1101,8 +1160,8 @@ brcmf_run_escan(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp, - struct cfg80211_scan_request *request) - { - struct brcmf_pub *drvr = cfg->pub; -- s32 params_size = BRCMF_SCAN_PARAMS_FIXED_SIZE + -- offsetof(struct brcmf_escan_params_le, params_le); -+ s32 params_size = BRCMF_SCAN_PARAMS_V2_FIXED_SIZE + -+ offsetof(struct brcmf_escan_params_le, params_v2_le); - struct brcmf_escan_params_le *params; - s32 err = 0; - -@@ -1122,8 +1181,22 @@ brcmf_run_escan(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp, - goto exit; - } - BUG_ON(params_size + sizeof("escan") >= BRCMF_DCMD_MEDLEN); -- brcmf_escan_prep(cfg, ¶ms->params_le, request); -- params->version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION); -+ brcmf_escan_prep(cfg, ¶ms->params_v2_le, request); -+ -+ params->version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION_V2); -+ -+ if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SCAN_V2)) { -+ struct brcmf_escan_params_le *params_v1; -+ -+ params_size -= BRCMF_SCAN_PARAMS_V2_FIXED_SIZE; -+ params_size += BRCMF_SCAN_PARAMS_FIXED_SIZE; -+ params_v1 = kzalloc(params_size, GFP_KERNEL); -+ params_v1->version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION); -+ brcmf_scan_params_v2_to_v1(¶ms->params_v2_le, ¶ms_v1->params_le); -+ kfree(params); -+ params = params_v1; -+ } -+ - params->action = cpu_to_le16(WL_ESCAN_ACTION_START); - params->sync_id = cpu_to_le16(0x1234); - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c -index d2ac844e1e9f..19df83399a45 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c -@@ -288,6 +288,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr) - ifp->drvr->feat_flags |= BIT(BRCMF_FEAT_SCAN_RANDOM_MAC); - - brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_FWSUP, "sup_wpa"); -+ brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_SCAN_V2, "scan_ver"); - - if (drvr->settings->feature_disable) { - brcmf_dbg(INFO, "Features: 0x%02x, disable: 0x%02x\n", -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h -index d1f4257af696..9d098a068d13 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h -@@ -29,6 +29,7 @@ - * DOT11H: firmware supports 802.11h - * SAE: simultaneous authentication of equals - * FWAUTH: Firmware authenticator -+ * SCAN_V2: Version 2 scan params - */ - #define BRCMF_FEAT_LIST \ - BRCMF_FEAT_DEF(MBSS) \ -@@ -51,7 +52,8 @@ - BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \ - BRCMF_FEAT_DEF(DOT11H) \ - BRCMF_FEAT_DEF(SAE) \ -- BRCMF_FEAT_DEF(FWAUTH) -+ BRCMF_FEAT_DEF(FWAUTH) \ -+ BRCMF_FEAT_DEF(SCAN_V2) - - /* - * Quirks: -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -index c87b829adb0d..648dc302b998 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -@@ -48,6 +48,10 @@ - - /* size of brcmf_scan_params not including variable length array */ - #define BRCMF_SCAN_PARAMS_FIXED_SIZE 64 -+#define BRCMF_SCAN_PARAMS_V2_FIXED_SIZE 72 -+ -+/* version of brcmf_scan_params structure */ -+#define BRCMF_SCAN_PARAMS_VERSION_V2 2 - - /* masks for channel and ssid count */ - #define BRCMF_SCAN_PARAMS_COUNT_MASK 0x0000ffff -@@ -67,6 +71,7 @@ - #define BRCMF_PRIMARY_KEY (1 << 1) - #define DOT11_BSSTYPE_ANY 2 - #define BRCMF_ESCAN_REQ_VERSION 1 -+#define BRCMF_ESCAN_REQ_VERSION_V2 2 - - #define BRCMF_MAXRATES_IN_SET 16 /* max # of rates in rateset */ - -@@ -386,6 +391,45 @@ struct brcmf_scan_params_le { - __le16 channel_list[1]; /* list of chanspecs */ - }; - -+struct brcmf_scan_params_v2_le { -+ __le16 version; /* structure version */ -+ __le16 length; /* structure length */ -+ struct brcmf_ssid_le ssid_le; /* default: {0, ""} */ -+ u8 bssid[ETH_ALEN]; /* default: bcast */ -+ s8 bss_type; /* default: any, -+ * DOT11_BSSTYPE_ANY/INFRASTRUCTURE/INDEPENDENT -+ */ -+ u8 pad; -+ __le32 scan_type; /* flags, 0 use default */ -+ __le32 nprobes; /* -1 use default, number of probes per channel */ -+ __le32 active_time; /* -1 use default, dwell time per channel for -+ * active scanning -+ */ -+ __le32 passive_time; /* -1 use default, dwell time per channel -+ * for passive scanning -+ */ -+ __le32 home_time; /* -1 use default, dwell time for the -+ * home channel between channel scans -+ */ -+ __le32 channel_num; /* count of channels and ssids that follow -+ * -+ * low half is count of channels in -+ * channel_list, 0 means default (use all -+ * available channels) -+ * -+ * high half is entries in struct brcmf_ssid -+ * array that follows channel_list, aligned for -+ * s32 (4 bytes) meaning an odd channel count -+ * implies a 2-byte pad between end of -+ * channel_list and first ssid -+ * -+ * if ssid count is zero, single ssid in the -+ * fixed parameter portion is assumed, otherwise -+ * ssid in the fixed portion is ignored -+ */ -+ __le16 channel_list[1]; /* list of chanspecs */ -+}; -+ - struct brcmf_scan_results { - u32 buflen; - u32 version; -@@ -397,7 +441,10 @@ struct brcmf_escan_params_le { - __le32 version; - __le16 action; - __le16 sync_id; -- struct brcmf_scan_params_le params_le; -+ union { -+ struct brcmf_scan_params_le params_le; -+ struct brcmf_scan_params_v2_le params_v2_le; -+ }; - }; - - struct brcmf_escan_result_le { --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0105-brcmfmac-feature-Add-support-for-setting-feats-based.patch b/target/linux/silicon/patches-5.19/0105-brcmfmac-feature-Add-support-for-setting-feats-based.patch deleted file mode 100644 index 07a37a782..000000000 --- a/target/linux/silicon/patches-5.19/0105-brcmfmac-feature-Add-support-for-setting-feats-based.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 219660e563a04cd417b918fcda232433acbea543 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 20 Dec 2021 18:15:10 +0900 -Subject: [PATCH 105/171] brcmfmac: feature: Add support for setting feats - based on WLC version - -The "wlc_ver" iovar returns information on the WLC and EPI versions. -This can be used to determine whether the PMKID_V2 and _V3 features are -supported. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/feature.c | 48 +++++++++++++++++++ - .../broadcom/brcm80211/brcmfmac/feature.h | 4 +- - .../broadcom/brcm80211/brcmfmac/fwil_types.h | 25 ++++++++++ - 3 files changed, 76 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c -index 19df83399a45..ac873677343c 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c -@@ -126,6 +126,53 @@ static void brcmf_feat_firmware_overrides(struct brcmf_pub *drv) - drv->feat_flags |= feat_flags; - } - -+struct brcmf_feat_wlcfeat { -+ u16 min_ver_major; -+ u16 min_ver_minor; -+ u32 feat_flags; -+}; -+ -+static const struct brcmf_feat_wlcfeat brcmf_feat_wlcfeat_map[] = { -+ { 12, 0, BIT(BRCMF_FEAT_PMKID_V2) }, -+ { 13, 0, BIT(BRCMF_FEAT_PMKID_V3) }, -+}; -+ -+static void brcmf_feat_wlc_version_overrides(struct brcmf_pub *drv) -+{ -+ struct brcmf_if *ifp = brcmf_get_ifp(drv, 0); -+ const struct brcmf_feat_wlcfeat *e; -+ struct brcmf_wlc_version_le ver; -+ u32 feat_flags = 0; -+ int i, err, major, minor; -+ -+ err = brcmf_fil_iovar_data_get(ifp, "wlc_ver", &ver, sizeof(ver)); -+ if (err) -+ return; -+ -+ major = le16_to_cpu(ver.wlc_ver_major); -+ minor = le16_to_cpu(ver.wlc_ver_minor); -+ -+ brcmf_dbg(INFO, "WLC version: %d.%d\n", major, minor); -+ -+ for (i = 0; i < ARRAY_SIZE(brcmf_feat_wlcfeat_map); i++) { -+ e = &brcmf_feat_wlcfeat_map[i]; -+ if (major > e->min_ver_major || -+ (major == e->min_ver_major && -+ minor >= e->min_ver_minor)) { -+ feat_flags |= e->feat_flags; -+ } -+ } -+ -+ if (!feat_flags) -+ return; -+ -+ for (i = 0; i < BRCMF_FEAT_LAST; i++) -+ if (feat_flags & BIT(i)) -+ brcmf_dbg(INFO, "enabling firmware feature: %s\n", -+ brcmf_feat_names[i]); -+ drv->feat_flags |= feat_flags; -+} -+ - /** - * brcmf_feat_iovar_int_get() - determine feature through iovar query. - * -@@ -297,6 +344,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr) - ifp->drvr->feat_flags &= ~drvr->settings->feature_disable; - } - -+ brcmf_feat_wlc_version_overrides(drvr); - brcmf_feat_firmware_overrides(drvr); - - /* set chip related quirks */ -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h -index 9d098a068d13..becbcc50d57a 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h -@@ -53,7 +53,9 @@ - BRCMF_FEAT_DEF(DOT11H) \ - BRCMF_FEAT_DEF(SAE) \ - BRCMF_FEAT_DEF(FWAUTH) \ -- BRCMF_FEAT_DEF(SCAN_V2) -+ BRCMF_FEAT_DEF(SCAN_V2) \ -+ BRCMF_FEAT_DEF(PMKID_V2) \ -+ BRCMF_FEAT_DEF(PMKID_V3) - - /* - * Quirks: -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -index 648dc302b998..a75aabb0933b 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -@@ -788,6 +788,31 @@ struct brcmf_rev_info_le { - __le32 nvramrev; - }; - -+/** -+ * struct brcmf_wlc_version_le - firmware revision info. -+ * -+ * @version: structure version. -+ * @length: structure length. -+ * @epi_ver_major: EPI major version -+ * @epi_ver_minor: EPI minor version -+ * @epi_ver_rc: EPI rc version -+ * @epi_ver_incr: EPI increment version -+ * @wlc_ver_major: WLC major version -+ * @wlc_ver_minor: WLC minor version -+ */ -+struct brcmf_wlc_version_le { -+ __le16 version; -+ __le16 length; -+ -+ __le16 epi_ver_major; -+ __le16 epi_ver_minor; -+ __le16 epi_ver_rc; -+ __le16 epi_ver_incr; -+ -+ __le16 wlc_ver_major; -+ __le16 wlc_ver_minor; -+}; -+ - /** - * struct brcmf_assoclist_le - request assoc list. - * --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0106-brcmfmac-cfg80211-Add-support-for-PMKID_V3-operation.patch b/target/linux/silicon/patches-5.19/0106-brcmfmac-cfg80211-Add-support-for-PMKID_V3-operation.patch deleted file mode 100644 index c5c492b2e..000000000 --- a/target/linux/silicon/patches-5.19/0106-brcmfmac-cfg80211-Add-support-for-PMKID_V3-operation.patch +++ /dev/null @@ -1,228 +0,0 @@ -From abc68682c16899030b797094581a781c7fadd784 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 20 Dec 2021 18:16:33 +0900 -Subject: [PATCH 106/171] brcmfmac: cfg80211: Add support for PMKID_V3 - operations - -Add support for the new PMKID_V3 API, which allows performing PMKID -mutations individually, instead of requiring the driver to keep track of -the full list. This new API is required by at least BCM4387. - -Note that PMKID_V2 is not implemented yet. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/cfg80211.c | 52 +++++++++++- - .../broadcom/brcm80211/brcmfmac/fwil_types.h | 83 +++++++++++++++++++ - 2 files changed, 132 insertions(+), 3 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 3d477f2e5b20..6ed53665b0dd 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -4051,6 +4051,37 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy, - return 0; - } - -+static s32 -+brcmf_pmksa_v3_op(struct brcmf_if *ifp, struct cfg80211_pmksa *pmksa, -+ bool alive) -+{ -+ struct brcmf_pmk_op_v3_le *pmk_op; -+ int length = offsetof(struct brcmf_pmk_op_v3_le, pmk); -+ int ret; -+ -+ pmk_op = kzalloc(sizeof(*pmk_op), GFP_KERNEL); -+ pmk_op->version = cpu_to_le16(BRCMF_PMKSA_VER_3); -+ -+ if (!pmksa) { -+ /* Flush operation, operate on entire list */ -+ pmk_op->count = cpu_to_le16(0); -+ } else { -+ /* Single PMK operation */ -+ pmk_op->count = cpu_to_le16(1); -+ length += sizeof(struct brcmf_pmksa_v3); -+ memcpy(pmk_op->pmk[0].bssid, pmksa->bssid, ETH_ALEN); -+ memcpy(pmk_op->pmk[0].pmkid, pmksa->pmkid, WLAN_PMKID_LEN); -+ pmk_op->pmk[0].pmkid_len = WLAN_PMKID_LEN; -+ pmk_op->pmk[0].time_left = alive ? BRCMF_PMKSA_NO_EXPIRY : 0; -+ } -+ -+ pmk_op->length = cpu_to_le16(length); -+ -+ ret = brcmf_fil_iovar_data_set(ifp, "pmkid_info", pmk_op, sizeof(*pmk_op)); -+ kfree(pmk_op); -+ return ret; -+} -+ - static __used s32 - brcmf_update_pmklist(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp) - { -@@ -4087,6 +4118,14 @@ brcmf_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *ndev, - if (!check_vif_up(ifp->vif)) - return -EIO; - -+ brcmf_dbg(CONN, "set_pmksa - PMK bssid: %pM =\n", pmksa->bssid); -+ brcmf_dbg(CONN, "%*ph\n", WLAN_PMKID_LEN, pmksa->pmkid); -+ -+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PMKID_V3)) -+ return brcmf_pmksa_v3_op(ifp, pmksa, true); -+ -+ /* TODO: implement PMKID_V2 */ -+ - npmk = le32_to_cpu(cfg->pmk_list.npmk); - for (i = 0; i < npmk; i++) - if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN)) -@@ -4103,9 +4142,6 @@ brcmf_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *ndev, - return -EINVAL; - } - -- brcmf_dbg(CONN, "set_pmksa - PMK bssid: %pM =\n", pmk[npmk].bssid); -- brcmf_dbg(CONN, "%*ph\n", WLAN_PMKID_LEN, pmk[npmk].pmkid); -- - err = brcmf_update_pmklist(cfg, ifp); - - brcmf_dbg(TRACE, "Exit\n"); -@@ -4129,6 +4165,11 @@ brcmf_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *ndev, - - brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", pmksa->bssid); - -+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PMKID_V3)) -+ return brcmf_pmksa_v3_op(ifp, pmksa, false); -+ -+ /* TODO: implement PMKID_V2 */ -+ - npmk = le32_to_cpu(cfg->pmk_list.npmk); - for (i = 0; i < npmk; i++) - if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN)) -@@ -4165,6 +4206,11 @@ brcmf_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device *ndev) - if (!check_vif_up(ifp->vif)) - return -EIO; - -+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PMKID_V3)) -+ return brcmf_pmksa_v3_op(ifp, NULL, false); -+ -+ /* TODO: implement PMKID_V2 */ -+ - memset(&cfg->pmk_list, 0, sizeof(cfg->pmk_list)); - err = brcmf_update_pmklist(cfg, ifp); - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -index a75aabb0933b..9debd7248344 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -@@ -174,6 +174,10 @@ - - #define BRCMF_HE_CAP_MCS_MAP_NSS_MAX 8 - -+#define BRCMF_PMKSA_VER_2 2 -+#define BRCMF_PMKSA_VER_3 3 -+#define BRCMF_PMKSA_NO_EXPIRY 0xffffffff -+ - /* MAX_CHUNK_LEN is the maximum length for data passing to firmware in each - * ioctl. It is relatively small because firmware has small maximum size input - * playload restriction for ioctls. -@@ -355,6 +359,12 @@ struct brcmf_ssid_le { - unsigned char SSID[IEEE80211_MAX_SSID_LEN]; - }; - -+/* Alternate SSID structure used in some places... */ -+struct brcmf_ssid8_le { -+ u8 SSID_len; -+ unsigned char SSID[IEEE80211_MAX_SSID_LEN]; -+}; -+ - struct brcmf_scan_params_le { - struct brcmf_ssid_le ssid_le; /* default: {0, ""} */ - u8 bssid[ETH_ALEN]; /* default: bcast */ -@@ -875,6 +885,51 @@ struct brcmf_pmksa { - u8 pmkid[WLAN_PMKID_LEN]; - }; - -+/** -+ * struct brcmf_pmksa_v2 - PMK Security Association -+ * -+ * @length: Length of the structure. -+ * @bssid: The AP's BSSID. -+ * @pmkid: The PMK ID. -+ * @pmk: PMK material for FILS key derivation. -+ * @pmk_len: Length of PMK data. -+ * @ssid: The AP's SSID. -+ * @fils_cache_id: FILS cache identifier -+ */ -+struct brcmf_pmksa_v2 { -+ __le16 length; -+ u8 bssid[ETH_ALEN]; -+ u8 pmkid[WLAN_PMKID_LEN]; -+ u8 pmk[WLAN_PMK_LEN_SUITE_B_192]; -+ __le16 pmk_len; -+ struct brcmf_ssid8_le ssid; -+ u16 fils_cache_id; -+}; -+ -+/** -+ * struct brcmf_pmksa_v3 - PMK Security Association -+ * -+ * @bssid: The AP's BSSID. -+ * @pmkid: The PMK ID. -+ * @pmkid_len: The length of the PMK ID. -+ * @pmk: PMK material for FILS key derivation. -+ * @pmk_len: Length of PMK data. -+ * @fils_cache_id: FILS cache identifier -+ * @ssid: The AP's SSID. -+ * @time_left: Remaining time until expiry. 0 = expired, ~0 = no expiry. -+ */ -+struct brcmf_pmksa_v3 { -+ u8 bssid[ETH_ALEN]; -+ u8 pmkid[WLAN_PMKID_LEN]; -+ u8 pmkid_len; -+ u8 pmk[WLAN_PMK_LEN_SUITE_B_192]; -+ u8 pmk_len; -+ __le16 fils_cache_id; -+ u8 pad; -+ struct brcmf_ssid8_le ssid; -+ __le32 time_left; -+}; -+ - /** - * struct brcmf_pmk_list_le - List of pmksa's. - * -@@ -886,6 +941,34 @@ struct brcmf_pmk_list_le { - struct brcmf_pmksa pmk[BRCMF_MAXPMKID]; - }; - -+/** -+ * struct brcmf_pmk_list_v2_le - List of pmksa's. -+ * -+ * @version: Request version. -+ * @length: Length of this structure. -+ * @pmk: PMK SA information. -+ */ -+struct brcmf_pmk_list_v2_le { -+ __le16 version; -+ __le16 length; -+ struct brcmf_pmksa_v2 pmk[BRCMF_MAXPMKID]; -+}; -+ -+/** -+ * struct brcmf_pmk_op_v3_le - Operation on PMKSA list. -+ * -+ * @version: Request version. -+ * @length: Length of this structure. -+ * @pmk: PMK SA information. -+ */ -+struct brcmf_pmk_op_v3_le { -+ __le16 version; -+ __le16 length; -+ __le16 count; -+ __le16 pad; -+ struct brcmf_pmksa_v3 pmk[BRCMF_MAXPMKID]; -+}; -+ - /** - * struct brcmf_pno_param_le - PNO scan configuration parameters - * --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0107-brcmfmac-cfg80211-Pass-the-PMK-in-binary-instead-of-.patch b/target/linux/silicon/patches-5.19/0107-brcmfmac-cfg80211-Pass-the-PMK-in-binary-instead-of-.patch deleted file mode 100644 index 7de7d322b..000000000 --- a/target/linux/silicon/patches-5.19/0107-brcmfmac-cfg80211-Pass-the-PMK-in-binary-instead-of-.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 1afeed973f6d538e18e171e55bfa91e25e6b804f Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 20 Dec 2021 19:15:58 +0900 -Subject: [PATCH 107/171] brcmfmac: cfg80211: Pass the PMK in binary instead of - hex - -Apparently the hex passphrase mechanism does not work on newer -chips/firmware (e.g. BCM4387). It seems there was a simple way of -passing it in binary all along, so use that and avoid the hexification. - -OpenBSD has been doing it like this from the beginning, so this should -work on all chips. - -Also clear the structure before setting the PMK. This was leaking -uninitialized stack contents to the device. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 13 +++++++------ - 1 file changed, 7 insertions(+), 6 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 6ed53665b0dd..7789f74707a7 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -1421,13 +1421,14 @@ static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len) - { - struct brcmf_pub *drvr = ifp->drvr; - struct brcmf_wsec_pmk_le pmk; -- int i, err; -+ int err; -+ -+ memset(&pmk, 0, sizeof(pmk)); - -- /* convert to firmware key format */ -- pmk.key_len = cpu_to_le16(pmk_len << 1); -- pmk.flags = cpu_to_le16(BRCMF_WSEC_PASSPHRASE); -- for (i = 0; i < pmk_len; i++) -- snprintf(&pmk.key[2 * i], 3, "%02x", pmk_data[i]); -+ /* pass pmk directly */ -+ pmk.key_len = cpu_to_le16(pmk_len); -+ pmk.flags = cpu_to_le16(0); -+ memcpy(pmk.key, pmk_data, pmk_len); - - /* store psk in firmware */ - err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_WSEC_PMK, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0108-brcmflac-cfg80211-Use-WSEC-to-set-SAE-password.patch b/target/linux/silicon/patches-5.19/0108-brcmflac-cfg80211-Use-WSEC-to-set-SAE-password.patch deleted file mode 100644 index 522ca760e..000000000 --- a/target/linux/silicon/patches-5.19/0108-brcmflac-cfg80211-Use-WSEC-to-set-SAE-password.patch +++ /dev/null @@ -1,106 +0,0 @@ -From e918f78b4880ada8e5b5d6a53906c7d86db4b5ec Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 6 Jan 2022 19:45:15 +0900 -Subject: [PATCH 108/171] brcmflac: cfg80211: Use WSEC to set SAE password - -Using the WSEC command instead of sae_password seems to be the supported -mechanism on newer firmware, and also how the brcmdhd driver does it. - -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/cfg80211.c | 46 ++++++++----------- - .../broadcom/brcm80211/brcmfmac/fwil_types.h | 2 +- - 2 files changed, 20 insertions(+), 28 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 7789f74707a7..63ecbbe11af1 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -1417,52 +1417,44 @@ static u16 brcmf_map_fw_linkdown_reason(const struct brcmf_event_msg *e) - return reason; - } - --static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len) -+static int brcmf_set_wsec(struct brcmf_if *ifp, const u8 *key, u16 key_len, u16 flags) - { - struct brcmf_pub *drvr = ifp->drvr; - struct brcmf_wsec_pmk_le pmk; - int err; - -+ if (key_len > sizeof(pmk.key)) { -+ bphy_err(drvr, "key must be less than %zu bytes\n", -+ sizeof(pmk.key)); -+ return -EINVAL; -+ } -+ - memset(&pmk, 0, sizeof(pmk)); - -- /* pass pmk directly */ -- pmk.key_len = cpu_to_le16(pmk_len); -- pmk.flags = cpu_to_le16(0); -- memcpy(pmk.key, pmk_data, pmk_len); -+ /* pass key material directly */ -+ pmk.key_len = cpu_to_le16(key_len); -+ pmk.flags = cpu_to_le16(flags); -+ memcpy(pmk.key, key, key_len); - -- /* store psk in firmware */ -+ /* store key material in firmware */ - err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_WSEC_PMK, - &pmk, sizeof(pmk)); - if (err < 0) - bphy_err(drvr, "failed to change PSK in firmware (len=%u)\n", -- pmk_len); -+ key_len); - - return err; - } - -+static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len) -+{ -+ return brcmf_set_wsec(ifp, pmk_data, pmk_len, 0); -+} -+ - static int brcmf_set_sae_password(struct brcmf_if *ifp, const u8 *pwd_data, - u16 pwd_len) - { -- struct brcmf_pub *drvr = ifp->drvr; -- struct brcmf_wsec_sae_pwd_le sae_pwd; -- int err; -- -- if (pwd_len > BRCMF_WSEC_MAX_SAE_PASSWORD_LEN) { -- bphy_err(drvr, "sae_password must be less than %d\n", -- BRCMF_WSEC_MAX_SAE_PASSWORD_LEN); -- return -EINVAL; -- } -- -- sae_pwd.key_len = cpu_to_le16(pwd_len); -- memcpy(sae_pwd.key, pwd_data, pwd_len); -- -- err = brcmf_fil_iovar_data_set(ifp, "sae_password", &sae_pwd, -- sizeof(sae_pwd)); -- if (err < 0) -- bphy_err(drvr, "failed to set SAE password in firmware (len=%u)\n", -- pwd_len); -- -- return err; -+ return brcmf_set_wsec(ifp, pwd_data, pwd_len, BRCMF_WSEC_PASSPHRASE); - } - - static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason, -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -index 9debd7248344..1d406649eca2 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h -@@ -574,7 +574,7 @@ struct brcmf_wsec_key_le { - struct brcmf_wsec_pmk_le { - __le16 key_len; - __le16 flags; -- u8 key[2 * BRCMF_WSEC_MAX_PSK_LEN + 1]; -+ u8 key[BRCMF_WSEC_MAX_SAE_PASSWORD_LEN]; - }; - - /** --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0109-brcmfmac-pcie-Add-IDs-properties-for-BCM4387.patch b/target/linux/silicon/patches-5.19/0109-brcmfmac-pcie-Add-IDs-properties-for-BCM4387.patch deleted file mode 100644 index 9617d55d9..000000000 --- a/target/linux/silicon/patches-5.19/0109-brcmfmac-pcie-Add-IDs-properties-for-BCM4387.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 5a7fc90929ae21acab41856221149be1343d0e09 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 21 Dec 2021 17:52:03 +0900 -Subject: [PATCH 109/171] brcmfmac: pcie: Add IDs/properties for BCM4387 - -This chip is present on Apple M1 Pro/Max (t600x) platforms: - -* maldives (apple,j314s): MacBook Pro (14-inch, M1 Pro, 2021) -* maldives (apple,j314c): MacBook Pro (14-inch, M1 Max, 2021) -* madagascar (apple,j316s): MacBook Pro (16-inch, M1 Pro, 2021) -* madagascar (apple,j316c): MacBook Pro (16-inch, M1 Max, 2021) - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 2 ++ - drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 8 ++++++++ - .../net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 2 ++ - 3 files changed, 12 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -index 78d835dea8d2..99502de31d56 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c -@@ -743,6 +743,8 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci) - return 0x170000; - case BRCM_CC_4378_CHIP_ID: - return 0x352000; -+ case BRCM_CC_4387_CHIP_ID: -+ return 0x740000; - default: - brcmf_err("unknown chip: %s\n", ci->pub.name); - break; -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 4e5964dd6c47..3597571039a9 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -64,6 +64,7 @@ BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie"); - BRCMF_FW_DEF(4371, "brcmfmac4371-pcie"); - BRCMF_FW_CLM_DEF(4377B3, "brcmfmac4377b3-pcie"); - BRCMF_FW_CLM_DEF(4378B1, "brcmfmac4378b1-pcie"); -+BRCMF_FW_CLM_DEF(4387C2, "brcmfmac4387c2-pcie"); - - /* firmware config files */ - MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.txt"); -@@ -97,6 +98,7 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371), - BRCMF_FW_ENTRY(BRCM_CC_4377_CHIP_ID, 0xFFFFFFFF, 4377B3), /* 4 */ - BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFFF, 4378B1), /* 3 */ -+ BRCMF_FW_ENTRY(BRCM_CC_4387_CHIP_ID, 0xFFFFFFFF, 4387C2), /* 7 */ - }; - - #define BRCMF_PCIE_FW_UP_TIMEOUT 5000 /* msec */ -@@ -2023,6 +2025,11 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) - base = 0x1120; - words = 0x170; - break; -+ case BRCM_CC_4387_CHIP_ID: -+ coreid = BCMA_CORE_GCI; -+ base = 0x113c; -+ words = 0x170; -+ break; - default: - /* OTP not supported on this chip */ - return 0; -@@ -2514,6 +2521,7 @@ static const struct pci_device_id brcmf_pcie_devid_table[] = { - BRCMF_PCIE_DEVICE(BRCM_PCIE_4371_DEVICE_ID), - BRCMF_PCIE_DEVICE(BRCM_PCIE_4377_DEVICE_ID), - BRCMF_PCIE_DEVICE(BRCM_PCIE_4378_DEVICE_ID), -+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4387_DEVICE_ID), - { /* end: all zeroes */ } - }; - -diff --git a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -index 6aea4a82e4db..7e863cea344f 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h -@@ -54,6 +54,7 @@ - #define BRCM_CC_4371_CHIP_ID 0x4371 - #define BRCM_CC_4377_CHIP_ID 0x4377 - #define BRCM_CC_4378_CHIP_ID 0x4378 -+#define BRCM_CC_4387_CHIP_ID 0x4387 - #define CY_CC_4373_CHIP_ID 0x4373 - #define CY_CC_43012_CHIP_ID 43012 - #define CY_CC_43752_CHIP_ID 43752 -@@ -93,6 +94,7 @@ - #define BRCM_PCIE_4371_DEVICE_ID 0x440d - #define BRCM_PCIE_4377_DEVICE_ID 0x4488 - #define BRCM_PCIE_4378_DEVICE_ID 0x4425 -+#define BRCM_PCIE_4387_DEVICE_ID 0x4433 - - - /* brcmsmac IDs */ --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0110-brcmfmac-common-Add-support-for-downloading-TxCap-bl.patch b/target/linux/silicon/patches-5.19/0110-brcmfmac-common-Add-support-for-downloading-TxCap-bl.patch deleted file mode 100644 index d082be6ed..000000000 --- a/target/linux/silicon/patches-5.19/0110-brcmfmac-common-Add-support-for-downloading-TxCap-bl.patch +++ /dev/null @@ -1,190 +0,0 @@ -From 5646bfbf2b14b996481e6ec951df7979cfa15e46 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 26 Dec 2021 00:25:00 +0900 -Subject: [PATCH 110/171] brcmfmac: common: Add support for downloading TxCap - blobs - -The TxCap blobs are additional data blobs used on Apple devices, and -are uploaded analogously to CLM blobs. Add core support for doing this. - -Acked-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/bus.h | 1 + - .../broadcom/brcm80211/brcmfmac/common.c | 97 +++++++++++++------ - 2 files changed, 71 insertions(+), 27 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -index b13af8f631f3..f4bd98da9761 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -@@ -39,6 +39,7 @@ enum brcmf_bus_protocol_type { - /* Firmware blobs that may be available */ - enum brcmf_blob_type { - BRCMF_BLOB_CLM, -+ BRCMF_BLOB_TXCAP, - }; - - struct brcmf_mp_device; -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -index ea2475bfc2d7..d36aeca5c74e 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -@@ -101,7 +101,7 @@ void brcmf_c_set_joinpref_default(struct brcmf_if *ifp) - - static int brcmf_c_download(struct brcmf_if *ifp, u16 flag, - struct brcmf_dload_data_le *dload_buf, -- u32 len) -+ u32 len, const char *var) - { - s32 err; - -@@ -112,17 +112,17 @@ static int brcmf_c_download(struct brcmf_if *ifp, u16 flag, - dload_buf->crc = cpu_to_le32(0); - len = sizeof(*dload_buf) + len - 1; - -- err = brcmf_fil_iovar_data_set(ifp, "clmload", dload_buf, len); -+ err = brcmf_fil_iovar_data_set(ifp, var, dload_buf, len); - - return err; - } - --static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) -+static int brcmf_c_download_blob(struct brcmf_if *ifp, -+ const void *data, size_t size, -+ const char *loadvar, const char *statvar) - { - struct brcmf_pub *drvr = ifp->drvr; -- struct brcmf_bus *bus = drvr->bus_if; - struct brcmf_dload_data_le *chunk_buf; -- const struct firmware *clm = NULL; - u32 chunk_len; - u32 datalen; - u32 cumulative_len; -@@ -132,20 +132,11 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) - - brcmf_dbg(TRACE, "Enter\n"); - -- err = brcmf_bus_get_blob(bus, &clm, BRCMF_BLOB_CLM); -- if (err || !clm) { -- brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n", -- err); -- return 0; -- } -- - chunk_buf = kzalloc(sizeof(*chunk_buf) + MAX_CHUNK_LEN - 1, GFP_KERNEL); -- if (!chunk_buf) { -- err = -ENOMEM; -- goto done; -- } -+ if (!chunk_buf) -+ return -ENOMEM; - -- datalen = clm->size; -+ datalen = size; - cumulative_len = 0; - do { - if (datalen > MAX_CHUNK_LEN) { -@@ -154,9 +145,10 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) - chunk_len = datalen; - dl_flag |= DL_END; - } -- memcpy(chunk_buf->data, clm->data + cumulative_len, chunk_len); -+ memcpy(chunk_buf->data, data + cumulative_len, chunk_len); - -- err = brcmf_c_download(ifp, dl_flag, chunk_buf, chunk_len); -+ err = brcmf_c_download(ifp, dl_flag, chunk_buf, chunk_len, -+ loadvar); - - dl_flag &= ~DL_BEGIN; - -@@ -165,20 +157,64 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) - } while ((datalen > 0) && (err == 0)); - - if (err) { -- bphy_err(drvr, "clmload (%zu byte file) failed (%d)\n", -- clm->size, err); -- /* Retrieve clmload_status and print */ -- err = brcmf_fil_iovar_int_get(ifp, "clmload_status", &status); -+ bphy_err(drvr, "%s (%zu byte file) failed (%d)\n", -+ loadvar, size, err); -+ /* Retrieve status and print */ -+ err = brcmf_fil_iovar_int_get(ifp, statvar, &status); - if (err) -- bphy_err(drvr, "get clmload_status failed (%d)\n", err); -+ bphy_err(drvr, "get %s failed (%d)\n", statvar, err); - else -- brcmf_dbg(INFO, "clmload_status=%d\n", status); -+ brcmf_dbg(INFO, "%s=%d\n", statvar, status); - err = -EIO; - } - - kfree(chunk_buf); --done: -- release_firmware(clm); -+ return err; -+} -+ -+static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) -+{ -+ struct brcmf_pub *drvr = ifp->drvr; -+ struct brcmf_bus *bus = drvr->bus_if; -+ const struct firmware *fw = NULL; -+ s32 err; -+ -+ brcmf_dbg(TRACE, "Enter\n"); -+ -+ err = brcmf_bus_get_blob(bus, &fw, BRCMF_BLOB_CLM); -+ if (err || !fw) { -+ brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n", -+ err); -+ return 0; -+ } -+ -+ err = brcmf_c_download_blob(ifp, fw->data, fw->size, -+ "clmload", "clmload_status"); -+ -+ release_firmware(fw); -+ return err; -+} -+ -+static int brcmf_c_process_txcap_blob(struct brcmf_if *ifp) -+{ -+ struct brcmf_pub *drvr = ifp->drvr; -+ struct brcmf_bus *bus = drvr->bus_if; -+ const struct firmware *fw = NULL; -+ s32 err; -+ -+ brcmf_dbg(TRACE, "Enter\n"); -+ -+ err = brcmf_bus_get_blob(bus, &fw, BRCMF_BLOB_TXCAP); -+ if (err || !fw) { -+ brcmf_info("no txcap_blob available (err=%d)\n", err); -+ return 0; -+ } -+ -+ brcmf_info("TxCap blob found, loading\n"); -+ err = brcmf_c_download_blob(ifp, fw->data, fw->size, -+ "txcapload", "txcapload_status"); -+ -+ release_firmware(fw); - return err; - } - -@@ -259,6 +295,13 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) - goto done; - } - -+ /* Do TxCap downloading, if needed */ -+ err = brcmf_c_process_txcap_blob(ifp); -+ if (err < 0) { -+ bphy_err(drvr, "download TxCap blob file failed, %d\n", err); -+ goto done; -+ } -+ - /* query for 'ver' to get version info from firmware */ - memset(buf, 0, sizeof(buf)); - err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf)); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0111-brcmfmac-pcie-Load-and-provide-TxCap-blobs.patch b/target/linux/silicon/patches-5.19/0111-brcmfmac-pcie-Load-and-provide-TxCap-blobs.patch deleted file mode 100644 index 3c3933974..000000000 --- a/target/linux/silicon/patches-5.19/0111-brcmfmac-pcie-Load-and-provide-TxCap-blobs.patch +++ /dev/null @@ -1,92 +0,0 @@ -From ab6af8c73a7d8ef3402a2d9cbccaecd707c52491 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 26 Dec 2021 00:26:10 +0900 -Subject: [PATCH 111/171] brcmfmac: pcie: Load and provide TxCap blobs - -These blobs are named .txcap_blob, and exist alongside the existing -.clm_blob files. Use the existing firmware machinery to provide them to -the core. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 13 +++++++++++++ - 1 file changed, 13 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 3597571039a9..da24915d3555 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -73,6 +73,7 @@ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.txt"); - /* per-board firmware binaries */ - MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.bin"); - MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.clm_blob"); -+MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH "brcmfmac*-pcie.*.txcap_blob"); - - static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602), -@@ -325,7 +326,9 @@ struct brcmf_pciedev_info { - char fw_name[BRCMF_FW_NAME_LEN]; - char nvram_name[BRCMF_FW_NAME_LEN]; - char clm_name[BRCMF_FW_NAME_LEN]; -+ char txcap_name[BRCMF_FW_NAME_LEN]; - const struct firmware *clm_fw; -+ const struct firmware *txcap_fw; - const struct brcmf_pcie_reginfo *reginfo; - void __iomem *regs; - void __iomem *tcm; -@@ -1499,6 +1502,10 @@ static int brcmf_pcie_get_blob(struct device *dev, const struct firmware **fw, - *fw = devinfo->clm_fw; - devinfo->clm_fw = NULL; - break; -+ case BRCMF_BLOB_TXCAP: -+ *fw = devinfo->txcap_fw; -+ devinfo->txcap_fw = NULL; -+ break; - default: - return -ENOENT; - } -@@ -2087,6 +2094,7 @@ static int brcmf_pcie_read_otp(struct brcmf_pciedev_info *devinfo) - #define BRCMF_PCIE_FW_CODE 0 - #define BRCMF_PCIE_FW_NVRAM 1 - #define BRCMF_PCIE_FW_CLM 2 -+#define BRCMF_PCIE_FW_TXCAP 3 - - static void brcmf_pcie_setup(struct device *dev, int ret, - struct brcmf_fw_request *fwreq) -@@ -2112,6 +2120,7 @@ static void brcmf_pcie_setup(struct device *dev, int ret, - nvram = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.data; - nvram_len = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.len; - devinfo->clm_fw = fwreq->items[BRCMF_PCIE_FW_CLM].binary; -+ devinfo->txcap_fw = fwreq->items[BRCMF_PCIE_FW_TXCAP].binary; - kfree(fwreq); - - ret = brcmf_chip_get_raminfo(devinfo->ci); -@@ -2188,6 +2197,7 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) - { ".bin", devinfo->fw_name }, - { ".txt", devinfo->nvram_name }, - { ".clm_blob", devinfo->clm_name }, -+ { ".txcap_blob", devinfo->txcap_name }, - }; - - fwreq = brcmf_fw_alloc_request(devinfo->ci->chip, devinfo->ci->chiprev, -@@ -2202,6 +2212,8 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo) - fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL; - fwreq->items[BRCMF_PCIE_FW_CLM].type = BRCMF_FW_TYPE_BINARY; - fwreq->items[BRCMF_PCIE_FW_CLM].flags = BRCMF_FW_REQF_OPTIONAL; -+ fwreq->items[BRCMF_PCIE_FW_TXCAP].type = BRCMF_FW_TYPE_BINARY; -+ fwreq->items[BRCMF_PCIE_FW_TXCAP].flags = BRCMF_FW_REQF_OPTIONAL; - /* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */ - fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1; - fwreq->bus_nr = devinfo->pdev->bus->number; -@@ -2394,6 +2406,7 @@ brcmf_pcie_remove(struct pci_dev *pdev) - brcmf_pcie_reset_device(devinfo); - brcmf_pcie_release_resource(devinfo); - release_firmware(devinfo->clm_fw); -+ release_firmware(devinfo->txcap_fw); - - if (devinfo->ci) - brcmf_chip_detach(devinfo->ci); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0112-brcmfmac-common-Add-support-for-external-calibration.patch b/target/linux/silicon/patches-5.19/0112-brcmfmac-common-Add-support-for-external-calibration.patch deleted file mode 100644 index 3b229170c..000000000 --- a/target/linux/silicon/patches-5.19/0112-brcmfmac-common-Add-support-for-external-calibration.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 16db59b33f07783e609897e51a686d3c10e3a4c1 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 26 Dec 2021 00:53:37 +0900 -Subject: [PATCH 112/171] brcmfmac: common: Add support for external - calibration blobs - -The calibration blob for a chip is normally stored in SROM and loaded -internally by the firmware. However, Apple ARM64 platforms instead store -it as part of platform configuration data, and provide it via the Apple -Device Tree. We forward this into the Linux DT in the bootloader. - -Add support for taking this blob from the DT and loading it into the -dongle. The loading mechanism is the same as used for the CLM and TxCap -blobs. - -Reviewed-by: Linus Walleij -Signed-off-by: Hector Martin ---- - .../broadcom/brcm80211/brcmfmac/common.c | 24 +++++++++++++++++++ - .../broadcom/brcm80211/brcmfmac/common.h | 2 ++ - .../wireless/broadcom/brcm80211/brcmfmac/of.c | 7 ++++++ - 3 files changed, 33 insertions(+) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -index d36aeca5c74e..280ca0f1ba18 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -@@ -218,6 +218,23 @@ static int brcmf_c_process_txcap_blob(struct brcmf_if *ifp) - return err; - } - -+static int brcmf_c_process_cal_blob(struct brcmf_if *ifp) -+{ -+ struct brcmf_pub *drvr = ifp->drvr; -+ struct brcmf_mp_device *settings = drvr->settings; -+ s32 err; -+ -+ brcmf_dbg(TRACE, "Enter\n"); -+ -+ if (!settings->cal_blob || !settings->cal_size) -+ return 0; -+ -+ brcmf_info("Calibration blob provided by platform, loading\n"); -+ err = brcmf_c_download_blob(ifp, settings->cal_blob, settings->cal_size, -+ "calload", "calload_status"); -+ return err; -+} -+ - int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) - { - struct brcmf_pub *drvr = ifp->drvr; -@@ -302,6 +319,13 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) - goto done; - } - -+ /* Download external calibration blob, if available */ -+ err = brcmf_c_process_cal_blob(ifp); -+ if (err < 0) { -+ bphy_err(drvr, "download calibration blob file failed, %d\n", err); -+ goto done; -+ } -+ - /* query for 'ver' to get version info from firmware */ - memset(buf, 0, sizeof(buf)); - err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf)); -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h -index 960b1042a7c2..39e8abcf0522 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h -@@ -52,6 +52,8 @@ struct brcmf_mp_device { - const char *board_type; - unsigned char mac[ETH_ALEN]; - const char *antenna_sku; -+ const void *cal_blob; -+ int cal_size; - union { - struct brcmfmac_sdio_pd sdio; - } bus; -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c -index 644cc48eae40..60a97277d798 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c -@@ -79,6 +79,13 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type, - if (!of_property_read_string(np, "apple,antenna-sku", &prop)) - settings->antenna_sku = prop; - -+ /* The WLAN calibration blob is normally stored in SROM, but Apple -+ * ARM64 platforms pass it via the DT instead. -+ */ -+ prop = of_get_property(np, "brcm,cal-blob", &settings->cal_size); -+ if (prop && settings->cal_size) -+ settings->cal_blob = prop; -+ - /* Set board-type to the first string of the machine compatible prop */ - root = of_find_node_by_path("/"); - if (root && !settings->board_type) { --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0113-brcmfmac-pcie-Add-BCM4378B3-support.patch b/target/linux/silicon/patches-5.19/0113-brcmfmac-pcie-Add-BCM4378B3-support.patch deleted file mode 100644 index 6ce194daf..000000000 --- a/target/linux/silicon/patches-5.19/0113-brcmfmac-pcie-Add-BCM4378B3-support.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 6d48b52b1d74f5a14d7a99e4007810b2fb04d3bb Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 1 Jul 2022 23:51:23 +0900 -Subject: [PATCH 113/171] brcmfmac: pcie: Add BCM4378B3 support - -BCM4378B3 is a new silicon revision of BCM4378 present on the Apple M2 -13" MacBook Pro "kyushu". Its PCI revision number is 5. - -Signed-off-by: Hector Martin ---- - drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index da24915d3555..d26a412c9ca3 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -@@ -64,6 +64,7 @@ BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie"); - BRCMF_FW_DEF(4371, "brcmfmac4371-pcie"); - BRCMF_FW_CLM_DEF(4377B3, "brcmfmac4377b3-pcie"); - BRCMF_FW_CLM_DEF(4378B1, "brcmfmac4378b1-pcie"); -+BRCMF_FW_CLM_DEF(4378B3, "brcmfmac4378b3-pcie"); - BRCMF_FW_CLM_DEF(4387C2, "brcmfmac4387c2-pcie"); - - /* firmware config files */ -@@ -98,7 +99,8 @@ static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { - BRCMF_FW_ENTRY(BRCM_CC_43666_CHIP_ID, 0xFFFFFFF0, 4366C), - BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371), - BRCMF_FW_ENTRY(BRCM_CC_4377_CHIP_ID, 0xFFFFFFFF, 4377B3), /* 4 */ -- BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFFF, 4378B1), /* 3 */ -+ BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0x0000000F, 4378B1), /* 3 */ -+ BRCMF_FW_ENTRY(BRCM_CC_4378_CHIP_ID, 0xFFFFFFE0, 4378B3), /* 5 */ - BRCMF_FW_ENTRY(BRCM_CC_4387_CHIP_ID, 0xFFFFFFFF, 4387C2), /* 7 */ - }; - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0114-spi-dt-bindings-add-CS-delay-peripheral-specific-pro.patch b/target/linux/silicon/patches-5.19/0114-spi-dt-bindings-add-CS-delay-peripheral-specific-pro.patch deleted file mode 100644 index c1e46494b..000000000 --- a/target/linux/silicon/patches-5.19/0114-spi-dt-bindings-add-CS-delay-peripheral-specific-pro.patch +++ /dev/null @@ -1,40 +0,0 @@ -From c95842f5056635608ee0faed77884edb0ac4d5a9 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Sat, 11 Dec 2021 11:48:56 +0100 -Subject: [PATCH 114/171] spi: dt-bindings: add CS delay peripheral-specific - properties - -These properties are modelled after Linux' struct spi_device cs_setup, -cs_hold and cs_inactive delay values. - -Signed-off-by: Janne Grunau ---- - .../bindings/spi/spi-peripheral-props.yaml | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/Documentation/devicetree/bindings/spi/spi-peripheral-props.yaml b/Documentation/devicetree/bindings/spi/spi-peripheral-props.yaml -index 5e32928c4fc3..e8e86e4e4596 100644 ---- a/Documentation/devicetree/bindings/spi/spi-peripheral-props.yaml -+++ b/Documentation/devicetree/bindings/spi/spi-peripheral-props.yaml -@@ -108,6 +108,18 @@ properties: - minItems: 2 - maxItems: 4 - -+ spi-cs-setup-delay-ns: -+ description: -+ Delay, in nanoseconds, after chip select is asserted. -+ -+ spi-cs-hold-delay-ns: -+ description: -+ Delay, in nanoseconds, before chip select is de-asserted. -+ -+ spi-cs-inactive-delay-ns: -+ description: -+ Delay, in nanoseconds, after chip select is de-asserted. -+ - # The controller specific properties go here. - allOf: - - $ref: cdns,qspi-nor-peripheral-props.yaml# --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0115-spi-parse-CS-delay-values-from-DT.patch b/target/linux/silicon/patches-5.19/0115-spi-parse-CS-delay-values-from-DT.patch deleted file mode 100644 index 4f1189e08..000000000 --- a/target/linux/silicon/patches-5.19/0115-spi-parse-CS-delay-values-from-DT.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 9bdcdedc55c469556ca5c21ae129bd3ec0b19762 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Sat, 11 Dec 2021 12:21:04 +0100 -Subject: [PATCH 115/171] spi: parse CS delay values from DT - -Signed-off-by: Janne Grunau ---- - drivers/spi/spi.c | 21 +++++++++++++++++++++ - 1 file changed, 21 insertions(+) - -diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c -index ea09d1b42bf6..c8342b950783 100644 ---- a/drivers/spi/spi.c -+++ b/drivers/spi/spi.c -@@ -2059,6 +2059,22 @@ void spi_flush_queue(struct spi_controller *ctlr) - /*-------------------------------------------------------------------------*/ - - #if defined(CONFIG_OF) -+static void of_spi_parse_dt_cs_delay(struct device_node *nc, -+ struct spi_delay *delay, const char *prop) -+{ -+ u32 value; -+ -+ if (!of_property_read_u32(nc, prop, &value)) { -+ if (value > U16_MAX) { -+ delay->value = DIV_ROUND_UP(value, 1000); -+ delay->unit = SPI_DELAY_UNIT_USECS; -+ } else { -+ delay->value = value; -+ delay->unit = SPI_DELAY_UNIT_NSECS; -+ } -+ } -+} -+ - static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi, - struct device_node *nc) - { -@@ -2148,6 +2164,11 @@ static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi, - if (!of_property_read_u32(nc, "spi-max-frequency", &value)) - spi->max_speed_hz = value; - -+ /* Device CS delays */ -+ of_spi_parse_dt_cs_delay(nc, &spi->cs_setup, "spi-cs-setup-delay-ns"); -+ of_spi_parse_dt_cs_delay(nc, &spi->cs_hold, "spi-cs-hold-delay-ns"); -+ of_spi_parse_dt_cs_delay(nc, &spi->cs_inactive, "spi-cs-inactive-delay-ns"); -+ - return 0; - } - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0116-HID-add-device-IDs-for-Apple-SPI-HID-devices.patch b/target/linux/silicon/patches-5.19/0116-HID-add-device-IDs-for-Apple-SPI-HID-devices.patch deleted file mode 100644 index 5dff7ddc2..000000000 --- a/target/linux/silicon/patches-5.19/0116-HID-add-device-IDs-for-Apple-SPI-HID-devices.patch +++ /dev/null @@ -1,84 +0,0 @@ -From 2f160927c7f5de32ea8fe86c682565cacccdbaa4 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Sun, 12 Dec 2021 20:40:04 +0100 -Subject: [PATCH 116/171] HID: add device IDs for Apple SPI HID devices - -Apple Silicon based laptop use SPI as transport for HID. Add support for -SPI-based HID devices and and Apple keyboard and trackpad devices. -Intel based laptops using the keyboard input driver applespi use the -same HID over SPI protocol and can be supported later. - -This requires SPI keyboard/mouse HID types since Apple's intenal -keyboards/trackpads use the same product id. - -Signed-off-by: Janne Grunau ---- - drivers/hid/hid-core.c | 3 +++ - drivers/hid/hid-ids.h | 5 +++++ - include/linux/hid.h | 6 +++++- - 3 files changed, 13 insertions(+), 1 deletion(-) - -diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c -index 00154a1cd2d8..22f313716a12 100644 ---- a/drivers/hid/hid-core.c -+++ b/drivers/hid/hid-core.c -@@ -2219,6 +2219,9 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask) - case BUS_I2C: - bus = "I2C"; - break; -+ case BUS_SPI: -+ bus = "SPI"; -+ break; - case BUS_VIRTUAL: - bus = "VIRTUAL"; - break; -diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h -index d9eb676abe96..98f922774df9 100644 ---- a/drivers/hid/hid-ids.h -+++ b/drivers/hid/hid-ids.h -@@ -89,6 +89,7 @@ - - #define USB_VENDOR_ID_APPLE 0x05ac - #define BT_VENDOR_ID_APPLE 0x004c -+#define SPI_VENDOR_ID_APPLE 0x05ac - #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 - #define USB_DEVICE_ID_APPLE_MAGICMOUSE 0x030d - #define USB_DEVICE_ID_APPLE_MAGICMOUSE2 0x0269 -@@ -185,6 +186,10 @@ - #define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_2021 0x029c - #define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_FINGERPRINT_2021 0x029a - #define USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021 0x029f -+#define SPI_DEVICE_ID_APPLE_MACBOOK_AIR_2020 0x0281 -+#define SPI_DEVICE_ID_APPLE_MACBOOK_PRO13_2020 0x0341 -+#define SPI_DEVICE_ID_APPLE_MACBOOK_PRO14_2021 0x0342 -+#define SPI_DEVICE_ID_APPLE_MACBOOK_PRO16_2021 0x0343 - - #define USB_VENDOR_ID_ASUS 0x0486 - #define USB_DEVICE_ID_ASUS_T91MT 0x0185 -diff --git a/include/linux/hid.h b/include/linux/hid.h -index 4363a63b9775..dacfc4c7ce01 100644 ---- a/include/linux/hid.h -+++ b/include/linux/hid.h -@@ -569,7 +569,9 @@ struct hid_input { - enum hid_type { - HID_TYPE_OTHER = 0, - HID_TYPE_USBMOUSE, -- HID_TYPE_USBNONE -+ HID_TYPE_USBNONE, -+ HID_TYPE_SPI_KEYBOARD, -+ HID_TYPE_SPI_MOUSE, - }; - - enum hid_battery_status { -@@ -715,6 +717,8 @@ struct hid_descriptor { - .bus = BUS_BLUETOOTH, .vendor = (ven), .product = (prod) - #define HID_I2C_DEVICE(ven, prod) \ - .bus = BUS_I2C, .vendor = (ven), .product = (prod) -+#define HID_SPI_DEVICE(ven, prod) \ -+ .bus = BUS_SPI, .vendor = (ven), .product = (prod) - - #define HID_REPORT_ID(rep) \ - .report_type = (rep) --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0117-HID-apple-add-support-for-internal-keyboards.patch b/target/linux/silicon/patches-5.19/0117-HID-apple-add-support-for-internal-keyboards.patch deleted file mode 100644 index 9f1fa0bc5..000000000 --- a/target/linux/silicon/patches-5.19/0117-HID-apple-add-support-for-internal-keyboards.patch +++ /dev/null @@ -1,68 +0,0 @@ -From f0822fe21629ff17bacc0bc48a89bc956d6343a5 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Thu, 16 Dec 2021 21:15:31 +0100 -Subject: [PATCH 117/171] HID: apple: add support for internal keyboards - -Apple MacBook keyboards started using HID over SPI in 2015. With the -addition of the SPI HID transport they can be supported by this driver. -Support all product ids over with the Apple SPI vendor id for now. -Individual product ids will have to be added for a correct Fn/function -key mapping. - -Enable by default on the Apple Arm platform. - -Signed-off-by: Janne Grunau ---- - drivers/hid/Kconfig | 4 ++-- - drivers/hid/hid-apple.c | 6 ++++++ - 2 files changed, 8 insertions(+), 2 deletions(-) - -diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig -index 70da5931082f..77c3c00c877c 100644 ---- a/drivers/hid/Kconfig -+++ b/drivers/hid/Kconfig -@@ -130,7 +130,7 @@ config HID_APPLE - depends on HID - depends on LEDS_CLASS - depends on NEW_LEDS -- default !EXPERT -+ default !EXPERT || SPI_HID_APPLE - help - Support for some Apple devices which less or more break - HID specification. -@@ -1041,7 +1041,7 @@ config HID_SONY - * Guitar Hero PS3 and PC guitar dongles - - config SONY_FF -- bool "Sony PS2/3/4 accessories force feedback support" -+ bool "Sony PS2/3/4 accessories force feedback support" - depends on HID_SONY - select INPUT_FF_MEMLESS - help -diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c -index 42a568902f49..a085ea01d5b9 100644 ---- a/drivers/hid/hid-apple.c -+++ b/drivers/hid/hid-apple.c -@@ -783,6 +783,10 @@ static int apple_probe(struct hid_device *hdev, - struct apple_sc *asc; - int ret; - -+ if (id->bus == BUS_SPI && id->vendor == SPI_VENDOR_ID_APPLE && -+ hdev->type != HID_TYPE_SPI_KEYBOARD) -+ return -ENODEV; -+ - asc = devm_kzalloc(&hdev->dev, sizeof(*asc), GFP_KERNEL); - if (asc == NULL) { - hid_err(hdev, "can't alloc apple descriptor\n"); -@@ -1024,6 +1028,8 @@ static const struct hid_device_id apple_devices[] = { - .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK | APPLE_RDESC_BATTERY }, - { HID_BLUETOOTH_DEVICE(BT_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGIC_KEYBOARD_NUMPAD_2021), - .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, -+ { HID_SPI_DEVICE(SPI_VENDOR_ID_APPLE, HID_ANY_ID), -+ .driver_data = APPLE_HAS_FN }, - - { } - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0118-HID-apple-add-Fn-key-mapping-for-Apple-silicon-MacBo.patch b/target/linux/silicon/patches-5.19/0118-HID-apple-add-Fn-key-mapping-for-Apple-silicon-MacBo.patch deleted file mode 100644 index 54d0b45cf..000000000 --- a/target/linux/silicon/patches-5.19/0118-HID-apple-add-Fn-key-mapping-for-Apple-silicon-MacBo.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 2774e7333992ed45f44c7e190863b60a49876663 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Sun, 19 Dec 2021 18:08:15 +0100 -Subject: [PATCH 118/171] HID: apple: add Fn key mapping for Apple silicon - MacBooks - -Signed-off-by: Janne Grunau ---- - drivers/hid/hid-apple.c | 25 +++++++++++++++++++++++++ - 1 file changed, 25 insertions(+) - -diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c -index a085ea01d5b9..1511a2bda01f 100644 ---- a/drivers/hid/hid-apple.c -+++ b/drivers/hid/hid-apple.c -@@ -252,6 +252,28 @@ static const struct apple_key_translation apple_fn_keys[] = { - { } - }; - -+static const struct apple_key_translation apple_fn_keys_spi[] = { -+ { KEY_BACKSPACE, KEY_DELETE }, -+ { KEY_ENTER, KEY_INSERT }, -+ { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, -+ { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY }, -+ { KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY }, -+ { KEY_F4, KEY_SEARCH, APPLE_FLAG_FKEY }, -+ { KEY_F5, KEY_RECORD, APPLE_FLAG_FKEY }, -+ { KEY_F6, KEY_SLEEP, APPLE_FLAG_FKEY }, -+ { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY }, -+ { KEY_F8, KEY_PLAYPAUSE, APPLE_FLAG_FKEY }, -+ { KEY_F9, KEY_NEXTSONG, APPLE_FLAG_FKEY }, -+ { KEY_F10, KEY_MUTE, APPLE_FLAG_FKEY }, -+ { KEY_F11, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY }, -+ { KEY_F12, KEY_VOLUMEUP, APPLE_FLAG_FKEY }, -+ { KEY_UP, KEY_PAGEUP }, -+ { KEY_DOWN, KEY_PAGEDOWN }, -+ { KEY_LEFT, KEY_HOME }, -+ { KEY_RIGHT, KEY_END }, -+ { } -+}; -+ - static const struct apple_key_translation powerbook_fn_keys[] = { - { KEY_BACKSPACE, KEY_DELETE }, - { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, -@@ -400,6 +422,8 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, - else if (hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI && - hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) - table = macbookair_fn_keys; -+ else if (hid->vendor == SPI_VENDOR_ID_APPLE) -+ table = apple_fn_keys_spi; - else if (hid->product < 0x21d || hid->product >= 0x300) - table = powerbook_fn_keys; - else -@@ -607,6 +631,7 @@ static void apple_setup_input(struct input_dev *input) - - /* Enable all needed keys */ - apple_setup_key_translation(input, apple_fn_keys); -+ apple_setup_key_translation(input, apple_fn_keys_spi); - apple_setup_key_translation(input, powerbook_fn_keys); - apple_setup_key_translation(input, powerbook_numlock_keys); - apple_setup_key_translation(input, apple_iso_keyboard); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0119-HID-apple-add-Fn-key-mapping-for-Macbook-Pro-with-to.patch b/target/linux/silicon/patches-5.19/0119-HID-apple-add-Fn-key-mapping-for-Macbook-Pro-with-to.patch deleted file mode 100644 index 66264c7dd..000000000 --- a/target/linux/silicon/patches-5.19/0119-HID-apple-add-Fn-key-mapping-for-Macbook-Pro-with-to.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 45ee3be14adf625c8ee187485e8e24587e467f16 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Wed, 5 Jan 2022 23:27:34 +0100 -Subject: [PATCH 119/171] HID: apple: add Fn key mapping for Macbook Pro with - touchbar - -Signed-off-by: Janne Grunau ---- - drivers/hid/hid-apple.c | 26 ++++++++++++++++++++++++++ - 1 file changed, 26 insertions(+) - -diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c -index 1511a2bda01f..6700cbac2575 100644 ---- a/drivers/hid/hid-apple.c -+++ b/drivers/hid/hid-apple.c -@@ -274,6 +274,28 @@ static const struct apple_key_translation apple_fn_keys_spi[] = { - { } - }; - -+static const struct apple_key_translation apple_fn_keys_mbp13[] = { -+ { KEY_BACKSPACE, KEY_DELETE }, -+ { KEY_ENTER, KEY_INSERT }, -+ { KEY_UP, KEY_PAGEUP }, -+ { KEY_DOWN, KEY_PAGEDOWN }, -+ { KEY_LEFT, KEY_HOME }, -+ { KEY_RIGHT, KEY_END }, -+ { KEY_1, KEY_F1 }, -+ { KEY_2, KEY_F2 }, -+ { KEY_3, KEY_F3 }, -+ { KEY_4, KEY_F4 }, -+ { KEY_5, KEY_F5 }, -+ { KEY_6, KEY_F6 }, -+ { KEY_7, KEY_F7 }, -+ { KEY_8, KEY_F8 }, -+ { KEY_9, KEY_F9 }, -+ { KEY_0, KEY_F10 }, -+ { KEY_MINUS, KEY_F11 }, -+ { KEY_EQUAL, KEY_F12 }, -+ { } -+}; -+ - static const struct apple_key_translation powerbook_fn_keys[] = { - { KEY_BACKSPACE, KEY_DELETE }, - { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY }, -@@ -422,6 +444,9 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, - else if (hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI && - hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) - table = macbookair_fn_keys; -+ else if (hid->vendor == SPI_VENDOR_ID_APPLE && -+ hid->product == SPI_DEVICE_ID_APPLE_MACBOOK_PRO13_2020) -+ table = apple_fn_keys_mbp13; - else if (hid->vendor == SPI_VENDOR_ID_APPLE) - table = apple_fn_keys_spi; - else if (hid->product < 0x21d || hid->product >= 0x300) -@@ -632,6 +657,7 @@ static void apple_setup_input(struct input_dev *input) - /* Enable all needed keys */ - apple_setup_key_translation(input, apple_fn_keys); - apple_setup_key_translation(input, apple_fn_keys_spi); -+ apple_setup_key_translation(input, apple_fn_keys_mbp13); - apple_setup_key_translation(input, powerbook_fn_keys); - apple_setup_key_translation(input, powerbook_numlock_keys); - apple_setup_key_translation(input, apple_iso_keyboard); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0120-HID-magicmouse-use-a-define-of-the-max-number-of-tou.patch b/target/linux/silicon/patches-5.19/0120-HID-magicmouse-use-a-define-of-the-max-number-of-tou.patch deleted file mode 100644 index 2469c6d35..000000000 --- a/target/linux/silicon/patches-5.19/0120-HID-magicmouse-use-a-define-of-the-max-number-of-tou.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 868d1a8a613bcae69bcbde7b42ced0ff97110d09 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Thu, 16 Dec 2021 00:10:51 +0100 -Subject: [PATCH 120/171] HID: magicmouse: use a define of the max number of - touch contacts - -Signed-off-by: Janne Grunau ---- - drivers/hid/hid-magicmouse.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - -diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c -index 664a624a363d..f4192e503b2c 100644 ---- a/drivers/hid/hid-magicmouse.c -+++ b/drivers/hid/hid-magicmouse.c -@@ -61,6 +61,8 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie - #define DOUBLE_REPORT_ID 0xf7 - #define USB_BATTERY_TIMEOUT_MS 60000 - -+#define MAX_CONTACTS 16 -+ - /* These definitions are not precise, but they're close enough. (Bits - * 0x03 seem to indicate the aspect ratio of the touch, bits 0x70 seem - * to be some kind of bit mask -- 0x20 may be a near-field reading, -@@ -139,8 +141,8 @@ struct magicmouse_sc { - u8 size; - bool scroll_x_active; - bool scroll_y_active; -- } touches[16]; -- int tracking_ids[16]; -+ } touches[MAX_CONTACTS]; -+ int tracking_ids[MAX_CONTACTS]; - - struct hid_device *hdev; - struct delayed_work work; -@@ -592,7 +594,7 @@ static int magicmouse_setup_input(struct input_dev *input, struct hid_device *hd - - __set_bit(EV_ABS, input->evbit); - -- error = input_mt_init_slots(input, 16, mt_flags); -+ error = input_mt_init_slots(input, MAX_CONTACTS, mt_flags); - if (error) - return error; - input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 255 << 2, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0121-HID-magicmouse-use-struct-input_mt_pos-for-X-Y.patch b/target/linux/silicon/patches-5.19/0121-HID-magicmouse-use-struct-input_mt_pos-for-X-Y.patch deleted file mode 100644 index 3e5a60348..000000000 --- a/target/linux/silicon/patches-5.19/0121-HID-magicmouse-use-struct-input_mt_pos-for-X-Y.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 40b569fd3e7dc56dc7c32a0d86dd8675764a784e Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Thu, 16 Dec 2021 00:12:35 +0100 -Subject: [PATCH 121/171] HID: magicmouse: use struct input_mt_pos for X/Y - -Signed-off-by: Janne Grunau ---- - drivers/hid/hid-magicmouse.c | 9 ++++----- - 1 file changed, 4 insertions(+), 5 deletions(-) - -diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c -index f4192e503b2c..a02bdddb64b2 100644 ---- a/drivers/hid/hid-magicmouse.c -+++ b/drivers/hid/hid-magicmouse.c -@@ -131,9 +131,8 @@ struct magicmouse_sc { - int scroll_accel; - unsigned long scroll_jiffies; - -+ struct input_mt_pos pos[MAX_CONTACTS]; - struct { -- short x; -- short y; - short scroll_x; - short scroll_y; - short scroll_x_hr; -@@ -190,7 +189,7 @@ static void magicmouse_emit_buttons(struct magicmouse_sc *msc, int state) - } else if (last_state != 0) { - state = last_state; - } else if ((id = magicmouse_firm_touch(msc)) >= 0) { -- int x = msc->touches[id].x; -+ int x = msc->pos[id].x; - if (x < middle_button_start) - state = 1; - else if (x > middle_button_stop) -@@ -251,8 +250,8 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda - - /* Store tracking ID and other fields. */ - msc->tracking_ids[raw_id] = id; -- msc->touches[id].x = x; -- msc->touches[id].y = y; -+ msc->pos[id].x = x; -+ msc->pos[id].y = y; - msc->touches[id].size = size; - - /* If requested, emulate a scroll wheel by detecting small --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0122-HID-magicmouse-use-ops-function-pointers-for-input-f.patch b/target/linux/silicon/patches-5.19/0122-HID-magicmouse-use-ops-function-pointers-for-input-f.patch deleted file mode 100644 index e4c43ef24..000000000 --- a/target/linux/silicon/patches-5.19/0122-HID-magicmouse-use-ops-function-pointers-for-input-f.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 808129b77c405db99bde9b78efd2e12204acbdf9 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Thu, 16 Dec 2021 00:15:30 +0100 -Subject: [PATCH 122/171] HID: magicmouse: use ops function pointers for input - functionality - -Will be used for supporting MacBook trackpads connected via SPI. - -Signed-off-by: Janne Grunau ---- - drivers/hid/hid-magicmouse.c | 31 ++++++++++++++++++++++++++++++- - 1 file changed, 30 insertions(+), 1 deletion(-) - -diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c -index a02bdddb64b2..734e97234890 100644 ---- a/drivers/hid/hid-magicmouse.c -+++ b/drivers/hid/hid-magicmouse.c -@@ -113,6 +113,13 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie - #define TRACKPAD2_RES_Y \ - ((TRACKPAD2_MAX_Y - TRACKPAD2_MIN_Y) / (TRACKPAD2_DIMENSION_Y / 100)) - -+ -+struct magicmouse_input_ops { -+ int (*raw_event)(struct hid_device *hdev, -+ struct hid_report *report, u8 *data, int size); -+ int (*setup_input)(struct input_dev *input, struct hid_device *hdev); -+}; -+ - /** - * struct magicmouse_sc - Tracks Magic Mouse-specific data. - * @input: Input device through which we report events. -@@ -146,6 +153,7 @@ struct magicmouse_sc { - struct hid_device *hdev; - struct delayed_work work; - struct timer_list battery_timer; -+ struct magicmouse_input_ops input_ops; - }; - - static int magicmouse_firm_touch(struct magicmouse_sc *msc) -@@ -375,6 +383,14 @@ static int magicmouse_raw_event(struct hid_device *hdev, - struct hid_report *report, u8 *data, int size) - { - struct magicmouse_sc *msc = hid_get_drvdata(hdev); -+ -+ return msc->input_ops.raw_event(hdev, report, data, size); -+} -+ -+static int magicmouse_raw_event_usb(struct hid_device *hdev, -+ struct hid_report *report, u8 *data, int size) -+{ -+ struct magicmouse_sc *msc = hid_get_drvdata(hdev); - struct input_dev *input = msc->input; - int x = 0, y = 0, ii, clicks = 0, npoints; - -@@ -520,7 +536,17 @@ static int magicmouse_event(struct hid_device *hdev, struct hid_field *field, - return 0; - } - --static int magicmouse_setup_input(struct input_dev *input, struct hid_device *hdev) -+ -+static int magicmouse_setup_input(struct input_dev *input, -+ struct hid_device *hdev) -+{ -+ struct magicmouse_sc *msc = hid_get_drvdata(hdev); -+ -+ return msc->input_ops.setup_input(input, hdev); -+} -+ -+static int magicmouse_setup_input_usb(struct input_dev *input, -+ struct hid_device *hdev) - { - int error; - int mt_flags = 0; -@@ -807,6 +833,9 @@ static int magicmouse_probe(struct hid_device *hdev, - return -ENOMEM; - } - -+ msc->input_ops.raw_event = magicmouse_raw_event_usb; -+ msc->input_ops.setup_input = magicmouse_setup_input_usb; -+ - msc->scroll_accel = SCROLL_ACCEL_DEFAULT; - msc->hdev = hdev; - INIT_DEFERRABLE_WORK(&msc->work, magicmouse_enable_mt_work); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0123-HID-magicmouse-add-support-for-Macbook-trackpads.patch b/target/linux/silicon/patches-5.19/0123-HID-magicmouse-add-support-for-Macbook-trackpads.patch deleted file mode 100644 index 1a9fe31ee..000000000 --- a/target/linux/silicon/patches-5.19/0123-HID-magicmouse-add-support-for-Macbook-trackpads.patch +++ /dev/null @@ -1,358 +0,0 @@ -From 89d8ef52b73399098877813502dc8320f7f07a69 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Thu, 16 Dec 2021 01:17:48 +0100 -Subject: [PATCH 123/171] HID: magicmouse: add support for Macbook trackpads - -The trackpads in Macbooks beginning in 2015 are HID devices connected -over SPI. On Intel Macbooks they are currently supported by applespi.c. -This chang adds support for the trackpads on Apple Silicon Macbooks -starting in late 2020. They use a new HID over SPI transport driver. -The touch report format differs from USB/BT Magic Trackpads. It is the -same format as the type 4 format supported by bcm5974.c. - -Signed-off-by: Janne Grunau ---- - drivers/hid/Kconfig | 4 +- - drivers/hid/hid-magicmouse.c | 259 ++++++++++++++++++++++++++++++++++- - 2 files changed, 260 insertions(+), 3 deletions(-) - -diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig -index 77c3c00c877c..abaf704d5a81 100644 ---- a/drivers/hid/Kconfig -+++ b/drivers/hid/Kconfig -@@ -676,11 +676,13 @@ config LOGIWHEELS_FF - config HID_MAGICMOUSE - tristate "Apple Magic Mouse/Trackpad multi-touch support" - depends on HID -+ default SPI_HID_APPLE - help - Support for the Apple Magic Mouse/Trackpad multi-touch. - - Say Y here if you want support for the multi-touch features of the -- Apple Wireless "Magic" Mouse and the Apple Wireless "Magic" Trackpad. -+ Apple Wireless "Magic" Mouse, the Apple Wireless "Magic" Trackpad and -+ fource touch Trackpads in Macbooks starting from 2015. - - config HID_MALTRON - tristate "Maltron L90 keyboard" -diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c -index 734e97234890..65c4b6307ce9 100644 ---- a/drivers/hid/hid-magicmouse.c -+++ b/drivers/hid/hid-magicmouse.c -@@ -113,6 +113,18 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie - #define TRACKPAD2_RES_Y \ - ((TRACKPAD2_MAX_Y - TRACKPAD2_MIN_Y) / (TRACKPAD2_DIMENSION_Y / 100)) - -+#define J314_TP_DIMENSION_X (float)13000 -+#define J314_TP_MIN_X -5900 -+#define J314_TP_MAX_X 6500 -+#define J314_TP_RES_X \ -+ ((J314_TP_MAX_X - J314_TP_MIN_X) / (J314_TP_DIMENSION_X / 100)) -+#define J314_TP_DIMENSION_Y (float)8100 -+#define J314_TP_MIN_Y -200 -+#define J314_TP_MAX_Y 7400 -+#define J314_TP_RES_Y \ -+ ((J314_TP_MAX_Y - J314_TP_MIN_Y) / (J314_TP_DIMENSION_Y / 100)) -+ -+#define J314_TP_MAX_FINGER_ORIENTATION 16384 - - struct magicmouse_input_ops { - int (*raw_event)(struct hid_device *hdev, -@@ -519,6 +531,157 @@ static int magicmouse_raw_event_usb(struct hid_device *hdev, - return 1; - } - -+/** -+ * struct tp_finger - single trackpad finger structure, le16-aligned -+ * -+ * @unknown1: unknown -+ * @unknown2: unknown -+ * @abs_x: absolute x coordinate -+ * @abs_y: absolute y coordinate -+ * @rel_x: relative x coordinate -+ * @rel_y: relative y coordinate -+ * @tool_major: tool area, major axis -+ * @tool_minor: tool area, minor axis -+ * @orientation: 16384 when point, else 15 bit angle -+ * @touch_major: touch area, major axis -+ * @touch_minor: touch area, minor axis -+ * @unused: zeros -+ * @pressure: pressure on forcetouch touchpad -+ * @multi: one finger: varies, more fingers: constant -+ * @crc16: on last finger: crc over the whole message struct -+ * (i.e. message header + this struct) minus the last -+ * @crc16 field; unknown on all other fingers. -+ */ -+struct tp_finger { -+ __le16 unknown1; -+ __le16 unknown2; -+ __le16 abs_x; -+ __le16 abs_y; -+ __le16 rel_x; -+ __le16 rel_y; -+ __le16 tool_major; -+ __le16 tool_minor; -+ __le16 orientation; -+ __le16 touch_major; -+ __le16 touch_minor; -+ __le16 unused[2]; -+ __le16 pressure; -+ __le16 multi; -+} __attribute__((packed, aligned(2))); -+ -+/** -+ * struct trackpad report -+ * -+ * @report_id: reportid -+ * @buttons: HID Usage Buttons 3 1-bit reports -+ * @num_fingers: the number of fingers being reported in @fingers -+ * @clicked: same as @buttons -+ */ -+struct tp_header { -+ // HID mouse report -+ u8 report_id; -+ u8 buttons; -+ u8 rel_x; -+ u8 rel_y; -+ u8 padding[4]; -+ // HID vendor part, up to 1751 bytes -+ u8 unknown[22]; -+ u8 num_fingers; -+ u8 clicked; -+ u8 unknown3[14]; -+}; -+ -+static inline int le16_to_int(__le16 x) -+{ -+ return (signed short)le16_to_cpu(x); -+} -+ -+static void report_finger_data(struct input_dev *input, int slot, -+ const struct input_mt_pos *pos, -+ const struct tp_finger *f) -+{ -+ input_mt_slot(input, slot); -+ input_mt_report_slot_state(input, MT_TOOL_FINGER, true); -+ -+ input_report_abs(input, ABS_MT_TOUCH_MAJOR, -+ le16_to_int(f->touch_major) << 1); -+ input_report_abs(input, ABS_MT_TOUCH_MINOR, -+ le16_to_int(f->touch_minor) << 1); -+ input_report_abs(input, ABS_MT_WIDTH_MAJOR, -+ le16_to_int(f->tool_major) << 1); -+ input_report_abs(input, ABS_MT_WIDTH_MINOR, -+ le16_to_int(f->tool_minor) << 1); -+ input_report_abs(input, ABS_MT_ORIENTATION, -+ J314_TP_MAX_FINGER_ORIENTATION - le16_to_int(f->orientation)); -+ input_report_abs(input, ABS_MT_PRESSURE, le16_to_int(f->pressure)); -+ input_report_abs(input, ABS_MT_POSITION_X, pos->x); -+ input_report_abs(input, ABS_MT_POSITION_Y, pos->y); -+} -+ -+static int magicmouse_raw_event_spi(struct hid_device *hdev, -+ struct hid_report *report, u8 *data, int size) -+{ -+ struct magicmouse_sc *msc = hid_get_drvdata(hdev); -+ struct input_dev *input = msc->input; -+ struct tp_header *tp_hdr; -+ struct tp_finger *f; -+ int i, n; -+ u32 npoints; -+ const size_t hdr_sz = sizeof(struct tp_header); -+ const size_t touch_sz = sizeof(struct tp_finger); -+ u8 map_contacs[MAX_CONTACTS]; -+ -+ // hid_warn(hdev, "%s\n", __func__); -+ // print_hex_dump_debug("appleft ev: ", DUMP_PREFIX_OFFSET, 16, 1, data, -+ // size, false); -+ -+ if (data[0] != TRACKPAD2_USB_REPORT_ID) -+ return 0; -+ -+ /* Expect 46 bytes of prefix, and N * 30 bytes of touch data. */ -+ if (size < hdr_sz || ((size - hdr_sz) % touch_sz) != 0) -+ return 0; -+ -+ tp_hdr = (struct tp_header *)data; -+ -+ npoints = (size - hdr_sz) / touch_sz; -+ if (npoints < tp_hdr->num_fingers || npoints > MAX_CONTACTS) { -+ hid_warn(hdev, -+ "unexpected number of touches (%u) for " -+ "report\n", -+ npoints); -+ return 0; -+ } -+ -+ n = 0; -+ for (i = 0; i < tp_hdr->num_fingers; i++) { -+ f = (struct tp_finger *)(data + hdr_sz + i * touch_sz); -+ if (le16_to_int(f->touch_major) == 0) -+ continue; -+ -+ hid_dbg(hdev, "ev x:%04hx y:%04hx\n", le16_to_int(f->abs_x), -+ le16_to_int(f->abs_y)); -+ msc->pos[n].x = le16_to_int(f->abs_x); -+ msc->pos[n].y = -le16_to_int(f->abs_y); -+ map_contacs[n] = i; -+ n++; -+ } -+ -+ input_mt_assign_slots(input, msc->tracking_ids, msc->pos, n, 0); -+ -+ for (i = 0; i < n; i++) { -+ int idx = map_contacs[i]; -+ f = (struct tp_finger *)(data + hdr_sz + idx * touch_sz); -+ report_finger_data(input, msc->tracking_ids[i], &msc->pos[i], f); -+ } -+ -+ input_mt_sync_frame(input); -+ input_report_key(input, BTN_MOUSE, data[1] & 1); -+ -+ input_sync(input); -+ return 1; -+} -+ - static int magicmouse_event(struct hid_device *hdev, struct hid_field *field, - struct hid_usage *usage, __s32 value) - { -@@ -698,6 +861,79 @@ static int magicmouse_setup_input_usb(struct input_dev *input, - return 0; - } - -+static int magicmouse_setup_input_spi(struct input_dev *input, -+ struct hid_device *hdev) -+{ -+ int error; -+ int mt_flags = 0; -+ -+ __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); -+ __clear_bit(BTN_0, input->keybit); -+ __clear_bit(BTN_RIGHT, input->keybit); -+ __clear_bit(BTN_MIDDLE, input->keybit); -+ __clear_bit(EV_REL, input->evbit); -+ __clear_bit(REL_X, input->relbit); -+ __clear_bit(REL_Y, input->relbit); -+ -+ mt_flags = INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED | INPUT_MT_TRACK; -+ -+ /* finger touch area */ -+ input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 5000, 0, 0); -+ input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0, 5000, 0, 0); -+ -+ /* finger approach area */ -+ input_set_abs_params(input, ABS_MT_WIDTH_MAJOR, 0, 5000, 0, 0); -+ input_set_abs_params(input, ABS_MT_WIDTH_MINOR, 0, 5000, 0, 0); -+ -+ /* Note: Touch Y position from the device is inverted relative -+ * to how pointer motion is reported (and relative to how USB -+ * HID recommends the coordinates work). This driver keeps -+ * the origin at the same position, and just uses the additive -+ * inverse of the reported Y. -+ */ -+ -+ input_set_abs_params(input, ABS_MT_PRESSURE, 0, 6000, 0, 0); -+ -+ /* -+ * This makes libinput recognize this as a PressurePad and -+ * stop trying to use pressure for touch size. Pressure unit -+ * seems to be ~grams on these touchpads. -+ */ -+ input_abs_set_res(input, ABS_MT_PRESSURE, 1); -+ -+ /* finger orientation */ -+ input_set_abs_params(input, ABS_MT_ORIENTATION, -J314_TP_MAX_FINGER_ORIENTATION, -+ J314_TP_MAX_FINGER_ORIENTATION, 0, 0); -+ -+ /* finger position */ -+ input_set_abs_params(input, ABS_MT_POSITION_X, J314_TP_MIN_X, J314_TP_MAX_X, -+ 0, 0); -+ /* Y axis is inverted */ -+ input_set_abs_params(input, ABS_MT_POSITION_Y, -J314_TP_MAX_Y, -J314_TP_MIN_Y, -+ 0, 0); -+ -+ /* X/Y resolution */ -+ input_abs_set_res(input, ABS_MT_POSITION_X, J314_TP_RES_X); -+ input_abs_set_res(input, ABS_MT_POSITION_Y, J314_TP_RES_Y); -+ -+ input_set_events_per_packet(input, 60); -+ -+ /* touchpad button */ -+ input_set_capability(input, EV_KEY, BTN_MOUSE); -+ -+ /* -+ * hid-input may mark device as using autorepeat, but the trackpad does -+ * not actually want it. -+ */ -+ __clear_bit(EV_REP, input->evbit); -+ -+ error = input_mt_init_slots(input, MAX_CONTACTS, mt_flags); -+ if (error) -+ return error; -+ -+ return 0; -+} -+ - static int magicmouse_input_mapping(struct hid_device *hdev, - struct hid_input *hi, struct hid_field *field, - struct hid_usage *usage, unsigned long **bit, int *max) -@@ -753,6 +989,9 @@ static int magicmouse_enable_multitouch(struct hid_device *hdev) - feature_size = sizeof(feature_mt_trackpad2_usb); - feature = feature_mt_trackpad2_usb; - } -+ } else if (hdev->vendor == SPI_VENDOR_ID_APPLE) { -+ feature_size = sizeof(feature_mt_trackpad2_usb); -+ feature = feature_mt_trackpad2_usb; - } else if (hdev->product == USB_DEVICE_ID_APPLE_MAGICMOUSE2) { - feature_size = sizeof(feature_mt_mouse2); - feature = feature_mt_mouse2; -@@ -827,14 +1066,26 @@ static int magicmouse_probe(struct hid_device *hdev, - struct hid_report *report; - int ret; - -+ if (id->bus == BUS_SPI && id->vendor == SPI_VENDOR_ID_APPLE && -+ hdev->type != HID_TYPE_SPI_MOUSE) -+ return -ENODEV; -+ - msc = devm_kzalloc(&hdev->dev, sizeof(*msc), GFP_KERNEL); - if (msc == NULL) { - hid_err(hdev, "can't alloc magicmouse descriptor\n"); - return -ENOMEM; - } - -- msc->input_ops.raw_event = magicmouse_raw_event_usb; -- msc->input_ops.setup_input = magicmouse_setup_input_usb; -+ // internal trackpad use a data format use input ops to avoid -+ // conflicts with the report ID. -+ if (id->vendor == SPI_VENDOR_ID_APPLE) { -+ msc->input_ops.raw_event = magicmouse_raw_event_spi; -+ msc->input_ops.setup_input = magicmouse_setup_input_spi; -+ -+ } else { -+ msc->input_ops.raw_event = magicmouse_raw_event_usb; -+ msc->input_ops.setup_input = magicmouse_setup_input_usb; -+ } - - msc->scroll_accel = SCROLL_ACCEL_DEFAULT; - msc->hdev = hdev; -@@ -884,6 +1135,8 @@ static int magicmouse_probe(struct hid_device *hdev, - else /* USB_VENDOR_ID_APPLE */ - report = hid_register_report(hdev, HID_INPUT_REPORT, - TRACKPAD2_USB_REPORT_ID, 0); -+ } else if (id->vendor == SPI_VENDOR_ID_APPLE) { -+ report = hid_register_report(hdev, HID_INPUT_REPORT, 2, 0); - } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */ - report = hid_register_report(hdev, HID_INPUT_REPORT, - TRACKPAD_REPORT_ID, 0); -@@ -978,6 +1231,8 @@ static const struct hid_device_id magic_mice[] = { - USB_DEVICE_ID_APPLE_MAGICTRACKPAD2), .driver_data = 0 }, - { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, - USB_DEVICE_ID_APPLE_MAGICTRACKPAD2), .driver_data = 0 }, -+ { HID_SPI_DEVICE(SPI_VENDOR_ID_APPLE, HID_ANY_ID), -+ .driver_data = 0 }, - { } - }; - MODULE_DEVICE_TABLE(hid, magic_mice); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0124-WIP-HID-transport-spi-add-Apple-SPI-transport.patch b/target/linux/silicon/patches-5.19/0124-WIP-HID-transport-spi-add-Apple-SPI-transport.patch deleted file mode 100644 index 8b27364b7..000000000 --- a/target/linux/silicon/patches-5.19/0124-WIP-HID-transport-spi-add-Apple-SPI-transport.patch +++ /dev/null @@ -1,1323 +0,0 @@ -From 80d39405629267931171cbca14121b266e8d9152 Mon Sep 17 00:00:00 2001 -From: Janne Grunau -Date: Fri, 10 Dec 2021 19:38:43 +0100 -Subject: [PATCH 124/171] WIP: HID: transport: spi: add Apple SPI transport - -Keyboard and trackpad of Apple Sillicon SoCs (M1, M1 Pro/Max) laptops -are are HID devices connected via SPI. - -This is the same protocol as implemented by applespi.c. It was not -noticed that protocol is a transport for HID. Adding support for ACPI -based Intel MacBooks will be done in a separate commit. - -How HID is mapped in this protocol is not yet fully understood. - -Microsoft has a specification for HID over SPI [1] incompatible with the -transport protocol used by Apple. - -[1] https://docs.microsoft.com/en-us/windows-hardware/drivers/hid/hid-over-spi - -Signed-off-by: Janne Grunau ---- - drivers/hid/Kconfig | 2 + - drivers/hid/Makefile | 2 + - drivers/hid/spi-hid/Kconfig | 26 + - drivers/hid/spi-hid/Makefile | 10 + - drivers/hid/spi-hid/spi-hid-apple-core.c | 1029 ++++++++++++++++++++++ - drivers/hid/spi-hid/spi-hid-apple-of.c | 138 +++ - drivers/hid/spi-hid/spi-hid-apple.h | 31 + - 7 files changed, 1238 insertions(+) - create mode 100644 drivers/hid/spi-hid/Kconfig - create mode 100644 drivers/hid/spi-hid/Makefile - create mode 100644 drivers/hid/spi-hid/spi-hid-apple-core.c - create mode 100644 drivers/hid/spi-hid/spi-hid-apple-of.c - create mode 100644 drivers/hid/spi-hid/spi-hid-apple.h - -diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig -index abaf704d5a81..1dd6697e7c59 100644 ---- a/drivers/hid/Kconfig -+++ b/drivers/hid/Kconfig -@@ -1322,4 +1322,6 @@ source "drivers/hid/amd-sfh-hid/Kconfig" - - source "drivers/hid/surface-hid/Kconfig" - -+source "drivers/hid/spi-hid/Kconfig" -+ - endmenu -diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile -index cac2cbe26d11..a720e68fe1d7 100644 ---- a/drivers/hid/Makefile -+++ b/drivers/hid/Makefile -@@ -156,3 +156,5 @@ obj-$(INTEL_ISH_FIRMWARE_DOWNLOADER) += intel-ish-hid/ - obj-$(CONFIG_AMD_SFH_HID) += amd-sfh-hid/ - - obj-$(CONFIG_SURFACE_HID_CORE) += surface-hid/ -+ -+obj-$(CONFIG_SPI_HID_APPLE_CORE) += spi-hid/ -diff --git a/drivers/hid/spi-hid/Kconfig b/drivers/hid/spi-hid/Kconfig -new file mode 100644 -index 000000000000..8e37f0fec28a ---- /dev/null -+++ b/drivers/hid/spi-hid/Kconfig -@@ -0,0 +1,26 @@ -+# SPDX-License-Identifier: GPL-2.0-only -+menu "SPI HID support" -+ depends on SPI -+ -+config SPI_HID_APPLE_OF -+ tristate "HID over SPI transport layer for Apple Silicon SoCs" -+ default ARCH_APPLE -+ depends on SPI && INPUT && OF -+ help -+ Say Y here if you use Apple Silicon based laptop. The keyboard and -+ touchpad are HID based devices connected via SPI. -+ -+ If unsure, say N. -+ -+ This support is also available as a module. If so, the module -+ will be called spi-hid-apple-of. It will also build/depend on the -+ module spi-hid-apple. -+ -+endmenu -+ -+config SPI_HID_APPLE_CORE -+ tristate -+ default y if SPI_HID_APPLE_OF=y -+ default m if SPI_HID_APPLE_OF=m -+ select HID -+ select CRC16 -diff --git a/drivers/hid/spi-hid/Makefile b/drivers/hid/spi-hid/Makefile -new file mode 100644 -index 000000000000..f276ee12cb94 ---- /dev/null -+++ b/drivers/hid/spi-hid/Makefile -@@ -0,0 +1,10 @@ -+# SPDX-License-Identifier: GPL-2.0-only -+# -+# Makefile for SPI HID tarnsport drivers -+# -+ -+obj-$(CONFIG_SPI_HID_APPLE_CORE) += spi-hid-apple.o -+ -+spi-hid-apple-objs = spi-hid-apple-core.o -+ -+obj-$(CONFIG_SPI_HID_APPLE_OF) += spi-hid-apple-of.o -diff --git a/drivers/hid/spi-hid/spi-hid-apple-core.c b/drivers/hid/spi-hid/spi-hid-apple-core.c -new file mode 100644 -index 000000000000..56941430befa ---- /dev/null -+++ b/drivers/hid/spi-hid/spi-hid-apple-core.c -@@ -0,0 +1,1029 @@ -+/* -+ * SPDX-License-Identifier: GPL-2.0 -+ * -+ * Apple SPI HID transport driver -+ * -+ * Copyright (C) The Asahi Linux Contributors -+ * -+ * Based on: drivers/input/applespi.c -+ * -+ * MacBook (Pro) SPI keyboard and touchpad driver -+ * -+ * Copyright (c) 2015-2018 Federico Lorenzi -+ * Copyright (c) 2017-2018 Ronald Tschalär -+ * -+ */ -+ -+//#define DEBUG 2 -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "spi-hid-apple.h" -+ -+#define SPIHID_DEF_WAIT msecs_to_jiffies(100) -+ -+#define SPIHID_MAX_INPUT_REPORT_SIZE 0x800 -+ -+/* support only keyboard, trackpad and management dev for now */ -+#define SPIHID_MAX_DEVICES 3 -+ -+#define SPIHID_DEVICE_ID_MNGT 0x0 -+#define SPIHID_DEVICE_ID_KBD 0x1 -+#define SPIHID_DEVICE_ID_TP 0x2 -+#define SPIHID_DEVICE_ID_INFO 0xd0 -+ -+#define SPIHID_READ_PACKET 0x20 -+#define SPIHID_WRITE_PACKET 0x40 -+ -+#define SPIHID_DESC_MAX 512 -+ -+#define SPIHID_SET_LEDS 0x0151 /* caps lock */ -+ -+#define SPI_RW_CHG_DELAY_US 200 /* 'Inter Stage Us'? */ -+ -+static const u8 spi_hid_apple_booted[4] = { 0xa0, 0x80, 0x00, 0x00 }; -+static const u8 spi_hid_apple_status_ok[4] = { 0xac, 0x27, 0x68, 0xd5 }; -+ -+struct spihid_interface { -+ struct hid_device *hid; -+ u8 *hid_desc; -+ u32 hid_desc_len; -+ u32 id; -+ unsigned country; -+ u32 max_control_report_len; -+ u32 max_input_report_len; -+ u32 max_output_report_len; -+ u8 name[32]; -+ bool ready; -+}; -+ -+struct spihid_input_report { -+ u8 *buf; -+ u32 length; -+ u32 offset; -+ u8 device; -+ u8 flags; -+}; -+ -+struct spihid_apple { -+ struct spi_device *spidev; -+ -+ struct spihid_apple_ops *ops; -+ -+ struct spihid_interface mngt; -+ struct spihid_interface kbd; -+ struct spihid_interface tp; -+ -+ wait_queue_head_t wait; -+ struct mutex tx_lock; //< protects against concurrent SPI writes -+ -+ struct spi_message rx_msg; -+ struct spi_message tx_msg; -+ struct spi_transfer rx_transfer; -+ struct spi_transfer tx_transfer; -+ struct spi_transfer status_transfer; -+ -+ u8 *rx_buf; -+ u8 *tx_buf; -+ u8 *status_buf; -+ -+ u8 vendor[32]; -+ u8 product[64]; -+ u8 serial[32]; -+ -+ u32 num_devices; -+ -+ u32 vendor_id; -+ u32 product_id; -+ u32 version_number; -+ -+ u8 msg_id; -+ -+ /* fragmented HID report */ -+ struct spihid_input_report report; -+ -+ /* state tracking flags */ -+ bool status_booted; -+}; -+ -+/** -+ * struct spihid_msg_hdr - common header of protocol messages. -+ * -+ * Each message begins with fixed header, followed by a message-type specific -+ * payload, and ends with a 16-bit crc. Because of the varying lengths of the -+ * payload, the crc is defined at the end of each payload struct, rather than -+ * in this struct. -+ * -+ * @unknown0: request type? output, input (0x10), feature, protocol -+ * @unknown1: maybe report id? -+ * @unknown2: mostly zero, in info request maybe device num -+ * @msgid: incremented on each message, rolls over after 255; there is a -+ * separate counter for each message type. -+ * @rsplen: response length (the exact nature of this field is quite -+ * speculative). On a request/write this is often the same as -+ * @length, though in some cases it has been seen to be much larger -+ * (e.g. 0x400); on a response/read this the same as on the -+ * request; for reads that are not responses it is 0. -+ * @length: length of the remainder of the data in the whole message -+ * structure (after re-assembly in case of being split over -+ * multiple spi-packets), minus the trailing crc. The total size -+ * of a message is therefore @length + 10. -+ */ -+ -+struct spihid_msg_hdr { -+ u8 unknown0; -+ u8 unknown1; -+ u8 unknown2; -+ u8 id; -+ __le16 rsplen; -+ __le16 length; -+}; -+ -+/** -+ * struct spihid_transfer_packet - a complete spi packet; always 256 bytes. This carries -+ * the (parts of the) message in the data. But note that this does not -+ * necessarily contain a complete message, as in some cases (e.g. many -+ * fingers pressed) the message is split over multiple packets (see the -+ * @offset, @remain, and @length fields). In general the data parts in -+ * spihid_transfer_packet's are concatenated until @remaining is 0, and the -+ * result is an message. -+ * -+ * @flags: 0x40 = write (to device), 0x20 = read (from device); note that -+ * the response to a write still has 0x40. -+ * @device: 1 = keyboard, 2 = touchpad -+ * @offset: specifies the offset of this packet's data in the complete -+ * message; i.e. > 0 indicates this is a continuation packet (in -+ * the second packet for a message split over multiple packets -+ * this would then be the same as the @length in the first packet) -+ * @remain: number of message bytes remaining in subsequents packets (in -+ * the first packet of a message split over two packets this would -+ * then be the same as the @length in the second packet) -+ * @length: length of the valid data in the @data in this packet -+ * @data: all or part of a message -+ * @crc16: crc over this whole structure minus this @crc16 field. This -+ * covers just this packet, even on multi-packet messages (in -+ * contrast to the crc in the message). -+ */ -+struct spihid_transfer_packet { -+ u8 flags; -+ u8 device; -+ __le16 offset; -+ __le16 remain; -+ __le16 length; -+ u8 data[246]; -+ __le16 crc16; -+}; -+ -+/* -+ * how HID is mapped onto the protocol is not fully clear. This are the known -+ * reports/request: -+ * -+ * pkt.flags pkt.dev? msg.u0 msg.u1 msg.u2 -+ * info 0x40 0xd0 0x20 0x01 0xd0 -+ * -+ * info mngt: 0x40 0xd0 0x20 0x10 0x00 -+ * info kbd: 0x40 0xd0 0x20 0x10 0x01 -+ * info tp: 0x40 0xd0 0x20 0x10 0x02 -+ * -+ * desc kbd: 0x40 0xd0 0x20 0x10 0x01 -+ * desc trackpad: 0x40 0xd0 0x20 0x10 0x02 -+ * -+ * mt mode: 0x40 0x02 0x52 0x02 0x00 set protocol? -+ * capslock led 0x40 0x01 0x51 0x01 0x00 output report -+ * -+ * report kbd: 0x20 0x01 0x10 0x01 0x00 input report -+ * report tp: 0x20 0x02 0x10 0x02 0x00 input report -+ * -+ */ -+ -+ -+static int spihid_apple_request(struct spihid_apple *spihid, u8 target, u8 unk0, -+ u8 unk1, u8 unk2, u16 resp_len, u8 *buf, -+ size_t len) -+{ -+ struct spihid_transfer_packet *pkt; -+ struct spihid_msg_hdr *hdr; -+ u16 crc; -+ int err; -+ -+ /* know reports are small enoug to fit in a single packet */ -+ if (len > sizeof(pkt->data) - sizeof(*hdr) - sizeof(__le16)) -+ return -EINVAL; -+ -+ err = mutex_lock_interruptible(&spihid->tx_lock); -+ if (err < 0) -+ return err; -+ -+ pkt = (struct spihid_transfer_packet *)spihid->tx_buf; -+ -+ memset(pkt, 0, sizeof(*pkt)); -+ pkt->flags = SPIHID_WRITE_PACKET; -+ pkt->device = target; -+ pkt->length = sizeof(*hdr) + len + sizeof(__le16); -+ -+ hdr = (struct spihid_msg_hdr *)&pkt->data[0]; -+ hdr->unknown0 = unk0; -+ hdr->unknown1 = unk1; -+ hdr->unknown2 = unk2; -+ hdr->id = spihid->msg_id++; -+ hdr->rsplen = cpu_to_le16(resp_len); -+ hdr->length = cpu_to_le16(len); -+ -+ if (len) -+ memcpy(pkt->data + sizeof(*hdr), buf, len); -+ crc = crc16(0, &pkt->data[0], sizeof(*hdr) + len); -+ put_unaligned_le16(crc, pkt->data + sizeof(*hdr) + len); -+ -+ pkt->crc16 = crc16(0, spihid->tx_buf, -+ offsetof(struct spihid_transfer_packet, crc16)); -+ -+ err = spi_sync(spihid->spidev, &spihid->tx_msg); -+ mutex_unlock(&spihid->tx_lock); -+ if (err < 0) -+ return err; -+ -+ return (int)len; -+} -+ -+struct spihid_apple *spihid_get_data(struct spihid_interface *idev) -+{ -+ switch (idev->id) { -+ case SPIHID_DEVICE_ID_KBD: -+ return container_of(idev, struct spihid_apple, kbd); -+ case SPIHID_DEVICE_ID_TP: -+ return container_of(idev, struct spihid_apple, tp); -+ default: -+ return NULL; -+ } -+} -+ -+static int apple_ll_start(struct hid_device *hdev) -+{ -+ /* no-op SPI transport is already setup */ -+ return 0; -+}; -+ -+static void apple_ll_stop(struct hid_device *hdev) -+{ -+ /* no-op, devices will be desstroyed on driver destruction */ -+} -+ -+static int apple_ll_open(struct hid_device *hdev) -+{ -+ struct spihid_apple *spihid; -+ struct spihid_interface *idev = hdev->driver_data; -+ -+ if (idev->hid_desc_len == 0) { -+ spihid = spihid_get_data(idev); -+ dev_warn(&spihid->spidev->dev, -+ "HID descriptor missing for dev %u", idev->id); -+ } else -+ idev->ready = true; -+ -+ return 0; -+} -+ -+static void apple_ll_close(struct hid_device *hdev) -+{ -+ struct spihid_interface *idev = hdev->driver_data; -+ idev->ready = false; -+} -+ -+static int apple_ll_parse(struct hid_device *hdev) -+{ -+ struct spihid_interface *idev = hdev->driver_data; -+ -+ return hid_parse_report(hdev, idev->hid_desc, idev->hid_desc_len); -+} -+ -+static int apple_ll_raw_request(struct hid_device *hdev, -+ unsigned char reportnum, __u8 *buf, size_t len, -+ unsigned char rtype, int reqtype) -+{ -+ struct spihid_interface *idev = hdev->driver_data; -+ struct spihid_apple *spihid = spihid_get_data(idev); -+ -+ dev_dbg(&spihid->spidev->dev, -+ "apple_ll_raw_request: device:%u reportnum:%hhu rtype:%hhu", -+ idev->id, reportnum, rtype); -+ -+ switch (reqtype) { -+ case HID_REQ_GET_REPORT: -+ return -EINVAL; // spihid_get_raw_report(); -+ case HID_REQ_SET_REPORT: -+ if (buf[0] != reportnum) -+ return -EINVAL; -+ if (reportnum != idev->id) { -+ dev_warn(&spihid->spidev->dev, -+ "device:%u reportnum:" -+ "%hhu mismatch", -+ idev->id, reportnum); -+ return -EINVAL; -+ } -+ return spihid_apple_request(spihid, idev->id, 0x52, reportnum, 0x00, 2, buf, len); -+ default: -+ return -EIO; -+ } -+} -+ -+static int apple_ll_output_report(struct hid_device *hdev, __u8 *buf, -+ size_t len) -+{ -+ struct spihid_interface *idev = hdev->driver_data; -+ struct spihid_apple *spihid = spihid_get_data(idev); -+ if (!spihid) -+ return -1; -+ -+ dev_dbg(&spihid->spidev->dev, -+ "apple_ll_output_report: device:%u len:%zu:", -+ idev->id, len); -+ // second idev->id should maybe be buf[0]? -+ return spihid_apple_request(spihid, idev->id, 0x51, idev->id, 0x00, 0, buf, len); -+} -+ -+static struct hid_ll_driver apple_hid_ll = { -+ .start = &apple_ll_start, -+ .stop = &apple_ll_stop, -+ .open = &apple_ll_open, -+ .close = &apple_ll_close, -+ .parse = &apple_ll_parse, -+ .raw_request = &apple_ll_raw_request, -+ .output_report = &apple_ll_output_report, -+}; -+ -+static struct spihid_interface *spihid_get_iface(struct spihid_apple *spihid, -+ u32 iface) -+{ -+ switch (iface) { -+ case SPIHID_DEVICE_ID_MNGT: -+ return &spihid->mngt; -+ case SPIHID_DEVICE_ID_KBD: -+ return &spihid->kbd; -+ case SPIHID_DEVICE_ID_TP: -+ return &spihid->tp; -+ default: -+ return NULL; -+ } -+} -+ -+static int spihid_verify_msg(struct spihid_apple *spihid, u8 *buf, size_t len) -+{ -+ u16 msg_crc, crc; -+ struct device *dev = &spihid->spidev->dev; -+ -+ crc = crc16(0, buf, len - sizeof(__le16)); -+ msg_crc = get_unaligned_le16(buf + len - sizeof(__le16)); -+ if (crc != msg_crc) { -+ dev_warn_ratelimited(dev, "Read message crc mismatch\n"); -+ return 0; -+ } -+ return 1; -+} -+ -+static bool spihid_status_report(struct spihid_apple *spihid, u8 *pl, -+ size_t len) -+{ -+ struct device *dev = &spihid->spidev->dev; -+ dev_dbg(dev, "%s: len: %zu", __func__, len); -+ if (len == 5 && pl[0] == 0xe0) -+ return true; -+ -+ return false; -+} -+ -+static bool spihid_process_input_report(struct spihid_apple *spihid, u32 device, -+ struct spihid_msg_hdr *hdr, u8 *payload, -+ size_t len) -+{ -+ //dev_dbg(&spihid>spidev->dev, "input report: req:%hx iface:%u ", hdr->unknown0, device); -+ if (hdr->unknown0 != 0x10) -+ return false; -+ -+ /* HID device as well but Vendor usage only, handle it internally for now */ -+ if (device == 0) { -+ if (hdr->unknown1 == 0xe0) { -+ return spihid_status_report(spihid, payload, len); -+ } -+ } else if (device < SPIHID_MAX_DEVICES) { -+ struct spihid_interface *iface = -+ spihid_get_iface(spihid, device); -+ if (iface && iface->hid && iface->ready) { -+ hid_input_report(iface->hid, HID_INPUT_REPORT, payload, -+ len, 1); -+ return true; -+ } -+ } else -+ dev_dbg(&spihid->spidev->dev, -+ "unexpected iface:%u for input report", device); -+ -+ return false; -+} -+ -+struct spihid_device_info { -+ __le16 u0[2]; -+ __le16 num_devices; -+ __le16 vendor_id; -+ __le16 product_id; -+ __le16 version_number; -+ __le16 vendor_str[2]; //< offset and string length -+ __le16 product_str[2]; //< offset and string length -+ __le16 serial_str[2]; //< offset and string length -+}; -+ -+static bool spihid_process_device_info(struct spihid_apple *spihid, u32 iface, -+ u8 *payload, size_t len) -+{ -+ struct device *dev = &spihid->spidev->dev; -+ -+ if (iface != SPIHID_DEVICE_ID_INFO) -+ return false; -+ -+ if (spihid->vendor_id == 0 && -+ len >= sizeof(struct spihid_device_info)) { -+ struct spihid_device_info *info = -+ (struct spihid_device_info *)payload; -+ u16 voff, vlen, poff, plen, soff, slen; -+ u32 num_devices; -+ -+ num_devices = __le16_to_cpu(info->num_devices); -+ -+ if (num_devices < SPIHID_MAX_DEVICES) { -+ dev_err(dev, -+ "Device info reports %u devices, expecting at least 3", -+ num_devices); -+ return false; -+ } -+ spihid->num_devices = num_devices; -+ -+ if (spihid->num_devices > SPIHID_MAX_DEVICES) { -+ dev_info( -+ dev, -+ "limiting the number of devices to mngt, kbd and mouse"); -+ spihid->num_devices = SPIHID_MAX_DEVICES; -+ } -+ -+ spihid->vendor_id = __le16_to_cpu(info->vendor_id); -+ spihid->product_id = __le16_to_cpu(info->product_id); -+ spihid->version_number = __le16_to_cpu(info->version_number); -+ -+ voff = __le16_to_cpu(info->vendor_str[0]); -+ vlen = __le16_to_cpu(info->vendor_str[1]); -+ -+ if (voff < len && vlen <= len - voff && -+ vlen < sizeof(spihid->vendor)) { -+ memcpy(spihid->vendor, payload + voff, vlen); -+ spihid->vendor[vlen] = '\0'; -+ } -+ -+ poff = __le16_to_cpu(info->product_str[0]); -+ plen = __le16_to_cpu(info->product_str[1]); -+ -+ if (poff < len && plen <= len - poff && -+ plen < sizeof(spihid->product)) { -+ memcpy(spihid->product, payload + poff, plen); -+ spihid->product[plen] = '\0'; -+ } -+ -+ soff = __le16_to_cpu(info->serial_str[0]); -+ slen = __le16_to_cpu(info->serial_str[1]); -+ -+ if (soff < len && slen <= len - soff && -+ slen < sizeof(spihid->serial)) { -+ memcpy(spihid->vendor, payload + soff, slen); -+ spihid->serial[slen] = '\0'; -+ } -+ -+ wake_up_interruptible(&spihid->wait); -+ } -+ return true; -+} -+ -+struct spihid_iface_info { -+ u8 u_0; -+ u8 interface_num; -+ u8 u_2; -+ u8 u_3; -+ u8 u_4; -+ u8 country_code; -+ __le16 max_input_report_len; -+ __le16 max_output_report_len; -+ __le16 max_control_report_len; -+ __le16 name_offset; -+ __le16 name_length; -+}; -+ -+static bool spihid_process_iface_info(struct spihid_apple *spihid, u32 num, -+ u8 *payload, size_t len) -+{ -+ struct spihid_iface_info *info; -+ struct spihid_interface *iface = spihid_get_iface(spihid, num); -+ u32 name_off, name_len; -+ -+ if (!iface) -+ return false; -+ -+ if (!iface->max_input_report_len) { -+ if (len < sizeof(*info)) -+ return false; -+ -+ info = (struct spihid_iface_info *)payload; -+ -+ iface->max_input_report_len = -+ le16_to_cpu(info->max_input_report_len); -+ iface->max_output_report_len = -+ le16_to_cpu(info->max_output_report_len); -+ iface->max_control_report_len = -+ le16_to_cpu(info->max_control_report_len); -+ iface->country = info->country_code; -+ -+ name_off = le16_to_cpu(info->name_offset); -+ name_len = le16_to_cpu(info->name_length); -+ -+ if (name_off < len && name_len <= len - name_off && -+ name_len < sizeof(iface->name)) { -+ memcpy(iface->name, payload + name_off, name_len); -+ iface->name[name_len] = '\0'; -+ } -+ -+ dev_dbg(&spihid->spidev->dev, "Info for %s, country code: 0x%x", -+ iface->name, iface->country); -+ -+ wake_up_interruptible(&spihid->wait); -+ } -+ -+ return true; -+} -+ -+static int spihid_register_hid_device(struct spihid_apple *spihid, -+ struct spihid_interface *idev, u8 device); -+ -+static bool spihid_process_iface_hid_report_desc(struct spihid_apple *spihid, -+ u32 num, u8 *payload, -+ size_t len) -+{ -+ struct spihid_interface *iface = spihid_get_iface(spihid, num); -+ -+ if (!iface) -+ return false; -+ -+ if (iface->hid_desc_len == 0) { -+ if (len > SPIHID_DESC_MAX) -+ return false; -+ memcpy(iface->hid_desc, payload, len); -+ iface->hid_desc_len = len; -+ -+ /* do not register the mngt iface as HID device */ -+ if (num > 0) -+ spihid_register_hid_device(spihid, iface, num); -+ -+ wake_up_interruptible(&spihid->wait); -+ } -+ return true; -+} -+ -+static bool spihid_process_response(struct spihid_apple *spihid, -+ struct spihid_msg_hdr *hdr, u8 *payload, -+ size_t len) -+{ -+ if (hdr->unknown0 == 0x20) { -+ switch (hdr->unknown1) { -+ case 0x01: -+ return spihid_process_device_info(spihid, hdr->unknown2, -+ payload, len); -+ case 0x02: -+ return spihid_process_iface_info(spihid, hdr->unknown2, -+ payload, len); -+ case 0x10: -+ return spihid_process_iface_hid_report_desc( -+ spihid, hdr->unknown2, payload, len); -+ default: -+ break; -+ } -+ } -+ -+ return false; -+} -+ -+static void spihid_process_message(struct spihid_apple *spihid, u8 *data, -+ size_t length, u8 device, u8 flags) -+{ -+ struct device *dev = &spihid->spidev->dev; -+ struct spihid_msg_hdr *hdr; -+ bool handled = false; -+ u8 *payload; -+ -+ if (!spihid_verify_msg(spihid, data, length)) -+ return; -+ -+ hdr = (struct spihid_msg_hdr *)data; -+ -+ if (hdr->length == 0) -+ return; -+ -+ payload = data + sizeof(struct spihid_msg_hdr); -+ -+ switch (flags) { -+ case SPIHID_READ_PACKET: -+ handled = spihid_process_input_report(spihid, device, hdr, -+ payload, hdr->length); -+ break; -+ case SPIHID_WRITE_PACKET: -+ handled = spihid_process_response(spihid, hdr, payload, -+ hdr->length); -+ break; -+ default: -+ break; -+ } -+ -+#if defined(DEBUG) && DEBUG > 1 -+ { -+ dev_dbg(dev, -+ "R msg: req:%02hhx rep:%02hhx dev:%02hhx id:%hu len:%hu\n", -+ hdr->unknown0, hdr->unknown1, hdr->unknown2, hdr->id, -+ hdr->length); -+ print_hex_dump_debug("spihid msg: ", DUMP_PREFIX_OFFSET, 16, 1, -+ payload, hdr->length, true); -+ } -+#else -+ if (!handled) { -+ dev_dbg(dev, -+ "R unhandled msg: req:%02hhx rep:%02hhx dev:%02hhx id:%hu len:%hu\n", -+ hdr->unknown0, hdr->unknown1, hdr->unknown2, hdr->id, -+ hdr->length); -+ print_hex_dump_debug("spihid msg: ", DUMP_PREFIX_OFFSET, 16, 1, -+ payload, hdr->length, true); -+ } -+#endif -+} -+ -+static void spihid_assemble_meesage(struct spihid_apple *spihid, -+ struct spihid_transfer_packet *pkt) -+{ -+ size_t length, offset, remain; -+ struct device *dev = &spihid->spidev->dev; -+ struct spihid_input_report *rep = &spihid->report; -+ -+ length = le16_to_cpu(pkt->length); -+ remain = le16_to_cpu(pkt->remain); -+ offset = le16_to_cpu(pkt->offset); -+ -+ if (offset + length + remain > U16_MAX) { -+ return; -+ } -+ -+ if (pkt->device != rep->device || pkt->flags != rep->flags || -+ pkt->offset != rep->offset) { -+ rep->device = 0; -+ rep->flags = 0; -+ rep->offset = 0; -+ rep->length = 0; -+ } -+ -+ if (pkt->offset == 0) { -+ if (rep->offset != 0) { -+ dev_warn(dev, "incomplete report off:%u len:%u", -+ rep->offset, rep->length); -+ } -+ memcpy(rep->buf, pkt->data, length); -+ rep->offset = length; -+ rep->length = length + pkt->remain; -+ rep->device = pkt->device; -+ rep->flags = pkt->flags; -+ } else if (pkt->offset == rep->offset) { -+ if (pkt->offset + length + pkt->remain != rep->length) { -+ dev_warn(dev, "incomplete report off:%u len:%u", -+ rep->offset, rep->length); -+ return; -+ } -+ memcpy(rep->buf + pkt->offset, pkt->data, pkt->length); -+ rep->offset += pkt->length; -+ -+ if (rep->offset == rep->length) { -+ spihid_process_message(spihid, rep->buf, rep->length, -+ rep->device, rep->flags); -+ rep->device = 0; -+ rep->flags = 0; -+ rep->offset = 0; -+ rep->length = 0; -+ } -+ } -+} -+ -+static void spihid_process_read(struct spihid_apple *spihid) -+{ -+ u16 crc; -+ size_t length; -+ struct device *dev = &spihid->spidev->dev; -+ struct spihid_transfer_packet *pkt; -+ -+ pkt = (struct spihid_transfer_packet *)spihid->rx_buf; -+ -+ /* check transfer packet crc */ -+ crc = crc16(0, spihid->rx_buf, -+ offsetof(struct spihid_transfer_packet, crc16)); -+ if (crc != pkt->crc16) { -+ dev_warn_ratelimited(dev, "Read package crc mismatch\n"); -+ return; -+ } -+ -+ length = le16_to_cpu(pkt->length); -+ -+ if (length < sizeof(struct spihid_msg_hdr) + 2) { -+ if (length == sizeof(spi_hid_apple_booted) && -+ !memcmp(pkt->data, spi_hid_apple_booted, length)) { -+ if (!spihid->status_booted) { -+ spihid->status_booted = true; -+ wake_up_interruptible(&spihid->wait); -+ } -+ } else { -+ dev_info(dev, "R short packet: len:%zu\n", length); -+ print_hex_dump_debug("spihid pkt:", DUMP_PREFIX_OFFSET, 16, 1, -+ pkt->data, length, false); -+ } -+ return; -+ } -+ -+#if defined(DEBUG) && DEBUG > 1 -+ dev_dbg(dev, -+ "R pkt: flags:%02hhx dev:%02hhx off:%hu remain:%hu, len:%zu\n", -+ pkt->flags, pkt->device, pkt->offset, pkt->remain, length); -+#if defined(DEBUG) && DEBUG > 2 -+ print_hex_dump_debug("spihid pkt: ", DUMP_PREFIX_OFFSET, 16, 1, -+ spihid->rx_buf, -+ sizeof(struct spihid_transfer_packet), true); -+#endif -+#endif -+ -+ if (length > sizeof(pkt->data)) { -+ dev_warn_ratelimited(dev, "Invalid pkt len:%zu", length); -+ return; -+ } -+ -+ /* short message */ -+ if (pkt->offset == 0 && pkt->remain == 0) { -+ spihid_process_message(spihid, pkt->data, length, pkt->device, -+ pkt->flags); -+ } else { -+ spihid_assemble_meesage(spihid, pkt); -+ } -+} -+ -+static void spihid_read_packet_sync(struct spihid_apple *spihid) -+{ -+ int err; -+ -+ err = spi_sync(spihid->spidev, &spihid->rx_msg); -+ if (!err) { -+ spihid_process_read(spihid); -+ } else { -+ dev_warn(&spihid->spidev->dev, "RX failed: %d\n", err); -+ } -+} -+ -+irqreturn_t spihid_apple_core_irq(int irq, void *data) -+{ -+ struct spi_device *spi = data; -+ struct spihid_apple *spihid = spi_get_drvdata(spi); -+ -+ spihid_read_packet_sync(spihid); -+ -+ return IRQ_HANDLED; -+} -+EXPORT_SYMBOL_GPL(spihid_apple_core_irq); -+ -+static void spihid_apple_setup_spi_msgs(struct spihid_apple *spihid) -+{ -+ memset(&spihid->rx_transfer, 0, sizeof(spihid->rx_transfer)); -+ -+ spihid->rx_transfer.rx_buf = spihid->rx_buf; -+ spihid->rx_transfer.len = sizeof(struct spihid_transfer_packet); -+ -+ spi_message_init(&spihid->rx_msg); -+ spi_message_add_tail(&spihid->rx_transfer, &spihid->rx_msg); -+ -+ memset(&spihid->tx_transfer, 0, sizeof(spihid->rx_transfer)); -+ memset(&spihid->status_transfer, 0, sizeof(spihid->status_transfer)); -+ -+ spihid->tx_transfer.tx_buf = spihid->tx_buf; -+ spihid->tx_transfer.len = sizeof(struct spihid_transfer_packet); -+ spihid->tx_transfer.delay.unit = SPI_DELAY_UNIT_USECS; -+ spihid->tx_transfer.delay.value = SPI_RW_CHG_DELAY_US; -+ -+ spihid->status_transfer.rx_buf = spihid->status_buf; -+ spihid->status_transfer.len = sizeof(spi_hid_apple_status_ok); -+ -+ spi_message_init(&spihid->tx_msg); -+ spi_message_add_tail(&spihid->tx_transfer, &spihid->tx_msg); -+ spi_message_add_tail(&spihid->status_transfer, &spihid->tx_msg); -+} -+ -+static int spihid_apple_setup_spi(struct spihid_apple *spihid) -+{ -+ spihid_apple_setup_spi_msgs(spihid); -+ -+ return spihid->ops->power_on(spihid->ops); -+} -+ -+static int spihid_register_hid_device(struct spihid_apple *spihid, -+ struct spihid_interface *iface, u8 device) -+{ -+ int ret; -+ struct hid_device *hid; -+ -+ iface->id = device; -+ -+ hid = hid_allocate_device(); -+ if (IS_ERR(hid)) -+ return PTR_ERR(hid); -+ -+ strscpy(hid->name, spihid->product, sizeof(hid->name)); -+ snprintf(hid->phys, sizeof(hid->phys), "%s (%hhx)", -+ dev_name(&spihid->spidev->dev), device); -+ strscpy(hid->uniq, spihid->serial, sizeof(hid->uniq)); -+ -+ hid->ll_driver = &apple_hid_ll; -+ hid->bus = BUS_SPI; -+ hid->vendor = spihid->vendor_id; -+ hid->product = spihid->product_id; -+ hid->version = spihid->version_number; -+ -+ if (device == SPIHID_DEVICE_ID_KBD) -+ hid->type = HID_TYPE_SPI_KEYBOARD; -+ else if (device == SPIHID_DEVICE_ID_TP) -+ hid->type = HID_TYPE_SPI_MOUSE; -+ -+ hid->country = iface->country; -+ hid->dev.parent = &spihid->spidev->dev; -+ hid->driver_data = iface; -+ -+ ret = hid_add_device(hid); -+ if (ret < 0) { -+ hid_destroy_device(hid); -+ dev_warn(&spihid->spidev->dev, -+ "Failed to register hid device %hhu", device); -+ return ret; -+ } -+ -+ iface->hid = hid; -+ -+ return 0; -+} -+ -+static void spihid_destroy_hid_device(struct spihid_interface *iface) -+{ -+ if (iface->hid) { -+ hid_destroy_device(iface->hid); -+ iface->hid = NULL; -+ } -+ iface->ready = false; -+} -+ -+int spihid_apple_core_probe(struct spi_device *spi, struct spihid_apple_ops *ops) -+{ -+ struct device *dev = &spi->dev; -+ struct spihid_apple *spihid; -+ int err, i; -+ -+ if (!ops || !ops->power_on || !ops->power_off || !ops->enable_irq || !ops->disable_irq) -+ return -EINVAL; -+ -+ spihid = devm_kzalloc(dev, sizeof(*spihid), GFP_KERNEL); -+ if (!spihid) -+ return -ENOMEM; -+ -+ spihid->ops = ops; -+ spihid->spidev = spi; -+ -+ // init spi -+ spi_set_drvdata(spi, spihid); -+ -+ /* allocate SPI buffers */ -+ spihid->rx_buf = devm_kmalloc( -+ &spi->dev, sizeof(struct spihid_transfer_packet), GFP_KERNEL); -+ spihid->tx_buf = devm_kmalloc( -+ &spi->dev, sizeof(struct spihid_transfer_packet), GFP_KERNEL); -+ spihid->status_buf = devm_kmalloc( -+ &spi->dev, sizeof(spi_hid_apple_status_ok), GFP_KERNEL); -+ -+ if (!spihid->rx_buf || !spihid->tx_buf || !spihid->status_buf) -+ return -ENOMEM; -+ -+ spihid->report.buf = -+ devm_kmalloc(dev, SPIHID_MAX_INPUT_REPORT_SIZE, GFP_KERNEL); -+ -+ spihid->kbd.hid_desc = devm_kmalloc(dev, SPIHID_DESC_MAX, GFP_KERNEL); -+ spihid->tp.hid_desc = devm_kmalloc(dev, SPIHID_DESC_MAX, GFP_KERNEL); -+ -+ if (!spihid->report.buf || !spihid->kbd.hid_desc || -+ !spihid->tp.hid_desc) -+ return -ENOMEM; -+ -+ init_waitqueue_head(&spihid->wait); -+ -+ mutex_init(&spihid->tx_lock); -+ -+ /* Init spi transfer buffers and power device on */ -+ err = spihid_apple_setup_spi(spihid); -+ if (err < 0) -+ goto error; -+ -+ /* enable HID irq */ -+ spihid->ops->enable_irq(spihid->ops); -+ -+ // wait for boot message -+ err = wait_event_interruptible_timeout(spihid->wait, -+ spihid->status_booted, -+ msecs_to_jiffies(1000)); -+ if (err == 0) -+ err = -ENODEV; -+ if (err < 0) { -+ dev_err(dev, "waiting for device boot failed: %d", err); -+ goto error; -+ } -+ -+ /* request device information */ -+ dev_dbg(dev, "request device info"); -+ spihid_apple_request(spihid, 0xd0, 0x20, 0x01, 0xd0, 0, NULL, 0); -+ err = wait_event_interruptible_timeout(spihid->wait, spihid->vendor_id, -+ SPIHID_DEF_WAIT); -+ if (err == 0) -+ err = -ENODEV; -+ if (err < 0) { -+ dev_err(dev, "waiting for device info failed: %d", err); -+ goto error; -+ } -+ -+ /* request interface information */ -+ for (i = 0; i < spihid->num_devices; i++) { -+ struct spihid_interface *iface = spihid_get_iface(spihid, i); -+ if (!iface) -+ continue; -+ dev_dbg(dev, "request interface info 0x%02x", i); -+ spihid_apple_request(spihid, 0xd0, 0x20, 0x02, i, -+ SPIHID_DESC_MAX, NULL, 0); -+ err = wait_event_interruptible_timeout( -+ spihid->wait, iface->max_input_report_len, -+ SPIHID_DEF_WAIT); -+ } -+ -+ /* request HID report descriptors */ -+ for (i = 1; i < spihid->num_devices; i++) { -+ struct spihid_interface *iface = spihid_get_iface(spihid, i); -+ if (!iface) -+ continue; -+ dev_dbg(dev, "request hid report desc 0x%02x", i); -+ spihid_apple_request(spihid, 0xd0, 0x20, 0x10, i, -+ SPIHID_DESC_MAX, NULL, 0); -+ wait_event_interruptible_timeout( -+ spihid->wait, iface->hid_desc_len, SPIHID_DEF_WAIT); -+ } -+ -+ return 0; -+error: -+ return err; -+} -+EXPORT_SYMBOL_GPL(spihid_apple_core_probe); -+ -+void spihid_apple_core_remove(struct spi_device *spi) -+{ -+ struct spihid_apple *spihid = spi_get_drvdata(spi); -+ -+ /* destroy input devices */ -+ -+ spihid_destroy_hid_device(&spihid->tp); -+ spihid_destroy_hid_device(&spihid->kbd); -+ -+ /* disable irq */ -+ spihid->ops->disable_irq(spihid->ops); -+ -+ /* power SPI device down */ -+ spihid->ops->power_off(spihid->ops); -+} -+EXPORT_SYMBOL_GPL(spihid_apple_core_remove); -+ -+void spihid_apple_core_shutdown(struct spi_device *spi) -+{ -+ struct spihid_apple *spihid = spi_get_drvdata(spi); -+ -+ /* disable irq */ -+ spihid->ops->disable_irq(spihid->ops); -+ -+ /* power SPI device down */ -+ spihid->ops->power_off(spihid->ops); -+} -+EXPORT_SYMBOL_GPL(spihid_apple_core_shutdown); -+ -+MODULE_DESCRIPTION("Apple SPI HID transport driver"); -+MODULE_AUTHOR("Janne Grunau "); -+MODULE_LICENSE("GPL"); -diff --git a/drivers/hid/spi-hid/spi-hid-apple-of.c b/drivers/hid/spi-hid/spi-hid-apple-of.c -new file mode 100644 -index 000000000000..db76774eea7e ---- /dev/null -+++ b/drivers/hid/spi-hid/spi-hid-apple-of.c -@@ -0,0 +1,138 @@ -+/* -+ * SPDX-License-Identifier: GPL-2.0 -+ * -+ * Apple SPI HID transport driver - Open Firmware -+ * -+ * Copyright (C) The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include "spi-hid-apple.h" -+ -+ -+struct spihid_apple_of { -+ struct spihid_apple_ops ops; -+ -+ struct gpio_desc *enable_gpio; -+ int irq; -+}; -+ -+int spihid_apple_of_power_on(struct spihid_apple_ops *ops) -+{ -+ struct spihid_apple_of *sh_of = container_of(ops, struct spihid_apple_of, ops); -+ -+ /* reset the controller on boot */ -+ gpiod_direction_output(sh_of->enable_gpio, 1); -+ msleep(5); -+ gpiod_direction_output(sh_of->enable_gpio, 0); -+ msleep(5); -+ /* turn SPI device on */ -+ gpiod_direction_output(sh_of->enable_gpio, 1); -+ msleep(50); -+ -+ return 0; -+} -+ -+int spihid_apple_of_power_off(struct spihid_apple_ops *ops) -+{ -+ struct spihid_apple_of *sh_of = container_of(ops, struct spihid_apple_of, ops); -+ -+ /* turn SPI device off */ -+ gpiod_direction_output(sh_of->enable_gpio, 0); -+ -+ return 0; -+} -+ -+int spihid_apple_of_enable_irq(struct spihid_apple_ops *ops) -+{ -+ struct spihid_apple_of *sh_of = container_of(ops, struct spihid_apple_of, ops); -+ -+ enable_irq(sh_of->irq); -+ -+ return 0; -+} -+ -+int spihid_apple_of_disable_irq(struct spihid_apple_ops *ops) -+{ -+ struct spihid_apple_of *sh_of = container_of(ops, struct spihid_apple_of, ops); -+ -+ disable_irq(sh_of->irq); -+ -+ return 0; -+} -+ -+static int spihid_apple_of_probe(struct spi_device *spi) -+{ -+ struct device *dev = &spi->dev; -+ struct spihid_apple_of *spihid_of; -+ int err; -+ -+ dev_warn(dev, "%s:%d", __func__, __LINE__); -+ -+ spihid_of = devm_kzalloc(dev, sizeof(*spihid_of), GFP_KERNEL); -+ if (!spihid_of) -+ return -ENOMEM; -+ -+ spihid_of->ops.power_on = spihid_apple_of_power_on; -+ spihid_of->ops.power_off = spihid_apple_of_power_off; -+ spihid_of->ops.enable_irq = spihid_apple_of_enable_irq; -+ spihid_of->ops.disable_irq = spihid_apple_of_disable_irq; -+ -+ spihid_of->enable_gpio = devm_gpiod_get_index(dev, "spien", 0, 0); -+ if (IS_ERR(spihid_of->enable_gpio)) { -+ err = PTR_ERR(spihid_of->enable_gpio); -+ dev_err(dev, "failed to get 'spien' gpio pin: %d", err); -+ return err; -+ } -+ -+ spihid_of->irq = of_irq_get(dev->of_node, 0); -+ if (spihid_of->irq < 0) { -+ err = spihid_of->irq; -+ dev_err(dev, "failed to get 'extended-irq': %d", err); -+ return err; -+ } -+ err = devm_request_threaded_irq(dev, spihid_of->irq, NULL, -+ spihid_apple_core_irq, IRQF_ONESHOT | IRQF_NO_AUTOEN, -+ "spi-hid-apple-irq", spi); -+ if (err < 0) { -+ dev_err(dev, "failed to request extended-irq %d: %d", -+ spihid_of->irq, err); -+ return err; -+ } -+ -+ return spihid_apple_core_probe(spi, &spihid_of->ops); -+} -+ -+static const struct of_device_id spihid_apple_of_match[] = { -+ { .compatible = "apple,spi-hid-transport" }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(of, spihid_apple_of_match); -+ -+static struct spi_device_id spihid_apple_of_id[] = { -+ { "spi-hid-transport", 0 }, -+ {} -+}; -+MODULE_DEVICE_TABLE(spi, spihid_apple_of_id); -+ -+static struct spi_driver spihid_apple_of_driver = { -+ .driver = { -+ .name = "spi-hid-apple-of", -+ //.pm = &spi_hid_apple_of_pm, -+ .owner = THIS_MODULE, -+ .of_match_table = of_match_ptr(spihid_apple_of_match), -+ }, -+ -+ .id_table = spihid_apple_of_id, -+ .probe = spihid_apple_of_probe, -+ .remove = spihid_apple_core_remove, -+ .shutdown = spihid_apple_core_shutdown, -+}; -+ -+module_spi_driver(spihid_apple_of_driver); -+ -+MODULE_LICENSE("GPL"); -diff --git a/drivers/hid/spi-hid/spi-hid-apple.h b/drivers/hid/spi-hid/spi-hid-apple.h -new file mode 100644 -index 000000000000..2d9554e8a5f8 ---- /dev/null -+++ b/drivers/hid/spi-hid/spi-hid-apple.h -@@ -0,0 +1,31 @@ -+/* SPDX-License-Identifier: GPL-2.0-only OR MIT */ -+ -+#ifndef SPI_HID_APPLE_H -+#define SPI_HID_APPLE_H -+ -+#include -+#include -+ -+/** -+ * struct spihid_apple_ops - Ops to control the device from the core driver. -+ * -+ * @power_on: reset and power the device on. -+ * @power_off: power the device off. -+ * @enable_irq: enable irq or ACPI gpe. -+ * @disable_irq: disable irq or ACPI gpe. -+ */ -+ -+struct spihid_apple_ops { -+ int (*power_on)(struct spihid_apple_ops *ops); -+ int (*power_off)(struct spihid_apple_ops *ops); -+ int (*enable_irq)(struct spihid_apple_ops *ops); -+ int (*disable_irq)(struct spihid_apple_ops *ops); -+}; -+ -+irqreturn_t spihid_apple_core_irq(int irq, void *data); -+ -+int spihid_apple_core_probe(struct spi_device *spi, struct spihid_apple_ops *ops); -+void spihid_apple_core_remove(struct spi_device *spi); -+void spihid_apple_core_shutdown(struct spi_device *spi); -+ -+#endif /* SPI_HID_APPLE_H */ --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0125-HID-add-HOST-vendor-device-IDs-for-Apple-MTP-devices.patch b/target/linux/silicon/patches-5.19/0125-HID-add-HOST-vendor-device-IDs-for-Apple-MTP-devices.patch deleted file mode 100644 index 181e296b7..000000000 --- a/target/linux/silicon/patches-5.19/0125-HID-add-HOST-vendor-device-IDs-for-Apple-MTP-devices.patch +++ /dev/null @@ -1,38 +0,0 @@ -From dce57a9616a44e9717b60366fc71d47c32d1b70b Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 8 Jul 2022 00:29:43 +0900 -Subject: [PATCH 125/171] HID: add HOST vendor/device IDs for Apple MTP devices - -Apple M2 chips have an embedded MTP processor that handles all HID -functions, and does not go over a traditional bus like SPI. The devices -still have real IDs, so add them here. - -Signed-off-by: Hector Martin ---- - drivers/hid/hid-ids.h | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h -index 98f922774df9..7ecfa2622d53 100644 ---- a/drivers/hid/hid-ids.h -+++ b/drivers/hid/hid-ids.h -@@ -90,6 +90,7 @@ - #define USB_VENDOR_ID_APPLE 0x05ac - #define BT_VENDOR_ID_APPLE 0x004c - #define SPI_VENDOR_ID_APPLE 0x05ac -+#define HOST_VENDOR_ID_APPLE 0x05ac - #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 - #define USB_DEVICE_ID_APPLE_MAGICMOUSE 0x030d - #define USB_DEVICE_ID_APPLE_MAGICMOUSE2 0x0269 -@@ -190,6 +191,8 @@ - #define SPI_DEVICE_ID_APPLE_MACBOOK_PRO13_2020 0x0341 - #define SPI_DEVICE_ID_APPLE_MACBOOK_PRO14_2021 0x0342 - #define SPI_DEVICE_ID_APPLE_MACBOOK_PRO16_2021 0x0343 -+#define HOST_DEVICE_ID_APPLE_MACBOOK_AIR13_2022 0x0351 -+#define HOST_DEVICE_ID_APPLE_MACBOOK_PRO13_2022 0x0354 - - #define USB_VENDOR_ID_ASUS 0x0486 - #define USB_DEVICE_ID_ASUS_T91MT 0x0185 --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0126-HID-core-Handle-HOST-bus-type-when-announcing-device.patch b/target/linux/silicon/patches-5.19/0126-HID-core-Handle-HOST-bus-type-when-announcing-device.patch deleted file mode 100644 index af3e114e4..000000000 --- a/target/linux/silicon/patches-5.19/0126-HID-core-Handle-HOST-bus-type-when-announcing-device.patch +++ /dev/null @@ -1,28 +0,0 @@ -From de6f500d1d4f98fc5b711ec88f916069c4206395 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 8 Jul 2022 02:06:15 +0900 -Subject: [PATCH 126/171] HID: core: Handle HOST bus type when announcing - devices - -Signed-off-by: Hector Martin ---- - drivers/hid/hid-core.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c -index 22f313716a12..048f13b487b3 100644 ---- a/drivers/hid/hid-core.c -+++ b/drivers/hid/hid-core.c -@@ -2222,6 +2222,9 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask) - case BUS_SPI: - bus = "SPI"; - break; -+ case BUS_HOST: -+ bus = "HOST"; -+ break; - case BUS_VIRTUAL: - bus = "VIRTUAL"; - break; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0127-hid-apple-Bind-to-HOST-devices-for-MTP.patch b/target/linux/silicon/patches-5.19/0127-hid-apple-Bind-to-HOST-devices-for-MTP.patch deleted file mode 100644 index 88d18ae9b..000000000 --- a/target/linux/silicon/patches-5.19/0127-hid-apple-Bind-to-HOST-devices-for-MTP.patch +++ /dev/null @@ -1,59 +0,0 @@ -From aaee021a970f5f5fadabc4378c8260aee692e8ec Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 8 Jul 2022 02:12:24 +0900 -Subject: [PATCH 127/171] hid: apple: Bind to HOST devices for MTP - -We use BUS_HOST for MTP HID subdevices - -Signed-off-by: Hector Martin ---- - drivers/hid/hid-apple.c | 19 +++++++++++++------ - 1 file changed, 13 insertions(+), 6 deletions(-) - -diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c -index 6700cbac2575..7dc7b8a6aea2 100644 ---- a/drivers/hid/hid-apple.c -+++ b/drivers/hid/hid-apple.c -@@ -444,11 +444,16 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input, - else if (hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI && - hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) - table = macbookair_fn_keys; -- else if (hid->vendor == SPI_VENDOR_ID_APPLE && -- hid->product == SPI_DEVICE_ID_APPLE_MACBOOK_PRO13_2020) -- table = apple_fn_keys_mbp13; -- else if (hid->vendor == SPI_VENDOR_ID_APPLE) -- table = apple_fn_keys_spi; -+ else if (hid->bus == BUS_HOST || hid->bus == BUS_SPI) -+ switch (hid->product) { -+ case SPI_DEVICE_ID_APPLE_MACBOOK_PRO13_2020: -+ case HOST_DEVICE_ID_APPLE_MACBOOK_PRO13_2022: -+ table = apple_fn_keys_mbp13; -+ break; -+ default: -+ table = apple_fn_keys_spi; -+ break; -+ } - else if (hid->product < 0x21d || hid->product >= 0x300) - table = powerbook_fn_keys; - else -@@ -834,7 +839,7 @@ static int apple_probe(struct hid_device *hdev, - struct apple_sc *asc; - int ret; - -- if (id->bus == BUS_SPI && id->vendor == SPI_VENDOR_ID_APPLE && -+ if ((id->bus == BUS_SPI || id->bus == BUS_HOST) && id->vendor == SPI_VENDOR_ID_APPLE && - hdev->type != HID_TYPE_SPI_KEYBOARD) - return -ENODEV; - -@@ -1081,6 +1086,8 @@ static const struct hid_device_id apple_devices[] = { - .driver_data = APPLE_HAS_FN | APPLE_ISO_TILDE_QUIRK }, - { HID_SPI_DEVICE(SPI_VENDOR_ID_APPLE, HID_ANY_ID), - .driver_data = APPLE_HAS_FN }, -+ { HID_DEVICE(BUS_HOST, HID_GROUP_ANY, HOST_VENDOR_ID_APPLE, -+ HID_ANY_ID), .driver_data = APPLE_HAS_FN }, - - { } - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0128-hid-magicmouse-Add-MTP-multi-touch-device-support.patch b/target/linux/silicon/patches-5.19/0128-hid-magicmouse-Add-MTP-multi-touch-device-support.patch deleted file mode 100644 index 3b65d726d..000000000 --- a/target/linux/silicon/patches-5.19/0128-hid-magicmouse-Add-MTP-multi-touch-device-support.patch +++ /dev/null @@ -1,174 +0,0 @@ -From 5624d8c356fe43797e45c28af6faddc425e307aa Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 8 Jul 2022 02:12:57 +0900 -Subject: [PATCH 128/171] hid: magicmouse: Add MTP multi-touch device support - -Apple M2 devices expose the multi-touch device over the HID over -DockChannel transport, which we represent as the HOST bus type. The -report format is the same, except the legacy mouse header is gone and -there is no enable request needed. - -Signed-off-by: Hector Martin ---- - drivers/hid/hid-magicmouse.c | 67 ++++++++++++++++++++++++++---------- - 1 file changed, 49 insertions(+), 18 deletions(-) - -diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c -index 65c4b6307ce9..a951e8a8f085 100644 ---- a/drivers/hid/hid-magicmouse.c -+++ b/drivers/hid/hid-magicmouse.c -@@ -59,6 +59,8 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie - #define MOUSE_REPORT_ID 0x29 - #define MOUSE2_REPORT_ID 0x12 - #define DOUBLE_REPORT_ID 0xf7 -+#define SPI_REPORT_ID 0x02 -+#define MTP_REPORT_ID 0x75 - #define USB_BATTERY_TIMEOUT_MS 60000 - - #define MAX_CONTACTS 16 -@@ -570,25 +572,32 @@ struct tp_finger { - } __attribute__((packed, aligned(2))); - - /** -- * struct trackpad report -+ * vendor trackpad report - * -- * @report_id: reportid -- * @buttons: HID Usage Buttons 3 1-bit reports - * @num_fingers: the number of fingers being reported in @fingers -- * @clicked: same as @buttons -+ * @buttons: same as HID buttons - */ - struct tp_header { -+ // HID vendor part, up to 1751 bytes -+ u8 unknown[22]; -+ u8 num_fingers; -+ u8 buttons; -+ u8 unknown3[14]; -+}; -+ -+/** -+ * standard HID mouse report -+ * -+ * @report_id: reportid -+ * @buttons: HID Usage Buttons 3 1-bit reports -+ */ -+struct tp_mouse_report { - // HID mouse report - u8 report_id; - u8 buttons; - u8 rel_x; - u8 rel_y; - u8 padding[4]; -- // HID vendor part, up to 1751 bytes -- u8 unknown[22]; -- u8 num_fingers; -- u8 clicked; -- u8 unknown3[14]; - }; - - static inline int le16_to_int(__le16 x) -@@ -618,7 +627,7 @@ static void report_finger_data(struct input_dev *input, int slot, - input_report_abs(input, ABS_MT_POSITION_Y, pos->y); - } - --static int magicmouse_raw_event_spi(struct hid_device *hdev, -+static int magicmouse_raw_event_mtp(struct hid_device *hdev, - struct hid_report *report, u8 *data, int size) - { - struct magicmouse_sc *msc = hid_get_drvdata(hdev); -@@ -635,9 +644,6 @@ static int magicmouse_raw_event_spi(struct hid_device *hdev, - // print_hex_dump_debug("appleft ev: ", DUMP_PREFIX_OFFSET, 16, 1, data, - // size, false); - -- if (data[0] != TRACKPAD2_USB_REPORT_ID) -- return 0; -- - /* Expect 46 bytes of prefix, and N * 30 bytes of touch data. */ - if (size < hdr_sz || ((size - hdr_sz) % touch_sz) != 0) - return 0; -@@ -676,12 +682,26 @@ static int magicmouse_raw_event_spi(struct hid_device *hdev, - } - - input_mt_sync_frame(input); -- input_report_key(input, BTN_MOUSE, data[1] & 1); -+ input_report_key(input, BTN_MOUSE, tp_hdr->buttons & 1); - - input_sync(input); - return 1; - } - -+static int magicmouse_raw_event_spi(struct hid_device *hdev, -+ struct hid_report *report, u8 *data, int size) -+{ -+ const size_t hdr_sz = sizeof(struct tp_mouse_report); -+ -+ if (size < hdr_sz) -+ return 0; -+ -+ if (data[0] != TRACKPAD2_USB_REPORT_ID) -+ return 0; -+ -+ return magicmouse_raw_event_mtp(hdev, report, data + hdr_sz, size - hdr_sz); -+} -+ - static int magicmouse_event(struct hid_device *hdev, struct hid_field *field, - struct hid_usage *usage, __s32 value) - { -@@ -1066,7 +1086,7 @@ static int magicmouse_probe(struct hid_device *hdev, - struct hid_report *report; - int ret; - -- if (id->bus == BUS_SPI && id->vendor == SPI_VENDOR_ID_APPLE && -+ if ((id->bus == BUS_SPI || id->bus == BUS_HOST) && id->vendor == SPI_VENDOR_ID_APPLE && - hdev->type != HID_TYPE_SPI_MOUSE) - return -ENODEV; - -@@ -1078,7 +1098,10 @@ static int magicmouse_probe(struct hid_device *hdev, - - // internal trackpad use a data format use input ops to avoid - // conflicts with the report ID. -- if (id->vendor == SPI_VENDOR_ID_APPLE) { -+ if (id->bus == BUS_HOST) { -+ msc->input_ops.raw_event = magicmouse_raw_event_mtp; -+ msc->input_ops.setup_input = magicmouse_setup_input_spi; -+ } else if (id->bus == BUS_SPI) { - msc->input_ops.raw_event = magicmouse_raw_event_spi; - msc->input_ops.setup_input = magicmouse_setup_input_spi; - -@@ -1135,8 +1158,10 @@ static int magicmouse_probe(struct hid_device *hdev, - else /* USB_VENDOR_ID_APPLE */ - report = hid_register_report(hdev, HID_INPUT_REPORT, - TRACKPAD2_USB_REPORT_ID, 0); -- } else if (id->vendor == SPI_VENDOR_ID_APPLE) { -- report = hid_register_report(hdev, HID_INPUT_REPORT, 2, 0); -+ } else if (id->bus == BUS_SPI) { -+ report = hid_register_report(hdev, HID_INPUT_REPORT, SPI_REPORT_ID, 0); -+ } else if (id->bus == BUS_HOST) { -+ report = hid_register_report(hdev, HID_INPUT_REPORT, MTP_REPORT_ID, 0); - } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */ - report = hid_register_report(hdev, HID_INPUT_REPORT, - TRACKPAD_REPORT_ID, 0); -@@ -1151,6 +1176,10 @@ static int magicmouse_probe(struct hid_device *hdev, - } - report->size = 6; - -+ /* MTP devices do not need the MT enable, this is handled by the MTP driver */ -+ if (id->bus == BUS_HOST) -+ return 0; -+ - /* - * Some devices repond with 'invalid report id' when feature - * report switching it into multitouch mode is sent to it. -@@ -1233,6 +1262,8 @@ static const struct hid_device_id magic_mice[] = { - USB_DEVICE_ID_APPLE_MAGICTRACKPAD2), .driver_data = 0 }, - { HID_SPI_DEVICE(SPI_VENDOR_ID_APPLE, HID_ANY_ID), - .driver_data = 0 }, -+ { HID_DEVICE(BUS_HOST, HID_GROUP_ANY, HOST_VENDOR_ID_APPLE, -+ HID_ANY_ID), .driver_data = 0 }, - { } - }; - MODULE_DEVICE_TABLE(hid, magic_mice); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0129-soc-apple-Add-DockChannel-driver.patch b/target/linux/silicon/patches-5.19/0129-soc-apple-Add-DockChannel-driver.patch deleted file mode 100644 index e8e17d572..000000000 --- a/target/linux/silicon/patches-5.19/0129-soc-apple-Add-DockChannel-driver.patch +++ /dev/null @@ -1,501 +0,0 @@ -From ffeb65333caa066616ee70e0257035fe99cf4205 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 8 Jul 2022 02:09:24 +0900 -Subject: [PATCH 129/171] soc: apple: Add DockChannel driver - -DockChannel is a simple FIFO interface used to communicate between SoC -blocks. Add a driver that represents the shared interrupt controller for -the DockChannel block, and then exposes probe and data transfer -functions that child device drivers can use to instantiate individual -FIFOs. - -Signed-off-by: Hector Martin ---- - drivers/soc/apple/Kconfig | 10 + - drivers/soc/apple/Makefile | 3 + - drivers/soc/apple/dockchannel.c | 407 ++++++++++++++++++++++++++ - include/linux/soc/apple/dockchannel.h | 26 ++ - 4 files changed, 446 insertions(+) - create mode 100644 drivers/soc/apple/dockchannel.c - create mode 100644 include/linux/soc/apple/dockchannel.h - -diff --git a/drivers/soc/apple/Kconfig b/drivers/soc/apple/Kconfig -index a1596fefacff..9e93df0ac825 100644 ---- a/drivers/soc/apple/Kconfig -+++ b/drivers/soc/apple/Kconfig -@@ -41,6 +41,16 @@ config APPLE_SART - - Say 'y' here if you have an Apple SoC. - -+config APPLE_DOCKCHANNEL -+ tristate "Apple DockChannel FIFO" -+ depends on ARCH_APPLE || COMPILE_TEST -+ default ARCH_APPLE -+ help -+ DockChannel is a simple FIFO used on Apple SoCs for debug and inter-processor -+ communications. -+ -+ Say 'y' here if you have an Apple SoC. -+ - endmenu - - endif -diff --git a/drivers/soc/apple/Makefile b/drivers/soc/apple/Makefile -index e293770cf66d..aa4203e02462 100644 ---- a/drivers/soc/apple/Makefile -+++ b/drivers/soc/apple/Makefile -@@ -6,3 +6,6 @@ apple-rtkit-y = rtkit.o rtkit-crashlog.o - - obj-$(CONFIG_APPLE_SART) += apple-sart.o - apple-sart-y = sart.o -+ -+obj-$(CONFIG_APPLE_DOCKCHANNEL) += apple-dockchannel.o -+apple-dockchannel-y = dockchannel.o -diff --git a/drivers/soc/apple/dockchannel.c b/drivers/soc/apple/dockchannel.c -new file mode 100644 -index 000000000000..c21ef7545e17 ---- /dev/null -+++ b/drivers/soc/apple/dockchannel.c -@@ -0,0 +1,407 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple DockChannel FIFO driver -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define DOCKCHANNEL_MAX_IRQ 32 -+ -+#define DOCKCHANNEL_TX_TIMEOUT_MS 1000 -+#define DOCKCHANNEL_RX_TIMEOUT_MS 1000 -+ -+#define IRQ_MASK 0x0 -+#define IRQ_FLAG 0x4 -+ -+#define IRQ_TX BIT(0) -+#define IRQ_RX BIT(1) -+ -+#define CONFIG_TX_THRESH 0x0 -+#define CONFIG_RX_THRESH 0x4 -+ -+#define DATA_TX8 0x4 -+#define DATA_TX16 0x8 -+#define DATA_TX24 0xc -+#define DATA_TX32 0x10 -+#define DATA_TX_FREE 0x14 -+#define DATA_RX8 0x1c -+#define DATA_RX16 0x20 -+#define DATA_RX24 0x24 -+#define DATA_RX32 0x28 -+#define DATA_RX_COUNT 0x2c -+ -+struct dockchannel { -+ struct device *dev; -+ int tx_irq; -+ int rx_irq; -+ -+ void __iomem *config_base; -+ void __iomem *data_base; -+ -+ u32 fifo_size; -+ bool awaiting; -+ struct completion tx_comp; -+ struct completion rx_comp; -+ -+ void *cookie; -+ void (*data_available)(void *cookie, size_t avail); -+}; -+ -+struct dockchannel_common { -+ struct device *dev; -+ struct irq_domain *domain; -+ int irq; -+ -+ void __iomem *irq_base; -+}; -+ -+/* Dockchannel FIFO functions */ -+ -+static irqreturn_t dockchannel_tx_irq(int irq, void *data) -+{ -+ struct dockchannel *dockchannel = data; -+ -+ disable_irq_nosync(irq); -+ complete(&dockchannel->tx_comp); -+ -+ return IRQ_HANDLED; -+} -+ -+static irqreturn_t dockchannel_rx_irq(int irq, void *data) -+{ -+ struct dockchannel *dockchannel = data; -+ -+ disable_irq_nosync(irq); -+ -+ if (dockchannel->awaiting) { -+ return IRQ_WAKE_THREAD; -+ } else { -+ complete(&dockchannel->rx_comp); -+ return IRQ_HANDLED; -+ } -+} -+ -+static irqreturn_t dockchannel_rx_irq_thread(int irq, void *data) -+{ -+ struct dockchannel *dockchannel = data; -+ size_t avail = readl_relaxed(dockchannel->data_base + DATA_RX_COUNT); -+ -+ dockchannel->awaiting = false; -+ dockchannel->data_available(dockchannel->cookie, avail); -+ -+ return IRQ_HANDLED; -+} -+ -+int dockchannel_send(struct dockchannel *dockchannel, const void *buf, size_t count) -+{ -+ size_t left = count; -+ const u8 *p = buf; -+ -+ while (left > 0) { -+ size_t avail = readl_relaxed(dockchannel->data_base + DATA_TX_FREE); -+ size_t block = min(left, avail); -+ -+ if (avail == 0) { -+ size_t threshold = min((size_t)(dockchannel->fifo_size / 2), left); -+ -+ writel_relaxed(threshold, dockchannel->config_base + CONFIG_TX_THRESH); -+ reinit_completion(&dockchannel->tx_comp); -+ enable_irq(dockchannel->tx_irq); -+ -+ if (!wait_for_completion_timeout(&dockchannel->tx_comp, -+ msecs_to_jiffies(DOCKCHANNEL_TX_TIMEOUT_MS))) { -+ disable_irq(dockchannel->tx_irq); -+ return -ETIMEDOUT; -+ } -+ -+ continue; -+ } -+ -+ while (block >= 4) { -+ writel_relaxed(get_unaligned_le32(p), dockchannel->data_base + DATA_TX32); -+ p += 4; -+ left -= 4; -+ block -= 4; -+ } -+ while (block > 0) { -+ writeb_relaxed(*p++, dockchannel->data_base + DATA_TX8); -+ left--; -+ block--; -+ } -+ } -+ -+ return count; -+} -+EXPORT_SYMBOL(dockchannel_send); -+ -+int dockchannel_recv(struct dockchannel *dockchannel, void *buf, size_t count) -+{ -+ size_t left = count; -+ u8 *p = buf; -+ -+ while (left > 0) { -+ size_t avail = readl_relaxed(dockchannel->data_base + DATA_RX_COUNT); -+ size_t block = min(left, avail); -+ -+ if (avail == 0) { -+ size_t threshold = min((size_t)(dockchannel->fifo_size / 2), left); -+ -+ writel_relaxed(threshold, dockchannel->config_base + CONFIG_RX_THRESH); -+ reinit_completion(&dockchannel->rx_comp); -+ enable_irq(dockchannel->rx_irq); -+ -+ if (!wait_for_completion_timeout(&dockchannel->rx_comp, -+ msecs_to_jiffies(DOCKCHANNEL_RX_TIMEOUT_MS))) { -+ disable_irq(dockchannel->rx_irq); -+ return -ETIMEDOUT; -+ } -+ -+ continue; -+ } -+ -+ while (block >= 4) { -+ put_unaligned_le32(readl_relaxed(dockchannel->data_base + DATA_RX32), p); -+ p += 4; -+ left -= 4; -+ block -= 4; -+ } -+ while (block > 0) { -+ *p++ = readl_relaxed(dockchannel->data_base + DATA_RX8) >> 8; -+ left--; -+ block--; -+ } -+ } -+ -+ return count; -+} -+EXPORT_SYMBOL(dockchannel_recv); -+ -+int dockchannel_await(struct dockchannel *dockchannel, -+ void (*callback)(void *cookie, size_t avail), -+ void *cookie, size_t count) -+{ -+ size_t threshold = min((size_t)dockchannel->fifo_size, count); -+ -+ if (!count) { -+ dockchannel->awaiting = false; -+ disable_irq(dockchannel->rx_irq); -+ return 0; -+ } -+ -+ dockchannel->data_available = callback; -+ dockchannel->cookie = cookie; -+ dockchannel->awaiting = true; -+ writel_relaxed(threshold, dockchannel->config_base + CONFIG_RX_THRESH); -+ enable_irq(dockchannel->rx_irq); -+ -+ return threshold; -+} -+EXPORT_SYMBOL(dockchannel_await); -+ -+struct dockchannel *dockchannel_init(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct dockchannel *dockchannel; -+ int ret; -+ -+ dockchannel = devm_kzalloc(dev, sizeof(*dockchannel), GFP_KERNEL); -+ if (!dockchannel) -+ return ERR_PTR(-ENOMEM); -+ -+ dockchannel->dev = dev; -+ dockchannel->config_base = devm_platform_ioremap_resource_byname(pdev, "config"); -+ if (IS_ERR(dockchannel->config_base)) -+ return (void *)dockchannel->config_base; -+ -+ dockchannel->data_base = devm_platform_ioremap_resource_byname(pdev, "data"); -+ if (IS_ERR(dockchannel->data_base)) -+ return (void *)dockchannel->data_base; -+ -+ ret = of_property_read_u32(dev->of_node, "apple,fifo-size", &dockchannel->fifo_size); -+ if (ret) -+ return ERR_PTR(dev_err_probe(dev, ret, "Missing apple,fifo-size property")); -+ -+ init_completion(&dockchannel->tx_comp); -+ init_completion(&dockchannel->rx_comp); -+ -+ dockchannel->tx_irq = platform_get_irq_byname(pdev, "tx"); -+ if (dockchannel->tx_irq <= 0) { -+ return ERR_PTR(dev_err_probe(dev, dockchannel->tx_irq, -+ "Failed to get TX IRQ")); -+ } -+ -+ dockchannel->rx_irq = platform_get_irq_byname(pdev, "rx"); -+ if (dockchannel->rx_irq <= 0) { -+ return ERR_PTR(dev_err_probe(dev, dockchannel->rx_irq, -+ "Failed to get RX IRQ")); -+ } -+ -+ ret = devm_request_irq(dev, dockchannel->tx_irq, dockchannel_tx_irq, IRQF_NO_AUTOEN, -+ "apple-dockchannel-tx", dockchannel); -+ if (ret) -+ return ERR_PTR(dev_err_probe(dev, ret, "Failed to request TX IRQ")); -+ -+ ret = devm_request_threaded_irq(dev, dockchannel->rx_irq, dockchannel_rx_irq, -+ dockchannel_rx_irq_thread, IRQF_NO_AUTOEN, -+ "apple-dockchannel-rx", dockchannel); -+ if (ret) -+ return ERR_PTR(dev_err_probe(dev, ret, "Failed to request RX IRQ")); -+ -+ return dockchannel; -+} -+EXPORT_SYMBOL(dockchannel_init); -+ -+ -+/* Dockchannel IRQchip */ -+ -+static void dockchannel_irq(struct irq_desc *desc) -+{ -+ unsigned int irq = irq_desc_get_irq(desc); -+ struct irq_chip *chip = irq_desc_get_chip(desc); -+ struct dockchannel_common *dcc = irq_get_handler_data(irq); -+ unsigned long flags = readl_relaxed(dcc->irq_base + IRQ_FLAG); -+ int bit; -+ -+ chained_irq_enter(chip, desc); -+ -+ for_each_set_bit(bit, &flags, DOCKCHANNEL_MAX_IRQ) -+ generic_handle_domain_irq(dcc->domain, bit); -+ -+ chained_irq_exit(chip, desc); -+} -+ -+static void dockchannel_irq_ack(struct irq_data *data) -+{ -+ struct dockchannel_common *dcc = irq_data_get_irq_chip_data(data); -+ unsigned int hwirq = data->hwirq; -+ -+ writel_relaxed(BIT(hwirq), dcc->irq_base + IRQ_FLAG); -+} -+ -+static void dockchannel_irq_mask(struct irq_data *data) -+{ -+ struct dockchannel_common *dcc = irq_data_get_irq_chip_data(data); -+ unsigned int hwirq = data->hwirq; -+ u32 val = readl_relaxed(dcc->irq_base + IRQ_MASK); -+ -+ writel_relaxed(val & ~BIT(hwirq), dcc->irq_base + IRQ_MASK); -+} -+ -+static void dockchannel_irq_unmask(struct irq_data *data) -+{ -+ struct dockchannel_common *dcc = irq_data_get_irq_chip_data(data); -+ unsigned int hwirq = data->hwirq; -+ u32 val = readl_relaxed(dcc->irq_base + IRQ_MASK); -+ -+ writel_relaxed(val | BIT(hwirq), dcc->irq_base + IRQ_MASK); -+} -+ -+static const struct irq_chip dockchannel_irqchip = { -+ .name = "dockchannel-irqc", -+ .irq_ack = dockchannel_irq_ack, -+ .irq_mask = dockchannel_irq_mask, -+ .irq_unmask = dockchannel_irq_unmask, -+}; -+ -+static int dockchannel_irq_domain_map(struct irq_domain *d, unsigned int virq, -+ irq_hw_number_t hw) -+{ -+ irq_set_chip_data(virq, d->host_data); -+ irq_set_chip_and_handler(virq, &dockchannel_irqchip, handle_level_irq); -+ -+ return 0; -+} -+ -+static const struct irq_domain_ops dockchannel_irq_domain_ops = { -+ .xlate = irq_domain_xlate_twocell, -+ .map = dockchannel_irq_domain_map, -+}; -+ -+static int dockchannel_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct dockchannel_common *dcc; -+ struct device_node *child; -+ -+ dcc = devm_kzalloc(dev, sizeof(*dcc), GFP_KERNEL); -+ if (!dcc) -+ return -ENOMEM; -+ -+ dcc->dev = dev; -+ platform_set_drvdata(pdev, dcc); -+ -+ dcc->irq_base = devm_platform_ioremap_resource_byname(pdev, "irq"); -+ if (IS_ERR(dcc->irq_base)) -+ return PTR_ERR(dcc->irq_base); -+ -+ writel_relaxed(0, dcc->irq_base + IRQ_MASK); -+ writel_relaxed(~0, dcc->irq_base + IRQ_FLAG); -+ -+ dcc->domain = irq_domain_add_linear(dev->of_node, DOCKCHANNEL_MAX_IRQ, -+ &dockchannel_irq_domain_ops, dcc); -+ if (!dcc->domain) -+ return -ENOMEM; -+ -+ dcc->irq = platform_get_irq(pdev, 0); -+ if (dcc->irq <= 0) -+ return dev_err_probe(dev, dcc->irq, "Failed to get IRQ"); -+ -+ irq_set_handler_data(dcc->irq, dcc); -+ irq_set_chained_handler(dcc->irq, dockchannel_irq); -+ -+ for_each_child_of_node(dev->of_node, child) -+ of_platform_device_create(child, NULL, dev); -+ -+ return 0; -+} -+ -+static int dockchannel_remove(struct platform_device *pdev) -+{ -+ struct dockchannel_common *dcc = platform_get_drvdata(pdev); -+ int hwirq; -+ -+ device_for_each_child(&pdev->dev, NULL, of_platform_device_destroy); -+ -+ irq_set_chained_handler_and_data(dcc->irq, NULL, NULL); -+ -+ for (hwirq = 0; hwirq < DOCKCHANNEL_MAX_IRQ; hwirq++) -+ irq_dispose_mapping(irq_find_mapping(dcc->domain, hwirq)); -+ -+ irq_domain_remove(dcc->domain); -+ -+ writel_relaxed(0, dcc->irq_base + IRQ_MASK); -+ writel_relaxed(~0, dcc->irq_base + IRQ_FLAG); -+ -+ return 0; -+} -+ -+static const struct of_device_id dockchannel_of_match[] = { -+ { .compatible = "apple,dockchannel" }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(of, dockchannel_of_match); -+ -+static struct platform_driver dockchannel_driver = { -+ .driver = { -+ .name = "dockchannel", -+ .of_match_table = dockchannel_of_match, -+ }, -+ .probe = dockchannel_probe, -+ .remove = dockchannel_remove, -+}; -+module_platform_driver(dockchannel_driver); -+ -+MODULE_AUTHOR("Hector Martin "); -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_DESCRIPTION("Apple DockChannel driver"); -diff --git a/include/linux/soc/apple/dockchannel.h b/include/linux/soc/apple/dockchannel.h -new file mode 100644 -index 000000000000..0b7093935ddf ---- /dev/null -+++ b/include/linux/soc/apple/dockchannel.h -@@ -0,0 +1,26 @@ -+/* SPDX-License-Identifier: GPL-2.0-only OR MIT */ -+/* -+ * Apple Dockchannel devices -+ * Copyright (C) The Asahi Linux Contributors -+ */ -+#ifndef _LINUX_APPLE_DOCKCHANNEL_H_ -+#define _LINUX_APPLE_DOCKCHANNEL_H_ -+ -+#include -+#include -+#include -+ -+#if IS_ENABLED(CONFIG_APPLE_DOCKCHANNEL) -+ -+struct dockchannel; -+ -+struct dockchannel *dockchannel_init(struct platform_device *pdev); -+ -+int dockchannel_send(struct dockchannel *dockchannel, const void *buf, size_t count); -+int dockchannel_recv(struct dockchannel *dockchannel, void *buf, size_t count); -+int dockchannel_await(struct dockchannel *dockchannel, -+ void (*callback)(void *cookie, size_t avail), -+ void *cookie, size_t count); -+ -+#endif -+#endif --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0130-hid-Add-Apple-DockChannel-HID-transport-driver.patch b/target/linux/silicon/patches-5.19/0130-hid-Add-Apple-DockChannel-HID-transport-driver.patch deleted file mode 100644 index a764b3eaa..000000000 --- a/target/linux/silicon/patches-5.19/0130-hid-Add-Apple-DockChannel-HID-transport-driver.patch +++ /dev/null @@ -1,1142 +0,0 @@ -From 55af457be82d0853857bab148c649a328aa58ffa Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 8 Jul 2022 02:11:21 +0900 -Subject: [PATCH 130/171] hid: Add Apple DockChannel HID transport driver - -Apple M2 devices have an MTP coprocessor embedded in the SoC that -handles HID for the integrated touchpad/keyboard, and communicates -over the DockChannel interface. This driver implements this new -interface. - -Signed-off-by: Hector Martin ---- - drivers/hid/Kconfig | 2 + - drivers/hid/Makefile | 2 + - drivers/hid/dockchannel-hid/Kconfig | 14 + - drivers/hid/dockchannel-hid/Makefile | 6 + - drivers/hid/dockchannel-hid/dockchannel-hid.c | 1058 +++++++++++++++++ - 5 files changed, 1082 insertions(+) - create mode 100644 drivers/hid/dockchannel-hid/Kconfig - create mode 100644 drivers/hid/dockchannel-hid/Makefile - create mode 100644 drivers/hid/dockchannel-hid/dockchannel-hid.c - -diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig -index 1dd6697e7c59..bd47caba1413 100644 ---- a/drivers/hid/Kconfig -+++ b/drivers/hid/Kconfig -@@ -1324,4 +1324,6 @@ source "drivers/hid/surface-hid/Kconfig" - - source "drivers/hid/spi-hid/Kconfig" - -+source "drivers/hid/dockchannel-hid/Kconfig" -+ - endmenu -diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile -index a720e68fe1d7..2c90409d515c 100644 ---- a/drivers/hid/Makefile -+++ b/drivers/hid/Makefile -@@ -158,3 +158,5 @@ obj-$(CONFIG_AMD_SFH_HID) += amd-sfh-hid/ - obj-$(CONFIG_SURFACE_HID_CORE) += surface-hid/ - - obj-$(CONFIG_SPI_HID_APPLE_CORE) += spi-hid/ -+ -+obj-$(CONFIG_HID_DOCKCHANNEL) += dockchannel-hid/ -diff --git a/drivers/hid/dockchannel-hid/Kconfig b/drivers/hid/dockchannel-hid/Kconfig -new file mode 100644 -index 000000000000..8a81d551a83d ---- /dev/null -+++ b/drivers/hid/dockchannel-hid/Kconfig -@@ -0,0 +1,14 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR MIT -+menu "DockChannel HID support" -+ depends on APPLE_DOCKCHANNEL -+ -+config HID_DOCKCHANNEL -+ tristate "HID over DockChannel transport layer for Apple Silicon SoCs" -+ default ARCH_APPLE -+ depends on APPLE_DOCKCHANNEL && INPUT && OF && HID -+ help -+ Say Y here if you use an M2 or later Apple Silicon based laptop. -+ The keyboard and touchpad are HID based devices connected via the -+ proprietary DockChannel interface. -+ -+endmenu -diff --git a/drivers/hid/dockchannel-hid/Makefile b/drivers/hid/dockchannel-hid/Makefile -new file mode 100644 -index 000000000000..7dba766b047f ---- /dev/null -+++ b/drivers/hid/dockchannel-hid/Makefile -@@ -0,0 +1,6 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR MIT -+# -+# Makefile for DockChannel HID transport drivers -+# -+ -+obj-$(CONFIG_HID_DOCKCHANNEL) += dockchannel-hid.o -diff --git a/drivers/hid/dockchannel-hid/dockchannel-hid.c b/drivers/hid/dockchannel-hid/dockchannel-hid.c -new file mode 100644 -index 000000000000..aaa7d357c6fa ---- /dev/null -+++ b/drivers/hid/dockchannel-hid/dockchannel-hid.c -@@ -0,0 +1,1058 @@ -+/* -+ * SPDX-License-Identifier: GPL-2.0 OR MIT -+ * -+ * Apple DockChannel HID transport driver -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "../hid-ids.h" -+ -+#define COMMAND_TIMEOUT 1000 -+ -+#define MAX_INTERFACES 16 -+ -+/* Data + checksum */ -+#define MAX_PKT_SIZE (0xffff + 4) -+ -+#define DCHID_CHANNEL_CMD 0x11 -+#define DCHID_CHANNEL_REPORT 0x12 -+ -+struct dchid_hdr { -+ u8 hdr_len; -+ u8 channel; -+ __le16 length; -+ u8 seq; -+ u8 iface; -+ __le16 pad; -+} __packed; -+ -+#define IFACE_COMM 0 -+ -+#define FLAGS_GROUP GENMASK(7, 6) -+#define FLAGS_REQ GENMASK(5, 0) -+ -+#define GROUP_INPUT 0 -+#define GROUP_OUTPUT 1 -+#define GROUP_CMD 2 -+ -+#define REQ_SET_REPORT 0 -+#define REQ_GET_REPORT 1 -+ -+struct dchid_subhdr { -+ u8 flags; -+ u8 unk; -+ __le16 length; -+ __le32 retcode; -+} __packed; -+ -+#define EVENT_GPIO_CMD 0xa0 -+#define EVENT_INIT 0xf0 -+#define EVENT_READY 0xf1 -+ -+struct dchid_init_hdr { -+ u8 type; -+ u8 unk1; -+ u8 unk2; -+ u8 iface; -+ char name[16]; -+} __packed; -+ -+#define INIT_HID_DESCRIPTOR 0 -+#define INIT_GPIO_REQUEST 1 -+#define INIT_TERMINATOR 2 -+ -+#define CMD_RESET_INTERFACE 0x40 -+#define CMD_SEND_FIRMWARE 0x95 -+#define CMD_ENABLE_INTERFACE 0xb4 -+#define CMD_ACK_GPIO_CMD 0xa1 -+ -+struct dchid_init_block_hdr { -+ __le16 type; -+ __le16 subtype; -+ __le16 length; -+} __packed; -+ -+#define MAX_GPIO_NAME 32 -+ -+struct dchid_gpio_request { -+ __le16 unk; -+ __le16 id; -+ char name[MAX_GPIO_NAME]; -+} __packed; -+ -+struct dchid_gpio_cmd { -+ u8 type; -+ u8 iface; -+ u8 gpio; -+ u8 unk; -+ u8 cmd; -+} __packed; -+ -+struct dchid_gpio_ack { -+ u8 type; -+ __le32 retcode; -+ u8 cmd[]; -+} __packed; -+ -+#define STM_REPORT_ID 0x10 -+#define STM_REPORT_SERIAL 0x11 -+#define STM_REPORT_KEYBTYPE 0x14 -+ -+#define KEYBOARD_TYPE_ANSI 0 -+#define KEYBOARD_TYPE_ISO 1 -+#define KEYBOARD_TYPE_JIS 2 -+ -+struct dchid_stm_id { -+ u8 unk; -+ __le16 vendor_id; -+ __le16 product_id; -+ __le16 version_number; -+ u8 unk2; -+ u8 unk3; -+ u8 keyboard_type; -+ u8 serial_length; -+ /* Serial follows, but we grab it with a different report. */ -+} __packed; -+ -+#define FW_MAGIC 0x46444948 -+#define FW_VER 1 -+ -+struct fw_header { -+ __le32 magic; -+ __le32 version; -+ __le32 hdr_length; -+ __le32 data_length; -+ __le32 iface_offset; -+} __packed; -+ -+struct dchid_work { -+ struct work_struct work; -+ struct dchid_iface *iface; -+ -+ struct dchid_hdr hdr; -+ u8 data[]; -+}; -+ -+struct dchid_iface { -+ struct dockchannel_hid *dchid; -+ struct hid_device *hid; -+ -+ int index; -+ const char *name; -+ const struct device_node *of_node; -+ -+ uint8_t tx_seq; -+ uint8_t rx_seq; -+ bool deferred; -+ bool open; -+ -+ void *hid_desc; -+ size_t hid_desc_len; -+ -+ struct gpio_desc *gpio; -+ int gpio_id; -+ -+ struct mutex out_mutex; -+ u32 out_flags; -+ int out_report; -+ u32 retcode; -+ void *resp_buf; -+ size_t resp_size; -+ struct completion out_complete; -+}; -+ -+struct dockchannel_hid { -+ struct device *dev; -+ struct dockchannel *dc; -+ -+ bool id_ready; -+ struct dchid_stm_id device_id; -+ char serial[64]; -+ -+ struct dchid_iface *comm; -+ struct dchid_iface *ifaces[MAX_INTERFACES]; -+ -+ u8 pkt_buf[MAX_PKT_SIZE]; -+ -+ struct workqueue_struct *wq; -+}; -+ -+static struct dchid_iface * -+dchid_get_interface(struct dockchannel_hid *dchid, int index, const char *name) -+{ -+ struct dchid_iface *iface; -+ -+ if (index >= MAX_INTERFACES) { -+ dev_err(dchid->dev, "Interface index %d out of range\n", index); -+ return NULL; -+ } -+ -+ if (dchid->ifaces[index]) -+ return dchid->ifaces[index]; -+ -+ iface = devm_kzalloc(dchid->dev, sizeof(struct dchid_iface), GFP_KERNEL); -+ if (!iface) -+ return NULL; -+ -+ iface->index = index; -+ iface->name = devm_kstrdup(dchid->dev, name, GFP_KERNEL); -+ iface->dchid = dchid; -+ iface->out_report= -1; -+ init_completion(&iface->out_complete); -+ mutex_init(&iface->out_mutex); -+ -+ dev_info(dchid->dev, "Initializing interface %s\n", iface->name); -+ -+ /* Comm is not a HID subdevice */ -+ if (!strcmp(name, "comm")) { -+ dchid->ifaces[index] = iface; -+ return iface; -+ } -+ -+ iface->of_node = of_get_child_by_name(dchid->dev->of_node, name); -+ if (!iface->of_node) { -+ dev_warn(dchid->dev, "No OF node for subdevice %s, ignoring.", name); -+ return NULL; -+ } -+ -+ dchid->ifaces[index] = iface; -+ return iface; -+} -+ -+static u32 dchid_checksum(void *p, size_t length) -+{ -+ u32 sum = 0; -+ -+ while (length >= 4) { -+ sum += get_unaligned_le32(p); -+ p += 4; -+ length -= 4; -+ } -+ -+ WARN_ON_ONCE(length); -+ return sum; -+} -+ -+static int dchid_send(struct dchid_iface *iface, u32 flags, void *msg, size_t size) -+{ -+ u32 checksum = 0xffffffff; -+ size_t wsize = round_down(size, 4); -+ size_t tsize = size - wsize; -+ int ret; -+ struct { -+ struct dchid_hdr hdr; -+ struct dchid_subhdr sub; -+ } __packed h; -+ -+ memset(&h, 0, sizeof(h)); -+ h.hdr.hdr_len = sizeof(h.hdr); -+ h.hdr.channel = DCHID_CHANNEL_CMD; -+ h.hdr.length = round_up(size, 4) + sizeof(h.sub); -+ h.hdr.seq = iface->tx_seq; -+ h.hdr.iface = iface->index; -+ h.sub.flags = flags; -+ h.sub.length = size; -+ -+ ret = dockchannel_send(iface->dchid->dc, &h, sizeof(h)); -+ if (ret < 0) -+ return ret; -+ checksum -= dchid_checksum(&h, sizeof(h)); -+ -+ ret = dockchannel_send(iface->dchid->dc, msg, wsize); -+ if (ret < 0) -+ return ret; -+ checksum -= dchid_checksum(msg, wsize); -+ -+ if (tsize) { -+ u8 tail[4] = {0, 0, 0, 0}; -+ -+ memcpy(tail, msg + wsize, tsize); -+ ret = dockchannel_send(iface->dchid->dc, tail, sizeof(tail)); -+ if (ret < 0) -+ return ret; -+ checksum -= dchid_checksum(tail, sizeof(tail)); -+ } -+ -+ ret = dockchannel_send(iface->dchid->dc, &checksum, sizeof(checksum)); -+ if (ret < 0) -+ return ret; -+ -+ return 0; -+} -+ -+static int dchid_cmd(struct dchid_iface *iface, u32 type, u32 req, -+ void *data, size_t size, void *resp_buf, size_t resp_size) -+{ -+ int ret; -+ int report_id = *(u8*)data; -+ -+ mutex_lock(&iface->out_mutex); -+ -+ WARN_ON(iface->out_report != -1); -+ iface->out_report = report_id; -+ iface->out_flags = FIELD_PREP(FLAGS_GROUP, type) | FIELD_PREP(FLAGS_REQ, req); -+ iface->resp_buf = resp_buf; -+ iface->resp_size = resp_size; -+ reinit_completion(&iface->out_complete); -+ -+ ret = dchid_send(iface, iface->out_flags, data, size); -+ if (ret < 0) -+ goto done; -+ -+ if (!wait_for_completion_timeout(&iface->out_complete, msecs_to_jiffies(1000))) { -+ dev_err(iface->dchid->dev, "output report 0x%x to iface %d (%s) timed out\n", -+ report_id, iface->index, iface->name); -+ ret = -ETIMEDOUT; -+ goto done; -+ } -+ -+ ret = iface->resp_size; -+ if (iface->retcode) { -+ dev_err(iface->dchid->dev, -+ "output report 0x%x to iface %d (%s) failed with err 0x%x\n", -+ report_id, iface->index, iface->name, iface->retcode); -+ ret = -EIO; -+ } -+ -+done: -+ iface->tx_seq++; -+ iface->out_report = -1; -+ iface->out_flags = 0; -+ iface->resp_buf = NULL; -+ iface->resp_size = 0; -+ mutex_unlock(&iface->out_mutex); -+ return ret; -+} -+ -+static int dchid_comm_cmd(struct dockchannel_hid *dchid, void *cmd, size_t size) -+{ -+ return dchid_cmd(dchid->comm, GROUP_CMD, REQ_SET_REPORT, cmd, size, NULL, 0); -+} -+ -+static int dchid_enable_interface(struct dchid_iface *iface) -+{ -+ u8 msg[] = { CMD_ENABLE_INTERFACE, iface->index }; -+ -+ return dchid_comm_cmd(iface->dchid, msg, sizeof(msg)); -+} -+ -+static int dchid_reset_interface(struct dchid_iface *iface, int state) -+{ -+ u8 msg[] = { CMD_RESET_INTERFACE, 1, iface->index, state }; -+ -+ return dchid_comm_cmd(iface->dchid, msg, sizeof(msg)); -+} -+ -+static int dchid_send_firmware(struct dchid_iface *iface, void *firmware, size_t size) -+{ -+ struct { -+ u8 cmd; -+ u8 unk1; -+ u8 unk2; -+ u8 iface; -+ u64 addr; -+ u32 size; -+ } __packed msg = { -+ .cmd = CMD_SEND_FIRMWARE, -+ .unk1 = 2, -+ .unk2 = 0, -+ .iface = iface->index, -+ .size = size, -+ }; -+ dma_addr_t addr; -+ void *buf = dmam_alloc_coherent(iface->dchid->dev, size, &addr, GFP_KERNEL); -+ -+ if (IS_ERR_OR_NULL(buf)) -+ return buf ? PTR_ERR(buf) : -ENOMEM; -+ -+ msg.addr = addr; -+ memcpy(buf, firmware, size); -+ wmb(); -+ -+ return dchid_comm_cmd(iface->dchid, &msg, sizeof(msg)); -+} -+ -+static int dchid_get_firmware(struct dchid_iface *iface, void **firmware, size_t *size) -+{ -+ int ret; -+ const char *fw_name; -+ const struct firmware *fw; -+ struct fw_header *hdr; -+ u8 *fw_data; -+ -+ ret = of_property_read_string(iface->of_node, "firmware-name", &fw_name); -+ if (ret) { -+ /* Firmware is only for some devices */ -+ *firmware = NULL; -+ *size = 0; -+ return 0; -+ } -+ -+ ret = request_firmware(&fw, fw_name, iface->dchid->dev); -+ if (ret) -+ return ret; -+ -+ hdr = (struct fw_header *)fw->data; -+ -+ if (hdr->magic != FW_MAGIC || hdr->version != FW_VER || -+ hdr->hdr_length < sizeof(*hdr) || hdr->hdr_length > fw->size || -+ (hdr->hdr_length + (size_t)hdr->data_length) > fw->size || -+ hdr->iface_offset >= hdr->data_length) { -+ dev_warn(iface->dchid->dev, "%s: invalid firmware header\n", -+ fw_name); -+ ret = -EINVAL; -+ goto done; -+ } -+ -+ fw_data = devm_kmemdup(iface->dchid->dev, fw->data + hdr->hdr_length, -+ hdr->data_length, GFP_KERNEL); -+ if (!fw_data) { -+ ret = -ENOMEM; -+ goto done; -+ } -+ -+ if (hdr->iface_offset) -+ fw_data[hdr->iface_offset] = iface->index; -+ -+ *firmware = fw_data; -+ *size = hdr->data_length; -+ -+done: -+ release_firmware(fw); -+ return ret; -+} -+ -+ -+static int dchid_start(struct hid_device *hdev) -+{ -+ return 0; -+}; -+ -+static void dchid_stop(struct hid_device *hdev) -+{ -+ /* no-op, we don't know what the shutdown commands are, if any */ -+} -+ -+static int dchid_open(struct hid_device *hdev) -+{ -+ struct dchid_iface *iface = hdev->driver_data; -+ -+ iface->open = true; -+ return 0; -+} -+ -+static void dchid_close(struct hid_device *hdev) -+{ -+ struct dchid_iface *iface = hdev->driver_data; -+ -+ iface->open = false; -+} -+ -+static int dchid_parse(struct hid_device *hdev) -+{ -+ struct dchid_iface *iface = hdev->driver_data; -+ -+ return hid_parse_report(hdev, iface->hid_desc, iface->hid_desc_len); -+} -+ -+/* Note: buf excludes report number! For ease of fetching strings/etc. */ -+static int dchid_get_report_cmd(struct dchid_iface *iface, u8 reportnum, void *buf, size_t len) -+{ -+ int ret = dchid_cmd(iface, GROUP_CMD, REQ_GET_REPORT, &reportnum, 1, buf, len); -+ -+ return ret <= 0 ? ret : ret - 1; -+} -+ -+/* Note: buf includes report number! */ -+static int dchid_set_report(struct dchid_iface *iface, void *buf, size_t len) -+{ -+ return dchid_cmd(iface, GROUP_OUTPUT, REQ_SET_REPORT, buf, len, NULL, 0); -+} -+ -+static int dchid_raw_request(struct hid_device *hdev, -+ unsigned char reportnum, __u8 *buf, size_t len, -+ unsigned char rtype, int reqtype) -+{ -+ struct dchid_iface *iface = hdev->driver_data; -+ -+ switch (reqtype) { -+ case HID_REQ_GET_REPORT: -+ buf[0] = reportnum; -+ return dchid_cmd(iface, GROUP_OUTPUT, REQ_GET_REPORT, &reportnum, 1, buf + 1, len - 1); -+ case HID_REQ_SET_REPORT: -+ return dchid_set_report(iface, buf, len); -+ default: -+ return -EIO; -+ } -+ -+ return 0; -+} -+ -+static struct hid_ll_driver dchid_ll = { -+ .start = &dchid_start, -+ .stop = &dchid_stop, -+ .open = &dchid_open, -+ .close = &dchid_close, -+ .parse = &dchid_parse, -+ .raw_request = &dchid_raw_request, -+}; -+ -+static void dchid_init_interface(struct dchid_iface *iface) -+{ -+ void *fw; -+ size_t size; -+ -+ iface->deferred = false; -+ -+ /* Enable interface (general) */ -+ if (dchid_enable_interface(iface) < 0) -+ return; -+ -+ /* Look to see if we need firmware */ -+ if (dchid_get_firmware(iface, &fw, &size) < 0) -+ return; -+ -+ /* Only multi-touch has firmware */ -+ if (!fw || !size) -+ return; -+ -+ /* Send it to the device */ -+ if (dchid_send_firmware(iface, fw, size) < 0) -+ return; -+ -+ /* After loading firmware, multi-touch needs a reset */ -+ dchid_reset_interface(iface, 0); -+ dchid_reset_interface(iface, 2); -+} -+ -+static void dchid_handle_descriptor(struct dchid_iface *iface, void *hid_desc, size_t desc_len) -+{ -+ if (iface->hid) { -+ dev_warn(iface->dchid->dev, "Tried to initialize already started interface %s!\n", -+ iface->name); -+ return; -+ } -+ -+ iface->hid_desc = devm_kmemdup(iface->dchid->dev, hid_desc, desc_len, GFP_KERNEL); -+ if (!iface->hid_desc) -+ return; -+ -+ iface->hid_desc_len = desc_len; -+ -+ /* We need to enable STM first, since it'll give us the device IDs */ -+ if (iface->dchid->id_ready || !strcmp(iface->name, "stm")) -+ dchid_init_interface(iface); -+ else -+ iface->deferred = true; -+} -+ -+static void dchid_handle_ready(struct dockchannel_hid *dchid, void *data, size_t length) -+{ -+ struct hid_device *hid; -+ struct dchid_iface *iface; -+ int ret; -+ u8 *pkt = data; -+ u8 index; -+ int i; -+ -+ if (length < 2) { -+ dev_err(dchid->dev, "Bad length for ready message: %ld\n", length); -+ return; -+ } -+ -+ index = pkt[1]; -+ -+ if (index >= MAX_INTERFACES) { -+ dev_err(dchid->dev, "Got ready notification for bad iface %d\n", index); -+ return; -+ } -+ -+ iface = dchid->ifaces[index]; -+ if (!iface) { -+ dev_err(dchid->dev, "Got ready notification for unknown iface %d\n", index); -+ return; -+ } -+ -+ if (iface->hid) { -+ dev_warn(iface->dchid->dev, "Interface %s already ready!\n", -+ iface->name); -+ return; -+ } -+ -+ /* When STM is ready, grab global device info */ -+ if (!strcmp(iface->name, "stm")) { -+ ret = dchid_get_report_cmd(iface, STM_REPORT_ID, &dchid->device_id, -+ sizeof(dchid->device_id)); -+ if (ret < sizeof(dchid->device_id)) { -+ dev_warn(iface->dchid->dev, "Failed to get device ID from STM!\n"); -+ /* Fake it and keep going. Things might still work... */ -+ memset(&dchid->device_id, 0, sizeof(dchid->device_id)); -+ dchid->device_id.vendor_id = HOST_VENDOR_ID_APPLE; -+ } -+ ret = dchid_get_report_cmd(iface, STM_REPORT_SERIAL, dchid->serial, -+ sizeof(dchid->serial) - 1); -+ if (ret < 0) { -+ dev_warn(iface->dchid->dev, "Failed to get serial from STM!\n"); -+ dchid->serial[0] = 0; -+ } -+ -+ dchid->id_ready = true; -+ for (i = 0; i < MAX_INTERFACES; i++) -+ if (dchid->ifaces[i] && dchid->ifaces[i]->deferred) -+ dchid_init_interface(dchid->ifaces[i]); -+ -+ } -+ -+ hid = hid_allocate_device(); -+ if (IS_ERR(hid)) -+ return; -+ -+ snprintf(hid->name, sizeof(hid->name), "Apple MTP %s", iface->name); -+ snprintf(hid->phys, sizeof(hid->phys), "%s.%d (%s)", -+ dev_name(iface->dchid->dev), iface->index, iface->name); -+ strscpy(hid->uniq, dchid->serial, sizeof(hid->uniq)); -+ -+ hid->ll_driver = &dchid_ll; -+ hid->bus = BUS_HOST; -+ hid->vendor = dchid->device_id.vendor_id; -+ hid->product = dchid->device_id.product_id; -+ hid->version = dchid->device_id.version_number; -+ hid->type = HID_TYPE_OTHER; -+ if (!strcmp(iface->name, "multi-touch")) { -+ hid->type = HID_TYPE_SPI_MOUSE; -+ } else if (!strcmp(iface->name, "keyboard")) { -+ hid->type = HID_TYPE_SPI_KEYBOARD; -+ -+ /* These country codes match what earlier Apple HID keyboards did */ -+ switch (dchid->device_id.keyboard_type) { -+ case KEYBOARD_TYPE_ANSI: -+ hid->country = 33; // US-English -+ break; -+ -+ case KEYBOARD_TYPE_ISO: -+ hid->country = 13; // ISO -+ break; -+ -+ case KEYBOARD_TYPE_JIS: -+ hid->country = 15; // Japan -+ break; -+ } -+ } -+ -+ hid->dev.parent = iface->dchid->dev; -+ hid->driver_data = iface; -+ -+ ret = hid_add_device(hid); -+ if (ret < 0) { -+ hid_destroy_device(hid); -+ dev_warn(iface->dchid->dev, "Failed to register hid device %s", iface->name); -+ return; -+ } -+ -+ iface->hid = hid; -+} -+ -+static void dchid_request_gpio(struct dchid_iface *iface, int id, const char *name) -+{ -+ char prop_name[MAX_GPIO_NAME + 16]; -+ -+ dev_info(iface->dchid->dev, "Requesting GPIO %s#%d: %s\n", iface->name, id, name); -+ -+ if (iface->gpio) { -+ dev_err(iface->dchid->dev, "Cannot request more than one GPIO per interface!\n"); -+ return; -+ } -+ -+ snprintf(prop_name, sizeof(prop_name), "apple,%s-gpios", name); -+ -+ iface->gpio = devm_gpiod_get_from_of_node(iface->dchid->dev, -+ iface->of_node, prop_name, 0, -+ GPIOD_OUT_LOW, name); -+ -+ if (IS_ERR_OR_NULL(iface->gpio)) { -+ dev_err(iface->dchid->dev, "Failed to request GPIO %s\n", prop_name); -+ iface->gpio = NULL; -+ return; -+ } -+ -+ iface->gpio_id = id; -+} -+ -+static void dchid_handle_init(struct dockchannel_hid *dchid, void *data, size_t length) -+{ -+ struct dchid_init_hdr *hdr = data; -+ struct dchid_iface *iface; -+ struct dchid_init_block_hdr *blk; -+ -+ if (length < sizeof(*hdr)) -+ return; -+ -+ iface = dchid_get_interface(dchid, hdr->iface, hdr->name); -+ if (!iface) -+ return; -+ -+ data += sizeof(*hdr); -+ length -= sizeof(*hdr); -+ -+ while (length > sizeof(*blk)) { -+ blk = data; -+ data += sizeof(*blk); -+ length -= sizeof(*blk); -+ -+ if (blk->length > length) -+ return; -+ switch (blk->type) { -+ case INIT_HID_DESCRIPTOR: -+ dchid_handle_descriptor(iface, data, blk->length); -+ break; -+ -+ case INIT_GPIO_REQUEST: { -+ struct dchid_gpio_request *req = data; -+ -+ if (sizeof(*req) > length) -+ return; -+ dchid_request_gpio(iface, req->id, req->name); -+ break; -+ } -+ -+ case INIT_TERMINATOR: -+ return; -+ } -+ -+ data += blk->length + sizeof(*blk); -+ length -= blk->length + sizeof(*blk); -+ } -+} -+ -+static void dchid_handle_gpio(struct dockchannel_hid *dchid, void *data, size_t length) -+{ -+ struct dchid_gpio_cmd *cmd = data; -+ struct dchid_iface *iface; -+ u32 retcode = 0xe000f00d; /* Give it a random Apple-style error code */ -+ struct dchid_gpio_ack *ack; -+ -+ if (length < sizeof(*cmd)) -+ return; -+ -+ if (cmd->iface >= MAX_INTERFACES || !(iface = dchid->ifaces[cmd->iface])) { -+ dev_err(dchid->dev, "Got GPIO command for bad inteface %d\n", cmd->iface); -+ goto err; -+ } -+ -+ if (!iface->gpio || cmd->gpio != iface->gpio_id) { -+ dev_err(dchid->dev, "Got GPIO command for bad GPIO %s#%d\n", -+ iface->name, cmd->gpio); -+ goto err; -+ } -+ -+ dev_info(dchid->dev, "GPIO command: %s#%d: %d\n", iface->name, cmd->gpio, cmd->cmd); -+ -+ switch (cmd->cmd) { -+ case 3: -+ /* Pulse. */ -+ gpiod_set_value_cansleep(iface->gpio, 1); -+ msleep(10); /* Random guess... */ -+ gpiod_set_value_cansleep(iface->gpio, 0); -+ retcode = 0; -+ break; -+ default: -+ dev_err(dchid->dev, "Unknown GPIO command %d\n", cmd->cmd ); -+ break; -+ } -+ -+err: -+ /* Ack it */ -+ ack = kzalloc(sizeof(*ack) + length, GFP_KERNEL); -+ if (!ack) -+ return; -+ -+ ack->type = CMD_ACK_GPIO_CMD; -+ ack->retcode = retcode; -+ memcpy(ack->cmd, data, length); -+ -+ if (dchid_comm_cmd(dchid, ack, sizeof(*ack) + length) < 0) -+ dev_err(dchid->dev, "Failed to ACK GPIO command\n"); -+ -+ kfree(ack); -+} -+ -+static void dchid_handle_event(struct dockchannel_hid *dchid, void *data, size_t length) -+{ -+ u8 *p = data; -+ switch (*p) { -+ case EVENT_INIT: -+ dchid_handle_init(dchid, data, length); -+ break; -+ case EVENT_READY: -+ dchid_handle_ready(dchid, data, length); -+ break; -+ case EVENT_GPIO_CMD: -+ dchid_handle_gpio(dchid, data, length); -+ break; -+ } -+} -+ -+static void dchid_handle_report(struct dchid_iface *iface, void *data, size_t length) -+{ -+ struct dockchannel_hid *dchid = iface->dchid; -+ -+ if (!iface->hid) { -+ dev_warn(dchid->dev, "Report received but %s is not initialized!\n", iface->name); -+ return; -+ } -+ -+ if (!iface->open) -+ return; -+ -+ hid_input_report(iface->hid, HID_INPUT_REPORT, data, length, 1); -+} -+ -+static void dchid_packet_work(struct work_struct *ws) -+{ -+ struct dchid_work *work = container_of(ws, struct dchid_work, work); -+ struct dchid_subhdr *shdr = (void *)work->data; -+ struct dockchannel_hid *dchid = work->iface->dchid; -+ int type = FIELD_GET(FLAGS_GROUP, shdr->flags); -+ u8 *payload = work->data + sizeof(*shdr); -+ -+ if (shdr->length + sizeof(*shdr) > work->hdr.length) { -+ dev_err(dchid->dev, "Bad sub header length (%d > %ld)\n", -+ shdr->length, work->hdr.length - sizeof(*shdr)); -+ return; -+ } -+ -+ switch (type) { -+ case GROUP_INPUT: -+ if (work->hdr.iface == IFACE_COMM) -+ dchid_handle_event(dchid, payload, shdr->length); -+ else -+ dchid_handle_report(work->iface, payload, shdr->length); -+ break; -+ default: -+ dev_err(dchid->dev, "Received unknown packet type %d\n", type); -+ break; -+ } -+ -+ kfree(work); -+} -+ -+static void dchid_handle_ack(struct dchid_iface *iface, struct dchid_hdr *hdr, void *data) -+{ -+ struct dchid_subhdr *shdr = (void *)data; -+ u8 *payload = data + sizeof(*shdr); -+ -+ if (shdr->length + sizeof(*shdr) > hdr->length) { -+ dev_err(iface->dchid->dev, "Bad sub header length (%d > %ld)\n", -+ shdr->length, hdr->length - sizeof(*shdr)); -+ return; -+ } -+ if (shdr->flags != iface->out_flags) { -+ dev_err(iface->dchid->dev, -+ "Received unexpected flags 0x%x on ACK channel (expected 0x%x)\n", -+ shdr->flags, iface->out_flags); -+ return; -+ } -+ -+ if (shdr->length < 1) { -+ dev_err(iface->dchid->dev, "Received length 0 output report ack\n"); -+ return; -+ } -+ if (iface->tx_seq != hdr->seq) { -+ dev_err(iface->dchid->dev, "Received ACK with bad seq (expected %d, got %d)\n", -+ iface->rx_seq, hdr->seq); -+ return; -+ } -+ if (iface->out_report != payload[0]) { -+ dev_err(iface->dchid->dev, "Received ACK with bad report (expected %d, got %d\n", -+ iface->out_report, payload[0]); -+ return; -+ } -+ -+ if (iface->resp_buf && iface->resp_size) -+ memcpy(iface->resp_buf, payload + 1, min((size_t)shdr->length - 1, iface->resp_size)); -+ -+ iface->resp_size = shdr->length; -+ iface->out_report = -1; -+ iface->retcode = shdr->retcode; -+ complete(&iface->out_complete); -+} -+ -+static void dchid_handle_packet(void *cookie, size_t avail) -+{ -+ struct dockchannel_hid *dchid = cookie; -+ struct dchid_hdr hdr; -+ struct dchid_work *work; -+ struct dchid_iface *iface; -+ u32 checksum; -+ -+ if (dockchannel_recv(dchid->dc, &hdr, sizeof(hdr)) != sizeof(hdr)) { -+ dev_err(dchid->dev, "Read failed (header)\n"); -+ return; -+ } -+ -+ if (hdr.hdr_len != sizeof(hdr)) { -+ dev_err(dchid->dev, "Bad header length %d\n", hdr.hdr_len); -+ goto done; -+ } -+ -+ if (dockchannel_recv(dchid->dc, dchid->pkt_buf, hdr.length + 4) != (hdr.length + 4)) { -+ dev_err(dchid->dev, "Read failed (body)\n"); -+ goto done; -+ } -+ -+ checksum = dchid_checksum(&hdr, sizeof(hdr)); -+ checksum += dchid_checksum(dchid->pkt_buf, hdr.length + 4); -+ -+ if (checksum != 0xffffffff) { -+ dev_err(dchid->dev, "Checksum mismatch (iface %d): 0x%08x != 0xffffffff\n", -+ hdr.iface, checksum); -+ goto done; -+ } -+ -+ -+ if (hdr.iface >= MAX_INTERFACES) { -+ dev_err(dchid->dev, "Bad iface %d\n", hdr.iface); -+ } -+ -+ iface = dchid->ifaces[hdr.iface]; -+ -+ if (!iface) { -+ dev_err(dchid->dev, "Received packet for uninitialized iface %d\n", hdr.iface); -+ goto done; -+ } -+ -+ switch (hdr.channel) { -+ case DCHID_CHANNEL_CMD: -+ dchid_handle_ack(iface, &hdr, dchid->pkt_buf); -+ goto done; -+ case DCHID_CHANNEL_REPORT: -+ break; -+ default: -+ dev_warn(dchid->dev, "Unknown channel 0x%x, treating as report...\n", -+ hdr.channel); -+ break; -+ } -+ -+ if (hdr.seq != iface->rx_seq) { -+ dev_err(dchid->dev, "Received packet out of sequence (expected %d, got %d)\n", -+ iface->rx_seq, hdr.seq); -+ goto done; -+ } -+ -+ iface->rx_seq++; -+ -+ work = kzalloc(sizeof(*work) + hdr.length, GFP_KERNEL); -+ if (!work) -+ return; -+ -+ work->hdr = hdr; -+ work->iface = iface; -+ memcpy(work->data, dchid->pkt_buf, hdr.length); -+ INIT_WORK(&work->work, dchid_packet_work); -+ -+ queue_work(dchid->wq, &work->work); -+ -+done: -+ dockchannel_await(dchid->dc, dchid_handle_packet, dchid, sizeof(struct dchid_hdr)); -+} -+ -+static int dockchannel_hid_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct dockchannel_hid *dchid; -+ struct device_node *child; -+ struct property *prop; -+ bool defer = false; -+ -+ /* -+ * First make sure all the GPIOs are available, in cased we need to defer. -+ * This is necessary because MTP will request them by name later, and by then -+ * it's too late to defer the probe. -+ */ -+ -+ for_each_child_of_node(dev->of_node, child) { -+ for_each_property_of_node(child, prop) { -+ size_t len = strlen(prop->name); -+ struct gpio_desc *gpio; -+ -+ if (len < 12 || strncmp("apple,", prop->name, 6) || -+ strcmp("-gpios", prop->name + len - 6)) -+ continue; -+ -+ gpio = gpiod_get_from_of_node(child, prop->name, 0, GPIOD_ASIS, -+ prop->name); -+ if (IS_ERR_OR_NULL(gpio)) { -+ if (PTR_ERR(gpio) == EPROBE_DEFER) { -+ defer = true; -+ of_node_put(child); -+ return -EPROBE_DEFER; -+ } -+ } else { -+ gpiod_put(gpio); -+ } -+ } -+ } -+ -+ dchid = devm_kzalloc(dev, sizeof(*dchid), GFP_KERNEL); -+ if (!dchid) -+ return -ENOMEM; -+ -+ -+ dchid->dev = &pdev->dev; -+ dchid->dc = dockchannel_init(pdev); -+ if (IS_ERR_OR_NULL(dchid->dc)) { -+ return -PTR_ERR(dchid->dc); -+ } -+ -+ dchid->comm = dchid_get_interface(dchid, IFACE_COMM, "comm"); -+ if (!dchid->comm) { -+ dev_err(dchid->dev, "Failed to initialize comm interface"); -+ return -EIO; -+ } -+ -+ dchid->wq = alloc_ordered_workqueue("dockchannel-hid-report", WQ_MEM_RECLAIM); -+ if (!dchid->wq) -+ return -ENOMEM; -+ -+ dev_info(dchid->dev, "initialized, awaiting packets\n"); -+ dockchannel_await(dchid->dc, dchid_handle_packet, dchid, sizeof(struct dchid_hdr)); -+ -+ return 0; -+} -+ -+static int dockchannel_hid_remove(struct platform_device *pdev) -+{ -+ BUG_ON(1); -+ return 0; -+} -+ -+static const struct of_device_id dockchannel_hid_of_match[] = { -+ { .compatible = "apple,dockchannel-hid" }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(of, dockchannel_hid_of_match); -+MODULE_FIRMWARE("apple/tpmtfw-*.bin"); -+ -+static struct platform_driver dockchannel_hid_driver = { -+ .driver = { -+ .name = "dockchannel-hid", -+ .of_match_table = dockchannel_hid_of_match, -+ }, -+ .probe = dockchannel_hid_probe, -+ .remove = dockchannel_hid_remove, -+}; -+module_platform_driver(dockchannel_hid_driver); -+ -+MODULE_DESCRIPTION("Apple DockChannel HID transport driver"); -+MODULE_AUTHOR("Hector Martin "); -+MODULE_LICENSE("Dual MIT/GPL"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0131-soc-apple-Add-RTKit-helper-driver.patch b/target/linux/silicon/patches-5.19/0131-soc-apple-Add-RTKit-helper-driver.patch deleted file mode 100644 index 9a718f001..000000000 --- a/target/linux/silicon/patches-5.19/0131-soc-apple-Add-RTKit-helper-driver.patch +++ /dev/null @@ -1,211 +0,0 @@ -From 19e6fb36a68b5afbe7a603fda647fcd2214e191c Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 3 Jul 2022 23:33:37 +0900 -Subject: [PATCH 131/171] soc: apple: Add RTKit helper driver - -This driver can be used for coprocessors that do some background task or -communicate out-of-band, and do not do any mailbox I/O beyond the -standard RTKit initialization. - -Signed-off-by: Hector Martin ---- - drivers/soc/apple/Kconfig | 14 +++ - drivers/soc/apple/Makefile | 3 + - drivers/soc/apple/rtkit-helper.c | 146 +++++++++++++++++++++++++++++++ - 3 files changed, 163 insertions(+) - create mode 100644 drivers/soc/apple/rtkit-helper.c - -diff --git a/drivers/soc/apple/Kconfig b/drivers/soc/apple/Kconfig -index 9e93df0ac825..694a44968f76 100644 ---- a/drivers/soc/apple/Kconfig -+++ b/drivers/soc/apple/Kconfig -@@ -30,6 +30,20 @@ config APPLE_RTKIT - - Say 'y' here if you have an Apple SoC. - -+config APPLE_RTKIT_HELPER -+ tristate "Apple Generic RTKit helper co-processor" -+ depends on APPLE_RTKIT -+ depends on ARCH_APPLE || COMPILE_TEST -+ default ARCH_APPLE -+ help -+ Apple SoCs such as the M1 come with various co-processors running -+ their proprietary RTKit operating system. This option enables support -+ for a generic co-processor that does not implement any additional -+ in-band communications. It can be used for testing purposes, or for -+ coprocessors such as MTP that communicate over a different interface. -+ -+ Say 'y' here if you have an Apple SoC. -+ - config APPLE_SART - tristate "Apple SART DMA address filter" - depends on ARCH_APPLE || COMPILE_TEST -diff --git a/drivers/soc/apple/Makefile b/drivers/soc/apple/Makefile -index aa4203e02462..07a95a883d3d 100644 ---- a/drivers/soc/apple/Makefile -+++ b/drivers/soc/apple/Makefile -@@ -4,6 +4,9 @@ obj-$(CONFIG_APPLE_PMGR_PWRSTATE) += apple-pmgr-pwrstate.o - obj-$(CONFIG_APPLE_RTKIT) += apple-rtkit.o - apple-rtkit-y = rtkit.o rtkit-crashlog.o - -+obj-$(CONFIG_APPLE_RTKIT_HELPER) += apple-rtkit-helper.o -+apple-rtkit-helper-y = rtkit-helper.o -+ - obj-$(CONFIG_APPLE_SART) += apple-sart.o - apple-sart-y = sart.o - -diff --git a/drivers/soc/apple/rtkit-helper.c b/drivers/soc/apple/rtkit-helper.c -new file mode 100644 -index 000000000000..01c7f30e41e6 ---- /dev/null -+++ b/drivers/soc/apple/rtkit-helper.c -@@ -0,0 +1,146 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple Generic RTKit helper coprocessor -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define APPLE_ASC_CPU_CONTROL 0x44 -+#define APPLE_ASC_CPU_CONTROL_RUN BIT(4) -+ -+struct apple_rtkit_helper { -+ struct device *dev; -+ struct apple_rtkit *rtk; -+ -+ void __iomem *asc_base; -+ -+ struct resource *sram; -+ void __iomem *sram_base; -+}; -+ -+static int apple_rtkit_helper_shmem_setup(void *cookie, struct apple_rtkit_shmem *bfr) -+{ -+ struct apple_rtkit_helper *helper = cookie; -+ struct resource res = { -+ .start = bfr->iova, -+ .end = bfr->iova + bfr->size - 1, -+ .name = "rtkit_map", -+ .flags = helper->sram->flags, -+ }; -+ -+ if (!bfr->iova) { -+ bfr->buffer = dma_alloc_coherent(helper->dev, bfr->size, -+ &bfr->iova, GFP_KERNEL); -+ if (!bfr->buffer) -+ return -ENOMEM; -+ return 0; -+ } -+ -+ if (!helper->sram) { -+ dev_err(helper->dev, -+ "RTKit buffer request with no SRAM region: %pR", &res); -+ return -EFAULT; -+ } -+ -+ if (res.end < res.start || !resource_contains(helper->sram, &res)) { -+ dev_err(helper->dev, -+ "RTKit buffer request outside SRAM region: %pR", &res); -+ return -EFAULT; -+ } -+ -+ bfr->iomem = helper->sram_base + (res.start - helper->sram->start); -+ bfr->is_mapped = true; -+ -+ return 0; -+} -+ -+static void apple_rtkit_helper_shmem_destroy(void *cookie, struct apple_rtkit_shmem *bfr) -+{ -+ // no-op -+} -+ -+static const struct apple_rtkit_ops apple_rtkit_helper_ops = { -+ .shmem_setup = apple_rtkit_helper_shmem_setup, -+ .shmem_destroy = apple_rtkit_helper_shmem_destroy, -+}; -+ -+static int apple_rtkit_helper_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct apple_rtkit_helper *helper; -+ int ret; -+ -+ helper = devm_kzalloc(dev, sizeof(*helper), GFP_KERNEL); -+ if (!helper) -+ return -ENOMEM; -+ -+ helper->dev = dev; -+ platform_set_drvdata(pdev, helper); -+ -+ helper->asc_base = devm_platform_ioremap_resource_byname(pdev, "asc"); -+ if (IS_ERR(helper->asc_base)) -+ return PTR_ERR(helper->asc_base); -+ -+ helper->sram = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram"); -+ if (helper->sram) { -+ helper->sram_base = devm_ioremap_resource(dev, helper->sram); -+ if (IS_ERR(helper->sram_base)) -+ return dev_err_probe(dev, PTR_ERR(helper->sram_base), -+ "Failed to map SRAM region"); -+ } -+ -+ helper->rtk = -+ devm_apple_rtkit_init(dev, helper, NULL, 0, &apple_rtkit_helper_ops); -+ if (IS_ERR(helper->rtk)) -+ return dev_err_probe(dev, PTR_ERR(helper->rtk), -+ "Failed to intialize RTKit"); -+ -+ writel_relaxed(APPLE_ASC_CPU_CONTROL_RUN, -+ helper->asc_base + APPLE_ASC_CPU_CONTROL); -+ -+ /* Works for both wake and boot */ -+ ret = apple_rtkit_wake(helper->rtk); -+ if (ret != 0) -+ return dev_err_probe(dev, ret, "Failed to wake up coprocessor"); -+ -+ return 0; -+} -+ -+static int apple_rtkit_helper_remove(struct platform_device *pdev) -+{ -+ struct apple_rtkit_helper *helper = platform_get_drvdata(pdev); -+ -+ if (apple_rtkit_is_running(helper->rtk)) -+ apple_rtkit_quiesce(helper->rtk); -+ -+ writel_relaxed(0, helper->asc_base + APPLE_ASC_CPU_CONTROL); -+ -+ return 0; -+} -+ -+static const struct of_device_id apple_rtkit_helper_of_match[] = { -+ { .compatible = "apple,rtk-helper-asc4" }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(of, apple_rtkit_helper_of_match); -+ -+static struct platform_driver apple_rtkit_helper_driver = { -+ .driver = { -+ .name = "rtkit-helper", -+ .of_match_table = apple_rtkit_helper_of_match, -+ }, -+ .probe = apple_rtkit_helper_probe, -+ .remove = apple_rtkit_helper_remove, -+}; -+module_platform_driver(apple_rtkit_helper_driver); -+ -+MODULE_AUTHOR("Hector Martin "); -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_DESCRIPTION("Apple RTKit helper driver"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0132-dockchannel-hid-Drop-incoming-packet-sequence-requir.patch b/target/linux/silicon/patches-5.19/0132-dockchannel-hid-Drop-incoming-packet-sequence-requir.patch deleted file mode 100644 index 011066faf..000000000 --- a/target/linux/silicon/patches-5.19/0132-dockchannel-hid-Drop-incoming-packet-sequence-requir.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 91667ca639d453c52047193fddc1c23b44dae6fc Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 17 Jul 2022 18:38:54 +0900 -Subject: [PATCH 132/171] dockchannel-hid: Drop incoming packet sequence - requirements - -Looks like this isn't reliable (suspected race condition in MTP -firmware...) - -Signed-off-by: Hector Martin ---- - drivers/hid/dockchannel-hid/dockchannel-hid.c | 13 ++----------- - 1 file changed, 2 insertions(+), 11 deletions(-) - -diff --git a/drivers/hid/dockchannel-hid/dockchannel-hid.c b/drivers/hid/dockchannel-hid/dockchannel-hid.c -index aaa7d357c6fa..07ac3a77c390 100644 ---- a/drivers/hid/dockchannel-hid/dockchannel-hid.c -+++ b/drivers/hid/dockchannel-hid/dockchannel-hid.c -@@ -152,7 +152,6 @@ struct dchid_iface { - const struct device_node *of_node; - - uint8_t tx_seq; -- uint8_t rx_seq; - bool deferred; - bool open; - -@@ -858,7 +857,7 @@ static void dchid_handle_ack(struct dchid_iface *iface, struct dchid_hdr *hdr, v - } - if (shdr->flags != iface->out_flags) { - dev_err(iface->dchid->dev, -- "Received unexpected flags 0x%x on ACK channel (expected 0x%x)\n", -+ "Received unexpected flags 0x%x on ACK channel (expFected 0x%x)\n", - shdr->flags, iface->out_flags); - return; - } -@@ -869,7 +868,7 @@ static void dchid_handle_ack(struct dchid_iface *iface, struct dchid_hdr *hdr, v - } - if (iface->tx_seq != hdr->seq) { - dev_err(iface->dchid->dev, "Received ACK with bad seq (expected %d, got %d)\n", -- iface->rx_seq, hdr->seq); -+ iface->tx_seq, hdr->seq); - return; - } - if (iface->out_report != payload[0]) { -@@ -943,14 +942,6 @@ static void dchid_handle_packet(void *cookie, size_t avail) - break; - } - -- if (hdr.seq != iface->rx_seq) { -- dev_err(dchid->dev, "Received packet out of sequence (expected %d, got %d)\n", -- iface->rx_seq, hdr.seq); -- goto done; -- } -- -- iface->rx_seq++; -- - work = kzalloc(sizeof(*work) + hdr.length, GFP_KERNEL); - if (!work) - return; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0133-dockchanel-hid-Send-interface-firmware-lazily.patch b/target/linux/silicon/patches-5.19/0133-dockchanel-hid-Send-interface-firmware-lazily.patch deleted file mode 100644 index 8ea3f854e..000000000 --- a/target/linux/silicon/patches-5.19/0133-dockchanel-hid-Send-interface-firmware-lazily.patch +++ /dev/null @@ -1,393 +0,0 @@ -From e478ad5114c801719d37cac1a2d53941ed124936 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 17 Jul 2022 20:47:37 +0900 -Subject: [PATCH 133/171] dockchanel-hid: Send interface firmware lazily - -Wait until the HID device is opened to send the multitouch firmware. -This avoids having to put it in the initramfs to get basic keyboard -functionality there. - -Signed-off-by: Hector Martin ---- - drivers/hid/dockchannel-hid/dockchannel-hid.c | 246 +++++++++++------- - 1 file changed, 157 insertions(+), 89 deletions(-) - -diff --git a/drivers/hid/dockchannel-hid/dockchannel-hid.c b/drivers/hid/dockchannel-hid/dockchannel-hid.c -index 07ac3a77c390..aeaeb60edf39 100644 ---- a/drivers/hid/dockchannel-hid/dockchannel-hid.c -+++ b/drivers/hid/dockchannel-hid/dockchannel-hid.c -@@ -17,7 +17,8 @@ - #include - #include "../hid-ids.h" - --#define COMMAND_TIMEOUT 1000 -+#define COMMAND_TIMEOUT_MS 1000 -+#define START_TIMEOUT_MS 2000 - - #define MAX_INTERFACES 16 - -@@ -146,6 +147,10 @@ struct dchid_work { - struct dchid_iface { - struct dockchannel_hid *dchid; - struct hid_device *hid; -+ struct workqueue_struct *wq; -+ -+ bool creating; -+ struct work_struct create_work; - - int index; - const char *name; -@@ -153,7 +158,9 @@ struct dchid_iface { - - uint8_t tx_seq; - bool deferred; -+ bool starting; - bool open; -+ struct completion ready; - - void *hid_desc; - size_t hid_desc_len; -@@ -183,7 +190,8 @@ struct dockchannel_hid { - - u8 pkt_buf[MAX_PKT_SIZE]; - -- struct workqueue_struct *wq; -+ /* Workqueue to asynchronously create HID devices */ -+ struct workqueue_struct *new_iface_wq; - }; - - static struct dchid_iface * -@@ -208,9 +216,11 @@ dchid_get_interface(struct dockchannel_hid *dchid, int index, const char *name) - iface->dchid = dchid; - iface->out_report= -1; - init_completion(&iface->out_complete); -+ init_completion(&iface->ready); - mutex_init(&iface->out_mutex); -- -- dev_info(dchid->dev, "Initializing interface %s\n", iface->name); -+ iface->wq = alloc_ordered_workqueue("dchid-%s", WQ_MEM_RECLAIM, iface->name); -+ if (!iface->wq) -+ return NULL; - - /* Comm is not a HID subdevice */ - if (!strcmp(name, "comm")) { -@@ -308,7 +318,7 @@ static int dchid_cmd(struct dchid_iface *iface, u32 type, u32 req, - if (ret < 0) - goto done; - -- if (!wait_for_completion_timeout(&iface->out_complete, msecs_to_jiffies(1000))) { -+ if (!wait_for_completion_timeout(&iface->out_complete, msecs_to_jiffies(COMMAND_TIMEOUT_MS))) { - dev_err(iface->dchid->dev, "output report 0x%x to iface %d (%s) timed out\n", - report_id, iface->index, iface->name); - ret = -ETIMEDOUT; -@@ -431,6 +441,49 @@ static int dchid_get_firmware(struct dchid_iface *iface, void **firmware, size_t - return ret; - } - -+static int dchid_start_interface(struct dchid_iface *iface) -+{ -+ void *fw; -+ size_t size; -+ int ret; -+ -+ if (iface->starting) { -+ dev_warn(iface->dchid->dev, "Interface %s is already starting", iface->name); -+ return -EINPROGRESS; -+ } -+ -+ dev_info(iface->dchid->dev, "Starting interface %s\n", iface->name); -+ -+ iface->starting = true; -+ -+ /* Look to see if we need firmware */ -+ ret = dchid_get_firmware(iface, &fw, &size); -+ if (ret < 0) -+ goto err; -+ -+ /* Only multi-touch has firmware */ -+ if (fw && size) { -+ -+ /* Send firmware to the device */ -+ dev_info(iface->dchid->dev, "Sending firmware for %s\n", iface->name); -+ ret = dchid_send_firmware(iface, fw, size); -+ if (ret < 0) { -+ dev_err(iface->dchid->dev, "Failed to send %s firmwareS", iface->name); -+ goto err; -+ } -+ -+ /* After loading firmware, multi-touch needs a reset */ -+ dev_info(iface->dchid->dev, "Resetting %s\n", iface->name); -+ dchid_reset_interface(iface, 0); -+ dchid_reset_interface(iface, 2); -+ } -+ -+ return 0; -+ -+err: -+ iface->starting = false; -+ return ret; -+} - - static int dchid_start(struct hid_device *hdev) - { -@@ -445,6 +498,18 @@ static void dchid_stop(struct hid_device *hdev) - static int dchid_open(struct hid_device *hdev) - { - struct dchid_iface *iface = hdev->driver_data; -+ int ret; -+ -+ if (!completion_done(&iface->ready)) { -+ ret = dchid_start_interface(iface); -+ if (ret < 0) -+ return ret; -+ -+ if (!wait_for_completion_timeout(&iface->ready, msecs_to_jiffies(START_TIMEOUT_MS))) { -+ dev_err(iface->dchid->dev, "iface %s start timed out\n", iface->name); -+ return -ETIMEDOUT; -+ } -+ } - - iface->open = true; - return 0; -@@ -506,32 +571,87 @@ static struct hid_ll_driver dchid_ll = { - .raw_request = &dchid_raw_request, - }; - --static void dchid_init_interface(struct dchid_iface *iface) -+static void dchid_create_interface_work(struct work_struct *ws) - { -- void *fw; -- size_t size; -- -- iface->deferred = false; -+ struct dchid_iface *iface = container_of(ws, struct dchid_iface, create_work); -+ struct dockchannel_hid *dchid = iface->dchid; -+ struct hid_device *hid; -+ int ret; - -- /* Enable interface (general) */ -- if (dchid_enable_interface(iface) < 0) -+ if (iface->hid) { -+ dev_warn(dchid->dev, "Interface %s already created!\n", -+ iface->name); - return; -+ } - -- /* Look to see if we need firmware */ -- if (dchid_get_firmware(iface, &fw, &size) < 0) -- return; -+ dev_info(dchid->dev, "New interface %s\n", iface->name); - -- /* Only multi-touch has firmware */ -- if (!fw || !size) -+ /* Start the interface. This is not the entire init process, as firmware is loaded later on device open. */ -+ ret = dchid_enable_interface(iface); -+ if (ret < 0) { -+ dev_warn(dchid->dev, "Failed to enable %s: %d\n", iface->name, ret); - return; -+ } - -- /* Send it to the device */ -- if (dchid_send_firmware(iface, fw, size) < 0) -+ iface->deferred = false; -+ -+ hid = hid_allocate_device(); -+ if (IS_ERR(hid)) - return; - -- /* After loading firmware, multi-touch needs a reset */ -- dchid_reset_interface(iface, 0); -- dchid_reset_interface(iface, 2); -+ snprintf(hid->name, sizeof(hid->name), "Apple MTP %s", iface->name); -+ snprintf(hid->phys, sizeof(hid->phys), "%s.%d (%s)", -+ dev_name(dchid->dev), iface->index, iface->name); -+ strscpy(hid->uniq, dchid->serial, sizeof(hid->uniq)); -+ -+ hid->ll_driver = &dchid_ll; -+ hid->bus = BUS_HOST; -+ hid->vendor = dchid->device_id.vendor_id; -+ hid->product = dchid->device_id.product_id; -+ hid->version = dchid->device_id.version_number; -+ hid->type = HID_TYPE_OTHER; -+ if (!strcmp(iface->name, "multi-touch")) { -+ hid->type = HID_TYPE_SPI_MOUSE; -+ } else if (!strcmp(iface->name, "keyboard")) { -+ hid->type = HID_TYPE_SPI_KEYBOARD; -+ -+ /* These country codes match what earlier Apple HID keyboards did */ -+ switch (dchid->device_id.keyboard_type) { -+ case KEYBOARD_TYPE_ANSI: -+ hid->country = 33; // US-English -+ break; -+ -+ case KEYBOARD_TYPE_ISO: -+ hid->country = 13; // ISO -+ break; -+ -+ case KEYBOARD_TYPE_JIS: -+ hid->country = 15; // Japan -+ break; -+ } -+ } -+ -+ hid->dev.parent = iface->dchid->dev; -+ hid->driver_data = iface; -+ -+ iface->hid = hid; -+ -+ ret = hid_add_device(hid); -+ if (ret < 0) { -+ iface->hid = NULL; -+ hid_destroy_device(hid); -+ dev_warn(iface->dchid->dev, "Failed to register hid device %s", iface->name); -+ } -+} -+ -+static int dchid_create_interface(struct dchid_iface *iface) -+{ -+ if (iface->creating) -+ return -EBUSY; -+ -+ iface->creating = true; -+ INIT_WORK(&iface->create_work, dchid_create_interface_work); -+ return queue_work(iface->dchid->new_iface_wq, &iface->create_work); - } - - static void dchid_handle_descriptor(struct dchid_iface *iface, void *hid_desc, size_t desc_len) -@@ -549,20 +669,19 @@ static void dchid_handle_descriptor(struct dchid_iface *iface, void *hid_desc, s - iface->hid_desc_len = desc_len; - - /* We need to enable STM first, since it'll give us the device IDs */ -- if (iface->dchid->id_ready || !strcmp(iface->name, "stm")) -- dchid_init_interface(iface); -- else -+ if (iface->dchid->id_ready || !strcmp(iface->name, "stm")) { -+ dchid_create_interface(iface); -+ } else { - iface->deferred = true; -+ } - } - - static void dchid_handle_ready(struct dockchannel_hid *dchid, void *data, size_t length) - { -- struct hid_device *hid; - struct dchid_iface *iface; -- int ret; - u8 *pkt = data; - u8 index; -- int i; -+ int i, ret; - - if (length < 2) { - dev_err(dchid->dev, "Bad length for ready message: %ld\n", length); -@@ -582,11 +701,8 @@ static void dchid_handle_ready(struct dockchannel_hid *dchid, void *data, size_t - return; - } - -- if (iface->hid) { -- dev_warn(iface->dchid->dev, "Interface %s already ready!\n", -- iface->name); -- return; -- } -+ dev_info(dchid->dev, "Inteface %s is now ready\n", iface->name); -+ complete_all(&iface->ready); - - /* When STM is ready, grab global device info */ - if (!strcmp(iface->name, "stm")) { -@@ -606,59 +722,12 @@ static void dchid_handle_ready(struct dockchannel_hid *dchid, void *data, size_t - } - - dchid->id_ready = true; -- for (i = 0; i < MAX_INTERFACES; i++) -- if (dchid->ifaces[i] && dchid->ifaces[i]->deferred) -- dchid_init_interface(dchid->ifaces[i]); -- -- } -- -- hid = hid_allocate_device(); -- if (IS_ERR(hid)) -- return; -- -- snprintf(hid->name, sizeof(hid->name), "Apple MTP %s", iface->name); -- snprintf(hid->phys, sizeof(hid->phys), "%s.%d (%s)", -- dev_name(iface->dchid->dev), iface->index, iface->name); -- strscpy(hid->uniq, dchid->serial, sizeof(hid->uniq)); -- -- hid->ll_driver = &dchid_ll; -- hid->bus = BUS_HOST; -- hid->vendor = dchid->device_id.vendor_id; -- hid->product = dchid->device_id.product_id; -- hid->version = dchid->device_id.version_number; -- hid->type = HID_TYPE_OTHER; -- if (!strcmp(iface->name, "multi-touch")) { -- hid->type = HID_TYPE_SPI_MOUSE; -- } else if (!strcmp(iface->name, "keyboard")) { -- hid->type = HID_TYPE_SPI_KEYBOARD; -- -- /* These country codes match what earlier Apple HID keyboards did */ -- switch (dchid->device_id.keyboard_type) { -- case KEYBOARD_TYPE_ANSI: -- hid->country = 33; // US-English -- break; -- -- case KEYBOARD_TYPE_ISO: -- hid->country = 13; // ISO -- break; -- -- case KEYBOARD_TYPE_JIS: -- hid->country = 15; // Japan -- break; -+ for (i = 0; i < MAX_INTERFACES; i++) { -+ if (!dchid->ifaces[i] || !dchid->ifaces[i]->deferred) -+ continue; -+ dchid_create_interface(dchid->ifaces[i]); - } - } -- -- hid->dev.parent = iface->dchid->dev; -- hid->driver_data = iface; -- -- ret = hid_add_device(hid); -- if (ret < 0) { -- hid_destroy_device(hid); -- dev_warn(iface->dchid->dev, "Failed to register hid device %s", iface->name); -- return; -- } -- -- iface->hid = hid; - } - - static void dchid_request_gpio(struct dchid_iface *iface, int id, const char *name) -@@ -951,7 +1020,7 @@ static void dchid_handle_packet(void *cookie, size_t avail) - memcpy(work->data, dchid->pkt_buf, hdr.length); - INIT_WORK(&work->work, dchid_packet_work); - -- queue_work(dchid->wq, &work->work); -+ queue_work(iface->wq, &work->work); - - done: - dockchannel_await(dchid->dc, dchid_handle_packet, dchid, sizeof(struct dchid_hdr)); -@@ -1004,6 +1073,9 @@ static int dockchannel_hid_probe(struct platform_device *pdev) - if (IS_ERR_OR_NULL(dchid->dc)) { - return -PTR_ERR(dchid->dc); - } -+ dchid->new_iface_wq = alloc_workqueue("dchid-new", WQ_MEM_RECLAIM, 0); -+ if (!dchid->new_iface_wq) -+ return -ENOMEM; - - dchid->comm = dchid_get_interface(dchid, IFACE_COMM, "comm"); - if (!dchid->comm) { -@@ -1011,10 +1083,6 @@ static int dockchannel_hid_probe(struct platform_device *pdev) - return -EIO; - } - -- dchid->wq = alloc_ordered_workqueue("dockchannel-hid-report", WQ_MEM_RECLAIM); -- if (!dchid->wq) -- return -ENOMEM; -- - dev_info(dchid->dev, "initialized, awaiting packets\n"); - dockchannel_await(dchid->dc, dchid_handle_packet, dchid, sizeof(struct dchid_hdr)); - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0134-dockchannel-hid-Handle-M2-Air-keyboard-types.patch b/target/linux/silicon/patches-5.19/0134-dockchannel-hid-Handle-M2-Air-keyboard-types.patch deleted file mode 100644 index faba8f65b..000000000 --- a/target/linux/silicon/patches-5.19/0134-dockchannel-hid-Handle-M2-Air-keyboard-types.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 740efddf69b264d6439f9cf124d36acab812dd39 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sat, 30 Jul 2022 16:16:45 +0900 -Subject: [PATCH 134/171] dockchannel-hid: Handle M2 Air keyboard types - -It looks like the keyboard type isn't just for the overall layout kind, -but also varies by device. Conjecture is that Apple always allocates -them sequentially in groups of 3 for the 3 available physical layout -groups, so just do % 3. - -Signed-off-by: Hector Martin ---- - drivers/hid/dockchannel-hid/dockchannel-hid.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/drivers/hid/dockchannel-hid/dockchannel-hid.c b/drivers/hid/dockchannel-hid/dockchannel-hid.c -index aeaeb60edf39..ea9d57ed9fa4 100644 ---- a/drivers/hid/dockchannel-hid/dockchannel-hid.c -+++ b/drivers/hid/dockchannel-hid/dockchannel-hid.c -@@ -615,8 +615,12 @@ static void dchid_create_interface_work(struct work_struct *ws) - } else if (!strcmp(iface->name, "keyboard")) { - hid->type = HID_TYPE_SPI_KEYBOARD; - -- /* These country codes match what earlier Apple HID keyboards did */ -- switch (dchid->device_id.keyboard_type) { -+ /* -+ * These country codes match what earlier Apple HID keyboards did. -+ * Apple seems to allocate keyboard IDs in groups of 3 (for the 3 -+ * layout groups), hence the % 3. -+ */ -+ switch (dchid->device_id.keyboard_type % 3) { - case KEYBOARD_TYPE_ANSI: - hid->country = 33; // US-English - break; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0135-lib-vsprintf-Add-support-for-generic-FOURCCs-by-exte.patch b/target/linux/silicon/patches-5.19/0135-lib-vsprintf-Add-support-for-generic-FOURCCs-by-exte.patch deleted file mode 100644 index a97609b7a..000000000 --- a/target/linux/silicon/patches-5.19/0135-lib-vsprintf-Add-support-for-generic-FOURCCs-by-exte.patch +++ /dev/null @@ -1,136 +0,0 @@ -From 5c8936e9fd03a27cce9ce1f2fe0a4e8ad7ea2369 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 1 Feb 2022 00:40:51 +0900 -Subject: [PATCH 135/171] lib/vsprintf: Add support for generic FOURCCs by - extending %p4cc - -%p4cc is designed for DRM/V4L2 FOURCCs with their specific quirks, but -it's useful to be able to print generic 4-character codes formatted as -an integer. Extend it to add format specifiers for printing generic -32-bit FOURCCs with various endian semantics: - -%p4ch Host-endian -%p4cl Little-endian -%p4cb Big-endian -%p4cr Reverse-endian - -The endianness determines how bytes are interpreted as a u32, and the -FOURCC is then always printed MSByte-first (this is the opposite of -V4L/DRM FOURCCs). This covers most practical cases, e.g. %p4cr would -allow printing LSByte-first FOURCCs stored in host endian order -(other than the hex form being in character order, not the integer -value). - -Signed-off-by: Hector Martin ---- - Documentation/core-api/printk-formats.rst | 32 +++++++++++++++++++++ - lib/vsprintf.c | 35 +++++++++++++++++++---- - 2 files changed, 61 insertions(+), 6 deletions(-) - -diff --git a/Documentation/core-api/printk-formats.rst b/Documentation/core-api/printk-formats.rst -index 5e89497ba314..22c33398ec02 100644 ---- a/Documentation/core-api/printk-formats.rst -+++ b/Documentation/core-api/printk-formats.rst -@@ -625,6 +625,38 @@ Examples:: - %p4cc Y10 little-endian (0x20303159) - %p4cc NV12 big-endian (0xb231564e) - -+Generic FourCC code -+------------------- -+ -+:: -+ %p4c[hnbl] gP00 (0x67503030) -+ -+Print a generic FourCC code, as both ASCII characters and its numerical -+value as hexadecimal. -+ -+The additional ``h``, ``r``, ``b``, and ``l`` specifiers are used to specify -+host, reversed, big or little endian order data respectively. Host endian -+order means the data is interpreted as a 32-bit integer and the most -+significant byte is printed first; that is, the character code as printed -+matches the byte order stored in memory on big-endian systems, and is reversed -+on little-endian systems. -+ -+Passed by reference. -+ -+Examples for a little-endian machine, given &(u32)0x67503030:: -+ -+ %p4ch gP00 (0x67503030) -+ %p4cl gP00 (0x67503030) -+ %p4cb 00Pg (0x30305067) -+ %p4cr 00Pg (0x30305067) -+ -+Examples for a big-endian machine, given &(u32)0x67503030:: -+ -+ %p4ch gP00 (0x67503030) -+ %p4cl 00Pg (0x30305067) -+ %p4cb gP00 (0x67503030) -+ %p4cr 00Pg (0x30305067) -+ - Thanks - ====== - -diff --git a/lib/vsprintf.c b/lib/vsprintf.c -index 3c1853a9d1c0..31707499f90f 100644 ---- a/lib/vsprintf.c -+++ b/lib/vsprintf.c -@@ -1757,27 +1757,50 @@ char *fourcc_string(char *buf, char *end, const u32 *fourcc, - char output[sizeof("0123 little-endian (0x01234567)")]; - char *p = output; - unsigned int i; -+ bool pix_fmt = false; - u32 orig, val; - -- if (fmt[1] != 'c' || fmt[2] != 'c') -+ if (fmt[1] != 'c') - return error_string(buf, end, "(%p4?)", spec); - - if (check_pointer(&buf, end, fourcc, spec)) - return buf; - - orig = get_unaligned(fourcc); -- val = orig & ~BIT(31); -+ switch (fmt[2]) { -+ case 'h': -+ val = orig; -+ break; -+ case 'r': -+ val = orig = swab32(orig); -+ break; -+ case 'l': -+ val = orig = le32_to_cpu(orig); -+ break; -+ case 'b': -+ val = orig = be32_to_cpu(orig); -+ break; -+ case 'c': -+ /* Pixel formats are printed LSB-first */ -+ val = swab32(orig & ~BIT(31)); -+ pix_fmt = true; -+ break; -+ default: -+ return error_string(buf, end, "(%p4?)", spec); -+ } - - for (i = 0; i < sizeof(u32); i++) { -- unsigned char c = val >> (i * 8); -+ unsigned char c = val >> ((3 - i) * 8); - - /* Print non-control ASCII characters as-is, dot otherwise */ - *p++ = isascii(c) && isprint(c) ? c : '.'; - } - -- *p++ = ' '; -- strcpy(p, orig & BIT(31) ? "big-endian" : "little-endian"); -- p += strlen(p); -+ if (pix_fmt) { -+ *p++ = ' '; -+ strcpy(p, orig & BIT(31) ? "big-endian" : "little-endian"); -+ p += strlen(p); -+ } - - *p++ = ' '; - *p++ = '('; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0136-soc-apple-rtkit-Add-apple_rtkit_poll.patch b/target/linux/silicon/patches-5.19/0136-soc-apple-rtkit-Add-apple_rtkit_poll.patch deleted file mode 100644 index 442a2a0ce..000000000 --- a/target/linux/silicon/patches-5.19/0136-soc-apple-rtkit-Add-apple_rtkit_poll.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 6ca3d4d94f429b7d0fcb991442ada6b2d34fc4c1 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 2 May 2022 15:55:51 +0900 -Subject: [PATCH 136/171] soc: apple: rtkit: Add apple_rtkit_poll - -This allows a client to receive messages in atomic context, by polling. - -Signed-off-by: Hector Martin ---- - drivers/soc/apple/rtkit.c | 6 ++++++ - include/linux/soc/apple/rtkit.h | 12 ++++++++++++ - 2 files changed, 18 insertions(+) - -diff --git a/drivers/soc/apple/rtkit.c b/drivers/soc/apple/rtkit.c -index cf1129e9f76b..031ec4aa06d5 100644 ---- a/drivers/soc/apple/rtkit.c -+++ b/drivers/soc/apple/rtkit.c -@@ -660,6 +660,12 @@ int apple_rtkit_send_message_wait(struct apple_rtkit *rtk, u8 ep, u64 message, - } - EXPORT_SYMBOL_GPL(apple_rtkit_send_message_wait); - -+int apple_rtkit_poll(struct apple_rtkit *rtk) -+{ -+ return mbox_client_peek_data(rtk->mbox_chan); -+} -+EXPORT_SYMBOL_GPL(apple_rtkit_poll); -+ - int apple_rtkit_start_ep(struct apple_rtkit *rtk, u8 endpoint) - { - u64 msg; -diff --git a/include/linux/soc/apple/rtkit.h b/include/linux/soc/apple/rtkit.h -index 88eb832eac7b..c9cabb679cd1 100644 ---- a/include/linux/soc/apple/rtkit.h -+++ b/include/linux/soc/apple/rtkit.h -@@ -152,4 +152,16 @@ int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message, - int apple_rtkit_send_message_wait(struct apple_rtkit *rtk, u8 ep, u64 message, - unsigned long timeout, bool atomic); - -+/* -+ * Process incoming messages in atomic context. -+ * This only guarantees that messages arrive as far as the recv_message_early -+ * callback; drivers expecting to handle incoming messages synchronously -+ * by calling this function must do it that way. -+ * Will return 1 if some data was processed, 0 if none was, or a -+ * negative error code on failure. -+ * -+ * @rtk: RTKit reference -+ */ -+int apple_rtkit_poll(struct apple_rtkit *rtk); -+ - #endif /* _LINUX_APPLE_RTKIT_H_ */ --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0137-soc-apple-rtkit-Get-rid-of-apple_rtkit_send_message_.patch b/target/linux/silicon/patches-5.19/0137-soc-apple-rtkit-Get-rid-of-apple_rtkit_send_message_.patch deleted file mode 100644 index 3125ed9ca..000000000 --- a/target/linux/silicon/patches-5.19/0137-soc-apple-rtkit-Get-rid-of-apple_rtkit_send_message_.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 0210c49f4d0e1b05db9d553f82b0c881fe3e7f08 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 5 May 2022 01:25:16 +0900 -Subject: [PATCH 137/171] soc: apple: rtkit: Get rid of - apple_rtkit_send_message_wait - -It is fundamentally broken and has no users. Just remove it. - -Signed-off-by: Hector Martin ---- - drivers/soc/apple/rtkit.c | 32 -------------------------------- - include/linux/soc/apple/rtkit.h | 18 ------------------ - 2 files changed, 50 deletions(-) - -diff --git a/drivers/soc/apple/rtkit.c b/drivers/soc/apple/rtkit.c -index 031ec4aa06d5..0a449e95c22b 100644 ---- a/drivers/soc/apple/rtkit.c -+++ b/drivers/soc/apple/rtkit.c -@@ -628,38 +628,6 @@ int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message, - } - EXPORT_SYMBOL_GPL(apple_rtkit_send_message); - --int apple_rtkit_send_message_wait(struct apple_rtkit *rtk, u8 ep, u64 message, -- unsigned long timeout, bool atomic) --{ -- DECLARE_COMPLETION_ONSTACK(completion); -- int ret; -- long t; -- -- ret = apple_rtkit_send_message(rtk, ep, message, &completion, atomic); -- if (ret < 0) -- return ret; -- -- if (atomic) { -- ret = mbox_flush(rtk->mbox_chan, timeout); -- if (ret < 0) -- return ret; -- -- if (try_wait_for_completion(&completion)) -- return 0; -- -- return -ETIME; -- } else { -- t = wait_for_completion_interruptible_timeout( -- &completion, msecs_to_jiffies(timeout)); -- if (t < 0) -- return t; -- else if (t == 0) -- return -ETIME; -- return 0; -- } --} --EXPORT_SYMBOL_GPL(apple_rtkit_send_message_wait); -- - int apple_rtkit_poll(struct apple_rtkit *rtk) - { - return mbox_client_peek_data(rtk->mbox_chan); -diff --git a/include/linux/soc/apple/rtkit.h b/include/linux/soc/apple/rtkit.h -index c9cabb679cd1..2d837aa7b91f 100644 ---- a/include/linux/soc/apple/rtkit.h -+++ b/include/linux/soc/apple/rtkit.h -@@ -134,24 +134,6 @@ int apple_rtkit_start_ep(struct apple_rtkit *rtk, u8 endpoint); - int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message, - struct completion *completion, bool atomic); - --/* -- * Send a message to the given endpoint and wait until it has been submitted -- * to the hardware FIFO. -- * Will return zero on success and a negative error code on failure -- * (e.g. -ETIME when the message couldn't be written within the given -- * timeout) -- * -- * @rtk: RTKit reference -- * @ep: target endpoint -- * @message: message to be sent -- * @timeout: timeout in milliseconds to allow the message transmission -- * to be completed -- * @atomic: if set to true this function can be called from atomic -- * context. -- */ --int apple_rtkit_send_message_wait(struct apple_rtkit *rtk, u8 ep, u64 message, -- unsigned long timeout, bool atomic); -- - /* - * Process incoming messages in atomic context. - * This only guarantees that messages arrive as far as the recv_message_early --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0138-platform-apple-Add-new-Apple-Mac-SMC-driver.patch b/target/linux/silicon/patches-5.19/0138-platform-apple-Add-new-Apple-Mac-SMC-driver.patch deleted file mode 100644 index 027f79cfe..000000000 --- a/target/linux/silicon/patches-5.19/0138-platform-apple-Add-new-Apple-Mac-SMC-driver.patch +++ /dev/null @@ -1,969 +0,0 @@ -From 97cb112f3f15d7fd60d75bdb09093d32dfa8cddc Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 4 Feb 2022 12:47:07 +0900 -Subject: [PATCH 138/171] platform/apple: Add new Apple Mac SMC driver - -This driver implements support for the SMC (System Management -Controller) in Apple Macs. In contrast to the existing applesmc driver, -it uses pluggable backends that allow it to support different SMC -implementations, and uses the MFD subsystem to expose the core SMC -functionality so that specific features (gpio, hwmon, battery, etc.) can -be implemented by separate drivers in their respective downstream -subsystems. - -The initial RTKit backend adds support for Apple Silicon Macs (M1 et -al). We hope a backend for T2 Macs will be written in the future -(since those are not supported by applesmc), and eventually an x86 -backend would allow us to fully deprecate applesmc in favor of this -driver. - -Signed-off-by: Hector Martin ---- - drivers/platform/Kconfig | 2 + - drivers/platform/Makefile | 1 + - drivers/platform/apple/Kconfig | 49 ++++ - drivers/platform/apple/Makefile | 11 + - drivers/platform/apple/smc.h | 28 ++ - drivers/platform/apple/smc_core.c | 249 ++++++++++++++++ - drivers/platform/apple/smc_rtkit.c | 451 +++++++++++++++++++++++++++++ - include/linux/mfd/macsmc.h | 86 ++++++ - 8 files changed, 877 insertions(+) - create mode 100644 drivers/platform/apple/Kconfig - create mode 100644 drivers/platform/apple/Makefile - create mode 100644 drivers/platform/apple/smc.h - create mode 100644 drivers/platform/apple/smc_core.c - create mode 100644 drivers/platform/apple/smc_rtkit.c - create mode 100644 include/linux/mfd/macsmc.h - -diff --git a/drivers/platform/Kconfig b/drivers/platform/Kconfig -index 18fc6a08569e..d683a75fc972 100644 ---- a/drivers/platform/Kconfig -+++ b/drivers/platform/Kconfig -@@ -15,3 +15,5 @@ source "drivers/platform/mellanox/Kconfig" - source "drivers/platform/olpc/Kconfig" - - source "drivers/platform/surface/Kconfig" -+ -+source "drivers/platform/apple/Kconfig" -diff --git a/drivers/platform/Makefile b/drivers/platform/Makefile -index 4de08ef4ec9d..3e5d5039a28c 100644 ---- a/drivers/platform/Makefile -+++ b/drivers/platform/Makefile -@@ -10,3 +10,4 @@ obj-$(CONFIG_OLPC_EC) += olpc/ - obj-$(CONFIG_GOLDFISH) += goldfish/ - obj-$(CONFIG_CHROME_PLATFORMS) += chrome/ - obj-$(CONFIG_SURFACE_PLATFORMS) += surface/ -+obj-$(CONFIG_APPLE_PLATFORMS) += apple/ -diff --git a/drivers/platform/apple/Kconfig b/drivers/platform/apple/Kconfig -new file mode 100644 -index 000000000000..42525aa9fbbe ---- /dev/null -+++ b/drivers/platform/apple/Kconfig -@@ -0,0 +1,49 @@ -+# SPDX-License-Identifier: GPL-2.0 -+# -+# Apple Platform-Specific Drivers -+# -+ -+menuconfig APPLE_PLATFORMS -+ bool "Apple Mac Platform-Specific Device Drivers" -+ default y -+ help -+ Say Y here to get to see options for platform-specific device drivers -+ for Apple devices. This option alone does not add any kernel code. -+ -+ If you say N, all options in this submenu will be skipped and disabled. -+ -+if APPLE_PLATFORMS -+ -+config APPLE_SMC -+ tristate "Apple SMC Driver" -+ depends on ARCH_APPLE || COMPILE_TEST -+ default ARCH_APPLE -+ select MFD_CORE -+ help -+ Build support for the Apple System Management Controller present in -+ Apple Macs. This driver currently supports the SMC in Apple Silicon -+ Macs. For x86 Macs, see the applesmc driver (SENSORS_APPLESMC). -+ -+ Say Y here if you have an Apple Silicon Mac. -+ -+ To compile this driver as a module, choose M here: the module will -+ be called macsmc. -+ -+if APPLE_SMC -+ -+config APPLE_SMC_RTKIT -+ tristate "RTKit (Apple Silicon) backend" -+ depends on ARCH_APPLE || COMPILE_TEST -+ depends on APPLE_RTKIT -+ default ARCH_APPLE -+ help -+ Build support for SMC communications via the RTKit backend. This is -+ required for Apple Silicon Macs. -+ -+ Say Y here if you have an Apple Silicon Mac. -+ -+ To compile this driver as a module, choose M here: the module will -+ be called macsmc-rtkit. -+ -+endif -+endif -diff --git a/drivers/platform/apple/Makefile b/drivers/platform/apple/Makefile -new file mode 100644 -index 000000000000..79fac195398b ---- /dev/null -+++ b/drivers/platform/apple/Makefile -@@ -0,0 +1,11 @@ -+# SPDX-License-Identifier: GPL-2.0 -+# -+# Makefile for linux/drivers/platform/apple -+# Apple Platform-Specific Drivers -+# -+ -+macsmc-y += smc_core.o -+macsmc-rtkit-y += smc_rtkit.o -+ -+obj-$(CONFIG_APPLE_SMC) += macsmc.o -+obj-$(CONFIG_APPLE_SMC_RTKIT) += macsmc-rtkit.o -diff --git a/drivers/platform/apple/smc.h b/drivers/platform/apple/smc.h -new file mode 100644 -index 000000000000..8ae51887b2c5 ---- /dev/null -+++ b/drivers/platform/apple/smc.h -@@ -0,0 +1,28 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple SMC internal core definitions -+ * Copyright (C) The Asahi Linux Contributors -+ */ -+ -+#ifndef _SMC_H -+#define _SMC_H -+ -+#include -+ -+struct apple_smc_backend_ops { -+ int (*read_key)(void *cookie, smc_key key, void *buf, size_t size); -+ int (*write_key)(void *cookie, smc_key key, void *buf, size_t size); -+ int (*write_key_atomic)(void *cookie, smc_key key, void *buf, size_t size); -+ int (*rw_key)(void *cookie, smc_key key, void *wbuf, size_t wsize, -+ void *rbuf, size_t rsize); -+ int (*get_key_by_index)(void *cookie, int index, smc_key *key); -+ int (*get_key_info)(void *cookie, smc_key key, struct apple_smc_key_info *info); -+}; -+ -+struct apple_smc *apple_smc_probe(struct device *dev, const struct apple_smc_backend_ops *ops, -+ void *cookie); -+void *apple_smc_get_cookie(struct apple_smc *smc); -+int apple_smc_remove(struct apple_smc *smc); -+void apple_smc_event_received(struct apple_smc *smc, uint32_t event); -+ -+#endif -diff --git a/drivers/platform/apple/smc_core.c b/drivers/platform/apple/smc_core.c -new file mode 100644 -index 000000000000..daf029cd072f ---- /dev/null -+++ b/drivers/platform/apple/smc_core.c -@@ -0,0 +1,249 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple SMC core framework -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include "smc.h" -+ -+struct apple_smc { -+ struct device *dev; -+ -+ void *be_cookie; -+ const struct apple_smc_backend_ops *be; -+ -+ struct mutex mutex; -+ -+ u32 key_count; -+ smc_key first_key; -+ smc_key last_key; -+ -+ struct blocking_notifier_head event_handlers; -+}; -+ -+static const struct mfd_cell apple_smc_devs[] = { -+ { -+ .name = "macsmc-gpio", -+ }, -+ { -+ .name = "macsmc-hid", -+ }, -+ { -+ .name = "macsmc-power", -+ }, -+ { -+ .name = "macsmc-reboot", -+ }, -+ { -+ .name = "macsmc-rtc", -+ }, -+}; -+ -+int apple_smc_read(struct apple_smc *smc, smc_key key, void *buf, size_t size) -+{ -+ int ret; -+ -+ mutex_lock(&smc->mutex); -+ ret = smc->be->read_key(smc->be_cookie, key, buf, size); -+ mutex_unlock(&smc->mutex); -+ -+ return ret; -+} -+EXPORT_SYMBOL(apple_smc_read); -+ -+int apple_smc_write(struct apple_smc *smc, smc_key key, void *buf, size_t size) -+{ -+ int ret; -+ -+ mutex_lock(&smc->mutex); -+ ret = smc->be->write_key(smc->be_cookie, key, buf, size); -+ mutex_unlock(&smc->mutex); -+ -+ return ret; -+} -+EXPORT_SYMBOL(apple_smc_write); -+ -+int apple_smc_write_atomic(struct apple_smc *smc, smc_key key, void *buf, size_t size) -+{ -+ int ret; -+ -+ /* -+ * Will fail if SMC is busy. This is only used by SMC reboot/poweroff -+ * final calls, so it doesn't really matter at that point. -+ */ -+ if (!mutex_trylock(&smc->mutex)) -+ return -EBUSY; -+ -+ ret = smc->be->write_key_atomic(smc->be_cookie, key, buf, size); -+ mutex_unlock(&smc->mutex); -+ -+ return ret; -+} -+EXPORT_SYMBOL(apple_smc_write_atomic); -+ -+int apple_smc_rw(struct apple_smc *smc, smc_key key, void *wbuf, size_t wsize, -+ void *rbuf, size_t rsize) -+{ -+ int ret; -+ -+ mutex_lock(&smc->mutex); -+ ret = smc->be->rw_key(smc->be_cookie, key, wbuf, wsize, rbuf, rsize); -+ mutex_unlock(&smc->mutex); -+ -+ return ret; -+} -+EXPORT_SYMBOL(apple_smc_rw); -+ -+int apple_smc_get_key_by_index(struct apple_smc *smc, int index, smc_key *key) -+{ -+ int ret; -+ -+ mutex_lock(&smc->mutex); -+ ret = smc->be->get_key_by_index(smc->be_cookie, index, key); -+ mutex_unlock(&smc->mutex); -+ -+ return ret; -+} -+EXPORT_SYMBOL(apple_smc_get_key_by_index); -+ -+int apple_smc_get_key_info(struct apple_smc *smc, smc_key key, struct apple_smc_key_info *info) -+{ -+ int ret; -+ -+ mutex_lock(&smc->mutex); -+ ret = smc->be->get_key_info(smc->be_cookie, key, info); -+ mutex_unlock(&smc->mutex); -+ -+ return ret; -+} -+EXPORT_SYMBOL(apple_smc_get_key_info); -+ -+int apple_smc_find_first_key_index(struct apple_smc *smc, smc_key key) -+{ -+ int start = 0, count = smc->key_count; -+ int ret; -+ -+ if (key <= smc->first_key) -+ return 0; -+ if (key > smc->last_key) -+ return smc->key_count; -+ -+ while (count > 1) { -+ int pivot = start + ((count - 1) >> 1); -+ smc_key pkey; -+ -+ ret = apple_smc_get_key_by_index(smc, pivot, &pkey); -+ if (ret < 0) -+ return ret; -+ -+ if (pkey == key) -+ return pivot; -+ -+ pivot++; -+ -+ if (pkey < key) { -+ count -= pivot - start; -+ start = pivot; -+ } else { -+ count = pivot - start; -+ } -+ } -+ -+ return start; -+} -+EXPORT_SYMBOL(apple_smc_find_first_key_index); -+ -+int apple_smc_get_key_count(struct apple_smc *smc) -+{ -+ return smc->key_count; -+} -+EXPORT_SYMBOL(apple_smc_get_key_count); -+ -+void apple_smc_event_received(struct apple_smc *smc, uint32_t event) -+{ -+ dev_dbg(smc->dev, "Event: 0x%08x\n", event); -+ blocking_notifier_call_chain(&smc->event_handlers, event, NULL); -+} -+EXPORT_SYMBOL(apple_smc_event_received); -+ -+int apple_smc_register_notifier(struct apple_smc *smc, struct notifier_block *n) -+{ -+ return blocking_notifier_chain_register(&smc->event_handlers, n); -+} -+EXPORT_SYMBOL(apple_smc_register_notifier); -+ -+int apple_smc_unregister_notifier(struct apple_smc *smc, struct notifier_block *n) -+{ -+ return blocking_notifier_chain_unregister(&smc->event_handlers, n); -+} -+EXPORT_SYMBOL(apple_smc_unregister_notifier); -+ -+void *apple_smc_get_cookie(struct apple_smc *smc) -+{ -+ return smc->be_cookie; -+} -+EXPORT_SYMBOL(apple_smc_get_cookie); -+ -+struct apple_smc *apple_smc_probe(struct device *dev, const struct apple_smc_backend_ops *ops, void *cookie) -+{ -+ struct apple_smc *smc; -+ u32 count; -+ int ret; -+ -+ smc = devm_kzalloc(dev, sizeof(*smc), GFP_KERNEL); -+ if (!smc) -+ return ERR_PTR(-ENOMEM); -+ -+ smc->dev = dev; -+ smc->be_cookie = cookie; -+ smc->be = ops; -+ mutex_init(&smc->mutex); -+ BLOCKING_INIT_NOTIFIER_HEAD(&smc->event_handlers); -+ -+ ret = apple_smc_read_u32(smc, SMC_KEY(#KEY), &count); -+ if (ret) -+ return ERR_PTR(dev_err_probe(dev, ret, "Failed to get key count")); -+ smc->key_count = be32_to_cpu(count); -+ -+ ret = apple_smc_get_key_by_index(smc, 0, &smc->first_key); -+ if (ret) -+ return ERR_PTR(dev_err_probe(dev, ret, "Failed to get first key")); -+ -+ ret = apple_smc_get_key_by_index(smc, smc->key_count - 1, &smc->last_key); -+ if (ret) -+ return ERR_PTR(dev_err_probe(dev, ret, "Failed to get last key")); -+ -+ /* Enable notifications */ -+ apple_smc_write_flag(smc, SMC_KEY(NTAP), 1); -+ -+ dev_info(dev, "Initialized (%d keys %p4ch..%p4ch)\n", -+ smc->key_count, &smc->first_key, &smc->last_key); -+ -+ dev_set_drvdata(dev, smc); -+ -+ ret = mfd_add_devices(dev, -1, apple_smc_devs, ARRAY_SIZE(apple_smc_devs), NULL, 0, NULL); -+ if (ret) -+ return ERR_PTR(dev_err_probe(dev, ret, "Subdevice initialization failed")); -+ -+ return smc; -+} -+EXPORT_SYMBOL(apple_smc_probe); -+ -+int apple_smc_remove(struct apple_smc *smc) -+{ -+ mfd_remove_devices(smc->dev); -+ -+ /* Disable notifications */ -+ apple_smc_write_flag(smc, SMC_KEY(NTAP), 1); -+ -+ return 0; -+} -+EXPORT_SYMBOL(apple_smc_remove); -+ -+MODULE_AUTHOR("Hector Martin "); -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_DESCRIPTION("Apple SMC core"); -diff --git a/drivers/platform/apple/smc_rtkit.c b/drivers/platform/apple/smc_rtkit.c -new file mode 100644 -index 000000000000..5b7c4c475bbb ---- /dev/null -+++ b/drivers/platform/apple/smc_rtkit.c -@@ -0,0 +1,451 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple SMC RTKit backend -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include "smc.h" -+ -+#define SMC_ENDPOINT 0x20 -+ -+/* Guess */ -+#define SMC_SHMEM_SIZE 0x1000 -+ -+#define SMC_MSG_READ_KEY 0x10 -+#define SMC_MSG_WRITE_KEY 0x11 -+#define SMC_MSG_GET_KEY_BY_INDEX 0x12 -+#define SMC_MSG_GET_KEY_INFO 0x13 -+#define SMC_MSG_INITIALIZE 0x17 -+#define SMC_MSG_NOTIFICATION 0x18 -+#define SMC_MSG_RW_KEY 0x20 -+ -+#define SMC_DATA GENMASK(63, 32) -+#define SMC_WSIZE GENMASK(31, 24) -+#define SMC_SIZE GENMASK(23, 16) -+#define SMC_ID GENMASK(15, 12) -+#define SMC_MSG GENMASK(7, 0) -+#define SMC_RESULT SMC_MSG -+ -+#define SMC_RECV_TIMEOUT 100 -+ -+struct apple_smc_rtkit { -+ struct device *dev; -+ struct apple_smc *core; -+ struct apple_rtkit *rtk; -+ -+ struct completion init_done; -+ bool initialized; -+ bool alive; -+ -+ struct resource *sram; -+ void __iomem *sram_base; -+ struct apple_rtkit_shmem shmem; -+ -+ unsigned int msg_id; -+ -+ bool atomic_pending; -+ struct completion cmd_done; -+ u64 cmd_ret; -+}; -+ -+static int apple_smc_rtkit_write_key_atomic(void *cookie, smc_key key, void *buf, size_t size) -+{ -+ struct apple_smc_rtkit *smc = cookie; -+ int ret; -+ u64 msg; -+ u8 result; -+ -+ if (size > SMC_SHMEM_SIZE || size == 0) -+ return -EINVAL; -+ -+ if (!smc->alive) -+ return -EIO; -+ -+ memcpy_toio(smc->shmem.iomem, buf, size); -+ smc->msg_id = (smc->msg_id + 1) & 0xf; -+ msg = (FIELD_PREP(SMC_MSG, SMC_MSG_WRITE_KEY) | -+ FIELD_PREP(SMC_SIZE, size) | -+ FIELD_PREP(SMC_ID, smc->msg_id) | -+ FIELD_PREP(SMC_DATA, key)); -+ smc->atomic_pending = true; -+ -+ ret = apple_rtkit_send_message(smc->rtk, SMC_ENDPOINT, msg, NULL, true); -+ if (ret < 0) { -+ dev_err(smc->dev, "Failed to send command (%d)\n", ret); -+ return ret; -+ } -+ -+ while (smc->atomic_pending) { -+ ret = apple_rtkit_poll(smc->rtk); -+ if (ret < 0) { -+ dev_err(smc->dev, "RTKit poll failed (%llx)", msg); -+ return ret; -+ } -+ udelay(100); -+ } -+ -+ if (FIELD_GET(SMC_ID, smc->cmd_ret) != smc->msg_id) { -+ dev_err(smc->dev, "Command sequence mismatch (expected %d, got %d)\n", -+ smc->msg_id, (unsigned int)FIELD_GET(SMC_ID, smc->cmd_ret)); -+ return -EIO; -+ } -+ -+ result = FIELD_GET(SMC_RESULT, smc->cmd_ret); -+ if (result != 0) -+ return -result; -+ -+ return FIELD_GET(SMC_SIZE, smc->cmd_ret); -+} -+ -+static int apple_smc_cmd(struct apple_smc_rtkit *smc, u64 cmd, u64 arg, -+ u64 size, u64 wsize, u32 *ret_data) -+{ -+ int ret; -+ u64 msg; -+ u8 result; -+ -+ if (!smc->alive) -+ return -EIO; -+ -+ reinit_completion(&smc->cmd_done); -+ -+ smc->msg_id = (smc->msg_id + 1) & 0xf; -+ msg = (FIELD_PREP(SMC_MSG, cmd) | -+ FIELD_PREP(SMC_SIZE, size) | -+ FIELD_PREP(SMC_WSIZE, wsize) | -+ FIELD_PREP(SMC_ID, smc->msg_id) | -+ FIELD_PREP(SMC_DATA, arg)); -+ -+ ret = apple_rtkit_send_message(smc->rtk, SMC_ENDPOINT, msg, NULL, false); -+ if (ret < 0) { -+ dev_err(smc->dev, "Failed to send command\n"); -+ return ret; -+ } -+ -+ do { -+ if (wait_for_completion_timeout(&smc->cmd_done, -+ msecs_to_jiffies(SMC_RECV_TIMEOUT)) == 0) { -+ dev_err(smc->dev, "Command timed out (%llx)", msg); -+ return -ETIMEDOUT; -+ } -+ if (FIELD_GET(SMC_ID, smc->cmd_ret) == smc->msg_id) -+ break; -+ dev_err(smc->dev, "Command sequence mismatch (expected %d, got %d)\n", -+ smc->msg_id, (unsigned int)FIELD_GET(SMC_ID, smc->cmd_ret)); -+ } while(1); -+ -+ result = FIELD_GET(SMC_RESULT, smc->cmd_ret); -+ if (result != 0) -+ return -result; -+ -+ if (ret_data) -+ *ret_data = FIELD_GET(SMC_DATA, smc->cmd_ret); -+ -+ return FIELD_GET(SMC_SIZE, smc->cmd_ret); -+} -+ -+static int _apple_smc_rtkit_read_key(struct apple_smc_rtkit *smc, smc_key key, -+ void *buf, size_t size, size_t wsize) -+{ -+ int ret; -+ u32 rdata; -+ u64 cmd; -+ -+ if (size > SMC_SHMEM_SIZE || size == 0) -+ return -EINVAL; -+ -+ cmd = wsize ? SMC_MSG_RW_KEY : SMC_MSG_READ_KEY; -+ -+ ret = apple_smc_cmd(smc, cmd, key, size, wsize, &rdata); -+ if (ret < 0) -+ return ret; -+ -+ if (size <= 4) -+ memcpy(buf, &rdata, size); -+ else -+ memcpy_fromio(buf, smc->shmem.iomem, size); -+ -+ return ret; -+} -+ -+static int apple_smc_rtkit_read_key(void *cookie, smc_key key, void *buf, size_t size) -+{ -+ return _apple_smc_rtkit_read_key(cookie, key, buf, size, 0); -+} -+ -+static int apple_smc_rtkit_write_key(void *cookie, smc_key key, void *buf, size_t size) -+{ -+ struct apple_smc_rtkit *smc = cookie; -+ -+ if (size > SMC_SHMEM_SIZE || size == 0) -+ return -EINVAL; -+ -+ memcpy_toio(smc->shmem.iomem, buf, size); -+ return apple_smc_cmd(smc, SMC_MSG_WRITE_KEY, key, size, 0, NULL); -+} -+ -+static int apple_smc_rtkit_rw_key(void *cookie, smc_key key, -+ void *wbuf, size_t wsize, void *rbuf, size_t rsize) -+{ -+ struct apple_smc_rtkit *smc = cookie; -+ -+ if (wsize > SMC_SHMEM_SIZE || wsize == 0) -+ return -EINVAL; -+ -+ memcpy_toio(smc->shmem.iomem, wbuf, wsize); -+ return _apple_smc_rtkit_read_key(smc, key, rbuf, rsize, wsize); -+} -+ -+static int apple_smc_rtkit_get_key_by_index(void *cookie, int index, smc_key *key) -+{ -+ struct apple_smc_rtkit *smc = cookie; -+ int ret; -+ -+ ret = apple_smc_cmd(smc, SMC_MSG_GET_KEY_BY_INDEX, index, 0, 0, key); -+ -+ *key = swab32(*key); -+ return ret; -+} -+ -+static int apple_smc_rtkit_get_key_info(void *cookie, smc_key key, struct apple_smc_key_info *info) -+{ -+ struct apple_smc_rtkit *smc = cookie; -+ u8 key_info[6]; -+ int ret; -+ -+ ret = apple_smc_cmd(smc, SMC_MSG_GET_KEY_INFO, key, 0, 0, NULL); -+ if (ret >= 0 && info) { -+ info->size = key_info[0]; -+ info->type_code = get_unaligned_be32(&key_info[1]); -+ info->flags = key_info[5]; -+ } -+ return ret; -+} -+ -+static const struct apple_smc_backend_ops apple_smc_rtkit_be_ops = { -+ .read_key = apple_smc_rtkit_read_key, -+ .write_key = apple_smc_rtkit_write_key, -+ .write_key_atomic = apple_smc_rtkit_write_key_atomic, -+ .rw_key = apple_smc_rtkit_rw_key, -+ .get_key_by_index = apple_smc_rtkit_get_key_by_index, -+ .get_key_info = apple_smc_rtkit_get_key_info, -+}; -+ -+static void apple_smc_rtkit_crashed(void *cookie) -+{ -+ struct apple_smc_rtkit *smc = cookie; -+ -+ dev_err(smc->dev, "SMC crashed! Your system will reboot in a few seconds...\n"); -+ smc->alive = false; -+} -+ -+static int apple_smc_rtkit_shmem_setup(void *cookie, struct apple_rtkit_shmem *bfr) -+{ -+ struct apple_smc_rtkit *smc = cookie; -+ struct resource res = { -+ .start = bfr->iova, -+ .end = bfr->iova + bfr->size - 1, -+ .name = "rtkit_map", -+ .flags = smc->sram->flags, -+ }; -+ -+ if (!bfr->iova) { -+ dev_err(smc->dev, "RTKit wants a RAM buffer\n"); -+ return -EIO; -+ } -+ -+ if (res.end < res.start || !resource_contains(smc->sram, &res)) { -+ dev_err(smc->dev, -+ "RTKit buffer request outside SRAM region: %pR", &res); -+ return -EFAULT; -+ } -+ -+ bfr->iomem = smc->sram_base + (res.start - smc->sram->start); -+ bfr->is_mapped = true; -+ -+ return 0; -+} -+ -+static void apple_smc_rtkit_shmem_destroy(void *cookie, struct apple_rtkit_shmem *bfr) -+{ -+ // no-op -+} -+ -+static bool apple_smc_rtkit_recv_early(void *cookie, u8 endpoint, u64 message) -+{ -+ struct apple_smc_rtkit *smc = cookie; -+ -+ if (endpoint != SMC_ENDPOINT) { -+ dev_err(smc->dev, "Received message for unknown endpoint 0x%x\n", endpoint); -+ return false; -+ } -+ -+ if (!smc->initialized) { -+ int ret; -+ -+ smc->shmem.iova = message; -+ smc->shmem.size = SMC_SHMEM_SIZE; -+ ret = apple_smc_rtkit_shmem_setup(smc, &smc->shmem); -+ if (ret < 0) -+ dev_err(smc->dev, "Failed to initialize shared memory\n"); -+ else -+ smc->alive = true; -+ smc->initialized = true; -+ complete(&smc->init_done); -+ } else if (FIELD_GET(SMC_MSG, message) == SMC_MSG_NOTIFICATION) { -+ /* Handle these in the RTKit worker thread */ -+ return false; -+ } else { -+ smc->cmd_ret = message; -+ if (smc->atomic_pending) { -+ smc->atomic_pending = false; -+ } else { -+ complete(&smc->cmd_done); -+ } -+ } -+ -+ return true; -+} -+ -+static void apple_smc_rtkit_recv(void *cookie, u8 endpoint, u64 message) -+{ -+ struct apple_smc_rtkit *smc = cookie; -+ -+ if (endpoint != SMC_ENDPOINT) { -+ dev_err(smc->dev, "Received message for unknown endpoint 0x%x\n", endpoint); -+ return; -+ } -+ -+ if (FIELD_GET(SMC_MSG, message) != SMC_MSG_NOTIFICATION) { -+ dev_err(smc->dev, "Received unknown message from worker: 0x%llx\n", message); -+ return; -+ } -+ -+ apple_smc_event_received(smc->core, FIELD_GET(SMC_DATA, message)); -+} -+ -+static const struct apple_rtkit_ops apple_smc_rtkit_ops = { -+ .crashed = apple_smc_rtkit_crashed, -+ .recv_message = apple_smc_rtkit_recv, -+ .recv_message_early = apple_smc_rtkit_recv_early, -+ .shmem_setup = apple_smc_rtkit_shmem_setup, -+ .shmem_destroy = apple_smc_rtkit_shmem_destroy, -+}; -+ -+static int apple_smc_rtkit_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct apple_smc_rtkit *smc; -+ int ret; -+ -+ smc = devm_kzalloc(dev, sizeof(*smc), GFP_KERNEL); -+ if (!smc) -+ return -ENOMEM; -+ -+ smc->dev = dev; -+ -+ smc->sram = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram"); -+ if (!smc->sram) -+ return dev_err_probe(dev, EIO, -+ "No SRAM region"); -+ -+ smc->sram_base = devm_ioremap_resource(dev, smc->sram); -+ if (IS_ERR(smc->sram_base)) -+ return dev_err_probe(dev, PTR_ERR(smc->sram_base), -+ "Failed to map SRAM region"); -+ -+ smc->rtk = -+ devm_apple_rtkit_init(dev, smc, NULL, 0, &apple_smc_rtkit_ops); -+ if (IS_ERR(smc->rtk)) -+ return dev_err_probe(dev, PTR_ERR(smc->rtk), -+ "Failed to intialize RTKit"); -+ -+ ret = apple_rtkit_wake(smc->rtk); -+ if (ret != 0) -+ return dev_err_probe(dev, ret, -+ "Failed to wake up SMC"); -+ -+ ret = apple_rtkit_start_ep(smc->rtk, SMC_ENDPOINT); -+ if (ret != 0) { -+ dev_err(dev, "Failed to start endpoint"); -+ goto cleanup; -+ } -+ -+ init_completion(&smc->init_done); -+ init_completion(&smc->cmd_done); -+ -+ ret = apple_rtkit_send_message(smc->rtk, SMC_ENDPOINT, -+ FIELD_PREP(SMC_MSG, SMC_MSG_INITIALIZE), NULL, false); -+ if (ret < 0) -+ return dev_err_probe(dev, ret, -+ "Failed to send init message"); -+ -+ if (wait_for_completion_timeout(&smc->init_done, -+ msecs_to_jiffies(SMC_RECV_TIMEOUT)) == 0) { -+ ret = -ETIMEDOUT; -+ dev_err(dev, "Timed out initializing SMC"); -+ goto cleanup; -+ } -+ -+ if (!smc->alive) { -+ ret = -EIO; -+ goto cleanup; -+ } -+ -+ smc->core = apple_smc_probe(dev, &apple_smc_rtkit_be_ops, smc); -+ if (IS_ERR(smc->core)) { -+ ret = PTR_ERR(smc->core); -+ goto cleanup; -+ } -+ -+ return 0; -+ -+cleanup: -+ /* Try to shut down RTKit, if it's not completely wedged */ -+ if (apple_rtkit_is_running(smc->rtk)) -+ apple_rtkit_quiesce(smc->rtk); -+ -+ return ret; -+} -+ -+static int apple_smc_rtkit_remove(struct platform_device *pdev) -+{ -+ struct apple_smc *core = platform_get_drvdata(pdev); -+ struct apple_smc_rtkit *smc = apple_smc_get_cookie(core); -+ -+ apple_smc_remove(core); -+ -+ if (apple_rtkit_is_running(smc->rtk)) -+ apple_rtkit_quiesce(smc->rtk); -+ -+ return 0; -+} -+ -+static const struct of_device_id apple_smc_rtkit_of_match[] = { -+ { .compatible = "apple,smc" }, -+ {}, -+}; -+MODULE_DEVICE_TABLE(of, apple_smc_rtkit_of_match); -+ -+static struct platform_driver apple_smc_rtkit_driver = { -+ .driver = { -+ .name = "macsmc-rtkit", -+ .owner = THIS_MODULE, -+ .of_match_table = apple_smc_rtkit_of_match, -+ }, -+ .probe = apple_smc_rtkit_probe, -+ .remove = apple_smc_rtkit_remove, -+}; -+module_platform_driver(apple_smc_rtkit_driver); -+ -+MODULE_AUTHOR("Hector Martin "); -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_DESCRIPTION("Apple SMC RTKit backend driver"); -diff --git a/include/linux/mfd/macsmc.h b/include/linux/mfd/macsmc.h -new file mode 100644 -index 000000000000..39b4dc4ca881 ---- /dev/null -+++ b/include/linux/mfd/macsmc.h -@@ -0,0 +1,86 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple SMC core definitions -+ * Copyright (C) The Asahi Linux Contributors -+ */ -+ -+#ifndef _LINUX_MFD_MACSMC_H -+#define _LINUX_MFD_MACSMC_H -+ -+struct apple_smc; -+ -+typedef u32 smc_key; -+ -+#define SMC_KEY(s) (smc_key)(_SMC_KEY(#s)) -+#define _SMC_KEY(s) (((s)[0] << 24) | ((s)[1] << 16) | ((s)[2] << 8) | (s)[3]) -+ -+#define APPLE_SMC_READABLE BIT(7) -+#define APPLE_SMC_WRITABLE BIT(6) -+#define APPLE_SMC_FUNCTION BIT(4) -+ -+struct apple_smc_key_info { -+ u8 size; -+ u32 type_code; -+ u8 flags; -+}; -+ -+int apple_smc_read(struct apple_smc *smc, smc_key key, void *buf, size_t size); -+int apple_smc_write(struct apple_smc *smc, smc_key key, void *buf, size_t size); -+int apple_smc_write_atomic(struct apple_smc *smc, smc_key key, void *buf, size_t size); -+int apple_smc_rw(struct apple_smc *smc, smc_key key, void *wbuf, size_t wsize, -+ void *rbuf, size_t rsize); -+ -+int apple_smc_get_key_count(struct apple_smc *smc); -+int apple_smc_find_first_key_index(struct apple_smc *smc, smc_key key); -+int apple_smc_get_key_by_index(struct apple_smc *smc, int index, smc_key *key); -+int apple_smc_get_key_info(struct apple_smc *smc, smc_key key, struct apple_smc_key_info *info); -+ -+static inline bool apple_smc_key_exists(struct apple_smc *smc, smc_key key) -+{ -+ return apple_smc_get_key_info(smc, key, NULL) >= 0; -+} -+ -+#define APPLE_SMC_TYPE_OPS(type) \ -+ static inline int apple_smc_read_##type(struct apple_smc *smc, smc_key key, type *p) \ -+ { \ -+ int ret = apple_smc_read(smc, key, p, sizeof(*p)); \ -+ return (ret < 0) ? ret : ((ret != sizeof(*p)) ? -EINVAL : 0); \ -+ } \ -+ static inline int apple_smc_write_##type(struct apple_smc *smc, smc_key key, type p) \ -+ { \ -+ return apple_smc_write(smc, key, &p, sizeof(p)); \ -+ } \ -+ static inline int apple_smc_write_##type##_atomic(struct apple_smc *smc, smc_key key, type p) \ -+ { \ -+ return apple_smc_write_atomic(smc, key, &p, sizeof(p)); \ -+ } \ -+ static inline int apple_smc_rw_##type(struct apple_smc *smc, smc_key key, \ -+ type w, type *r) \ -+ { \ -+ int ret = apple_smc_rw(smc, key, &w, sizeof(w), r, sizeof(*r)); \ -+ return (ret < 0) ? ret : ((ret != sizeof(*r)) ? -EINVAL : 0); \ -+ } -+ -+APPLE_SMC_TYPE_OPS(u64) -+APPLE_SMC_TYPE_OPS(u32) -+APPLE_SMC_TYPE_OPS(u16) -+APPLE_SMC_TYPE_OPS(u8) -+APPLE_SMC_TYPE_OPS(s64) -+APPLE_SMC_TYPE_OPS(s32) -+APPLE_SMC_TYPE_OPS(s16) -+APPLE_SMC_TYPE_OPS(s8) -+ -+static inline int apple_smc_read_flag(struct apple_smc *smc, smc_key key) -+{ -+ u8 val; -+ int ret = apple_smc_read_u8(smc, key, &val); -+ if (ret < 0) -+ return ret; -+ return val ? 1 : 0; -+} -+#define apple_smc_write_flag apple_smc_write_u8 -+ -+int apple_smc_register_notifier(struct apple_smc *smc, struct notifier_block *n); -+int apple_smc_unregister_notifier(struct apple_smc *smc, struct notifier_block *n); -+ -+#endif --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0139-gpio-Add-new-gpio-macsmc-driver-for-Apple-Macs.patch b/target/linux/silicon/patches-5.19/0139-gpio-Add-new-gpio-macsmc-driver-for-Apple-Macs.patch deleted file mode 100644 index fe5d87ef9..000000000 --- a/target/linux/silicon/patches-5.19/0139-gpio-Add-new-gpio-macsmc-driver-for-Apple-Macs.patch +++ /dev/null @@ -1,307 +0,0 @@ -From ab3bf52a9b94de3d827d13bd6cfb1f1b6c6acc27 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 4 Feb 2022 12:52:52 +0900 -Subject: [PATCH 139/171] gpio: Add new gpio-macsmc driver for Apple Macs - -This driver implements the GPIO service on top of the SMC framework -on Apple Mac machines. In particular, these are the GPIOs present in the -PMU IC which are used to control power to certain on-board devices. - -Although the underlying hardware supports various pin config settings -(input/output, open drain, etc.), this driver does not implement that -functionality and leaves it up to the firmware to configure things -properly. We also don't yet support interrupts/events. This is -sufficient for device power control, which is the only thing we need to -support at this point. More features will be implemented when needed. - -To our knowledge, only Apple Silicon Macs implement this SMC feature. - -Signed-off-by: Hector Martin ---- - drivers/gpio/Kconfig | 11 ++ - drivers/gpio/Makefile | 1 + - drivers/gpio/gpio-macsmc.c | 238 +++++++++++++++++++++++++++++++++++++ - 3 files changed, 250 insertions(+) - create mode 100644 drivers/gpio/gpio-macsmc.c - -diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig -index b01961999ced..fc35a7ca31dd 100644 ---- a/drivers/gpio/Kconfig -+++ b/drivers/gpio/Kconfig -@@ -1282,6 +1282,17 @@ config GPIO_LP87565 - This driver can also be built as a module. If so, the module will be - called gpio-lp87565. - -+config GPIO_MACSMC -+ tristate "Apple Mac SMC GPIO" -+ depends on APPLE_SMC -+ default ARCH_APPLE -+ help -+ Support for GPIOs controlled by the SMC microcontroller on Apple Mac -+ systems. -+ -+ This driver can also be built as a module. If so, the module will be -+ called gpio-macsmc. -+ - config GPIO_MADERA - tristate "Cirrus Logic Madera class codecs" - depends on PINCTRL_MADERA -diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile -index 14352f6dfe8e..5f7ec8fc6cdd 100644 ---- a/drivers/gpio/Makefile -+++ b/drivers/gpio/Makefile -@@ -82,6 +82,7 @@ obj-$(CONFIG_GPIO_LP873X) += gpio-lp873x.o - obj-$(CONFIG_GPIO_LP87565) += gpio-lp87565.o - obj-$(CONFIG_GPIO_LPC18XX) += gpio-lpc18xx.o - obj-$(CONFIG_GPIO_LPC32XX) += gpio-lpc32xx.o -+obj-$(CONFIG_GPIO_MACSMC) += gpio-macsmc.o - obj-$(CONFIG_GPIO_MADERA) += gpio-madera.o - obj-$(CONFIG_GPIO_MAX3191X) += gpio-max3191x.o - obj-$(CONFIG_GPIO_MAX7300) += gpio-max7300.o -diff --git a/drivers/gpio/gpio-macsmc.c b/drivers/gpio/gpio-macsmc.c -new file mode 100644 -index 000000000000..ff9950afb69a ---- /dev/null -+++ b/drivers/gpio/gpio-macsmc.c -@@ -0,0 +1,238 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple SMC GPIO driver -+ * Copyright The Asahi Linux Contributors -+ * -+ * This driver implements basic SMC PMU GPIO support that can read inputs -+ * and write outputs. Mode changes and IRQ config are not yet implemented. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#define MAX_GPIO 64 -+ -+/* -+ * Commands 0-6 are, presumably, the intended API. -+ * Command 0xff lets you get/set the pin configuration in detail directly, -+ * but the bit meanings seem not to be stable between devices/PMU hardware -+ * versions. -+ * -+ * We're going to try to make do with the low commands for now. -+ * We don't implement pin mode changes at this time. -+ */ -+ -+#define CMD_ACTION (0 << 24) -+#define CMD_OUTPUT (1 << 24) -+#define CMD_INPUT (2 << 24) -+#define CMD_PINMODE (3 << 24) -+#define CMD_IRQ_ENABLE (4 << 24) -+#define CMD_IRQ_ACK (5 << 24) -+#define CMD_IRQ_MODE (6 << 24) -+#define CMD_CONFIG (0xff << 24) -+ -+#define MODE_INPUT 0 -+#define MODE_OUTPUT 1 -+#define MODE_VALUE_0 0 -+#define MODE_VALUE_1 2 -+ -+#define IRQ_MODE_HIGH 0 -+#define IRQ_MODE_LOW 1 -+#define IRQ_MODE_RISING 2 -+#define IRQ_MODE_FALLING 3 -+#define IRQ_MODE_BOTH 4 -+ -+#define CONFIG_MASK GENMASK(23, 16) -+#define CONFIG_VAL GENMASK(7, 0) -+ -+#define CONFIG_OUTMODE GENMASK(7, 6) -+#define CONFIG_IRQMODE GENMASK(5, 3) -+#define CONFIG_PULLDOWN BIT(2) -+#define CONFIG_PULLUP BIT(1) -+#define CONFIG_OUTVAL BIT(0) -+ -+/* -+ * output modes seem to differ depending on the PMU in use... ? -+ * j274 / M1 (Sera PMU): -+ * 0 = input -+ * 1 = output -+ * 2 = open drain -+ * 3 = disable -+ * j314 / M1Pro (Maverick PMU): -+ * 0 = input -+ * 1 = open drain -+ * 2 = output -+ * 3 = ? -+ */ -+ -+struct macsmc_gpio { -+ struct device *dev; -+ struct apple_smc *smc; -+ struct gpio_chip gc; -+ -+ int first_index; -+}; -+ -+static int macsmc_gpio_nr(smc_key key) -+{ -+ int low = hex_to_bin(key & 0xff); -+ int high = hex_to_bin((key >> 8) & 0xff); -+ -+ if (low < 0 || high < 0) -+ return -1; -+ -+ return low | (high << 4); -+} -+ -+static int macsmc_gpio_key(unsigned int offset) -+{ -+ return _SMC_KEY("gP\0\0") | (hex_asc_hi(offset) << 8) | hex_asc_lo(offset); -+} -+ -+static int macsmc_gpio_get_direction(struct gpio_chip *gc, unsigned int offset) -+{ -+ struct macsmc_gpio *smcgp = gpiochip_get_data(gc); -+ smc_key key = macsmc_gpio_key(offset); -+ u32 val; -+ int ret; -+ -+ /* First try reading the explicit pin mode register */ -+ ret = apple_smc_rw_u32(smcgp->smc, key, CMD_PINMODE, &val); -+ if (!ret) -+ return (val & MODE_OUTPUT) ? GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN; -+ -+ /* -+ * Less common IRQ configs cause CMD_PINMODE to fail, and so does open drain mode. -+ * Fall back to reading IRQ mode, which will only succeed for inputs. -+ */ -+ ret = apple_smc_rw_u32(smcgp->smc, key, CMD_IRQ_MODE, &val); -+ return (!ret) ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT; -+} -+ -+static int macsmc_gpio_get(struct gpio_chip *gc, unsigned int offset) -+{ -+ struct macsmc_gpio *smcgp = gpiochip_get_data(gc); -+ smc_key key = macsmc_gpio_key(offset); -+ u32 val; -+ int ret; -+ -+ ret = macsmc_gpio_get_direction(gc, offset); -+ if (ret < 0) -+ return ret; -+ -+ if (ret == GPIO_LINE_DIRECTION_OUT) -+ ret = apple_smc_rw_u32(smcgp->smc, key, CMD_OUTPUT, &val); -+ else -+ ret = apple_smc_rw_u32(smcgp->smc, key, CMD_INPUT, &val); -+ -+ if (ret < 0) -+ return ret; -+ -+ return val ? 1 : 0; -+} -+ -+static void macsmc_gpio_set(struct gpio_chip *gc, unsigned int offset, int value) -+{ -+ struct macsmc_gpio *smcgp = gpiochip_get_data(gc); -+ smc_key key = macsmc_gpio_key(offset); -+ int ret; -+ -+ value |= CMD_OUTPUT; -+ ret = apple_smc_write_u32(smcgp->smc, key, CMD_OUTPUT | value); -+ if (ret < 0) -+ dev_err(smcgp->dev, "GPIO set failed %p4ch = 0x%x\n", &key, value); -+} -+ -+static int macsmc_gpio_init_valid_mask(struct gpio_chip *gc, -+ unsigned long *valid_mask, unsigned int ngpios) -+{ -+ struct macsmc_gpio *smcgp = gpiochip_get_data(gc); -+ int count = apple_smc_get_key_count(smcgp->smc) - smcgp->first_index; -+ int i; -+ -+ if (count > MAX_GPIO) -+ count = MAX_GPIO; -+ -+ bitmap_zero(valid_mask, ngpios); -+ -+ for (i = 0; i < count; i++) { -+ smc_key key; -+ int gpio_nr; -+ int ret = apple_smc_get_key_by_index(smcgp->smc, smcgp->first_index + i, &key); -+ -+ if (ret < 0) -+ return ret; -+ -+ if (key > SMC_KEY(gPff)) -+ break; -+ -+ gpio_nr = macsmc_gpio_nr(key); -+ if (gpio_nr < 0 || gpio_nr > MAX_GPIO) { -+ dev_err(smcgp->dev, "Bad GPIO key %p4ch\n", &key); -+ continue; -+ } -+ -+ set_bit(gpio_nr, valid_mask); -+ } -+ -+ return 0; -+} -+ -+static int macsmc_gpio_probe(struct platform_device *pdev) -+{ -+ struct macsmc_gpio *smcgp; -+ struct apple_smc *smc = dev_get_drvdata(pdev->dev.parent); -+ smc_key key; -+ int ret; -+ -+ smcgp = devm_kzalloc(&pdev->dev, sizeof(*smcgp), GFP_KERNEL); -+ if (!smcgp) -+ return -ENOMEM; -+ -+ pdev->dev.of_node = of_get_child_by_name(pdev->dev.parent->of_node, "gpio"); -+ -+ smcgp->dev = &pdev->dev; -+ smcgp->smc = smc; -+ smcgp->first_index = apple_smc_find_first_key_index(smc, SMC_KEY(gP00)); -+ -+ if (smcgp->first_index >= apple_smc_get_key_count(smc)) -+ return -ENODEV; -+ -+ ret = apple_smc_get_key_by_index(smc, smcgp->first_index, &key); -+ if (ret < 0) -+ return ret; -+ -+ if (key > macsmc_gpio_key(MAX_GPIO - 1)) -+ return -ENODEV; -+ -+ dev_info(smcgp->dev, "First GPIO key: %p4ch\n", &key); -+ -+ smcgp->gc.label = "macsmc-pmu-gpio"; -+ smcgp->gc.owner = THIS_MODULE; -+ smcgp->gc.get = macsmc_gpio_get; -+ smcgp->gc.set = macsmc_gpio_set; -+ smcgp->gc.get_direction = macsmc_gpio_get_direction; -+ smcgp->gc.init_valid_mask = macsmc_gpio_init_valid_mask; -+ smcgp->gc.can_sleep = true; -+ smcgp->gc.ngpio = MAX_GPIO; -+ smcgp->gc.base = -1; -+ smcgp->gc.parent = &pdev->dev; -+ -+ return devm_gpiochip_add_data(&pdev->dev, &smcgp->gc, smcgp); -+} -+ -+static struct platform_driver macsmc_gpio_driver = { -+ .driver = { -+ .name = "macsmc-gpio", -+ }, -+ .probe = macsmc_gpio_probe, -+}; -+module_platform_driver(macsmc_gpio_driver); -+ -+MODULE_AUTHOR("Hector Martin "); -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_DESCRIPTION("Apple SMC GPIO driver"); -+MODULE_ALIAS("platform:macsmc-gpio"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0140-power-supply-macsmc_power-Driver-for-Apple-SMC-power.patch b/target/linux/silicon/patches-5.19/0140-power-supply-macsmc_power-Driver-for-Apple-SMC-power.patch deleted file mode 100644 index 01b1cd008..000000000 --- a/target/linux/silicon/patches-5.19/0140-power-supply-macsmc_power-Driver-for-Apple-SMC-power.patch +++ /dev/null @@ -1,311 +0,0 @@ -From 908ad4e5e4a9fbac940cc4f03f51e5adc6a01dbf Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 8 Feb 2022 02:30:16 +0900 -Subject: [PATCH 140/171] power: supply: macsmc_power: Driver for Apple SMC - power/battery stats - -This driver implements support for battery stats on top of the macsmc -framework, to support Apple M1 Mac machines. - -Co-authored-by: Joey Gouly -Signed-off-by: Hector Martin ---- - drivers/power/supply/Kconfig | 7 + - drivers/power/supply/Makefile | 1 + - drivers/power/supply/macsmc_power.c | 259 ++++++++++++++++++++++++++++ - 3 files changed, 267 insertions(+) - create mode 100644 drivers/power/supply/macsmc_power.c - -diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig -index 1aa8323ad9f6..780941701795 100644 ---- a/drivers/power/supply/Kconfig -+++ b/drivers/power/supply/Kconfig -@@ -897,4 +897,11 @@ config BATTERY_UG3105 - device is off or suspended, the functionality of this driver is - limited to reporting capacity only. - -+config CHARGER_MACSMC -+ tristate "Apple SMC Charger / Battery support" -+ depends on APPLE_SMC -+ help -+ Say Y here to enable support for the charger and battery controls on -+ Apple SMC controllers, as used on Apple Silicon Macs. -+ - endif # POWER_SUPPLY -diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile -index 7f02f36aea55..bba0c6ad4101 100644 ---- a/drivers/power/supply/Makefile -+++ b/drivers/power/supply/Makefile -@@ -108,3 +108,4 @@ obj-$(CONFIG_BATTERY_ACER_A500) += acer_a500_battery.o - obj-$(CONFIG_BATTERY_SURFACE) += surface_battery.o - obj-$(CONFIG_CHARGER_SURFACE) += surface_charger.o - obj-$(CONFIG_BATTERY_UG3105) += ug3105_battery.o -+obj-$(CONFIG_CHARGER_MACSMC) += macsmc_power.o -diff --git a/drivers/power/supply/macsmc_power.c b/drivers/power/supply/macsmc_power.c -new file mode 100644 -index 000000000000..140526a963b6 ---- /dev/null -+++ b/drivers/power/supply/macsmc_power.c -@@ -0,0 +1,259 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple SMC Power/Battery Management -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define MAX_STRING_LENGTH 256 -+ -+struct macsmc_power { -+ struct device *dev; -+ struct apple_smc *smc; -+ struct power_supply *psy; -+ char model_name[MAX_STRING_LENGTH]; -+ char serial_number[MAX_STRING_LENGTH]; -+ -+ struct notifier_block nb; -+}; -+ -+static int macsmc_battery_get_status(struct macsmc_power *power) -+{ -+ u8 val; -+ int ret; -+ -+ ret = apple_smc_read_u8(power->smc, SMC_KEY(BSFC), &val); -+ if (ret) -+ return ret; -+ if (val == 1) -+ return POWER_SUPPLY_STATUS_FULL; -+ -+ ret = apple_smc_read_u8(power->smc, SMC_KEY(CHSC), &val); -+ if (ret) -+ return ret; -+ if (val == 1) -+ return POWER_SUPPLY_STATUS_CHARGING; -+ -+ ret = apple_smc_read_u8(power->smc, SMC_KEY(CHCC), &val); -+ if (ret) -+ return ret; -+ if (val == 0) -+ return POWER_SUPPLY_STATUS_DISCHARGING; -+ -+ ret = apple_smc_read_u8(power->smc, SMC_KEY(CHCE), &val); -+ if (ret) -+ return ret; -+ if (val == 0) -+ return POWER_SUPPLY_STATUS_DISCHARGING; -+ else -+ return POWER_SUPPLY_STATUS_NOT_CHARGING; -+ -+ -+} -+ -+static int macsmc_battery_get_property(struct power_supply *psy, -+ enum power_supply_property psp, -+ union power_supply_propval *val) -+{ -+ struct macsmc_power *power = power_supply_get_drvdata(psy); -+ int ret = 0; -+ u16 vu16; -+ u32 vu32; -+ s16 vs16; -+ s32 vs32; -+ s64 vs64; -+ -+ switch (psp) { -+ case POWER_SUPPLY_PROP_STATUS: -+ val->intval = macsmc_battery_get_status(power); -+ ret = val->intval < 0 ? val->intval : 0; -+ break; -+ case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0TE), &vu16); -+ val->intval = vu16 == 0xffff ? 0 : vu16 * 60; -+ break; -+ case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0TF), &vu16); -+ val->intval = vu16 == 0xffff ? 0 : vu16 * 60; -+ break; -+ case POWER_SUPPLY_PROP_CAPACITY: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(BRSC), &vu16); -+ val->intval = vu16; -+ break; -+ case POWER_SUPPLY_PROP_VOLTAGE_NOW: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0AV), &vu16); -+ val->intval = vu16 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_CURRENT_NOW: -+ ret = apple_smc_read_s16(power->smc, SMC_KEY(B0AC), &vs16); -+ val->intval = vs16 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_POWER_NOW: -+ ret = apple_smc_read_s32(power->smc, SMC_KEY(B0AP), &vs32); -+ val->intval = vs32 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(BITV), &vu16); -+ val->intval = vu16 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0RC), &vu16); -+ val->intval = vu16 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: -+ ret = apple_smc_read_u32(power->smc, SMC_KEY(CSIL), &vu32); -+ val->intval = vu32 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0RI), &vu16); -+ val->intval = vu16 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0RV), &vu16); -+ val->intval = vu16 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0DC), &vu16); -+ val->intval = vu16 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_CHARGE_FULL: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0FC), &vu16); -+ val->intval = vu16 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_CHARGE_NOW: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0RM), &vu16); -+ val->intval = swab16(vu16) * 1000; -+ break; -+ case POWER_SUPPLY_PROP_TEMP: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0AT), &vu16); -+ val->intval = vu16 - 2732; -+ break; -+ case POWER_SUPPLY_PROP_CHARGE_COUNTER: -+ ret = apple_smc_read_s64(power->smc, SMC_KEY(BAAC), &vs64); -+ val->intval = vs64; -+ break; -+ case POWER_SUPPLY_PROP_MODEL_NAME: -+ val->strval = power->model_name; -+ break; -+ case POWER_SUPPLY_PROP_SERIAL_NUMBER: -+ val->strval = power->serial_number; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ return ret; -+} -+ -+static enum power_supply_property macsmc_battery_props[] = { -+ POWER_SUPPLY_PROP_STATUS, -+ POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, -+ POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, -+ POWER_SUPPLY_PROP_CAPACITY, -+ POWER_SUPPLY_PROP_VOLTAGE_NOW, -+ POWER_SUPPLY_PROP_CURRENT_NOW, -+ POWER_SUPPLY_PROP_POWER_NOW, -+ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, -+ POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, -+ POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, -+ POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, -+ POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, -+ POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, -+ POWER_SUPPLY_PROP_CHARGE_FULL, -+ POWER_SUPPLY_PROP_CHARGE_NOW, -+ POWER_SUPPLY_PROP_TEMP, -+ POWER_SUPPLY_PROP_CHARGE_COUNTER, -+ POWER_SUPPLY_PROP_MODEL_NAME, -+ POWER_SUPPLY_PROP_SERIAL_NUMBER, -+}; -+ -+static const struct power_supply_desc macsmc_battery_desc = { -+ .name = "macsmc-battery", -+ .type = POWER_SUPPLY_TYPE_BATTERY, -+ .get_property = macsmc_battery_get_property, -+ .properties = macsmc_battery_props, -+ .num_properties = ARRAY_SIZE(macsmc_battery_props), -+}; -+ -+static int macsmc_power_event(struct notifier_block *nb, unsigned long event, void *data) -+{ -+ struct macsmc_power *power = container_of(nb, struct macsmc_power, nb); -+ -+ if ((event & 0xffffff00) == 0x71010100) { -+ bool charging = (event & 0xff) != 0; -+ -+ dev_info(power->dev, "Charging: %d\n", charging); -+ power_supply_changed(power->psy); -+ -+ return NOTIFY_OK; -+ } -+ -+ return NOTIFY_DONE; -+} -+ -+static int macsmc_power_probe(struct platform_device *pdev) -+{ -+ struct apple_smc *smc = dev_get_drvdata(pdev->dev.parent); -+ struct power_supply_config psy_cfg = {}; -+ struct macsmc_power *power; -+ int ret; -+ -+ power = devm_kzalloc(&pdev->dev, sizeof(*power), GFP_KERNEL); -+ if (!power) -+ return -ENOMEM; -+ -+ power->dev = &pdev->dev; -+ power->smc = smc; -+ dev_set_drvdata(&pdev->dev, power); -+ -+ /* Ignore devices without a charger/battery */ -+ if (macsmc_battery_get_status(power) <= POWER_SUPPLY_STATUS_UNKNOWN) -+ return -ENODEV; -+ -+ /* Fetch string properties */ -+ apple_smc_read(smc, SMC_KEY(BMDN), power->model_name, sizeof(power->model_name) - 1); -+ apple_smc_read(smc, SMC_KEY(BMSN), power->serial_number, sizeof(power->serial_number) - 1); -+ -+ psy_cfg.drv_data = power; -+ power->psy = devm_power_supply_register(&pdev->dev, &macsmc_battery_desc, &psy_cfg); -+ if (IS_ERR(power->psy)) { -+ dev_err(&pdev->dev, "Failed to register power supply\n"); -+ ret = PTR_ERR(power->psy); -+ return ret; -+ } -+ -+ power->nb.notifier_call = macsmc_power_event; -+ apple_smc_register_notifier(power->smc, &power->nb); -+ -+ return 0; -+} -+ -+static int macsmc_power_remove(struct platform_device *pdev) -+{ -+ struct macsmc_power *power = dev_get_drvdata(&pdev->dev); -+ -+ apple_smc_unregister_notifier(power->smc, &power->nb); -+ -+ return 0; -+} -+ -+static struct platform_driver macsmc_power_driver = { -+ .driver = { -+ .name = "macsmc-power", -+ .owner = THIS_MODULE, -+ }, -+ .probe = macsmc_power_probe, -+ .remove = macsmc_power_remove, -+}; -+module_platform_driver(macsmc_power_driver); -+ -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_DESCRIPTION("Apple SMC battery and power management driver"); -+MODULE_AUTHOR("Hector Martin "); -+MODULE_ALIAS("platform:macsmc-power"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0141-power-supply-macsmc_power-Add-cycle-count-and-health.patch b/target/linux/silicon/patches-5.19/0141-power-supply-macsmc_power-Add-cycle-count-and-health.patch deleted file mode 100644 index 07a2a0385..000000000 --- a/target/linux/silicon/patches-5.19/0141-power-supply-macsmc_power-Add-cycle-count-and-health.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 69645c0ba065a4414d633f62fb100e9ae2471fbb Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 8 Feb 2022 02:51:35 +0900 -Subject: [PATCH 141/171] power: supply: macsmc_power: Add cycle count and - health props - -Signed-off-by: Hector Martin ---- - drivers/power/supply/macsmc_power.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/drivers/power/supply/macsmc_power.c b/drivers/power/supply/macsmc_power.c -index 140526a963b6..6c939371912a 100644 ---- a/drivers/power/supply/macsmc_power.c -+++ b/drivers/power/supply/macsmc_power.c -@@ -138,6 +138,15 @@ static int macsmc_battery_get_property(struct power_supply *psy, - ret = apple_smc_read_s64(power->smc, SMC_KEY(BAAC), &vs64); - val->intval = vs64; - break; -+ case POWER_SUPPLY_PROP_CYCLE_COUNT: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(B0CT), &vu16); -+ val->intval = vu16; -+ break; -+ case POWER_SUPPLY_PROP_HEALTH: -+ ret = apple_smc_read_flag(power->smc, SMC_KEY(BBAD)); -+ val->intval = ret == 1 ? POWER_SUPPLY_HEALTH_DEAD : POWER_SUPPLY_HEALTH_GOOD; -+ ret = ret < 0 ? ret : 0; -+ break; - case POWER_SUPPLY_PROP_MODEL_NAME: - val->strval = power->model_name; - break; -@@ -169,6 +178,8 @@ static enum power_supply_property macsmc_battery_props[] = { - POWER_SUPPLY_PROP_CHARGE_NOW, - POWER_SUPPLY_PROP_TEMP, - POWER_SUPPLY_PROP_CHARGE_COUNTER, -+ POWER_SUPPLY_PROP_CYCLE_COUNT, -+ POWER_SUPPLY_PROP_HEALTH, - POWER_SUPPLY_PROP_MODEL_NAME, - POWER_SUPPLY_PROP_SERIAL_NUMBER, - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0142-power-supply-macsmc_power-Add-present-prop.patch b/target/linux/silicon/patches-5.19/0142-power-supply-macsmc_power-Add-present-prop.patch deleted file mode 100644 index b2f65566f..000000000 --- a/target/linux/silicon/patches-5.19/0142-power-supply-macsmc_power-Add-present-prop.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 912e600cd309a1c3ddc6a5166c6d5585dee915ff Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 8 Feb 2022 11:01:17 +0900 -Subject: [PATCH 142/171] power: supply: macsmc_power: Add present prop - -Signed-off-by: Hector Martin ---- - drivers/power/supply/macsmc_power.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/drivers/power/supply/macsmc_power.c b/drivers/power/supply/macsmc_power.c -index 6c939371912a..aa67762144d8 100644 ---- a/drivers/power/supply/macsmc_power.c -+++ b/drivers/power/supply/macsmc_power.c -@@ -74,6 +74,9 @@ static int macsmc_battery_get_property(struct power_supply *psy, - val->intval = macsmc_battery_get_status(power); - ret = val->intval < 0 ? val->intval : 0; - break; -+ case POWER_SUPPLY_PROP_PRESENT: -+ val->intval = 1; -+ break; - case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: - ret = apple_smc_read_u16(power->smc, SMC_KEY(B0TE), &vu16); - val->intval = vu16 == 0xffff ? 0 : vu16 * 60; -@@ -162,6 +165,7 @@ static int macsmc_battery_get_property(struct power_supply *psy, - - static enum power_supply_property macsmc_battery_props[] = { - POWER_SUPPLY_PROP_STATUS, -+ POWER_SUPPLY_PROP_PRESENT, - POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, - POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, - POWER_SUPPLY_PROP_CAPACITY, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0143-power-supply-macsmc_power-Add-more-props-rework-othe.patch b/target/linux/silicon/patches-5.19/0143-power-supply-macsmc_power-Add-more-props-rework-othe.patch deleted file mode 100644 index 0cf845e53..000000000 --- a/target/linux/silicon/patches-5.19/0143-power-supply-macsmc_power-Add-more-props-rework-othe.patch +++ /dev/null @@ -1,334 +0,0 @@ -From 2226f112885322e19b76f56acef517bea6bd399c Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 02:20:20 +0900 -Subject: [PATCH 143/171] power: supply: macsmc_power: Add more props, rework - others - -Signed-off-by: Hector Martin ---- - drivers/power/supply/macsmc_power.c | 224 +++++++++++++++++++++++++--- - 1 file changed, 202 insertions(+), 22 deletions(-) - -diff --git a/drivers/power/supply/macsmc_power.c b/drivers/power/supply/macsmc_power.c -index aa67762144d8..2cb1644055f4 100644 ---- a/drivers/power/supply/macsmc_power.c -+++ b/drivers/power/supply/macsmc_power.c -@@ -4,6 +4,7 @@ - * Copyright The Asahi Linux Contributors - */ - -+#include - #include - #include - #include -@@ -19,50 +20,178 @@ struct macsmc_power { - struct power_supply *psy; - char model_name[MAX_STRING_LENGTH]; - char serial_number[MAX_STRING_LENGTH]; -+ char mfg_date[MAX_STRING_LENGTH]; - - struct notifier_block nb; - }; - -+#define CHNC_BATTERY_FULL BIT(0) -+#define CHNC_NO_CHARGER BIT(7) -+#define CHNC_NOCHG_CH0C BIT(14) -+#define CHNC_NOCHG_CH0B_CH0K BIT(15) -+#define CHNC_BATTERY_FULL_2 BIT(18) -+#define CHNC_BMS_BUSY BIT(23) -+#define CHNC_NOAC_CH0J BIT(53) -+#define CHNC_NOAC_CH0I BIT(54) -+ -+#define CH0R_LOWER_FLAGS GENMASK(15, 0) -+#define CH0R_NOAC_CH0I BIT(0) -+#define CH0R_NOAC_CH0J BIT(5) -+#define CH0R_BMS_BUSY BIT(8) -+#define CH0R_NOAC_CH0K BIT(9) -+ -+#define CH0X_CH0C BIT(0) -+#define CH0X_CH0B BIT(1) -+ - static int macsmc_battery_get_status(struct macsmc_power *power) - { -- u8 val; -+ u64 nocharge_flags; -+ u32 nopower_flags; -+ u16 ac_current; - int ret; - -- ret = apple_smc_read_u8(power->smc, SMC_KEY(BSFC), &val); -- if (ret) -+ /* -+ * Note: there are fallbacks in case some of these SMC keys disappear in the future -+ * or are not present on some machines. We treat the absence of the CHCE/CHCC/BSFC/CHSC -+ * flags as an error, since they are quite fundamental and simple booleans. -+ */ -+ -+ /* -+ * If power input is inhibited, we are definitely discharging. -+ * However, if the only reason is the BMS is doing a balancing cycle, -+ * go ahead and ignore that one to avoid spooking users. -+ */ -+ ret = apple_smc_read_u32(power->smc, SMC_KEY(CH0R), &nopower_flags); -+ if (!ret && (nopower_flags & CH0R_LOWER_FLAGS & ~CH0R_BMS_BUSY)) -+ return POWER_SUPPLY_STATUS_DISCHARGING; -+ -+ /* If no charger is present, we are definitely discharging. */ -+ ret = apple_smc_read_flag(power->smc, SMC_KEY(CHCE)); -+ if (ret < 0) -+ return ret; -+ else if (!ret) -+ return POWER_SUPPLY_STATUS_DISCHARGING; -+ -+ /* If AC is not charge capable, we are definitely discharging. */ -+ ret = apple_smc_read_flag(power->smc, SMC_KEY(CHCC)); -+ if (ret < 0) - return ret; -- if (val == 1) -+ else if (!ret) -+ return POWER_SUPPLY_STATUS_DISCHARGING; -+ -+ /* -+ * If the AC input current limit is tiny or 0, we are discharging no matter -+ * how much the BMS believes it can charge. -+ */ -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(AC-i), &ac_current); -+ if (!ret && ac_current < 100) -+ return POWER_SUPPLY_STATUS_DISCHARGING; -+ -+ /* If the battery is full, report it as such. */ -+ ret = apple_smc_read_flag(power->smc, SMC_KEY(BSFC)); -+ if (ret < 0) -+ return ret; -+ else if (ret) - return POWER_SUPPLY_STATUS_FULL; - -- ret = apple_smc_read_u8(power->smc, SMC_KEY(CHSC), &val); -- if (ret) -+ /* If there are reasons we aren't charging... */ -+ ret = apple_smc_read_u64(power->smc, SMC_KEY(CHNC), &nocharge_flags); -+ if (!ret) { -+ /* Perhaps the battery is full after all */ -+ if (nocharge_flags & CHNC_BATTERY_FULL) -+ return POWER_SUPPLY_STATUS_FULL; -+ /* Or maybe the BMS is just busy doing something, if so call it charging anyway */ -+ else if (nocharge_flags == CHNC_BMS_BUSY) -+ return POWER_SUPPLY_STATUS_CHARGING; -+ /* If we have other reasons we aren't charging, say we aren't */ -+ else if (nocharge_flags) -+ return POWER_SUPPLY_STATUS_NOT_CHARGING; -+ /* Else we're either charging or about to charge */ -+ else -+ return POWER_SUPPLY_STATUS_CHARGING; -+ } -+ -+ /* As a fallback, use the system charging flag. */ -+ ret = apple_smc_read_flag(power->smc, SMC_KEY(CHSC)); -+ if (ret < 0) - return ret; -- if (val == 1) -+ if (!ret) -+ return POWER_SUPPLY_STATUS_NOT_CHARGING; -+ else - return POWER_SUPPLY_STATUS_CHARGING; -+} - -- ret = apple_smc_read_u8(power->smc, SMC_KEY(CHCC), &val); -+static int macsmc_battery_get_charge_behaviour(struct macsmc_power *power) -+{ -+ int ret; -+ u8 val; -+ -+ /* CH0I returns a bitmask like the low byte of CH0R */ -+ ret = apple_smc_read_u8(power->smc, SMC_KEY(CH0I), &val); - if (ret) - return ret; -- if (val == 0) -- return POWER_SUPPLY_STATUS_DISCHARGING; -+ if (val & CH0R_NOAC_CH0I) -+ return POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE; - -- ret = apple_smc_read_u8(power->smc, SMC_KEY(CHCE), &val); -+ /* CH0C returns a bitmask containing CH0B/CH0C flags */ -+ ret = apple_smc_read_u8(power->smc, SMC_KEY(CH0C), &val); - if (ret) - return ret; -- if (val == 0) -- return POWER_SUPPLY_STATUS_DISCHARGING; -+ if (val & CH0X_CH0C) -+ return POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE; - else -- return POWER_SUPPLY_STATUS_NOT_CHARGING; -+ return POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO; -+} - -- -+static int macsmc_battery_set_charge_behaviour(struct macsmc_power *power, int val) -+{ -+ u8 ch0i, ch0c; -+ int ret; -+ -+ /* -+ * CH0I/CH0C are "hard" controls that will allow the battery to run down to 0. -+ * CH0K/CH0B are "soft" controls that are reset to 0 when SOC drops below 50%; -+ * we don't expose these yet. -+ */ -+ -+ switch (val) { -+ case POWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO: -+ ch0i = ch0c = 0; -+ break; -+ case POWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE: -+ ch0i = 0; -+ ch0c = 1; -+ break; -+ case POWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE: -+ ch0i = 1; -+ ch0c = 0; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ ret = apple_smc_write_u8(power->smc, SMC_KEY(CH0I), ch0i); -+ if (ret) -+ return ret; -+ return apple_smc_write_u8(power->smc, SMC_KEY(CH0C), ch0c); -+} -+ -+static int macsmc_battery_get_date(const char *s, int *out) -+{ -+ if (!isdigit(s[0]) || !isdigit(s[1])) -+ return -ENOTSUPP; -+ -+ *out = (s[0] - '0') * 10 + s[1] - '0'; -+ return 0; - } - - static int macsmc_battery_get_property(struct power_supply *psy, -- enum power_supply_property psp, -- union power_supply_propval *val) -+ enum power_supply_property psp, -+ union power_supply_propval *val) - { - struct macsmc_power *power = power_supply_get_drvdata(psy); - int ret = 0; -+ u8 vu8; - u16 vu16; - u32 vu32; - s16 vs16; -@@ -77,6 +206,10 @@ static int macsmc_battery_get_property(struct power_supply *psy, - case POWER_SUPPLY_PROP_PRESENT: - val->intval = 1; - break; -+ case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR: -+ val->intval = macsmc_battery_get_charge_behaviour(power); -+ ret = val->intval < 0 ? val->intval : 0; -+ break; - case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: - ret = apple_smc_read_u16(power->smc, SMC_KEY(B0TE), &vu16); - val->intval = vu16 == 0xffff ? 0 : vu16 * 60; -@@ -145,6 +278,9 @@ static int macsmc_battery_get_property(struct power_supply *psy, - ret = apple_smc_read_u16(power->smc, SMC_KEY(B0CT), &vu16); - val->intval = vu16; - break; -+ case POWER_SUPPLY_PROP_SCOPE: -+ val->intval = POWER_SUPPLY_SCOPE_SYSTEM; -+ break; - case POWER_SUPPLY_PROP_HEALTH: - ret = apple_smc_read_flag(power->smc, SMC_KEY(BBAD)); - val->intval = ret == 1 ? POWER_SUPPLY_HEALTH_DEAD : POWER_SUPPLY_HEALTH_GOOD; -@@ -156,6 +292,16 @@ static int macsmc_battery_get_property(struct power_supply *psy, - case POWER_SUPPLY_PROP_SERIAL_NUMBER: - val->strval = power->serial_number; - break; -+ case POWER_SUPPLY_PROP_MANUFACTURE_YEAR: -+ ret = macsmc_battery_get_date(&power->mfg_date[0], &val->intval); -+ val->intval += 2000 - 8; /* -8 is a fixup for a firmware bug... */ -+ break; -+ case POWER_SUPPLY_PROP_MANUFACTURE_MONTH: -+ ret = macsmc_battery_get_date(&power->mfg_date[2], &val->intval); -+ break; -+ case POWER_SUPPLY_PROP_MANUFACTURE_DAY: -+ ret = macsmc_battery_get_date(&power->mfg_date[4], &val->intval); -+ break; - default: - return -EINVAL; - } -@@ -163,9 +309,36 @@ static int macsmc_battery_get_property(struct power_supply *psy, - return ret; - } - -+static int macsmc_battery_set_property(struct power_supply *psy, -+ enum power_supply_property psp, -+ const union power_supply_propval *val) -+{ -+ struct macsmc_power *power = power_supply_get_drvdata(psy); -+ -+ switch (psp) { -+ case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR: -+ return macsmc_battery_set_charge_behaviour(power, val->intval); -+ default: -+ return -EINVAL; -+ } -+} -+ -+static int macsmc_battery_property_is_writeable(struct power_supply *psy, -+ enum power_supply_property psp) -+{ -+ switch (psp) { -+ case POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR: -+ return true; -+ default: -+ return false; -+ } -+} -+ -+ - static enum power_supply_property macsmc_battery_props[] = { - POWER_SUPPLY_PROP_STATUS, - POWER_SUPPLY_PROP_PRESENT, -+ POWER_SUPPLY_PROP_CHARGE_BEHAVIOUR, - POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, - POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, - POWER_SUPPLY_PROP_CAPACITY, -@@ -183,17 +356,23 @@ static enum power_supply_property macsmc_battery_props[] = { - POWER_SUPPLY_PROP_TEMP, - POWER_SUPPLY_PROP_CHARGE_COUNTER, - POWER_SUPPLY_PROP_CYCLE_COUNT, -+ POWER_SUPPLY_PROP_SCOPE, - POWER_SUPPLY_PROP_HEALTH, - POWER_SUPPLY_PROP_MODEL_NAME, - POWER_SUPPLY_PROP_SERIAL_NUMBER, -+ POWER_SUPPLY_PROP_MANUFACTURE_YEAR, -+ POWER_SUPPLY_PROP_MANUFACTURE_MONTH, -+ POWER_SUPPLY_PROP_MANUFACTURE_DAY, - }; - - static const struct power_supply_desc macsmc_battery_desc = { -- .name = "macsmc-battery", -- .type = POWER_SUPPLY_TYPE_BATTERY, -- .get_property = macsmc_battery_get_property, -- .properties = macsmc_battery_props, -- .num_properties = ARRAY_SIZE(macsmc_battery_props), -+ .name = "macsmc-battery", -+ .type = POWER_SUPPLY_TYPE_BATTERY, -+ .get_property = macsmc_battery_get_property, -+ .set_property = macsmc_battery_set_property, -+ .property_is_writeable = macsmc_battery_property_is_writeable, -+ .properties = macsmc_battery_props, -+ .num_properties = ARRAY_SIZE(macsmc_battery_props), - }; - - static int macsmc_power_event(struct notifier_block *nb, unsigned long event, void *data) -@@ -234,6 +413,7 @@ static int macsmc_power_probe(struct platform_device *pdev) - /* Fetch string properties */ - apple_smc_read(smc, SMC_KEY(BMDN), power->model_name, sizeof(power->model_name) - 1); - apple_smc_read(smc, SMC_KEY(BMSN), power->serial_number, sizeof(power->serial_number) - 1); -+ apple_smc_read(smc, SMC_KEY(BMDT), power->mfg_date, sizeof(power->mfg_date) - 1); - - psy_cfg.drv_data = power; - power->psy = devm_power_supply_register(&pdev->dev, &macsmc_battery_desc, &psy_cfg); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0144-power-supply-macsmc_power-Use-BUIC-instead-of-BRSC-f.patch b/target/linux/silicon/patches-5.19/0144-power-supply-macsmc_power-Use-BUIC-instead-of-BRSC-f.patch deleted file mode 100644 index d17ff930c..000000000 --- a/target/linux/silicon/patches-5.19/0144-power-supply-macsmc_power-Use-BUIC-instead-of-BRSC-f.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 6ebbef164bb9db227e141d704f3e62fe98cfbea6 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 02:23:33 +0900 -Subject: [PATCH 144/171] power: supply: macsmc_power: Use BUIC instead of BRSC - for charge - -Signed-off-by: Hector Martin ---- - drivers/power/supply/macsmc_power.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/power/supply/macsmc_power.c b/drivers/power/supply/macsmc_power.c -index 2cb1644055f4..b9aa6af32104 100644 ---- a/drivers/power/supply/macsmc_power.c -+++ b/drivers/power/supply/macsmc_power.c -@@ -219,8 +219,8 @@ static int macsmc_battery_get_property(struct power_supply *psy, - val->intval = vu16 == 0xffff ? 0 : vu16 * 60; - break; - case POWER_SUPPLY_PROP_CAPACITY: -- ret = apple_smc_read_u16(power->smc, SMC_KEY(BRSC), &vu16); -- val->intval = vu16; -+ ret = apple_smc_read_u8(power->smc, SMC_KEY(BUIC), &vu8); -+ val->intval = vu8; - break; - case POWER_SUPPLY_PROP_VOLTAGE_NOW: - ret = apple_smc_read_u16(power->smc, SMC_KEY(B0AV), &vu16); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0145-power-supply-macsmc_power-Turn-off-OBC-flags-if-macO.patch b/target/linux/silicon/patches-5.19/0145-power-supply-macsmc_power-Turn-off-OBC-flags-if-macO.patch deleted file mode 100644 index 7ce68c191..000000000 --- a/target/linux/silicon/patches-5.19/0145-power-supply-macsmc_power-Turn-off-OBC-flags-if-macO.patch +++ /dev/null @@ -1,29 +0,0 @@ -From ee6f25f23ff2820d11bc7a4afcf99518359e1c8d Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 02:24:13 +0900 -Subject: [PATCH 145/171] power: supply: macsmc_power: Turn off OBC flags if - macOS left them on - -Signed-off-by: Hector Martin ---- - drivers/power/supply/macsmc_power.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/drivers/power/supply/macsmc_power.c b/drivers/power/supply/macsmc_power.c -index b9aa6af32104..4a8a90b775dd 100644 ---- a/drivers/power/supply/macsmc_power.c -+++ b/drivers/power/supply/macsmc_power.c -@@ -415,6 +415,10 @@ static int macsmc_power_probe(struct platform_device *pdev) - apple_smc_read(smc, SMC_KEY(BMSN), power->serial_number, sizeof(power->serial_number) - 1); - apple_smc_read(smc, SMC_KEY(BMDT), power->mfg_date, sizeof(power->mfg_date) - 1); - -+ /* Turn off the "optimized battery charging" flags, in case macOS left them on */ -+ apple_smc_write_u8(power->smc, SMC_KEY(CH0K), 0); -+ apple_smc_write_u8(power->smc, SMC_KEY(CH0B), 0); -+ - psy_cfg.drv_data = power; - power->psy = devm_power_supply_register(&pdev->dev, &macsmc_battery_desc, &psy_cfg); - if (IS_ERR(power->psy)) { --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0146-power-supply-macsmc_power-Add-AC-power-supply.patch b/target/linux/silicon/patches-5.19/0146-power-supply-macsmc_power-Add-AC-power-supply.patch deleted file mode 100644 index c5da0cefb..000000000 --- a/target/linux/silicon/patches-5.19/0146-power-supply-macsmc_power-Add-AC-power-supply.patch +++ /dev/null @@ -1,137 +0,0 @@ -From 58a6709f62008f3210799c906767c7c51aec5e75 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 02:24:42 +0900 -Subject: [PATCH 146/171] power: supply: macsmc_power: Add AC power supply - -Signed-off-by: Hector Martin ---- - drivers/power/supply/macsmc_power.c | 74 +++++++++++++++++++++++++---- - 1 file changed, 66 insertions(+), 8 deletions(-) - -diff --git a/drivers/power/supply/macsmc_power.c b/drivers/power/supply/macsmc_power.c -index 4a8a90b775dd..dee48ee8b5a4 100644 ---- a/drivers/power/supply/macsmc_power.c -+++ b/drivers/power/supply/macsmc_power.c -@@ -17,11 +17,14 @@ - struct macsmc_power { - struct device *dev; - struct apple_smc *smc; -- struct power_supply *psy; -+ -+ struct power_supply *batt; - char model_name[MAX_STRING_LENGTH]; - char serial_number[MAX_STRING_LENGTH]; - char mfg_date[MAX_STRING_LENGTH]; - -+ struct power_supply *ac; -+ - struct notifier_block nb; - }; - -@@ -49,7 +52,7 @@ static int macsmc_battery_get_status(struct macsmc_power *power) - u32 nopower_flags; - u16 ac_current; - int ret; -- -+ - /* - * Note: there are fallbacks in case some of these SMC keys disappear in the future - * or are not present on some machines. We treat the absence of the CHCE/CHCC/BSFC/CHSC -@@ -334,7 +337,6 @@ static int macsmc_battery_property_is_writeable(struct power_supply *psy, - } - } - -- - static enum power_supply_property macsmc_battery_props[] = { - POWER_SUPPLY_PROP_STATUS, - POWER_SUPPLY_PROP_PRESENT, -@@ -375,6 +377,54 @@ static const struct power_supply_desc macsmc_battery_desc = { - .num_properties = ARRAY_SIZE(macsmc_battery_props), - }; - -+static int macsmc_ac_get_property(struct power_supply *psy, -+ enum power_supply_property psp, -+ union power_supply_propval *val) -+{ -+ struct macsmc_power *power = power_supply_get_drvdata(psy); -+ int ret = 0; -+ u16 vu16; -+ u32 vu32; -+ -+ switch (psp) { -+ case POWER_SUPPLY_PROP_ONLINE: -+ ret = apple_smc_read_u32(power->smc, SMC_KEY(CHIS), &vu32); -+ val->intval = !!vu32; -+ break; -+ case POWER_SUPPLY_PROP_VOLTAGE_NOW: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(AC-n), &vu16); -+ val->intval = vu16 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: -+ ret = apple_smc_read_u16(power->smc, SMC_KEY(AC-i), &vu16); -+ val->intval = vu16 * 1000; -+ break; -+ case POWER_SUPPLY_PROP_INPUT_POWER_LIMIT: -+ ret = apple_smc_read_u32(power->smc, SMC_KEY(ACPW), &vu32); -+ val->intval = vu32 * 1000; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ return ret; -+} -+ -+static enum power_supply_property macsmc_ac_props[] = { -+ POWER_SUPPLY_PROP_ONLINE, -+ POWER_SUPPLY_PROP_VOLTAGE_NOW, -+ POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, -+ POWER_SUPPLY_PROP_INPUT_POWER_LIMIT, -+}; -+ -+static const struct power_supply_desc macsmc_ac_desc = { -+ .name = "macsmc-ac", -+ .type = POWER_SUPPLY_TYPE_MAINS, -+ .get_property = macsmc_ac_get_property, -+ .properties = macsmc_ac_props, -+ .num_properties = ARRAY_SIZE(macsmc_ac_props), -+}; -+ - static int macsmc_power_event(struct notifier_block *nb, unsigned long event, void *data) - { - struct macsmc_power *power = container_of(nb, struct macsmc_power, nb); -@@ -383,7 +433,8 @@ static int macsmc_power_event(struct notifier_block *nb, unsigned long event, vo - bool charging = (event & 0xff) != 0; - - dev_info(power->dev, "Charging: %d\n", charging); -- power_supply_changed(power->psy); -+ power_supply_changed(power->batt); -+ power_supply_changed(power->ac); - - return NOTIFY_OK; - } -@@ -420,10 +471,17 @@ static int macsmc_power_probe(struct platform_device *pdev) - apple_smc_write_u8(power->smc, SMC_KEY(CH0B), 0); - - psy_cfg.drv_data = power; -- power->psy = devm_power_supply_register(&pdev->dev, &macsmc_battery_desc, &psy_cfg); -- if (IS_ERR(power->psy)) { -- dev_err(&pdev->dev, "Failed to register power supply\n"); -- ret = PTR_ERR(power->psy); -+ power->batt = devm_power_supply_register(&pdev->dev, &macsmc_battery_desc, &psy_cfg); -+ if (IS_ERR(power->batt)) { -+ dev_err(&pdev->dev, "Failed to register battery\n"); -+ ret = PTR_ERR(power->batt); -+ return ret; -+ } -+ -+ power->ac = devm_power_supply_register(&pdev->dev, &macsmc_ac_desc, &psy_cfg); -+ if (IS_ERR(power->ac)) { -+ dev_err(&pdev->dev, "Failed to register AC adapter\n"); -+ ret = PTR_ERR(power->ac); - return ret; - } - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0147-power-reset-macsmc-reboot-Add-driver-for-rebooting-v.patch b/target/linux/silicon/patches-5.19/0147-power-reset-macsmc-reboot-Add-driver-for-rebooting-v.patch deleted file mode 100644 index a0a241148..000000000 --- a/target/linux/silicon/patches-5.19/0147-power-reset-macsmc-reboot-Add-driver-for-rebooting-v.patch +++ /dev/null @@ -1,397 +0,0 @@ -From 32182ce79a348bf794c87dfa649fd1e492aa4ad1 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 8 Feb 2022 19:17:40 +0900 -Subject: [PATCH 147/171] power: reset: macsmc-reboot: Add driver for rebooting - via Apple SMC - -This driver implements the reboot/shutdown support exposed by the SMC -on Apple Silicon machines, such as Apple M1 Macs. - -Signed-off-by: Hector Martin ---- - drivers/power/reset/Kconfig | 12 + - drivers/power/reset/Makefile | 1 + - drivers/power/reset/macsmc-reboot.c | 336 ++++++++++++++++++++++++++++ - 3 files changed, 349 insertions(+) - create mode 100644 drivers/power/reset/macsmc-reboot.c - -diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig -index 4b563db3ab3e..94eeb910e5f9 100644 ---- a/drivers/power/reset/Kconfig -+++ b/drivers/power/reset/Kconfig -@@ -117,6 +117,18 @@ config POWER_RESET_LINKSTATION - - Say Y here if you have a Buffalo LinkStation LS421D/E. - -+config POWER_RESET_MACSMC -+ tristate "Apple SMC reset/power-off driver" -+ depends on ARCH_APPLE || COMPILE_TEST -+ depends on APPLE_SMC -+ depends on OF -+ default ARCH_APPLE -+ help -+ This driver supports reset and power-off on Apple Mac machines -+ that implement this functionality via the SMC. -+ -+ Say Y here if you have an Apple Silicon Mac. -+ - config POWER_RESET_MSM - bool "Qualcomm MSM power-off driver" - depends on ARCH_QCOM -diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile -index f606a2f60539..ba49b8c0d0c0 100644 ---- a/drivers/power/reset/Makefile -+++ b/drivers/power/reset/Makefile -@@ -12,6 +12,7 @@ obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o - obj-$(CONFIG_POWER_RESET_GPIO_RESTART) += gpio-restart.o - obj-$(CONFIG_POWER_RESET_HISI) += hisi-reboot.o - obj-$(CONFIG_POWER_RESET_LINKSTATION) += linkstation-poweroff.o -+obj-$(CONFIG_POWER_RESET_MACSMC) += macsmc-reboot.o - obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o - obj-$(CONFIG_POWER_RESET_MT6323) += mt6323-poweroff.o - obj-$(CONFIG_POWER_RESET_OXNAS) += oxnas-restart.o -diff --git a/drivers/power/reset/macsmc-reboot.c b/drivers/power/reset/macsmc-reboot.c -new file mode 100644 -index 000000000000..c33ba2a7852d ---- /dev/null -+++ b/drivers/power/reset/macsmc-reboot.c -@@ -0,0 +1,336 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple SMC Reboot/Poweroff Handler -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+struct macsmc_reboot_nvmem { -+ struct nvmem_cell *shutdown_flag; -+ struct nvmem_cell *pm_setting; -+ struct nvmem_cell *boot_stage; -+ struct nvmem_cell *boot_error_count; -+ struct nvmem_cell *panic_count; -+}; -+ -+static const char *nvmem_names[] = { -+ "shutdown_flag", -+ "pm_setting", -+ "boot_stage", -+ "boot_error_count", -+ "panic_count", -+}; -+ -+enum boot_stage { -+ BOOT_STAGE_SHUTDOWN = 0x00, /* Clean shutdown */ -+ BOOT_STAGE_IBOOT_DONE = 0x2f, /* Last stage of bootloader */ -+ BOOT_STAGE_KERNEL_STARTED = 0x30, /* Normal OS booting */ -+}; -+ -+enum pm_setting { -+ PM_SETTING_AC_POWER_RESTORE = 0x02, -+ PM_SETTING_AC_POWER_OFF = 0x03, -+}; -+ -+static const char *ac_power_modes[] = { "off", "restore" }; -+ -+static int ac_power_mode_map[] = { -+ PM_SETTING_AC_POWER_OFF, -+ PM_SETTING_AC_POWER_RESTORE, -+}; -+ -+struct macsmc_reboot { -+ struct device *dev; -+ struct apple_smc *smc; -+ struct notifier_block reboot_notify; -+ -+ union { -+ struct macsmc_reboot_nvmem nvm; -+ struct nvmem_cell *nvm_cells[ARRAY_SIZE(nvmem_names)]; -+ }; -+}; -+ -+/* Helpers to read/write a u8 given a struct nvmem_cell */ -+static int nvmem_cell_get_u8(struct nvmem_cell *cell) -+{ -+ size_t len; -+ u8 val; -+ void *ret = nvmem_cell_read(cell, &len); -+ -+ if (IS_ERR(ret)) -+ return PTR_ERR(ret); -+ -+ if (len < 1) { -+ kfree(ret); -+ return -EINVAL; -+ } -+ -+ val = *(u8 *)ret; -+ kfree(ret); -+ return val; -+} -+ -+static int nvmem_cell_set_u8(struct nvmem_cell *cell, u8 val) -+{ -+ return nvmem_cell_write(cell, &val, sizeof(val)); -+} -+ -+static ssize_t macsmc_ac_power_mode_store(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t n) -+{ -+ struct macsmc_reboot *reboot = dev_get_drvdata(dev); -+ int mode; -+ int ret; -+ -+ mode = sysfs_match_string(ac_power_modes, buf); -+ if (mode < 0) -+ return mode; -+ -+ ret = nvmem_cell_set_u8(reboot->nvm.pm_setting, ac_power_mode_map[mode]); -+ if (ret < 0) -+ return ret; -+ -+ return n; -+} -+ -+static ssize_t macsmc_ac_power_mode_show(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ struct macsmc_reboot *reboot = dev_get_drvdata(dev); -+ int len = 0; -+ int i; -+ int mode = nvmem_cell_get_u8(reboot->nvm.pm_setting); -+ -+ if (mode < 0) -+ return mode; -+ -+ for (i = 0; i < ARRAY_SIZE(ac_power_mode_map); i++) -+ if (mode == ac_power_mode_map[i]) -+ len += scnprintf(buf+len, PAGE_SIZE-len, -+ "[%s] ", ac_power_modes[i]); -+ else -+ len += scnprintf(buf+len, PAGE_SIZE-len, -+ "%s ", ac_power_modes[i]); -+ buf[len-1] = '\n'; -+ return len; -+} -+static DEVICE_ATTR(ac_power_mode, 0644, macsmc_ac_power_mode_show, -+ macsmc_ac_power_mode_store); -+ -+/* -+ * SMC 'MBSE' key actions: -+ * -+ * 'offw' - shutdown warning -+ * 'slpw' - sleep warning -+ * 'rest' - restart warning -+ * 'off1' - shutdown (needs PMU bit set to stay on) -+ * 'susp' - suspend -+ * 'phra' - restart ("PE Halt Restart Action"?) -+ * 'panb' - panic beginning -+ * 'pane' - panic end -+ */ -+ -+static int macsmc_power_off(struct sys_off_data *data) -+{ -+ struct macsmc_reboot *reboot = data->cb_data; -+ -+ dev_info(reboot->dev, "Issuing power off (off1)\n"); -+ -+ if (apple_smc_write_u32_atomic(reboot->smc, SMC_KEY(MBSE), SMC_KEY(off1)) < 0) { -+ dev_err(reboot->dev, "Failed to issue MBSE = off1 (power_off)\n"); -+ } else { -+ mdelay(100); -+ WARN_ON(1); -+ } -+ -+ return NOTIFY_OK; -+} -+ -+static int macsmc_restart(struct sys_off_data *data) -+{ -+ struct macsmc_reboot *reboot = data->cb_data; -+ -+ dev_info(reboot->dev, "Issuing restart (phra)\n"); -+ -+ if (apple_smc_write_u32_atomic(reboot->smc, SMC_KEY(MBSE), SMC_KEY(phra)) < 0) { -+ dev_err(reboot->dev, "Failed to issue MBSE = phra (restart)\n"); -+ } else { -+ mdelay(100); -+ WARN_ON(1); -+ } -+ -+ return NOTIFY_OK; -+} -+ -+static int macsmc_reboot_notify(struct notifier_block *this, unsigned long action, void *data) -+{ -+ struct macsmc_reboot *reboot = container_of(this, struct macsmc_reboot, reboot_notify); -+ u32 val; -+ u8 shutdown_flag; -+ -+ switch (action) { -+ case SYS_RESTART: -+ val = SMC_KEY(rest); -+ shutdown_flag = 0; -+ break; -+ case SYS_POWER_OFF: -+ val = SMC_KEY(offw); -+ shutdown_flag = 1; -+ break; -+ default: -+ return NOTIFY_DONE; -+ } -+ -+ dev_info(reboot->dev, "Preparing for reboot (%p4ch)\n", &val); -+ -+ /* On the Mac Mini, this will turn off the LED for power off */ -+ if (apple_smc_write_u32(reboot->smc, SMC_KEY(MBSE), val) < 0) -+ dev_err(reboot->dev, "Failed to issue MBSE = %p4ch (reboot_prepare)\n", &val); -+ -+ /* Set the boot_stage to 0, which means we're doing a clean shutdown/reboot. */ -+ if (reboot->nvm.boot_stage && -+ nvmem_cell_set_u8(reboot->nvm.boot_stage, BOOT_STAGE_SHUTDOWN) < 0) -+ dev_err(reboot->dev, "Failed to write boot_stage\n"); -+ -+ /* -+ * Set the PMU flag to actually reboot into the off state. -+ * Without this, the device will just reboot. We make it optional in case it is no longer -+ * necessary on newer hardware. -+ */ -+ if (reboot->nvm.shutdown_flag && -+ nvmem_cell_set_u8(reboot->nvm.shutdown_flag, shutdown_flag) < 0) -+ dev_err(reboot->dev, "Failed to write shutdown_flag\n"); -+ -+ return NOTIFY_OK; -+} -+ -+static void macsmc_power_init_error_counts(struct macsmc_reboot *reboot) -+{ -+ int boot_error_count, panic_count; -+ -+ if (!reboot->nvm.boot_error_count || !reboot->nvm.panic_count) -+ return; -+ -+ boot_error_count = nvmem_cell_get_u8(reboot->nvm.boot_error_count); -+ if (boot_error_count < 0) { -+ dev_err(reboot->dev, "Failed to read boot_error_count (%d)\n", boot_error_count); -+ return; -+ } -+ -+ panic_count = nvmem_cell_get_u8(reboot->nvm.panic_count); -+ if (panic_count < 0) { -+ dev_err(reboot->dev, "Failed to read panic_count (%d)\n", panic_count); -+ return; -+ } -+ -+ if (!boot_error_count && !panic_count) -+ return; -+ -+ dev_warn(reboot->dev, "PMU logged %d boot error(s) and %d panic(s)\n", -+ boot_error_count, panic_count); -+ -+ if (nvmem_cell_set_u8(reboot->nvm.panic_count, 0) < 0) -+ dev_err(reboot->dev, "Failed to reset panic_count\n"); -+ if (nvmem_cell_set_u8(reboot->nvm.boot_error_count, 0) < 0) -+ dev_err(reboot->dev, "Failed to reset boot_error_count\n"); -+} -+ -+static int macsmc_reboot_probe(struct platform_device *pdev) -+{ -+ struct apple_smc *smc = dev_get_drvdata(pdev->dev.parent); -+ struct macsmc_reboot *reboot; -+ int ret, i; -+ -+ /* Ignore devices without this functionality */ -+ if (!apple_smc_key_exists(smc, SMC_KEY(MBSE))) -+ return -ENODEV; -+ -+ reboot = devm_kzalloc(&pdev->dev, sizeof(*reboot), GFP_KERNEL); -+ if (!reboot) -+ return -ENOMEM; -+ -+ reboot->dev = &pdev->dev; -+ reboot->smc = smc; -+ -+ platform_set_drvdata(pdev, reboot); -+ -+ pdev->dev.of_node = of_get_child_by_name(pdev->dev.parent->of_node, "reboot"); -+ -+ for (i = 0; i < ARRAY_SIZE(nvmem_names); i++) { -+ struct nvmem_cell *cell; -+ cell = devm_nvmem_cell_get(&pdev->dev, -+ nvmem_names[i]); -+ if (IS_ERR(cell)) { -+ if (PTR_ERR(cell) == -EPROBE_DEFER) -+ return -EPROBE_DEFER; -+ dev_warn(&pdev->dev, "Missing NVMEM cell %s (%ld)\n", -+ nvmem_names[i], PTR_ERR(cell)); -+ /* Non fatal, we'll deal with it */ -+ cell = NULL; -+ } -+ reboot->nvm_cells[i] = cell; -+ } -+ -+ /* Set the boot_stage to indicate we're running the OS kernel */ -+ if (reboot->nvm.boot_stage && -+ nvmem_cell_set_u8(reboot->nvm.boot_stage, BOOT_STAGE_KERNEL_STARTED) < 0) -+ dev_err(reboot->dev, "Failed to write boot_stage\n"); -+ -+ /* Display and clear the error counts */ -+ macsmc_power_init_error_counts(reboot); -+ -+ reboot->reboot_notify.notifier_call = macsmc_reboot_notify; -+ -+ ret = devm_register_sys_off_handler(&pdev->dev, SYS_OFF_MODE_POWER_OFF, SYS_OFF_PRIO_HIGH, -+ macsmc_power_off, reboot); -+ if (ret) -+ return dev_err_probe(&pdev->dev, ret, "Failed to register power-off handler\n"); -+ -+ ret = devm_register_sys_off_handler(&pdev->dev, SYS_OFF_MODE_RESTART, SYS_OFF_PRIO_HIGH, -+ macsmc_restart, reboot); -+ if (ret) -+ return dev_err_probe(&pdev->dev, ret, "Failed to register restart handler\n"); -+ -+ ret = devm_register_reboot_notifier(&pdev->dev, &reboot->reboot_notify); -+ if (ret) -+ return dev_err_probe(&pdev->dev, ret, "Failed to register reboot notifier\n"); -+ -+ dev_info(&pdev->dev, "Handling reboot and poweroff requests via SMC\n"); -+ -+ if (device_create_file(&pdev->dev, &dev_attr_ac_power_mode)) -+ dev_warn(&pdev->dev, "could not create sysfs file\n"); -+ -+ return 0; -+} -+ -+static int macsmc_reboot_remove(struct platform_device *pdev) -+{ -+ device_remove_file(&pdev->dev, &dev_attr_ac_power_mode); -+ -+ return 0; -+} -+ -+ -+static struct platform_driver macsmc_reboot_driver = { -+ .driver = { -+ .name = "macsmc-reboot", -+ .owner = THIS_MODULE, -+ }, -+ .probe = macsmc_reboot_probe, -+ .remove = macsmc_reboot_remove, -+}; -+module_platform_driver(macsmc_reboot_driver); -+ -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_DESCRIPTION("Apple SMC reboot/poweroff driver"); -+MODULE_AUTHOR("Hector Martin "); -+MODULE_ALIAS("platform:macsmc-reboot"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0148-rtc-Add-new-rtc-macsmc-driver-for-Apple-Silicon-Macs.patch b/target/linux/silicon/patches-5.19/0148-rtc-Add-new-rtc-macsmc-driver-for-Apple-Silicon-Macs.patch deleted file mode 100644 index 9377c25cf..000000000 --- a/target/linux/silicon/patches-5.19/0148-rtc-Add-new-rtc-macsmc-driver-for-Apple-Silicon-Macs.patch +++ /dev/null @@ -1,202 +0,0 @@ -From 41fdf7c140ec6b812b2e55a45d9446ba3e60612c Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 18:47:13 +0900 -Subject: [PATCH 148/171] rtc: Add new rtc-macsmc driver for Apple Silicon Macs - -Apple Silicon Macs (M1, etc.) have an RTC that is part of the PMU IC, -but most of the PMU functionality is abstracted out by the SMC. -On T600x machines, the RTC counter must be accessed via the SMC to -get full functionality, and it seems likely that future machines -will move towards making SMC handle all RTC functionality. - -The SMC RTC counter access is implemented on all current machines -as of the time of this writing, on firmware 12.x. However, the RTC -offset (needed to set the time) is still only accessible via direct -PMU access. To handle this, we expose the RTC offset as an NVMEM -cell from the SPMI PMU device node, and this driver consumes that -cell and uses it to compute/set the current time. - -Alarm functionality is not yet implemented. This would also go via -the PMU today, but could change in the future. - -Signed-off-by: Hector Martin ---- - drivers/rtc/Kconfig | 13 ++++ - drivers/rtc/Makefile | 1 + - drivers/rtc/rtc-macsmc.c | 130 +++++++++++++++++++++++++++++++++++++++ - 3 files changed, 144 insertions(+) - create mode 100644 drivers/rtc/rtc-macsmc.c - -diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig -index a00f901b5c1d..8717f2d9381c 100644 ---- a/drivers/rtc/Kconfig -+++ b/drivers/rtc/Kconfig -@@ -1973,4 +1973,17 @@ config RTC_DRV_MSC313 - This driver can also be built as a module, if so, the module - will be called "rtc-msc313". - -+config RTC_DRV_MACSMC -+ tristate "Apple Mac SMC RTC" -+ depends on ARCH_APPLE || COMPILE_TEST -+ depends on APPLE_SMC -+ depends on OF -+ default ARCH_APPLE -+ help -+ If you say yes here you get support for RTC functions -+ inside Apple SPMI PMUs. -+ -+ To compile this driver as a module, choose M here: the -+ module will be called rtc-macsmc. -+ - endif # RTC_CLASS -diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile -index fb04467b652d..68519801a320 100644 ---- a/drivers/rtc/Makefile -+++ b/drivers/rtc/Makefile -@@ -89,6 +89,7 @@ obj-$(CONFIG_RTC_DRV_M41T94) += rtc-m41t94.o - obj-$(CONFIG_RTC_DRV_M48T35) += rtc-m48t35.o - obj-$(CONFIG_RTC_DRV_M48T59) += rtc-m48t59.o - obj-$(CONFIG_RTC_DRV_M48T86) += rtc-m48t86.o -+obj-$(CONFIG_RTC_DRV_MACSMC) += rtc-macsmc.o - obj-$(CONFIG_RTC_DRV_MAX6900) += rtc-max6900.o - obj-$(CONFIG_RTC_DRV_MAX6902) += rtc-max6902.o - obj-$(CONFIG_RTC_DRV_MAX6916) += rtc-max6916.o -diff --git a/drivers/rtc/rtc-macsmc.c b/drivers/rtc/rtc-macsmc.c -new file mode 100644 -index 000000000000..34730c925248 ---- /dev/null -+++ b/drivers/rtc/rtc-macsmc.c -@@ -0,0 +1,130 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple SMC RTC driver -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+/* 48-bit RTC */ -+#define RTC_BYTES 6 -+#define RTC_BITS (8 * RTC_BYTES) -+ -+/* 32768 Hz clock */ -+#define RTC_SEC_SHIFT 15 -+ -+struct macsmc_rtc { -+ struct device *dev; -+ struct apple_smc *smc; -+ struct rtc_device *rtc_dev; -+ struct nvmem_cell *rtc_offset; -+}; -+ -+static int macsmc_rtc_get_time(struct device *dev, struct rtc_time *tm) -+{ -+ struct macsmc_rtc *rtc = dev_get_drvdata(dev); -+ u64 ctr = 0, off = 0; -+ time64_t now; -+ void *p_off; -+ size_t len; -+ int ret; -+ -+ ret = apple_smc_read(rtc->smc, SMC_KEY(CLKM), &ctr, RTC_BYTES); -+ if (ret != RTC_BYTES) -+ return ret < 0 ? ret : -EIO; -+ -+ p_off = nvmem_cell_read(rtc->rtc_offset, &len); -+ if (IS_ERR(p_off)) -+ return PTR_ERR(p_off); -+ if (len < RTC_BYTES) { -+ kfree(p_off); -+ return -EIO; -+ } -+ -+ memcpy(&off, p_off, RTC_BYTES); -+ kfree(p_off); -+ -+ /* Sign extend from 48 to 64 bits, then arithmetic shift right 15 bits to get seconds */ -+ now = sign_extend64(ctr + off, RTC_BITS - 1) >> RTC_SEC_SHIFT; -+ rtc_time64_to_tm(now, tm); -+ -+ return ret; -+} -+ -+static int macsmc_rtc_set_time(struct device *dev, struct rtc_time *tm) -+{ -+ struct macsmc_rtc *rtc = dev_get_drvdata(dev); -+ u64 ctr = 0, off = 0; -+ int ret; -+ -+ ret = apple_smc_read(rtc->smc, SMC_KEY(CLKM), &ctr, RTC_BYTES); -+ if (ret != RTC_BYTES) -+ return ret < 0 ? ret : -EIO; -+ -+ /* This sets the offset such that the set second begins now */ -+ off = (rtc_tm_to_time64(tm) << RTC_SEC_SHIFT) - ctr; -+ return nvmem_cell_write(rtc->rtc_offset, &off, RTC_BYTES); -+} -+ -+static const struct rtc_class_ops macsmc_rtc_ops = { -+ .read_time = macsmc_rtc_get_time, -+ .set_time = macsmc_rtc_set_time, -+}; -+ -+static int macsmc_rtc_probe(struct platform_device *pdev) -+{ -+ struct apple_smc *smc = dev_get_drvdata(pdev->dev.parent); -+ struct macsmc_rtc *rtc; -+ -+ /* Ignore devices without this functionality */ -+ if (!apple_smc_key_exists(smc, SMC_KEY(CLKM))) -+ return -ENODEV; -+ -+ rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); -+ if (!rtc) -+ return -ENOMEM; -+ -+ rtc->dev = &pdev->dev; -+ rtc->smc = smc; -+ -+ pdev->dev.of_node = of_get_child_by_name(pdev->dev.parent->of_node, "rtc"); -+ -+ rtc->rtc_offset = devm_nvmem_cell_get(&pdev->dev, "rtc_offset"); -+ if (IS_ERR(rtc->rtc_offset)) -+ return dev_err_probe(&pdev->dev, PTR_ERR(rtc->rtc_offset), -+ "Failed to get rtc_offset NVMEM cell\n"); -+ -+ rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); -+ if (IS_ERR(rtc->rtc_dev)) -+ return PTR_ERR(rtc->rtc_dev); -+ -+ rtc->rtc_dev->ops = &macsmc_rtc_ops; -+ rtc->rtc_dev->range_min = S64_MIN >> (RTC_SEC_SHIFT + (64 - RTC_BITS)); -+ rtc->rtc_dev->range_max = S64_MAX >> (RTC_SEC_SHIFT + (64 - RTC_BITS)); -+ -+ platform_set_drvdata(pdev, rtc); -+ -+ return devm_rtc_register_device(rtc->rtc_dev); -+} -+ -+static struct platform_driver macsmc_rtc_driver = { -+ .driver = { -+ .name = "macsmc-rtc", -+ .owner = THIS_MODULE, -+ }, -+ .probe = macsmc_rtc_probe, -+}; -+module_platform_driver(macsmc_rtc_driver); -+ -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_DESCRIPTION("Apple SMC RTC driver"); -+MODULE_AUTHOR("Hector Martin "); -+MODULE_ALIAS("platform:macsmc-rtc"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0149-Input-macsmc-hid-New-driver-to-handle-the-Apple-Mac-.patch b/target/linux/silicon/patches-5.19/0149-Input-macsmc-hid-New-driver-to-handle-the-Apple-Mac-.patch deleted file mode 100644 index 39b360b0a..000000000 --- a/target/linux/silicon/patches-5.19/0149-Input-macsmc-hid-New-driver-to-handle-the-Apple-Mac-.patch +++ /dev/null @@ -1,221 +0,0 @@ -From 7c60cf26c675b90404782dcd54a91707ac100737 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Fri, 4 Mar 2022 19:21:19 +0900 -Subject: [PATCH 149/171] Input: macsmc-hid: New driver to handle the Apple Mac - SMC buttons/lid - -This driver implements power button and lid switch support for Apple Mac -devices using SMC controllers driven by the macsmc driver. - -In addition to basic input support, this also responds to the final -shutdown warning (when the power button is held down long enough) by -doing an emergency kernel poweroff. This allows the NVMe controller to -be cleanly shut down, which prevents data loss for in-cache data. - -Signed-off-by: Hector Martin ---- - drivers/input/misc/Kconfig | 12 +++ - drivers/input/misc/Makefile | 1 + - drivers/input/misc/macsmc-hid.c | 157 ++++++++++++++++++++++++++++++++ - 3 files changed, 170 insertions(+) - create mode 100644 drivers/input/misc/macsmc-hid.c - -diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig -index a18ab7358d8f..08e681473ae8 100644 ---- a/drivers/input/misc/Kconfig -+++ b/drivers/input/misc/Kconfig -@@ -902,4 +902,16 @@ config INPUT_STPMIC1_ONKEY - To compile this driver as a module, choose M here: the - module will be called stpmic1_onkey. - -+config INPUT_MACSMC_HID -+ tristate "Apple Mac SMC lid/buttons" -+ depends on APPLE_SMC -+ default ARCH_APPLE -+ help -+ Say Y here if you want to use the input events delivered via the -+ SMC controller on Apple Mac machines using the macsmc driver. -+ This includes lid open/close and the power button. -+ -+ To compile this driver as a module, choose M here: the -+ module will be called macsmc-hid. -+ - endif -diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile -index 28dfc444f0a9..a607c6472d0a 100644 ---- a/drivers/input/misc/Makefile -+++ b/drivers/input/misc/Makefile -@@ -48,6 +48,7 @@ obj-$(CONFIG_INPUT_IQS7222) += iqs7222.o - obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o - obj-$(CONFIG_INPUT_KXTJ9) += kxtj9.o - obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o -+obj-$(CONFIG_INPUT_MACSMC_HID) += macsmc-hid.o - obj-$(CONFIG_INPUT_MAX77650_ONKEY) += max77650-onkey.o - obj-$(CONFIG_INPUT_MAX77693_HAPTIC) += max77693-haptic.o - obj-$(CONFIG_INPUT_MAX8925_ONKEY) += max8925_onkey.o -diff --git a/drivers/input/misc/macsmc-hid.c b/drivers/input/misc/macsmc-hid.c -new file mode 100644 -index 000000000000..1c0f7476081f ---- /dev/null -+++ b/drivers/input/misc/macsmc-hid.c -@@ -0,0 +1,157 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Apple SMC input event driver -+ * Copyright The Asahi Linux Contributors -+ * -+ * This driver exposes HID events from the SMC as an input device. -+ * This includes the lid open/close and power button notifications. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+struct macsmc_hid { -+ struct device *dev; -+ struct apple_smc *smc; -+ struct input_dev *input; -+ struct notifier_block nb; -+}; -+ -+#define SMC_EV_BTN 0x7201 -+#define SMC_EV_LID 0x7203 -+ -+#define BTN_POWER 0x06 -+#define BTN_POWER_HELD1 0xfe -+#define BTN_POWER_HELD2 0x00 -+ -+static int macsmc_hid_event(struct notifier_block *nb, unsigned long event, void *data) -+{ -+ struct macsmc_hid *smchid = container_of(nb, struct macsmc_hid, nb); -+ u16 type = event >> 16; -+ u8 d1 = (event >> 8) & 0xff; -+ u8 d2 = event & 0xff; -+ -+ switch (type) { -+ case SMC_EV_BTN: -+ switch (d1) { -+ case BTN_POWER: -+ input_report_key(smchid->input, KEY_POWER, d2); -+ input_sync(smchid->input); -+ break; -+ case BTN_POWER_HELD1: -+ /* -+ * TODO: is this pre-warning useful? -+ */ -+ if (d2) -+ dev_warn(smchid->dev, "Power button held down\n"); -+ break; -+ case BTN_POWER_HELD2: -+ /* -+ * If we get here, we have about 4 seconds before forced shutdown. -+ * Try to do an emergency shutdown to make sure the NVMe cache is -+ * flushed. macOS actually does this by panicing (!)... -+ */ -+ if (d2) { -+ dev_crit(smchid->dev, "Triggering forced shutdown!\n"); -+ if (kernel_can_power_off()) -+ kernel_power_off(); -+ else /* Missing macsmc-reboot driver? */ -+ kernel_restart("SMC power button triggered restart"); -+ } -+ break; -+ default: -+ dev_info(smchid->dev, "Unknown SMC button event: %02x %02x\n", d1, d2); -+ break; -+ } -+ return NOTIFY_OK; -+ case SMC_EV_LID: -+ input_report_switch(smchid->input, SW_LID, d1); -+ input_sync(smchid->input); -+ return NOTIFY_OK; -+ } -+ -+ return NOTIFY_DONE; -+} -+ -+static int macsmc_hid_probe(struct platform_device *pdev) -+{ -+ struct apple_smc *smc = dev_get_drvdata(pdev->dev.parent); -+ struct macsmc_hid *smchid; -+ bool have_lid, have_power; -+ int ret; -+ -+ have_lid = apple_smc_key_exists(smc, SMC_KEY(MSLD)); -+ have_power = apple_smc_key_exists(smc, SMC_KEY(bHLD)); -+ -+ if (!have_lid && !have_power) -+ return -ENODEV; -+ -+ smchid = devm_kzalloc(&pdev->dev, sizeof(*smchid), GFP_KERNEL); -+ if (!smchid) -+ return -ENOMEM; -+ -+ smchid->dev = &pdev->dev; -+ smchid->smc = smc; -+ -+ smchid->input = devm_input_allocate_device(&pdev->dev); -+ if (!smchid->input) -+ return -ENOMEM; -+ -+ smchid->input->phys = "macsmc-hid (0)"; -+ smchid->input->name = "Apple SMC power/lid events"; -+ -+ if (have_lid) -+ input_set_capability(smchid->input, EV_SW, SW_LID); -+ if (have_power) -+ input_set_capability(smchid->input, EV_KEY, KEY_POWER); -+ -+ ret = input_register_device(smchid->input); -+ if (ret) { -+ dev_err(&pdev->dev, "Failed to register input device: %d\n", ret); -+ return ret; -+ } -+ -+ if (have_lid) { -+ u8 val; -+ -+ ret = apple_smc_read_u8(smc, SMC_KEY(MSLD), &val); -+ if (ret < 0) { -+ dev_err(&pdev->dev, "Failed to read initial lid state\n"); -+ } else { -+ input_report_switch(smchid->input, SW_LID, val); -+ } -+ } -+ if (have_power) { -+ u32 val; -+ -+ ret = apple_smc_read_u32(smc, SMC_KEY(bHLD), &val); -+ if (ret < 0) { -+ dev_err(&pdev->dev, "Failed to read initial power button state\n"); -+ } else { -+ input_report_key(smchid->input, KEY_POWER, val & 1); -+ } -+ } -+ -+ input_sync(smchid->input); -+ -+ smchid->nb.notifier_call = macsmc_hid_event; -+ apple_smc_register_notifier(smc, &smchid->nb); -+ -+ return 0; -+} -+ -+static struct platform_driver macsmc_hid_driver = { -+ .driver = { -+ .name = "macsmc-hid", -+ }, -+ .probe = macsmc_hid_probe, -+}; -+module_platform_driver(macsmc_hid_driver); -+ -+MODULE_AUTHOR("Hector Martin "); -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_DESCRIPTION("Apple SMC GPIO driver"); -+MODULE_ALIAS("platform:macsmc-hid"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0150-Input-macsmc-hid-Support-button-lid-wakeups.patch b/target/linux/silicon/patches-5.19/0150-Input-macsmc-hid-Support-button-lid-wakeups.patch deleted file mode 100644 index 8a27fa60a..000000000 --- a/target/linux/silicon/patches-5.19/0150-Input-macsmc-hid-Support-button-lid-wakeups.patch +++ /dev/null @@ -1,99 +0,0 @@ -From f197789f0d78ce24b6032ac53ddc06d7722422fb Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sat, 5 Mar 2022 01:08:04 +0900 -Subject: [PATCH 150/171] Input: macsmc-hid: Support button/lid wakeups - -Signed-off-by: Hector Martin ---- - drivers/input/misc/macsmc-hid.c | 41 +++++++++++++++++++++++++++++++-- - 1 file changed, 39 insertions(+), 2 deletions(-) - -diff --git a/drivers/input/misc/macsmc-hid.c b/drivers/input/misc/macsmc-hid.c -index 1c0f7476081f..c4c7440d4ee6 100644 ---- a/drivers/input/misc/macsmc-hid.c -+++ b/drivers/input/misc/macsmc-hid.c -@@ -18,6 +18,7 @@ struct macsmc_hid { - struct apple_smc *smc; - struct input_dev *input; - struct notifier_block nb; -+ bool wakeup_mode; - }; - - #define SMC_EV_BTN 0x7201 -@@ -38,8 +39,15 @@ static int macsmc_hid_event(struct notifier_block *nb, unsigned long event, void - case SMC_EV_BTN: - switch (d1) { - case BTN_POWER: -- input_report_key(smchid->input, KEY_POWER, d2); -- input_sync(smchid->input); -+ if (smchid->wakeup_mode) { -+ if (d2) { -+ dev_info(smchid->dev, "Button wakeup\n"); -+ pm_wakeup_hard_event(smchid->dev); -+ } -+ } else { -+ input_report_key(smchid->input, KEY_POWER, d2); -+ input_sync(smchid->input); -+ } - break; - case BTN_POWER_HELD1: - /* -@@ -68,6 +76,10 @@ static int macsmc_hid_event(struct notifier_block *nb, unsigned long event, void - } - return NOTIFY_OK; - case SMC_EV_LID: -+ if (smchid->wakeup_mode && !d1) { -+ dev_info(smchid->dev, "Lid wakeup\n"); -+ pm_wakeup_hard_event(smchid->dev); -+ } - input_report_switch(smchid->input, SW_LID, d1); - input_sync(smchid->input); - return NOTIFY_OK; -@@ -95,6 +107,7 @@ static int macsmc_hid_probe(struct platform_device *pdev) - - smchid->dev = &pdev->dev; - smchid->smc = smc; -+ platform_set_drvdata(pdev, smchid); - - smchid->input = devm_input_allocate_device(&pdev->dev); - if (!smchid->input) -@@ -140,12 +153,36 @@ static int macsmc_hid_probe(struct platform_device *pdev) - smchid->nb.notifier_call = macsmc_hid_event; - apple_smc_register_notifier(smc, &smchid->nb); - -+ device_init_wakeup(&pdev->dev, 1); -+ -+ return 0; -+} -+ -+static int macsmc_hid_pm_prepare(struct device *dev) -+{ -+ struct macsmc_hid *smchid = dev_get_drvdata(dev); -+ -+ smchid->wakeup_mode = true; - return 0; - } - -+static void macsmc_hid_pm_complete(struct device *dev) -+{ -+ struct macsmc_hid *smchid = dev_get_drvdata(dev); -+ -+ smchid->wakeup_mode = false; -+} -+ -+static const struct dev_pm_ops macsmc_hid_pm_ops = { -+ .prepare = macsmc_hid_pm_prepare, -+ .complete = macsmc_hid_pm_complete, -+}; -+ - static struct platform_driver macsmc_hid_driver = { - .driver = { - .name = "macsmc-hid", -+ .owner = THIS_MODULE, -+ .pm = &macsmc_hid_pm_ops, - }, - .probe = macsmc_hid_probe, - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0151-gpio-macsmc-Add-IRQ-support.patch b/target/linux/silicon/patches-5.19/0151-gpio-macsmc-Add-IRQ-support.patch deleted file mode 100644 index 3cb056e0d..000000000 --- a/target/linux/silicon/patches-5.19/0151-gpio-macsmc-Add-IRQ-support.patch +++ /dev/null @@ -1,212 +0,0 @@ -From 958cf3ceb9eeeef363bc311794b69226f8827c07 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 5 May 2022 01:38:19 +0900 -Subject: [PATCH 151/171] gpio: macsmc: Add IRQ support - -Signed-off-by: Hector Martin ---- - drivers/gpio/gpio-macsmc.c | 151 +++++++++++++++++++++++++++++++++++++ - 1 file changed, 151 insertions(+) - -diff --git a/drivers/gpio/gpio-macsmc.c b/drivers/gpio/gpio-macsmc.c -index ff9950afb69a..2f1f07ea3891 100644 ---- a/drivers/gpio/gpio-macsmc.c -+++ b/drivers/gpio/gpio-macsmc.c -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - #include - #include - -@@ -68,10 +69,21 @@ - * 3 = ? - */ - -+#define SMC_EV_GPIO 0x7202 -+ - struct macsmc_gpio { - struct device *dev; - struct apple_smc *smc; - struct gpio_chip gc; -+ struct irq_chip ic; -+ struct notifier_block nb; -+ -+ struct mutex irq_mutex; -+ DECLARE_BITMAP(irq_supported, MAX_GPIO); -+ DECLARE_BITMAP(irq_enable_shadow, MAX_GPIO); -+ DECLARE_BITMAP(irq_enable, MAX_GPIO); -+ u32 irq_mode_shadow[MAX_GPIO]; -+ u32 irq_mode[MAX_GPIO]; - - int first_index; - }; -@@ -161,6 +173,7 @@ static int macsmc_gpio_init_valid_mask(struct gpio_chip *gc, - for (i = 0; i < count; i++) { - smc_key key; - int gpio_nr; -+ u32 val; - int ret = apple_smc_get_key_by_index(smcgp->smc, smcgp->first_index + i, &key); - - if (ret < 0) -@@ -176,11 +189,128 @@ static int macsmc_gpio_init_valid_mask(struct gpio_chip *gc, - } - - set_bit(gpio_nr, valid_mask); -+ -+ /* Check for IRQ support */ -+ ret = apple_smc_rw_u32(smcgp->smc, key, CMD_IRQ_MODE, &val); -+ if (!ret) -+ set_bit(gpio_nr, smcgp->irq_supported); -+ } -+ -+ return 0; -+} -+ -+static int macsmc_gpio_event(struct notifier_block *nb, unsigned long event, void *data) -+{ -+ struct macsmc_gpio *smcgp = container_of(nb, struct macsmc_gpio, nb); -+ u16 type = event >> 16; -+ u8 offset = (event >> 8) & 0xff; -+ smc_key key = macsmc_gpio_key(offset); -+ unsigned long flags; -+ int ret; -+ -+ if (type != SMC_EV_GPIO) -+ return NOTIFY_DONE; -+ -+ if (offset > MAX_GPIO) { -+ dev_err(smcgp->dev, "GPIO event index %d out of range\n", offset); -+ return NOTIFY_BAD; -+ } -+ -+ local_irq_save(flags); -+ ret = handle_irq_desc(irq_resolve_mapping(smcgp->gc.irq.domain, offset)); -+ local_irq_restore(flags); -+ -+ if (apple_smc_write_u32(smcgp->smc, key, CMD_IRQ_ACK | 1) < 0) -+ dev_err(smcgp->dev, "GPIO IRQ ack failed for %p4ch\n", &key); -+ -+ return (ret == 0) ? NOTIFY_OK : NOTIFY_DONE; -+} -+ -+static void macsmc_gpio_irq_enable(struct irq_data *d) -+{ -+ struct gpio_chip *gc = irq_data_get_irq_chip_data(d); -+ struct macsmc_gpio *smcgp = gpiochip_get_data(gc); -+ -+ set_bit(irqd_to_hwirq(d), smcgp->irq_enable_shadow); -+} -+ -+static void macsmc_gpio_irq_disable(struct irq_data *d) -+{ -+ struct gpio_chip *gc = irq_data_get_irq_chip_data(d); -+ struct macsmc_gpio *smcgp = gpiochip_get_data(gc); -+ -+ clear_bit(irqd_to_hwirq(d), smcgp->irq_enable_shadow); -+} -+ -+static int macsmc_gpio_irq_set_type(struct irq_data *d, unsigned int type) -+{ -+ struct gpio_chip *gc = irq_data_get_irq_chip_data(d); -+ struct macsmc_gpio *smcgp = gpiochip_get_data(gc); -+ int offset = irqd_to_hwirq(d); -+ u32 mode; -+ -+ if (!test_bit(offset, smcgp->irq_supported)) -+ return -EINVAL; -+ -+ switch (type & IRQ_TYPE_SENSE_MASK) { -+ case IRQ_TYPE_LEVEL_HIGH: -+ mode = IRQ_MODE_HIGH; -+ break; -+ case IRQ_TYPE_LEVEL_LOW: -+ mode = IRQ_MODE_LOW; -+ break; -+ case IRQ_TYPE_EDGE_RISING: -+ mode = IRQ_MODE_RISING; -+ break; -+ case IRQ_TYPE_EDGE_FALLING: -+ mode = IRQ_MODE_FALLING; -+ break; -+ case IRQ_TYPE_EDGE_BOTH: -+ mode = IRQ_MODE_BOTH; -+ break; -+ default: -+ return -EINVAL; - } - -+ smcgp->irq_mode_shadow[offset] = mode; - return 0; - } - -+static void macsmc_gpio_irq_bus_lock(struct irq_data *d) -+{ -+ struct gpio_chip *gc = irq_data_get_irq_chip_data(d); -+ struct macsmc_gpio *smcgp = gpiochip_get_data(gc); -+ -+ mutex_lock(&smcgp->irq_mutex); -+} -+ -+static void macsmc_gpio_irq_bus_sync_unlock(struct irq_data *d) -+{ -+ struct gpio_chip *gc = irq_data_get_irq_chip_data(d); -+ struct macsmc_gpio *smcgp = gpiochip_get_data(gc); -+ smc_key key = macsmc_gpio_key(irqd_to_hwirq(d)); -+ int offset = irqd_to_hwirq(d); -+ bool val; -+ -+ if (smcgp->irq_mode_shadow[offset] != smcgp->irq_mode[offset]) { -+ u32 cmd = CMD_IRQ_MODE | smcgp->irq_mode_shadow[offset]; -+ if (apple_smc_write_u32(smcgp->smc, key, cmd) < 0) -+ dev_err(smcgp->dev, "GPIO IRQ config failed for %p4ch = 0x%x\n", &key, cmd); -+ else -+ smcgp->irq_mode_shadow[offset] = smcgp->irq_mode[offset]; -+ } -+ -+ val = test_bit(offset, smcgp->irq_enable_shadow); -+ if (test_bit(offset, smcgp->irq_enable) != val) { -+ if (apple_smc_write_u32(smcgp->smc, key, CMD_IRQ_ENABLE | val) < 0) -+ dev_err(smcgp->dev, "GPIO IRQ en/disable failed for %p4ch\n", &key); -+ else -+ change_bit(offset, smcgp->irq_enable); -+ } -+ -+ mutex_unlock(&smcgp->irq_mutex); -+} -+ - static int macsmc_gpio_probe(struct platform_device *pdev) - { - struct macsmc_gpio *smcgp; -@@ -221,6 +351,27 @@ static int macsmc_gpio_probe(struct platform_device *pdev) - smcgp->gc.base = -1; - smcgp->gc.parent = &pdev->dev; - -+ smcgp->ic.name = "macsmc-pmu-gpio"; -+ smcgp->ic.irq_mask = macsmc_gpio_irq_disable; -+ smcgp->ic.irq_unmask = macsmc_gpio_irq_enable; -+ smcgp->ic.irq_set_type = macsmc_gpio_irq_set_type; -+ smcgp->ic.irq_bus_lock = macsmc_gpio_irq_bus_lock; -+ smcgp->ic.irq_bus_sync_unlock = macsmc_gpio_irq_bus_sync_unlock; -+ smcgp->ic.irq_set_type = macsmc_gpio_irq_set_type; -+ smcgp->ic.flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND; -+ -+ smcgp->gc.irq.chip = &smcgp->ic; -+ smcgp->gc.irq.parent_handler = NULL; -+ smcgp->gc.irq.num_parents = 0; -+ smcgp->gc.irq.parents = NULL; -+ smcgp->gc.irq.default_type = IRQ_TYPE_NONE; -+ smcgp->gc.irq.handler = handle_simple_irq; -+ -+ mutex_init(&smcgp->irq_mutex); -+ -+ smcgp->nb.notifier_call = macsmc_gpio_event; -+ apple_smc_register_notifier(smc, &smcgp->nb); -+ - return devm_gpiochip_add_data(&pdev->dev, &smcgp->gc, smcgp); - } - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0152-spmi-add-a-first-basic-spmi-driver-for-Apple-SoC.patch b/target/linux/silicon/patches-5.19/0152-spmi-add-a-first-basic-spmi-driver-for-Apple-SoC.patch deleted file mode 100644 index 9f84be491..000000000 --- a/target/linux/silicon/patches-5.19/0152-spmi-add-a-first-basic-spmi-driver-for-Apple-SoC.patch +++ /dev/null @@ -1,249 +0,0 @@ -From 69860806b247b72cc354ca35ea147c2d1538ea85 Mon Sep 17 00:00:00 2001 -From: Jean-Francois Bortolotti -Date: Fri, 4 Feb 2022 00:06:13 +0100 -Subject: [PATCH 152/171] spmi: add a first basic spmi driver for Apple SoC - -Signed-off-by: Jean-Francois Bortolotti ---- - drivers/spmi/Kconfig | 8 ++ - drivers/spmi/Makefile | 1 + - drivers/spmi/spmi-apple-controller.c | 201 +++++++++++++++++++++++++++ - 3 files changed, 210 insertions(+) - create mode 100644 drivers/spmi/spmi-apple-controller.c - -diff --git a/drivers/spmi/Kconfig b/drivers/spmi/Kconfig -index 737802046314..96c73c5b5720 100644 ---- a/drivers/spmi/Kconfig -+++ b/drivers/spmi/Kconfig -@@ -45,4 +45,12 @@ config SPMI_MTK_PMIF - This is required for communicating with Mediatek PMICs and - other devices that have the SPMI interface. - -+config SPMI_APPLE -+ tristate "Apple SoC SPMI Controller platform driver" -+ depends on ARCH_APPLE || COMPILE_TEST -+ help -+ This enables basic support for the SPMI controller present on -+ many Apple SoCs, including the t8103 (M1) and t600x -+ (M1 Pro/Max). -+ - endif -diff --git a/drivers/spmi/Makefile b/drivers/spmi/Makefile -index 9d974424c8c1..989b84bbca60 100644 ---- a/drivers/spmi/Makefile -+++ b/drivers/spmi/Makefile -@@ -7,3 +7,4 @@ obj-$(CONFIG_SPMI) += spmi.o - obj-$(CONFIG_SPMI_HISI3670) += hisi-spmi-controller.o - obj-$(CONFIG_SPMI_MSM_PMIC_ARB) += spmi-pmic-arb.o - obj-$(CONFIG_SPMI_MTK_PMIF) += spmi-mtk-pmif.o -+obj-$(CONFIG_SPMI_APPLE) += spmi-apple-controller.o -diff --git a/drivers/spmi/spmi-apple-controller.c b/drivers/spmi/spmi-apple-controller.c -new file mode 100644 -index 000000000000..3b6de8069396 ---- /dev/null -+++ b/drivers/spmi/spmi-apple-controller.c -@@ -0,0 +1,201 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * Apple SoC SPMI device driver -+ * -+ * Copyright The Asahi Linux Contributors -+ * -+ * Inspired by: -+ * OpenBSD support Copyright (c) 2021 Mark Kettenis -+ * Correllium support Copyright (C) 2021 Corellium LLC -+ * hisi-spmi-controller.c -+ * spmi-pmic-ard.c Copyright (c) 2021, The Linux Foundation. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+ -+/* SPMI Controller Registers */ -+#define SPMI_STATUS_REG 0 -+#define SPMI_CMD_REG 0x4 -+#define SPMI_RSP_REG 0x8 -+ -+#define SPMI_RX_FIFO_EMPTY BIT(24) -+#define SPMI_TX_FIFO_EMPTY BIT(8) -+ -+/* Apple SPMI controler */ -+struct apple_spmi { -+ void __iomem *regs; -+ struct spmi_controller *ctrl; -+}; -+ -+static inline u32 read_reg(struct apple_spmi *spmi, int offset) -+{ -+ return(readl_relaxed(spmi->regs + offset)); -+} -+ -+static inline void write_reg(u32 value, struct apple_spmi *spmi, int offset) -+{ -+ writel_relaxed(value, spmi->regs + offset); -+} -+ -+static int spmi_read_cmd(struct spmi_controller *ctrl, -+ u8 opc, u8 slave_id, u16 slave_addr, u8 *__buf, size_t bc) -+{ -+ struct apple_spmi *spmi; -+ u32 spmi_cmd = opc|slave_id<<8|slave_addr<<16|(bc-1)|(1<<15); -+ u32 rsp; -+ volatile u32 status; -+ size_t len_to_read; -+ u8 i; -+ -+ spmi = spmi_controller_get_drvdata(ctrl); -+ -+ write_reg(spmi_cmd, spmi, SPMI_CMD_REG); -+ -+ /* Wait for Rx FIFO to have something */ -+ /* Quite ugly msleep, need to find a better way to do it */ -+ i=0; -+ do { -+ status=read_reg(spmi, SPMI_STATUS_REG); -+ msleep(10); -+ i+=1; -+ } while ((status & SPMI_RX_FIFO_EMPTY) && i<5); -+ -+ if(i>=5){ -+ dev_err(&ctrl->dev,"spmi_read_cmd:took to long to get the status"); -+ return -1; -+ } -+ -+ /* Read SPMI reply status */ -+ rsp=read_reg(spmi, SPMI_RSP_REG); -+ -+ len_to_read = 0; -+ /* Read SPMI data reply */ -+ while (!( status & SPMI_RX_FIFO_EMPTY ) && (len_to_read < bc )) { -+ rsp=read_reg(spmi, SPMI_RSP_REG); -+ i=0; -+ while ((len_to_read>(8*i); -+ i+=1; -+ } -+ } -+ -+ return 0; -+} -+ -+static int spmi_write_cmd(struct spmi_controller *ctrl, -+ u8 opc, u8 slave_id, u16 slave_addr, const u8 *__buf, size_t bc) -+{ -+ struct apple_spmi *spmi; -+ u32 spmi_cmd = opc|slave_id<<8|slave_addr<<16|(bc-1)|(1<<15); -+ volatile u32 rsp; -+ size_t i=0,j; -+ -+ spmi = spmi_controller_get_drvdata(ctrl); -+ -+ write_reg(spmi_cmd, spmi, SPMI_CMD_REG); -+ -+ while (idev, sizeof(struct apple_spmi)); -+ if (IS_ERR(ctrl)) { -+ dev_err_probe(&pdev->dev, PTR_ERR(ctrl), "Can't allocate spmi_controller data\n"); -+ return -ENOMEM; -+ } -+ -+ spmi = spmi_controller_get_drvdata(ctrl); -+ spmi->ctrl=ctrl; -+ platform_set_drvdata(pdev, ctrl); -+ -+ spmi->regs = devm_platform_ioremap_resource(pdev, 0); -+ if (IS_ERR(spmi->regs)) { -+ dev_err_probe(&pdev->dev, PTR_ERR(spmi->regs), "Can't get ioremap regs.\n"); -+ return PTR_ERR(spmi->regs); -+ } -+ -+ ctrl->dev.of_node = of_node_get(pdev->dev.of_node); -+ -+ /* Callbacks */ -+ ctrl->read_cmd = spmi_read_cmd; -+ ctrl->write_cmd = spmi_write_cmd; -+ -+ ret = spmi_controller_add(ctrl); -+ if (ret) { -+ dev_err(&pdev->dev, "spmi_controller_add failed with error %d!\n", ret); -+ goto err_put_controller; -+ } -+ -+ /* Let's look for other nodes in device tree like the rtc */ -+ ret = devm_of_platform_populate(&pdev->dev); -+ if (ret) { -+ dev_err(&pdev->dev, "spmi_controller_probe: devm_of_platform_populate failed with error %d!\n", ret); -+ goto err_devm_of_platform_populate; -+ } -+ -+ return 0; -+ -+err_put_controller: -+ spmi_controller_put(ctrl); -+err_devm_of_platform_populate: -+ return ret; -+} -+ -+static int spmi_del_controller(struct platform_device *pdev) -+{ -+ struct spmi_controller *ctrl = platform_get_drvdata(pdev); -+ -+ spmi_controller_remove(ctrl); -+ spmi_controller_put(ctrl); -+ return 0; -+} -+ -+static const struct of_device_id spmi_controller_match_table[] = { -+ {.compatible = "apple,spmi",}, -+ {} -+}; -+MODULE_DEVICE_TABLE(of, spmi_controller_match_table); -+ -+static struct platform_driver spmi_controller_driver = { -+ .probe = spmi_controller_probe, -+ .remove = spmi_del_controller, -+ .driver = { -+ .name = "apple-spmi", -+ .owner = THIS_MODULE, -+ .of_match_table = spmi_controller_match_table, -+ }, -+}; -+module_platform_driver(spmi_controller_driver); -+ -+MODULE_AUTHOR("Jean-Francois Bortolotti "); -+MODULE_DESCRIPTION("Apple SoC SPMI driver"); -+MODULE_LICENSE("GPL"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0153-mfd-Add-a-simple-mfd-spmi-driver.patch b/target/linux/silicon/patches-5.19/0153-mfd-Add-a-simple-mfd-spmi-driver.patch deleted file mode 100644 index 639d2adf7..000000000 --- a/target/linux/silicon/patches-5.19/0153-mfd-Add-a-simple-mfd-spmi-driver.patch +++ /dev/null @@ -1,133 +0,0 @@ -From 8d26f74c3cfe2457f40536a541a864e8567a9207 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 18:43:17 +0900 -Subject: [PATCH 153/171] mfd: Add a simple-mfd-spmi driver - -This is the SPMI counterpart to simple-mfd-i2c. It merely exposes the -SPMI register address space as an MFD device, such that different -aspects of a device can be managed by separate drivers. - -Signed-off-by: Hector Martin ---- - drivers/mfd/Kconfig | 28 ++++++++++++++++++++ - drivers/mfd/Makefile | 1 + - drivers/mfd/simple-mfd-spmi.c | 49 +++++++++++++++++++++++++++++++++++ - 3 files changed, 78 insertions(+) - create mode 100644 drivers/mfd/simple-mfd-spmi.c - -diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig -index 3b59456f5545..e675aaf00bc8 100644 ---- a/drivers/mfd/Kconfig -+++ b/drivers/mfd/Kconfig -@@ -51,6 +51,21 @@ config MFD_ACT8945A - linear regulators, along with a complete ActivePath battery - charger. - -+config MFD_APPLE_SPMI_PMU -+ tristate "Apple SPMI PMUs" -+ depends on SPMI -+ depends on ARCH_APPLE || COMPILE_TEST -+ default ARCH_APPLE -+ select MFD_SIMPLE_MFD_SPMI -+ help -+ Say yes here to enable support for Apple PMUs attached via the -+ SPMI bus. These can be found on Apple devices such as Apple -+ Silicon Macs. -+ -+ This driver itself only attaches to the core device, and relies -+ on subsystem drivers for individual device functions. You must -+ enable those for it to be useful. -+ - config MFD_SUN4I_GPADC - tristate "Allwinner sunxi platforms' GPADC MFD driver" - select MFD_CORE -@@ -1214,6 +1229,19 @@ config MFD_SIMPLE_MFD_I2C - sub-devices represented by child nodes in Device Tree will be - subsequently registered. - -+config MFD_SIMPLE_MFD_SPMI -+ tristate -+ depends on SPMI -+ select MFD_CORE -+ select REGMAP_SPMI -+ help -+ This driver creates a single register map with the intention for it -+ to be shared by all sub-devices. -+ -+ Once the register map has been successfully initialised, any -+ sub-devices represented by child nodes in Device Tree will be -+ subsequently registered. -+ - config MFD_SL28CPLD - tristate "Kontron sl28cpld Board Management Controller" - depends on I2C -diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile -index 858cacf659d6..8d8abcd68351 100644 ---- a/drivers/mfd/Makefile -+++ b/drivers/mfd/Makefile -@@ -266,6 +266,7 @@ obj-$(CONFIG_MFD_QCOM_PM8008) += qcom-pm8008.o - - obj-$(CONFIG_SGI_MFD_IOC3) += ioc3.o - obj-$(CONFIG_MFD_SIMPLE_MFD_I2C) += simple-mfd-i2c.o -+obj-$(CONFIG_MFD_SIMPLE_MFD_SPMI) += simple-mfd-spmi.o - obj-$(CONFIG_MFD_INTEL_M10_BMC) += intel-m10-bmc.o - - obj-$(CONFIG_MFD_ATC260X) += atc260x-core.o -diff --git a/drivers/mfd/simple-mfd-spmi.c b/drivers/mfd/simple-mfd-spmi.c -new file mode 100644 -index 000000000000..99f25751000a ---- /dev/null -+++ b/drivers/mfd/simple-mfd-spmi.c -@@ -0,0 +1,49 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Simple MFD - SPMI -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+static const struct regmap_config spmi_regmap_config = { -+ .reg_bits = 16, -+ .val_bits = 8, -+ .max_register = 0xffff, -+}; -+ -+static int simple_spmi_probe(struct spmi_device *sdev) -+{ -+ struct regmap *regmap; -+ -+ regmap = devm_regmap_init_spmi_ext(sdev, &spmi_regmap_config); -+ if (IS_ERR(regmap)) -+ return PTR_ERR(regmap); -+ -+ return devm_of_platform_populate(&sdev->dev); -+} -+ -+static const struct of_device_id simple_spmi_id_table[] = { -+ { .compatible = "apple,spmi-pmu" }, -+ {} -+}; -+MODULE_DEVICE_TABLE(of, simple_spmi_id_table); -+ -+static struct spmi_driver pmic_spmi_driver = { -+ .probe = simple_spmi_probe, -+ .driver = { -+ .name = "simple-mfd-spmi", -+ .owner = THIS_MODULE, -+ .of_match_table = simple_spmi_id_table, -+ }, -+}; -+module_spmi_driver(pmic_spmi_driver); -+ -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_DESCRIPTION("Simple MFD - SPMI driver"); -+MODULE_AUTHOR("Hector Martin "); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0154-nvmem-Add-spmi-mfd-nvmem-driver.patch b/target/linux/silicon/patches-5.19/0154-nvmem-Add-spmi-mfd-nvmem-driver.patch deleted file mode 100644 index 2a69c6ca2..000000000 --- a/target/linux/silicon/patches-5.19/0154-nvmem-Add-spmi-mfd-nvmem-driver.patch +++ /dev/null @@ -1,163 +0,0 @@ -From 7d8a1a4c3dddcdaa51aa354bf82074a86640794c Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 18:45:25 +0900 -Subject: [PATCH 154/171] nvmem: Add spmi-mfd-nvmem driver - -This driver exposes part of an SPMI MFD device as an NVMEM device. -It is intended to be used with e.g. PMUs/PMICs that are used to -hold power-management configuration, such as used on Apple Silicon -Macs. - -Signed-off-by: Hector Martin ---- - drivers/nvmem/Kconfig | 13 +++++ - drivers/nvmem/Makefile | 2 + - drivers/nvmem/spmi-mfd-nvmem.c | 99 ++++++++++++++++++++++++++++++++++ - 3 files changed, 114 insertions(+) - create mode 100644 drivers/nvmem/spmi-mfd-nvmem.c - -diff --git a/drivers/nvmem/Kconfig b/drivers/nvmem/Kconfig -index 967d0084800e..577984390149 100644 ---- a/drivers/nvmem/Kconfig -+++ b/drivers/nvmem/Kconfig -@@ -172,6 +172,19 @@ config NVMEM_BCM_OCOTP - This driver can also be built as a module. If so, the module - will be called nvmem-bcm-ocotp. - -+config NVMEM_SPMI_MFD -+ tristate "Generic SPMI MFD NVMEM" -+ depends on MFD_SIMPLE_MFD_SPMI || COMPILE_TEST -+ default ARCH_APPLE -+ help -+ Say y here to build a generic driver to expose an SPMI MFD device -+ as a NVMEM provider. This can be used for PMIC/PMU devices which -+ are used to store power and RTC-related settings on certain -+ platforms, such as Apple Silicon Macs. -+ -+ This driver can also be built as a module. If so, the module -+ will be called nvmem-spmi-mfd. -+ - config NVMEM_STM32_ROMEM - tristate "STMicroelectronics STM32 factory-programmed memory support" - depends on ARCH_STM32 || COMPILE_TEST -diff --git a/drivers/nvmem/Makefile b/drivers/nvmem/Makefile -index 00e136a0a123..026eac4da53d 100644 ---- a/drivers/nvmem/Makefile -+++ b/drivers/nvmem/Makefile -@@ -38,6 +38,8 @@ nvmem-rockchip-otp-y := rockchip-otp.o - obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o - nvmem_stm32_romem-y := stm32-romem.o - obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o -+nvmem_spmi_mfd-y := spmi-mfd-nvmem.o -+obj-$(CONFIG_NVMEM_SPMI_MFD) += nvmem_spmi_mfd.o - nvmem_sunxi_sid-y := sunxi_sid.o - obj-$(CONFIG_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o - nvmem-uniphier-efuse-y := uniphier-efuse.o -diff --git a/drivers/nvmem/spmi-mfd-nvmem.c b/drivers/nvmem/spmi-mfd-nvmem.c -new file mode 100644 -index 000000000000..284c93be2e18 ---- /dev/null -+++ b/drivers/nvmem/spmi-mfd-nvmem.c -@@ -0,0 +1,99 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Generic SPMI MFD NVMEM driver -+ * -+ * Copyright The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+struct spmi_mfd_nvmem { -+ struct regmap *regmap; -+ unsigned int base; -+}; -+ -+static int spmi_mfd_nvmem_read(void *priv, unsigned int offset, -+ void *val, size_t bytes) -+{ -+ struct spmi_mfd_nvmem *nvmem = priv; -+ -+ return regmap_bulk_read(nvmem->regmap, nvmem->base + offset, val, bytes); -+} -+ -+static int spmi_mfd_nvmem_write(void *priv, unsigned int offset, -+ void *val, size_t bytes) -+{ -+ struct spmi_mfd_nvmem *nvmem = priv; -+ -+ return regmap_bulk_write(nvmem->regmap, nvmem->base + offset, val, bytes); -+} -+ -+static int spmi_mfd_nvmem_probe(struct platform_device *pdev) -+{ -+ struct spmi_mfd_nvmem *nvmem; -+ const __be32 *addr; -+ int len; -+ struct nvmem_config nvmem_cfg = { -+ .dev = &pdev->dev, -+ .name = "spmi_mfd_nvmem", -+ .id = NVMEM_DEVID_AUTO, -+ .word_size = 1, -+ .stride = 1, -+ .reg_read = spmi_mfd_nvmem_read, -+ .reg_write = spmi_mfd_nvmem_write, -+ }; -+ -+ nvmem = devm_kzalloc(&pdev->dev, sizeof(*nvmem), GFP_KERNEL); -+ if (!nvmem) -+ return -ENOMEM; -+ -+ nvmem_cfg.priv = nvmem; -+ -+ nvmem->regmap = dev_get_regmap(pdev->dev.parent, NULL); -+ if (!nvmem->regmap) { -+ dev_err(&pdev->dev, "Parent regmap unavailable.\n"); -+ return -ENXIO; -+ } -+ -+ addr = of_get_property(pdev->dev.of_node, "reg", &len); -+ if (!addr) { -+ dev_err(&pdev->dev, "no reg property\n"); -+ return -EINVAL; -+ } -+ if (len != 2 * sizeof(u32)) { -+ dev_err(&pdev->dev, "invalid reg property\n"); -+ return -EINVAL; -+ } -+ -+ nvmem->base = be32_to_cpup(&addr[0]); -+ nvmem_cfg.size = be32_to_cpup(&addr[1]); -+ -+ return PTR_ERR_OR_ZERO(devm_nvmem_register(&pdev->dev, &nvmem_cfg)); -+} -+ -+static const struct of_device_id spmi_mfd_nvmem_id_table[] = { -+ { .compatible = "apple,spmi-pmu-nvmem" }, -+ { .compatible = "spmi-mfd-nvmem" }, -+ { }, -+}; -+MODULE_DEVICE_TABLE(of, spmi_mfd_nvmem_id_table); -+ -+static struct platform_driver spmi_mfd_nvmem_driver = { -+ .probe = spmi_mfd_nvmem_probe, -+ .driver = { -+ .name = "spmi-mfd-nvmem", -+ .owner = THIS_MODULE, -+ .of_match_table = spmi_mfd_nvmem_id_table, -+ }, -+}; -+ -+module_platform_driver(spmi_mfd_nvmem_driver); -+ -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_AUTHOR("Hector Martin "); -+MODULE_DESCRIPTION("SPMI MFD NVMEM driver"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0155-spmi-apple-Properly-wait-for-status-data-after-write.patch b/target/linux/silicon/patches-5.19/0155-spmi-apple-Properly-wait-for-status-data-after-write.patch deleted file mode 100644 index 1c6d2e726..000000000 --- a/target/linux/silicon/patches-5.19/0155-spmi-apple-Properly-wait-for-status-data-after-write.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 0324791a3cdc3e93df57f6293e2cfaaadc264aeb Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sat, 2 Jul 2022 00:24:15 +0900 -Subject: [PATCH 155/171] spmi: apple: Properly wait for status data after - write - -Signed-off-by: Hector Martin ---- - drivers/spmi/spmi-apple-controller.c | 20 +++++++++++++++----- - 1 file changed, 15 insertions(+), 5 deletions(-) - -diff --git a/drivers/spmi/spmi-apple-controller.c b/drivers/spmi/spmi-apple-controller.c -index 3b6de8069396..5b49d6c609f5 100644 ---- a/drivers/spmi/spmi-apple-controller.c -+++ b/drivers/spmi/spmi-apple-controller.c -@@ -96,6 +96,7 @@ static int spmi_write_cmd(struct spmi_controller *ctrl, - struct apple_spmi *spmi; - u32 spmi_cmd = opc|slave_id<<8|slave_addr<<16|(bc-1)|(1<<15); - volatile u32 rsp; -+ volatile u32 status; - size_t i=0,j; - - spmi = spmi_controller_get_drvdata(ctrl); -@@ -111,12 +112,21 @@ static int spmi_write_cmd(struct spmi_controller *ctrl, - write_reg(spmi_cmd, spmi, SPMI_CMD_REG); - } - -- /* Read SPMI reply status */ -- /* do we need this while loop ? -- if yes what for ? */ -+ /* Wait for Rx FIFO to have something */ -+ /* Quite ugly msleep, need to find a better way to do it */ -+ i=0; - do { -- rsp=read_reg(spmi, SPMI_RSP_REG); -- } while (rsp==0); -+ status=read_reg(spmi, SPMI_STATUS_REG); -+ msleep(10); -+ i+=1; -+ } while ((status & SPMI_RX_FIFO_EMPTY) && i<5); -+ -+ if(i>=5){ -+ dev_err(&ctrl->dev,"spmi_write_cmd:took to long to get the status"); -+ return -1; -+ } -+ -+ rsp = read_reg(spmi, SPMI_RSP_REG); - - return 0; - } --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0156-MAINTAINERS-Add-entries-for-Apple-SoC-cpufreq-driver.patch b/target/linux/silicon/patches-5.19/0156-MAINTAINERS-Add-entries-for-Apple-SoC-cpufreq-driver.patch deleted file mode 100644 index 964e85ccc..000000000 --- a/target/linux/silicon/patches-5.19/0156-MAINTAINERS-Add-entries-for-Apple-SoC-cpufreq-driver.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 67f1aea2ba30aab3d8ceb0c711ab07da1469a37a Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 3 May 2022 00:39:01 +0900 -Subject: [PATCH 156/171] MAINTAINERS: Add entries for Apple SoC cpufreq driver - -Splitting this commit, as usual, to facilitate merges via the SoC tree. - -Signed-off-by: Hector Martin ---- - MAINTAINERS | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/MAINTAINERS b/MAINTAINERS -index 64379c699903..d8cfa30457ac 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1833,6 +1833,7 @@ T: git https://github.com/AsahiLinux/linux.git - F: Documentation/devicetree/bindings/arm/apple.yaml - F: Documentation/devicetree/bindings/arm/apple/* - F: Documentation/devicetree/bindings/clock/apple,nco.yaml -+F: Documentation/devicetree/bindings/cpufreq/apple,soc-cpufreq.yaml - F: Documentation/devicetree/bindings/i2c/apple,i2c.yaml - F: Documentation/devicetree/bindings/interrupt-controller/apple,* - F: Documentation/devicetree/bindings/iommu/apple,dart.yaml -@@ -1846,6 +1847,7 @@ F: Documentation/devicetree/bindings/power/apple* - F: Documentation/devicetree/bindings/watchdog/apple,wdt.yaml - F: arch/arm64/boot/dts/apple/ - F: drivers/clk/clk-apple-nco.c -+F: drivers/cpufreq/apple-soc-cpufreq.c - F: drivers/i2c/busses/i2c-pasemi-core.c - F: drivers/i2c/busses/i2c-pasemi-platform.c - F: drivers/iommu/apple-dart.c --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0157-dt-bindings-cpufreq-apple-soc-cpufreq-Add-binding-fo.patch b/target/linux/silicon/patches-5.19/0157-dt-bindings-cpufreq-apple-soc-cpufreq-Add-binding-fo.patch deleted file mode 100644 index 209807ba9..000000000 --- a/target/linux/silicon/patches-5.19/0157-dt-bindings-cpufreq-apple-soc-cpufreq-Add-binding-fo.patch +++ /dev/null @@ -1,149 +0,0 @@ -From 25e4cf1178f49d975a6fa0c50debeec42c1f98cf Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 2 May 2022 23:21:00 +0900 -Subject: [PATCH 157/171] dt-bindings: cpufreq: apple,soc-cpufreq: Add binding - for Apple SoC cpufreq - -This binding represents the cpufreq/DVFS hardware present in Apple SoCs. -The hardware has an independent controller per CPU cluster, but we -represent them as a single cpufreq node since there can only be one -systemwide cpufreq device (and since in the future, interactions with -memory controller performance states will also involve cooperation -between multiple frequency domains). - -Signed-off-by: Hector Martin ---- - .../bindings/cpufreq/apple,soc-cpufreq.yaml | 121 ++++++++++++++++++ - 1 file changed, 121 insertions(+) - create mode 100644 Documentation/devicetree/bindings/cpufreq/apple,soc-cpufreq.yaml - -diff --git a/Documentation/devicetree/bindings/cpufreq/apple,soc-cpufreq.yaml b/Documentation/devicetree/bindings/cpufreq/apple,soc-cpufreq.yaml -new file mode 100644 -index 000000000000..f398c1bd5de5 ---- /dev/null -+++ b/Documentation/devicetree/bindings/cpufreq/apple,soc-cpufreq.yaml -@@ -0,0 +1,121 @@ -+# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/cpufreq/apple,soc-cpufreq.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Apple SoC cpufreq device -+ -+maintainers: -+ - Hector Martin -+ -+description: | -+ Apple SoCs (e.g. M1) have a per-cpu-cluster DVFS controller that is part of -+ the cluster management register block. This binding uses the standard -+ operating-points-v2 table to define the CPU performance states, with the -+ opp-level property specifying the hardware p-state index for that level. -+ -+properties: -+ compatible: -+ items: -+ - enum: -+ - apple,t8103-soc-cpufreq -+ - apple,t6000-soc-cpufreq -+ - const: apple,soc-cpufreq -+ -+ reg: -+ minItems: 1 -+ maxItems: 6 -+ description: One register region per CPU cluster DVFS controller -+ -+ reg-names: -+ minItems: 1 -+ items: -+ - const: cluster0 -+ - const: cluster1 -+ - const: cluster2 -+ - const: cluster3 -+ - const: cluster4 -+ - const: cluster5 -+ -+ '#freq-domain-cells': -+ const: 1 -+ -+required: -+ - compatible -+ - reg -+ - reg-names -+ - '#freq-domain-cells' -+ -+additionalProperties: false -+ -+examples: -+ - | -+ // This example shows a single CPU per domain and 2 domains, -+ // with two p-states per domain. -+ // Shipping hardware has 2-4 CPUs per domain and 2-6 domains. -+ cpus { -+ #address-cells = <2>; -+ #size-cells = <0>; -+ -+ cpu@0 { -+ compatible = "apple,icestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x0>; -+ operating-points-v2 = <&ecluster_opp>; -+ apple,freq-domain = <&cpufreq_hw 0>; -+ }; -+ -+ cpu@10100 { -+ compatible = "apple,firestorm"; -+ device_type = "cpu"; -+ reg = <0x0 0x10100>; -+ operating-points-v2 = <&pcluster_opp>; -+ apple,freq-domain = <&cpufreq_hw 1>; -+ }; -+ }; -+ -+ ecluster_opp: opp-table-0 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp01 { -+ opp-hz = /bits/ 64 <600000000>; -+ opp-level = <1>; -+ clock-latency-ns = <7500>; -+ }; -+ opp02 { -+ opp-hz = /bits/ 64 <972000000>; -+ opp-level = <2>; -+ clock-latency-ns = <22000>; -+ }; -+ }; -+ -+ pcluster_opp: opp-table-1 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp01 { -+ opp-hz = /bits/ 64 <600000000>; -+ opp-level = <1>; -+ clock-latency-ns = <8000>; -+ }; -+ opp02 { -+ opp-hz = /bits/ 64 <828000000>; -+ opp-level = <2>; -+ clock-latency-ns = <19000>; -+ }; -+ }; -+ -+ soc { -+ #address-cells = <2>; -+ #size-cells = <2>; -+ -+ cpufreq_hw: cpufreq@210e20000 { -+ compatible = "apple,t8103-soc-cpufreq", "apple,soc-cpufreq"; -+ reg = <0x2 0x10e20000 0 0x1000>, -+ <0x2 0x11e20000 0 0x1000>; -+ reg-names = "cluster0", "cluster1"; -+ #freq-domain-cells = <1>; -+ }; -+ }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0158-cpufreq-apple-soc-Add-new-driver-to-control-Apple-So.patch b/target/linux/silicon/patches-5.19/0158-cpufreq-apple-soc-Add-new-driver-to-control-Apple-So.patch deleted file mode 100644 index 9e029ad79..000000000 --- a/target/linux/silicon/patches-5.19/0158-cpufreq-apple-soc-Add-new-driver-to-control-Apple-So.patch +++ /dev/null @@ -1,415 +0,0 @@ -From f6dacf0c666b28f825c5c1f6cbe6792bf858f7cf Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 15 Feb 2022 21:33:32 +0900 -Subject: [PATCH 158/171] cpufreq: apple-soc: Add new driver to control Apple - SoC CPU P-states - -This driver implements CPU frequency scaling for Apple Silicon SoCs, -including M1 (t8103) and M1 Max/Pro/Ultra (t600x). - -Each CPU cluster has its own register set, and frequency management is -fully automated by the hardware; the driver only has to write one -register. There is boost frequency support, but the hardware will only -allow their use if only a subset of cores in a cluster are in -non-deep-idle. Since we don't support deep idle yet, these frequencies -are not achievable, but the driver supports them. They will remain -disabled in the device tree until deep idle is implemented, to avoid -confusing users. - -This driver does not yet implement the memory controller performance -state tuning that usually accompanies higher CPU p-states. This will be -done in a future patch. - -Signed-off-by: Hector Martin ---- - drivers/cpufreq/Kconfig.arm | 9 + - drivers/cpufreq/Makefile | 1 + - drivers/cpufreq/apple-soc-cpufreq.c | 330 +++++++++++++++++++++++++++ - drivers/cpufreq/cpufreq-dt-platdev.c | 2 + - 4 files changed, 342 insertions(+) - create mode 100644 drivers/cpufreq/apple-soc-cpufreq.c - -diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm -index 954749afb5fe..9a020a0bd9c4 100644 ---- a/drivers/cpufreq/Kconfig.arm -+++ b/drivers/cpufreq/Kconfig.arm -@@ -41,6 +41,15 @@ config ARM_ALLWINNER_SUN50I_CPUFREQ_NVMEM - To compile this driver as a module, choose M here: the - module will be called sun50i-cpufreq-nvmem. - -+config ARM_APPLE_SOC_CPUFREQ -+ tristate "Apple Silicon SoC CPUFreq support" -+ depends on ARCH_APPLE || COMPILE_TEST -+ select PM_OPP -+ default ARCH_APPLE -+ help -+ This adds the CPUFreq driver for Apple Silicon machines -+ (e.g. Apple M1). -+ - config ARM_ARMADA_37XX_CPUFREQ - tristate "Armada 37xx CPUFreq support" - depends on ARCH_MVEBU && CPUFREQ_DT -diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile -index 285de70af877..c0da6f2f6cd5 100644 ---- a/drivers/cpufreq/Makefile -+++ b/drivers/cpufreq/Makefile -@@ -51,6 +51,7 @@ obj-$(CONFIG_X86_AMD_FREQ_SENSITIVITY) += amd_freq_sensitivity.o - - ################################################################################## - # ARM SoC drivers -+obj-$(CONFIG_ARM_APPLE_SOC_CPUFREQ) += apple-soc-cpufreq.o - obj-$(CONFIG_ARM_ARMADA_37XX_CPUFREQ) += armada-37xx-cpufreq.o - obj-$(CONFIG_ARM_ARMADA_8K_CPUFREQ) += armada-8k-cpufreq.o - obj-$(CONFIG_ARM_BRCMSTB_AVS_CPUFREQ) += brcmstb-avs-cpufreq.o -diff --git a/drivers/cpufreq/apple-soc-cpufreq.c b/drivers/cpufreq/apple-soc-cpufreq.c -new file mode 100644 -index 000000000000..191eaae71744 ---- /dev/null -+++ b/drivers/cpufreq/apple-soc-cpufreq.c -@@ -0,0 +1,330 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Apple SoC CPU cluster performance state driver -+ * -+ * Copyright The Asahi Linux Contributors -+ * -+ * Based on scpi-cpufreq.c -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define APPLE_DVFS_CMD 0x20 -+#define APPLE_DVFS_CMD_BUSY BIT(31) -+#define APPLE_DVFS_CMD_SET BIT(25) -+#define APPLE_DVFS_CMD_PS2 GENMASK(15, 12) -+#define APPLE_DVFS_CMD_PS1 GENMASK(3, 0) -+ -+/* Same timebase as CPU counter (24MHz) */ -+#define APPLE_DVFS_LAST_CHG_TIME 0x38 -+ -+#define APPLE_DVFS_STATUS 0x50 -+#define APPLE_DVFS_STATUS_CUR_PS GENMASK(7, 4) -+#define APPLE_DVFS_STATUS_TGT_PS GENMASK(3, 0) -+ -+/* -+ * Div is +1, base clock is 12MHz on existing SoCs. -+ * For documentation purposes. We use the OPP table to -+ * get the frequency. -+ */ -+#define APPLE_DVFS_PLL_STATUS 0xc0 -+#define APPLE_DVFS_PLL_FACTOR 0xc8 -+#define APPLE_DVFS_PLL_FACTOR_MULT GENMASK(31, 16) -+#define APPLE_DVFS_PLL_FACTOR_DIV GENMASK(15, 0) -+ -+struct apple_cpu_priv { -+ struct device *cpu_dev; -+ void __iomem *reg_base; -+}; -+ -+struct apple_soc_cpufreq_priv { -+ struct device *dev; -+ void __iomem *reg_base; -+}; -+ -+#define APPLE_DVFS_TRANSITION_TIMEOUT 100 -+ -+static struct cpufreq_driver apple_soc_cpufreq_driver; -+ -+static unsigned int apple_soc_cpufreq_get_rate(unsigned int cpu) -+{ -+ struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu); -+ struct apple_cpu_priv *priv = policy->driver_data; -+ u64 reg = readq_relaxed(priv->reg_base + APPLE_DVFS_STATUS); -+ unsigned int pstate = FIELD_GET(APPLE_DVFS_STATUS_CUR_PS, reg); -+ unsigned int i; -+ -+ for (i = 0; policy->freq_table[i].frequency != CPUFREQ_TABLE_END; i++) -+ if (policy->freq_table[i].driver_data == pstate) -+ return policy->freq_table[i].frequency; -+ -+ dev_err(priv->cpu_dev, "could not find frequency for pstate %d\n", -+ pstate); -+ return 0; -+} -+ -+static int apple_soc_cpufreq_set_target(struct cpufreq_policy *policy, -+ unsigned int index) -+{ -+ struct apple_cpu_priv *priv = policy->driver_data; -+ unsigned int pstate = policy->freq_table[index].driver_data; -+ u64 reg; -+ -+ if (readq_poll_timeout_atomic(priv->reg_base + APPLE_DVFS_CMD, reg, -+ !(reg & APPLE_DVFS_CMD_BUSY), 2, -+ APPLE_DVFS_TRANSITION_TIMEOUT)) { -+ return -EIO; -+ } -+ -+ reg &= ~(APPLE_DVFS_CMD_PS1 | APPLE_DVFS_CMD_PS2); -+ reg |= FIELD_PREP(APPLE_DVFS_CMD_PS1, pstate); -+ reg |= FIELD_PREP(APPLE_DVFS_CMD_PS2, pstate); -+ reg |= APPLE_DVFS_CMD_SET; -+ -+ writeq_relaxed(reg, priv->reg_base + APPLE_DVFS_CMD); -+ -+ return 0; -+} -+ -+static unsigned int apple_soc_cpufreq_fast_switch(struct cpufreq_policy *policy, -+ unsigned int target_freq) -+{ -+ if (apple_soc_cpufreq_set_target(policy, policy->cached_resolved_idx) < 0) -+ return 0; -+ -+ return policy->freq_table[policy->cached_resolved_idx].frequency; -+} -+ -+static int apple_soc_cpufreq_find_cluster(struct cpufreq_policy *policy, -+ void __iomem **reg_base) -+{ -+ struct of_phandle_args args; -+ struct device_node *cpu_np; -+ char name[32]; -+ int cpu, ret; -+ int index; -+ -+ cpu_np = of_cpu_device_node_get(policy->cpu); -+ if (!cpu_np) -+ return -EINVAL; -+ -+ ret = of_parse_phandle_with_args(cpu_np, "apple,freq-domain", -+ "#freq-domain-cells", 0, &args); -+ of_node_put(cpu_np); -+ if (ret) -+ return ret; -+ -+ index = args.args[0]; -+ -+ snprintf(name, sizeof(name), "cluster%d", index); -+ ret = of_property_match_string(args.np, "reg-names", name); -+ if (ret < 0) -+ return ret; -+ -+ *reg_base = of_iomap(args.np, ret); -+ if (IS_ERR(*reg_base)) -+ return PTR_ERR(*reg_base); -+ -+ for_each_possible_cpu(cpu) { -+ cpu_np = of_cpu_device_node_get(cpu); -+ if (!cpu_np) -+ continue; -+ -+ ret = of_parse_phandle_with_args(cpu_np, "apple,freq-domain", -+ "#freq-domain-cells", 0, &args); -+ of_node_put(cpu_np); -+ if (ret < 0) -+ continue; -+ -+ if (index == args.args[0]) -+ cpumask_set_cpu(cpu, policy->cpus); -+ } -+ -+ return 0; -+} -+ -+static struct freq_attr *apple_soc_cpufreq_hw_attr[] = { -+ &cpufreq_freq_attr_scaling_available_freqs, -+ NULL, -+ NULL, -+}; -+ -+static int apple_soc_cpufreq_init(struct cpufreq_policy *policy) -+{ -+ int ret, i; -+ unsigned int transition_latency; -+ void __iomem *reg_base; -+ struct device *cpu_dev; -+ struct apple_cpu_priv *priv; -+ struct cpufreq_frequency_table *freq_table; -+ -+ cpu_dev = get_cpu_device(policy->cpu); -+ if (!cpu_dev) { -+ pr_err("failed to get cpu%d device\n", policy->cpu); -+ return -ENODEV; -+ } -+ -+ ret = dev_pm_opp_of_add_table(cpu_dev); -+ if (ret < 0) { -+ dev_err(cpu_dev, "%s: failed to add OPP table: %d\n", __func__, ret); -+ return ret; -+ } -+ -+ ret = apple_soc_cpufreq_find_cluster(policy, ®_base); -+ if (ret) { -+ dev_err(cpu_dev, "%s: failed to get cluster info: %d\n", __func__, ret); -+ return ret; -+ } -+ -+ ret = dev_pm_opp_set_sharing_cpus(cpu_dev, policy->cpus); -+ if (ret) { -+ dev_err(cpu_dev, "%s: failed to mark OPPs as shared: %d\n", __func__, ret); -+ goto out_iounmap; -+ } -+ -+ ret = dev_pm_opp_get_opp_count(cpu_dev); -+ if (ret <= 0) { -+ dev_dbg(cpu_dev, "OPP table is not ready, deferring probe\n"); -+ ret = -EPROBE_DEFER; -+ goto out_free_opp; -+ } -+ -+ priv = kzalloc(sizeof(*priv), GFP_KERNEL); -+ if (!priv) { -+ ret = -ENOMEM; -+ goto out_free_opp; -+ } -+ -+ ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table); -+ if (ret) { -+ dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret); -+ goto out_free_priv; -+ } -+ -+ /* Get OPP levels (p-state indexes) and stash them in driver_data */ -+ for (i = 0; freq_table[i].frequency != CPUFREQ_TABLE_END; i++) { -+ unsigned long rate = freq_table[i].frequency * 1000; -+ struct dev_pm_opp *opp = dev_pm_opp_find_freq_floor(cpu_dev, &rate); -+ -+ if (IS_ERR(opp)) { -+ ret = PTR_ERR(opp); -+ goto out_free_cpufreq_table; -+ } -+ freq_table[i].driver_data = dev_pm_opp_get_level(opp); -+ dev_pm_opp_put(opp); -+ } -+ -+ priv->cpu_dev = cpu_dev; -+ priv->reg_base = reg_base; -+ policy->driver_data = priv; -+ policy->freq_table = freq_table; -+ -+ transition_latency = dev_pm_opp_get_max_transition_latency(cpu_dev); -+ if (!transition_latency) -+ transition_latency = CPUFREQ_ETERNAL; -+ -+ policy->cpuinfo.transition_latency = transition_latency; -+ policy->dvfs_possible_from_any_cpu = true; -+ policy->fast_switch_possible = true; -+ -+ if (policy_has_boost_freq(policy)) { -+ ret = cpufreq_enable_boost_support(); -+ if (ret) { -+ dev_warn(cpu_dev, "failed to enable boost: %d\n", ret); -+ } else { -+ apple_soc_cpufreq_hw_attr[1] = &cpufreq_freq_attr_scaling_boost_freqs; -+ apple_soc_cpufreq_driver.boost_enabled = true; -+ } -+ } -+ -+ return 0; -+ -+out_free_cpufreq_table: -+ dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table); -+out_free_priv: -+ kfree(priv); -+out_free_opp: -+ dev_pm_opp_remove_all_dynamic(cpu_dev); -+out_iounmap: -+ iounmap(reg_base); -+ return ret; -+} -+ -+static int apple_soc_cpufreq_exit(struct cpufreq_policy *policy) -+{ -+ struct apple_cpu_priv *priv = policy->driver_data; -+ -+ dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); -+ dev_pm_opp_remove_all_dynamic(priv->cpu_dev); -+ iounmap(priv->reg_base); -+ kfree(priv); -+ -+ return 0; -+} -+ -+static struct cpufreq_driver apple_soc_cpufreq_driver = { -+ .name = "apple-cpufreq", -+ .flags = CPUFREQ_HAVE_GOVERNOR_PER_POLICY | -+ CPUFREQ_NEED_INITIAL_FREQ_CHECK | CPUFREQ_IS_COOLING_DEV, -+ .verify = cpufreq_generic_frequency_table_verify, -+ .attr = cpufreq_generic_attr, -+ .get = apple_soc_cpufreq_get_rate, -+ .init = apple_soc_cpufreq_init, -+ .exit = apple_soc_cpufreq_exit, -+ .target_index = apple_soc_cpufreq_set_target, -+ .fast_switch = apple_soc_cpufreq_fast_switch, -+ .register_em = cpufreq_register_em_with_opp, -+ .attr = apple_soc_cpufreq_hw_attr, -+}; -+ -+static int apple_soc_cpufreq_probe(struct platform_device *pdev) -+{ -+ int ret; -+ -+ ret = cpufreq_register_driver(&apple_soc_cpufreq_driver); -+ if (ret) -+ return dev_err_probe(&pdev->dev, ret, "registering cpufreq failed\n"); -+ -+ return 0; -+} -+ -+static int apple_soc_cpufreq_remove(struct platform_device *pdev) -+{ -+ cpufreq_unregister_driver(&apple_soc_cpufreq_driver); -+ -+ return 0; -+} -+ -+static const struct of_device_id apple_soc_cpufreq_of_match[] = { -+ { .compatible = "apple,soc-cpufreq" }, -+ {} -+}; -+MODULE_DEVICE_TABLE(of, apple_soc_cpufreq_of_match); -+ -+static struct platform_driver apple_soc_cpufreq_plat_driver = { -+ .probe = apple_soc_cpufreq_probe, -+ .remove = apple_soc_cpufreq_remove, -+ .driver = { -+ .name = "apple-soc-cpufreq", -+ .of_match_table = apple_soc_cpufreq_of_match, -+ }, -+}; -+module_platform_driver(apple_soc_cpufreq_plat_driver); -+ -+MODULE_AUTHOR("Hector Martin "); -+MODULE_DESCRIPTION("Apple SoC CPU cluster DVFS driver"); -+MODULE_LICENSE("GPL"); -diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c -index 2c96de3f2d83..12b203d67779 100644 ---- a/drivers/cpufreq/cpufreq-dt-platdev.c -+++ b/drivers/cpufreq/cpufreq-dt-platdev.c -@@ -103,6 +103,8 @@ static const struct of_device_id allowlist[] __initconst = { - static const struct of_device_id blocklist[] __initconst = { - { .compatible = "allwinner,sun50i-h6", }, - -+ { .compatible = "apple,arm-platform", }, -+ - { .compatible = "arm,vexpress", }, - - { .compatible = "calxeda,highbank", }, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0159-arm64-dts-apple-Add-CPU-topology-cpufreq-nodes-for-t.patch b/target/linux/silicon/patches-5.19/0159-arm64-dts-apple-Add-CPU-topology-cpufreq-nodes-for-t.patch deleted file mode 100644 index 50415c4fd..000000000 --- a/target/linux/silicon/patches-5.19/0159-arm64-dts-apple-Add-CPU-topology-cpufreq-nodes-for-t.patch +++ /dev/null @@ -1,313 +0,0 @@ -From 88d527252dd22783add30df234725530fc5c4934 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Tue, 3 May 2022 00:08:56 +0900 -Subject: [PATCH 159/171] arm64: dts: apple: Add CPU topology & cpufreq nodes - for t8103 - -Add the missing CPU topology/capacity information and the cpufreq nodes, -so we can have CPU frequency scaling and the scheduler has the -information it needs to make the correct decisions. - -Boost states are commented out, as they are not yet available (that -requires CPU deep sleep support, to be eventually done via PSCI). -The driver supports them fine; the hardware will just refuse to ever -go into them at this time, so don't expose them to users until that's -done. - -Signed-off-by: Hector Martin ---- - arch/arm64/boot/dts/apple/t8103.dtsi | 203 +++++++++++++++++++++++++-- - 1 file changed, 193 insertions(+), 10 deletions(-) - -diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/apple/t8103.dtsi -index 9f8f4145db88..3df126a5a7dd 100644 ---- a/arch/arm64/boot/dts/apple/t8103.dtsi -+++ b/arch/arm64/boot/dts/apple/t8103.dtsi -@@ -22,71 +22,245 @@ cpus { - #address-cells = <2>; - #size-cells = <0>; - -- cpu0: cpu@0 { -+ cpu-map { -+ cluster0 { -+ core0 { -+ cpu = <&cpu_e0>; -+ }; -+ core1 { -+ cpu = <&cpu_e1>; -+ }; -+ core2 { -+ cpu = <&cpu_e2>; -+ }; -+ core3 { -+ cpu = <&cpu_e3>; -+ }; -+ }; -+ -+ cluster1 { -+ core0 { -+ cpu = <&cpu_p0>; -+ }; -+ core1 { -+ cpu = <&cpu_p1>; -+ }; -+ core2 { -+ cpu = <&cpu_p2>; -+ }; -+ core3 { -+ cpu = <&cpu_p3>; -+ }; -+ }; -+ }; -+ -+ cpu_e0: cpu@0 { - compatible = "apple,icestorm"; - device_type = "cpu"; - reg = <0x0 0x0>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 0>; - }; - -- cpu1: cpu@1 { -+ cpu_e1: cpu@1 { - compatible = "apple,icestorm"; - device_type = "cpu"; - reg = <0x0 0x1>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 0>; - }; - -- cpu2: cpu@2 { -+ cpu_e2: cpu@2 { - compatible = "apple,icestorm"; - device_type = "cpu"; - reg = <0x0 0x2>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 0>; - }; - -- cpu3: cpu@3 { -+ cpu_e3: cpu@3 { - compatible = "apple,icestorm"; - device_type = "cpu"; - reg = <0x0 0x3>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&ecluster_opp>; -+ capacity-dmips-mhz = <714>; -+ apple,freq-domain = <&cpufreq_hw 0>; - }; - -- cpu4: cpu@10100 { -+ cpu_p0: cpu@10100 { - compatible = "apple,firestorm"; - device_type = "cpu"; - reg = <0x0 0x10100>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; - }; - -- cpu5: cpu@10101 { -+ cpu_p1: cpu@10101 { - compatible = "apple,firestorm"; - device_type = "cpu"; - reg = <0x0 0x10101>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; - }; - -- cpu6: cpu@10102 { -+ cpu_p2: cpu@10102 { - compatible = "apple,firestorm"; - device_type = "cpu"; - reg = <0x0 0x10102>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; - }; - -- cpu7: cpu@10103 { -+ cpu_p3: cpu@10103 { - compatible = "apple,firestorm"; - device_type = "cpu"; - reg = <0x0 0x10103>; - enable-method = "spin-table"; - cpu-release-addr = <0 0>; /* To be filled by loader */ -+ operating-points-v2 = <&pcluster_opp>; -+ capacity-dmips-mhz = <1024>; -+ apple,freq-domain = <&cpufreq_hw 1>; -+ }; -+ }; -+ -+ ecluster_opp: opp-table-0 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp01 { -+ opp-hz = /bits/ 64 <600000000>; -+ opp-level = <1>; -+ clock-latency-ns = <7500>; -+ }; -+ opp02 { -+ opp-hz = /bits/ 64 <972000000>; -+ opp-level = <2>; -+ clock-latency-ns = <22000>; -+ }; -+ opp03 { -+ opp-hz = /bits/ 64 <1332000000>; -+ opp-level = <3>; -+ clock-latency-ns = <27000>; -+ }; -+ opp04 { -+ opp-hz = /bits/ 64 <1704000000>; -+ opp-level = <4>; -+ clock-latency-ns = <33000>; -+ }; -+ opp05 { -+ opp-hz = /bits/ 64 <2064000000>; -+ opp-level = <5>; -+ clock-latency-ns = <50000>; - }; - }; - -+ pcluster_opp: opp-table-1 { -+ compatible = "operating-points-v2"; -+ opp-shared; -+ -+ opp01 { -+ opp-hz = /bits/ 64 <600000000>; -+ opp-level = <1>; -+ clock-latency-ns = <8000>; -+ }; -+ opp02 { -+ opp-hz = /bits/ 64 <828000000>; -+ opp-level = <2>; -+ clock-latency-ns = <19000>; -+ }; -+ opp03 { -+ opp-hz = /bits/ 64 <1056000000>; -+ opp-level = <3>; -+ clock-latency-ns = <21000>; -+ }; -+ opp04 { -+ opp-hz = /bits/ 64 <1284000000>; -+ opp-level = <4>; -+ clock-latency-ns = <23000>; -+ }; -+ opp05 { -+ opp-hz = /bits/ 64 <1500000000>; -+ opp-level = <5>; -+ clock-latency-ns = <24000>; -+ }; -+ opp06 { -+ opp-hz = /bits/ 64 <1728000000>; -+ opp-level = <6>; -+ clock-latency-ns = <29000>; -+ }; -+ opp07 { -+ opp-hz = /bits/ 64 <1956000000>; -+ opp-level = <7>; -+ clock-latency-ns = <31000>; -+ }; -+ opp08 { -+ opp-hz = /bits/ 64 <2184000000>; -+ opp-level = <8>; -+ clock-latency-ns = <34000>; -+ }; -+ opp09 { -+ opp-hz = /bits/ 64 <2388000000>; -+ opp-level = <9>; -+ clock-latency-ns = <36000>; -+ }; -+ opp10 { -+ opp-hz = /bits/ 64 <2592000000>; -+ opp-level = <10>; -+ clock-latency-ns = <51000>; -+ }; -+ opp11 { -+ opp-hz = /bits/ 64 <2772000000>; -+ opp-level = <11>; -+ clock-latency-ns = <54000>; -+ }; -+ opp12 { -+ opp-hz = /bits/ 64 <2988000000>; -+ opp-level = <12>; -+ clock-latency-ns = <55000>; -+ }; -+#if 0 -+ /* Not available until CPU deep sleep is implemented */ -+ opp13 { -+ opp-hz = /bits/ 64 <3096000000>; -+ opp-level = <13>; -+ clock-latency-ns = <55000>; -+ turbo-mode; -+ }; -+ opp14 { -+ opp-hz = /bits/ 64 <3144000000>; -+ opp-level = <14>; -+ clock-latency-ns = <56000>; -+ turbo-mode; -+ }; -+ opp15 { -+ opp-hz = /bits/ 64 <3204000000>; -+ opp-level = <15>; -+ clock-latency-ns = <56000>; -+ turbo-mode; -+ }; -+#endif -+ }; -+ - timer { - compatible = "arm,armv8-timer"; - interrupt-parent = <&aic>; -@@ -124,6 +298,15 @@ soc { - ranges; - nonposted-mmio; - -+ cpufreq_hw: cpufreq@210e20000 { -+ compatible = "apple,t8103-soc-cpufreq", "apple,soc-cpufreq"; -+ reg = <0x2 0x10e20000 0 0x1000>, -+ <0x2 0x11e20000 0 0x1000>; -+ reg-names = "cluster0", "cluster1"; -+ -+ #freq-domain-cells = <1>; -+ }; -+ - i2c0: i2c@235010000 { - compatible = "apple,t8103-i2c", "apple,i2c"; - reg = <0x2 0x35010000 0x0 0x4000>; -@@ -229,12 +412,12 @@ aic: interrupt-controller@23b100000 { - affinities { - e-core-pmu-affinity { - apple,fiq-index = ; -- cpus = <&cpu0 &cpu1 &cpu2 &cpu3>; -+ cpus = <&cpu_e0 &cpu_e1 &cpu_e2 &cpu_e3>; - }; - - p-core-pmu-affinity { - apple,fiq-index = ; -- cpus = <&cpu4 &cpu5 &cpu6 &cpu7>; -+ cpus = <&cpu_p0 &cpu_p1 &cpu_p2 &cpu_p3>; - }; - }; - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0160-cpufreq-apple-soc-Add-T8112-support.patch b/target/linux/silicon/patches-5.19/0160-cpufreq-apple-soc-Add-T8112-support.patch deleted file mode 100644 index dbab8bc58..000000000 --- a/target/linux/silicon/patches-5.19/0160-cpufreq-apple-soc-Add-T8112-support.patch +++ /dev/null @@ -1,180 +0,0 @@ -From 0aea6b8ab572e33f5149915c7ae8259be48042e8 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 27 Jun 2022 21:51:01 +0900 -Subject: [PATCH 160/171] cpufreq: apple-soc: Add T8112 support - -Apple ran out of bits for the pstates in one of the registers, so we -unfortunately need SoC-specific tweaks now. - -Signed-off-by: Hector Martin ---- - drivers/cpufreq/apple-soc-cpufreq.c | 91 ++++++++++++++++++++++++----- - 1 file changed, 77 insertions(+), 14 deletions(-) - -diff --git a/drivers/cpufreq/apple-soc-cpufreq.c b/drivers/cpufreq/apple-soc-cpufreq.c -index 191eaae71744..a92f7e7c57b5 100644 ---- a/drivers/cpufreq/apple-soc-cpufreq.c -+++ b/drivers/cpufreq/apple-soc-cpufreq.c -@@ -23,19 +23,28 @@ - #include - #include - -+#define APPLE_DVFS_PSTATE_BITS_T8103 4 -+#define APPLE_DVFS_PSTATE_BITS_T8112 5 -+ - #define APPLE_DVFS_CMD 0x20 - #define APPLE_DVFS_CMD_BUSY BIT(31) - #define APPLE_DVFS_CMD_SET BIT(25) --#define APPLE_DVFS_CMD_PS2 GENMASK(15, 12) --#define APPLE_DVFS_CMD_PS1 GENMASK(3, 0) -+#define APPLE_DVFS_CMD_PS2 GENMASK(16, 12) -+#define APPLE_DVFS_CMD_PS1 GENMASK(4, 0) - - /* Same timebase as CPU counter (24MHz) */ - #define APPLE_DVFS_LAST_CHG_TIME 0x38 - --#define APPLE_DVFS_STATUS 0x50 --#define APPLE_DVFS_STATUS_CUR_PS GENMASK(7, 4) --#define APPLE_DVFS_STATUS_TGT_PS GENMASK(3, 0) -- -+/* -+ * Apple ran out of bits and had to shift this in T8112... -+ */ -+#define APPLE_DVFS_STATUS 0x50 -+#define APPLE_DVFS_STATUS_CUR_PS_T8103 GENMASK(7, 4) -+#define APPLE_DVFS_STATUS_CUR_PS_SHIFT_T8103 4 -+#define APPLE_DVFS_STATUS_TGT_PS_T8103 GENMASK(3, 0) -+#define APPLE_DVFS_STATUS_CUR_PS_T8112 GENMASK(9, 5) -+#define APPLE_DVFS_STATUS_CUR_PS_SHIFT_T8112 5 -+#define APPLE_DVFS_STATUS_TGT_PS_T8112 GENMASK(4, 0) - /* - * Div is +1, base clock is 12MHz on existing SoCs. - * For documentation purposes. We use the OPP table to -@@ -46,14 +55,16 @@ - #define APPLE_DVFS_PLL_FACTOR_MULT GENMASK(31, 16) - #define APPLE_DVFS_PLL_FACTOR_DIV GENMASK(15, 0) - --struct apple_cpu_priv { -- struct device *cpu_dev; -- void __iomem *reg_base; -+struct apple_soc_cpufreq_info { -+ u64 max_pstate; -+ u64 cur_pstate_mask; -+ u64 cur_pstate_shift; - }; - --struct apple_soc_cpufreq_priv { -- struct device *dev; -+struct apple_cpu_priv { -+ struct device *cpu_dev; - void __iomem *reg_base; -+ const struct apple_soc_cpufreq_info *info; - }; - - #define APPLE_DVFS_TRANSITION_TIMEOUT 100 -@@ -64,10 +75,21 @@ static unsigned int apple_soc_cpufreq_get_rate(unsigned int cpu) - { - struct cpufreq_policy *policy = cpufreq_cpu_get_raw(cpu); - struct apple_cpu_priv *priv = policy->driver_data; -- u64 reg = readq_relaxed(priv->reg_base + APPLE_DVFS_STATUS); -- unsigned int pstate = FIELD_GET(APPLE_DVFS_STATUS_CUR_PS, reg); -+ unsigned int pstate; - unsigned int i; - -+ if (priv->info->cur_pstate_mask) { -+ u64 reg = readq_relaxed(priv->reg_base + APPLE_DVFS_STATUS); -+ pstate = (reg & priv->info->cur_pstate_mask) >> priv->info->cur_pstate_shift; -+ } else { -+ /* -+ * For the fallback case we might not know the layout of DVFS_STATUS, -+ * so just use the command register value (which ignores boost limitations). -+ */ -+ u64 reg = readq_relaxed(priv->reg_base + APPLE_DVFS_CMD); -+ pstate = FIELD_GET(APPLE_DVFS_CMD_PS1, reg); -+ } -+ - for (i = 0; policy->freq_table[i].frequency != CPUFREQ_TABLE_END; i++) - if (policy->freq_table[i].driver_data == pstate) - return policy->freq_table[i].frequency; -@@ -84,6 +106,10 @@ static int apple_soc_cpufreq_set_target(struct cpufreq_policy *policy, - unsigned int pstate = policy->freq_table[index].driver_data; - u64 reg; - -+ /* Fallback for newer SoCs */ -+ if (index > priv->info->max_pstate) -+ index = priv->info->max_pstate; -+ - if (readq_poll_timeout_atomic(priv->reg_base + APPLE_DVFS_CMD, reg, - !(reg & APPLE_DVFS_CMD_BUSY), 2, - APPLE_DVFS_TRANSITION_TIMEOUT)) { -@@ -171,6 +197,7 @@ static int apple_soc_cpufreq_init(struct cpufreq_policy *policy) - struct device *cpu_dev; - struct apple_cpu_priv *priv; - struct cpufreq_frequency_table *freq_table; -+ struct platform_device *pdev = cpufreq_get_driver_data(); - - cpu_dev = get_cpu_device(policy->cpu); - if (!cpu_dev) { -@@ -209,6 +236,12 @@ static int apple_soc_cpufreq_init(struct cpufreq_policy *policy) - goto out_free_opp; - } - -+ priv->info = of_device_get_match_data(&pdev->dev); -+ if (!priv->info) { -+ ret = -ENODEV; -+ goto out_free_opp; -+ } -+ - ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &freq_table); - if (ret) { - dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret); -@@ -295,6 +328,8 @@ static int apple_soc_cpufreq_probe(struct platform_device *pdev) - { - int ret; - -+ apple_soc_cpufreq_driver.driver_data = pdev; -+ - ret = cpufreq_register_driver(&apple_soc_cpufreq_driver); - if (ret) - return dev_err_probe(&pdev->dev, ret, "registering cpufreq failed\n"); -@@ -309,8 +344,36 @@ static int apple_soc_cpufreq_remove(struct platform_device *pdev) - return 0; - } - -+const struct apple_soc_cpufreq_info soc_t8103_info = { -+ .max_pstate = 15, -+ .cur_pstate_mask = APPLE_DVFS_STATUS_CUR_PS_T8103, -+ .cur_pstate_shift = APPLE_DVFS_STATUS_CUR_PS_SHIFT_T8103, -+}; -+ -+const struct apple_soc_cpufreq_info soc_t8112_info = { -+ .max_pstate = 31, -+ .cur_pstate_mask = APPLE_DVFS_STATUS_CUR_PS_T8112, -+ .cur_pstate_shift = APPLE_DVFS_STATUS_CUR_PS_SHIFT_T8112, -+}; -+ -+const struct apple_soc_cpufreq_info soc_default_info = { -+ .max_pstate = 15, -+ .cur_pstate_mask = 0, /* fallback */ -+}; -+ - static const struct of_device_id apple_soc_cpufreq_of_match[] = { -- { .compatible = "apple,soc-cpufreq" }, -+ { -+ .compatible = "apple,t8103-soc-cpufreq", -+ .data = &soc_t8103_info, -+ }, -+ { -+ .compatible = "apple,t8112-cpufreq", -+ .data = &soc_t8112_info, -+ }, -+ { -+ .compatible = "apple,soc-cpufreq", -+ .data = &soc_default_info, -+ }, - {} - }; - MODULE_DEVICE_TABLE(of, apple_soc_cpufreq_of_match); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0161-dt-bindings-pci-apple-pcie-Add-subnode-binding-pwren.patch b/target/linux/silicon/patches-5.19/0161-dt-bindings-pci-apple-pcie-Add-subnode-binding-pwren.patch deleted file mode 100644 index fbcf5547c..000000000 --- a/target/linux/silicon/patches-5.19/0161-dt-bindings-pci-apple-pcie-Add-subnode-binding-pwren.patch +++ /dev/null @@ -1,111 +0,0 @@ -From abe02ae2854e6679bf9b46ade3b6c6ddc379050f Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 2 May 2022 21:17:41 +0900 -Subject: [PATCH 161/171] dt-bindings: pci: apple,pcie: Add subnode binding, - pwren-gpios property - -We weren't properly validating root port subnodes, so let's do that. Then, -also add the new `pwren-gpios` property there to handle device power-up. - -Signed-off-by: Hector Martin ---- - .../devicetree/bindings/pci/apple,pcie.yaml | 51 +++++++++++++++++-- - 1 file changed, 48 insertions(+), 3 deletions(-) - -diff --git a/Documentation/devicetree/bindings/pci/apple,pcie.yaml b/Documentation/devicetree/bindings/pci/apple,pcie.yaml -index aa38680aaaca..156f1777fc96 100644 ---- a/Documentation/devicetree/bindings/pci/apple,pcie.yaml -+++ b/Documentation/devicetree/bindings/pci/apple,pcie.yaml -@@ -71,6 +71,27 @@ properties: - power-domains: - maxItems: 1 - -+patternProperties: -+ "^pci@": -+ $ref: /schemas/pci/pci-bus.yaml# -+ type: object -+ description: A single PCI root port -+ -+ properties: -+ reg: -+ maxItems: 1 -+ -+ pwren-gpios: -+ description: Optional GPIO to power on the device -+ maxItems: 1 -+ -+ required: -+ - reset-gpios -+ - interrupt-controller -+ - "#interrupt-cells" -+ - interrupt-map-mask -+ - interrupt-map -+ - required: - - compatible - - reg -@@ -141,7 +162,7 @@ examples: - pinctrl-0 = <&pcie_pins>; - pinctrl-names = "default"; - -- pci@0,0 { -+ port00: pci@0,0 { - device_type = "pci"; - reg = <0x0 0x0 0x0 0x0 0x0>; - reset-gpios = <&pinctrl_ap 152 0>; -@@ -149,9 +170,17 @@ examples: - #address-cells = <3>; - #size-cells = <2>; - ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port00 0 0 0 0>, -+ <0 0 0 2 &port00 0 0 0 1>, -+ <0 0 0 3 &port00 0 0 0 2>, -+ <0 0 0 4 &port00 0 0 0 3>; - }; - -- pci@1,0 { -+ port01: pci@1,0 { - device_type = "pci"; - reg = <0x800 0x0 0x0 0x0 0x0>; - reset-gpios = <&pinctrl_ap 153 0>; -@@ -159,9 +188,17 @@ examples: - #address-cells = <3>; - #size-cells = <2>; - ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port01 0 0 0 0>, -+ <0 0 0 2 &port01 0 0 0 1>, -+ <0 0 0 3 &port01 0 0 0 2>, -+ <0 0 0 4 &port01 0 0 0 3>; - }; - -- pci@2,0 { -+ port02: pci@2,0 { - device_type = "pci"; - reg = <0x1000 0x0 0x0 0x0 0x0>; - reset-gpios = <&pinctrl_ap 33 0>; -@@ -169,6 +206,14 @@ examples: - #address-cells = <3>; - #size-cells = <2>; - ranges; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ interrupt-map-mask = <0 0 0 7>; -+ interrupt-map = <0 0 0 1 &port02 0 0 0 0>, -+ <0 0 0 2 &port02 0 0 0 1>, -+ <0 0 0 3 &port02 0 0 0 2>, -+ <0 0 0 4 &port02 0 0 0 3>; - }; - }; - }; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0162-PCI-apple-Use-gpiod_set_value_cansleep-in-probe-flow.patch b/target/linux/silicon/patches-5.19/0162-PCI-apple-Use-gpiod_set_value_cansleep-in-probe-flow.patch deleted file mode 100644 index e2ffd13d5..000000000 --- a/target/linux/silicon/patches-5.19/0162-PCI-apple-Use-gpiod_set_value_cansleep-in-probe-flow.patch +++ /dev/null @@ -1,41 +0,0 @@ -From b86825a0013059fc20d720e140abbc8dbf1ec8f1 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Mon, 2 May 2022 21:22:46 +0900 -Subject: [PATCH 162/171] PCI: apple: Use gpiod_set_value_cansleep in probe - flow - -We're allowed to sleep here, so tell the GPIO core by using -gpiod_set_value_cansleep instead of gpiod_set_value. - -Fixes: 1e33888fbe44 ("PCI: apple: Add initial hardware bring-up") -Acked-by: Marc Zyngier -Signed-off-by: Hector Martin ---- - drivers/pci/controller/pcie-apple.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c -index a2c3c207a04b..e6c34a0875b3 100644 ---- a/drivers/pci/controller/pcie-apple.c -+++ b/drivers/pci/controller/pcie-apple.c -@@ -541,7 +541,7 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, - rmw_set(PORT_APPCLK_EN, port->base + PORT_APPCLK); - - /* Assert PERST# before setting up the clock */ -- gpiod_set_value(reset, 1); -+ gpiod_set_value_cansleep(reset, 1); - - ret = apple_pcie_setup_refclk(pcie, port); - if (ret < 0) -@@ -552,7 +552,7 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, - - /* Deassert PERST# */ - rmw_set(PORT_PERST_OFF, port->base + PORT_PERST); -- gpiod_set_value(reset, 0); -+ gpiod_set_value_cansleep(reset, 0); - - /* Wait for 100ms after PERST# deassertion (PCIe r5.0, 6.6.1) */ - msleep(100); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0163-PCI-apple-Use-devm-managed-GPIO-getter.patch b/target/linux/silicon/patches-5.19/0163-PCI-apple-Use-devm-managed-GPIO-getter.patch deleted file mode 100644 index 96f15b8f7..000000000 --- a/target/linux/silicon/patches-5.19/0163-PCI-apple-Use-devm-managed-GPIO-getter.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 4d1d3b02286889607ae65fbbe9b4ac1b9a71e3b3 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 6 Feb 2022 21:13:17 +0900 -Subject: [PATCH 163/171] PCI: apple: Use devm managed GPIO getter - -Without this, if the driver fails to probe it will leak GPIO references. -Fix this by using the devm managed getter. - -Fixes: 1e33888fbe44 ("PCI: apple: Add initial hardware bring-up") -Cc: stable@vger.kernel.org -Acked-by: Marc Zyngier -Signed-off-by: Hector Martin ---- - drivers/pci/controller/pcie-apple.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c -index e6c34a0875b3..e0c06c0ee731 100644 ---- a/drivers/pci/controller/pcie-apple.c -+++ b/drivers/pci/controller/pcie-apple.c -@@ -516,8 +516,8 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, - u32 stat, idx; - int ret, i; - -- reset = gpiod_get_from_of_node(np, "reset-gpios", 0, -- GPIOD_OUT_LOW, "PERST#"); -+ reset = devm_gpiod_get_from_of_node(pcie->dev, np, "reset-gpios", 0, -+ GPIOD_OUT_LOW, "PERST#"); - if (IS_ERR(reset)) - return PTR_ERR(reset); - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0164-PCI-apple-Probe-all-GPIOs-for-availability-first.patch b/target/linux/silicon/patches-5.19/0164-PCI-apple-Probe-all-GPIOs-for-availability-first.patch deleted file mode 100644 index de3b07c86..000000000 --- a/target/linux/silicon/patches-5.19/0164-PCI-apple-Probe-all-GPIOs-for-availability-first.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 7a73f4e58f44b76abd4eeec2b84b09da515403c5 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 6 Feb 2022 21:15:39 +0900 -Subject: [PATCH 164/171] PCI: apple: Probe all GPIOs for availability first - -If we're probing the PCI controller and some GPIOs are not available and -cause a probe defer, we can end up leaving some ports initialized and -not others and making a mess. - -Check for PERST# GPIOs for all ports first, and just return --EPROBE_DEFER if any are not ready yet, without bringing anything up. - -Fixes: 1e33888fbe44 ("PCI: apple: Add initial hardware bring-up") -Cc: stable@vger.kernel.org -Acked-by: Marc Zyngier -Signed-off-by: Hector Martin ---- - drivers/pci/controller/pcie-apple.c | 24 ++++++++++++++++++++++++ - 1 file changed, 24 insertions(+) - -diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c -index e0c06c0ee731..e3aa2d461739 100644 ---- a/drivers/pci/controller/pcie-apple.c -+++ b/drivers/pci/controller/pcie-apple.c -@@ -507,6 +507,20 @@ static u32 apple_pcie_rid2sid_write(struct apple_pcie_port *port, - return readl_relaxed(port->base + PORT_RID2SID(idx)); - } - -+static int apple_pcie_probe_port(struct device_node *np) -+{ -+ struct gpio_desc *gd; -+ -+ gd = gpiod_get_from_of_node(np, "reset-gpios", 0, -+ GPIOD_OUT_LOW, "PERST#"); -+ if (IS_ERR(gd)) { -+ return PTR_ERR(gd); -+ } -+ -+ gpiod_put(gd); -+ return 0; -+} -+ - static int apple_pcie_setup_port(struct apple_pcie *pcie, - struct device_node *np) - { -@@ -797,8 +811,18 @@ static int apple_pcie_init(struct pci_config_window *cfg) - - static int apple_pcie_probe(struct platform_device *pdev) - { -+ struct device *dev = &pdev->dev; -+ struct device_node *of_port; - int ret; - -+ /* Check for probe dependencies for all ports first */ -+ for_each_child_of_node(dev->of_node, of_port) { -+ ret = apple_pcie_probe_port(of_port); -+ of_node_put(of_port); -+ if (ret) -+ return dev_err_probe(dev, ret, "Port %pOF probe fail\n", of_port); -+ } -+ - ret = bus_register_notifier(&pci_bus_type, &apple_pcie_nb); - if (ret) - return ret; --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0165-PCI-apple-Add-support-for-optional-PWREN-GPIO.patch b/target/linux/silicon/patches-5.19/0165-PCI-apple-Add-support-for-optional-PWREN-GPIO.patch deleted file mode 100644 index 7fa4d26d9..000000000 --- a/target/linux/silicon/patches-5.19/0165-PCI-apple-Add-support-for-optional-PWREN-GPIO.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 6cb714273e04b6d82734c6c8a70907f3871e409b Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Sun, 6 Feb 2022 21:18:18 +0900 -Subject: [PATCH 165/171] PCI: apple: Add support for optional PWREN GPIO - -WiFi and SD card devices on M1 Macs have a separate power enable GPIO. -Add support for this to the PCIe controller. This is modeled after how -pcie-fu740 does it. - -Acked-by: Marc Zyngier -Signed-off-by: Hector Martin ---- - drivers/pci/controller/pcie-apple.c | 34 ++++++++++++++++++++++++++--- - 1 file changed, 31 insertions(+), 3 deletions(-) - -diff --git a/drivers/pci/controller/pcie-apple.c b/drivers/pci/controller/pcie-apple.c -index e3aa2d461739..f26a617ea5c5 100644 ---- a/drivers/pci/controller/pcie-apple.c -+++ b/drivers/pci/controller/pcie-apple.c -@@ -518,6 +518,16 @@ static int apple_pcie_probe_port(struct device_node *np) - } - - gpiod_put(gd); -+ -+ gd = gpiod_get_from_of_node(np, "pwren-gpios", 0, -+ GPIOD_OUT_LOW, "PWREN"); -+ if (IS_ERR(gd)) { -+ if (PTR_ERR(gd) != -ENOENT) -+ return PTR_ERR(gd); -+ } else { -+ gpiod_put(gd); -+ } -+ - return 0; - } - -@@ -526,7 +536,7 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, - { - struct platform_device *platform = to_platform_device(pcie->dev); - struct apple_pcie_port *port; -- struct gpio_desc *reset; -+ struct gpio_desc *reset, *pwren = NULL; - u32 stat, idx; - int ret, i; - -@@ -535,6 +545,15 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, - if (IS_ERR(reset)) - return PTR_ERR(reset); - -+ pwren = devm_gpiod_get_from_of_node(pcie->dev, np, "pwren-gpios", 0, -+ GPIOD_OUT_LOW, "PWREN"); -+ if (IS_ERR(pwren)) { -+ if (PTR_ERR(pwren) == -ENOENT) -+ pwren = NULL; -+ else -+ return PTR_ERR(pwren); -+ } -+ - port = devm_kzalloc(pcie->dev, sizeof(*port), GFP_KERNEL); - if (!port) - return -ENOMEM; -@@ -557,12 +576,21 @@ static int apple_pcie_setup_port(struct apple_pcie *pcie, - /* Assert PERST# before setting up the clock */ - gpiod_set_value_cansleep(reset, 1); - -+ /* Power on the device if required */ -+ gpiod_set_value_cansleep(pwren, 1); -+ - ret = apple_pcie_setup_refclk(pcie, port); - if (ret < 0) - return ret; - -- /* The minimal Tperst-clk value is 100us (PCIe CEM r5.0, 2.9.2) */ -- usleep_range(100, 200); -+ /* -+ * The minimal Tperst-clk value is 100us (PCIe CEM r5.0, 2.9.2) -+ * If powering up, the minimal Tpvperl is 100ms -+ */ -+ if (pwren) -+ msleep(100); -+ else -+ usleep_range(100, 200); - - /* Deassert PERST# */ - rmw_set(PORT_PERST_OFF, port->base + PORT_PERST); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0166-dt-bindings-net-Add-generic-Bluetooth-controller.patch b/target/linux/silicon/patches-5.19/0166-dt-bindings-net-Add-generic-Bluetooth-controller.patch deleted file mode 100644 index 90bb4cb2e..000000000 --- a/target/linux/silicon/patches-5.19/0166-dt-bindings-net-Add-generic-Bluetooth-controller.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 570cca032385f16aa24be9b226172d82bd153e25 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Mon, 1 Aug 2022 12:36:29 +0200 -Subject: [PATCH 166/171] dt-bindings: net: Add generic Bluetooth controller - -Bluetooth controllers share the common local-bd-address property. -Add a generic YAML schema to replace bluetooth.txt for those. - -Signed-off-by: Sven Peter ---- - .../bindings/net/bluetooth-controller.yaml | 30 +++++++++++++++++++ - .../devicetree/bindings/net/bluetooth.txt | 6 +--- - 2 files changed, 31 insertions(+), 5 deletions(-) - create mode 100644 Documentation/devicetree/bindings/net/bluetooth-controller.yaml - -diff --git a/Documentation/devicetree/bindings/net/bluetooth-controller.yaml b/Documentation/devicetree/bindings/net/bluetooth-controller.yaml -new file mode 100644 -index 000000000000..0ea8a20e30f9 ---- /dev/null -+++ b/Documentation/devicetree/bindings/net/bluetooth-controller.yaml -@@ -0,0 +1,30 @@ -+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/net/bluetooth-controller.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Bluetooth Controller Generic Binding -+ -+maintainers: -+ - Marcel Holtmann -+ - Johan Hedberg -+ - Luiz Augusto von Dentz -+ -+properties: -+ $nodename: -+ pattern: "^bluetooth(@.*)?$" -+ -+ local-bd-address: -+ $ref: /schemas/types.yaml#/definitions/uint8-array -+ minItems: 6 -+ maxItems: 6 -+ description: -+ Specifies the BD address that was uniquely assigned to the Bluetooth -+ device. Formatted with least significant byte first (little-endian), e.g. -+ in order to assign the address 00:11:22:33:44:55 this property must have -+ the value [55 44 33 22 11 00]. -+ -+additionalProperties: true -+ -+... -diff --git a/Documentation/devicetree/bindings/net/bluetooth.txt b/Documentation/devicetree/bindings/net/bluetooth.txt -index 94797df751b8..3cb5a7b8e5ad 100644 ---- a/Documentation/devicetree/bindings/net/bluetooth.txt -+++ b/Documentation/devicetree/bindings/net/bluetooth.txt -@@ -1,5 +1 @@ --The following properties are common to the Bluetooth controllers: -- --- local-bd-address: array of 6 bytes, specifies the BD address that was -- uniquely assigned to the Bluetooth device, formatted with least significant -- byte first (little-endian). -+This file has been moved to bluetooth-controller.yaml. --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0167-dt-bindings-net-Add-Broadcom-BCM4377-family-PCI-Blue.patch b/target/linux/silicon/patches-5.19/0167-dt-bindings-net-Add-Broadcom-BCM4377-family-PCI-Blue.patch deleted file mode 100644 index 360f2b5ef..000000000 --- a/target/linux/silicon/patches-5.19/0167-dt-bindings-net-Add-Broadcom-BCM4377-family-PCI-Blue.patch +++ /dev/null @@ -1,116 +0,0 @@ -From 595ee6d1d91d35bd9c461f6459458a8d91d70f3e Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Mon, 1 Aug 2022 12:36:30 +0200 -Subject: [PATCH 167/171] dt-bindings: net: Add Broadcom BCM4377 family PCI - Bluetooth - -These chips are combined Wi-Fi/Bluetooth radios which expose a -PCI subfunction for the Bluetooth part. -They are found in Apple machines such as the x86 models with the T2 -chip or the arm64 models with the M1 or M2 chips. - -Signed-off-by: Sven Peter ---- - .../bindings/net/brcm,bcm4377-bluetooth.yaml | 77 +++++++++++++++++++ - MAINTAINERS | 1 + - 2 files changed, 78 insertions(+) - create mode 100644 Documentation/devicetree/bindings/net/brcm,bcm4377-bluetooth.yaml - -diff --git a/Documentation/devicetree/bindings/net/brcm,bcm4377-bluetooth.yaml b/Documentation/devicetree/bindings/net/brcm,bcm4377-bluetooth.yaml -new file mode 100644 -index 000000000000..afe6ecebd939 ---- /dev/null -+++ b/Documentation/devicetree/bindings/net/brcm,bcm4377-bluetooth.yaml -@@ -0,0 +1,77 @@ -+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) -+%YAML 1.2 -+--- -+$id: http://devicetree.org/schemas/net/brcm,bcm4377-bluetooth.yaml# -+$schema: http://devicetree.org/meta-schemas/core.yaml# -+ -+title: Broadcom BCM4377 family PCI Bluetooth Chips -+ -+allOf: -+ - $ref: bluetooth-controller.yaml# -+ -+maintainers: -+ - Sven Peter -+ -+description: -+ This binding describes Broadcom BCM4377 family PCI-attached bluetooth chips -+ usually found in Apple machines. The Wi-Fi part of the chip is described in -+ bindings/net/wireless/brcm,bcm4329-fmac.yaml. -+ -+properties: -+ compatible: -+ enum: -+ - pci14e4,5fa0 # BCM4377 -+ - pci14e4,5f69 # BCM4378 -+ - pci14e4,5f71 # BCM4387 -+ -+ reg: -+ description: PCI device identifier. -+ -+ brcm,board-type: -+ $ref: /schemas/types.yaml#/definitions/string -+ description: Board type of the Bluetooth chip. This is used to decouple -+ the overall system board from the Bluetooth module and used to construct -+ firmware and calibration data filenames. -+ On Apple platforms, this should be the Apple module-instance codename -+ prefixed by "apple,", e.g. "apple,atlantisb". -+ -+ brcm,taurus-cal-blob: -+ $ref: /schemas/types.yaml#/definitions/uint8-array -+ description: A per-device calibration blob for the Bluetooth radio. This -+ should be filled in by the bootloader from platform configuration -+ data, if necessary, and will be uploaded to the device. -+ This blob is used if the chip stepping of the Bluetooth module does not -+ support beamforming. -+ -+ brcm,taurus-bf-cal-blob: -+ $ref: /schemas/types.yaml#/definitions/uint8-array -+ description: A per-device calibration blob for the Bluetooth radio. This -+ should be filled in by the bootloader from platform configuration -+ data, if necessary, and will be uploaded to the device. -+ This blob is used if the chip stepping of the Bluetooth module supports -+ beamforming. -+ -+ local-bd-address: true -+ -+required: -+ - compatible -+ - reg -+ - local-bd-address -+ - brcm,board-type -+ -+additionalProperties: false -+ -+examples: -+ - | -+ pci0 { -+ #address-cells = <3>; -+ #size-cells = <2>; -+ -+ bluetooth@0,1 { -+ compatible = "pci14e4,5f69"; -+ reg = <0x10100 0x0 0x0 0x0 0x0>; -+ brcm,board-type = "apple,honshu"; -+ /* To be filled by the bootloader */ -+ local-bd-address = [00 00 00 00 00 00]; -+ }; -+ }; -diff --git a/MAINTAINERS b/MAINTAINERS -index 64379c699903..d7b1496dd880 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1838,6 +1838,7 @@ F: Documentation/devicetree/bindings/interrupt-controller/apple,* - F: Documentation/devicetree/bindings/iommu/apple,dart.yaml - F: Documentation/devicetree/bindings/iommu/apple,sart.yaml - F: Documentation/devicetree/bindings/mailbox/apple,mailbox.yaml -+F: Documentation/devicetree/bindings/net/brcm,bcm4377-bluetooth.yaml - F: Documentation/devicetree/bindings/nvme/apple,nvme-ans.yaml - F: Documentation/devicetree/bindings/nvmem/apple,efuses.yaml - F: Documentation/devicetree/bindings/pci/apple,pcie.yaml --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0168-Bluetooth-hci_event-Add-quirk-to-ignore-byte-in-LE-E.patch b/target/linux/silicon/patches-5.19/0168-Bluetooth-hci_event-Add-quirk-to-ignore-byte-in-LE-E.patch deleted file mode 100644 index 801e4fe6b..000000000 --- a/target/linux/silicon/patches-5.19/0168-Bluetooth-hci_event-Add-quirk-to-ignore-byte-in-LE-E.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 9745530da3fcf89629df2cadaf712e7f77363a78 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Mon, 1 Aug 2022 12:36:31 +0200 -Subject: [PATCH 168/171] Bluetooth: hci_event: Add quirk to ignore byte in LE - Extended Adv Report - -Broadcom controllers present on Apple Silicon devices use the upper -8 bits of the event type in the LE Extended Advertising Report for -the channel on which the frame has been received. -Add a quirk to drop the upper byte to ensure that the advertising -results are parsed correctly. - -The following except from a btmon trace shows a report received on -channel 37 by these controllers: - -> HCI Event: LE Meta Event (0x3e) plen 55 #1 [hci0] 0.912271 - LE Extended Advertising Report (0x0d) - Num reports: 1 - Entry 0 - Event type: 0x2513 - Props: 0x0013 - Connectable - Scannable - Use legacy advertising PDUs - Data status: Complete - Reserved (0x2500) - Legacy PDU Type: Reserved (0x2513) - Address type: Public (0x00) - Address: XX:XX:XX:XX:XX:XX (Shenzhen Jingxun Software Telecommunication Technology Co.,Ltd) - Primary PHY: LE 1M - Secondary PHY: No packets - SID: no ADI field (0xff) - TX power: 127 dBm - RSSI: -76 dBm (0xb4) - Periodic advertising interval: 0.00 msec (0x0000) - Direct address type: Public (0x00) - Direct address: 00:00:00:00:00:00 (OUI 00-00-00) - Data length: 0x1d - 02 01 18 09 ff 57 00 31 1f 01 3c 86 ab 03 16 df .....W.1..<..... - fd 0b 09 4a 42 4c 20 46 6c 69 70 20 35 ...JBL Flip 5 - Flags: 0x18 - Simultaneous LE and BR/EDR (Controller) - Simultaneous LE and BR/EDR (Host) - Company: Harman International Industries, Inc. (87) - Data: 311f013c86ab - Service Data (UUID 0xfddf): - Name (complete): JBL Flip 5 - -Signed-off-by: Sven Peter ---- - include/net/bluetooth/hci.h | 11 +++++++++++ - net/bluetooth/hci_event.c | 4 ++++ - 2 files changed, 15 insertions(+) - -diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h -index fe7935be7dc4..47e1ee6f275d 100644 ---- a/include/net/bluetooth/hci.h -+++ b/include/net/bluetooth/hci.h -@@ -274,6 +274,17 @@ enum { - * during the hdev->setup vendor callback. - */ - HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN, -+ -+ /* -+ * When this quirk is set, the upper 8 bits of the evt_type field of -+ * the LE Extended Advertising Report events are discarded. -+ * Some Broadcom controllers found in Apple machines put the channel -+ * the report was received on into these reserved bits. -+ * -+ * This quirk can be set before hci_register_dev is called or -+ * during the hdev->setup vendor callback. -+ */ -+ HCI_QUIRK_FIXUP_LE_EXT_ADV_REPORT_EVT_TYPE, - }; - - /* HCI device flags */ -diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c -index af17dfb20e01..0b5d70aeea93 100644 ---- a/net/bluetooth/hci_event.c -+++ b/net/bluetooth/hci_event.c -@@ -6237,6 +6237,10 @@ static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, void *data, - break; - - evt_type = __le16_to_cpu(info->type); -+ if (test_bit(HCI_QUIRK_FIXUP_LE_EXT_ADV_REPORT_EVT_TYPE, -+ &hdev->quirks)) -+ evt_type &= 0xff; -+ - legacy_evt_type = ext_evt_type_to_legacy(hdev, evt_type); - if (legacy_evt_type != LE_ADV_INVALID) { - process_adv_report(hdev, legacy_evt_type, &info->bdaddr, --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0169-Bluetooth-Add-quirk-to-disable-extended-scanning.patch b/target/linux/silicon/patches-5.19/0169-Bluetooth-Add-quirk-to-disable-extended-scanning.patch deleted file mode 100644 index 9c57212f0..000000000 --- a/target/linux/silicon/patches-5.19/0169-Bluetooth-Add-quirk-to-disable-extended-scanning.patch +++ /dev/null @@ -1,77 +0,0 @@ -From c1dacaf4f9ff59463b2c48edf78b39f5308f7ff5 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Mon, 1 Aug 2022 12:36:32 +0200 -Subject: [PATCH 169/171] Bluetooth: Add quirk to disable extended scanning - -Broadcom 4377 controllers found in Apple x86 Macs with the T2 chip -claim to support extended scanning when querying supported states, - -< HCI Command: LE Read Supported St.. (0x08|0x001c) plen 0 #27 [hci0] 2.971839 -> HCI Event: Command Complete (0x0e) plen 12 #28 [hci0] 2.972730 - LE Read Supported States (0x08|0x001c) ncmd 1 - Status: Success (0x00) - States: 0x000003ffffffffff -[...] - LE Set Extended Scan Parameters (Octet 37 - Bit 5) - LE Set Extended Scan Enable (Octet 37 - Bit 6) -[...] - -, but then fail to actually implement the extended scanning: - -< HCI Command: LE Set Extended Sca.. (0x08|0x0041) plen 8 #105 [hci0] 5.460776 - Own address type: Random (0x01) - Filter policy: Accept all advertisement (0x00) - PHYs: 0x01 - Entry 0: LE 1M - Type: Active (0x01) - Interval: 11.250 msec (0x0012) - Window: 11.250 msec (0x0012) -> HCI Event: Command Complete (0x0e) plen 4 #106 [hci0] 5.461777 - LE Set Extended Scan Parameters (0x08|0x0041) ncmd 1 - Status: Unknown HCI Command (0x01) - -Signed-off-by: Sven Peter ---- - include/net/bluetooth/hci.h | 10 ++++++++++ - include/net/bluetooth/hci_core.h | 4 +++- - 2 files changed, 13 insertions(+), 1 deletion(-) - -diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h -index 47e1ee6f275d..dd275842b9b2 100644 ---- a/include/net/bluetooth/hci.h -+++ b/include/net/bluetooth/hci.h -@@ -285,6 +285,16 @@ enum { - * during the hdev->setup vendor callback. - */ - HCI_QUIRK_FIXUP_LE_EXT_ADV_REPORT_EVT_TYPE, -+ -+ /* -+ * When this quirk is set, the HCI_OP_LE_SET_EXT_SCAN_ENABLE command is -+ * disabled. This is required for some Broadcom controllers which -+ * erroneously claim to support extended scanning. -+ * -+ * This quirk can be set before hci_register_dev is called or -+ * during the hdev->setup vendor callback. -+ */ -+ HCI_QUIRK_BROKEN_EXT_SCAN, - }; - - /* HCI device flags */ -diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h -index c0ea2a4892b1..149b9a10f52f 100644 ---- a/include/net/bluetooth/hci_core.h -+++ b/include/net/bluetooth/hci_core.h -@@ -1501,7 +1501,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn); - - /* Use ext scanning if set ext scan param and ext scan enable is supported */ - #define use_ext_scan(dev) (((dev)->commands[37] & 0x20) && \ -- ((dev)->commands[37] & 0x40)) -+ ((dev)->commands[37] & 0x40) && \ -+ !test_bit(HCI_QUIRK_BROKEN_EXT_SCAN, &(dev)->quirks)) -+ - /* Use ext create connection if command is supported */ - #define use_ext_conn(dev) ((dev)->commands[37] & 0x80) - --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0170-Bluetooth-hci_bcm4377-Add-new-driver-for-BCM4377-PCI.patch b/target/linux/silicon/patches-5.19/0170-Bluetooth-hci_bcm4377-Add-new-driver-for-BCM4377-PCI.patch deleted file mode 100644 index ce08518c8..000000000 --- a/target/linux/silicon/patches-5.19/0170-Bluetooth-hci_bcm4377-Add-new-driver-for-BCM4377-PCI.patch +++ /dev/null @@ -1,2541 +0,0 @@ -From 3adec24c1778d6911ddbdbe1d3425c6421e3ef38 Mon Sep 17 00:00:00 2001 -From: Sven Peter -Date: Mon, 1 Aug 2022 12:36:33 +0200 -Subject: [PATCH 170/171] Bluetooth: hci_bcm4377: Add new driver for BCM4377 - PCI boards - -Broadcom BCM4377/4378/4387 are dual WiFi/Bluetooth boards found in Apple -machines. This driver adds support for the Bluetooth function which -exposes a shared memory IPC protocol over PCIe to tunnel HCI traffic. - -Signed-off-by: Sven Peter ---- - MAINTAINERS | 1 + - drivers/bluetooth/Kconfig | 12 + - drivers/bluetooth/Makefile | 1 + - drivers/bluetooth/hci_bcm4377.c | 2466 +++++++++++++++++++++++++++++++ - 4 files changed, 2480 insertions(+) - create mode 100644 drivers/bluetooth/hci_bcm4377.c - -diff --git a/MAINTAINERS b/MAINTAINERS -index d7b1496dd880..346f9f95673f 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1846,6 +1846,7 @@ F: Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml - F: Documentation/devicetree/bindings/power/apple* - F: Documentation/devicetree/bindings/watchdog/apple,wdt.yaml - F: arch/arm64/boot/dts/apple/ -+F: drivers/bluetooth/hci_bcm4377.c - F: drivers/clk/clk-apple-nco.c - F: drivers/i2c/busses/i2c-pasemi-core.c - F: drivers/i2c/busses/i2c-pasemi-platform.c -diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig -index e30707405455..47f7baf20bb8 100644 ---- a/drivers/bluetooth/Kconfig -+++ b/drivers/bluetooth/Kconfig -@@ -274,6 +274,18 @@ config BT_HCIBCM203X - Say Y here to compile support for HCI BCM203x devices into the - kernel or say M to compile it as module (bcm203x). - -+ -+config BT_HCIBCM4377 -+ tristate "HCI BCM4377/4378/4387 PCIe driver" -+ depends on PCI -+ select FW_LOADER -+ help -+ Support for Broadcom BCM4377/4378/4387 bluetooth chipsets attached via -+ PCIe. These are usually found in Apple machines. -+ -+ Say Y here to compile support for HCI BCM4377 family devices into the -+ kernel or say M to compile it as module (hci_bcm4377). -+ - config BT_HCIBPA10X - tristate "HCI BPA10x USB driver" - depends on USB -diff --git a/drivers/bluetooth/Makefile b/drivers/bluetooth/Makefile -index 3321a8aea4a0..e0b261f24fc9 100644 ---- a/drivers/bluetooth/Makefile -+++ b/drivers/bluetooth/Makefile -@@ -6,6 +6,7 @@ - obj-$(CONFIG_BT_HCIVHCI) += hci_vhci.o - obj-$(CONFIG_BT_HCIUART) += hci_uart.o - obj-$(CONFIG_BT_HCIBCM203X) += bcm203x.o -+obj-$(CONFIG_BT_HCIBCM4377) += hci_bcm4377.o - obj-$(CONFIG_BT_HCIBPA10X) += bpa10x.o - obj-$(CONFIG_BT_HCIBFUSB) += bfusb.o - obj-$(CONFIG_BT_HCIDTL1) += dtl1_cs.o -diff --git a/drivers/bluetooth/hci_bcm4377.c b/drivers/bluetooth/hci_bcm4377.c -new file mode 100644 -index 000000000000..e5db0ac8a81b ---- /dev/null -+++ b/drivers/bluetooth/hci_bcm4377.c -@@ -0,0 +1,2466 @@ -+// SPDX-License-Identifier: GPL-2.0-only OR MIT -+/* -+ * Bluetooth HCI driver for Broadcom 4377/4378/4387 devices attached via PCIe -+ * -+ * Copyright (C) The Asahi Linux Contributors -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+#include -+ -+enum bcm4377_chip { -+ BCM4377 = 0, -+ BCM4378, -+ BCM4387, -+}; -+ -+#define BCM4377_DEVICE_ID 0x5fa0 -+#define BCM4378_DEVICE_ID 0x5f69 -+#define BCM4387_DEVICE_ID 0x5f71 -+ -+#define BCM4377_TIMEOUT 1000 -+ -+/* -+ * These devices only support DMA transactions inside a 32bit window -+ * (possibly to avoid 64 bit arithmetic). The window size cannot exceed -+ * 0xffffffff but is always aligned down to the previous 0x200 byte boundary -+ * which effectively limits the window to [start, start+0xfffffe00]. -+ * We just limit the DMA window to [0, 0xfffffe00] to make sure we don't -+ * run into this limitation. -+ */ -+#define BCM4377_DMA_MASK 0xfffffe00 -+ -+#define BCM4377_PCIECFG_BAR0_WINDOW1 0x80 -+#define BCM4377_PCIECFG_BAR0_WINDOW2 0x70 -+#define BCM4377_PCIECFG_BAR0_CORE2_WINDOW1 0x74 -+#define BCM4377_PCIECFG_BAR0_CORE2_WINDOW2 0x78 -+#define BCM4377_PCIECFG_BAR2_WINDOW 0x84 -+ -+#define BCM4377_PCIECFG_BAR0_CORE2_WINDOW1_DEFAULT 0x18011000 -+#define BCM4377_PCIECFG_BAR2_WINDOW_DEFAULT 0x19000000 -+ -+#define BCM4377_PCIECFG_SUBSYSTEM_CTRL 0x88 -+ -+#define BCM4377_BAR0_FW_DOORBELL 0x140 -+#define BCM4377_BAR0_RTI_CONTROL 0x144 -+ -+#define BCM4377_BAR0_SLEEP_CONTROL 0x150 -+#define BCM4377_BAR0_SLEEP_CONTROL_AWAKE 2 -+#define BCM4377_BAR0_SLEEP_CONTROL_QUIESCED 3 -+ -+#define BCM4377_BAR0_DOORBELL 0x174 -+#define BCM4377_BAR0_DOORBELL_VALUE GENMASK(31, 16) -+#define BCM4377_BAR0_DOORBELL_IDX GENMASK(15, 8) -+#define BCM4377_BAR0_DOORBELL_RING BIT(5) -+ -+#define BCM4377_BAR0_HOST_WINDOW_LO 0x590 -+#define BCM4377_BAR0_HOST_WINDOW_HI 0x594 -+#define BCM4377_BAR0_HOST_WINDOW_SIZE 0x598 -+ -+#define BCM4377_BAR2_BOOTSTAGE 0x200454 -+ -+#define BCM4377_BAR2_FW_LO 0x200478 -+#define BCM4377_BAR2_FW_HI 0x20047c -+#define BCM4377_BAR2_FW_SIZE 0x200480 -+ -+#define BCM4377_BAR2_CONTEXT_ADDR_LO 0x20048c -+#define BCM4377_BAR2_CONTEXT_ADDR_HI 0x200450 -+ -+#define BCM4377_BAR2_RTI_STATUS 0x20045c -+#define BCM4377_BAR2_RTI_WINDOW_LO 0x200494 -+#define BCM4377_BAR2_RTI_WINDOW_HI 0x200498 -+#define BCM4377_BAR2_RTI_WINDOW_SIZE 0x20049c -+ -+#define BCM4377_OTP_SIZE 0xe0 -+#define BCM4377_OTP_SYS_VENDOR 0x15 -+#define BCM4377_OTP_CIS 0x80 -+#define BCM4377_OTP_VENDOR_HDR 0x00000008 -+#define BCM4377_OTP_MAX_PARAM_LEN 16 -+ -+#define BCM4377_N_TRANSFER_RINGS 9 -+#define BCM4377_N_COMPLETION_RINGS 6 -+ -+#define BCM4377_MAX_RING_SIZE 256 -+ -+#define BCM4377_MSGID_GENERATION GENMASK(15, 8) -+#define BCM4377_MSGID_ID GENMASK(7, 0) -+ -+#define BCM4377_RING_N_ENTRIES 128 -+ -+#define BCM4377_CONTROL_MSG_SIZE 0x34 -+#define BCM4377_XFER_RING_MAX_INPLACE_PAYLOAD_SIZE (4 * 0xff) -+ -+#define MAX_ACL_PAYLOAD_SIZE (HCI_MAX_FRAME_SIZE + HCI_ACL_HDR_SIZE) -+#define MAX_SCO_PAYLOAD_SIZE (HCI_MAX_SCO_SIZE + HCI_SCO_HDR_SIZE) -+#define MAX_EVENT_PAYLOAD_SIZE (HCI_MAX_EVENT_SIZE + HCI_EVENT_HDR_SIZE) -+ -+enum bcm4377_otp_params_type { -+ BCM4377_OTP_BOARD_PARAMS, -+ BCM4377_OTP_CHIP_PARAMS -+}; -+ -+enum bcm4377_transfer_ring_id { -+ BCM4377_XFER_RING_CONTROL = 0, -+ BCM4377_XFER_RING_HCI_H2D = 1, -+ BCM4377_XFER_RING_HCI_D2H = 2, -+ BCM4377_XFER_RING_SCO_H2D = 3, -+ BCM4377_XFER_RING_SCO_D2H = 4, -+ BCM4377_XFER_RING_ACL_H2D = 5, -+ BCM4377_XFER_RING_ACL_D2H = 6, -+}; -+ -+enum bcm4377_completion_ring_id { -+ BCM4377_ACK_RING_CONTROL = 0, -+ BCM4377_ACK_RING_HCI_ACL = 1, -+ BCM4377_EVENT_RING_HCI_ACL = 2, -+ BCM4377_ACK_RING_SCO = 3, -+ BCM4377_EVENT_RING_SCO = 4, -+}; -+ -+enum bcm4377_doorbell { -+ BCM4377_DOORBELL_CONTROL = 0, -+ BCM4377_DOORBELL_HCI_H2D = 1, -+ BCM4377_DOORBELL_HCI_D2H = 2, -+ BCM4377_DOORBELL_ACL_H2D = 3, -+ BCM4377_DOORBELL_ACL_D2H = 4, -+ BCM4377_DOORBELL_SCO = 6, -+}; -+ -+/* -+ * Transfer ring entry -+ * -+ * flags: Flags to indicate if the payload is appended or mapped -+ * len: Payload length -+ * payload: Optional payload DMA address -+ * id: Message id to recognize the answer in the completion ring entry -+ */ -+struct bcm4377_xfer_ring_entry { -+#define BCM4377_XFER_RING_FLAG_PAYLOAD_MAPPED BIT(0) -+#define BCM4377_XFER_RING_FLAG_PAYLOAD_IN_FOOTER BIT(1) -+ u8 flags; -+ __le16 len; -+ u8 _unk0; -+ __le64 payload; -+ __le16 id; -+ u8 _unk1[2]; -+} __packed; -+static_assert(sizeof(struct bcm4377_xfer_ring_entry) == 0x10); -+ -+/* -+ * Completion ring entry -+ * -+ * flags: Flags to indicate if the payload is appended or mapped. If the payload -+ * is mapped it can be found in the buffer of the corresponding transfer -+ * ring message. -+ * ring_id: Transfer ring ID which required this message -+ * msg_id: Message ID specified in transfer ring entry -+ * len: Payload length -+ */ -+struct bcm4377_completion_ring_entry { -+ u8 flags; -+ u8 _unk0; -+ __le16 ring_id; -+ __le16 msg_id; -+ __le32 len; -+ u8 _unk1[6]; -+} __packed; -+static_assert(sizeof(struct bcm4377_completion_ring_entry) == 0x10); -+ -+enum bcm4377_control_message_type { -+ BCM4377_CONTROL_MSG_CREATE_XFER_RING = 1, -+ BCM4377_CONTROL_MSG_CREATE_COMPLETION_RING = 2, -+ BCM4377_CONTROL_MSG_DESTROY_XFER_RING = 3, -+ BCM4377_CONTROL_MSG_DESTROY_COMPLETION_RING = 4, -+}; -+ -+/* -+ * Control message used to create a completion ring -+ * -+ * msg_type: Must be BCM4377_CONTROL_MSG_CREATE_COMPLETION_RING -+ * header_size: Unknown, but probably reserved space in front of the entry -+ * footer_size: Number of 32 bit words reserved for payloads after the entry -+ * id/id_again: Completion ring index -+ * ring_iova: DMA address of the ring buffer -+ * n_elements: Number of elements inside the ring buffer -+ * msi: MSI index, doesn't work for all rings though and should be zero -+ * intmod_delay: Unknown delay -+ * intmod_bytes: Unknown -+ */ -+struct bcm4377_create_completion_ring_msg { -+ u8 msg_type; -+ u8 header_size; -+ u8 footer_size; -+ u8 _unk0; -+ __le16 id; -+ __le16 id_again; -+ __le64 ring_iova; -+ __le16 n_elements; -+ __le32 unk; -+ u8 _unk1[6]; -+ __le16 msi; -+ __le16 intmod_delay; -+ __le32 intmod_bytes; -+ __le16 _unk2; -+ __le32 _unk3; -+ u8 _unk4[10]; -+} __packed; -+static_assert(sizeof(struct bcm4377_create_completion_ring_msg) == -+ BCM4377_CONTROL_MSG_SIZE); -+ -+/* -+ * Control ring message used to destroy a completion ring -+ * -+ * msg_type: Must be BCM4377_CONTROL_MSG_DESTROY_COMPLETION_RING -+ * ring_id: Completion ring to be destroyed -+ */ -+struct bcm4377_destroy_completion_ring_msg { -+ u8 msg_type; -+ u8 _pad0; -+ __le16 ring_id; -+ u8 _pad1[48]; -+} __packed; -+static_assert(sizeof(struct bcm4377_destroy_completion_ring_msg) == -+ BCM4377_CONTROL_MSG_SIZE); -+ -+/* -+ * Control message used to create a transfer ring -+ * -+ * msg_type: Must be BCM4377_CONTROL_MSG_CREATE_XFER_RING -+ * header_size: Number of 32 bit words reserved for unknown content before the -+ * entry -+ * footer_size: Number of 32 bit words reserved for payloads after the entry -+ * ring_id/ring_id_again: Transfer ring index -+ * ring_iova: DMA address of the ring buffer -+ * n_elements: Number of elements inside the ring buffer -+ * completion_ring_id: Completion ring index for acknowledgements and events -+ * doorbell: Doorbell index used to notify device of new entries -+ * flags: Transfer ring flags -+ * - virtual: set if there is no associated shared memory and only the -+ * corresponding completion ring is used -+ * - sync: only set for the SCO rings -+ */ -+struct bcm4377_create_transfer_ring_msg { -+ u8 msg_type; -+ u8 header_size; -+ u8 footer_size; -+ u8 _unk0; -+ __le16 ring_id; -+ __le16 ring_id_again; -+ __le64 ring_iova; -+ u8 _unk1[8]; -+ __le16 n_elements; -+ __le16 completion_ring_id; -+ __le16 doorbell; -+#define BCM4377_XFER_RING_FLAG_VIRTUAL BIT(7) -+#define BCM4377_XFER_RING_FLAG_SYNC BIT(8) -+ __le16 flags; -+ u8 _unk2[20]; -+} __packed; -+static_assert(sizeof(struct bcm4377_create_transfer_ring_msg) == -+ BCM4377_CONTROL_MSG_SIZE); -+ -+/* -+ * Control ring message used to destroy a transfer ring -+ * -+ * msg_type: Must be BCM4377_CONTROL_MSG_DESTROY_XFER_RING -+ * ring_id: Transfer ring to be destroyed -+ */ -+struct bcm4377_destroy_transfer_ring_msg { -+ u8 msg_type; -+ u8 _pad0; -+ __le16 ring_id; -+ u8 _pad1[48]; -+} __packed; -+static_assert(sizeof(struct bcm4377_destroy_transfer_ring_msg) == -+ BCM4377_CONTROL_MSG_SIZE); -+ -+/* -+ * "Converged IPC" context struct used to make the device aware of all other -+ * shared memory structures. A pointer to this structure is configured inside a -+ * MMIO register. -+ * -+ * version: Protocol version, must be 2. -+ * size: Size of this structure, must be 0x68. -+ * enabled_caps: Enabled capabilities. Unknown bitfield but should be 2. -+ * peripheral_info_addr: DMA address for a 0x20 buffer to which the device will -+ * write unknown contents -+ * {completion,xfer}_ring_{tails,heads}_addr: DMA pointers to ring heads/tails -+ * n_completion_rings: Number of completion rings, the firmware only works if -+ * this is set to BCM4377_N_COMPLETION_RINGS. -+ * n_xfer_rings: Number of transfer rings, the firmware only works if -+ * this is set to BCM4377_N_TRANSFER_RINGS. -+ * control_completion_ring_addr: Control completion ring buffer DMA address -+ * control_xfer_ring_addr: Control transfer ring buffer DMA address -+ * control_xfer_ring_n_entries: Number of control transfer ring entries -+ * control_completion_ring_n_entries: Number of control completion ring entries -+ * control_xfer_ring_doorbell: Control transfer ring doorbell -+ * control_completion_ring_doorbell: Control completion ring doorbell, -+ * must be set to 0xffff -+ * control_xfer_ring_msi: Control completion ring MSI index, must be 0 -+ * control_completion_ring_msi: Control completion ring MSI index, must be 0. -+ * control_xfer_ring_header_size: Number of 32 bit words reserved in front of -+ * every control transfer ring entry -+ * control_xfer_ring_footer_size: Number of 32 bit words reserved after every -+ * control transfer ring entry -+ * control_completion_ring_header_size: Number of 32 bit words reserved in front -+ * of every control completion ring entry -+ * control_completion_ring_footer_size: Number of 32 bit words reserved after -+ * every control completion ring entry -+ * scratch_pad: Optional scratch pad DMA address -+ * scratch_pad_size: Scratch pad size -+ */ -+struct bcm4377_context { -+ __le16 version; -+ __le16 size; -+ __le32 enabled_caps; -+ -+ __le64 peripheral_info_addr; -+ -+ /* ring heads and tails */ -+ __le64 completion_ring_heads_addr; -+ __le64 xfer_ring_tails_addr; -+ __le64 completion_ring_tails_addr; -+ __le64 xfer_ring_heads_addr; -+ __le16 n_completion_rings; -+ __le16 n_xfer_rings; -+ -+ /* control ring configuration */ -+ __le64 control_completion_ring_addr; -+ __le64 control_xfer_ring_addr; -+ __le16 control_xfer_ring_n_entries; -+ __le16 control_completion_ring_n_entries; -+ __le16 control_xfer_ring_doorbell; -+ __le16 control_completion_ring_doorbell; -+ __le16 control_xfer_ring_msi; -+ __le16 control_completion_ring_msi; -+ u8 control_xfer_ring_header_size; -+ u8 control_xfer_ring_footer_size; -+ u8 control_completion_ring_header_size; -+ u8 control_completion_ring_footer_size; -+ -+ __le16 _unk0; -+ __le16 _unk1; -+ -+ __le64 scratch_pad; -+ __le32 scratch_pad_size; -+ -+ __le32 _unk3; -+} __packed; -+static_assert(sizeof(struct bcm4377_context) == 0x68); -+ -+#define BCM4378_CALIBRATION_CHUNK_SIZE 0xe6 -+struct bcm4378_hci_send_calibration_cmd { -+ u8 unk; -+ __le16 blocks_left; -+ u8 data[BCM4378_CALIBRATION_CHUNK_SIZE]; -+} __packed; -+ -+#define BCM4378_PTB_CHUNK_SIZE 0xcf -+struct bcm4378_hci_send_ptb_cmd { -+ __le16 blocks_left; -+ u8 data[BCM4378_PTB_CHUNK_SIZE]; -+} __packed; -+ -+/* -+ * Shared memory structure used to store the ring head and tail pointers. -+ */ -+struct bcm4377_ring_state { -+ __le16 completion_ring_head[BCM4377_N_COMPLETION_RINGS]; -+ __le16 completion_ring_tail[BCM4377_N_COMPLETION_RINGS]; -+ __le16 xfer_ring_head[BCM4377_N_TRANSFER_RINGS]; -+ __le16 xfer_ring_tail[BCM4377_N_TRANSFER_RINGS]; -+}; -+ -+/* -+ * A transfer ring can be used in two configurations: -+ * 1) Send control or HCI messages to the device which are then acknowledged -+ * in the corresponding completion ring -+ * 2) Receiving HCI frames from the devices. In this case the transfer ring -+ * itself contains empty messages that are acknowledged once data is -+ * available from the device. If the payloads fit inside the footers -+ * of the completion ring the transfer ring can be configured to be -+ * virtual such that it has no ring buffer. -+ * -+ * ring_id: ring index hardcoded in the firmware -+ * doorbell: doorbell index to notify device of new entries -+ * payload_size: optional in-place payload size -+ * mapped_payload_size: optional out-of-place payload size -+ * completion_ring: index of corresponding completion ring -+ * n_entries: number of entries inside this ring -+ * generation: ring generation; incremented on hci_open to detect stale messages -+ * sync: set to true for SCO rings -+ * virtual: set to true if this ring has no entries and is just required to -+ * setup a corresponding completion ring for device->host messages -+ * d2h_buffers_only: set to true if this ring is only used to provide large -+ * buffers used by device->host messages in the completion -+ * ring -+ * allow_wait: allow to wait for messages to be acknowledged -+ * enabled: true once the ring has been created and can be used -+ * ring: ring buffer for entries (struct bcm4377_xfer_ring_entry) -+ * ring_dma: DMA address for ring entry buffer -+ * payloads: payload buffer for mapped_payload_size payloads -+ * payloads_dma:DMA address for payload buffer -+ * events: pointer to array of completions if waiting is allowed -+ * msgids: bitmap to keep track of used message ids -+ * lock: Spinlock to protect access to ring structurs used in the irq handler -+ */ -+struct bcm4377_transfer_ring { -+ enum bcm4377_transfer_ring_id ring_id; -+ enum bcm4377_doorbell doorbell; -+ size_t payload_size; -+ size_t mapped_payload_size; -+ u8 completion_ring; -+ u16 n_entries; -+ u8 generation; -+ -+ bool sync; -+ bool virtual; -+ bool d2h_buffers_only; -+ bool allow_wait; -+ bool enabled; -+ -+ void *ring; -+ dma_addr_t ring_dma; -+ -+ void *payloads; -+ dma_addr_t payloads_dma; -+ -+ struct completion **events; -+ DECLARE_BITMAP(msgids, BCM4377_MAX_RING_SIZE); -+ spinlock_t lock; -+}; -+ -+/* -+ * A completion ring can be either used to either acknowledge messages sent in -+ * the corresponding transfer ring or to receive messages associated with the -+ * transfer ring. When used to receive messages the transfer ring either -+ * has no ring buffer and is only advanced ("virtual transfer ring") or it -+ * only contains empty DMA buffers to be used for the payloads. -+ * -+ * ring_id: completion ring id, hardcoded in firmware -+ * payload_size: optional payload size after each entry -+ * delay: unknown delay -+ * n_entries: number of entries in this ring -+ * enabled: true once the ring has been created and can be used -+ * ring: ring buffer for entries (struct bcm4377_completion_ring_entry) -+ * ring_dma: DMA address of ring buffer -+ * transfer_rings: bitmap of corresponding transfer ring ids -+ */ -+struct bcm4377_completion_ring { -+ enum bcm4377_completion_ring_id ring_id; -+ u16 payload_size; -+ u16 delay; -+ u16 n_entries; -+ bool enabled; -+ -+ void *ring; -+ dma_addr_t ring_dma; -+ -+ unsigned long transfer_rings; -+}; -+ -+struct bcm4377_data; -+ -+/* -+ * Chip-specific configuration struct -+ * -+ * id: Chip id (e.g. 0x4377 for BCM4377) -+ * otp_offset: Offset to the start of the OTP inside BAR0 -+ * bar0_window1: Backplane address mapped to the first window in BAR0 -+ * bar0_window2: Backplane address mapped to the second window in BAR0 -+ * bar0_core2_window2: Optional backplane address mapped to the second core's -+ * second window in BAR0 -+ * has_bar0_core2_window2: Set to true if this chip requires the second core's -+ * second window to be configured -+ * clear_pciecfg_subsystem_ctrl_bit19: Set to true if bit 19 in the -+ * vendor-specific subsystem control -+ * register has to be cleared -+ * disable_aspm: Set to true if ASPM must be disabled due to hardware errata -+ * broken_ext_scan: Set to true if the chip erroneously claims to support -+ * extended scanning -+ * fixup_le_ext_adv_report_evt_type: Set to true if the upper byte of evt_type -+ * field of the LE Advanced Report has to be -+ * cleared -+ * board_type: Default board type, used for non-DT platforms -+ * send_calibration: Optional callback to send calibration data -+ * send_ptb: Callback to send "PTB" regulatory/calibration data -+ */ -+struct bcm4377_hw { -+ unsigned int id; -+ -+ u32 otp_offset; -+ -+ u32 bar0_window1; -+ u32 bar0_window2; -+ u32 bar0_core2_window2; -+ -+ unsigned long has_bar0_core2_window2 : 1; -+ unsigned long clear_pciecfg_subsystem_ctrl_bit19 : 1; -+ unsigned long disable_aspm : 1; -+ unsigned long broken_ext_scan : 1; -+ unsigned long fixup_le_ext_adv_report_evt_type : 1; -+ -+ const char *board_type; -+ -+ int (*send_calibration)(struct bcm4377_data *bcm4377); -+ int (*send_ptb)(struct bcm4377_data *bcm4377, -+ const struct firmware *fw); -+}; -+ -+static const struct bcm4377_hw bcm4377_hw_variants[]; -+ -+/* -+ * Private struct associated with each device containing global state -+ * -+ * pdev: Pointer to associated struct pci_dev -+ * hdev: Pointer to associated strucy hci_dev -+ * bar0: iomem pointing to BAR0 -+ * bar1: iomem pointing to BAR2 -+ * bootstage: Current value of the bootstage -+ * rti_status: Current "RTI" status value -+ * hw: Pointer to chip-specific struct bcm4377_hw -+ * taurus_cal_blob: "Taurus" calibration blob used for some chips -+ * taurus_cal_size: "Taurus" calibration blob size -+ * taurus_beamforming_cal_blob: "Taurus" beamforming calibration blob used for -+ * some chips -+ * taurus_beamforming_cal_size: "Taurus" beamforming calibration blob size -+ * stepping: Chip stepping read from OTP; used for firmware selection -+ * vendor: Antenna vendor read from OTP; used for firmware selection -+ * board_type: Board type read from FDT; used for firmware selection -+ * event: Event for changed bootstage or rti_status; used for booting firmware -+ * ctx: "Converged IPC" context -+ * ctx_dma: "Converged IPC" context DMA address -+ * ring_state: Shared memory buffer containing ring head and tail indexes -+ * ring_state_dma: DMA address for ring_state -+ * {control,hci_acl,sco}_ack_ring: Completion rings used to acknowledge messages -+ * {hci_acl,sco}_event_ring: Completion rings used for device->host messages -+ * control_h2d_ring: Transfer ring used for control messages -+ * {hci,sco,acl}_h2d_ring: Transfer ring used to transfer HCI frames -+ * {hci,sco,acl}_d2h_ring: Transfer ring used to receive HCI frames in the -+ * corresponding completion ring -+ */ -+struct bcm4377_data { -+ struct pci_dev *pdev; -+ struct hci_dev *hdev; -+ -+ void __iomem *bar0; -+ void __iomem *bar2; -+ -+ u32 bootstage; -+ u32 rti_status; -+ -+ const struct bcm4377_hw *hw; -+ -+ const void *taurus_cal_blob; -+ int taurus_cal_size; -+ const void *taurus_beamforming_cal_blob; -+ int taurus_beamforming_cal_size; -+ -+ char stepping[BCM4377_OTP_MAX_PARAM_LEN]; -+ char vendor[BCM4377_OTP_MAX_PARAM_LEN]; -+ const char *board_type; -+ -+ struct completion event; -+ -+ struct bcm4377_context *ctx; -+ dma_addr_t ctx_dma; -+ -+ struct bcm4377_ring_state *ring_state; -+ dma_addr_t ring_state_dma; -+ -+ /* -+ * The HCI and ACL rings have to be merged because this structure is -+ * hardcoded in the firmware. -+ */ -+ struct bcm4377_completion_ring control_ack_ring; -+ struct bcm4377_completion_ring hci_acl_ack_ring; -+ struct bcm4377_completion_ring hci_acl_event_ring; -+ struct bcm4377_completion_ring sco_ack_ring; -+ struct bcm4377_completion_ring sco_event_ring; -+ -+ struct bcm4377_transfer_ring control_h2d_ring; -+ struct bcm4377_transfer_ring hci_h2d_ring; -+ struct bcm4377_transfer_ring hci_d2h_ring; -+ struct bcm4377_transfer_ring sco_h2d_ring; -+ struct bcm4377_transfer_ring sco_d2h_ring; -+ struct bcm4377_transfer_ring acl_h2d_ring; -+ struct bcm4377_transfer_ring acl_d2h_ring; -+}; -+ -+static void bcm4377_ring_doorbell(struct bcm4377_data *bcm4377, u8 doorbell, -+ u16 val) -+{ -+ u32 db = 0; -+ -+ db |= FIELD_PREP(BCM4377_BAR0_DOORBELL_VALUE, val); -+ db |= FIELD_PREP(BCM4377_BAR0_DOORBELL_IDX, doorbell); -+ db |= BCM4377_BAR0_DOORBELL_RING; -+ -+ dev_dbg(&bcm4377->pdev->dev, "write %d to doorbell #%d (0x%x)\n", val, -+ doorbell, db); -+ iowrite32(db, bcm4377->bar0 + BCM4377_BAR0_DOORBELL); -+} -+ -+static int bcm4377_extract_msgid(struct bcm4377_data *bcm4377, -+ struct bcm4377_transfer_ring *ring, -+ u16 raw_msgid, u8 *msgid) -+{ -+ u8 generation = FIELD_GET(BCM4377_MSGID_GENERATION, raw_msgid); -+ *msgid = FIELD_GET(BCM4377_MSGID_ID, raw_msgid); -+ -+ if (generation != ring->generation) { -+ dev_warn( -+ &bcm4377->pdev->dev, -+ "invalid message generation %d should be %d in entry for ring %d\n", -+ generation, ring->generation, ring->ring_id); -+ return -EINVAL; -+ } -+ -+ if (*msgid >= ring->n_entries) { -+ dev_warn(&bcm4377->pdev->dev, -+ "invalid message id in entry for ring %d: %d > %d\n", -+ ring->ring_id, *msgid, ring->n_entries); -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static void bcm4377_handle_event(struct bcm4377_data *bcm4377, -+ struct bcm4377_transfer_ring *ring, -+ u16 raw_msgid, u8 entry_flags, u8 type, -+ void *payload, size_t len) -+{ -+ struct sk_buff *skb; -+ u16 head; -+ u8 msgid; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&ring->lock, flags); -+ if (!ring->enabled) { -+ dev_warn(&bcm4377->pdev->dev, -+ "event for disabled transfer ring %d\n", -+ ring->ring_id); -+ goto out; -+ } -+ -+ if (ring->d2h_buffers_only && -+ entry_flags & BCM4377_XFER_RING_FLAG_PAYLOAD_MAPPED) { -+ if (bcm4377_extract_msgid(bcm4377, ring, raw_msgid, &msgid)) -+ goto out; -+ -+ if (len > ring->mapped_payload_size) { -+ dev_warn( -+ &bcm4377->pdev->dev, -+ "invalid payload len in event for ring %d: %zu > %zu\n", -+ ring->ring_id, len, ring->mapped_payload_size); -+ goto out; -+ } -+ -+ payload = ring->payloads + msgid * ring->mapped_payload_size; -+ } -+ -+ skb = bt_skb_alloc(len, GFP_ATOMIC); -+ if (!skb) -+ goto out; -+ -+ memcpy(skb_put(skb, len), payload, len); -+ hci_skb_pkt_type(skb) = type; -+ hci_recv_frame(bcm4377->hdev, skb); -+ -+out: -+ head = le16_to_cpu(bcm4377->ring_state->xfer_ring_head[ring->ring_id]); -+ head = (head + 1) % ring->n_entries; -+ bcm4377->ring_state->xfer_ring_head[ring->ring_id] = cpu_to_le16(head); -+ -+ bcm4377_ring_doorbell(bcm4377, ring->doorbell, head); -+ -+ spin_unlock_irqrestore(&ring->lock, flags); -+} -+ -+static void bcm4377_handle_ack(struct bcm4377_data *bcm4377, -+ struct bcm4377_transfer_ring *ring, -+ u16 raw_msgid) -+{ -+ unsigned long flags; -+ u8 msgid; -+ -+ spin_lock_irqsave(&ring->lock, flags); -+ -+ if (bcm4377_extract_msgid(bcm4377, ring, raw_msgid, &msgid)) -+ goto unlock; -+ -+ if (!test_bit(msgid, ring->msgids)) { -+ dev_warn( -+ &bcm4377->pdev->dev, -+ "invalid message id in ack for ring %d: %d is not used\n", -+ ring->ring_id, msgid); -+ goto unlock; -+ } -+ -+ if (ring->allow_wait && ring->events[msgid]) { -+ complete(ring->events[msgid]); -+ ring->events[msgid] = NULL; -+ } -+ -+ bitmap_release_region(ring->msgids, msgid, ring->n_entries); -+ -+unlock: -+ spin_unlock_irqrestore(&ring->lock, flags); -+} -+ -+static void bcm4377_handle_completion(struct bcm4377_data *bcm4377, -+ struct bcm4377_completion_ring *ring, -+ u16 pos) -+{ -+ struct bcm4377_completion_ring_entry *entry; -+ u16 msg_id, transfer_ring; -+ size_t entry_size, data_len; -+ void *data; -+ -+ if (pos >= ring->n_entries) { -+ dev_warn(&bcm4377->pdev->dev, -+ "invalid offset %d for completion ring %d\n", pos, -+ ring->ring_id); -+ return; -+ } -+ -+ entry_size = sizeof(*entry) + ring->payload_size; -+ entry = ring->ring + pos * entry_size; -+ data = ring->ring + pos * entry_size + sizeof(*entry); -+ data_len = le32_to_cpu(entry->len); -+ msg_id = le16_to_cpu(entry->msg_id); -+ transfer_ring = le16_to_cpu(entry->ring_id); -+ -+ if ((ring->transfer_rings & BIT(transfer_ring)) == 0) { -+ dev_warn( -+ &bcm4377->pdev->dev, -+ "invalid entry at offset %d for transfer ring %d in completion ring %d\n", -+ pos, transfer_ring, ring->ring_id); -+ return; -+ } -+ -+ dev_dbg(&bcm4377->pdev->dev, -+ "entry in completion ring %d for transfer ring %d with msg_id %d\n", -+ ring->ring_id, transfer_ring, msg_id); -+ -+ switch (transfer_ring) { -+ case BCM4377_XFER_RING_CONTROL: -+ bcm4377_handle_ack(bcm4377, &bcm4377->control_h2d_ring, msg_id); -+ break; -+ case BCM4377_XFER_RING_HCI_H2D: -+ bcm4377_handle_ack(bcm4377, &bcm4377->hci_h2d_ring, msg_id); -+ break; -+ case BCM4377_XFER_RING_SCO_H2D: -+ bcm4377_handle_ack(bcm4377, &bcm4377->sco_h2d_ring, msg_id); -+ break; -+ case BCM4377_XFER_RING_ACL_H2D: -+ bcm4377_handle_ack(bcm4377, &bcm4377->acl_h2d_ring, msg_id); -+ break; -+ -+ case BCM4377_XFER_RING_HCI_D2H: -+ bcm4377_handle_event(bcm4377, &bcm4377->hci_d2h_ring, msg_id, -+ entry->flags, HCI_EVENT_PKT, data, -+ data_len); -+ break; -+ case BCM4377_XFER_RING_SCO_D2H: -+ bcm4377_handle_event(bcm4377, &bcm4377->sco_d2h_ring, msg_id, -+ entry->flags, HCI_SCODATA_PKT, data, -+ data_len); -+ break; -+ case BCM4377_XFER_RING_ACL_D2H: -+ bcm4377_handle_event(bcm4377, &bcm4377->acl_d2h_ring, msg_id, -+ entry->flags, HCI_ACLDATA_PKT, data, -+ data_len); -+ break; -+ -+ default: -+ dev_warn( -+ &bcm4377->pdev->dev, -+ "entry in completion ring %d for unknown transfer ring %d with msg_id %d\n", -+ ring->ring_id, transfer_ring, msg_id); -+ } -+} -+ -+static void bcm4377_poll_completion_ring(struct bcm4377_data *bcm4377, -+ struct bcm4377_completion_ring *ring) -+{ -+ u16 tail; -+ __le16 *heads = bcm4377->ring_state->completion_ring_head; -+ __le16 *tails = bcm4377->ring_state->completion_ring_tail; -+ -+ if (!ring->enabled) -+ return; -+ -+ tail = le16_to_cpu(tails[ring->ring_id]); -+ dev_dbg(&bcm4377->pdev->dev, -+ "completion ring #%d: head: %d, tail: %d\n", ring->ring_id, -+ le16_to_cpu(heads[ring->ring_id]), tail); -+ -+ while (tail != le16_to_cpu(READ_ONCE(heads[ring->ring_id]))) { -+ /* -+ * ensure the CPU doesn't speculate through the comparison. -+ * otherwise it might already read the (empty) queue entry -+ * before the updated head has been loaded and checked. -+ */ -+ dma_rmb(); -+ -+ bcm4377_handle_completion(bcm4377, ring, tail); -+ -+ tail = (tail + 1) % ring->n_entries; -+ tails[ring->ring_id] = cpu_to_le16(tail); -+ } -+} -+ -+static irqreturn_t bcm4377_irq(int irq, void *data) -+{ -+ struct bcm4377_data *bcm4377 = data; -+ u32 bootstage, rti_status; -+ -+ bootstage = ioread32(bcm4377->bar2 + BCM4377_BAR2_BOOTSTAGE); -+ rti_status = ioread32(bcm4377->bar2 + BCM4377_BAR2_RTI_STATUS); -+ -+ if (bootstage != bcm4377->bootstage || -+ rti_status != bcm4377->rti_status) { -+ dev_dbg(&bcm4377->pdev->dev, -+ "bootstage = %d -> %d, rti state = %d -> %d\n", -+ bcm4377->bootstage, bootstage, bcm4377->rti_status, -+ rti_status); -+ complete(&bcm4377->event); -+ bcm4377->bootstage = bootstage; -+ bcm4377->rti_status = rti_status; -+ } -+ -+ bcm4377_poll_completion_ring(bcm4377, &bcm4377->control_ack_ring); -+ bcm4377_poll_completion_ring(bcm4377, &bcm4377->hci_acl_event_ring); -+ bcm4377_poll_completion_ring(bcm4377, &bcm4377->hci_acl_ack_ring); -+ bcm4377_poll_completion_ring(bcm4377, &bcm4377->sco_ack_ring); -+ bcm4377_poll_completion_ring(bcm4377, &bcm4377->sco_event_ring); -+ -+ return IRQ_HANDLED; -+} -+ -+static int bcm4377_enqueue(struct bcm4377_data *bcm4377, -+ struct bcm4377_transfer_ring *ring, void *data, -+ size_t len, bool wait) -+{ -+ unsigned long flags; -+ struct bcm4377_xfer_ring_entry *entry; -+ void *payload; -+ size_t offset; -+ u16 head, tail, new_head; -+ u16 raw_msgid; -+ int ret, msgid; -+ DECLARE_COMPLETION_ONSTACK(event); -+ -+ if (len > ring->payload_size && len > ring->mapped_payload_size) { -+ dev_warn( -+ &bcm4377->pdev->dev, -+ "payload len %zu is too large for ring %d (max is %zu or %zu)\n", -+ len, ring->ring_id, ring->payload_size, -+ ring->mapped_payload_size); -+ return -EINVAL; -+ } -+ if (wait && !ring->allow_wait) -+ return -EINVAL; -+ if (ring->virtual) -+ return -EINVAL; -+ -+ spin_lock_irqsave(&ring->lock, flags); -+ -+ head = le16_to_cpu(bcm4377->ring_state->xfer_ring_head[ring->ring_id]); -+ tail = le16_to_cpu(bcm4377->ring_state->xfer_ring_tail[ring->ring_id]); -+ -+ new_head = (head + 1) % ring->n_entries; -+ -+ if (new_head == tail) { -+ dev_warn(&bcm4377->pdev->dev, -+ "can't send message because ring %d is full\n", -+ ring->ring_id); -+ ret = -EINVAL; -+ goto out; -+ } -+ -+ msgid = bitmap_find_free_region(ring->msgids, ring->n_entries, 0); -+ if (msgid < 0) { -+ dev_warn(&bcm4377->pdev->dev, -+ "can't find message id for ring %d\n", ring->ring_id); -+ ret = -EINVAL; -+ goto out; -+ } -+ -+ raw_msgid = FIELD_PREP(BCM4377_MSGID_GENERATION, ring->generation); -+ raw_msgid |= FIELD_PREP(BCM4377_MSGID_ID, msgid); -+ -+ offset = head * (sizeof(*entry) + ring->payload_size); -+ entry = ring->ring + offset; -+ -+ memset(entry, 0, sizeof(*entry)); -+ entry->id = cpu_to_le16(raw_msgid); -+ entry->len = cpu_to_le16(len); -+ -+ if (len <= ring->payload_size) { -+ entry->flags = BCM4377_XFER_RING_FLAG_PAYLOAD_IN_FOOTER; -+ payload = ring->ring + offset + sizeof(*entry); -+ } else { -+ entry->flags = BCM4377_XFER_RING_FLAG_PAYLOAD_MAPPED; -+ entry->payload = cpu_to_le64(ring->payloads_dma + -+ msgid * ring->mapped_payload_size); -+ payload = ring->payloads + msgid * ring->mapped_payload_size; -+ } -+ -+ memcpy(payload, data, len); -+ -+ if (wait) -+ ring->events[msgid] = &event; -+ -+ /* -+ * The 4377 chips stop responding to any commands as soon as they -+ * have been idle for a while. Poking the sleep control register here -+ * makes them come alive again. -+ */ -+ iowrite32(BCM4377_BAR0_SLEEP_CONTROL_AWAKE, -+ bcm4377->bar0 + BCM4377_BAR0_SLEEP_CONTROL); -+ -+ dev_dbg(&bcm4377->pdev->dev, -+ "updating head for transfer queue #%d to %d\n", ring->ring_id, -+ new_head); -+ bcm4377->ring_state->xfer_ring_head[ring->ring_id] = -+ cpu_to_le16(new_head); -+ -+ if (!ring->sync) -+ bcm4377_ring_doorbell(bcm4377, ring->doorbell, new_head); -+ ret = 0; -+ -+out: -+ spin_unlock_irqrestore(&ring->lock, flags); -+ -+ if (ret == 0 && wait) { -+ ret = wait_for_completion_interruptible_timeout( -+ &event, BCM4377_TIMEOUT); -+ if (ret == 0) -+ ret = -ETIMEDOUT; -+ else if (ret > 0) -+ ret = 0; -+ -+ spin_lock_irqsave(&ring->lock, flags); -+ ring->events[msgid] = NULL; -+ spin_unlock_irqrestore(&ring->lock, flags); -+ } -+ -+ return ret; -+} -+ -+static int bcm4377_create_completion_ring(struct bcm4377_data *bcm4377, -+ struct bcm4377_completion_ring *ring) -+{ -+ struct bcm4377_create_completion_ring_msg msg; -+ int ret; -+ -+ if (ring->enabled) { -+ dev_warn(&bcm4377->pdev->dev, -+ "completion ring %d already enabled\n", ring->ring_id); -+ return 0; -+ } -+ -+ memset(ring->ring, 0, -+ ring->n_entries * (sizeof(struct bcm4377_completion_ring_entry) + -+ ring->payload_size)); -+ memset(&msg, 0, sizeof(msg)); -+ msg.msg_type = BCM4377_CONTROL_MSG_CREATE_COMPLETION_RING; -+ msg.id = cpu_to_le16(ring->ring_id); -+ msg.id_again = cpu_to_le16(ring->ring_id); -+ msg.ring_iova = cpu_to_le64(ring->ring_dma); -+ msg.n_elements = cpu_to_le16(ring->n_entries); -+ msg.intmod_bytes = cpu_to_le32(0xffffffff); -+ msg.unk = cpu_to_le32(0xffffffff); -+ msg.intmod_delay = cpu_to_le16(ring->delay); -+ msg.footer_size = ring->payload_size / 4; -+ -+ ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg, -+ sizeof(msg), true); -+ if (!ret) -+ ring->enabled = true; -+ -+ return ret; -+} -+ -+static int bcm4377_destroy_completion_ring(struct bcm4377_data *bcm4377, -+ struct bcm4377_completion_ring *ring) -+{ -+ struct bcm4377_destroy_completion_ring_msg msg; -+ int ret; -+ -+ memset(&msg, 0, sizeof(msg)); -+ msg.msg_type = BCM4377_CONTROL_MSG_DESTROY_COMPLETION_RING; -+ msg.ring_id = cpu_to_le16(ring->ring_id); -+ -+ ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg, -+ sizeof(msg), true); -+ if (ret) -+ dev_warn(&bcm4377->pdev->dev, -+ "failed to destroy completion ring %d\n", -+ ring->ring_id); -+ -+ ring->enabled = false; -+ return ret; -+} -+ -+static int bcm4377_create_transfer_ring(struct bcm4377_data *bcm4377, -+ struct bcm4377_transfer_ring *ring) -+{ -+ struct bcm4377_create_transfer_ring_msg msg; -+ u16 flags = 0; -+ int ret, i; -+ unsigned long spinlock_flags; -+ -+ if (ring->virtual) -+ flags |= BCM4377_XFER_RING_FLAG_VIRTUAL; -+ if (ring->sync) -+ flags |= BCM4377_XFER_RING_FLAG_SYNC; -+ -+ spin_lock_irqsave(&ring->lock, spinlock_flags); -+ memset(&msg, 0, sizeof(msg)); -+ msg.msg_type = BCM4377_CONTROL_MSG_CREATE_XFER_RING; -+ msg.ring_id = cpu_to_le16(ring->ring_id); -+ msg.ring_id_again = cpu_to_le16(ring->ring_id); -+ msg.ring_iova = cpu_to_le64(ring->ring_dma); -+ msg.n_elements = cpu_to_le16(ring->n_entries); -+ msg.completion_ring_id = cpu_to_le16(ring->completion_ring); -+ msg.doorbell = cpu_to_le16(ring->doorbell); -+ msg.flags = cpu_to_le16(flags); -+ msg.footer_size = ring->payload_size / 4; -+ -+ bcm4377->ring_state->xfer_ring_head[ring->ring_id] = 0; -+ bcm4377->ring_state->xfer_ring_tail[ring->ring_id] = 0; -+ ring->generation++; -+ spin_unlock_irqrestore(&ring->lock, spinlock_flags); -+ -+ ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg, -+ sizeof(msg), true); -+ -+ spin_lock_irqsave(&ring->lock, spinlock_flags); -+ -+ if (ring->d2h_buffers_only) { -+ for (i = 0; i < ring->n_entries; ++i) { -+ struct bcm4377_xfer_ring_entry *entry = -+ ring->ring + i * sizeof(*entry); -+ u16 raw_msgid = FIELD_PREP(BCM4377_MSGID_GENERATION, -+ ring->generation); -+ raw_msgid |= FIELD_PREP(BCM4377_MSGID_ID, i); -+ -+ memset(entry, 0, sizeof(*entry)); -+ entry->id = cpu_to_le16(raw_msgid); -+ entry->len = cpu_to_le16(ring->mapped_payload_size); -+ entry->flags = BCM4377_XFER_RING_FLAG_PAYLOAD_MAPPED; -+ entry->payload = -+ cpu_to_le64(ring->payloads_dma + -+ i * ring->mapped_payload_size); -+ } -+ } -+ -+ /* -+ * send some messages if this is a device->host ring to allow the device -+ * to reply by acknowledging them in the completion ring -+ */ -+ if (ring->virtual || ring->d2h_buffers_only) { -+ bcm4377->ring_state->xfer_ring_head[ring->ring_id] = -+ cpu_to_le16(0xf); -+ bcm4377_ring_doorbell(bcm4377, ring->doorbell, 0xf); -+ } -+ -+ ring->enabled = true; -+ spin_unlock_irqrestore(&ring->lock, spinlock_flags); -+ -+ return ret; -+} -+ -+static int bcm4377_destroy_transfer_ring(struct bcm4377_data *bcm4377, -+ struct bcm4377_transfer_ring *ring) -+{ -+ struct bcm4377_destroy_transfer_ring_msg msg; -+ int ret; -+ -+ memset(&msg, 0, sizeof(msg)); -+ msg.msg_type = BCM4377_CONTROL_MSG_DESTROY_XFER_RING; -+ msg.ring_id = cpu_to_le16(ring->ring_id); -+ -+ ret = bcm4377_enqueue(bcm4377, &bcm4377->control_h2d_ring, &msg, -+ sizeof(msg), true); -+ if (ret) -+ dev_warn(&bcm4377->pdev->dev, -+ "failed to destroy transfer ring %d\n", ring->ring_id); -+ -+ ring->enabled = false; -+ return ret; -+} -+ -+static int __bcm4378_send_calibration_chunk(struct bcm4377_data *bcm4377, -+ const void *data, size_t data_len, -+ u16 blocks_left) -+{ -+ struct bcm4378_hci_send_calibration_cmd cmd; -+ struct sk_buff *skb; -+ -+ if (data_len > sizeof(cmd.data)) -+ return -EINVAL; -+ -+ memset(&cmd, 0, sizeof(cmd)); -+ cmd.unk = 0x03; -+ cmd.blocks_left = cpu_to_le16(blocks_left); -+ memcpy(cmd.data, data, data_len); -+ -+ skb = __hci_cmd_sync(bcm4377->hdev, 0xfd97, sizeof(cmd), &cmd, -+ HCI_INIT_TIMEOUT); -+ if (IS_ERR(skb)) -+ return PTR_ERR(skb); -+ -+ kfree_skb(skb); -+ return 0; -+} -+ -+static int __bcm4378_send_calibration(struct bcm4377_data *bcm4377, -+ const void *data, size_t data_size) -+{ -+ int ret; -+ size_t i, left, transfer_len; -+ size_t blocks = -+ DIV_ROUND_UP(data_size, (size_t)BCM4378_CALIBRATION_CHUNK_SIZE); -+ -+ if (!data) { -+ dev_err(&bcm4377->pdev->dev, -+ "no calibration data available.\n"); -+ return -ENOENT; -+ } -+ -+ for (i = 0, left = data_size; i < blocks; ++i, left -= transfer_len) { -+ transfer_len = -+ min_t(size_t, left, BCM4378_CALIBRATION_CHUNK_SIZE); -+ -+ ret = __bcm4378_send_calibration_chunk( -+ bcm4377, data + i * BCM4378_CALIBRATION_CHUNK_SIZE, -+ transfer_len, blocks - i - 1); -+ if (ret) { -+ dev_err(&bcm4377->pdev->dev, -+ "send calibration chunk failed with %d\n", ret); -+ return ret; -+ } -+ } -+ -+ return 0; -+} -+ -+static int bcm4378_send_calibration(struct bcm4377_data *bcm4377) -+{ -+ if ((strcmp(bcm4377->stepping, "b1") == 0) || -+ strcmp(bcm4377->stepping, "b3") == 0) -+ return __bcm4378_send_calibration( -+ bcm4377, bcm4377->taurus_beamforming_cal_blob, -+ bcm4377->taurus_beamforming_cal_size); -+ else -+ return __bcm4378_send_calibration(bcm4377, -+ bcm4377->taurus_cal_blob, -+ bcm4377->taurus_cal_size); -+} -+ -+static int bcm4387_send_calibration(struct bcm4377_data *bcm4377) -+{ -+ if (strcmp(bcm4377->stepping, "c2") == 0) -+ return __bcm4378_send_calibration( -+ bcm4377, bcm4377->taurus_beamforming_cal_blob, -+ bcm4377->taurus_beamforming_cal_size); -+ else -+ return __bcm4378_send_calibration(bcm4377, -+ bcm4377->taurus_cal_blob, -+ bcm4377->taurus_cal_size); -+} -+ -+static const struct firmware *bcm4377_request_blob(struct bcm4377_data *bcm4377, -+ const char *suffix) -+{ -+ const struct firmware *fw; -+ char name0[64], name1[64]; -+ int ret; -+ -+ snprintf(name0, sizeof(name0), "brcm/brcmbt%04x%s-%s-%s.%s", -+ bcm4377->hw->id, bcm4377->stepping, bcm4377->board_type, -+ bcm4377->vendor, suffix); -+ snprintf(name1, sizeof(name1), "brcm/brcmbt%04x%s-%s.%s", -+ bcm4377->hw->id, bcm4377->stepping, bcm4377->board_type, -+ suffix); -+ dev_dbg(&bcm4377->pdev->dev, "Trying to load firmware: '%s' or '%s'\n", -+ name0, name1); -+ -+ ret = firmware_request_nowarn(&fw, name0, &bcm4377->pdev->dev); -+ if (!ret) -+ return fw; -+ ret = firmware_request_nowarn(&fw, name1, &bcm4377->pdev->dev); -+ if (!ret) -+ return fw; -+ -+ dev_err(&bcm4377->pdev->dev, -+ "Unable to load firmware; tried '%s' and '%s'\n", name0, name1); -+ return NULL; -+} -+ -+static int bcm4377_send_ptb(struct bcm4377_data *bcm4377, -+ const struct firmware *fw) -+{ -+ struct sk_buff *skb; -+ int ret = 0; -+ -+ skb = __hci_cmd_sync(bcm4377->hdev, 0xfd98, fw->size, fw->data, -+ HCI_INIT_TIMEOUT); -+ if (IS_ERR(skb)) { -+ ret = PTR_ERR(skb); -+ dev_err(&bcm4377->pdev->dev, "sending ptb failed (%d)", ret); -+ return ret; -+ } -+ -+ kfree_skb(skb); -+ return ret; -+} -+ -+static int bcm4378_send_ptb_chunk(struct bcm4377_data *bcm4377, -+ const void *data, size_t data_len, -+ u16 blocks_left) -+{ -+ struct bcm4378_hci_send_ptb_cmd cmd; -+ struct sk_buff *skb; -+ -+ if (data_len > BCM4378_PTB_CHUNK_SIZE) -+ return -EINVAL; -+ -+ memset(&cmd, 0, sizeof(cmd)); -+ cmd.blocks_left = cpu_to_le16(blocks_left); -+ memcpy(cmd.data, data, data_len); -+ -+ skb = __hci_cmd_sync(bcm4377->hdev, 0xfe0d, sizeof(cmd), &cmd, -+ HCI_INIT_TIMEOUT); -+ if (IS_ERR(skb)) -+ return PTR_ERR(skb); -+ -+ kfree_skb(skb); -+ return 0; -+} -+ -+static int bcm4378_send_ptb(struct bcm4377_data *bcm4377, -+ const struct firmware *fw) -+{ -+ size_t chunks = DIV_ROUND_UP(fw->size, (size_t)BCM4378_PTB_CHUNK_SIZE); -+ size_t i, left, transfer_len; -+ int ret; -+ -+ for (i = 0, left = fw->size; i < chunks; ++i, left -= transfer_len) { -+ transfer_len = min_t(size_t, left, BCM4378_PTB_CHUNK_SIZE); -+ -+ dev_dbg(&bcm4377->pdev->dev, "sending ptb chunk %zu/%zu\n", -+ i + 1, chunks); -+ ret = bcm4378_send_ptb_chunk( -+ bcm4377, fw->data + i * BCM4378_PTB_CHUNK_SIZE, -+ transfer_len, chunks - i - 1); -+ if (ret) { -+ dev_err(&bcm4377->pdev->dev, -+ "sending ptb chunk %zu failed (%d)", i, ret); -+ return ret; -+ } -+ } -+ -+ return 0; -+} -+ -+static int bcm4377_hci_open(struct hci_dev *hdev) -+{ -+ struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev); -+ int ret; -+ -+ dev_dbg(&bcm4377->pdev->dev, "creating rings\n"); -+ -+ ret = bcm4377_create_completion_ring(bcm4377, -+ &bcm4377->hci_acl_ack_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_create_completion_ring(bcm4377, -+ &bcm4377->hci_acl_event_ring); -+ if (ret) -+ goto destroy_hci_acl_ack; -+ ret = bcm4377_create_completion_ring(bcm4377, &bcm4377->sco_ack_ring); -+ if (ret) -+ goto destroy_hci_acl_event; -+ ret = bcm4377_create_completion_ring(bcm4377, &bcm4377->sco_event_ring); -+ if (ret) -+ goto destroy_sco_ack; -+ dev_dbg(&bcm4377->pdev->dev, -+ "all completion rings successfully created!\n"); -+ -+ ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring); -+ if (ret) -+ goto destroy_sco_event; -+ ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring); -+ if (ret) -+ goto destroy_hci_h2d; -+ ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring); -+ if (ret) -+ goto destroy_hci_d2h; -+ ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring); -+ if (ret) -+ goto destroy_sco_h2d; -+ ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring); -+ if (ret) -+ goto destroy_sco_d2h; -+ ret = bcm4377_create_transfer_ring(bcm4377, &bcm4377->acl_d2h_ring); -+ if (ret) -+ goto destroy_acl_h2d; -+ dev_dbg(&bcm4377->pdev->dev, -+ "all transfer rings successfully created!\n"); -+ -+ return 0; -+ -+destroy_acl_h2d: -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring); -+destroy_sco_d2h: -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring); -+destroy_sco_h2d: -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring); -+destroy_hci_d2h: -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring); -+destroy_hci_h2d: -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring); -+destroy_sco_event: -+ bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_event_ring); -+destroy_sco_ack: -+ bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_ack_ring); -+destroy_hci_acl_event: -+ bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_event_ring); -+destroy_hci_acl_ack: -+ bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_ack_ring); -+ -+ dev_err(&bcm4377->pdev->dev, "Creating rings failed with %d\n", ret); -+ return ret; -+} -+ -+static int bcm4377_hci_close(struct hci_dev *hdev) -+{ -+ struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev); -+ -+ dev_dbg(&bcm4377->pdev->dev, "destroying rings in hci_close\n"); -+ -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->acl_d2h_ring); -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring); -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring); -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring); -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring); -+ bcm4377_destroy_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring); -+ -+ bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_event_ring); -+ bcm4377_destroy_completion_ring(bcm4377, &bcm4377->sco_ack_ring); -+ bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_event_ring); -+ bcm4377_destroy_completion_ring(bcm4377, &bcm4377->hci_acl_ack_ring); -+ -+ return 0; -+} -+ -+static bool bcm4377_is_valid_bdaddr(struct bcm4377_data *bcm4377, -+ bdaddr_t *addr) -+{ -+ if (addr->b[0] != 0x93) -+ return true; -+ if (addr->b[1] != 0x76) -+ return true; -+ if (addr->b[2] != 0x00) -+ return true; -+ if (addr->b[4] != (bcm4377->hw->id & 0xff)) -+ return true; -+ if (addr->b[5] != (bcm4377->hw->id >> 8)) -+ return true; -+ return false; -+} -+ -+static int bcm4377_check_bdaddr(struct bcm4377_data *bcm4377) -+{ -+ struct hci_rp_read_bd_addr *bda; -+ struct sk_buff *skb; -+ -+ skb = __hci_cmd_sync(bcm4377->hdev, HCI_OP_READ_BD_ADDR, 0, NULL, -+ HCI_INIT_TIMEOUT); -+ if (IS_ERR(skb)) { -+ int err = PTR_ERR(skb); -+ -+ dev_err(&bcm4377->pdev->dev, "HCI_OP_READ_BD_ADDR failed (%d)", -+ err); -+ return err; -+ } -+ -+ if (skb->len != sizeof(*bda)) { -+ dev_err(&bcm4377->pdev->dev, -+ "HCI_OP_READ_BD_ADDR reply length invalid"); -+ kfree_skb(skb); -+ return -EIO; -+ } -+ -+ bda = (struct hci_rp_read_bd_addr *)skb->data; -+ if (!bcm4377_is_valid_bdaddr(bcm4377, &bda->bdaddr)) -+ set_bit(HCI_QUIRK_INVALID_BDADDR, &bcm4377->hdev->quirks); -+ -+ kfree_skb(skb); -+ return 0; -+} -+ -+static int bcm4377_hci_setup(struct hci_dev *hdev) -+{ -+ struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev); -+ const struct firmware *fw; -+ int ret; -+ -+ if (bcm4377->hw->send_calibration) { -+ ret = bcm4377->hw->send_calibration(bcm4377); -+ if (ret) -+ return ret; -+ } -+ -+ fw = bcm4377_request_blob(bcm4377, "ptb"); -+ if (!fw) { -+ dev_err(&bcm4377->pdev->dev, "failed to load PTB data"); -+ return -ENOENT; -+ } -+ -+ ret = bcm4377->hw->send_ptb(bcm4377, fw); -+ release_firmware(fw); -+ if (ret) -+ return ret; -+ -+ return bcm4377_check_bdaddr(bcm4377); -+} -+ -+static int bcm4377_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) -+{ -+ struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev); -+ struct bcm4377_transfer_ring *ring; -+ int ret; -+ -+ switch (hci_skb_pkt_type(skb)) { -+ case HCI_COMMAND_PKT: -+ hdev->stat.cmd_tx++; -+ ring = &bcm4377->hci_h2d_ring; -+ break; -+ -+ case HCI_ACLDATA_PKT: -+ hdev->stat.acl_tx++; -+ ring = &bcm4377->acl_h2d_ring; -+ break; -+ -+ case HCI_SCODATA_PKT: -+ hdev->stat.sco_tx++; -+ ring = &bcm4377->sco_h2d_ring; -+ break; -+ -+ default: -+ return -EILSEQ; -+ } -+ -+ ret = bcm4377_enqueue(bcm4377, ring, skb->data, skb->len, false); -+ if (ret < 0) { -+ hdev->stat.err_tx++; -+ return ret; -+ } -+ -+ hdev->stat.byte_tx += skb->len; -+ kfree_skb(skb); -+ return ret; -+} -+ -+static int bcm4377_hci_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr) -+{ -+ struct bcm4377_data *bcm4377 = hci_get_drvdata(hdev); -+ struct sk_buff *skb; -+ int err; -+ -+ skb = __hci_cmd_sync(hdev, 0xfc01, 6, bdaddr, HCI_INIT_TIMEOUT); -+ if (IS_ERR(skb)) { -+ err = PTR_ERR(skb); -+ dev_err(&bcm4377->pdev->dev, -+ "Change address command failed (%d)", err); -+ return err; -+ } -+ kfree_skb(skb); -+ -+ return 0; -+} -+ -+static int bcm4377_alloc_transfer_ring(struct bcm4377_data *bcm4377, -+ struct bcm4377_transfer_ring *ring) -+{ -+ size_t entry_size; -+ -+ spin_lock_init(&ring->lock); -+ ring->payload_size = ALIGN(ring->payload_size, 4); -+ ring->mapped_payload_size = ALIGN(ring->mapped_payload_size, 4); -+ -+ if (ring->payload_size > BCM4377_XFER_RING_MAX_INPLACE_PAYLOAD_SIZE) -+ return -EINVAL; -+ if (ring->n_entries > BCM4377_MAX_RING_SIZE) -+ return -EINVAL; -+ if (ring->virtual && ring->allow_wait) -+ return -EINVAL; -+ -+ if (ring->d2h_buffers_only) { -+ if (ring->virtual) -+ return -EINVAL; -+ if (ring->payload_size) -+ return -EINVAL; -+ if (!ring->mapped_payload_size) -+ return -EINVAL; -+ } -+ if (ring->virtual) -+ return 0; -+ -+ entry_size = -+ ring->payload_size + sizeof(struct bcm4377_xfer_ring_entry); -+ ring->ring = dmam_alloc_coherent(&bcm4377->pdev->dev, -+ ring->n_entries * entry_size, -+ &ring->ring_dma, GFP_KERNEL); -+ if (!ring->ring) -+ return -ENOMEM; -+ -+ if (ring->allow_wait) { -+ ring->events = devm_kcalloc(&bcm4377->pdev->dev, -+ ring->n_entries, -+ sizeof(*ring->events), GFP_KERNEL); -+ if (!ring->events) -+ return -ENOMEM; -+ } -+ -+ if (ring->mapped_payload_size) { -+ ring->payloads = dmam_alloc_coherent( -+ &bcm4377->pdev->dev, -+ ring->n_entries * ring->mapped_payload_size, -+ &ring->payloads_dma, GFP_KERNEL); -+ if (!ring->payloads) -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ -+static int bcm4377_alloc_completion_ring(struct bcm4377_data *bcm4377, -+ struct bcm4377_completion_ring *ring) -+{ -+ size_t entry_size; -+ -+ ring->payload_size = ALIGN(ring->payload_size, 4); -+ if (ring->payload_size > BCM4377_XFER_RING_MAX_INPLACE_PAYLOAD_SIZE) -+ return -EINVAL; -+ if (ring->n_entries > BCM4377_MAX_RING_SIZE) -+ return -EINVAL; -+ -+ entry_size = ring->payload_size + -+ sizeof(struct bcm4377_completion_ring_entry); -+ -+ ring->ring = dmam_alloc_coherent(&bcm4377->pdev->dev, -+ ring->n_entries * entry_size, -+ &ring->ring_dma, GFP_KERNEL); -+ if (!ring->ring) -+ return -ENOMEM; -+ return 0; -+} -+ -+static int bcm4377_init_context(struct bcm4377_data *bcm4377) -+{ -+ struct device *dev = &bcm4377->pdev->dev; -+ dma_addr_t peripheral_info_dma; -+ -+ bcm4377->ctx = dmam_alloc_coherent(dev, sizeof(*bcm4377->ctx), -+ &bcm4377->ctx_dma, GFP_KERNEL); -+ if (!bcm4377->ctx) -+ return -ENOMEM; -+ memset(bcm4377->ctx, 0, sizeof(*bcm4377->ctx)); -+ -+ bcm4377->ring_state = -+ dmam_alloc_coherent(dev, sizeof(*bcm4377->ring_state), -+ &bcm4377->ring_state_dma, GFP_KERNEL); -+ if (!bcm4377->ring_state) -+ return -ENOMEM; -+ memset(bcm4377->ring_state, 0, sizeof(*bcm4377->ring_state)); -+ -+ bcm4377->ctx->version = cpu_to_le16(1); -+ bcm4377->ctx->size = cpu_to_le16(sizeof(*bcm4377->ctx)); -+ bcm4377->ctx->enabled_caps = cpu_to_le16(2); -+ -+ /* -+ * The BT device will write 0x20 bytes of data to this buffer but -+ * the exact contents are unknown. It only needs to exist for BT -+ * to work such that we can just allocate and then ignore it. -+ */ -+ if (!dmam_alloc_coherent(&bcm4377->pdev->dev, 0x20, -+ &peripheral_info_dma, GFP_KERNEL)) -+ return -ENOMEM; -+ bcm4377->ctx->peripheral_info_addr = cpu_to_le64(peripheral_info_dma); -+ -+ bcm4377->ctx->xfer_ring_heads_addr = cpu_to_le64( -+ bcm4377->ring_state_dma + -+ offsetof(struct bcm4377_ring_state, xfer_ring_head)); -+ bcm4377->ctx->xfer_ring_tails_addr = cpu_to_le64( -+ bcm4377->ring_state_dma + -+ offsetof(struct bcm4377_ring_state, xfer_ring_tail)); -+ bcm4377->ctx->completion_ring_heads_addr = cpu_to_le64( -+ bcm4377->ring_state_dma + -+ offsetof(struct bcm4377_ring_state, completion_ring_head)); -+ bcm4377->ctx->completion_ring_tails_addr = cpu_to_le64( -+ bcm4377->ring_state_dma + -+ offsetof(struct bcm4377_ring_state, completion_ring_tail)); -+ -+ bcm4377->ctx->n_completion_rings = -+ cpu_to_le16(BCM4377_N_COMPLETION_RINGS); -+ bcm4377->ctx->n_xfer_rings = cpu_to_le16(BCM4377_N_TRANSFER_RINGS); -+ -+ bcm4377->ctx->control_completion_ring_addr = -+ cpu_to_le64(bcm4377->control_ack_ring.ring_dma); -+ bcm4377->ctx->control_completion_ring_n_entries = -+ cpu_to_le16(bcm4377->control_ack_ring.n_entries); -+ bcm4377->ctx->control_completion_ring_doorbell = cpu_to_le16(0xffff); -+ bcm4377->ctx->control_completion_ring_msi = 0; -+ bcm4377->ctx->control_completion_ring_header_size = 0; -+ bcm4377->ctx->control_completion_ring_footer_size = 0; -+ -+ bcm4377->ctx->control_xfer_ring_addr = -+ cpu_to_le64(bcm4377->control_h2d_ring.ring_dma); -+ bcm4377->ctx->control_xfer_ring_n_entries = -+ cpu_to_le16(bcm4377->control_h2d_ring.n_entries); -+ bcm4377->ctx->control_xfer_ring_doorbell = -+ cpu_to_le16(bcm4377->control_h2d_ring.doorbell); -+ bcm4377->ctx->control_xfer_ring_msi = 0; -+ bcm4377->ctx->control_xfer_ring_header_size = 0; -+ bcm4377->ctx->control_xfer_ring_footer_size = -+ bcm4377->control_h2d_ring.payload_size / 4; -+ -+ dev_dbg(&bcm4377->pdev->dev, "context initialized at IOVA %pad", -+ &bcm4377->ctx_dma); -+ -+ return 0; -+} -+ -+static int bcm4377_prepare_rings(struct bcm4377_data *bcm4377) -+{ -+ int ret; -+ -+ /* -+ * Even though many of these settings appear to be configurable -+ * when sending the "create ring" messages most of these are -+ * actually hardcoded in some (and quite possibly all) firmware versions -+ * and changing them on the host has no effect. -+ * Specifically, this applies to at least the doorbells, the transfer -+ * and completion ring ids and their mapping (e.g. both HCI and ACL -+ * entries will always be queued in completion rings 1 and 2 no matter -+ * what we configure here). -+ */ -+ bcm4377->control_ack_ring.ring_id = BCM4377_ACK_RING_CONTROL; -+ bcm4377->control_ack_ring.n_entries = 32; -+ bcm4377->control_ack_ring.transfer_rings = -+ BIT(BCM4377_XFER_RING_CONTROL); -+ -+ bcm4377->hci_acl_ack_ring.ring_id = BCM4377_ACK_RING_HCI_ACL; -+ bcm4377->hci_acl_ack_ring.n_entries = 2 * BCM4377_RING_N_ENTRIES; -+ bcm4377->hci_acl_ack_ring.transfer_rings = -+ BIT(BCM4377_XFER_RING_HCI_H2D) | BIT(BCM4377_XFER_RING_ACL_H2D); -+ bcm4377->hci_acl_ack_ring.delay = 1000; -+ -+ /* -+ * A payload size of MAX_EVENT_PAYLOAD_SIZE is enough here since large -+ * ACL packets will be transmitted inside buffers mapped via -+ * acl_d2h_ring anyway. -+ */ -+ bcm4377->hci_acl_event_ring.ring_id = BCM4377_EVENT_RING_HCI_ACL; -+ bcm4377->hci_acl_event_ring.payload_size = MAX_EVENT_PAYLOAD_SIZE; -+ bcm4377->hci_acl_event_ring.n_entries = 2 * BCM4377_RING_N_ENTRIES; -+ bcm4377->hci_acl_event_ring.transfer_rings = -+ BIT(BCM4377_XFER_RING_HCI_D2H) | BIT(BCM4377_XFER_RING_ACL_D2H); -+ bcm4377->hci_acl_event_ring.delay = 1000; -+ -+ bcm4377->sco_ack_ring.ring_id = BCM4377_ACK_RING_SCO; -+ bcm4377->sco_ack_ring.n_entries = BCM4377_RING_N_ENTRIES; -+ bcm4377->sco_ack_ring.transfer_rings = BIT(BCM4377_XFER_RING_SCO_H2D); -+ -+ bcm4377->sco_event_ring.ring_id = BCM4377_EVENT_RING_SCO; -+ bcm4377->sco_event_ring.payload_size = MAX_SCO_PAYLOAD_SIZE; -+ bcm4377->sco_event_ring.n_entries = BCM4377_RING_N_ENTRIES; -+ bcm4377->sco_event_ring.transfer_rings = BIT(BCM4377_XFER_RING_SCO_D2H); -+ -+ bcm4377->control_h2d_ring.ring_id = BCM4377_XFER_RING_CONTROL; -+ bcm4377->control_h2d_ring.doorbell = BCM4377_DOORBELL_CONTROL; -+ bcm4377->control_h2d_ring.payload_size = BCM4377_CONTROL_MSG_SIZE; -+ bcm4377->control_h2d_ring.completion_ring = BCM4377_ACK_RING_CONTROL; -+ bcm4377->control_h2d_ring.allow_wait = true; -+ bcm4377->control_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES; -+ -+ bcm4377->hci_h2d_ring.ring_id = BCM4377_XFER_RING_HCI_H2D; -+ bcm4377->hci_h2d_ring.doorbell = BCM4377_DOORBELL_HCI_H2D; -+ bcm4377->hci_h2d_ring.payload_size = MAX_EVENT_PAYLOAD_SIZE; -+ bcm4377->hci_h2d_ring.completion_ring = BCM4377_ACK_RING_HCI_ACL; -+ bcm4377->hci_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES; -+ -+ bcm4377->hci_d2h_ring.ring_id = BCM4377_XFER_RING_HCI_D2H; -+ bcm4377->hci_d2h_ring.doorbell = BCM4377_DOORBELL_HCI_D2H; -+ bcm4377->hci_d2h_ring.completion_ring = BCM4377_EVENT_RING_HCI_ACL; -+ bcm4377->hci_d2h_ring.virtual = true; -+ bcm4377->hci_d2h_ring.n_entries = BCM4377_RING_N_ENTRIES; -+ -+ bcm4377->sco_h2d_ring.ring_id = BCM4377_XFER_RING_SCO_H2D; -+ bcm4377->sco_h2d_ring.doorbell = BCM4377_DOORBELL_SCO; -+ bcm4377->sco_h2d_ring.payload_size = MAX_SCO_PAYLOAD_SIZE; -+ bcm4377->sco_h2d_ring.completion_ring = BCM4377_ACK_RING_SCO; -+ bcm4377->sco_h2d_ring.sync = true; -+ bcm4377->sco_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES; -+ -+ bcm4377->sco_d2h_ring.ring_id = BCM4377_XFER_RING_SCO_D2H; -+ bcm4377->sco_d2h_ring.doorbell = BCM4377_DOORBELL_SCO; -+ bcm4377->sco_d2h_ring.completion_ring = BCM4377_EVENT_RING_SCO; -+ bcm4377->sco_d2h_ring.virtual = true; -+ bcm4377->sco_d2h_ring.sync = true; -+ bcm4377->sco_d2h_ring.n_entries = BCM4377_RING_N_ENTRIES; -+ -+ /* -+ * This ring has to use mapped_payload_size because the largest ACL -+ * packet doesn't fit inside the largest possible footer -+ */ -+ bcm4377->acl_h2d_ring.ring_id = BCM4377_XFER_RING_ACL_H2D; -+ bcm4377->acl_h2d_ring.doorbell = BCM4377_DOORBELL_ACL_H2D; -+ bcm4377->acl_h2d_ring.mapped_payload_size = MAX_ACL_PAYLOAD_SIZE; -+ bcm4377->acl_h2d_ring.completion_ring = BCM4377_ACK_RING_HCI_ACL; -+ bcm4377->acl_h2d_ring.n_entries = BCM4377_RING_N_ENTRIES; -+ -+ /* -+ * This ring only contains empty buffers to be used by incoming -+ * ACL packets that do not fit inside the footer of hci_acl_event_ring -+ */ -+ bcm4377->acl_d2h_ring.ring_id = BCM4377_XFER_RING_ACL_D2H; -+ bcm4377->acl_d2h_ring.doorbell = BCM4377_DOORBELL_ACL_D2H; -+ bcm4377->acl_d2h_ring.completion_ring = BCM4377_EVENT_RING_HCI_ACL; -+ bcm4377->acl_d2h_ring.d2h_buffers_only = true; -+ bcm4377->acl_d2h_ring.mapped_payload_size = MAX_ACL_PAYLOAD_SIZE; -+ bcm4377->acl_d2h_ring.n_entries = BCM4377_RING_N_ENTRIES; -+ -+ /* -+ * no need for any cleanup since this is only called from _probe -+ * and only devres-managed allocations are used -+ */ -+ ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->control_h2d_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->hci_h2d_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->hci_d2h_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->sco_h2d_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->sco_d2h_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->acl_h2d_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_alloc_transfer_ring(bcm4377, &bcm4377->acl_d2h_ring); -+ if (ret) -+ return ret; -+ -+ ret = bcm4377_alloc_completion_ring(bcm4377, -+ &bcm4377->control_ack_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_alloc_completion_ring(bcm4377, -+ &bcm4377->hci_acl_ack_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_alloc_completion_ring(bcm4377, -+ &bcm4377->hci_acl_event_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_alloc_completion_ring(bcm4377, &bcm4377->sco_ack_ring); -+ if (ret) -+ return ret; -+ ret = bcm4377_alloc_completion_ring(bcm4377, &bcm4377->sco_event_ring); -+ if (ret) -+ return ret; -+ -+ dev_dbg(&bcm4377->pdev->dev, "all rings allocated and prepared\n"); -+ -+ return 0; -+} -+ -+static int bcm4377_boot(struct bcm4377_data *bcm4377) -+{ -+ const struct firmware *fw; -+ void *bfr; -+ dma_addr_t fw_dma; -+ int ret = 0; -+ u32 bootstage, rti_status; -+ -+ bootstage = ioread32(bcm4377->bar2 + BCM4377_BAR2_BOOTSTAGE); -+ rti_status = ioread32(bcm4377->bar2 + BCM4377_BAR2_RTI_STATUS); -+ -+ if (bootstage != 0) { -+ dev_err(&bcm4377->pdev->dev, "bootstage is %d and not 0\n", -+ bootstage); -+ return -EINVAL; -+ } -+ -+ if (rti_status != 0) { -+ dev_err(&bcm4377->pdev->dev, "RTI status is %d and not 0\n", -+ rti_status); -+ return -EINVAL; -+ } -+ -+ fw = bcm4377_request_blob(bcm4377, "bin"); -+ if (!fw) { -+ dev_err(&bcm4377->pdev->dev, "Failed to load firmware\n"); -+ return -ENOENT; -+ } -+ -+ bfr = dma_alloc_coherent(&bcm4377->pdev->dev, fw->size, &fw_dma, -+ GFP_KERNEL); -+ if (!bfr) { -+ ret = -ENOMEM; -+ goto out_release_fw; -+ } -+ -+ memcpy(bfr, fw->data, fw->size); -+ -+ iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_LO); -+ iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_HI); -+ iowrite32(BCM4377_DMA_MASK, -+ bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_SIZE); -+ -+ iowrite32(lower_32_bits(fw_dma), bcm4377->bar2 + BCM4377_BAR2_FW_LO); -+ iowrite32(upper_32_bits(fw_dma), bcm4377->bar2 + BCM4377_BAR2_FW_HI); -+ iowrite32(fw->size, bcm4377->bar2 + BCM4377_BAR2_FW_SIZE); -+ iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_FW_DOORBELL); -+ -+ dev_dbg(&bcm4377->pdev->dev, "waiting for firmware to boot\n"); -+ -+ ret = wait_for_completion_interruptible_timeout(&bcm4377->event, -+ BCM4377_TIMEOUT); -+ if (ret == 0) { -+ ret = -ETIMEDOUT; -+ goto out_dma_free; -+ } else if (ret < 0) { -+ goto out_dma_free; -+ } -+ -+ if (bcm4377->bootstage != 2) { -+ dev_err(&bcm4377->pdev->dev, "boostage %d != 2\n", -+ bcm4377->bootstage); -+ ret = -ENXIO; -+ goto out_dma_free; -+ } -+ -+ dev_dbg(&bcm4377->pdev->dev, "firmware has booted (stage = %x)\n", -+ bcm4377->bootstage); -+ ret = 0; -+ -+out_dma_free: -+ dma_free_coherent(&bcm4377->pdev->dev, fw->size, bfr, fw_dma); -+out_release_fw: -+ release_firmware(fw); -+ return ret; -+} -+ -+static int bcm4377_setup_rti(struct bcm4377_data *bcm4377) -+{ -+ int ret; -+ -+ dev_dbg(&bcm4377->pdev->dev, "starting RTI\n"); -+ iowrite32(1, bcm4377->bar0 + BCM4377_BAR0_RTI_CONTROL); -+ -+ ret = wait_for_completion_interruptible_timeout(&bcm4377->event, -+ BCM4377_TIMEOUT); -+ if (ret == 0) { -+ dev_err(&bcm4377->pdev->dev, -+ "timed out while waiting for RTI to transition to state 1"); -+ return -ETIMEDOUT; -+ } else if (ret < 0) { -+ return ret; -+ } -+ -+ if (bcm4377->rti_status != 1) { -+ dev_err(&bcm4377->pdev->dev, "RTI did not ack state 1 (%d)\n", -+ bcm4377->rti_status); -+ return -ENODEV; -+ } -+ dev_dbg(&bcm4377->pdev->dev, "RTI is in state 1\n"); -+ -+ /* allow access to the entire IOVA space again */ -+ iowrite32(0, bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_LO); -+ iowrite32(0, bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_HI); -+ iowrite32(BCM4377_DMA_MASK, -+ bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_SIZE); -+ -+ /* setup "Converged IPC" context */ -+ iowrite32(lower_32_bits(bcm4377->ctx_dma), -+ bcm4377->bar2 + BCM4377_BAR2_CONTEXT_ADDR_LO); -+ iowrite32(upper_32_bits(bcm4377->ctx_dma), -+ bcm4377->bar2 + BCM4377_BAR2_CONTEXT_ADDR_HI); -+ iowrite32(2, bcm4377->bar0 + BCM4377_BAR0_RTI_CONTROL); -+ -+ ret = wait_for_completion_interruptible_timeout(&bcm4377->event, -+ BCM4377_TIMEOUT); -+ if (ret == 0) { -+ dev_err(&bcm4377->pdev->dev, -+ "timed out while waiting for RTI to transition to state 2"); -+ return -ETIMEDOUT; -+ } else if (ret < 0) { -+ return ret; -+ } -+ -+ if (bcm4377->rti_status != 2) { -+ dev_err(&bcm4377->pdev->dev, "RTI did not ack state 2 (%d)\n", -+ bcm4377->rti_status); -+ return -ENODEV; -+ } -+ -+ dev_dbg(&bcm4377->pdev->dev, -+ "RTI is in state 2; control ring is ready\n"); -+ bcm4377->control_ack_ring.enabled = true; -+ -+ return 0; -+} -+ -+static int bcm4377_parse_otp_board_params(struct bcm4377_data *bcm4377, -+ char tag, const char *val, size_t len) -+{ -+ if (tag != 'V') -+ return 0; -+ if (len >= sizeof(bcm4377->vendor)) -+ return -EINVAL; -+ -+ strscpy(bcm4377->vendor, val, len + 1); -+ return 0; -+} -+ -+static int bcm4377_parse_otp_chip_params(struct bcm4377_data *bcm4377, char tag, -+ const char *val, size_t len) -+{ -+ size_t idx = 0; -+ -+ if (tag != 's') -+ return 0; -+ if (len >= sizeof(bcm4377->stepping)) -+ return -EINVAL; -+ -+ while (len != 0) { -+ bcm4377->stepping[idx] = tolower(val[idx]); -+ if (val[idx] == '\0') -+ return 0; -+ -+ idx++; -+ len--; -+ } -+ -+ bcm4377->stepping[idx] = '\0'; -+ return 0; -+} -+ -+static int bcm4377_parse_otp_str(struct bcm4377_data *bcm4377, const u8 *str, -+ enum bcm4377_otp_params_type type) -+{ -+ const char *p; -+ int ret; -+ -+ p = skip_spaces(str); -+ while (*p) { -+ char tag = *p++; -+ const char *end; -+ size_t len; -+ -+ if (*p++ != '=') /* implicit NUL check */ -+ return -EINVAL; -+ -+ /* *p might be NUL here, if so end == p and len == 0 */ -+ end = strchrnul(p, ' '); -+ len = end - p; -+ -+ /* leave 1 byte for NUL in destination string */ -+ if (len > (BCM4377_OTP_MAX_PARAM_LEN - 1)) -+ return -EINVAL; -+ -+ switch (type) { -+ case BCM4377_OTP_BOARD_PARAMS: -+ ret = bcm4377_parse_otp_board_params(bcm4377, tag, p, -+ len); -+ break; -+ case BCM4377_OTP_CHIP_PARAMS: -+ ret = bcm4377_parse_otp_chip_params(bcm4377, tag, p, -+ len); -+ break; -+ default: -+ ret = -EINVAL; -+ break; -+ } -+ -+ if (ret) -+ return ret; -+ -+ /* Skip to next arg, if any */ -+ p = skip_spaces(end); -+ } -+ -+ return 0; -+} -+ -+static int bcm4377_parse_otp_sys_vendor(struct bcm4377_data *bcm4377, u8 *otp, -+ size_t size) -+{ -+ int idx = 4; -+ const char *chip_params; -+ const char *board_params; -+ int ret; -+ -+ /* 4-byte header and two empty strings */ -+ if (size < 6) -+ return -EINVAL; -+ -+ if (get_unaligned_le32(otp) != BCM4377_OTP_VENDOR_HDR) -+ return -EINVAL; -+ -+ chip_params = &otp[idx]; -+ -+ /* Skip first string, including terminator */ -+ idx += strnlen(chip_params, size - idx) + 1; -+ if (idx >= size) -+ return -EINVAL; -+ -+ board_params = &otp[idx]; -+ -+ /* Skip to terminator of second string */ -+ idx += strnlen(board_params, size - idx); -+ if (idx >= size) -+ return -EINVAL; -+ -+ /* At this point both strings are guaranteed NUL-terminated */ -+ dev_dbg(&bcm4377->pdev->dev, -+ "OTP: chip_params='%s' board_params='%s'\n", chip_params, -+ board_params); -+ -+ ret = bcm4377_parse_otp_str(bcm4377, chip_params, -+ BCM4377_OTP_CHIP_PARAMS); -+ if (ret) -+ return ret; -+ -+ ret = bcm4377_parse_otp_str(bcm4377, board_params, -+ BCM4377_OTP_BOARD_PARAMS); -+ if (ret) -+ return ret; -+ -+ if (!bcm4377->stepping[0] || !bcm4377->vendor[0]) -+ return -EINVAL; -+ -+ dev_dbg(&bcm4377->pdev->dev, "OTP: stepping=%s, vendor=%s\n", -+ bcm4377->stepping, bcm4377->vendor); -+ return 0; -+} -+ -+static int bcm4377_parse_otp(struct bcm4377_data *bcm4377) -+{ -+ u8 otp[BCM4377_OTP_SIZE]; -+ int i; -+ int ret = -ENOENT; -+ -+ for (i = 0; i < BCM4377_OTP_SIZE; ++i) -+ otp[i] = ioread8(bcm4377->bar0 + bcm4377->hw->otp_offset + i); -+ -+ i = 0; -+ while (i < (BCM4377_OTP_SIZE - 1)) { -+ u8 type = otp[i]; -+ u8 length = otp[i + 1]; -+ -+ if (type == 0) -+ break; -+ -+ if ((i + 2 + length) > BCM4377_OTP_SIZE) -+ break; -+ -+ switch (type) { -+ case BCM4377_OTP_SYS_VENDOR: -+ dev_dbg(&bcm4377->pdev->dev, -+ "OTP @ 0x%x (%d): SYS_VENDOR", i, length); -+ ret = bcm4377_parse_otp_sys_vendor(bcm4377, &otp[i + 2], -+ length); -+ break; -+ case BCM4377_OTP_CIS: -+ dev_dbg(&bcm4377->pdev->dev, "OTP @ 0x%x (%d): CIS", i, -+ length); -+ break; -+ default: -+ dev_dbg(&bcm4377->pdev->dev, "OTP @ 0x%x (%d): unknown", -+ i, length); -+ break; -+ } -+ -+ i += 2 + length; -+ } -+ -+ return ret; -+} -+ -+static int bcm4377_init_cfg(struct bcm4377_data *bcm4377) -+{ -+ int ret; -+ u32 ctrl; -+ -+ ret = pci_write_config_dword(bcm4377->pdev, -+ BCM4377_PCIECFG_BAR0_WINDOW1, -+ bcm4377->hw->bar0_window1); -+ if (ret) -+ return ret; -+ -+ ret = pci_write_config_dword(bcm4377->pdev, -+ BCM4377_PCIECFG_BAR0_WINDOW2, -+ bcm4377->hw->bar0_window2); -+ if (ret) -+ return ret; -+ -+ ret = pci_write_config_dword( -+ bcm4377->pdev, BCM4377_PCIECFG_BAR0_CORE2_WINDOW1, -+ BCM4377_PCIECFG_BAR0_CORE2_WINDOW1_DEFAULT); -+ if (ret) -+ return ret; -+ -+ if (bcm4377->hw->has_bar0_core2_window2) { -+ ret = pci_write_config_dword(bcm4377->pdev, -+ BCM4377_PCIECFG_BAR0_CORE2_WINDOW2, -+ bcm4377->hw->bar0_core2_window2); -+ if (ret) -+ return ret; -+ } -+ -+ ret = pci_write_config_dword(bcm4377->pdev, BCM4377_PCIECFG_BAR2_WINDOW, -+ BCM4377_PCIECFG_BAR2_WINDOW_DEFAULT); -+ if (ret) -+ return ret; -+ -+ ret = pci_read_config_dword(bcm4377->pdev, -+ BCM4377_PCIECFG_SUBSYSTEM_CTRL, &ctrl); -+ if (ret) -+ return ret; -+ -+ if (bcm4377->hw->clear_pciecfg_subsystem_ctrl_bit19) -+ ctrl &= ~BIT(19); -+ ctrl |= BIT(16); -+ -+ return pci_write_config_dword(bcm4377->pdev, -+ BCM4377_PCIECFG_SUBSYSTEM_CTRL, ctrl); -+} -+ -+static int bcm4377_probe_of(struct bcm4377_data *bcm4377) -+{ -+ struct device_node *np = bcm4377->pdev->dev.of_node; -+ int ret; -+ -+ if (!np) -+ return 0; -+ -+ ret = of_property_read_string(np, "brcm,board-type", -+ &bcm4377->board_type); -+ if (ret) { -+ dev_err(&bcm4377->pdev->dev, "no brcm,board-type property\n"); -+ return ret; -+ } -+ -+ bcm4377->taurus_beamforming_cal_blob = -+ of_get_property(np, "brcm,taurus-bf-cal-blob", -+ &bcm4377->taurus_beamforming_cal_size); -+ if (!bcm4377->taurus_beamforming_cal_blob) { -+ dev_err(&bcm4377->pdev->dev, -+ "no brcm,taurus-bf-cal-blob property\n"); -+ return -ENOENT; -+ } -+ bcm4377->taurus_cal_blob = of_get_property(np, "brcm,taurus-cal-blob", -+ &bcm4377->taurus_cal_size); -+ if (!bcm4377->taurus_cal_blob) { -+ dev_err(&bcm4377->pdev->dev, -+ "no brcm,taurus-cal-blob property\n"); -+ return -ENOENT; -+ } -+ -+ return 0; -+} -+ -+static void bcm4377_disable_aspm(struct bcm4377_data *bcm4377) -+{ -+ pci_disable_link_state(bcm4377->pdev, -+ PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1); -+ -+ /* -+ * pci_disable_link_state can fail if either CONFIG_PCIEASPM is disabled -+ * or if the BIOS hasn't handed over control to us. We must *always* -+ * disable ASPM for this device due to hardware errata though. -+ */ -+ pcie_capability_clear_word(bcm4377->pdev, PCI_EXP_LNKCTL, -+ PCI_EXP_LNKCTL_ASPMC); -+} -+ -+static void bcm4377_pci_free_irq_vectors(void *data) -+{ -+ pci_free_irq_vectors(data); -+} -+ -+static void bcm4377_hci_free_dev(void *data) -+{ -+ hci_free_dev(data); -+} -+ -+static void bcm4377_hci_unregister_dev(void *data) -+{ -+ hci_unregister_dev(data); -+} -+ -+static int bcm4377_probe(struct pci_dev *pdev, const struct pci_device_id *id) -+{ -+ struct bcm4377_data *bcm4377; -+ struct hci_dev *hdev; -+ int ret, irq; -+ -+ ret = dma_set_mask_and_coherent(&pdev->dev, BCM4377_DMA_MASK); -+ if (ret) -+ return ret; -+ -+ bcm4377 = devm_kzalloc(&pdev->dev, sizeof(*bcm4377), GFP_KERNEL); -+ if (!bcm4377) -+ return -ENOMEM; -+ -+ bcm4377->pdev = pdev; -+ bcm4377->hw = &bcm4377_hw_variants[id->driver_data]; -+ init_completion(&bcm4377->event); -+ -+ ret = bcm4377_prepare_rings(bcm4377); -+ if (ret) -+ return ret; -+ -+ ret = bcm4377_init_context(bcm4377); -+ if (ret) -+ return ret; -+ -+ bcm4377->board_type = bcm4377->hw->board_type; -+ ret = bcm4377_probe_of(bcm4377); -+ if (ret) -+ return ret; -+ if (!bcm4377->board_type) { -+ dev_err(&pdev->dev, "unable to determine board type\n"); -+ return ret; -+ } -+ -+ ret = pci_reset_function_locked(pdev); -+ if (ret) -+ dev_warn( -+ &pdev->dev, -+ "function level reset failed with %d; trying to continue anyway\n", -+ ret); -+ -+ /* -+ * If this number is too low and we try to access any BAR too -+ * early the device will crash. Experiments have shown that -+ * approximately 50 msec is the minimum amount we have to wait. -+ * Let's double that to be safe. -+ */ -+ msleep(100); -+ -+ if (bcm4377->hw->disable_aspm) -+ bcm4377_disable_aspm(bcm4377); -+ -+ ret = pci_enable_device(pdev); -+ if (ret) -+ return ret; -+ pci_set_master(pdev); -+ -+ ret = bcm4377_init_cfg(bcm4377); -+ if (ret) -+ return ret; -+ -+ bcm4377->bar0 = pcim_iomap(pdev, 0, 0); -+ if (!bcm4377->bar0) -+ return -EBUSY; -+ bcm4377->bar2 = pcim_iomap(pdev, 2, 0); -+ if (!bcm4377->bar2) -+ return -EBUSY; -+ -+ ret = bcm4377_parse_otp(bcm4377); -+ if (ret) { -+ dev_err(&pdev->dev, "Reading OTP failed with %d\n", ret); -+ return ret; -+ } -+ -+ /* -+ * Legacy interrupts result in an IRQ storm because we don't know where -+ * the interrupt mask and status registers for these chips are. -+ * MSIs are acked automatically instead. -+ */ -+ ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI); -+ if (ret < 0) -+ return -ENODEV; -+ ret = devm_add_action_or_reset(&pdev->dev, bcm4377_pci_free_irq_vectors, -+ pdev); -+ if (ret) -+ return ret; -+ -+ irq = pci_irq_vector(pdev, 0); -+ if (irq <= 0) -+ return -ENODEV; -+ -+ ret = devm_request_irq(&pdev->dev, irq, bcm4377_irq, 0, "bcm4377", -+ bcm4377); -+ if (ret) -+ return ret; -+ -+ hdev = hci_alloc_dev(); -+ if (!hdev) -+ return -ENOMEM; -+ ret = devm_add_action_or_reset(&pdev->dev, bcm4377_hci_free_dev, hdev); -+ if (ret) -+ return ret; -+ -+ bcm4377->hdev = hdev; -+ -+ hdev->bus = HCI_PCI; -+ hdev->dev_type = HCI_PRIMARY; -+ hdev->open = bcm4377_hci_open; -+ hdev->close = bcm4377_hci_close; -+ hdev->send = bcm4377_hci_send_frame; -+ hdev->set_bdaddr = bcm4377_hci_set_bdaddr; -+ hdev->setup = bcm4377_hci_setup; -+ -+ set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks); -+ if (bcm4377->hw->broken_ext_scan) -+ set_bit(HCI_QUIRK_BROKEN_EXT_SCAN, &hdev->quirks); -+ if (bcm4377->hw->fixup_le_ext_adv_report_evt_type) -+ set_bit(HCI_QUIRK_FIXUP_LE_EXT_ADV_REPORT_EVT_TYPE, -+ &hdev->quirks); -+ -+ pci_set_drvdata(pdev, bcm4377); -+ hci_set_drvdata(hdev, bcm4377); -+ SET_HCIDEV_DEV(hdev, &pdev->dev); -+ -+ ret = bcm4377_boot(bcm4377); -+ if (ret) -+ return ret; -+ -+ ret = bcm4377_setup_rti(bcm4377); -+ if (ret) -+ return ret; -+ -+ ret = hci_register_dev(hdev); -+ if (ret) -+ return ret; -+ return devm_add_action_or_reset(&pdev->dev, bcm4377_hci_unregister_dev, -+ hdev); -+} -+ -+static int bcm4377_suspend(struct pci_dev *pdev, pm_message_t state) -+{ -+ struct bcm4377_data *bcm4377 = pci_get_drvdata(pdev); -+ int ret; -+ -+ ret = hci_suspend_dev(bcm4377->hdev); -+ if (ret) -+ return ret; -+ -+ iowrite32(BCM4377_BAR0_SLEEP_CONTROL_QUIESCED, -+ bcm4377->bar0 + BCM4377_BAR0_SLEEP_CONTROL); -+ -+ return 0; -+} -+ -+static int bcm4377_resume(struct pci_dev *pdev) -+{ -+ struct bcm4377_data *bcm4377 = pci_get_drvdata(pdev); -+ -+ iowrite32(BCM4377_BAR0_SLEEP_CONTROL_AWAKE, -+ bcm4377->bar0 + BCM4377_BAR0_SLEEP_CONTROL); -+ -+ return hci_resume_dev(bcm4377->hdev); -+} -+ -+static const struct bcm4377_hw bcm4377_hw_variants[] = { -+ [BCM4377] = { -+ .id = 0x4377, -+ .otp_offset = 0x4120, -+ .bar0_window1 = 0x1800b000, -+ .bar0_window2 = 0x1810c000, -+ .board_type = "apple,formosa", -+ .disable_aspm = true, -+ .broken_ext_scan = true, -+ .send_ptb = bcm4377_send_ptb, -+ }, -+ -+ [BCM4378] = { -+ .id = 0x4378, -+ .otp_offset = 0x4120, -+ .bar0_window1 = 0x18002000, -+ .bar0_window2 = 0x1810a000, -+ .bar0_core2_window2 = 0x18107000, -+ .has_bar0_core2_window2 = true, -+ .fixup_le_ext_adv_report_evt_type = true, -+ .send_calibration = bcm4378_send_calibration, -+ .send_ptb = bcm4378_send_ptb, -+ }, -+ -+ [BCM4387] = { -+ .id = 0x4387, -+ .otp_offset = 0x413c, -+ .bar0_window1 = 0x18002000, -+ .bar0_window2 = 0x18109000, -+ .bar0_core2_window2 = 0x18106000, -+ .has_bar0_core2_window2 = true, -+ .clear_pciecfg_subsystem_ctrl_bit19 = true, -+ .fixup_le_ext_adv_report_evt_type = true, -+ .send_calibration = bcm4387_send_calibration, -+ .send_ptb = bcm4378_send_ptb, -+ }, -+}; -+ -+#define BCM4377_DEVID_ENTRY(id) \ -+ { \ -+ PCI_VENDOR_ID_BROADCOM, BCM##id##_DEVICE_ID, PCI_ANY_ID, \ -+ PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, \ -+ BCM##id \ -+ } -+ -+static const struct pci_device_id bcm4377_devid_table[] = { -+ BCM4377_DEVID_ENTRY(4377), -+ BCM4377_DEVID_ENTRY(4378), -+ BCM4377_DEVID_ENTRY(4387), -+ {}, -+}; -+MODULE_DEVICE_TABLE(pci, bcm4377_devid_table); -+ -+static struct pci_driver bcm4377_pci_driver = { -+ .name = "hci_bcm4377", -+ .id_table = bcm4377_devid_table, -+ .probe = bcm4377_probe, -+ .suspend = bcm4377_suspend, -+ .resume = bcm4377_resume, -+}; -+module_pci_driver(bcm4377_pci_driver); -+ -+MODULE_AUTHOR("Sven Peter "); -+MODULE_DESCRIPTION("Bluetooth support for Broadcom 4377/4378/4387 PCIe devices"); -+MODULE_LICENSE("Dual MIT/GPL"); -+MODULE_FIRMWARE("brcm/brcmbt4377*.bin"); -+MODULE_FIRMWARE("brcm/brcmbt4377*.ptb"); -+MODULE_FIRMWARE("brcm/brcmbt4378*.bin"); -+MODULE_FIRMWARE("brcm/brcmbt4378*.ptb"); -+MODULE_FIRMWARE("brcm/brcmbt4387*.bin"); -+MODULE_FIRMWARE("brcm/brcmbt4387*.ptb"); --- -2.34.1 - diff --git a/target/linux/silicon/patches-5.19/0171-Makefile-Add-asahi-EXTRAVERSION.patch b/target/linux/silicon/patches-5.19/0171-Makefile-Add-asahi-EXTRAVERSION.patch deleted file mode 100644 index fc43aae1d..000000000 --- a/target/linux/silicon/patches-5.19/0171-Makefile-Add-asahi-EXTRAVERSION.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 487be23db1706c5e323031169e0ec79995513928 Mon Sep 17 00:00:00 2001 -From: Hector Martin -Date: Thu, 2 Dec 2021 20:37:25 +0900 -Subject: [PATCH 171/171] Makefile: Add -asahi EXTRAVERSION - -Signed-off-by: Hector Martin ---- - Makefile | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/Makefile b/Makefile -index df92892325ae..548debd24182 100644 ---- a/Makefile -+++ b/Makefile -@@ -18,6 +18,8 @@ $(if $(filter __%, $(MAKECMDGOALS)), \ - PHONY := __all - __all: - -+EXTRAVERSION := $(EXTRAVERSION)-asahi -+ - # We are using a recursive build, so we need to do a little thinking - # to get the ordering right. - # --- -2.34.1 - diff --git a/target/linux/x86/64/config-5.19 b/target/linux/x86/64/config-5.19 deleted file mode 100644 index 56ff80b1e..000000000 --- a/target/linux/x86/64/config-5.19 +++ /dev/null @@ -1,530 +0,0 @@ -CONFIG_64BIT=y -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -# CONFIG_ACPI_BGRT is not set -CONFIG_ACPI_BUTTON=y -# CONFIG_ACPI_CMPC is not set -CONFIG_ACPI_CONTAINER=y -CONFIG_ACPI_CPPC_LIB=y -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -CONFIG_ACPI_FAN=y -# CONFIG_ACPI_FPDT is not set -CONFIG_ACPI_HOTPLUG_CPU=y -CONFIG_ACPI_HOTPLUG_IOAPIC=y -# CONFIG_ACPI_I2C_OPREGION is not set -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -CONFIG_ACPI_LPIT=y -# CONFIG_ACPI_PCC is not set -# CONFIG_ACPI_PCI_SLOT is not set -# CONFIG_ACPI_PFRUT is not set -CONFIG_ACPI_PRMT=y -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -# CONFIG_ACPI_TAD is not set -CONFIG_ACPI_THERMAL=y -CONFIG_ACPI_VIDEO=y -# CONFIG_ACPI_WMI is not set -# CONFIG_ACRN_GUEST is not set -CONFIG_AGP=y -# CONFIG_AGP_AMD64 is not set -CONFIG_AGP_INTEL=y -# CONFIG_AGP_SIS is not set -# CONFIG_AGP_VIA is not set -# CONFIG_AMD_HSMP is not set -# CONFIG_AMD_PMC is not set -# CONFIG_AMD_PTDMA is not set -# CONFIG_AMD_SFH_HID is not set -CONFIG_ARCH_CPUIDLE_HALTPOLL=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -CONFIG_ARCH_MMAP_RND_BITS=28 -CONFIG_ARCH_MMAP_RND_BITS_MAX=32 -CONFIG_ARCH_MMAP_RND_BITS_MIN=28 -CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8 -CONFIG_ARCH_NR_GPIO=1024 -CONFIG_ARCH_SPARSEMEM_DEFAULT=y -CONFIG_ARCH_WANTS_THP_SWAP=y -# CONFIG_ASUS_TF103C_DOCK is not set -CONFIG_AUDIT_ARCH=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BALLOON_COMPACTION=y -# CONFIG_BARCO_P50_GPIO is not set -CONFIG_BLK_DEV_BSGLIB=y -CONFIG_BLK_DEV_BSG_COMMON=y -CONFIG_BLK_DEV_INTEGRITY=y -CONFIG_BLK_DEV_INTEGRITY_T10=y -CONFIG_BLK_DEV_NVME=y -CONFIG_BLK_DEV_SR=y -CONFIG_BLK_MQ_VIRTIO=y -CONFIG_BLK_PM=y -CONFIG_BLOCK_COMPAT=y -# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set -CONFIG_BTT=y -CONFIG_CDROM=y -CONFIG_COMPAT=y -CONFIG_COMPAT_BINFMT_ELF=y -CONFIG_COMPAT_FOR_U64_ALIGNMENT=y -CONFIG_COMPAT_NETLINK_MESSAGES=y -CONFIG_CONNECTOR=y -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y -CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y -# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set -CONFIG_CPU_RMAP=y -CONFIG_CRC64=y -CONFIG_CRC64_ROCKSOFT=y -CONFIG_CRC_T10DIF=y -CONFIG_CRYPTO_AES_NI_INTEL=y -# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set -# CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set -# CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set -CONFIG_CRYPTO_CRC64_ROCKSOFT=y -CONFIG_CRYPTO_CRCT10DIF=y -# CONFIG_CRYPTO_CRCT10DIF_PCLMUL is not set -CONFIG_CRYPTO_CRYPTD=y -# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set -CONFIG_CRYPTO_ECB=y -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 -CONFIG_CRYPTO_LRW=y -# CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set -# CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set -# CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set -# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set -# CONFIG_CRYPTO_SHA1_SSSE3 is not set -# CONFIG_CRYPTO_SHA512_SSSE3 is not set -CONFIG_CRYPTO_SIMD=y -# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set -# CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set -# CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64 is not set -# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set -CONFIG_CRYPTO_XTS=y -# CONFIG_DEBUG_HOTPLUG_CPU0 is not set -CONFIG_DMA_ACPI=y -CONFIG_DMA_OPS=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DRM=y -CONFIG_DRM_BOCHS=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_BUDDY=y -CONFIG_DRM_DP_HELPER=y -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=100 -CONFIG_DRM_GEM_SHMEM_HELPER=y -# CONFIG_DRM_HYPERV is not set -CONFIG_DRM_I915_FORCE_PROBE="" -CONFIG_DRM_I915_REQUEST_TIMEOUT=20000 -CONFIG_DRM_I915_FENCE_TIMEOUT=10000 -CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 -CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 -CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 -CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 -CONFIG_DRM_I915_STOP_TIMEOUT=100 -CONFIG_DRM_I915_TIMESLICE_DURATION=1 -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MIPI_DSI=y -CONFIG_DRM_NOMODESET=y -CONFIG_DRM_PANEL=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -# CONFIG_DRM_SIMPLEDRM is not set -# CONFIG_DRM_SSD130X is not set -CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_HELPER=y -CONFIG_DRM_VIRTIO_GPU=y -CONFIG_DRM_VRAM_HELPER=y -CONFIG_EFI=y -CONFIG_EFIVAR_FS=m -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_CUSTOM_SSDT_OVERLAYS is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -CONFIG_EFI_EARLYCON=y -CONFIG_EFI_ESRT=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y -# CONFIG_EFI_MIXED is not set -# CONFIG_EFI_PGT_DUMP is not set -# CONFIG_EFI_RCI2_TABLE is not set -CONFIG_EFI_RUNTIME_MAP=y -CONFIG_EFI_RUNTIME_WRAPPERS=y -CONFIG_EFI_STUB=y -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_VARS is not set -CONFIG_FAILOVER=y -CONFIG_FB=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_CMDLINE=y -CONFIG_FB_DEFERRED_IO=y -CONFIG_FB_EFI=y -CONFIG_FB_HYPERV=y -# CONFIG_FB_INTEL is not set -CONFIG_FB_MODE_HELPERS=y -CONFIG_FB_SIMPLE=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_SYS_IMAGEBLIT=y -CONFIG_FB_TILEBLITTING=y -# CONFIG_FB_VESA is not set -CONFIG_FONT_8x16=y -CONFIG_FONT_8x8=y -CONFIG_FONT_SUPPORT=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -CONFIG_FREEZER=y -CONFIG_FUSION_SAS=y -CONFIG_FW_CACHE=y -CONFIG_GART_IOMMU=y -CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y -CONFIG_GENERIC_CPU=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_GENERIC_PENDING_IRQ=y -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_IRQCHIP=y -CONFIG_GPIO_ACPI=y -# CONFIG_GPIO_CASCADE is not set -CONFIG_GPIO_CDEV=y -CONFIG_GPIO_ICH=y -CONFIG_GPIO_SCH=y -# CONFIG_GPIO_SIM is not set -# CONFIG_GPIO_VIRTIO is not set -CONFIG_GUEST_PERF_EVENTS=y -CONFIG_HALTPOLL_CPUIDLE=y -CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y -CONFIG_HDMI=y -CONFIG_HIBERNATE_CALLBACKS=y -CONFIG_HID_BATTERY_STRENGTH=y -CONFIG_HID_GENERIC=y -CONFIG_HID_HYPERV_MOUSE=y -CONFIG_HOTPLUG_CPU=y -CONFIG_HOTPLUG_PCI=y -CONFIG_HOTPLUG_PCI_ACPI=y -# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set -# CONFIG_HOTPLUG_PCI_CPCI is not set -# CONFIG_HOTPLUG_PCI_PCIE is not set -# CONFIG_HOTPLUG_PCI_SHPC is not set -CONFIG_HOTPLUG_SMT=y -CONFIG_HPET=y -CONFIG_HPET_MMAP=y -# CONFIG_HP_ACCEL is not set -CONFIG_HVC_DRIVER=y -CONFIG_HVC_IRQ=y -CONFIG_HVC_XEN=y -CONFIG_HVC_XEN_FRONTEND=y -CONFIG_HWMON=y -CONFIG_HWMON_VID=y -CONFIG_HW_RANDOM_AMD=y -CONFIG_HW_RANDOM_INTEL=y -CONFIG_HW_RANDOM_VIRTIO=y -CONFIG_HYPERV=y -CONFIG_HYPERVISOR_GUEST=y -CONFIG_HYPERV_BALLOON=y -CONFIG_HYPERV_KEYBOARD=y -CONFIG_HYPERV_NET=y -CONFIG_HYPERV_STORAGE=y -# CONFIG_HYPERV_TESTING is not set -CONFIG_HYPERV_TIMER=y -CONFIG_HYPERV_UTILS=y -# CONFIG_HYPERV_VSOCKETS is not set -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_HID_ACPI is not set -# CONFIG_IA32_EMULATION is not set -CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 -# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set -CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y -CONFIG_INTEL_GTT=y -# CONFIG_INTEL_IDXD_COMPAT is not set -CONFIG_INTEL_IDLE=y -# CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_MEI_HDCP is not set -# CONFIG_INTEL_MEI_PXP is not set -# CONFIG_INTEL_MENLOW is not set -CONFIG_INTEL_PCH_THERMAL=y -# CONFIG_INTEL_SAR_INT1092 is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -CONFIG_INTEL_SOC_DTS_IOSF_CORE=y -CONFIG_INTEL_SOC_DTS_THERMAL=y -# CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set -# CONFIG_INTEL_TURBO_MAX_3 is not set -# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set -CONFIG_INTERVAL_TREE=y -# CONFIG_IOMMU_DEBUG is not set -CONFIG_IOMMU_HELPER=y -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -# CONFIG_ISCSI_IBFT is not set -CONFIG_ISO9660_FS=y -CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y -CONFIG_KCMP=y -CONFIG_KVM_GUEST=y -CONFIG_LEDS_GPIO=y -# CONFIG_LEGACY_VSYSCALL_EMULATE is not set -CONFIG_LEGACY_VSYSCALL_NONE=y -# CONFIG_LEGACY_VSYSCALL_XONLY is not set -CONFIG_LIBNVDIMM=y -CONFIG_LOCK_SPIN_ON_OWNER=y -CONFIG_LPC_ICH=y -CONFIG_LPC_SCH=y -CONFIG_MAILBOX=y -# CONFIG_MAXSMP is not set -CONFIG_MEMORY_BALLOON=y -CONFIG_MEMREGION=y -# CONFIG_MERAKI_MX100 is not set -CONFIG_MFD_CORE=y -# CONFIG_MFD_INTEL_LPSS_ACPI is not set -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MFD_SIMPLE_MFD_I2C is not set -CONFIG_MMC=y -CONFIG_MMC_BLOCK=y -CONFIG_MMC_CQHCI=y -CONFIG_MMC_RICOH_MMC=y -CONFIG_MMC_SDHCI=y -CONFIG_MMC_SDHCI_ACPI=y -CONFIG_MMC_SDHCI_IO_ACCESSORS=y -CONFIG_MMC_SDHCI_PCI=y -# CONFIG_MMC_SDHCI_PLTFM is not set -# CONFIG_MMC_WBSD is not set -CONFIG_MMU_NOTIFIER=y -CONFIG_MODULES_USE_ELF_RELA=y -# CONFIG_MPSC is not set -CONFIG_MUTEX_SPIN_ON_OWNER=y -CONFIG_ND_CLAIM=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_NET_FAILOVER=y -CONFIG_NET_FLOW_LIMIT=y -# CONFIG_NITRO_ENCLAVES is not set -CONFIG_NR_CPUS=512 -CONFIG_NR_CPUS_DEFAULT=64 -CONFIG_NR_CPUS_RANGE_BEGIN=2 -CONFIG_NR_CPUS_RANGE_END=512 -CONFIG_NVME_CORE=y -# CONFIG_NVME_HWMON is not set -CONFIG_NVME_MULTIPATH=y -# CONFIG_NVME_VERBOSE_ERRORS is not set -CONFIG_OUTPUT_FORMAT="elf64-x86-64" -CONFIG_PADATA=y -CONFIG_PAGE_REPORTING=y -# CONFIG_PAGE_TABLE_CHECK is not set -CONFIG_PAGE_TABLE_ISOLATION=y -CONFIG_PARAVIRT=y -CONFIG_PARAVIRT_CLOCK=y -# CONFIG_PARAVIRT_DEBUG is not set -CONFIG_PARAVIRT_SPINLOCKS=y -CONFIG_PARAVIRT_XXL=y -CONFIG_PATA_AMD=y -CONFIG_PATA_ATIIXP=y -CONFIG_PATA_MPIIX=y -CONFIG_PATA_OLDPIIX=y -CONFIG_PATA_PLATFORM=y -CONFIG_PATA_TIMINGS=y -CONFIG_PATA_VIA=y -CONFIG_PCC=y -# CONFIG_PCENGINES_APU2 is not set -CONFIG_PCIEAER=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCIE_PME=y -CONFIG_PCI_HYPERV=y -CONFIG_PCI_HYPERV_INTERFACE=y -# CONFIG_PCI_MMCONFIG is not set -CONFIG_PCI_XEN=y -CONFIG_PGTABLE_LEVELS=4 -CONFIG_PHYSICAL_ALIGN=0x1000000 -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_PINCTRL=y -# CONFIG_PINCTRL_ALDERLAKE is not set -# CONFIG_PINCTRL_BAYTRAIL is not set -# CONFIG_PINCTRL_BROXTON is not set -# CONFIG_PINCTRL_CANNONLAKE is not set -# CONFIG_PINCTRL_CHERRYVIEW is not set -# CONFIG_PINCTRL_DENVERTON is not set -# CONFIG_PINCTRL_ELKHARTLAKE is not set -# CONFIG_PINCTRL_EMMITSBURG is not set -# CONFIG_PINCTRL_GEMINILAKE is not set -# CONFIG_PINCTRL_JASPERLAKE is not set -# CONFIG_PINCTRL_LAKEFIELD is not set -# CONFIG_PINCTRL_LEWISBURG is not set -# CONFIG_PINCTRL_LYNXPOINT is not set -# CONFIG_PINCTRL_SUNRISEPOINT is not set -# CONFIG_PINCTRL_TIGERLAKE is not set -CONFIG_PM=y -# CONFIG_PMIC_OPREGION is not set -CONFIG_PM_CLK=y -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -CONFIG_PNP=y -CONFIG_PNPACPI=y -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_PROC_EVENTS=y -CONFIG_PVH=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_RAS=y -CONFIG_RELAY=y -CONFIG_RELOCATABLE=y -CONFIG_RESET_ATTACK_MITIGATION=y -CONFIG_RFS_ACCEL=y -CONFIG_RPS=y -CONFIG_RTC_I2C_AND_SPI=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SATA_AHCI=y -# CONFIG_SCHED_CORE is not set -CONFIG_SCHED_MC=y -CONFIG_SCHED_MC_PRIO=y -CONFIG_SCHED_SMT=y -CONFIG_SCSI_SAS_ATTRS=y -CONFIG_SCSI_VIRTIO=y -# CONFIG_SENSORS_ASUS_EC is not set -CONFIG_SENSORS_CORETEMP=y -CONFIG_SENSORS_FAM15H_POWER=y -CONFIG_SENSORS_I5500=y -CONFIG_SENSORS_K10TEMP=y -CONFIG_SENSORS_K8TEMP=y -# CONFIG_SENSORS_SY7636A is not set -# CONFIG_SENSORS_TMP464 is not set -CONFIG_SENSORS_VIA_CPUTEMP=y -CONFIG_SERIAL_8250_PNP=y -CONFIG_SERIAL_MCTRL_GPIO=y -CONFIG_SMP=y -CONFIG_SOCK_RX_QUEUE_MAPPING=y -CONFIG_SPARSEMEM=y -CONFIG_SPARSEMEM_EXTREME=y -# CONFIG_SPARSEMEM_VMEMMAP is not set -CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y -CONFIG_STACK_VALIDATION=y -CONFIG_SWIOTLB=y -CONFIG_SWIOTLB_XEN=y -CONFIG_SYNC_FILE=y -# CONFIG_SYSTEM76_ACPI is not set -CONFIG_SYSVIPC_COMPAT=y -CONFIG_SYS_HYPERVISOR=y -CONFIG_THERMAL_GOV_USER_SPACE=y -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_WRITABLE_TRIPS=y -# CONFIG_TOSHIBA_BT_RFKILL is not set -# CONFIG_UACCE is not set -# CONFIG_UCLAMP_TASK is not set -CONFIG_UCS2_STRING=y -# CONFIG_UNWINDER_ORC is not set -CONFIG_USB_STORAGE=y -# CONFIG_USB_XEN_HCD is not set -CONFIG_VIRTIO=y -CONFIG_VIRTIO_BALLOON=y -CONFIG_VIRTIO_BLK=y -CONFIG_VIRTIO_CONSOLE=y -CONFIG_VIRTIO_DMA_SHARED_BUFFER=y -CONFIG_VIRTIO_MMIO=y -CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y -CONFIG_VIRTIO_NET=y -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_PCI_LEGACY=y -CONFIG_VIRTIO_PCI_LIB=y -CONFIG_VIRTIO_PCI_LIB_LEGACY=y -# CONFIG_VIRTIO_PMEM is not set -# CONFIG_VIRTIO_VSOCKETS is not set -CONFIG_VIRTIO_VSOCKETS_COMMON=y -CONFIG_VIRT_DRIVERS=y -CONFIG_VMAP_PFN=y -CONFIG_VMAP_STACK=y -# CONFIG_VMD is not set -CONFIG_VMGENID=y -CONFIG_VMWARE_BALLOON=y -CONFIG_VMWARE_PVSCSI=y -CONFIG_VMWARE_VMCI=y -CONFIG_VMWARE_VMCI_VSOCKETS=y -CONFIG_VMXNET3=y -CONFIG_VSOCKETS=y -CONFIG_VSOCKETS_LOOPBACK=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_WATCHDOG_CORE=y -# CONFIG_WIRELESS_HOTKEY is not set -# CONFIG_X86_5LEVEL is not set -CONFIG_X86_64=y -CONFIG_X86_64_SMP=y -CONFIG_X86_ACPI_CPUFREQ=y -# CONFIG_X86_ACPI_CPUFREQ_CPB is not set -CONFIG_X86_AMD_FREQ_SENSITIVITY=y -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -CONFIG_X86_AMD_PSTATE=y -CONFIG_X86_CPUID=y -CONFIG_X86_DIRECT_GBPAGES=y -CONFIG_X86_HV_CALLBACK_VECTOR=y -CONFIG_X86_INTEL_LPSS=y -# CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS is not set -CONFIG_X86_INTEL_PSTATE=y -CONFIG_X86_KERNEL_IBT=y -CONFIG_X86_MINIMUM_CPU_FAMILY=64 -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PKG_TEMP_THERMAL=y -# CONFIG_X86_PMEM_LEGACY is not set -CONFIG_X86_PM_TIMER=y -# CONFIG_X86_POWERNOW_K8 is not set -CONFIG_X86_SGX=y -# CONFIG_X86_VSYSCALL_EMULATION is not set -CONFIG_X86_X2APIC=y -CONFIG_X86_X32_ABI=y -CONFIG_XARRAY_MULTI=y -CONFIG_XEN=y -CONFIG_XENFS=y -CONFIG_XEN_512GB=y -CONFIG_XEN_ACPI=y -CONFIG_XEN_ACPI_PROCESSOR=y -CONFIG_XEN_AUTO_XLATE=y -# CONFIG_XEN_BACKEND is not set -CONFIG_XEN_BALLOON=y -CONFIG_XEN_BLKDEV_FRONTEND=y -CONFIG_XEN_COMPAT_XENFS=y -CONFIG_XEN_DEBUG_FS=y -CONFIG_XEN_DEV_EVTCHN=y -CONFIG_XEN_DOM0=y -CONFIG_XEN_EFI=y -CONFIG_XEN_FBDEV_FRONTEND=y -CONFIG_XEN_GNTDEV=y -CONFIG_XEN_GRANT_DEV_ALLOC=y -CONFIG_XEN_HAVE_PVMMU=y -CONFIG_XEN_HAVE_VPMU=y -# CONFIG_XEN_MCE_LOG is not set -CONFIG_XEN_NETDEV_FRONTEND=y -CONFIG_XEN_PCIDEV_FRONTEND=y -CONFIG_XEN_PRIVCMD=y -CONFIG_XEN_PV=y -CONFIG_XEN_PVH=y -CONFIG_XEN_PVHVM=y -CONFIG_XEN_PVHVM_GUEST=y -CONFIG_XEN_PVHVM_SMP=y -CONFIG_XEN_PV_DOM0=y -CONFIG_XEN_PV_SMP=y -CONFIG_XEN_SAVE_RESTORE=y -CONFIG_XEN_SCSI_FRONTEND=y -CONFIG_XEN_SYMS=y -CONFIG_XEN_SYS_HYPERVISOR=y -CONFIG_XEN_WDT=y -CONFIG_XEN_XENBUS_FRONTEND=y -CONFIG_XPS=y -CONFIG_ZLIB_DEFLATE=y -CONFIG_ZONE_DMA32=y diff --git a/target/linux/x86/config-5.19 b/target/linux/x86/config-5.19 deleted file mode 100644 index d87a4a319..000000000 --- a/target/linux/x86/config-5.19 +++ /dev/null @@ -1,571 +0,0 @@ -# CONFIG_60XX_WDT is not set -# CONFIG_64BIT is not set -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -# CONFIG_ACPI_CMPC is not set -# CONFIG_ACPI_CONTAINER is not set -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -CONFIG_ACPI_FAN=y -CONFIG_ACPI_HOTPLUG_IOAPIC=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -CONFIG_ACPI_THERMAL=y -# CONFIG_ACPI_TINY_POWER_BUTTON is not set -# CONFIG_ACPI_WMI is not set -# CONFIG_ACQUIRE_WDT is not set -# CONFIG_ADVANTECH_WDT is not set -CONFIG_AF_UNIX_OOB=y -# CONFIG_ALIM1535_WDT is not set -# CONFIG_ALIX is not set -CONFIG_AMD_NB=y -# CONFIG_AMD_PMC is not set -CONFIG_ARCH_32BIT_OFF_T=y -CONFIG_ARCH_CLOCKSOURCE_INIT=y -CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y -CONFIG_ARCH_HIBERNATION_POSSIBLE=y -CONFIG_ARCH_MAY_HAVE_PC_FDC=y -CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y -CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y -CONFIG_ARCH_MMAP_RND_BITS=8 -CONFIG_ARCH_NR_GPIO=512 -CONFIG_ARCH_RANDOM=y -CONFIG_ARCH_SELECT_MEMORY_MODEL=y -CONFIG_ARCH_SPARSEMEM_ENABLE=y -CONFIG_ARCH_SPLIT_ARG64=y -CONFIG_ARCH_STACKWALK=y -CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARCH_USES_PG_UNCACHED=y -CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y -CONFIG_ARCH_WANTS_NO_INSTR=y -CONFIG_ATA=y -CONFIG_ATA_GENERIC=y -CONFIG_ATA_PIIX=y -CONFIG_BINARY_PRINTF=y -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_SD=y -CONFIG_BLK_MQ_PCI=y -CONFIG_BLOCK_LEGACY_AUTOLOAD=y -CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" -CONFIG_CLKBLD_I8253=y -CONFIG_CLKEVT_I8253=y -CONFIG_CLKSRC_I8253=y -CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y -CONFIG_CLOCKSOURCE_WATCHDOG=y -CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100 -CONFIG_CLONE_BACKWARDS=y -CONFIG_COMMON_CLK=y -CONFIG_COMPAT_32=y -CONFIG_COMPAT_32BIT_TIME=y -# CONFIG_COMPAT_VDSO is not set -CONFIG_CONSOLE_TRANSLATIONS=y -# CONFIG_CPU5_WDT is not set -CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set -CONFIG_CPU_FREQ_GOV_ATTR_SET=y -CONFIG_CPU_FREQ_GOV_COMMON=y -# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set -CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set -# CONFIG_CPU_FREQ_GOV_USERSPACE is not set -CONFIG_CPU_FREQ_STAT=y -CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_GOV_LADDER=y -CONFIG_CPU_SUP_AMD=y -CONFIG_CPU_SUP_CENTAUR=y -CONFIG_CPU_SUP_CYRIX_32=y -CONFIG_CPU_SUP_HYGON=y -CONFIG_CPU_SUP_INTEL=y -CONFIG_CPU_SUP_TRANSMETA_32=y -CONFIG_CPU_SUP_UMC_32=y -CONFIG_CPU_SUP_VORTEX_32=y -CONFIG_CPU_SUP_ZHAOXIN=y -CONFIG_CRASH_CORE=y -CONFIG_CRC16=y -CONFIG_CRYPTO_CRC32=y -CONFIG_CRYPTO_CRC32C=y -# CONFIG_CRYPTO_CRC32_PCLMUL is not set -CONFIG_CRYPTO_LIB_POLY1305_RSIZE=1 -CONFIG_CRYPTO_LIB_SHA256=y -CONFIG_CRYPTO_RNG2=y -# CONFIG_CRYPTO_SERPENT_SSE2_586 is not set -# CONFIG_CX_ECAT is not set -CONFIG_DCACHE_WORD_ACCESS=y -# CONFIG_DEBUG_BOOT_PARAMS is not set -# CONFIG_DEBUG_ENTRY is not set -CONFIG_DEBUG_INFO=y -# CONFIG_DEBUG_KMAP_LOCAL_FORCE_MAP is not set -CONFIG_DEBUG_MEMORY_INIT=y -CONFIG_DEBUG_MISC=y -# CONFIG_DEBUG_NMI_SELFTEST is not set -# CONFIG_DEBUG_TLBFLUSH is not set -CONFIG_DECOMPRESS_BZIP2=y -CONFIG_DECOMPRESS_GZIP=y -CONFIG_DMADEVICES=y -CONFIG_DMA_ACPI=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DMI=y -CONFIG_DMIID=y -CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y -CONFIG_DMI_SYSFS=y -CONFIG_DNOTIFY=y -CONFIG_DRM=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_NOMODESET=y -CONFIG_DRM_PANEL=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -# CONFIG_DRM_SIMPLEDRM is not set -# CONFIG_DRM_SSD130X is not set -CONFIG_DUMMY_CONSOLE=y -CONFIG_DYNAMIC_SIGFRAME=y -CONFIG_EARLY_PRINTK=y -# CONFIG_EARLY_PRINTK_DBGP is not set -CONFIG_EDAC_ATOMIC_SCRUB=y -CONFIG_EDAC_SUPPORT=y -# CONFIG_EDD is not set -# CONFIG_EISA is not set -# CONFIG_EUROTECH_WDT is not set -CONFIG_EXCLUSIVE_SYSTEM_RAM=y -CONFIG_EXT4_FS=y -CONFIG_F2FS_FS=y -# CONFIG_F71808E_WDT is not set -CONFIG_FB_CMDLINE=y -CONFIG_FIRMWARE_MEMMAP=y -CONFIG_FIX_EARLYCON_MEM=y -CONFIG_FRAME_POINTER=y -CONFIG_FS_IOMAP=y -CONFIG_FS_MBCACHE=y -# CONFIG_FUN_ETH is not set -CONFIG_FUSION=y -# CONFIG_FUSION_CTL is not set -# CONFIG_FUSION_LOGGING is not set -CONFIG_FUSION_MAX_SGE=128 -CONFIG_FUSION_SPI=y -CONFIG_FW_LOADER_PAGED_BUF=y -CONFIG_FW_LOADER_SYSFS=y -CONFIG_GCC12_NO_ARRAY_BOUNDS=y -CONFIG_GENERIC_ALLOCATOR=y -CONFIG_GENERIC_BUG=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y -CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y -CONFIG_GENERIC_CMOS_UPDATE=y -CONFIG_GENERIC_CPU_AUTOPROBE=y -CONFIG_GENERIC_CPU_VULNERABILITIES=y -CONFIG_GENERIC_EARLY_IOREMAP=y -CONFIG_GENERIC_ENTRY=y -CONFIG_GENERIC_GETTIMEOFDAY=y -CONFIG_GENERIC_IOMAP=y -CONFIG_GENERIC_IRQ_MATRIX_ALLOCATOR=y -CONFIG_GENERIC_IRQ_RESERVATION_MODE=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_ISA_DMA=y -CONFIG_GENERIC_MSI_IRQ=y -CONFIG_GENERIC_MSI_IRQ_DOMAIN=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_GENERIC_SMP_IDLE_THREAD=y -CONFIG_GENERIC_STRNCPY_FROM_USER=y -CONFIG_GENERIC_STRNLEN_USER=y -CONFIG_GENERIC_TIME_VSYSCALL=y -CONFIG_GENERIC_VDSO_32=y -# CONFIG_GEOS is not set -CONFIG_GLOB=y -# CONFIG_HANGCHECK_TIMER is not set -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_HAS_DMA=y -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT_MAP=y -CONFIG_HDMI=y -CONFIG_HID=y -CONFIG_HIGHMEM=y -CONFIG_HIGHMEM4G=y -# CONFIG_HIGHMEM64G is not set -# CONFIG_HIGHPTE is not set -# CONFIG_HPET is not set -CONFIG_HPET_EMULATE_RTC=y -CONFIG_HPET_TIMER=y -# CONFIG_HP_ACCEL is not set -# CONFIG_HP_WATCHDOG is not set -CONFIG_HWMON=y -CONFIG_HW_CONSOLE=y -CONFIG_HW_RANDOM=y -CONFIG_HW_RANDOM_VIA=y -# CONFIG_HYPERVISOR_GUEST is not set -CONFIG_HZ_PERIODIC=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_HID_ACPI is not set -CONFIG_I8253_LOCK=y -CONFIG_IA32_FEAT_CTL=y -# CONFIG_IB700_WDT is not set -# CONFIG_IBMASR is not set -# CONFIG_IBM_RTL is not set -# CONFIG_IE6XX_WDT is not set -CONFIG_ILLEGAL_POINTER_VALUE=0 -CONFIG_INITRAMFS_SOURCE="" -CONFIG_INPUT=y -CONFIG_INPUT_KEYBOARD=y -CONFIG_INPUT_VIVALDIFMAP=y -CONFIG_INSTRUCTION_DECODER=y -# CONFIG_INTEL_HFI_THERMAL is not set -# CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_LDMA is not set -# CONFIG_INTEL_MENLOW is not set -# CONFIG_INTEL_PCH_THERMAL is not set -# CONFIG_INTEL_POWERCLAMP is not set -# CONFIG_INTEL_SAR_INT1092 is not set -# CONFIG_INTEL_SCU_PCI is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -# CONFIG_INTEL_SOC_DTS_THERMAL is not set -# CONFIG_INTEL_VSEC is not set -# CONFIG_IOSF_MBI is not set -CONFIG_IO_DELAY_0X80=y -# CONFIG_IO_DELAY_0XED is not set -# CONFIG_IO_DELAY_NONE is not set -# CONFIG_IO_DELAY_UDELAY is not set -CONFIG_IO_URING=y -CONFIG_IRQ_DOMAIN=y -CONFIG_IRQ_DOMAIN_HIERARCHY=y -CONFIG_IRQ_FORCED_THREADING=y -CONFIG_IRQ_WORK=y -# CONFIG_ISA is not set -CONFIG_ISA_DMA_API=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_IT8712F_WDT is not set -# CONFIG_IT87_WDT is not set -# CONFIG_ITCO_WDT is not set -CONFIG_JBD2=y -CONFIG_KALLSYMS=y -CONFIG_KCMP=y -CONFIG_KEXEC=y -CONFIG_KEXEC_CORE=y -CONFIG_KEYBOARD_ATKBD=y -CONFIG_KMAP_LOCAL=y -# CONFIG_LEDS_CLEVO_MAIL is not set -CONFIG_LOCK_DEBUGGING_SUPPORT=y -CONFIG_LTO_NONE=y -# CONFIG_M486 is not set -# CONFIG_M486SX is not set -# CONFIG_M586 is not set -# CONFIG_M586MMX is not set -# CONFIG_M586TSC is not set -CONFIG_M686=y -# CONFIG_MACHZ_WDT is not set -# CONFIG_MATOM is not set -# CONFIG_MCORE2 is not set -# CONFIG_MCRUSOE is not set -# CONFIG_MCYRIXIII is not set -# CONFIG_MEFFICEON is not set -# CONFIG_MELAN is not set -CONFIG_MEMFD_CREATE=y -# CONFIG_MFD_INTEL_LPSS_ACPI is not set -# CONFIG_MFD_INTEL_LPSS_PCI is not set -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MFD_SIMPLE_MFD_I2C is not set -# CONFIG_MGEODEGX1 is not set -# CONFIG_MGEODE_LX is not set -CONFIG_MICROCODE=y -CONFIG_MICROCODE_AMD=y -CONFIG_MICROCODE_INTEL=y -# CONFIG_MICROCODE_LATE_LOADING is not set -CONFIG_MIGRATION=y -# CONFIG_MK6 is not set -# CONFIG_MK7 is not set -# CONFIG_MK8 is not set -CONFIG_MMU_GATHER_MERGE_VMAS=y -# CONFIG_MODIFY_LDT_SYSCALL is not set -CONFIG_MODULES_TREE_LOOKUP=y -CONFIG_MODULES_USE_ELF_REL=y -# CONFIG_MPENTIUM4 is not set -# CONFIG_MPENTIUMII is not set -# CONFIG_MPENTIUMIII is not set -# CONFIG_MPENTIUMM is not set -# CONFIG_MTD is not set -CONFIG_MTRR=y -# CONFIG_MTRR_SANITIZER is not set -# CONFIG_MVIAC3_2 is not set -# CONFIG_MVIAC7 is not set -# CONFIG_MWINCHIP3D is not set -# CONFIG_MWINCHIPC6 is not set -CONFIG_NAMESPACES=y -CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y -CONFIG_NEED_PER_CPU_KM=y -CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y -CONFIG_NEED_SG_DMA_LENGTH=y -# CONFIG_NET5501 is not set -# CONFIG_NET_NS is not set -CONFIG_NET_SOCK_MSG=y -CONFIG_NET_VENDOR_DAVICOM=y -CONFIG_NET_VENDOR_FUNGIBLE=y -CONFIG_NLS=y -# CONFIG_NOHIGHMEM is not set -CONFIG_NR_CPUS=1 -CONFIG_NR_CPUS_DEFAULT=1 -CONFIG_NR_CPUS_RANGE_BEGIN=1 -CONFIG_NR_CPUS_RANGE_END=1 -# CONFIG_NSC_GPIO is not set -CONFIG_NVRAM=y -# CONFIG_OF is not set -CONFIG_OLD_SIGACTION=y -CONFIG_OLD_SIGSUSPEND3=y -# CONFIG_OLPC is not set -CONFIG_OUTPUT_FORMAT="elf32-i386" -CONFIG_PAGE_OFFSET=0xC0000000 -CONFIG_PAGE_POOL=y -CONFIG_PAGE_SIZE_LESS_THAN_256KB=y -CONFIG_PAGE_SIZE_LESS_THAN_64KB=y -CONFIG_PAHOLE_VERSION=0 -CONFIG_PC104=y -# CONFIG_PC8736x_GPIO is not set -# CONFIG_PC87413_WDT is not set -CONFIG_PCI=y -CONFIG_PCI_ATS=y -CONFIG_PCI_BIOS=y -CONFIG_PCI_DIRECT=y -CONFIG_PCI_DOMAINS=y -CONFIG_PCI_GOANY=y -# CONFIG_PCI_GOBIOS is not set -# CONFIG_PCI_GODIRECT is not set -# CONFIG_PCI_GOMMCONFIG is not set -CONFIG_PCI_IOV=y -CONFIG_PCI_LABEL=y -CONFIG_PCI_LOCKLESS_CONFIG=y -CONFIG_PCI_MMCONFIG=y -CONFIG_PCI_MSI=y -CONFIG_PCI_MSI_IRQ_DOMAIN=y -CONFIG_PCSPKR_PLATFORM=y -CONFIG_PERF_EVENTS=y -CONFIG_PERF_EVENTS_AMD_BRS=y -CONFIG_PERF_EVENTS_AMD_POWER=y -CONFIG_PERF_EVENTS_AMD_UNCORE=y -CONFIG_PERF_EVENTS_INTEL_CSTATE=y -CONFIG_PERF_EVENTS_INTEL_RAPL=y -CONFIG_PERF_EVENTS_INTEL_UNCORE=y -CONFIG_PGTABLE_LEVELS=2 -CONFIG_PHYSICAL_ALIGN=0x200000 -CONFIG_PHYSICAL_START=0x1000000 -# CONFIG_PHY_INTEL_LGM_EMMC is not set -CONFIG_PINCTRL=y -# CONFIG_PINCTRL_ALDERLAKE is not set -# CONFIG_PINCTRL_BAYTRAIL is not set -# CONFIG_PINCTRL_BROXTON is not set -# CONFIG_PINCTRL_CANNONLAKE is not set -# CONFIG_PINCTRL_CHERRYVIEW is not set -# CONFIG_PINCTRL_DENVERTON is not set -# CONFIG_PINCTRL_ELKHARTLAKE is not set -# CONFIG_PINCTRL_EMMITSBURG is not set -# CONFIG_PINCTRL_GEMINILAKE is not set -# CONFIG_PINCTRL_JASPERLAKE is not set -# CONFIG_PINCTRL_LAKEFIELD is not set -# CONFIG_PINCTRL_LEWISBURG is not set -# CONFIG_PINCTRL_LYNXPOINT is not set -# CONFIG_PINCTRL_SUNRISEPOINT is not set -# CONFIG_PINCTRL_TIGERLAKE is not set -CONFIG_PMC_ATOM=y -# CONFIG_PMIC_OPREGION is not set -CONFIG_PNP=y -CONFIG_PNPACPI=y -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y -CONFIG_POWER_SUPPLY=y -CONFIG_PREEMPTION=y -CONFIG_PREEMPT_BUILD=y -CONFIG_PREEMPT_COUNT=y -CONFIG_PREEMPT_DYNAMIC=y -CONFIG_PREEMPT_RCU=y -# CONFIG_PROCESSOR_SELECT is not set -CONFIG_PROC_PAGE_MONITOR=y -CONFIG_PROC_PID_ARCH_STATUS=y -# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set -CONFIG_PTP_1588_CLOCK_OPTIONAL=y -# CONFIG_PUNIT_ATOM_DEBUG is not set -CONFIG_RANDOMIZE_KSTACK_OFFSET=y -CONFIG_RANDSTRUCT_NONE=y -CONFIG_RATIONAL=y -CONFIG_RD_BZIP2=y -CONFIG_RD_GZIP=y -# CONFIG_RETHUNK is not set -CONFIG_RETPOLINE=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_I2C_AND_SPI=y -CONFIG_RTC_MC146818_LIB=y -CONFIG_RTS5139=y -# CONFIG_RTS5139_DEBUG is not set -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SATA_HOST=y -# CONFIG_SBC7240_WDT is not set -# CONFIG_SBC8360_WDT is not set -# CONFIG_SBC_EPX_C3_WATCHDOG is not set -# CONFIG_SC1200_WDT is not set -CONFIG_SCSI=y -CONFIG_SCSI_COMMON=y -CONFIG_SCSI_SPI_ATTRS=y -# CONFIG_SCx200 is not set -# CONFIG_SENSORS_ASUS_EC is not set -CONFIG_SENSORS_FAM15H_POWER=y -CONFIG_SENSORS_K10TEMP=y -# CONFIG_SENSORS_NCT6775_I2C is not set -# CONFIG_SENSORS_SY7636A is not set -# CONFIG_SENSORS_TMP464 is not set -CONFIG_SERIAL_8250_PCI=y -CONFIG_SERIAL_8250_PNP=y -# CONFIG_SERIAL_LANTIQ is not set -CONFIG_SERIO=y -CONFIG_SERIO_I8042=y -CONFIG_SERIO_LIBPS2=y -CONFIG_SERIO_SERPORT=y -CONFIG_SG_POOL=y -# CONFIG_SHORTCUT_FE is not set -# CONFIG_SIEMENS_SIMATIC_IPC is not set -# CONFIG_SMSC37B787_WDT is not set -# CONFIG_SMSC_SCH311X_WDT is not set -CONFIG_SPARSEMEM_STATIC=y -CONFIG_SPARSE_IRQ=y -CONFIG_SPECULATION_MITIGATIONS=y -CONFIG_SRCU=y -# CONFIG_STATIC_CALL_SELFTEST is not set -# CONFIG_STRICT_SIGALTSTACK_SIZE is not set -CONFIG_SYNC_FILE=y -CONFIG_SYSCTL_EXCEPTION_TRACE=y -# CONFIG_SYSFB_SIMPLEFB is not set -# CONFIG_SYSTEM76_ACPI is not set -# CONFIG_TELCLOCK is not set -# CONFIG_TEST_CLOCKSOURCE_WATCHDOG is not set -# CONFIG_TEST_FPU is not set -CONFIG_THERMAL=y -CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y -CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 -CONFIG_THERMAL_GOV_STEP_WISE=y -CONFIG_THREAD_INFO_IN_TASK=y -CONFIG_TICK_CPU_ACCOUNTING=y -# CONFIG_TOSHIBA is not set -# CONFIG_TOSHIBA_BT_RFKILL is not set -# CONFIG_TQMX86_WDT is not set -CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y -CONFIG_TREE_RCU=y -CONFIG_TREE_SRCU=y -CONFIG_UNINLINE_SPIN_UNLOCK=y -CONFIG_UNWINDER_FRAME_POINTER=y -# CONFIG_UNWINDER_GUESS is not set -CONFIG_UP_LATE_INIT=y -CONFIG_USB=y -CONFIG_USB_COMMON=y -CONFIG_USB_EHCI_HCD=y -# CONFIG_USB_EHCI_HCD_PLATFORM is not set -CONFIG_USB_EHCI_PCI=y -CONFIG_USB_HID=y -CONFIG_USB_HIDDEV=y -CONFIG_USB_OHCI_HCD=y -CONFIG_USB_OHCI_HCD_PCI=y -# CONFIG_USB_OHCI_HCD_PLATFORM is not set -CONFIG_USB_PCI=y -CONFIG_USB_SUPPORT=y -CONFIG_USB_UHCI_HCD=y -CONFIG_USB_XHCI_HCD=y -CONFIG_USB_XHCI_PCI=y -# CONFIG_USB_XHCI_PLATFORM is not set -# CONFIG_USER_NS is not set -CONFIG_USER_STACKTRACE_SUPPORT=y -CONFIG_VGA_CONSOLE=y -# CONFIG_VIA_WDT is not set -# CONFIG_VMWARE_VMCI is not set -CONFIG_VM_EVENT_COUNTERS=y -CONFIG_VT=y -CONFIG_VT_CONSOLE=y -CONFIG_VT_HW_CONSOLE_BINDING=y -# CONFIG_WAFER_WDT is not set -# CONFIG_WINMATE_FM07_KEYS is not set -# CONFIG_WIRELESS_HOTKEY is not set -CONFIG_X86=y -CONFIG_X86_32=y -# CONFIG_X86_32_IRIS is not set -CONFIG_X86_ACPI_CPUFREQ=y -CONFIG_X86_ACPI_CPUFREQ_CPB=y -CONFIG_X86_AMD_FREQ_SENSITIVITY=y -CONFIG_X86_AMD_PLATFORM_DEVICE=y -CONFIG_X86_AMD_PSTATE=y -# CONFIG_X86_ANCIENT_MCE is not set -# CONFIG_X86_CHECK_BIOS_CORRUPTION is not set -CONFIG_X86_CMOV=y -CONFIG_X86_CMPXCHG64=y -# CONFIG_X86_CPA_STATISTICS is not set -# CONFIG_X86_CPUFREQ_NFORCE2 is not set -# CONFIG_X86_CPUID is not set -# CONFIG_X86_CPU_RESCTRL is not set -CONFIG_X86_DEBUGCTLMSR=y -# CONFIG_X86_DEBUG_FPU is not set -# CONFIG_X86_DECODER_SELFTEST is not set -# CONFIG_X86_EXTENDED_PLATFORM is not set -# CONFIG_X86_E_POWERSAVER is not set -CONFIG_X86_FEATURE_NAMES=y -# CONFIG_X86_GENERIC is not set -# CONFIG_X86_GX_SUSPMOD is not set -# CONFIG_X86_INTEL_LPSS is not set -# CONFIG_X86_INTEL_PSTATE is not set -# CONFIG_X86_INTEL_TSX_MODE_AUTO is not set -CONFIG_X86_INTEL_TSX_MODE_OFF=y -# CONFIG_X86_INTEL_TSX_MODE_ON is not set -CONFIG_X86_INTERNODE_CACHE_SHIFT=5 -CONFIG_X86_IOPL_IOPERM=y -CONFIG_X86_IO_APIC=y -CONFIG_X86_L1_CACHE_SHIFT=5 -# CONFIG_X86_LEGACY_VM86 is not set -CONFIG_X86_LOCAL_APIC=y -# CONFIG_X86_LONGHAUL is not set -# CONFIG_X86_LONGRUN is not set -CONFIG_X86_MCE=y -# CONFIG_X86_MCELOG_LEGACY is not set -CONFIG_X86_MCE_AMD=y -# CONFIG_X86_MCE_INJECT is not set -CONFIG_X86_MCE_INTEL=y -CONFIG_X86_MCE_THRESHOLD=y -CONFIG_X86_MINIMUM_CPU_FAMILY=6 -CONFIG_X86_MPPARSE=y -CONFIG_X86_MSR=y -# CONFIG_X86_P4_CLOCKMOD is not set -CONFIG_X86_PAT=y -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PLATFORM_DEVICES=y -# CONFIG_X86_PLATFORM_DRIVERS_DELL is not set -CONFIG_X86_PM_TIMER=y -# CONFIG_X86_POWERNOW_K6 is not set -# CONFIG_X86_POWERNOW_K7 is not set -# CONFIG_X86_POWERNOW_K8 is not set -# CONFIG_X86_REBOOTFIXUPS is not set -CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y -# CONFIG_X86_SPEEDSTEP_CENTRINO is not set -# CONFIG_X86_SPEEDSTEP_ICH is not set -# CONFIG_X86_SPEEDSTEP_SMI is not set -CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y -CONFIG_X86_THERMAL_VECTOR=y -CONFIG_X86_TSC=y -CONFIG_X86_UMIP=y -CONFIG_X86_UP_APIC=y -# CONFIG_X86_UP_IOAPIC is not set -CONFIG_X86_USE_PPRO_CHECKSUM=y -CONFIG_X86_VERBOSE_BOOTUP=y -CONFIG_X86_VMX_FEATURE_NAMES=y -CONFIG_XZ_DEC_BCJ=y -CONFIG_XZ_DEC_X86=y -CONFIG_ZLIB_INFLATE=y diff --git a/target/linux/x86/generic/config-5.18 b/target/linux/x86/generic/config-5.18 deleted file mode 100644 index e46fc01ee..000000000 --- a/target/linux/x86/generic/config-5.18 +++ /dev/null @@ -1,476 +0,0 @@ -# CONFIG_3C515 is not set -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -# CONFIG_ACPI_BGRT is not set -CONFIG_ACPI_BUTTON=y -# CONFIG_ACPI_CMPC is not set -CONFIG_ACPI_CONTAINER=y -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -# CONFIG_ACPI_FAN is not set -CONFIG_ACPI_HOTPLUG_CPU=y -CONFIG_ACPI_HOTPLUG_IOAPIC=y -# CONFIG_ACPI_I2C_OPREGION is not set -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -CONFIG_ACPI_TAD=y -CONFIG_ACPI_THERMAL=y -CONFIG_ACPI_VIDEO=y -# CONFIG_ACPI_WMI is not set -CONFIG_AGP=y -# CONFIG_AGP_ALI is not set -# CONFIG_AGP_AMD is not set -# CONFIG_AGP_AMD64 is not set -# CONFIG_AGP_ATI is not set -# CONFIG_AGP_EFFICEON is not set -CONFIG_AGP_INTEL=y -# CONFIG_AGP_NVIDIA is not set -# CONFIG_AGP_SIS is not set -# CONFIG_AGP_SWORKS is not set -# CONFIG_AGP_VIA is not set -# CONFIG_AMD_PMC is not set -# CONFIG_APM is not set -CONFIG_ARCH_CPUIDLE_HALTPOLL=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -# CONFIG_ASUS_TF103C_DOCK is not set -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BALLOON_COMPACTION=y -# CONFIG_BARCO_P50_GPIO is not set -CONFIG_BLK_DEV_SR=y -CONFIG_BLK_MQ_VIRTIO=y -CONFIG_BLK_PM=y -# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set -CONFIG_BTT=y -CONFIG_CDROM=y -CONFIG_CONNECTOR=y -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y -CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y -# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set -CONFIG_CPU_IDLE_GOV_MENU=y -CONFIG_CPU_RMAP=y -# CONFIG_CS89x0_ISA is not set -# CONFIG_DEBUG_HOTPLUG_CPU0 is not set -CONFIG_DMA_ACPI=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DRM=y -CONFIG_DRM_BOCHS=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_BUDDY=y -CONFIG_DRM_DP_HELPER=y -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=100 -CONFIG_DRM_GEM_SHMEM_HELPER=y -# CONFIG_DRM_HYPERV is not set -CONFIG_DRM_I915=y -CONFIG_DRM_I915_CAPTURE_ERROR=y -CONFIG_DRM_I915_COMPRESS_ERROR=y -# CONFIG_DRM_I915_DEBUG is not set -# CONFIG_DRM_I915_DEBUG_GUC is not set -# CONFIG_DRM_I915_DEBUG_MMIO is not set -# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set -# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set -CONFIG_DRM_I915_FENCE_TIMEOUT=10000 -CONFIG_DRM_I915_FORCE_PROBE="" -CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 -# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set -CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 -CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 -CONFIG_DRM_I915_PXP=y -# CONFIG_DRM_I915_SELFTEST is not set -CONFIG_DRM_I915_STOP_TIMEOUT=100 -# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set -# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set -CONFIG_DRM_I915_TIMESLICE_DURATION=1 -CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 -CONFIG_DRM_I915_USERPTR=y -# CONFIG_DRM_I915_WERROR is not set -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MIPI_DSI=y -CONFIG_DRM_NOMODESET=y -CONFIG_DRM_PANEL=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -# CONFIG_DRM_SIMPLEDRM is not set -# CONFIG_DRM_SSD130X is not set -CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_HELPER=y -CONFIG_DRM_VIRTIO_GPU=y -CONFIG_DRM_VRAM_HELPER=y -CONFIG_EFI=y -CONFIG_EFIVAR_FS=m -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH is not set -# CONFIG_EFI_CUSTOM_SSDT_OVERLAYS is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -CONFIG_EFI_EARLYCON=y -CONFIG_EFI_ESRT=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y -# CONFIG_EFI_PGT_DUMP is not set -# CONFIG_EFI_RCI2_TABLE is not set -CONFIG_EFI_RUNTIME_MAP=y -CONFIG_EFI_RUNTIME_WRAPPERS=y -CONFIG_EFI_STUB=y -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_VARS is not set -# CONFIG_EL3 is not set -CONFIG_FAILOVER=y -CONFIG_FB=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_CMDLINE=y -CONFIG_FB_DEFERRED_IO=y -CONFIG_FB_EFI=y -CONFIG_FB_HYPERV=y -# CONFIG_FB_I810 is not set -CONFIG_FB_SIMPLE=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_VESA is not set -CONFIG_FONT_8x16=y -CONFIG_FONT_8x8=y -CONFIG_FONT_SUPPORT=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -CONFIG_FREEZER=y -CONFIG_FW_CACHE=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_GENERIC_PENDING_IRQ=y -CONFIG_GENERIC_PINCONF=y -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_IRQCHIP=y -CONFIG_GPIO_ACPI=y -CONFIG_GPIO_CASCADE=y -CONFIG_GPIO_CDEV=y -# CONFIG_GPIO_SIM is not set -CONFIG_GPIO_VIRTIO=y -CONFIG_GUEST_PERF_EVENTS=y -CONFIG_GUP_GET_PTE_LOW_HIGH=y -CONFIG_HALTPOLL_CPUIDLE=y -CONFIG_HDMI=y -CONFIG_HIBERNATE_CALLBACKS=y -CONFIG_HID_BATTERY_STRENGTH=y -CONFIG_HID_GENERIC=y -CONFIG_HID_HYPERV_MOUSE=y -# CONFIG_HIGHMEM4G is not set -CONFIG_HIGHMEM64G=y -CONFIG_HOTPLUG_CPU=y -CONFIG_HOTPLUG_PCI=y -CONFIG_HOTPLUG_PCI_ACPI=y -# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set -# CONFIG_HOTPLUG_PCI_COMPAQ is not set -# CONFIG_HOTPLUG_PCI_CPCI is not set -# CONFIG_HOTPLUG_PCI_IBM is not set -CONFIG_HOTPLUG_PCI_PCIE=y -# CONFIG_HOTPLUG_PCI_SHPC is not set -CONFIG_HOTPLUG_SMT=y -CONFIG_HPET=y -CONFIG_HPET_MMAP=y -# CONFIG_HP_ACCEL is not set -CONFIG_HVC_DRIVER=y -CONFIG_HVC_IRQ=y -CONFIG_HVC_XEN=y -CONFIG_HVC_XEN_FRONTEND=y -CONFIG_HWMON=y -CONFIG_HWMON_VID=y -CONFIG_HW_RANDOM_VIRTIO=y -CONFIG_HYPERV=y -CONFIG_HYPERVISOR_GUEST=y -CONFIG_HYPERV_BALLOON=y -CONFIG_HYPERV_KEYBOARD=y -CONFIG_HYPERV_NET=y -CONFIG_HYPERV_STORAGE=y -# CONFIG_HYPERV_TESTING is not set -CONFIG_HYPERV_TIMER=y -CONFIG_HYPERV_UTILS=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_HID_ACPI is not set -# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set -CONFIG_INPUT_MOUSE=y -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y -CONFIG_INTEL_GTT=y -CONFIG_INTEL_IDLE=y -# CONFIG_INTEL_IPS is not set -CONFIG_INTEL_MEI=y -# CONFIG_INTEL_MEI_HDCP is not set -CONFIG_INTEL_MEI_ME=y -CONFIG_INTEL_MEI_PXP=y -# CONFIG_INTEL_MEI_WDT is not set -# CONFIG_INTEL_MENLOW is not set -CONFIG_INTEL_PCH_THERMAL=y -# CONFIG_INTEL_SAR_INT1092 is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -CONFIG_INTEL_SOC_DTS_IOSF_CORE=y -CONFIG_INTEL_SOC_DTS_THERMAL=y -CONFIG_INTERVAL_TREE=y -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -CONFIG_IRQ_BYPASS_MANAGER=y -CONFIG_ISA=y -CONFIG_ISAPNP=y -CONFIG_ISA_BUS_API=y -# CONFIG_ISCSI_IBFT is not set -CONFIG_ISO9660_FS=y -# CONFIG_JOLIET is not set -CONFIG_KCMP=y -CONFIG_KVM=y -CONFIG_KVM_AMD=y -CONFIG_KVM_ASYNC_PF=y -CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y -CONFIG_KVM_GUEST=y -CONFIG_KVM_INTEL=y -CONFIG_KVM_MMIO=y -CONFIG_KVM_VFIO=y -# CONFIG_KVM_XEN is not set -CONFIG_KVM_XFER_TO_GUEST_WORK=y -# CONFIG_LANCE is not set -CONFIG_LIBNVDIMM=y -CONFIG_LOCK_SPIN_ON_OWNER=y -# CONFIG_M686 is not set -# CONFIG_MDA_CONSOLE is not set -CONFIG_MEMORY_BALLOON=y -CONFIG_MEMREGION=y -CONFIG_MFD_CORE=y -CONFIG_MFD_INTEL_LPSS=y -CONFIG_MFD_INTEL_LPSS_ACPI=y -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MFD_SIMPLE_MFD_I2C is not set -# CONFIG_MIXCOMWD is not set -CONFIG_MMC=y -CONFIG_MMC_BLOCK=y -CONFIG_MMC_CQHCI=y -CONFIG_MMC_RICOH_MMC=y -CONFIG_MMC_SDHCI=y -CONFIG_MMC_SDHCI_IO_ACCESSORS=y -CONFIG_MMC_SDHCI_PCI=y -# CONFIG_MMC_SDHCI_PLTFM is not set -# CONFIG_MMC_WBSD is not set -CONFIG_MMU_NOTIFIER=y -# CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_CYAPA is not set -CONFIG_MOUSE_PS2=y -CONFIG_MOUSE_PS2_ALPS=y -# CONFIG_MOUSE_PS2_BYD is not set -# CONFIG_MOUSE_PS2_CYPRESS is not set -# CONFIG_MOUSE_PS2_ELANTECH is not set -CONFIG_MOUSE_PS2_LIFEBOOK=y -CONFIG_MOUSE_PS2_LOGIPS2PP=y -CONFIG_MOUSE_PS2_SMBUS=y -CONFIG_MOUSE_PS2_SYNAPTICS=y -CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y -# CONFIG_MOUSE_PS2_TOUCHKIT is not set -CONFIG_MOUSE_PS2_TRACKPOINT=y -# CONFIG_MOUSE_PS2_VMMOUSE is not set -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_VSXXXAA is not set -CONFIG_MPENTIUM4=y -CONFIG_MULTIPLEXER=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -# CONFIG_MUX_ADG792A is not set -# CONFIG_MUX_GPIO is not set -CONFIG_ND_CLAIM=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_NET_FAILOVER=y -CONFIG_NET_FLOW_LIMIT=y -CONFIG_NO_HZ=y -CONFIG_NR_CPUS=4 -CONFIG_NR_CPUS_DEFAULT=8 -CONFIG_NR_CPUS_RANGE_BEGIN=2 -CONFIG_NR_CPUS_RANGE_END=8 -CONFIG_PADATA=y -CONFIG_PAGE_REPORTING=y -CONFIG_PAGE_TABLE_ISOLATION=y -CONFIG_PARAVIRT=y -CONFIG_PARAVIRT_CLOCK=y -# CONFIG_PARAVIRT_DEBUG is not set -CONFIG_PARAVIRT_SPINLOCKS=y -CONFIG_PATA_AMD=y -CONFIG_PATA_ATIIXP=y -CONFIG_PATA_MPIIX=y -CONFIG_PATA_OLDPIIX=y -CONFIG_PATA_PLATFORM=y -CONFIG_PATA_SC1200=y -CONFIG_PATA_TIMINGS=y -CONFIG_PATA_VIA=y -# CONFIG_PCENGINES_APU2 is not set -CONFIG_PCIEAER=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCIE_PME=y -CONFIG_PCI_MMCONFIG=y -CONFIG_PCI_XEN=y -# CONFIG_PCWATCHDOG is not set -CONFIG_PGTABLE_LEVELS=3 -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_PINCTRL=y -# CONFIG_PINCTRL_ALDERLAKE is not set -CONFIG_PINCTRL_BAYTRAIL=y -CONFIG_PINCTRL_BROXTON=y -CONFIG_PINCTRL_CANNONLAKE=y -CONFIG_PINCTRL_CHERRYVIEW=y -CONFIG_PINCTRL_DENVERTON=y -# CONFIG_PINCTRL_ELKHARTLAKE is not set -# CONFIG_PINCTRL_EMMITSBURG is not set -CONFIG_PINCTRL_GEMINILAKE=y -CONFIG_PINCTRL_INTEL=y -# CONFIG_PINCTRL_JASPERLAKE is not set -# CONFIG_PINCTRL_LAKEFIELD is not set -# CONFIG_PINCTRL_LEWISBURG is not set -# CONFIG_PINCTRL_LYNXPOINT is not set -CONFIG_PINCTRL_SUNRISEPOINT=y -# CONFIG_PINCTRL_TIGERLAKE is not set -CONFIG_PM=y -# CONFIG_PMIC_OPREGION is not set -CONFIG_PM_CLK=y -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -CONFIG_PNP=y -CONFIG_PNPACPI=y -# CONFIG_PNPBIOS is not set -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_PREEMPT_NOTIFIERS=y -CONFIG_PROC_EVENTS=y -CONFIG_PVH=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_RAS=y -CONFIG_RELAY=y -CONFIG_RELOCATABLE=y -CONFIG_RESET_ATTACK_MITIGATION=y -CONFIG_RFS_ACCEL=y -CONFIG_RPS=y -CONFIG_RTC_I2C_AND_SPI=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SATA_AHCI=y -CONFIG_SATA_VIA=y -# CONFIG_SCHED_CORE is not set -CONFIG_SCHED_INFO=y -CONFIG_SCHED_SMT=y -# CONFIG_SCSI_FDOMAIN_ISA is not set -CONFIG_SCSI_VIRTIO=y -# CONFIG_SENSORS_ASUS_EC is not set -CONFIG_SENSORS_CORETEMP=y -CONFIG_SENSORS_FAM15H_POWER=y -CONFIG_SENSORS_I5500=y -CONFIG_SENSORS_K10TEMP=y -CONFIG_SENSORS_K8TEMP=y -# CONFIG_SENSORS_SY7636A is not set -# CONFIG_SENSORS_TMP464 is not set -CONFIG_SENSORS_VIA_CPUTEMP=y -CONFIG_SERIAL_8250_PNP=y -CONFIG_SERIAL_MCTRL_GPIO=y -CONFIG_SMP=y -CONFIG_SOCK_RX_QUEUE_MAPPING=y -CONFIG_SWIOTLB=y -CONFIG_SYNC_FILE=y -# CONFIG_SYSTEM76_ACPI is not set -CONFIG_SYS_HYPERVISOR=y -CONFIG_TASKSTATS=y -CONFIG_TASK_DELAY_ACCT=y -CONFIG_THERMAL_GOV_USER_SPACE=y -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_WRITABLE_TRIPS=y -# CONFIG_TOSHIBA_BT_RFKILL is not set -# CONFIG_UCLAMP_TASK is not set -CONFIG_UCS2_STRING=y -CONFIG_USB_STORAGE=y -# CONFIG_USB_XEN_HCD is not set -CONFIG_USER_RETURN_NOTIFIER=y -CONFIG_VHOST=y -CONFIG_VHOST_IOTLB=y -CONFIG_VHOST_NET=y -CONFIG_VIRTIO=y -CONFIG_VIRTIO_BALLOON=y -CONFIG_VIRTIO_BLK=y -CONFIG_VIRTIO_CONSOLE=y -CONFIG_VIRTIO_DMA_SHARED_BUFFER=y -CONFIG_VIRTIO_INPUT=y -CONFIG_VIRTIO_MMIO=y -CONFIG_VIRTIO_NET=y -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_PCI_LEGACY=y -CONFIG_VIRTIO_PCI_LIB=y -CONFIG_VIRTIO_PCI_LIB_LEGACY=y -# CONFIG_VIRTIO_PMEM is not set -CONFIG_VIRTUALIZATION=y -CONFIG_VMAP_PFN=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_WATCHDOG_CORE=y -# CONFIG_WDT is not set -# CONFIG_WIRELESS_HOTKEY is not set -CONFIG_X86_32_SMP=y -CONFIG_X86_ACPI_CPUFREQ=y -# CONFIG_X86_ACPI_CPUFREQ_CPB is not set -CONFIG_X86_AMD_FREQ_SENSITIVITY=y -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -CONFIG_X86_AMD_PSTATE=y -# CONFIG_X86_BIGSMP is not set -CONFIG_X86_CPUID=y -# CONFIG_X86_E_POWERSAVER is not set -CONFIG_X86_HV_CALLBACK_VECTOR=y -CONFIG_X86_INTEL_LPSS=y -CONFIG_X86_INTEL_PSTATE=y -CONFIG_X86_INTERNODE_CACHE_SHIFT=7 -CONFIG_X86_L1_CACHE_SHIFT=7 -# CONFIG_X86_LONGHAUL is not set -CONFIG_X86_NEED_RELOCS=y -CONFIG_X86_PAE=y -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PKG_TEMP_THERMAL=y -# CONFIG_X86_PMEM_LEGACY is not set -CONFIG_X86_PM_TIMER=y -# CONFIG_X86_POWERNOW_K8 is not set -CONFIG_XEN=y -CONFIG_XENFS=y -CONFIG_XEN_ACPI=y -CONFIG_XEN_AUTO_XLATE=y -# CONFIG_XEN_BACKEND is not set -CONFIG_XEN_BALLOON=y -CONFIG_XEN_BLKDEV_FRONTEND=y -CONFIG_XEN_COMPAT_XENFS=y -CONFIG_XEN_DEBUG_FS=y -CONFIG_XEN_DEV_EVTCHN=y -CONFIG_XEN_FBDEV_FRONTEND=y -CONFIG_XEN_GNTDEV=y -CONFIG_XEN_GRANT_DEV_ALLOC=y -CONFIG_XEN_NETDEV_FRONTEND=y -CONFIG_XEN_PRIVCMD=y -CONFIG_XEN_PVH=y -CONFIG_XEN_PVHVM=y -CONFIG_XEN_PVHVM_GUEST=y -CONFIG_XEN_PVHVM_SMP=y -CONFIG_XEN_SAVE_RESTORE=y -CONFIG_XEN_SCSI_FRONTEND=y -CONFIG_XEN_SYS_HYPERVISOR=y -CONFIG_XEN_WDT=y -CONFIG_XEN_XENBUS_FRONTEND=y -CONFIG_XPS=y -CONFIG_ZLIB_DEFLATE=y diff --git a/target/linux/x86/generic/config-5.19 b/target/linux/x86/generic/config-5.19 deleted file mode 100644 index e46fc01ee..000000000 --- a/target/linux/x86/generic/config-5.19 +++ /dev/null @@ -1,476 +0,0 @@ -# CONFIG_3C515 is not set -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -# CONFIG_ACPI_BGRT is not set -CONFIG_ACPI_BUTTON=y -# CONFIG_ACPI_CMPC is not set -CONFIG_ACPI_CONTAINER=y -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -# CONFIG_ACPI_FAN is not set -CONFIG_ACPI_HOTPLUG_CPU=y -CONFIG_ACPI_HOTPLUG_IOAPIC=y -# CONFIG_ACPI_I2C_OPREGION is not set -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -CONFIG_ACPI_TAD=y -CONFIG_ACPI_THERMAL=y -CONFIG_ACPI_VIDEO=y -# CONFIG_ACPI_WMI is not set -CONFIG_AGP=y -# CONFIG_AGP_ALI is not set -# CONFIG_AGP_AMD is not set -# CONFIG_AGP_AMD64 is not set -# CONFIG_AGP_ATI is not set -# CONFIG_AGP_EFFICEON is not set -CONFIG_AGP_INTEL=y -# CONFIG_AGP_NVIDIA is not set -# CONFIG_AGP_SIS is not set -# CONFIG_AGP_SWORKS is not set -# CONFIG_AGP_VIA is not set -# CONFIG_AMD_PMC is not set -# CONFIG_APM is not set -CONFIG_ARCH_CPUIDLE_HALTPOLL=y -CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -# CONFIG_ASUS_TF103C_DOCK is not set -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BALLOON_COMPACTION=y -# CONFIG_BARCO_P50_GPIO is not set -CONFIG_BLK_DEV_SR=y -CONFIG_BLK_MQ_VIRTIO=y -CONFIG_BLK_PM=y -# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set -CONFIG_BTT=y -CONFIG_CDROM=y -CONFIG_CONNECTOR=y -CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y -CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y -# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set -CONFIG_CPU_IDLE_GOV_MENU=y -CONFIG_CPU_RMAP=y -# CONFIG_CS89x0_ISA is not set -# CONFIG_DEBUG_HOTPLUG_CPU0 is not set -CONFIG_DMA_ACPI=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DRM=y -CONFIG_DRM_BOCHS=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_BUDDY=y -CONFIG_DRM_DP_HELPER=y -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=100 -CONFIG_DRM_GEM_SHMEM_HELPER=y -# CONFIG_DRM_HYPERV is not set -CONFIG_DRM_I915=y -CONFIG_DRM_I915_CAPTURE_ERROR=y -CONFIG_DRM_I915_COMPRESS_ERROR=y -# CONFIG_DRM_I915_DEBUG is not set -# CONFIG_DRM_I915_DEBUG_GUC is not set -# CONFIG_DRM_I915_DEBUG_MMIO is not set -# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set -# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set -CONFIG_DRM_I915_FENCE_TIMEOUT=10000 -CONFIG_DRM_I915_FORCE_PROBE="" -CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 -# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set -CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 -CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 -CONFIG_DRM_I915_PXP=y -# CONFIG_DRM_I915_SELFTEST is not set -CONFIG_DRM_I915_STOP_TIMEOUT=100 -# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set -# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set -CONFIG_DRM_I915_TIMESLICE_DURATION=1 -CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 -CONFIG_DRM_I915_USERPTR=y -# CONFIG_DRM_I915_WERROR is not set -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MIPI_DSI=y -CONFIG_DRM_NOMODESET=y -CONFIG_DRM_PANEL=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -# CONFIG_DRM_SIMPLEDRM is not set -# CONFIG_DRM_SSD130X is not set -CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_HELPER=y -CONFIG_DRM_VIRTIO_GPU=y -CONFIG_DRM_VRAM_HELPER=y -CONFIG_EFI=y -CONFIG_EFIVAR_FS=m -# CONFIG_EFI_BOOTLOADER_CONTROL is not set -# CONFIG_EFI_CAPSULE_LOADER is not set -# CONFIG_EFI_CAPSULE_QUIRK_QUARK_CSH is not set -# CONFIG_EFI_CUSTOM_SSDT_OVERLAYS is not set -# CONFIG_EFI_DISABLE_PCI_DMA is not set -CONFIG_EFI_EARLYCON=y -CONFIG_EFI_ESRT=y -# CONFIG_EFI_FAKE_MEMMAP is not set -CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y -# CONFIG_EFI_PGT_DUMP is not set -# CONFIG_EFI_RCI2_TABLE is not set -CONFIG_EFI_RUNTIME_MAP=y -CONFIG_EFI_RUNTIME_WRAPPERS=y -CONFIG_EFI_STUB=y -# CONFIG_EFI_TEST is not set -# CONFIG_EFI_VARS is not set -# CONFIG_EL3 is not set -CONFIG_FAILOVER=y -CONFIG_FB=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_CMDLINE=y -CONFIG_FB_DEFERRED_IO=y -CONFIG_FB_EFI=y -CONFIG_FB_HYPERV=y -# CONFIG_FB_I810 is not set -CONFIG_FB_SIMPLE=y -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_VESA is not set -CONFIG_FONT_8x16=y -CONFIG_FONT_8x8=y -CONFIG_FONT_SUPPORT=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -CONFIG_FREEZER=y -CONFIG_FW_CACHE=y -CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y -CONFIG_GENERIC_IRQ_MIGRATION=y -CONFIG_GENERIC_PENDING_IRQ=y -CONFIG_GENERIC_PINCONF=y -CONFIG_GPIOLIB=y -CONFIG_GPIOLIB_IRQCHIP=y -CONFIG_GPIO_ACPI=y -CONFIG_GPIO_CASCADE=y -CONFIG_GPIO_CDEV=y -# CONFIG_GPIO_SIM is not set -CONFIG_GPIO_VIRTIO=y -CONFIG_GUEST_PERF_EVENTS=y -CONFIG_GUP_GET_PTE_LOW_HIGH=y -CONFIG_HALTPOLL_CPUIDLE=y -CONFIG_HDMI=y -CONFIG_HIBERNATE_CALLBACKS=y -CONFIG_HID_BATTERY_STRENGTH=y -CONFIG_HID_GENERIC=y -CONFIG_HID_HYPERV_MOUSE=y -# CONFIG_HIGHMEM4G is not set -CONFIG_HIGHMEM64G=y -CONFIG_HOTPLUG_CPU=y -CONFIG_HOTPLUG_PCI=y -CONFIG_HOTPLUG_PCI_ACPI=y -# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set -# CONFIG_HOTPLUG_PCI_COMPAQ is not set -# CONFIG_HOTPLUG_PCI_CPCI is not set -# CONFIG_HOTPLUG_PCI_IBM is not set -CONFIG_HOTPLUG_PCI_PCIE=y -# CONFIG_HOTPLUG_PCI_SHPC is not set -CONFIG_HOTPLUG_SMT=y -CONFIG_HPET=y -CONFIG_HPET_MMAP=y -# CONFIG_HP_ACCEL is not set -CONFIG_HVC_DRIVER=y -CONFIG_HVC_IRQ=y -CONFIG_HVC_XEN=y -CONFIG_HVC_XEN_FRONTEND=y -CONFIG_HWMON=y -CONFIG_HWMON_VID=y -CONFIG_HW_RANDOM_VIRTIO=y -CONFIG_HYPERV=y -CONFIG_HYPERVISOR_GUEST=y -CONFIG_HYPERV_BALLOON=y -CONFIG_HYPERV_KEYBOARD=y -CONFIG_HYPERV_NET=y -CONFIG_HYPERV_STORAGE=y -# CONFIG_HYPERV_TESTING is not set -CONFIG_HYPERV_TIMER=y -CONFIG_HYPERV_UTILS=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_HID_ACPI is not set -# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set -CONFIG_INPUT_MOUSE=y -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y -CONFIG_INTEL_GTT=y -CONFIG_INTEL_IDLE=y -# CONFIG_INTEL_IPS is not set -CONFIG_INTEL_MEI=y -# CONFIG_INTEL_MEI_HDCP is not set -CONFIG_INTEL_MEI_ME=y -CONFIG_INTEL_MEI_PXP=y -# CONFIG_INTEL_MEI_WDT is not set -# CONFIG_INTEL_MENLOW is not set -CONFIG_INTEL_PCH_THERMAL=y -# CONFIG_INTEL_SAR_INT1092 is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -CONFIG_INTEL_SOC_DTS_IOSF_CORE=y -CONFIG_INTEL_SOC_DTS_THERMAL=y -CONFIG_INTERVAL_TREE=y -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -CONFIG_IRQ_BYPASS_MANAGER=y -CONFIG_ISA=y -CONFIG_ISAPNP=y -CONFIG_ISA_BUS_API=y -# CONFIG_ISCSI_IBFT is not set -CONFIG_ISO9660_FS=y -# CONFIG_JOLIET is not set -CONFIG_KCMP=y -CONFIG_KVM=y -CONFIG_KVM_AMD=y -CONFIG_KVM_ASYNC_PF=y -CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y -CONFIG_KVM_GUEST=y -CONFIG_KVM_INTEL=y -CONFIG_KVM_MMIO=y -CONFIG_KVM_VFIO=y -# CONFIG_KVM_XEN is not set -CONFIG_KVM_XFER_TO_GUEST_WORK=y -# CONFIG_LANCE is not set -CONFIG_LIBNVDIMM=y -CONFIG_LOCK_SPIN_ON_OWNER=y -# CONFIG_M686 is not set -# CONFIG_MDA_CONSOLE is not set -CONFIG_MEMORY_BALLOON=y -CONFIG_MEMREGION=y -CONFIG_MFD_CORE=y -CONFIG_MFD_INTEL_LPSS=y -CONFIG_MFD_INTEL_LPSS_ACPI=y -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MFD_SIMPLE_MFD_I2C is not set -# CONFIG_MIXCOMWD is not set -CONFIG_MMC=y -CONFIG_MMC_BLOCK=y -CONFIG_MMC_CQHCI=y -CONFIG_MMC_RICOH_MMC=y -CONFIG_MMC_SDHCI=y -CONFIG_MMC_SDHCI_IO_ACCESSORS=y -CONFIG_MMC_SDHCI_PCI=y -# CONFIG_MMC_SDHCI_PLTFM is not set -# CONFIG_MMC_WBSD is not set -CONFIG_MMU_NOTIFIER=y -# CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_CYAPA is not set -CONFIG_MOUSE_PS2=y -CONFIG_MOUSE_PS2_ALPS=y -# CONFIG_MOUSE_PS2_BYD is not set -# CONFIG_MOUSE_PS2_CYPRESS is not set -# CONFIG_MOUSE_PS2_ELANTECH is not set -CONFIG_MOUSE_PS2_LIFEBOOK=y -CONFIG_MOUSE_PS2_LOGIPS2PP=y -CONFIG_MOUSE_PS2_SMBUS=y -CONFIG_MOUSE_PS2_SYNAPTICS=y -CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y -# CONFIG_MOUSE_PS2_TOUCHKIT is not set -CONFIG_MOUSE_PS2_TRACKPOINT=y -# CONFIG_MOUSE_PS2_VMMOUSE is not set -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_VSXXXAA is not set -CONFIG_MPENTIUM4=y -CONFIG_MULTIPLEXER=y -CONFIG_MUTEX_SPIN_ON_OWNER=y -# CONFIG_MUX_ADG792A is not set -# CONFIG_MUX_GPIO is not set -CONFIG_ND_CLAIM=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_NET_FAILOVER=y -CONFIG_NET_FLOW_LIMIT=y -CONFIG_NO_HZ=y -CONFIG_NR_CPUS=4 -CONFIG_NR_CPUS_DEFAULT=8 -CONFIG_NR_CPUS_RANGE_BEGIN=2 -CONFIG_NR_CPUS_RANGE_END=8 -CONFIG_PADATA=y -CONFIG_PAGE_REPORTING=y -CONFIG_PAGE_TABLE_ISOLATION=y -CONFIG_PARAVIRT=y -CONFIG_PARAVIRT_CLOCK=y -# CONFIG_PARAVIRT_DEBUG is not set -CONFIG_PARAVIRT_SPINLOCKS=y -CONFIG_PATA_AMD=y -CONFIG_PATA_ATIIXP=y -CONFIG_PATA_MPIIX=y -CONFIG_PATA_OLDPIIX=y -CONFIG_PATA_PLATFORM=y -CONFIG_PATA_SC1200=y -CONFIG_PATA_TIMINGS=y -CONFIG_PATA_VIA=y -# CONFIG_PCENGINES_APU2 is not set -CONFIG_PCIEAER=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCIE_PME=y -CONFIG_PCI_MMCONFIG=y -CONFIG_PCI_XEN=y -# CONFIG_PCWATCHDOG is not set -CONFIG_PGTABLE_LEVELS=3 -CONFIG_PHYS_ADDR_T_64BIT=y -CONFIG_PINCTRL=y -# CONFIG_PINCTRL_ALDERLAKE is not set -CONFIG_PINCTRL_BAYTRAIL=y -CONFIG_PINCTRL_BROXTON=y -CONFIG_PINCTRL_CANNONLAKE=y -CONFIG_PINCTRL_CHERRYVIEW=y -CONFIG_PINCTRL_DENVERTON=y -# CONFIG_PINCTRL_ELKHARTLAKE is not set -# CONFIG_PINCTRL_EMMITSBURG is not set -CONFIG_PINCTRL_GEMINILAKE=y -CONFIG_PINCTRL_INTEL=y -# CONFIG_PINCTRL_JASPERLAKE is not set -# CONFIG_PINCTRL_LAKEFIELD is not set -# CONFIG_PINCTRL_LEWISBURG is not set -# CONFIG_PINCTRL_LYNXPOINT is not set -CONFIG_PINCTRL_SUNRISEPOINT=y -# CONFIG_PINCTRL_TIGERLAKE is not set -CONFIG_PM=y -# CONFIG_PMIC_OPREGION is not set -CONFIG_PM_CLK=y -CONFIG_PM_SLEEP=y -CONFIG_PM_SLEEP_SMP=y -CONFIG_PNP=y -CONFIG_PNPACPI=y -# CONFIG_PNPBIOS is not set -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_PREEMPT_NOTIFIERS=y -CONFIG_PROC_EVENTS=y -CONFIG_PVH=y -CONFIG_QUEUED_RWLOCKS=y -CONFIG_QUEUED_SPINLOCKS=y -CONFIG_RAS=y -CONFIG_RELAY=y -CONFIG_RELOCATABLE=y -CONFIG_RESET_ATTACK_MITIGATION=y -CONFIG_RFS_ACCEL=y -CONFIG_RPS=y -CONFIG_RTC_I2C_AND_SPI=y -CONFIG_RWSEM_SPIN_ON_OWNER=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SATA_AHCI=y -CONFIG_SATA_VIA=y -# CONFIG_SCHED_CORE is not set -CONFIG_SCHED_INFO=y -CONFIG_SCHED_SMT=y -# CONFIG_SCSI_FDOMAIN_ISA is not set -CONFIG_SCSI_VIRTIO=y -# CONFIG_SENSORS_ASUS_EC is not set -CONFIG_SENSORS_CORETEMP=y -CONFIG_SENSORS_FAM15H_POWER=y -CONFIG_SENSORS_I5500=y -CONFIG_SENSORS_K10TEMP=y -CONFIG_SENSORS_K8TEMP=y -# CONFIG_SENSORS_SY7636A is not set -# CONFIG_SENSORS_TMP464 is not set -CONFIG_SENSORS_VIA_CPUTEMP=y -CONFIG_SERIAL_8250_PNP=y -CONFIG_SERIAL_MCTRL_GPIO=y -CONFIG_SMP=y -CONFIG_SOCK_RX_QUEUE_MAPPING=y -CONFIG_SWIOTLB=y -CONFIG_SYNC_FILE=y -# CONFIG_SYSTEM76_ACPI is not set -CONFIG_SYS_HYPERVISOR=y -CONFIG_TASKSTATS=y -CONFIG_TASK_DELAY_ACCT=y -CONFIG_THERMAL_GOV_USER_SPACE=y -CONFIG_THERMAL_HWMON=y -CONFIG_THERMAL_WRITABLE_TRIPS=y -# CONFIG_TOSHIBA_BT_RFKILL is not set -# CONFIG_UCLAMP_TASK is not set -CONFIG_UCS2_STRING=y -CONFIG_USB_STORAGE=y -# CONFIG_USB_XEN_HCD is not set -CONFIG_USER_RETURN_NOTIFIER=y -CONFIG_VHOST=y -CONFIG_VHOST_IOTLB=y -CONFIG_VHOST_NET=y -CONFIG_VIRTIO=y -CONFIG_VIRTIO_BALLOON=y -CONFIG_VIRTIO_BLK=y -CONFIG_VIRTIO_CONSOLE=y -CONFIG_VIRTIO_DMA_SHARED_BUFFER=y -CONFIG_VIRTIO_INPUT=y -CONFIG_VIRTIO_MMIO=y -CONFIG_VIRTIO_NET=y -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_PCI_LEGACY=y -CONFIG_VIRTIO_PCI_LIB=y -CONFIG_VIRTIO_PCI_LIB_LEGACY=y -# CONFIG_VIRTIO_PMEM is not set -CONFIG_VIRTUALIZATION=y -CONFIG_VMAP_PFN=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_WATCHDOG_CORE=y -# CONFIG_WDT is not set -# CONFIG_WIRELESS_HOTKEY is not set -CONFIG_X86_32_SMP=y -CONFIG_X86_ACPI_CPUFREQ=y -# CONFIG_X86_ACPI_CPUFREQ_CPB is not set -CONFIG_X86_AMD_FREQ_SENSITIVITY=y -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -CONFIG_X86_AMD_PSTATE=y -# CONFIG_X86_BIGSMP is not set -CONFIG_X86_CPUID=y -# CONFIG_X86_E_POWERSAVER is not set -CONFIG_X86_HV_CALLBACK_VECTOR=y -CONFIG_X86_INTEL_LPSS=y -CONFIG_X86_INTEL_PSTATE=y -CONFIG_X86_INTERNODE_CACHE_SHIFT=7 -CONFIG_X86_L1_CACHE_SHIFT=7 -# CONFIG_X86_LONGHAUL is not set -CONFIG_X86_NEED_RELOCS=y -CONFIG_X86_PAE=y -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PKG_TEMP_THERMAL=y -# CONFIG_X86_PMEM_LEGACY is not set -CONFIG_X86_PM_TIMER=y -# CONFIG_X86_POWERNOW_K8 is not set -CONFIG_XEN=y -CONFIG_XENFS=y -CONFIG_XEN_ACPI=y -CONFIG_XEN_AUTO_XLATE=y -# CONFIG_XEN_BACKEND is not set -CONFIG_XEN_BALLOON=y -CONFIG_XEN_BLKDEV_FRONTEND=y -CONFIG_XEN_COMPAT_XENFS=y -CONFIG_XEN_DEBUG_FS=y -CONFIG_XEN_DEV_EVTCHN=y -CONFIG_XEN_FBDEV_FRONTEND=y -CONFIG_XEN_GNTDEV=y -CONFIG_XEN_GRANT_DEV_ALLOC=y -CONFIG_XEN_NETDEV_FRONTEND=y -CONFIG_XEN_PRIVCMD=y -CONFIG_XEN_PVH=y -CONFIG_XEN_PVHVM=y -CONFIG_XEN_PVHVM_GUEST=y -CONFIG_XEN_PVHVM_SMP=y -CONFIG_XEN_SAVE_RESTORE=y -CONFIG_XEN_SCSI_FRONTEND=y -CONFIG_XEN_SYS_HYPERVISOR=y -CONFIG_XEN_WDT=y -CONFIG_XEN_XENBUS_FRONTEND=y -CONFIG_XPS=y -CONFIG_ZLIB_DEFLATE=y diff --git a/target/linux/x86/geode/config-5.18 b/target/linux/x86/geode/config-5.18 deleted file mode 100644 index 465fd617d..000000000 --- a/target/linux/x86/geode/config-5.18 +++ /dev/null @@ -1,150 +0,0 @@ -# CONFIG_3C515 is not set -CONFIG_8139CP=y -CONFIG_8139TOO=y -CONFIG_8139TOO_8129=y -CONFIG_8139TOO_PIO=y -# CONFIG_8139TOO_TUNE_TWISTER is not set -# CONFIG_8139_OLD_RX_RESET is not set -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -# CONFIG_ACPI_BATTERY is not set -# CONFIG_ACPI_CMPC is not set -# CONFIG_ACPI_CONTAINER is not set -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -CONFIG_ACPI_FAN=y -CONFIG_ACPI_HOTPLUG_IOAPIC=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -CONFIG_ACPI_THERMAL=y -# CONFIG_ACPI_TINY_POWER_BUTTON is not set -# CONFIG_ACPI_WMI is not set -CONFIG_ALIX=y -# CONFIG_AMD_PMC is not set -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -# CONFIG_ASUS_TF103C_DOCK is not set -# CONFIG_ATA_PIIX is not set -# CONFIG_BARCO_P50_GPIO is not set -CONFIG_CS5535_CLOCK_EVENT_SRC=y -CONFIG_CS5535_MFGPT=y -CONFIG_CS5535_MFGPT_DEFAULT_IRQ=7 -# CONFIG_CS89x0_ISA is not set -CONFIG_DMA_ACPI=y -# CONFIG_EL3 is not set -CONFIG_GEODE_WDT=y -CONFIG_GEOS=y -CONFIG_GPIOLIB=y -CONFIG_GPIO_ACPI=y -# CONFIG_GPIO_CASCADE is not set -CONFIG_GPIO_CDEV=y -CONFIG_GPIO_CS5535=y -# CONFIG_GPIO_SIM is not set -# CONFIG_HPET is not set -# CONFIG_HP_ACCEL is not set -CONFIG_HWMON=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -CONFIG_I2C_ALGOPCA=y -CONFIG_I2C_ALGOPCF=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_HID_ACPI is not set -# CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_MENLOW is not set -# CONFIG_INTEL_SAR_INT1092 is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -# CONFIG_INTEL_SOC_DTS_THERMAL is not set -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -CONFIG_ISA=y -# CONFIG_ISAPNP is not set -CONFIG_ISA_BUS_API=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_LANCE is not set -CONFIG_LEDS_GPIO=y -# CONFIG_M686 is not set -# CONFIG_MDA_CONSOLE is not set -CONFIG_MFD_CORE=y -CONFIG_MFD_CS5535=y -# CONFIG_MFD_INTEL_LPSS_ACPI is not set -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MFD_SIMPLE_MFD_I2C is not set -CONFIG_MGEODEGX1=y -# CONFIG_MIXCOMWD is not set -CONFIG_NATSEMI=y -CONFIG_NET5501=y -CONFIG_NSC_GPIO=y -CONFIG_PATA_CS5520=y -CONFIG_PATA_CS5530=y -CONFIG_PATA_CS5535=y -CONFIG_PATA_CS5536=y -CONFIG_PATA_SC1200=y -CONFIG_PC8736x_GPIO=y -# CONFIG_PCENGINES_APU2 is not set -CONFIG_PCI_MMCONFIG=y -# CONFIG_PCWATCHDOG is not set -CONFIG_PINCTRL=y -# CONFIG_PINCTRL_ALDERLAKE is not set -# CONFIG_PINCTRL_BAYTRAIL is not set -# CONFIG_PINCTRL_BROXTON is not set -# CONFIG_PINCTRL_CANNONLAKE is not set -# CONFIG_PINCTRL_CHERRYVIEW is not set -# CONFIG_PINCTRL_DENVERTON is not set -# CONFIG_PINCTRL_ELKHARTLAKE is not set -# CONFIG_PINCTRL_EMMITSBURG is not set -# CONFIG_PINCTRL_GEMINILAKE is not set -# CONFIG_PINCTRL_JASPERLAKE is not set -# CONFIG_PINCTRL_LAKEFIELD is not set -# CONFIG_PINCTRL_LEWISBURG is not set -# CONFIG_PINCTRL_LYNXPOINT is not set -# CONFIG_PINCTRL_SUNRISEPOINT is not set -# CONFIG_PINCTRL_TIGERLAKE is not set -# CONFIG_PMIC_OPREGION is not set -CONFIG_PNP=y -CONFIG_PNPACPI=y -# CONFIG_PNPBIOS is not set -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_RTC_I2C_AND_SPI=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SC1200_WDT=y -# CONFIG_SCSI_FDOMAIN_ISA is not set -CONFIG_SCx200_ACB=y -CONFIG_SCx200_WDT=y -# CONFIG_SENSORS_ASUS_EC is not set -CONFIG_SENSORS_LM90=y -# CONFIG_SENSORS_SY7636A is not set -# CONFIG_SENSORS_TMP464 is not set -CONFIG_SERIAL_8250_PNP=y -CONFIG_SERIAL_MCTRL_GPIO=y -# CONFIG_TOSHIBA_BT_RFKILL is not set -# CONFIG_USB_UHCI_HCD is not set -CONFIG_VIA_RHINE=y -CONFIG_VIA_RHINE_MMIO=y -# CONFIG_WDT is not set -# CONFIG_WIRELESS_HOTKEY is not set -# CONFIG_X86_ACPI_CPUFREQ is not set -CONFIG_X86_ALIGNMENT_16=y -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -CONFIG_X86_AMD_PSTATE=y -CONFIG_X86_CPUID=y -# CONFIG_X86_E_POWERSAVER is not set -CONFIG_X86_INTEL_LPSS=y -# CONFIG_X86_LONGHAUL is not set -# CONFIG_X86_MCE is not set -CONFIG_X86_MINIMUM_CPU_FAMILY=5 -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PM_TIMER=y -CONFIG_X86_REBOOTFIXUPS=y diff --git a/target/linux/x86/geode/config-5.19 b/target/linux/x86/geode/config-5.19 deleted file mode 100644 index 465fd617d..000000000 --- a/target/linux/x86/geode/config-5.19 +++ /dev/null @@ -1,150 +0,0 @@ -# CONFIG_3C515 is not set -CONFIG_8139CP=y -CONFIG_8139TOO=y -CONFIG_8139TOO_8129=y -CONFIG_8139TOO_PIO=y -# CONFIG_8139TOO_TUNE_TWISTER is not set -# CONFIG_8139_OLD_RX_RESET is not set -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -# CONFIG_ACPI_BATTERY is not set -# CONFIG_ACPI_CMPC is not set -# CONFIG_ACPI_CONTAINER is not set -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -CONFIG_ACPI_FAN=y -CONFIG_ACPI_HOTPLUG_IOAPIC=y -CONFIG_ACPI_I2C_OPREGION=y -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -CONFIG_ACPI_THERMAL=y -# CONFIG_ACPI_TINY_POWER_BUTTON is not set -# CONFIG_ACPI_WMI is not set -CONFIG_ALIX=y -# CONFIG_AMD_PMC is not set -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -# CONFIG_ASUS_TF103C_DOCK is not set -# CONFIG_ATA_PIIX is not set -# CONFIG_BARCO_P50_GPIO is not set -CONFIG_CS5535_CLOCK_EVENT_SRC=y -CONFIG_CS5535_MFGPT=y -CONFIG_CS5535_MFGPT_DEFAULT_IRQ=7 -# CONFIG_CS89x0_ISA is not set -CONFIG_DMA_ACPI=y -# CONFIG_EL3 is not set -CONFIG_GEODE_WDT=y -CONFIG_GEOS=y -CONFIG_GPIOLIB=y -CONFIG_GPIO_ACPI=y -# CONFIG_GPIO_CASCADE is not set -CONFIG_GPIO_CDEV=y -CONFIG_GPIO_CS5535=y -# CONFIG_GPIO_SIM is not set -# CONFIG_HPET is not set -# CONFIG_HP_ACCEL is not set -CONFIG_HWMON=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -CONFIG_I2C_ALGOPCA=y -CONFIG_I2C_ALGOPCF=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_HID_ACPI is not set -# CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_MENLOW is not set -# CONFIG_INTEL_SAR_INT1092 is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -# CONFIG_INTEL_SOC_DTS_THERMAL is not set -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -CONFIG_ISA=y -# CONFIG_ISAPNP is not set -CONFIG_ISA_BUS_API=y -# CONFIG_ISCSI_IBFT is not set -# CONFIG_LANCE is not set -CONFIG_LEDS_GPIO=y -# CONFIG_M686 is not set -# CONFIG_MDA_CONSOLE is not set -CONFIG_MFD_CORE=y -CONFIG_MFD_CS5535=y -# CONFIG_MFD_INTEL_LPSS_ACPI is not set -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MFD_SIMPLE_MFD_I2C is not set -CONFIG_MGEODEGX1=y -# CONFIG_MIXCOMWD is not set -CONFIG_NATSEMI=y -CONFIG_NET5501=y -CONFIG_NSC_GPIO=y -CONFIG_PATA_CS5520=y -CONFIG_PATA_CS5530=y -CONFIG_PATA_CS5535=y -CONFIG_PATA_CS5536=y -CONFIG_PATA_SC1200=y -CONFIG_PC8736x_GPIO=y -# CONFIG_PCENGINES_APU2 is not set -CONFIG_PCI_MMCONFIG=y -# CONFIG_PCWATCHDOG is not set -CONFIG_PINCTRL=y -# CONFIG_PINCTRL_ALDERLAKE is not set -# CONFIG_PINCTRL_BAYTRAIL is not set -# CONFIG_PINCTRL_BROXTON is not set -# CONFIG_PINCTRL_CANNONLAKE is not set -# CONFIG_PINCTRL_CHERRYVIEW is not set -# CONFIG_PINCTRL_DENVERTON is not set -# CONFIG_PINCTRL_ELKHARTLAKE is not set -# CONFIG_PINCTRL_EMMITSBURG is not set -# CONFIG_PINCTRL_GEMINILAKE is not set -# CONFIG_PINCTRL_JASPERLAKE is not set -# CONFIG_PINCTRL_LAKEFIELD is not set -# CONFIG_PINCTRL_LEWISBURG is not set -# CONFIG_PINCTRL_LYNXPOINT is not set -# CONFIG_PINCTRL_SUNRISEPOINT is not set -# CONFIG_PINCTRL_TIGERLAKE is not set -# CONFIG_PMIC_OPREGION is not set -CONFIG_PNP=y -CONFIG_PNPACPI=y -# CONFIG_PNPBIOS is not set -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_RTC_I2C_AND_SPI=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SC1200_WDT=y -# CONFIG_SCSI_FDOMAIN_ISA is not set -CONFIG_SCx200_ACB=y -CONFIG_SCx200_WDT=y -# CONFIG_SENSORS_ASUS_EC is not set -CONFIG_SENSORS_LM90=y -# CONFIG_SENSORS_SY7636A is not set -# CONFIG_SENSORS_TMP464 is not set -CONFIG_SERIAL_8250_PNP=y -CONFIG_SERIAL_MCTRL_GPIO=y -# CONFIG_TOSHIBA_BT_RFKILL is not set -# CONFIG_USB_UHCI_HCD is not set -CONFIG_VIA_RHINE=y -CONFIG_VIA_RHINE_MMIO=y -# CONFIG_WDT is not set -# CONFIG_WIRELESS_HOTKEY is not set -# CONFIG_X86_ACPI_CPUFREQ is not set -CONFIG_X86_ALIGNMENT_16=y -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -CONFIG_X86_AMD_PSTATE=y -CONFIG_X86_CPUID=y -# CONFIG_X86_E_POWERSAVER is not set -CONFIG_X86_INTEL_LPSS=y -# CONFIG_X86_LONGHAUL is not set -# CONFIG_X86_MCE is not set -CONFIG_X86_MINIMUM_CPU_FAMILY=5 -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PM_TIMER=y -CONFIG_X86_REBOOTFIXUPS=y diff --git a/target/linux/x86/legacy/config-5.18 b/target/linux/x86/legacy/config-5.18 deleted file mode 100644 index f159d79c4..000000000 --- a/target/linux/x86/legacy/config-5.18 +++ /dev/null @@ -1,230 +0,0 @@ -# CONFIG_3C515 is not set -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -CONFIG_ACPI_BUTTON=y -# CONFIG_ACPI_CMPC is not set -# CONFIG_ACPI_CONTAINER is not set -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -# CONFIG_ACPI_FAN is not set -CONFIG_ACPI_HOTPLUG_IOAPIC=y -# CONFIG_ACPI_I2C_OPREGION is not set -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -CONFIG_ACPI_THERMAL=y -CONFIG_ACPI_VIDEO=y -# CONFIG_ACPI_WMI is not set -CONFIG_AGP=y -# CONFIG_AGP_ALI is not set -# CONFIG_AGP_AMD is not set -# CONFIG_AGP_AMD64 is not set -# CONFIG_AGP_ATI is not set -# CONFIG_AGP_EFFICEON is not set -CONFIG_AGP_INTEL=y -# CONFIG_AGP_NVIDIA is not set -# CONFIG_AGP_SIS is not set -# CONFIG_AGP_SWORKS is not set -# CONFIG_AGP_VIA is not set -# CONFIG_AMD_PMC is not set -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BLK_DEV_SR=y -CONFIG_CDROM=y -CONFIG_CPU_IDLE_GOV_MENU=y -# CONFIG_CS89x0_ISA is not set -CONFIG_DMA_ACPI=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DRM=y -CONFIG_DRM_AMDGPU=y -# CONFIG_DRM_AMD_DC is not set -CONFIG_DRM_BOCHS=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_BUDDY=y -CONFIG_DRM_DP_HELPER=y -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=100 -CONFIG_DRM_I915=y -CONFIG_DRM_I915_CAPTURE_ERROR=y -CONFIG_DRM_I915_COMPRESS_ERROR=y -# CONFIG_DRM_I915_DEBUG is not set -# CONFIG_DRM_I915_DEBUG_GUC is not set -# CONFIG_DRM_I915_DEBUG_MMIO is not set -# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set -# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set -CONFIG_DRM_I915_FENCE_TIMEOUT=10000 -CONFIG_DRM_I915_FORCE_PROBE="" -CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 -# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set -CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 -CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 -# CONFIG_DRM_I915_SELFTEST is not set -CONFIG_DRM_I915_STOP_TIMEOUT=100 -# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set -# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set -CONFIG_DRM_I915_TIMESLICE_DURATION=1 -CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 -CONFIG_DRM_I915_USERPTR=y -# CONFIG_DRM_I915_WERROR is not set -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MIPI_DSI=y -CONFIG_DRM_NOMODESET=y -CONFIG_DRM_PANEL=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_DRM_RADEON=y -CONFIG_DRM_SCHED=y -# CONFIG_DRM_SIMPLEDRM is not set -# CONFIG_DRM_SSD130X is not set -CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_HELPER=y -CONFIG_DRM_VRAM_HELPER=y -# CONFIG_EL3 is not set -CONFIG_FB=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_CMDLINE=y -CONFIG_FB_DEFERRED_IO=y -# CONFIG_FB_I810 is not set -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_VESA is not set -CONFIG_FONT_8x16=y -CONFIG_FONT_8x8=y -CONFIG_FONT_SUPPORT=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -CONFIG_HDMI=y -CONFIG_HID_BATTERY_STRENGTH=y -# CONFIG_HIGHMEM4G is not set -CONFIG_HPET=y -CONFIG_HPET_MMAP=y -# CONFIG_HP_ACCEL is not set -CONFIG_HWMON=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_HID_ACPI is not set -CONFIG_INPUT_MOUSE=y -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INTEL_GTT=y -CONFIG_INTEL_IDLE=y -# CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_MEI_HDCP is not set -# CONFIG_INTEL_MEI_PXP is not set -# CONFIG_INTEL_MENLOW is not set -# CONFIG_INTEL_SAR_INT1092 is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -# CONFIG_INTEL_SOC_DTS_THERMAL is not set -CONFIG_INTERVAL_TREE=y -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -CONFIG_ISA=y -CONFIG_ISAPNP=y -CONFIG_ISA_BUS_API=y -# CONFIG_ISCSI_IBFT is not set -CONFIG_ISO9660_FS=y -# CONFIG_JOLIET is not set -CONFIG_KCMP=y -# CONFIG_LANCE is not set -CONFIG_M586MMX=y -# CONFIG_M686 is not set -# CONFIG_MDA_CONSOLE is not set -CONFIG_MFD_CORE=y -CONFIG_MFD_INTEL_LPSS=y -CONFIG_MFD_INTEL_LPSS_ACPI=y -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MFD_SIMPLE_MFD_I2C is not set -# CONFIG_MIXCOMWD is not set -CONFIG_MMU_NOTIFIER=y -# CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_CYAPA is not set -CONFIG_MOUSE_PS2=y -CONFIG_MOUSE_PS2_ALPS=y -# CONFIG_MOUSE_PS2_BYD is not set -# CONFIG_MOUSE_PS2_CYPRESS is not set -# CONFIG_MOUSE_PS2_ELANTECH is not set -CONFIG_MOUSE_PS2_LIFEBOOK=y -CONFIG_MOUSE_PS2_LOGIPS2PP=y -CONFIG_MOUSE_PS2_SMBUS=y -CONFIG_MOUSE_PS2_SYNAPTICS=y -CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y -# CONFIG_MOUSE_PS2_TOUCHKIT is not set -CONFIG_MOUSE_PS2_TRACKPOINT=y -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_VSXXXAA is not set -CONFIG_NOHIGHMEM=y -CONFIG_NO_HZ=y -CONFIG_PATA_AMD=y -CONFIG_PATA_ATIIXP=y -CONFIG_PATA_LEGACY=y -CONFIG_PATA_MPIIX=y -CONFIG_PATA_OLDPIIX=y -CONFIG_PATA_PLATFORM=y -CONFIG_PATA_SC1200=y -CONFIG_PATA_SIS=y -CONFIG_PATA_TIMINGS=y -CONFIG_PATA_VIA=y -CONFIG_PCIEAER=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCI_MMCONFIG=y -# CONFIG_PCWATCHDOG is not set -# CONFIG_PMIC_OPREGION is not set -CONFIG_PNP=y -CONFIG_PNPACPI=y -# CONFIG_PNPBIOS is not set -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_RAS=y -CONFIG_RELAY=y -CONFIG_RTC_I2C_AND_SPI=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SATA_AHCI=y -# CONFIG_SCSI_FDOMAIN_ISA is not set -# CONFIG_SENSORS_ASUS_EC is not set -# CONFIG_SENSORS_SY7636A is not set -# CONFIG_SENSORS_TMP464 is not set -CONFIG_SERIAL_8250_PNP=y -CONFIG_SYNC_FILE=y -# CONFIG_SYSTEM76_ACPI is not set -# CONFIG_TOSHIBA_BT_RFKILL is not set -CONFIG_USB_STORAGE=y -CONFIG_VMAP_PFN=y -# CONFIG_WDT is not set -# CONFIG_WIRELESS_HOTKEY is not set -CONFIG_X86_ACPI_CPUFREQ=y -# CONFIG_X86_ACPI_CPUFREQ_CPB is not set -CONFIG_X86_ALIGNMENT_16=y -# CONFIG_X86_AMD_FREQ_SENSITIVITY is not set -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -CONFIG_X86_AMD_PSTATE=y -# CONFIG_X86_E_POWERSAVER is not set -CONFIG_X86_F00F_BUG=y -# CONFIG_X86_INTEL_LPSS is not set -# CONFIG_X86_LONGHAUL is not set -CONFIG_X86_MINIMUM_CPU_FAMILY=5 -# CONFIG_X86_PAE is not set -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PM_TIMER=y -# CONFIG_X86_POWERNOW_K8 is not set -CONFIG_ZLIB_DEFLATE=y diff --git a/target/linux/x86/legacy/config-5.19 b/target/linux/x86/legacy/config-5.19 deleted file mode 100644 index f159d79c4..000000000 --- a/target/linux/x86/legacy/config-5.19 +++ /dev/null @@ -1,230 +0,0 @@ -# CONFIG_3C515 is not set -CONFIG_ACPI=y -CONFIG_ACPI_AC=y -CONFIG_ACPI_BATTERY=y -CONFIG_ACPI_BUTTON=y -# CONFIG_ACPI_CMPC is not set -# CONFIG_ACPI_CONTAINER is not set -CONFIG_ACPI_CPU_FREQ_PSS=y -# CONFIG_ACPI_DEBUG is not set -# CONFIG_ACPI_DEBUGGER is not set -# CONFIG_ACPI_DOCK is not set -# CONFIG_ACPI_DPTF is not set -# CONFIG_ACPI_EC_DEBUGFS is not set -# CONFIG_ACPI_FAN is not set -CONFIG_ACPI_HOTPLUG_IOAPIC=y -# CONFIG_ACPI_I2C_OPREGION is not set -CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y -# CONFIG_ACPI_PCI_SLOT is not set -CONFIG_ACPI_PROCESSOR=y -# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set -CONFIG_ACPI_PROCESSOR_CSTATE=y -CONFIG_ACPI_PROCESSOR_IDLE=y -CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y -# CONFIG_ACPI_SBS is not set -CONFIG_ACPI_SPCR_TABLE=y -CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y -CONFIG_ACPI_THERMAL=y -CONFIG_ACPI_VIDEO=y -# CONFIG_ACPI_WMI is not set -CONFIG_AGP=y -# CONFIG_AGP_ALI is not set -# CONFIG_AGP_AMD is not set -# CONFIG_AGP_AMD64 is not set -# CONFIG_AGP_ATI is not set -# CONFIG_AGP_EFFICEON is not set -CONFIG_AGP_INTEL=y -# CONFIG_AGP_NVIDIA is not set -# CONFIG_AGP_SIS is not set -# CONFIG_AGP_SWORKS is not set -# CONFIG_AGP_VIA is not set -# CONFIG_AMD_PMC is not set -CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y -CONFIG_BACKLIGHT_CLASS_DEVICE=y -CONFIG_BLK_DEV_SR=y -CONFIG_CDROM=y -CONFIG_CPU_IDLE_GOV_MENU=y -# CONFIG_CS89x0_ISA is not set -CONFIG_DMA_ACPI=y -CONFIG_DMA_SHARED_BUFFER=y -CONFIG_DRM=y -CONFIG_DRM_AMDGPU=y -# CONFIG_DRM_AMD_DC is not set -CONFIG_DRM_BOCHS=y -CONFIG_DRM_BRIDGE=y -CONFIG_DRM_BUDDY=y -CONFIG_DRM_DP_HELPER=y -CONFIG_DRM_FBDEV_EMULATION=y -CONFIG_DRM_FBDEV_OVERALLOC=100 -CONFIG_DRM_I915=y -CONFIG_DRM_I915_CAPTURE_ERROR=y -CONFIG_DRM_I915_COMPRESS_ERROR=y -# CONFIG_DRM_I915_DEBUG is not set -# CONFIG_DRM_I915_DEBUG_GUC is not set -# CONFIG_DRM_I915_DEBUG_MMIO is not set -# CONFIG_DRM_I915_DEBUG_RUNTIME_PM is not set -# CONFIG_DRM_I915_DEBUG_VBLANK_EVADE is not set -CONFIG_DRM_I915_FENCE_TIMEOUT=10000 -CONFIG_DRM_I915_FORCE_PROBE="" -CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 -# CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS is not set -CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 -CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 -# CONFIG_DRM_I915_SELFTEST is not set -CONFIG_DRM_I915_STOP_TIMEOUT=100 -# CONFIG_DRM_I915_SW_FENCE_CHECK_DAG is not set -# CONFIG_DRM_I915_SW_FENCE_DEBUG_OBJECTS is not set -CONFIG_DRM_I915_TIMESLICE_DURATION=1 -CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 -CONFIG_DRM_I915_USERPTR=y -# CONFIG_DRM_I915_WERROR is not set -CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_MIPI_DSI=y -CONFIG_DRM_NOMODESET=y -CONFIG_DRM_PANEL=y -CONFIG_DRM_PANEL_BRIDGE=y -CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_DRM_RADEON=y -CONFIG_DRM_SCHED=y -# CONFIG_DRM_SIMPLEDRM is not set -# CONFIG_DRM_SSD130X is not set -CONFIG_DRM_TTM=y -CONFIG_DRM_TTM_HELPER=y -CONFIG_DRM_VRAM_HELPER=y -# CONFIG_EL3 is not set -CONFIG_FB=y -CONFIG_FB_CFB_COPYAREA=y -CONFIG_FB_CFB_FILLRECT=y -CONFIG_FB_CFB_IMAGEBLIT=y -CONFIG_FB_CMDLINE=y -CONFIG_FB_DEFERRED_IO=y -# CONFIG_FB_I810 is not set -CONFIG_FB_SYS_COPYAREA=y -CONFIG_FB_SYS_FILLRECT=y -CONFIG_FB_SYS_FOPS=y -CONFIG_FB_SYS_IMAGEBLIT=y -# CONFIG_FB_VESA is not set -CONFIG_FONT_8x16=y -CONFIG_FONT_8x8=y -CONFIG_FONT_SUPPORT=y -CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y -CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -CONFIG_HDMI=y -CONFIG_HID_BATTERY_STRENGTH=y -# CONFIG_HIGHMEM4G is not set -CONFIG_HPET=y -CONFIG_HPET_MMAP=y -# CONFIG_HP_ACCEL is not set -CONFIG_HWMON=y -CONFIG_I2C=y -CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_AMD_MP2 is not set -CONFIG_I2C_BOARDINFO=y -# CONFIG_I2C_HID_ACPI is not set -CONFIG_INPUT_MOUSE=y -CONFIG_INPUT_MOUSEDEV=y -CONFIG_INPUT_MOUSEDEV_PSAUX=y -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INTEL_GTT=y -CONFIG_INTEL_IDLE=y -# CONFIG_INTEL_IPS is not set -# CONFIG_INTEL_MEI_HDCP is not set -# CONFIG_INTEL_MEI_PXP is not set -# CONFIG_INTEL_MENLOW is not set -# CONFIG_INTEL_SAR_INT1092 is not set -# CONFIG_INTEL_SCU_PLATFORM is not set -# CONFIG_INTEL_SOC_DTS_THERMAL is not set -CONFIG_INTERVAL_TREE=y -CONFIG_IOSF_MBI=y -# CONFIG_IOSF_MBI_DEBUG is not set -CONFIG_ISA=y -CONFIG_ISAPNP=y -CONFIG_ISA_BUS_API=y -# CONFIG_ISCSI_IBFT is not set -CONFIG_ISO9660_FS=y -# CONFIG_JOLIET is not set -CONFIG_KCMP=y -# CONFIG_LANCE is not set -CONFIG_M586MMX=y -# CONFIG_M686 is not set -# CONFIG_MDA_CONSOLE is not set -CONFIG_MFD_CORE=y -CONFIG_MFD_INTEL_LPSS=y -CONFIG_MFD_INTEL_LPSS_ACPI=y -# CONFIG_MFD_INTEL_PMC_BXT is not set -# CONFIG_MFD_SIMPLE_MFD_I2C is not set -# CONFIG_MIXCOMWD is not set -CONFIG_MMU_NOTIFIER=y -# CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_CYAPA is not set -CONFIG_MOUSE_PS2=y -CONFIG_MOUSE_PS2_ALPS=y -# CONFIG_MOUSE_PS2_BYD is not set -# CONFIG_MOUSE_PS2_CYPRESS is not set -# CONFIG_MOUSE_PS2_ELANTECH is not set -CONFIG_MOUSE_PS2_LIFEBOOK=y -CONFIG_MOUSE_PS2_LOGIPS2PP=y -CONFIG_MOUSE_PS2_SMBUS=y -CONFIG_MOUSE_PS2_SYNAPTICS=y -CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y -# CONFIG_MOUSE_PS2_TOUCHKIT is not set -CONFIG_MOUSE_PS2_TRACKPOINT=y -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_VSXXXAA is not set -CONFIG_NOHIGHMEM=y -CONFIG_NO_HZ=y -CONFIG_PATA_AMD=y -CONFIG_PATA_ATIIXP=y -CONFIG_PATA_LEGACY=y -CONFIG_PATA_MPIIX=y -CONFIG_PATA_OLDPIIX=y -CONFIG_PATA_PLATFORM=y -CONFIG_PATA_SC1200=y -CONFIG_PATA_SIS=y -CONFIG_PATA_TIMINGS=y -CONFIG_PATA_VIA=y -CONFIG_PCIEAER=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCI_MMCONFIG=y -# CONFIG_PCWATCHDOG is not set -# CONFIG_PMIC_OPREGION is not set -CONFIG_PNP=y -CONFIG_PNPACPI=y -# CONFIG_PNPBIOS is not set -CONFIG_PNP_DEBUG_MESSAGES=y -CONFIG_RAS=y -CONFIG_RELAY=y -CONFIG_RTC_I2C_AND_SPI=y -# CONFIG_SAMSUNG_Q10 is not set -CONFIG_SATA_AHCI=y -# CONFIG_SCSI_FDOMAIN_ISA is not set -# CONFIG_SENSORS_ASUS_EC is not set -# CONFIG_SENSORS_SY7636A is not set -# CONFIG_SENSORS_TMP464 is not set -CONFIG_SERIAL_8250_PNP=y -CONFIG_SYNC_FILE=y -# CONFIG_SYSTEM76_ACPI is not set -# CONFIG_TOSHIBA_BT_RFKILL is not set -CONFIG_USB_STORAGE=y -CONFIG_VMAP_PFN=y -# CONFIG_WDT is not set -# CONFIG_WIRELESS_HOTKEY is not set -CONFIG_X86_ACPI_CPUFREQ=y -# CONFIG_X86_ACPI_CPUFREQ_CPB is not set -CONFIG_X86_ALIGNMENT_16=y -# CONFIG_X86_AMD_FREQ_SENSITIVITY is not set -# CONFIG_X86_AMD_PLATFORM_DEVICE is not set -CONFIG_X86_AMD_PSTATE=y -# CONFIG_X86_E_POWERSAVER is not set -CONFIG_X86_F00F_BUG=y -# CONFIG_X86_INTEL_LPSS is not set -# CONFIG_X86_LONGHAUL is not set -CONFIG_X86_MINIMUM_CPU_FAMILY=5 -# CONFIG_X86_PAE is not set -# CONFIG_X86_PCC_CPUFREQ is not set -CONFIG_X86_PM_TIMER=y -# CONFIG_X86_POWERNOW_K8 is not set -CONFIG_ZLIB_DEFLATE=y diff --git a/target/linux/x86/modules.mk b/target/linux/x86/modules.mk index 00f35c044..876f40f40 100644 --- a/target/linux/x86/modules.mk +++ b/target/linux/x86/modules.mk @@ -22,7 +22,8 @@ $(eval $(call KernelPackage,amazon-ena)) define KernelPackage/amd-xgbe SUBMENU:=$(NETWORK_DEVICES_MENU) TITLE:=AMD Ethernet on SoC support - DEPENDS:=@PCI_SUPPORT @TARGET_x86_64 +kmod-lib-crc32c +kmod-ptp +kmod-libphy +(LINUX_5_10||LINUX_5_15||LINUX_5_19||LINUX_6_0):kmod-mdio-devres + DEPENDS:=@PCI_SUPPORT @TARGET_x86_64 +kmod-lib-crc32c +kmod-ptp +kmod-libphy \ + +(LINUX_5_10||LINUX_5_15||LINUX_6_0):kmod-mdio-devres KCONFIG:=CONFIG_AMD_XGBE FILES:=$(LINUX_DIR)/drivers/net/ethernet/amd/xgbe/amd-xgbe.ko AUTOLOAD:=$(call AutoLoad,35,amd-xgbe) diff --git a/target/linux/x86/patches-5.19/100-fix_cs5535_clockevt.patch b/target/linux/x86/patches-5.19/100-fix_cs5535_clockevt.patch deleted file mode 100644 index d4de2027b..000000000 --- a/target/linux/x86/patches-5.19/100-fix_cs5535_clockevt.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/drivers/clocksource/timer-cs5535.c -+++ b/drivers/clocksource/timer-cs5535.c -@@ -127,7 +127,9 @@ static irqreturn_t mfgpt_tick(int irq, v - cs5535_mfgpt_write(cs5535_event_clock, MFGPT_REG_SETUP, - MFGPT_SETUP_CNTEN | MFGPT_SETUP_CMP2); - -- cs5535_clockevent.event_handler(&cs5535_clockevent); -+ if (cs5535_clockevent.event_handler) -+ cs5535_clockevent.event_handler(&cs5535_clockevent); -+ - return IRQ_HANDLED; - } - diff --git a/target/linux/x86/patches-5.19/800-add-rts5139.patch b/target/linux/x86/patches-5.19/800-add-rts5139.patch deleted file mode 100644 index 4a0836046..000000000 --- a/target/linux/x86/patches-5.19/800-add-rts5139.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/drivers/staging/Kconfig -+++ b/drivers/staging/Kconfig -@@ -40,2 +40,4 @@ - -+source "drivers/staging/rts5139/Kconfig" -+ - source "drivers/staging/rts5208/Kconfig" - ---- a/drivers/staging/Makefile -+++ b/drivers/staging/Makefile -@@ -11,2 +11,3 @@ - obj-$(CONFIG_R8188EU) += r8188eu/ -+obj-$(CONFIG_RTS5139) += rts5139/ - obj-$(CONFIG_RTS5208) += rts5208/ diff --git a/target/linux/x86/patches-5.19/992-enable-intel-guc.patch b/target/linux/x86/patches-5.19/992-enable-intel-guc.patch deleted file mode 100644 index 26ea41594..000000000 --- a/target/linux/x86/patches-5.19/992-enable-intel-guc.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/drivers/gpu/drm/i915/gt/uc/intel_uc.c -+++ b/drivers/gpu/drm/i915/gt/uc/intel_uc.c -@@ -26,7 +26,7 @@ static void uc_expand_default_options(st - return; - - /* Don't enable GuC/HuC on pre-Gen12 */ -- if (GRAPHICS_VER(i915) < 12) { -+ if (GRAPHICS_VER(i915) < 9) { - i915->params.enable_guc = 0; - return; - } diff --git a/target/linux/x86/patches-5.19/993-bnx2x_warpcore_8727_2_5g_sgmii_txfault.patch b/target/linux/x86/patches-5.19/993-bnx2x_warpcore_8727_2_5g_sgmii_txfault.patch deleted file mode 100644 index a41f45a52..000000000 --- a/target/linux/x86/patches-5.19/993-bnx2x_warpcore_8727_2_5g_sgmii_txfault.patch +++ /dev/null @@ -1,216 +0,0 @@ ---- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h -+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h -@@ -1592,6 +1592,7 @@ struct bnx2x { - uint num_ethernet_queues; - uint num_cnic_queues; - int disable_tpa; -+ int mask_tx_fault; - - u32 rx_mode; - #define BNX2X_RX_MODE_NONE 0 ---- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c -+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c -@@ -151,6 +151,7 @@ typedef int (*read_sfp_module_eeprom_fun - - #define SFP_EEPROM_CON_TYPE_ADDR 0x2 - #define SFP_EEPROM_CON_TYPE_VAL_UNKNOWN 0x0 -+ #define SFP_EEPROM_CON_TYPE_VAL_SC 0x1 - #define SFP_EEPROM_CON_TYPE_VAL_LC 0x7 - #define SFP_EEPROM_CON_TYPE_VAL_COPPER 0x21 - #define SFP_EEPROM_CON_TYPE_VAL_RJ45 0x22 -@@ -4210,6 +4211,16 @@ static void bnx2x_warpcore_set_sgmii_spe - 0x1000); - DP(NETIF_MSG_LINK, "set SGMII AUTONEG\n"); - } else { -+ /* Note that 2.5G works only when used with 1G advertisment */ -+ if (fiber_mode && (phy->req_line_speed == SPEED_2500) && -+ (phy->speed_cap_mask & -+ (PORT_HW_CFG_SPEED_CAPABILITY_D0_1G | -+ PORT_HW_CFG_SPEED_CAPABILITY_D0_2_5G))) { -+ bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, -+ MDIO_WC_REG_SERDESDIGITAL_MISC1, -+ 0x6010); -+ } -+ - bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, - MDIO_WC_REG_COMBO_IEEE0_MIICTRL, &val16); - val16 &= 0xcebf; -@@ -4220,6 +4231,7 @@ static void bnx2x_warpcore_set_sgmii_spe - val16 |= 0x2000; - break; - case SPEED_1000: -+ case SPEED_2500: - val16 |= 0x0040; - break; - default: -@@ -8174,6 +8186,7 @@ static int bnx2x_get_edc_mode(struct bnx - break; - } - case SFP_EEPROM_CON_TYPE_VAL_UNKNOWN: -+ case SFP_EEPROM_CON_TYPE_VAL_SC: - case SFP_EEPROM_CON_TYPE_VAL_LC: - case SFP_EEPROM_CON_TYPE_VAL_RJ45: - check_limiting_mode = 1; -@@ -8184,7 +8197,8 @@ static int bnx2x_get_edc_mode(struct bnx - (val[SFP_EEPROM_1G_COMP_CODE_ADDR] != 0)) { - DP(NETIF_MSG_LINK, "1G SFP module detected\n"); - phy->media_type = ETH_PHY_SFP_1G_FIBER; -- if (phy->req_line_speed != SPEED_1000) { -+ if ((phy->req_line_speed != SPEED_1000) && -+ (phy->req_line_speed != SPEED_2500)) { - u8 gport = params->port; - phy->req_line_speed = SPEED_1000; - if (!CHIP_IS_E1x(bp)) { -@@ -8344,7 +8358,7 @@ static int bnx2x_wait_for_sfp_module_ini - * some phys type ( e.g. JDSU ) - */ - -- for (timeout = 0; timeout < 60; timeout++) { -+ for (timeout = 0; timeout < 1800; timeout++) { - if (phy->type == PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT) - rc = bnx2x_warpcore_read_sfp_module_eeprom( - phy, params, I2C_DEV_ADDR_A0, 1, 1, &val, -@@ -9238,6 +9252,7 @@ static void bnx2x_8727_config_speed(stru - u16 tmp1, val; - /* Set option 1G speed */ - if ((phy->req_line_speed == SPEED_1000) || -+ (phy->req_line_speed == SPEED_2500) || - (phy->media_type == ETH_PHY_SFP_1G_FIBER)) { - DP(NETIF_MSG_LINK, "Setting 1G force\n"); - bnx2x_cl45_write(bp, phy, -@@ -9247,6 +9262,22 @@ static void bnx2x_8727_config_speed(stru - bnx2x_cl45_read(bp, phy, - MDIO_PMA_DEVAD, MDIO_PMA_REG_10G_CTRL2, &tmp1); - DP(NETIF_MSG_LINK, "1.7 = 0x%x\n", tmp1); -+ if ((phy->req_line_speed == SPEED_2500) && -+ (phy->speed_cap_mask & -+ (PORT_HW_CFG_SPEED_CAPABILITY_D0_1G | -+ PORT_HW_CFG_SPEED_CAPABILITY_D0_2_5G))) { -+ bnx2x_cl45_read_and_write(bp, phy, -+ MDIO_AN_DEVAD, -+ MDIO_AN_REG_8727_MISC_CTRL2, -+ ~(1<<5)); -+ bnx2x_cl45_write(bp, phy, -+ MDIO_AN_DEVAD, -+ MDIO_AN_REG_8727_MISC_CTRL1, 0x0010); -+ } else { -+ bnx2x_cl45_write(bp, phy, -+ MDIO_AN_DEVAD, -+ MDIO_AN_REG_8727_MISC_CTRL1, 0x001C); -+ } - /* Power down the XAUI until link is up in case of dual-media - * and 1G - */ -@@ -9268,7 +9299,7 @@ static void bnx2x_8727_config_speed(stru - - DP(NETIF_MSG_LINK, "Setting 1G clause37\n"); - bnx2x_cl45_write(bp, phy, -- MDIO_AN_DEVAD, MDIO_AN_REG_8727_MISC_CTRL, 0); -+ MDIO_AN_DEVAD, MDIO_AN_REG_8727_MISC_CTRL2, 0); - bnx2x_cl45_write(bp, phy, - MDIO_AN_DEVAD, MDIO_AN_REG_CL37_AN, 0x1300); - } else { -@@ -9276,9 +9307,12 @@ static void bnx2x_8727_config_speed(stru - * registers although it is default - */ - bnx2x_cl45_write(bp, phy, -- MDIO_AN_DEVAD, MDIO_AN_REG_8727_MISC_CTRL, -+ MDIO_AN_DEVAD, MDIO_AN_REG_8727_MISC_CTRL2, - 0x0020); - bnx2x_cl45_write(bp, phy, -+ MDIO_AN_DEVAD, MDIO_AN_REG_8727_MISC_CTRL1, -+ 0x001C); -+ bnx2x_cl45_write(bp, phy, - MDIO_AN_DEVAD, MDIO_AN_REG_CL37_AN, 0x0100); - bnx2x_cl45_write(bp, phy, - MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 0x2040); -@@ -9567,6 +9601,11 @@ static u8 bnx2x_8727_read_status(struct - vars->line_speed = SPEED_10000; - DP(NETIF_MSG_LINK, "port %x: External link up in 10G\n", - params->port); -+ } else if ((link_status & (1<<1)) && (!(link_status & (1<<14)))) { -+ link_up = 1; -+ vars->line_speed = SPEED_2500; -+ DP(NETIF_MSG_LINK, "port %x: External link up in 2.5G\n", -+ params->port); - } else if ((link_status & (1<<0)) && (!(link_status & (1<<13)))) { - link_up = 1; - vars->line_speed = SPEED_1000; -@@ -9598,7 +9637,8 @@ static u8 bnx2x_8727_read_status(struct - } - - if ((DUAL_MEDIA(params)) && -- (phy->req_line_speed == SPEED_1000)) { -+ ((phy->req_line_speed == SPEED_1000) || -+ (phy->req_line_speed == SPEED_2500))) { - bnx2x_cl45_read(bp, phy, - MDIO_PMA_DEVAD, - MDIO_PMA_REG_8727_PCS_GP, &val1); -@@ -11722,6 +11762,7 @@ static const struct bnx2x_phy phy_warpco - SUPPORTED_100baseT_Full | - SUPPORTED_1000baseT_Full | - SUPPORTED_1000baseKX_Full | -+ SUPPORTED_2500baseX_Full | - SUPPORTED_10000baseT_Full | - SUPPORTED_10000baseKR_Full | - SUPPORTED_20000baseKR2_Full | -@@ -11908,6 +11949,7 @@ static const struct bnx2x_phy phy_8727 = - .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, - .mdio_ctrl = 0, - .supported = (SUPPORTED_10000baseT_Full | -+ SUPPORTED_2500baseX_Full | - SUPPORTED_1000baseT_Full | - SUPPORTED_FIBRE | - SUPPORTED_Pause | -@@ -12255,6 +12297,7 @@ static int bnx2x_populate_int_phy(struct - break; - case PORT_HW_CFG_NET_SERDES_IF_SFI: - phy->supported &= (SUPPORTED_1000baseT_Full | -+ SUPPORTED_2500baseX_Full | - SUPPORTED_10000baseT_Full | - SUPPORTED_FIBRE | - SUPPORTED_Pause | -@@ -13939,7 +13982,8 @@ void bnx2x_period_func(struct link_param - & PORT_HW_CFG_NET_SERDES_IF_MASK) == - PORT_HW_CFG_NET_SERDES_IF_SFI) { - if (bnx2x_is_sfp_module_plugged(phy, params)) { -- bnx2x_sfp_tx_fault_detection(phy, params, vars); -+ if(!((params->port + 1) & bp->mask_tx_fault)) -+ bnx2x_sfp_tx_fault_detection(phy, params, vars); - } else if (vars->link_status & - LINK_STATUS_SFP_TX_FAULT) { - /* Clean trail, interrupt corrects the leds */ ---- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c -+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c -@@ -113,6 +113,10 @@ static int disable_tpa; - module_param(disable_tpa, int, 0444); - MODULE_PARM_DESC(disable_tpa, " Disable the TPA (LRO) feature"); - -+static int mask_tx_fault; -+module_param(mask_tx_fault, int, 0444); -+MODULE_PARM_DESC(mask_tx_fault, " Mask SFP TX fault detection"); -+ - static int int_mode; - module_param(int_mode, int, 0444); - MODULE_PARM_DESC(int_mode, " Force interrupt mode other than MSI-X " -@@ -12342,6 +12346,8 @@ static int bnx2x_init_bp(struct bnx2x *b - if (BP_NOMCP(bp) && (func == 0)) - dev_err(&bp->pdev->dev, "MCP disabled, must load devices in order!\n"); - -+ bp->mask_tx_fault = mask_tx_fault; -+ - bp->disable_tpa = disable_tpa; - bp->disable_tpa |= !!IS_MF_STORAGE_ONLY(bp); - /* Reduce memory usage in kdump environment by disabling TPA */ ---- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h -+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h -@@ -7169,7 +7169,8 @@ Theotherbitsarereservedandshouldbezero*/ - #define MDIO_PMA_REG_8727_PCS_GP 0xc842 - #define MDIO_PMA_REG_8727_OPT_CFG_REG 0xc8e4 - --#define MDIO_AN_REG_8727_MISC_CTRL 0x8309 -+#define MDIO_AN_REG_8727_MISC_CTRL1 0x8308 -+#define MDIO_AN_REG_8727_MISC_CTRL2 0x8309 - - #define MDIO_PMA_REG_8073_CHIP_REV 0xc801 - #define MDIO_PMA_REG_8073_SPEED_LINK_STATUS 0xc820