--- linux-azure-6.5.0.orig/Documentation/ABI/testing/ima_policy +++ linux-azure-6.5.0/Documentation/ABI/testing/ima_policy @@ -26,7 +26,7 @@ [uid=] [euid=] [gid=] [egid=] [fowner=] [fgroup=]] lsm: [[subj_user=] [subj_role=] [subj_type=] - [obj_user=] [obj_role=] [obj_type=]] + [obj_user=] [obj_role=] [obj_type=] [lsm=]] option: [digest_type=] [template=] [permit_directio] [appraise_type=] [appraise_flag=] [appraise_algos=] [keyrings=] @@ -138,6 +138,12 @@ measure subj_user=_ func=FILE_CHECK mask=MAY_READ + It is possible to explicitly specify which security + module a rule applies to using lsm=. If the security + module specified is not active on the system the rule + will be rejected. If lsm= is not specified the first + security module registered on the system will be assumed. + Example of measure rules using alternate PCRs:: measure func=KEXEC_KERNEL_CHECK pcr=4 --- linux-azure-6.5.0.orig/Documentation/ABI/testing/sysfs-bus-fsi-devices-sbefifo +++ linux-azure-6.5.0/Documentation/ABI/testing/sysfs-bus-fsi-devices-sbefifo @@ -5,6 +5,6 @@ Indicates whether or not this SBE device has experienced a timeout; i.e. the SBE did not respond within the time allotted by the driver. A value of 1 indicates that a timeout has - ocurred and no transfers have completed since the timeout. A - value of 0 indicates that no timeout has ocurred, or if one - has, more recent transfers have completed successful. + occurred and no transfers have completed since the timeout. A + value of 0 indicates that no timeout has occurred, or if one + has, more recent transfers have completed successfully. --- linux-azure-6.5.0.orig/Documentation/ABI/testing/sysfs-bus-optee-devices +++ linux-azure-6.5.0/Documentation/ABI/testing/sysfs-bus-optee-devices @@ -6,3 +6,12 @@ OP-TEE bus provides reference to registered drivers under this directory. The matches Trusted Application (TA) driver and corresponding TA in secure OS. Drivers are free to create needed API under optee-ta- directory. + +What: /sys/bus/tee/devices/optee-ta-/need_supplicant +Date: November 2023 +KernelVersion: 6.7 +Contact: op-tee@lists.trustedfirmware.org +Description: + Allows to distinguish whether an OP-TEE based TA/device requires user-space + tee-supplicant to function properly or not. This attribute will be present for + devices which depend on tee-supplicant to be running. --- linux-azure-6.5.0.orig/Documentation/ABI/testing/sysfs-driver-chromeos-acpi +++ linux-azure-6.5.0/Documentation/ABI/testing/sysfs-driver-chromeos-acpi @@ -134,4 +134,4 @@ Description: Returns the verified boot data block shared between the firmware verification step and the kernel verification step - (binary). + (hex dump). --- linux-azure-6.5.0.orig/Documentation/ABI/testing/sysfs-fs-f2fs +++ linux-azure-6.5.0/Documentation/ABI/testing/sysfs-fs-f2fs @@ -54,9 +54,9 @@ 0x00 DISABLE disable IPU(=default option in LFS mode) 0x01 FORCE all the time 0x02 SSR if SSR mode is activated - 0x04 UTIL if FS utilization is over threashold + 0x04 UTIL if FS utilization is over threshold 0x08 SSR_UTIL if SSR mode is activated and FS utilization is over - threashold + threshold 0x10 FSYNC activated in fsync path only for high performance flash storages. IPU will be triggered only if the # of dirty pages over min_fsync_blocks. @@ -117,7 +117,7 @@ Contact: "Konstantin Vyshetsky" Description: Controls the number of discards a thread will issue at a time. Higher number will allow the discard thread to finish its work - faster, at the cost of higher latency for incomming I/O. + faster, at the cost of higher latency for incoming I/O. What: /sys/fs/f2fs//min_discard_issue_time Date: December 2021 @@ -334,7 +334,7 @@ state. 2048 trials is set by default. What: /sys/fs/f2fs//extension_list -Date: Feburary 2018 +Date: February 2018 Contact: "Chao Yu" Description: Used to control configure extension list: - Query: cat /sys/fs/f2fs//extension_list --- linux-azure-6.5.0.orig/Documentation/Makefile +++ linux-azure-6.5.0/Documentation/Makefile @@ -92,7 +92,7 @@ fi htmldocs: - @$(srctree)/scripts/sphinx-pre-install --version-check + @$(srctree)/scripts/sphinx-pre-install --version-check --no-virtualenv @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,html,$(var),,$(var))) texinfodocs: --- linux-azure-6.5.0.orig/Documentation/admin-guide/cgroup-v1/memory.rst +++ linux-azure-6.5.0/Documentation/admin-guide/cgroup-v1/memory.rst @@ -92,8 +92,13 @@ memory.oom_control set/show oom controls. memory.numa_stat show the number of memory usage per numa node - memory.kmem.limit_in_bytes This knob is deprecated and writing to - it will return -ENOTSUPP. + memory.kmem.limit_in_bytes Deprecated knob to set and read the kernel + memory hard limit. Kernel hard limit is not + supported since 5.16. Writing any value to + do file will not have any effect same as if + nokmem kernel parameter was specified. + Kernel memory is still charged and reported + by memory.kmem.usage_in_bytes. memory.kmem.usage_in_bytes show current kernel memory allocation memory.kmem.failcnt show the number of kernel memory usage hits limits --- linux-azure-6.5.0.orig/Documentation/admin-guide/devices.txt +++ linux-azure-6.5.0/Documentation/admin-guide/devices.txt @@ -2691,18 +2691,9 @@ 45 = /dev/ttyMM1 Marvell MPSC - port 1 (obsolete unused) 46 = /dev/ttyCPM0 PPC CPM (SCC or SMC) - port 0 ... - 49 = /dev/ttyCPM5 PPC CPM (SCC or SMC) - port 3 - 50 = /dev/ttyIOC0 Altix serial card - ... - 81 = /dev/ttyIOC31 Altix serial card + 51 = /dev/ttyCPM5 PPC CPM (SCC or SMC) - port 5 82 = /dev/ttyVR0 NEC VR4100 series SIU 83 = /dev/ttyVR1 NEC VR4100 series DSIU - 84 = /dev/ttyIOC84 Altix ioc4 serial card - ... - 115 = /dev/ttyIOC115 Altix ioc4 serial card - 116 = /dev/ttySIOC0 Altix ioc3 serial card - ... - 147 = /dev/ttySIOC31 Altix ioc3 serial card 148 = /dev/ttyPSC0 PPC PSC - port 0 ... 153 = /dev/ttyPSC5 PPC PSC - port 5 @@ -2761,10 +2752,7 @@ 43 = /dev/ttycusmx2 Callout device for ttySMX2 46 = /dev/cucpm0 Callout device for ttyCPM0 ... - 49 = /dev/cucpm5 Callout device for ttyCPM5 - 50 = /dev/cuioc40 Callout device for ttyIOC40 - ... - 81 = /dev/cuioc431 Callout device for ttyIOC431 + 51 = /dev/cucpm5 Callout device for ttyCPM5 82 = /dev/cuvr0 Callout device for ttyVR0 83 = /dev/cuvr1 Callout device for ttyVR1 --- linux-azure-6.5.0.orig/Documentation/admin-guide/hw-vuln/srso.rst +++ linux-azure-6.5.0/Documentation/admin-guide/hw-vuln/srso.rst @@ -46,12 +46,22 @@ The processor is not vulnerable - * 'Vulnerable: no microcode': +* 'Vulnerable': + + The processor is vulnerable and no mitigations have been applied. + + * 'Vulnerable: No microcode': The processor is vulnerable, no microcode extending IBPB functionality to address the vulnerability has been applied. - * 'Mitigation: microcode': + * 'Vulnerable: Safe RET, no microcode': + + The "Safe RET" mitigation (see below) has been applied to protect the + kernel, but the IBPB-extending microcode has not been applied. User + space tasks may still be vulnerable. + + * 'Vulnerable: Microcode, no safe RET': Extended IBPB functionality microcode patch has been applied. It does not address User->Kernel and Guest->Host transitions protection but it @@ -72,11 +82,11 @@ (spec_rstack_overflow=microcode) - * 'Mitigation: safe RET': + * 'Mitigation: Safe RET': - Software-only mitigation. It complements the extended IBPB microcode - patch functionality by addressing User->Kernel and Guest->Host - transitions protection. + Combined microcode/software mitigation. It complements the + extended IBPB microcode patch functionality by addressing + User->Kernel and Guest->Host transitions protection. Selected by default or by spec_rstack_overflow=safe-ret @@ -129,7 +139,7 @@ microcode patch for one's system. This mitigation comes also at a performance cost. -Mitigation: safe RET +Mitigation: Safe RET -------------------- The mitigation works by ensuring all RET instructions speculate to --- linux-azure-6.5.0.orig/Documentation/admin-guide/kernel-parameters.txt +++ linux-azure-6.5.0/Documentation/admin-guide/kernel-parameters.txt @@ -822,6 +822,10 @@ Format: ,,,[,] + cpufreq_driver= [X86] Allow only the named cpu frequency scaling driver + to register. Example: cpufreq_driver=powernow-k8 + Format: { none | STRING } + cpuidle.off=1 [CPU_IDLE] disable the cpuidle sub-system @@ -2938,6 +2942,10 @@ locktorture.torture_type= [KNL] Specify the locking implementation to test. + locktorture.writer_fifo= [KNL] + Run the write-side locktorture kthreads at + sched_set_fifo() real-time priority. + locktorture.verbose= [KNL] Enable additional printk() statements. @@ -4271,6 +4279,12 @@ nomsi [MSI] If the PCI_MSI kernel config parameter is enabled, this kernel boot option can be used to disable the use of MSI interrupts system-wide. + clearmsi [X86] Clears MSI/MSI-X enable bits early in boot + time in order to avoid issues like adapters + screaming irqs and preventing boot progress. + Also, it enforces the PCI Local Bus spec + rule that those bits should be 0 in system reset + events (useful for kexec/kdump cases). noioapicquirk [APIC] Disable all boot interrupt quirks. Safety option to keep boot IRQs enabled. This should never be necessary. @@ -5781,6 +5795,13 @@ This feature may be more efficiently disabled using the csdlock_debug- kernel parameter. + smp.panic_on_ipistall= [KNL] + If a csd_lock_timeout extends for more than + the specified number of milliseconds, panic the + system. By default, let CSD-lock acquisition + take as long as they take. Specifying 300,000 + for this value provides a 5-minute timeout. + smsc-ircc2.nopnp [HW] Don't use PNP to discover SMC devices smsc-ircc2.ircc_cfg= [HW] Device configuration I/O port smsc-ircc2.ircc_sir= [HW] SIR base I/O port @@ -6275,10 +6296,6 @@ -1: disable all critical trip points in all thermal zones : override all critical trip points - thermal.nocrt= [HW,ACPI] - Set to disable actions on ACPI thermal zone - critical and hot trip points. - thermal.off= [HW,ACPI] 1: disable ACPI thermal control --- linux-azure-6.5.0.orig/Documentation/admin-guide/sysctl/kernel.rst +++ linux-azure-6.5.0/Documentation/admin-guide/sysctl/kernel.rst @@ -450,6 +450,35 @@ ``IA64_THREAD_UAC_NOPRINT`` ``prctl`` and avoid logs being flooded. +io_uring_disabled +================= + +Prevents all processes from creating new io_uring instances. Enabling this +shrinks the kernel's attack surface. + += ====================================================================== +0 All processes can create io_uring instances as normal. This is the + default setting. +1 io_uring creation is disabled (io_uring_setup() will fail with + -EPERM) for unprivileged processes not in the io_uring_group group. + Existing io_uring instances can still be used. See the + documentation for io_uring_group for more information. +2 io_uring creation is disabled for all processes. io_uring_setup() + always fails with -EPERM. Existing io_uring instances can still be + used. += ====================================================================== + + +io_uring_group +============== + +When io_uring_disabled is set to 1, a process must either be +privileged (CAP_SYS_ADMIN) or be in the io_uring_group group in order +to create an io_uring instance. If io_uring_group is set to -1 (the +default), only processes with the CAP_SYS_ADMIN capability may create +io_uring instances. + + kexec_load_disabled =================== --- linux-azure-6.5.0.orig/Documentation/arch/arm64/silicon-errata.rst +++ linux-azure-6.5.0/Documentation/arch/arm64/silicon-errata.rst @@ -63,6 +63,8 @@ +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A510 | #1902691 | ARM64_ERRATUM_1902691 | +----------------+-----------------+-----------------+-----------------------------+ +| ARM | Cortex-A520 | #2966298 | ARM64_ERRATUM_2966298 | ++----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A53 | #826319 | ARM64_ERRATUM_826319 | +----------------+-----------------+-----------------+-----------------------------+ | ARM | Cortex-A53 | #827319 | ARM64_ERRATUM_827319 | @@ -198,6 +200,9 @@ +----------------+-----------------+-----------------+-----------------------------+ | Hisilicon | Hip08 SMMU PMCG | #162001800 | N/A | +----------------+-----------------+-----------------+-----------------------------+ +| Hisilicon | Hip08 SMMU PMCG | #162001900 | N/A | +| | Hip09 SMMU PMCG | | | ++----------------+-----------------+-----------------+-----------------------------+ +----------------+-----------------+-----------------+-----------------------------+ | Qualcomm Tech. | Kryo/Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 | +----------------+-----------------+-----------------+-----------------------------+ --- linux-azure-6.5.0.orig/Documentation/cgroups/namespace.txt +++ linux-azure-6.5.0/Documentation/cgroups/namespace.txt @@ -0,0 +1,142 @@ + CGroup Namespaces + +CGroup Namespace provides a mechanism to virtualize the view of the +/proc//cgroup file. The CLONE_NEWCGROUP clone-flag can be used with +clone() and unshare() syscalls to create a new cgroup namespace. +The process running inside the cgroup namespace will have its /proc//cgroup +output restricted to cgroupns-root. cgroupns-root is the cgroup of the process +at the time of creation of the cgroup namespace. + +Prior to CGroup Namespace, the /proc//cgroup file used to show complete +path of the cgroup of a process. In a container setup (where a set of cgroups +and namespaces are intended to isolate processes), the /proc//cgroup file +may leak potential system level information to the isolated processes. + +For Example: + $ cat /proc/self/cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/batchjobs/container_id1 + +The path '/batchjobs/container_id1' can generally be considered as system-data +and its desirable to not expose it to the isolated process. + +CGroup Namespaces can be used to restrict visibility of this path. +For Example: + # Before creating cgroup namespace + $ ls -l /proc/self/ns/cgroup + lrwxrwxrwx 1 root root 0 2014-07-15 10:37 /proc/self/ns/cgroup -> cgroup:[4026531835] + $ cat /proc/self/cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/batchjobs/container_id1 + + # unshare(CLONE_NEWCGROUP) and exec /bin/bash + $ ~/unshare -c + [ns]$ ls -l /proc/self/ns/cgroup + lrwxrwxrwx 1 root root 0 2014-07-15 10:35 /proc/self/ns/cgroup -> cgroup:[4026532183] + # From within new cgroupns, process sees that its in the root cgroup + [ns]$ cat /proc/self/cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/ + + # From global cgroupns: + $ cat /proc//cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/batchjobs/container_id1 + + # Unshare cgroupns along with userns and mountns + # Following calls unshare(CLONE_NEWCGROUP|CLONE_NEWUSER|CLONE_NEWNS), then + # sets up uid/gid map and execs /bin/bash + $ ~/unshare -c -u -m + # Originally, we were in /batchjobs/container_id1 cgroup. Mount our own cgroup + # hierarchy. + [ns]$ mount -t cgroup cgroup /tmp/cgroup + [ns]$ ls -l /tmp/cgroup + total 0 + -r--r--r-- 1 root root 0 2014-10-13 09:32 cgroup.controllers + -r--r--r-- 1 root root 0 2014-10-13 09:32 cgroup.populated + -rw-r--r-- 1 root root 0 2014-10-13 09:25 cgroup.procs + -rw-r--r-- 1 root root 0 2014-10-13 09:32 cgroup.subtree_control + +The cgroupns-root (/batchjobs/container_id1 in above example) becomes the +filesystem root for the namespace specific cgroupfs mount. + +The virtualization of /proc/self/cgroup file combined with restricting +the view of cgroup hierarchy by namespace-private cgroupfs mount +should provide a completely isolated cgroup view inside the container. + +In its current form, the cgroup namespaces patcheset provides following +behavior: + +(1) The 'cgroupns-root' for a cgroup namespace is the cgroup in which + the process calling unshare is running. + For ex. if a process in /batchjobs/container_id1 cgroup calls unshare, + cgroup /batchjobs/container_id1 becomes the cgroupns-root. + For the init_cgroup_ns, this is the real root ('/') cgroup + (identified in code as cgrp_dfl_root.cgrp). + +(2) The cgroupns-root cgroup does not change even if the namespace + creator process later moves to a different cgroup. + $ ~/unshare -c # unshare cgroupns in some cgroup + [ns]$ cat /proc/self/cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/ + [ns]$ mkdir sub_cgrp_1 + [ns]$ echo 0 > sub_cgrp_1/cgroup.procs + [ns]$ cat /proc/self/cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/sub_cgrp_1 + +(3) Each process gets its CGROUPNS specific view of /proc//cgroup +(a) Processes running inside the cgroup namespace will be able to see + cgroup paths (in /proc/self/cgroup) only inside their root cgroup + [ns]$ sleep 100000 & # From within unshared cgroupns + [1] 7353 + [ns]$ echo 7353 > sub_cgrp_1/cgroup.procs + [ns]$ cat /proc/7353/cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/sub_cgrp_1 + +(b) From global cgroupns, the real cgroup path will be visible: + $ cat /proc/7353/cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/batchjobs/container_id1/sub_cgrp_1 + +(c) From a sibling cgroupns (cgroupns root-ed at a different cgroup), cgroup + path relative to its own cgroupns-root will be shown: + # ns2's cgroupns-root is at '/batchjobs/container_id2' + [ns2]$ cat /proc/7353/cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/../container_id2/sub_cgrp_1 + + Note that the relative path always starts with '/' to indicate that its + relative to the cgroupns-root of the caller. + +(4) Processes inside a cgroupns can move in-and-out of the cgroupns-root + (if they have proper access to external cgroups). + # From inside cgroupns (with cgroupns-root at /batchjobs/container_id1), and + # assuming that the global hierarchy is still accessible inside cgroupns: + $ cat /proc/7353/cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/sub_cgrp_1 + $ echo 7353 > batchjobs/container_id2/cgroup.procs + $ cat /proc/7353/cgroup + 0:cpuset,cpu,cpuacct,memory,devices,freezer,hugetlb:/../container_id2 + + Note that this kind of setup is not encouraged. A task inside cgroupns + should only be exposed to its own cgroupns hierarchy. Otherwise it makes + the virtualization of /proc//cgroup less useful. + +(5) Setns to another cgroup namespace is allowed when: + (a) the process has CAP_SYS_ADMIN in its current userns + (b) the process has CAP_SYS_ADMIN in the target cgroupns' userns + No implicit cgroup changes happen with attaching to another cgroupns. It + is expected that the somone moves the attaching process under the target + cgroupns-root. + +(6) When some thread from a multi-threaded process unshares its + cgroup-namespace, the new cgroupns gets applied to the entire process (all + the threads). For the unified-hierarchy this is expected as it only allows + process-level containerization. For the legacy hierarchies this may be + unexpected. So all the threads in the process will have the same cgroup. + +(7) The cgroup namespace is alive as long as there is atleast 1 + process inside it. When the last process exits, the cgroup + namespace is destroyed. The cgroupns-root and the actual cgroups + remain though. + +(8) Namespace specific cgroup hierarchy can be mounted by a process running + inside cgroupns: + $ mount -t cgroup -o __DEVEL__sane_behavior cgroup $MOUNT_POINT + + This will mount the unified cgroup hierarchy with cgroupns-root as the + filesystem root. The process needs CAP_SYS_ADMIN in its userns and mntns. --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/clock/xlnx,versal-clk.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/clock/xlnx,versal-clk.yaml @@ -14,8 +14,6 @@ reads required input clock frequencies from the devicetree and acts as clock provider for all clock consumers of PS clocks. -select: false - properties: compatible: const: xlnx,versal-clk --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/extcon/maxim,max77843.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/extcon/maxim,max77843.yaml @@ -23,6 +23,7 @@ connector: $ref: /schemas/connector/usb-connector.yaml# + unevaluatedProperties: false ports: $ref: /schemas/graph.yaml#/properties/ports --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/interrupt-controller/qcom,mpm.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/interrupt-controller/qcom,mpm.yaml @@ -62,6 +62,9 @@ - description: MPM pin number - description: GIC SPI number for the MPM pin + '#power-domain-cells': + const: 0 + required: - compatible - reg @@ -93,4 +96,5 @@ <86 183>, <90 260>, <91 260>; + #power-domain-cells = <0>; }; --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/interrupt-controller/renesas,rzg2l-irqc.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/interrupt-controller/renesas,rzg2l-irqc.yaml @@ -31,8 +31,9 @@ - const: renesas,rzg2l-irqc '#interrupt-cells': - description: The first cell should contain external interrupt number (IRQ0-7) and the - second cell is used to specify the flag. + description: The first cell should contain a macro RZG2L_{NMI,IRQX} included in the + include/dt-bindings/interrupt-controller/irqc-rzg2l.h and the second + cell is used to specify the flag. const: 2 '#address-cells': --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/media/nxp,imx7-csi.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/media/nxp,imx7-csi.yaml @@ -59,7 +59,6 @@ compatible: contains: enum: - - fsl,imx8mq-csi - fsl,imx8mm-csi then: required: --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/mfd/mt6397.txt +++ linux-azure-6.5.0/Documentation/devicetree/bindings/mfd/mt6397.txt @@ -22,8 +22,9 @@ "mediatek,mt6323" for PMIC MT6323 "mediatek,mt6331" for PMIC MT6331 and MT6332 "mediatek,mt6357" for PMIC MT6357 - "mediatek,mt6358" for PMIC MT6358 and MT6366 + "mediatek,mt6358" for PMIC MT6358 "mediatek,mt6359" for PMIC MT6359 + "mediatek,mt6366", "mediatek,mt6358" for PMIC MT6366 "mediatek,mt6397" for PMIC MT6397 Optional subnodes: @@ -40,6 +41,7 @@ - compatible: "mediatek,mt6323-regulator" see ../regulator/mt6323-regulator.txt - compatible: "mediatek,mt6358-regulator" + - compatible: "mediatek,mt6366-regulator", "mediatek-mt6358-regulator" see ../regulator/mt6358-regulator.txt - compatible: "mediatek,mt6397-regulator" see ../regulator/mt6397-regulator.txt --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/mmc/sdhci-msm.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/mmc/sdhci-msm.yaml @@ -69,7 +69,7 @@ maxItems: 4 clocks: - minItems: 3 + minItems: 2 items: - description: Main peripheral bus clock, PCLK/HCLK - AHB Bus clock - description: SDC MMC clock, MCLK --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/nvmem/mxs-ocotp.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/nvmem/mxs-ocotp.yaml @@ -14,9 +14,11 @@ properties: compatible: - enum: - - fsl,imx23-ocotp - - fsl,imx28-ocotp + items: + - enum: + - fsl,imx23-ocotp + - fsl,imx28-ocotp + - const: fsl,ocotp reg: maxItems: 1 @@ -34,7 +36,7 @@ examples: - | ocotp: efuse@8002c000 { - compatible = "fsl,imx28-ocotp"; + compatible = "fsl,imx28-ocotp", "fsl,ocotp"; #address-cells = <1>; #size-cells = <1>; reg = <0x8002c000 0x2000>; --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/pci/qcom,pcie-ep.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/pci/qcom,pcie-ep.yaml @@ -11,10 +11,13 @@ properties: compatible: - enum: - - qcom,sdx55-pcie-ep - - qcom,sdx65-pcie-ep - - qcom,sm8450-pcie-ep + oneOf: + - enum: + - qcom,sdx55-pcie-ep + - qcom,sm8450-pcie-ep + - items: + - const: qcom,sdx65-pcie-ep + - const: qcom,sdx55-pcie-ep reg: items: @@ -110,7 +113,6 @@ contains: enum: - qcom,sdx55-pcie-ep - - qcom,sdx65-pcie-ep then: properties: clocks: --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/phy/qcom,snps-eusb2-repeater.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/phy/qcom,snps-eusb2-repeater.yaml @@ -27,6 +27,27 @@ vdd3-supply: true + qcom,tune-usb2-disc-thres: + $ref: /schemas/types.yaml#/definitions/uint8 + description: High-Speed disconnect threshold + minimum: 0 + maximum: 7 + default: 0 + + qcom,tune-usb2-amplitude: + $ref: /schemas/types.yaml#/definitions/uint8 + description: High-Speed trasmit amplitude + minimum: 0 + maximum: 15 + default: 8 + + qcom,tune-usb2-preem: + $ref: /schemas/types.yaml#/definitions/uint8 + description: High-Speed TX pre-emphasis tuning + minimum: 0 + maximum: 7 + default: 5 + required: - compatible - reg --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/power/qcom,kpss-acc-v2.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/power/qcom,kpss-acc-v2.yaml @@ -21,6 +21,7 @@ const: qcom,kpss-acc-v2 reg: + minItems: 1 items: - description: Base address and size of the register region - description: Optional base address and size of the alias register region --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/regulator/qcom,rpm-regulator.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/regulator/qcom,rpm-regulator.yaml @@ -49,7 +49,7 @@ ".*-supply$": description: Input supply phandle(s) for this node - "^((s|l|lvs)[0-9]*)|(s[1-2][a-b])|(ncp)|(mvs)|(usb-switch)|(hdmi-switch)$": + "^((s|l|lvs)[0-9]*|s[1-2][a-b]|ncp|mvs|usb-switch|hdmi-switch)$": description: List of regulators and its properties $ref: regulator.yaml# unevaluatedProperties: false --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/serial/nxp,sc16is7xx.txt +++ linux-azure-6.5.0/Documentation/devicetree/bindings/serial/nxp,sc16is7xx.txt @@ -23,6 +23,9 @@ 1 = active low. - irda-mode-ports: An array that lists the indices of the port that should operate in IrDA mode. +- nxp,modem-control-line-ports: An array that lists the indices of the port that + should have shared GPIO lines configured as + modem control lines. Example: sc16is750: sc16is750@51 { @@ -35,6 +38,26 @@ #gpio-cells = <2>; }; + sc16is752: sc16is752@53 { + compatible = "nxp,sc16is752"; + reg = <0x53>; + clocks = <&clk20m>; + interrupt-parent = <&gpio3>; + interrupts = <7 IRQ_TYPE_EDGE_FALLING>; + nxp,modem-control-line-ports = <1>; /* Port 1 as modem control lines */ + gpio-controller; /* Port 0 as GPIOs */ + #gpio-cells = <2>; + }; + + sc16is752: sc16is752@54 { + compatible = "nxp,sc16is752"; + reg = <0x54>; + clocks = <&clk20m>; + interrupt-parent = <&gpio3>; + interrupts = <7 IRQ_TYPE_EDGE_FALLING>; + nxp,modem-control-line-ports = <0 1>; /* Ports 0 and 1 as modem control lines */ + }; + * spi as bus Required properties: @@ -59,6 +82,9 @@ 1 = active low. - irda-mode-ports: An array that lists the indices of the port that should operate in IrDA mode. +- nxp,modem-control-line-ports: An array that lists the indices of the port that + should have shared GPIO lines configured as + modem control lines. Example: sc16is750: sc16is750@0 { @@ -70,3 +96,23 @@ gpio-controller; #gpio-cells = <2>; }; + + sc16is752: sc16is752@1 { + compatible = "nxp,sc16is752"; + reg = <1>; + clocks = <&clk20m>; + interrupt-parent = <&gpio3>; + interrupts = <7 IRQ_TYPE_EDGE_FALLING>; + nxp,modem-control-line-ports = <1>; /* Port 1 as modem control lines */ + gpio-controller; /* Port 0 as GPIOs */ + #gpio-cells = <2>; + }; + + sc16is752: sc16is752@2 { + compatible = "nxp,sc16is752"; + reg = <2>; + clocks = <&clk20m>; + interrupt-parent = <&gpio3>; + interrupts = <7 IRQ_TYPE_EDGE_FALLING>; + nxp,modem-control-line-ports = <0 1>; /* Ports 0 and 1 as modem control lines */ + }; --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/serial/rs485.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/serial/rs485.yaml @@ -29,6 +29,10 @@ default: 0 maximum: 100 + rs485-rts-active-high: + description: drive RTS high when sending (this is the default). + $ref: /schemas/types.yaml#/definitions/flag + rs485-rts-active-low: description: drive RTS low when sending (default is high). $ref: /schemas/types.yaml#/definitions/flag --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/serial/serial.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/serial/serial.yaml @@ -96,7 +96,7 @@ rts-gpios: false patternProperties: - "^bluetooth|gnss|gps|mcu$": + "^(bluetooth|gnss|gps|mcu)$": if: type: object then: --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/timer/renesas,rz-mtu3.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/timer/renesas,rz-mtu3.yaml @@ -169,27 +169,27 @@ - const: tgib0 - const: tgic0 - const: tgid0 - - const: tgiv0 + - const: tciv0 - const: tgie0 - const: tgif0 - const: tgia1 - const: tgib1 - - const: tgiv1 - - const: tgiu1 + - const: tciv1 + - const: tciu1 - const: tgia2 - const: tgib2 - - const: tgiv2 - - const: tgiu2 + - const: tciv2 + - const: tciu2 - const: tgia3 - const: tgib3 - const: tgic3 - const: tgid3 - - const: tgiv3 + - const: tciv3 - const: tgia4 - const: tgib4 - const: tgic4 - const: tgid4 - - const: tgiv4 + - const: tciv4 - const: tgiu5 - const: tgiv5 - const: tgiw5 @@ -197,18 +197,18 @@ - const: tgib6 - const: tgic6 - const: tgid6 - - const: tgiv6 + - const: tciv6 - const: tgia7 - const: tgib7 - const: tgic7 - const: tgid7 - - const: tgiv7 + - const: tciv7 - const: tgia8 - const: tgib8 - const: tgic8 - const: tgid8 - - const: tgiv8 - - const: tgiu8 + - const: tciv8 + - const: tciu8 clocks: maxItems: 1 @@ -285,16 +285,16 @@ , , ; - interrupt-names = "tgia0", "tgib0", "tgic0", "tgid0", "tgiv0", "tgie0", + interrupt-names = "tgia0", "tgib0", "tgic0", "tgid0", "tciv0", "tgie0", "tgif0", - "tgia1", "tgib1", "tgiv1", "tgiu1", - "tgia2", "tgib2", "tgiv2", "tgiu2", - "tgia3", "tgib3", "tgic3", "tgid3", "tgiv3", - "tgia4", "tgib4", "tgic4", "tgid4", "tgiv4", + "tgia1", "tgib1", "tciv1", "tciu1", + "tgia2", "tgib2", "tciv2", "tciu2", + "tgia3", "tgib3", "tgic3", "tgid3", "tciv3", + "tgia4", "tgib4", "tgic4", "tgid4", "tciv4", "tgiu5", "tgiv5", "tgiw5", - "tgia6", "tgib6", "tgic6", "tgid6", "tgiv6", - "tgia7", "tgib7", "tgic7", "tgid7", "tgiv7", - "tgia8", "tgib8", "tgic8", "tgid8", "tgiv8", "tgiu8"; + "tgia6", "tgib6", "tgic6", "tgid6", "tciv6", + "tgia7", "tgib7", "tgic7", "tgid7", "tciv7", + "tgia8", "tgib8", "tgic8", "tgid8", "tciv8", "tciu8"; clocks = <&cpg CPG_MOD R9A07G044_MTU_X_MCK_MTU3>; power-domains = <&cpg>; resets = <&cpg R9A07G044_MTU_X_PRESET_MTU3>; --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/usb/microchip,usb5744.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/usb/microchip,usb5744.yaml @@ -36,7 +36,11 @@ vdd-supply: description: - VDD power supply to the hub + 3V3 power supply to the hub + + vdd2-supply: + description: + 1V2 power supply to the hub peer-hub: $ref: /schemas/types.yaml#/definitions/phandle @@ -62,6 +66,7 @@ properties: reset-gpios: false vdd-supply: false + vdd2-supply: false peer-hub: false i2c-bus: false else: --- linux-azure-6.5.0.orig/Documentation/devicetree/bindings/usb/samsung,exynos-dwc3.yaml +++ linux-azure-6.5.0/Documentation/devicetree/bindings/usb/samsung,exynos-dwc3.yaml @@ -72,7 +72,7 @@ properties: compatible: contains: - const: samsung,exynos54333-dwusb3 + const: samsung,exynos5433-dwusb3 then: properties: clocks: @@ -82,8 +82,8 @@ items: - const: aclk - const: susp_clk - - const: pipe_pclk - const: phyclk + - const: pipe_pclk - if: properties: --- linux-azure-6.5.0.orig/Documentation/filesystems/ceph.rst +++ linux-azure-6.5.0/Documentation/filesystems/ceph.rst @@ -57,6 +57,16 @@ system. Snapshot creation and deletion are as simple as 'mkdir .snap/foo' and 'rmdir .snap/foo'. +Snapshot names have two limitations: + +* They can not start with an underscore ('_'), as these names are reserved + for internal usage by the MDS. +* They can not exceed 240 characters in size. This is because the MDS makes + use of long snapshot names internally, which follow the format: + `__`. Since filenames in general can't have + more than 255 characters, and `` takes 13 characters, the long + snapshot names can take as much as 255 - 1 - 1 - 13 = 240. + Ceph also provides some recursive accounting on directories for nested files and bytes. That is, a 'getfattr -d foo' on any directory in the system will reveal the total number of nested regular files and --- linux-azure-6.5.0.orig/Documentation/filesystems/overlayfs.rst +++ linux-azure-6.5.0/Documentation/filesystems/overlayfs.rst @@ -339,6 +339,18 @@ rightmost one and going left. In the above example lower1 will be the top, lower2 the middle and lower3 the bottom layer. +Note: directory names containing colons can be provided as lower layer by +escaping the colons with a single backslash. For example: + + mount -t overlay overlay -olowerdir=/a\:lower\:\:dir /merged + +Since kernel version v6.5, directory names containing colons can also +be provided as lower layer using the fsconfig syscall from new mount api: + + fsconfig(fs_fd, FSCONFIG_SET_STRING, "lowerdir", "/a:lower::dir", 0); + +In the latter case, colons in lower layer directory names will be escaped +as an octal characters (\072) when displayed in /proc/self/mountinfo. Metadata only copy up --------------------- --- linux-azure-6.5.0.orig/Documentation/i2c/busses/i2c-i801.rst +++ linux-azure-6.5.0/Documentation/i2c/busses/i2c-i801.rst @@ -47,6 +47,7 @@ * Intel Alder Lake (PCH) * Intel Raptor Lake (PCH) * Intel Meteor Lake (SOC and PCH) + * Intel Birch Stream (SOC) Datasheets: Publicly available at the Intel website --- linux-azure-6.5.0.orig/Documentation/networking/device_drivers/ethernet/mellanox/mlx5/counters.rst +++ linux-azure-6.5.0/Documentation/networking/device_drivers/ethernet/mellanox/mlx5/counters.rst @@ -683,6 +683,12 @@ time protocol. - Error + * - `ptp_cq[i]_late_cqe` + - Number of times a CQE has been delivered on the PTP timestamping CQ when + the CQE was not expected since a certain amount of time had elapsed where + the device typically ensures not posting the CQE. + - Error + .. [#ring_global] The corresponding ring and global counters do not share the same name (i.e. do not follow the common naming scheme). --- linux-azure-6.5.0.orig/Documentation/networking/device_drivers/ethernet/mellanox/mlx5/index.rst +++ linux-azure-6.5.0/Documentation/networking/device_drivers/ethernet/mellanox/mlx5/index.rst @@ -13,7 +13,6 @@ :maxdepth: 2 kconfig - devlink switchdev tracepoints counters --- linux-azure-6.5.0.orig/Documentation/networking/devlink/mlx5.rst +++ linux-azure-6.5.0/Documentation/networking/devlink/mlx5.rst @@ -18,6 +18,11 @@ * - ``enable_roce`` - driverinit - Type: Boolean + + If the device supports RoCE disablement, RoCE enablement state controls + device support for RoCE capability. Otherwise, the control occurs in the + driver stack. When RoCE is disabled at the driver level, only raw + ethernet QPs are supported. * - ``io_eq_size`` - driverinit - The range is between 64 and 4096. @@ -48,6 +53,9 @@ * ``smfs`` Software managed flow steering. In SMFS mode, the HW steering entities are created and manage through the driver without firmware intervention. + + SMFS mode is faster and provides better rule insertion rate compared to + default DMFS mode. * - ``fdb_large_groups`` - u32 - driverinit @@ -71,7 +79,24 @@ deprecated. Default: disabled + * - ``esw_port_metadata`` + - Boolean + - runtime + - When applicable, disabling eswitch metadata can increase packet rate up + to 20% depending on the use case and packet sizes. + + Eswitch port metadata state controls whether to internally tag packets + with metadata. Metadata tagging must be enabled for multi-port RoCE, + failover between representors and stacked devices. By default metadata is + enabled on the supported devices in E-switch. Metadata is applicable only + for E-switch in switchdev mode and users may disable it when NONE of the + below use cases will be in use: + 1. HCA is in Dual/multi-port RoCE mode. + 2. VF/SF representor bonding (Usually used for Live migration) + 3. Stacked devices + When metadata is disabled, the above use cases will fail to initialize if + users try to enable them. * - ``hairpin_num_queues`` - u32 - driverinit @@ -104,3 +129,160 @@ * - ``fw.version`` - stored, running - Three digit major.minor.subminor firmware version number. + +Health reporters +================ + +tx reporter +----------- +The tx reporter is responsible for reporting and recovering of the following three error scenarios: + +- tx timeout + Report on kernel tx timeout detection. + Recover by searching lost interrupts. +- tx error completion + Report on error tx completion. + Recover by flushing the tx queue and reset it. +- tx PTP port timestamping CQ unhealthy + Report too many CQEs never delivered on port ts CQ. + Recover by flushing and re-creating all PTP channels. + +tx reporter also support on demand diagnose callback, on which it provides +real time information of its send queues status. + +User commands examples: + +- Diagnose send queues status:: + + $ devlink health diagnose pci/0000:82:00.0 reporter tx + +.. note:: + This command has valid output only when interface is up, otherwise the command has empty output. + +- Show number of tx errors indicated, number of recover flows ended successfully, + is autorecover enabled and graceful period from last recover:: + + $ devlink health show pci/0000:82:00.0 reporter tx + +rx reporter +----------- +The rx reporter is responsible for reporting and recovering of the following two error scenarios: + +- rx queues' initialization (population) timeout + Population of rx queues' descriptors on ring initialization is done + in napi context via triggering an irq. In case of a failure to get + the minimum amount of descriptors, a timeout would occur, and + descriptors could be recovered by polling the EQ (Event Queue). +- rx completions with errors (reported by HW on interrupt context) + Report on rx completion error. + Recover (if needed) by flushing the related queue and reset it. + +rx reporter also supports on demand diagnose callback, on which it +provides real time information of its receive queues' status. + +- Diagnose rx queues' status and corresponding completion queue:: + + $ devlink health diagnose pci/0000:82:00.0 reporter rx + +.. note:: + This command has valid output only when interface is up. Otherwise, the command has empty output. + +- Show number of rx errors indicated, number of recover flows ended successfully, + is autorecover enabled, and graceful period from last recover:: + + $ devlink health show pci/0000:82:00.0 reporter rx + +fw reporter +----------- +The fw reporter implements `diagnose` and `dump` callbacks. +It follows symptoms of fw error such as fw syndrome by triggering +fw core dump and storing it into the dump buffer. +The fw reporter diagnose command can be triggered any time by the user to check +current fw status. + +User commands examples: + +- Check fw heath status:: + + $ devlink health diagnose pci/0000:82:00.0 reporter fw + +- Read FW core dump if already stored or trigger new one:: + + $ devlink health dump show pci/0000:82:00.0 reporter fw + +.. note:: + This command can run only on the PF which has fw tracer ownership, + running it on other PF or any VF will return "Operation not permitted". + +fw fatal reporter +----------------- +The fw fatal reporter implements `dump` and `recover` callbacks. +It follows fatal errors indications by CR-space dump and recover flow. +The CR-space dump uses vsc interface which is valid even if the FW command +interface is not functional, which is the case in most FW fatal errors. +The recover function runs recover flow which reloads the driver and triggers fw +reset if needed. +On firmware error, the health buffer is dumped into the dmesg. The log +level is derived from the error's severity (given in health buffer). + +User commands examples: + +- Run fw recover flow manually:: + + $ devlink health recover pci/0000:82:00.0 reporter fw_fatal + +- Read FW CR-space dump if already stored or trigger new one:: + + $ devlink health dump show pci/0000:82:00.1 reporter fw_fatal + +.. note:: + This command can run only on PF. + +vnic reporter +------------- +The vnic reporter implements only the `diagnose` callback. +It is responsible for querying the vnic diagnostic counters from fw and displaying +them in realtime. + +Description of the vnic counters: + +- total_q_under_processor_handle + number of queues in an error state due to + an async error or errored command. +- send_queue_priority_update_flow + number of QP/SQ priority/SL update events. +- cq_overrun + number of times CQ entered an error state due to an overflow. +- async_eq_overrun + number of times an EQ mapped to async events was overrun. + comp_eq_overrun number of times an EQ mapped to completion events was + overrun. +- quota_exceeded_command + number of commands issued and failed due to quota exceeded. +- invalid_command + number of commands issued and failed dues to any reason other than quota + exceeded. +- nic_receive_steering_discard + number of packets that completed RX flow + steering but were discarded due to a mismatch in flow table. +- generated_pkt_steering_fail + number of packets generated by the VNIC experiencing unexpected steering + failure (at any point in steering flow). +- handled_pkt_steering_fail + number of packets handled by the VNIC experiencing unexpected steering + failure (at any point in steering flow owned by the VNIC, including the FDB + for the eswitch owner). + +User commands examples: + +- Diagnose PF/VF vnic counters:: + + $ devlink health diagnose pci/0000:82:00.1 reporter vnic + +- Diagnose representor vnic counters (performed by supplying devlink port of the + representor, which can be obtained via devlink port command):: + + $ devlink health diagnose pci/0000:82:00.1/65537 reporter vnic + +.. note:: + This command can run over all interfaces such as PF/VF and representor ports. --- linux-azure-6.5.0.orig/Documentation/networking/ip-sysctl.rst +++ linux-azure-6.5.0/Documentation/networking/ip-sysctl.rst @@ -1175,6 +1175,19 @@ Default: 128 +tcp_pingpong_thresh - INTEGER + The number of estimated data replies sent for estimated incoming data + requests that must happen before TCP considers that a connection is a + "ping-pong" (request-response) connection for which delayed + acknowledgments can provide benefits. + + This threshold is 1 by default, but some applications may need a higher + threshold for optimal performance. + + Possible Values: 1 - 255 + + Default: 1 + UDP variables ============= @@ -2287,6 +2300,14 @@ Default: 1 +accept_ra_min_lft - INTEGER + Minimum acceptable lifetime value in Router Advertisement. + + RA sections with a lifetime less than this value shall be + ignored. Zero lifetimes stay unaffected. + + Default: 0 + accept_ra_pinfo - BOOLEAN Learn Prefix Information in Router Advertisement. --- linux-azure-6.5.0.orig/Documentation/networking/representors.rst +++ linux-azure-6.5.0/Documentation/networking/representors.rst @@ -162,9 +162,11 @@ The representor netdevice should *not* directly refer to a PCIe device (e.g. through ``net_dev->dev.parent`` / ``SET_NETDEV_DEV()``), either of the representee or of the switchdev function. -Instead, it should implement the ``ndo_get_devlink_port()`` netdevice op, which -the kernel uses to provide the ``phys_switch_id`` and ``phys_port_name`` sysfs -nodes. (Some legacy drivers implement ``ndo_get_port_parent_id()`` and +Instead, the driver should use the ``SET_NETDEV_DEVLINK_PORT`` macro to +assign a devlink port instance to the netdevice before registering the +netdevice; the kernel uses the devlink port to provide the ``phys_switch_id`` +and ``phys_port_name`` sysfs nodes. +(Some legacy drivers implement ``ndo_get_port_parent_id()`` and ``ndo_get_phys_port_name()`` directly, but this is deprecated.) See :ref:`Documentation/networking/devlink/devlink-port.rst ` for the details of this API. --- linux-azure-6.5.0.orig/Documentation/rust/general-information.rst +++ linux-azure-6.5.0/Documentation/rust/general-information.rst @@ -29,7 +29,7 @@ To read the docs locally in your web browser, run e.g.:: - xdg-open rust/doc/kernel/index.html + xdg-open Documentation/output/rust/rustdoc/kernel/index.html To learn about how to write the documentation, please see coding-guidelines.rst. --- linux-azure-6.5.0.orig/Documentation/rust/index.rst +++ linux-azure-6.5.0/Documentation/rust/index.rst @@ -6,6 +6,14 @@ Documentation related to Rust within the kernel. To start using Rust in the kernel, please read the quick-start.rst guide. +.. only:: rustdoc and html + + You can also browse `rustdoc documentation `_. + +.. only:: not rustdoc and html + + This documentation does not include rustdoc generated information. + .. toctree:: :maxdepth: 1 --- linux-azure-6.5.0.orig/Documentation/scsi/scsi_mid_low_api.rst +++ linux-azure-6.5.0/Documentation/scsi/scsi_mid_low_api.rst @@ -1190,11 +1190,11 @@ - pointer to scsi_device object that this command is associated with. resid - - an LLD should set this signed integer to the requested + - an LLD should set this unsigned integer to the requested transfer length (i.e. 'request_bufflen') less the number of bytes that are actually transferred. 'resid' is preset to 0 so an LLD can ignore it if it cannot detect - underruns (overruns should be rare). If possible an LLD + underruns (overruns should not be reported). An LLD should set 'resid' prior to invoking 'done'. The most interesting case is data transfers from a SCSI target device (e.g. READs) that underrun. --- linux-azure-6.5.0.orig/Documentation/sound/designs/midi-2.0.rst +++ linux-azure-6.5.0/Documentation/sound/designs/midi-2.0.rst @@ -74,8 +74,8 @@ doesn't respond to the new UMP inquiries, the driver falls back and builds the topology based on Group Terminal Block (GTB) information from the USB descriptor. Some device might be screwed up by the -unexpected UMP command; in such a case, pass `midi2_probe=0` option to -snd-usb-audio driver for skipping the UMP v1.1 inquiries. +unexpected UMP command; in such a case, pass `midi2_ump_probe=0` +option to snd-usb-audio driver for skipping the UMP v1.1 inquiries. When the MIDI 2.0 device is probed, the kernel creates a rawmidi device for each UMP Endpoint of the device. Its device name is --- linux-azure-6.5.0.orig/Documentation/sphinx/cdomain.py +++ linux-azure-6.5.0/Documentation/sphinx/cdomain.py @@ -37,12 +37,29 @@ import sphinx from sphinx import addnodes -from sphinx.domains.c import c_funcptr_sig_re, c_sig_re from sphinx.domains.c import CObject as Base_CObject from sphinx.domains.c import CDomain as Base_CDomain from itertools import chain import re +# fixes https://github.com/sphinx-doc/sphinx/commit/0f49e30c51b5cc5055cda5b4b294c2dd9d1df573#r38750737 + +# pylint: disable=invalid-name +c_sig_re = re.compile( + r'''^([^(]*?) # return type + ([\w:.]+) \s* # thing name (colon allowed for C++) + (?: \((.*)\) )? # optionally arguments + (\s+const)? $ # const specifier + ''', re.VERBOSE) + +c_funcptr_sig_re = re.compile( + r'''^([^(]+?) # return type + (\( [^()]+ \)) \s* # name in parentheses + \( (.*) \) # arguments + (\s+const)? $ # const specifier + ''', re.VERBOSE) +# pylint: enable=invalid-name + __version__ = '1.1' # Get Sphinx version --- linux-azure-6.5.0.orig/Documentation/userspace-api/media/v4l/vidioc-subdev-g-routing.rst +++ linux-azure-6.5.0/Documentation/userspace-api/media/v4l/vidioc-subdev-g-routing.rst @@ -58,6 +58,9 @@ value of the ``num_routes`` field. Application should then reserve enough memory for all the route entries and call ``VIDIOC_SUBDEV_G_ROUTING`` again. +On a successful ``VIDIOC_SUBDEV_G_ROUTING`` call the driver updates the +``num_routes`` field to reflect the actual number of routes returned. + .. tabularcolumns:: |p{4.4cm}|p{4.4cm}|p{8.7cm}| .. c:type:: v4l2_subdev_routing @@ -138,9 +141,7 @@ EINVAL The sink or source pad identifiers reference a non-existing pad, or reference - pads of different types (ie. the sink_pad identifiers refers to a source pad) - or the sink or source stream identifiers reference a non-existing stream on - the sink or source pad. + pads of different types (ie. the sink_pad identifiers refers to a source pad). E2BIG The application provided ``num_routes`` for ``VIDIOC_SUBDEV_S_ROUTING`` is --- linux-azure-6.5.0.orig/Kbuild +++ linux-azure-6.5.0/Kbuild @@ -97,3 +97,4 @@ obj-$(CONFIG_NET) += net/ obj-y += virt/ obj-y += $(ARCH_DRIVERS) +obj-y += ubuntu/ --- linux-azure-6.5.0.orig/Kconfig +++ linux-azure-6.5.0/Kconfig @@ -19,6 +19,8 @@ source "drivers/Kconfig" +source "ubuntu/Kconfig" + source "fs/Kconfig" source "security/Kconfig" --- linux-azure-6.5.0.orig/MAINTAINERS +++ linux-azure-6.5.0/MAINTAINERS @@ -193,6 +193,18 @@ F: Documentation/devicetree/bindings/power/supply/*ab8500* F: drivers/power/supply/*ab8500* +AAEON DEVICE DRIVER WITH WMI INTERFACE +M: Edward Lin +M: Kunyang Fan +M: Frank Hsieh +M: Jacob Wu +S: Supported +F: drivers/gpio/gpio-aaeon.c +F: drivers/hwmon/hwmon-aaeon.c +F: drivers/leds/leds-aaeon.c +F: drivers/mfd/mfd-aaeon.c +F: drivers/watchdog/wdt_aaeon.c + ABI/API L: linux-api@vger.kernel.org F: include/linux/syscalls.h --- linux-azure-6.5.0.orig/Makefile +++ linux-azure-6.5.0/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 5 -SUBLEVEL = 0 +SUBLEVEL = 13 EXTRAVERSION = NAME = Hurr durr I'ma ninja sloth @@ -554,6 +554,9 @@ -I$(objtree)/include \ $(USERINCLUDE) +# UBUNTU: Include our third party driver stuff too +LINUXINCLUDE += -I$(srctree)/ubuntu/include + KBUILD_AFLAGS := -D__ASSEMBLY__ -fno-PIE KBUILD_CFLAGS := @@ -1289,7 +1292,7 @@ # All the preparing.. prepare: prepare0 ifdef CONFIG_RUST - $(Q)$(CONFIG_SHELL) $(srctree)/scripts/rust_is_available.sh -v + $(Q)$(CONFIG_SHELL) $(srctree)/scripts/rust_is_available.sh $(Q)$(MAKE) $(build)=rust endif @@ -1366,8 +1369,9 @@ quiet_cmd_headers_install = INSTALL $(INSTALL_HDR_PATH)/include cmd_headers_install = \ mkdir -p $(INSTALL_HDR_PATH); \ - rsync -mrl --include='*/' --include='*\.h' --exclude='*' \ - usr/include $(INSTALL_HDR_PATH) + find usr/include -type f -name '*.h' -print0 | \ + tar -czf - --null --no-recursion --no-wildcards-match-slash -T- | \ + tar -xzf - --strip-components=1 -C $(INSTALL_HDR_PATH) PHONY += headers_install headers_install: headers @@ -1382,6 +1386,7 @@ $(if $(filter um, $(SRCARCH)), $(error Headers not exportable for UML)) $(Q)$(MAKE) $(hdr-inst)=include/uapi $(Q)$(MAKE) $(hdr-inst)=arch/$(SRCARCH)/include/uapi + $(Q)$(MAKE) $(hdr-inst)=ubuntu/include dst=include oldheaders= ifdef CONFIG_HEADERS_INSTALL prepare: headers @@ -1595,13 +1600,13 @@ # Directories & files removed with 'make clean' CLEAN_FILES += include/ksym vmlinux.symvers modules-only.symvers \ modules.builtin modules.builtin.modinfo modules.nsdeps \ - compile_commands.json .thinlto-cache rust/test rust/doc \ + compile_commands.json .thinlto-cache rust/test \ rust-project.json .vmlinux.objs .vmlinux.export.c # Directories & files removed with 'make mrproper' MRPROPER_FILES += include/config include/generated \ arch/$(SRCARCH)/include/generated .objdiff \ - debian snap tar-install \ + snap tar-install \ .config .config.old .version \ Module.symvers \ certs/signing_key.pem \ @@ -1825,7 +1830,7 @@ # "Is Rust available?" target PHONY += rustavailable rustavailable: - $(Q)$(CONFIG_SHELL) $(srctree)/scripts/rust_is_available.sh -v && echo "Rust is available!" + $(Q)$(CONFIG_SHELL) $(srctree)/scripts/rust_is_available.sh && echo "Rust is available!" # Documentation target # @@ -1962,7 +1967,9 @@ modules_install: $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst +ifndef modules_sign_only $(call cmd,depmod) +endif else # CONFIG_MODULES --- linux-azure-6.5.0.orig/Ubuntu.md +++ linux-azure-6.5.0/Ubuntu.md @@ -0,0 +1,8 @@ +Name: linux-azure +Version: 6.5.0 +Series: 23.10 (mantic) +Description: + This is the source code for the Ubuntu linux kernel for the 23.10 series. This + source tree is used to produce the flavours: azure. + This kernel is configured to support the widest range of desktop, laptop and + server configurations. --- linux-azure-6.5.0.orig/arch/Kconfig +++ linux-azure-6.5.0/arch/Kconfig @@ -34,6 +34,9 @@ config HOTPLUG_SMT bool +config SMT_NUM_THREADS_DYNAMIC + bool + # Selected by HOTPLUG_CORE_SYNC_DEAD or HOTPLUG_CORE_SYNC_FULL config HOTPLUG_CORE_SYNC bool --- linux-azure-6.5.0.orig/arch/arc/include/asm/atomic-llsc.h +++ linux-azure-6.5.0/arch/arc/include/asm/atomic-llsc.h @@ -18,7 +18,7 @@ : [val] "=&r" (val) /* Early clobber to prevent reg reuse */ \ : [ctr] "r" (&v->counter), /* Not "m": llock only supports reg direct addr mode */ \ [i] "ir" (i) \ - : "cc"); \ + : "cc", "memory"); \ } \ #define ATOMIC_OP_RETURN(op, asm_op) \ @@ -34,7 +34,7 @@ : [val] "=&r" (val) \ : [ctr] "r" (&v->counter), \ [i] "ir" (i) \ - : "cc"); \ + : "cc", "memory"); \ \ return val; \ } @@ -56,7 +56,7 @@ [orig] "=&r" (orig) \ : [ctr] "r" (&v->counter), \ [i] "ir" (i) \ - : "cc"); \ + : "cc", "memory"); \ \ return orig; \ } --- linux-azure-6.5.0.orig/arch/arc/include/asm/atomic64-arcv2.h +++ linux-azure-6.5.0/arch/arc/include/asm/atomic64-arcv2.h @@ -60,7 +60,7 @@ " bnz 1b \n" \ : "=&r"(val) \ : "r"(&v->counter), "ir"(a) \ - : "cc"); \ + : "cc", "memory"); \ } \ #define ATOMIC64_OP_RETURN(op, op1, op2) \ @@ -77,7 +77,7 @@ " bnz 1b \n" \ : [val] "=&r"(val) \ : "r"(&v->counter), "ir"(a) \ - : "cc"); /* memory clobber comes from smp_mb() */ \ + : "cc", "memory"); \ \ return val; \ } @@ -99,7 +99,7 @@ " bnz 1b \n" \ : "=&r"(orig), "=&r"(val) \ : "r"(&v->counter), "ir"(a) \ - : "cc"); /* memory clobber comes from smp_mb() */ \ + : "cc", "memory"); \ \ return orig; \ } --- linux-azure-6.5.0.orig/arch/arc/kernel/signal.c +++ linux-azure-6.5.0/arch/arc/kernel/signal.c @@ -61,7 +61,7 @@ unsigned int sigret_magic; }; -static int save_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs) +static int save_arcv2_regs(struct sigcontext __user *mctx, struct pt_regs *regs) { int err = 0; #ifndef CONFIG_ISA_ARCOMPACT @@ -74,12 +74,12 @@ #else v2abi.r58 = v2abi.r59 = 0; #endif - err = __copy_to_user(&mctx->v2abi, &v2abi, sizeof(v2abi)); + err = __copy_to_user(&mctx->v2abi, (void const *)&v2abi, sizeof(v2abi)); #endif return err; } -static int restore_arcv2_regs(struct sigcontext *mctx, struct pt_regs *regs) +static int restore_arcv2_regs(struct sigcontext __user *mctx, struct pt_regs *regs) { int err = 0; #ifndef CONFIG_ISA_ARCOMPACT --- linux-azure-6.5.0.orig/arch/arm/Makefile +++ linux-azure-6.5.0/arch/arm/Makefile @@ -59,6 +59,9 @@ # KBUILD_CFLAGS += $(call cc-option,-fno-ipa-sra) +# Need -msoft-float for gcc 11 for the below instruction set selection +KBUILD_CFLAGS += -msoft-float + # This selects which instruction set is used. arch-$(CONFIG_CPU_32v7M) :=-march=armv7-m arch-$(CONFIG_CPU_32v7) :=-march=armv7-a @@ -141,7 +144,7 @@ # Need -Uarm for gcc < 3.x KBUILD_CPPFLAGS +=$(cpp-y) -KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_ISA) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm +KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_ISA) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -Uarm KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_ISA) -Wa,$(arch-y) $(tune-y) -include asm/unified.h -msoft-float CHECKFLAGS += -D__arm__ --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm2711-rpi-400.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm2711-rpi-400.dts @@ -36,9 +36,7 @@ gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; }; -&leds { - /delete-node/ led_act; -}; +/delete-node/ &led_act; &pm { /delete-property/ system-power-controller; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm4708-buffalo-wzr-1166dhp-common.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm4708-buffalo-wzr-1166dhp-common.dtsi @@ -181,5 +181,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm4708-linksys-ea6500-v2.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm4708-linksys-ea6500-v2.dts @@ -19,7 +19,8 @@ memory@0 { device_type = "memory"; - reg = <0x00000000 0x08000000>; + reg = <0x00000000 0x08000000>, + <0x88000000 0x08000000>; }; gpio-keys { --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm4708-luxul-xap-1510.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm4708-luxul-xap-1510.dts @@ -85,5 +85,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm4708-luxul-xwc-1000.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm4708-luxul-xwc-1000.dts @@ -88,5 +88,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm4708-netgear-r6250.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm4708-netgear-r6250.dts @@ -122,5 +122,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm4708-smartrg-sr400ac.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm4708-smartrg-sr400ac.dts @@ -145,6 +145,14 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47081-buffalo-wzr-600dhp2.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47081-buffalo-wzr-600dhp2.dts @@ -145,5 +145,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47081-luxul-xap-1410.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47081-luxul-xap-1410.dts @@ -81,5 +81,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47081-luxul-xwr-1200.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47081-luxul-xwr-1200.dts @@ -148,5 +148,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm4709-netgear-r8000.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm4709-netgear-r8000.dts @@ -227,6 +227,14 @@ label = "wan"; }; + port@5 { + status = "disabled"; + }; + + port@7 { + status = "disabled"; + }; + port@8 { label = "cpu"; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47094-dlink-dir-885l.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47094-dlink-dir-885l.dts @@ -143,6 +143,14 @@ label = "wan"; }; + port@5 { + status = "disabled"; + }; + + port@7 { + status = "disabled"; + }; + port@8 { label = "cpu"; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47094-dlink-dir-890l.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47094-dlink-dir-890l.dts @@ -191,6 +191,14 @@ label = "wan"; }; + port@5 { + status = "disabled"; + }; + + port@7 { + status = "disabled"; + }; + port@8 { label = "cpu"; phy-mode = "rgmii"; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47094-luxul-abr-4500.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47094-luxul-abr-4500.dts @@ -107,5 +107,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47094-luxul-xap-1610.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47094-luxul-xap-1610.dts @@ -83,5 +83,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47094-luxul-xbr-4500.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47094-luxul-xbr-4500.dts @@ -107,5 +107,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47094-luxul-xwc-2000.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47094-luxul-xwc-2000.dts @@ -75,5 +75,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47094-luxul-xwr-3100.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47094-luxul-xwr-3100.dts @@ -147,5 +147,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47094-luxul-xwr-3150-v1.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47094-luxul-xwr-3150-v1.dts @@ -122,5 +122,13 @@ port@5 { label = "cpu"; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47189-luxul-xap-1440.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47189-luxul-xap-1440.dts @@ -26,7 +26,6 @@ led-wlan { label = "bcm53xx:blue:wlan"; gpios = <&chipcommon 10 GPIO_ACTIVE_LOW>; - linux,default-trigger = "default-off"; }; led-system { @@ -46,3 +45,16 @@ }; }; }; + +&gmac0 { + phy-mode = "rgmii"; + phy-handle = <&bcm54210e>; + + mdio { + /delete-node/ switch@1e; + + bcm54210e: ethernet-phy@0 { + reg = <0>; + }; + }; +}; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47189-luxul-xap-810.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47189-luxul-xap-810.dts @@ -26,7 +26,6 @@ led-5ghz { label = "bcm53xx:blue:5ghz"; gpios = <&chipcommon 11 GPIO_ACTIVE_HIGH>; - linux,default-trigger = "default-off"; }; led-system { @@ -42,7 +41,6 @@ led-2ghz { label = "bcm53xx:blue:2ghz"; gpios = <&pcie0_chipcommon 3 GPIO_ACTIVE_HIGH>; - linux,default-trigger = "default-off"; }; }; @@ -83,3 +81,16 @@ }; }; }; + +&gmac0 { + phy-mode = "rgmii"; + phy-handle = <&bcm54210e>; + + mdio { + /delete-node/ switch@1e; + + bcm54210e: ethernet-phy@0 { + reg = <0>; + }; + }; +}; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm47189-tenda-ac9.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm47189-tenda-ac9.dts @@ -135,8 +135,8 @@ label = "lan4"; }; - port@5 { - reg = <5>; + port@8 { + reg = <8>; label = "cpu"; ethernet = <&gmac0>; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm53015-meraki-mr26.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm53015-meraki-mr26.dts @@ -124,6 +124,14 @@ full-duplex; }; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm53016-meraki-mr32.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm53016-meraki-mr32.dts @@ -185,6 +185,14 @@ full-duplex; }; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm53573.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm53573.dtsi @@ -127,6 +127,9 @@ pcie0: pcie@2000 { reg = <0x00002000 0x1000>; + + #address-cells = <3>; + #size-cells = <2>; }; usb2: usb2@4000 { @@ -156,8 +159,6 @@ }; ohci: usb@d000 { - #usb-cells = <0>; - compatible = "generic-ohci"; reg = <0xd000 0x1000>; interrupt-parent = <&gic>; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm947189acdbmr.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm947189acdbmr.dts @@ -60,9 +60,9 @@ spi { compatible = "spi-gpio"; num-chipselects = <1>; - gpio-sck = <&chipcommon 21 0>; - gpio-miso = <&chipcommon 22 0>; - gpio-mosi = <&chipcommon 23 0>; + sck-gpios = <&chipcommon 21 0>; + miso-gpios = <&chipcommon 22 0>; + mosi-gpios = <&chipcommon 23 0>; cs-gpios = <&chipcommon 24 0>; #address-cells = <1>; #size-cells = <0>; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/broadcom/bcm953012er.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/broadcom/bcm953012er.dts @@ -84,6 +84,14 @@ label = "cpu"; ethernet = <&gmac0>; }; + + port@7 { + status = "disabled"; + }; + + port@8 { + status = "disabled"; + }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/nxp/imx/imx6q-skov-reve-mi1010ait-1cp1.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/nxp/imx/imx6q-skov-reve-mi1010ait-1cp1.dts @@ -37,9 +37,9 @@ &clks { assigned-clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>, - <&clks IMX6QDL_CLK_LDB_DI1_SEL>; + <&clks IMX6QDL_CLK_LDB_DI1_SEL>, <&clks IMX6QDL_CLK_ENET_REF_SEL>; assigned-clock-parents = <&clks IMX6QDL_CLK_PLL5_VIDEO_DIV>, - <&clks IMX6QDL_CLK_PLL5_VIDEO_DIV>; + <&clks IMX6QDL_CLK_PLL5_VIDEO_DIV>, <&clk50m_phy>; }; &hdmi { --- linux-azure-6.5.0.orig/arch/arm/boot/dts/nxp/imx/imx6ul-pico.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/nxp/imx/imx6ul-pico.dtsi @@ -121,6 +121,8 @@ max-speed = <100>; interrupt-parent = <&gpio5>; interrupts = <6 IRQ_TYPE_LEVEL_LOW>; + clocks = <&clks IMX6UL_CLK_ENET_REF>; + clock-names = "rmii-ref"; }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/nxp/imx/imx7s.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/nxp/imx/imx7s.dtsi @@ -454,7 +454,7 @@ }; gpt1: timer@302d0000 { - compatible = "fsl,imx7d-gpt", "fsl,imx6sx-gpt"; + compatible = "fsl,imx7d-gpt", "fsl,imx6dl-gpt"; reg = <0x302d0000 0x10000>; interrupts = ; clocks = <&clks IMX7D_GPT1_ROOT_CLK>, @@ -463,7 +463,7 @@ }; gpt2: timer@302e0000 { - compatible = "fsl,imx7d-gpt", "fsl,imx6sx-gpt"; + compatible = "fsl,imx7d-gpt", "fsl,imx6dl-gpt"; reg = <0x302e0000 0x10000>; interrupts = ; clocks = <&clks IMX7D_GPT2_ROOT_CLK>, @@ -473,7 +473,7 @@ }; gpt3: timer@302f0000 { - compatible = "fsl,imx7d-gpt", "fsl,imx6sx-gpt"; + compatible = "fsl,imx7d-gpt", "fsl,imx6dl-gpt"; reg = <0x302f0000 0x10000>; interrupts = ; clocks = <&clks IMX7D_GPT3_ROOT_CLK>, @@ -483,7 +483,7 @@ }; gpt4: timer@30300000 { - compatible = "fsl,imx7d-gpt", "fsl,imx6sx-gpt"; + compatible = "fsl,imx7d-gpt", "fsl,imx6dl-gpt"; reg = <0x30300000 0x10000>; interrupts = ; clocks = <&clks IMX7D_GPT4_ROOT_CLK>, --- linux-azure-6.5.0.orig/arch/arm/boot/dts/nxp/mxs/imx28-xea.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/nxp/mxs/imx28-xea.dts @@ -8,6 +8,7 @@ #include "imx28-lwe.dtsi" / { + model = "Liebherr XEA board"; compatible = "lwn,imx28-xea", "fsl,imx28"; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/qcom/qcom-apq8026-samsung-matisse-wifi.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/qcom/qcom-apq8026-samsung-matisse-wifi.dts @@ -45,11 +45,11 @@ event-hall-sensor { label = "Hall Effect Sensor"; - gpios = <&tlmm 110 GPIO_ACTIVE_HIGH>; - interrupts = <&tlmm 110 IRQ_TYPE_EDGE_FALLING>; + gpios = <&tlmm 110 GPIO_ACTIVE_LOW>; linux,input-type = ; linux,code = ; debounce-interval = <15>; + linux,can-disable; wakeup-source; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/qcom/qcom-ipq4019.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/qcom/qcom-ipq4019.dtsi @@ -230,9 +230,12 @@ interrupts = , ; interrupt-names = "hc_irq", "pwr_irq"; bus-width = <8>; - clocks = <&gcc GCC_SDCC1_AHB_CLK>, <&gcc GCC_SDCC1_APPS_CLK>, - <&gcc GCC_DCD_XO_CLK>; - clock-names = "iface", "core", "xo"; + clocks = <&gcc GCC_SDCC1_AHB_CLK>, + <&gcc GCC_SDCC1_APPS_CLK>, + <&xo>; + clock-names = "iface", + "core", + "xo"; status = "disabled"; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/qcom/qcom-mdm9615.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/qcom/qcom-mdm9615.dtsi @@ -46,14 +46,12 @@ }; }; - regulators { - vsdcc_fixed: vsdcc-regulator { - compatible = "regulator-fixed"; - regulator-name = "SDCC Power"; - regulator-min-microvolt = <2700000>; - regulator-max-microvolt = <2700000>; - regulator-always-on; - }; + vsdcc_fixed: vsdcc-regulator { + compatible = "regulator-fixed"; + regulator-name = "SDCC Power"; + regulator-min-microvolt = <2700000>; + regulator-max-microvolt = <2700000>; + regulator-always-on; }; soc: soc { --- linux-azure-6.5.0.orig/arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-castor.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/qcom/qcom-msm8974pro-sony-xperia-shinano-castor.dts @@ -125,15 +125,15 @@ syna,startup-delay-ms = <100>; - rmi-f01@1 { + rmi4-f01@1 { reg = <0x1>; - syna,nosleep = <1>; + syna,nosleep-mode = <1>; }; - rmi-f11@11 { + rmi4-f11@11 { reg = <0x11>; - syna,f11-flip-x = <1>; syna,sensor-type = <1>; + touchscreen-inverted-x; }; }; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/qcom/qcom-sdx65-mtp.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/qcom/qcom-sdx65-mtp.dts @@ -7,7 +7,7 @@ #include "qcom-sdx65.dtsi" #include #include -#include +#include #include "qcom-pmx65.dtsi" / { --- linux-azure-6.5.0.orig/arch/arm/boot/dts/renesas/r8a7792-blanche.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/renesas/r8a7792-blanche.dts @@ -239,7 +239,7 @@ }; keyboard_pins: keyboard { - pins = "GP_3_10", "GP_3_11", "GP_3_12", "GP_3_15", "GP_11_02"; + pins = "GP_3_10", "GP_3_11", "GP_3_12", "GP_3_15", "GP_11_2"; bias-pull-up; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/rockchip/rk3128.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/rockchip/rk3128.dtsi @@ -64,7 +64,8 @@ compatible = "arm,armv7-timer"; interrupts = , , - ; + , + ; arm,cpu-registers-not-fw-configured; clock-frequency = <24000000>; }; @@ -233,7 +234,7 @@ compatible = "rockchip,rk3128-timer", "rockchip,rk3288-timer"; reg = <0x20044000 0x20>; interrupts = ; - clocks = <&cru PCLK_TIMER>, <&xin24m>; + clocks = <&cru PCLK_TIMER>, <&cru SCLK_TIMER0>; clock-names = "pclk", "timer"; }; @@ -241,7 +242,7 @@ compatible = "rockchip,rk3128-timer", "rockchip,rk3288-timer"; reg = <0x20044020 0x20>; interrupts = ; - clocks = <&cru PCLK_TIMER>, <&xin24m>; + clocks = <&cru PCLK_TIMER>, <&cru SCLK_TIMER1>; clock-names = "pclk", "timer"; }; @@ -249,7 +250,7 @@ compatible = "rockchip,rk3128-timer", "rockchip,rk3288-timer"; reg = <0x20044040 0x20>; interrupts = ; - clocks = <&cru PCLK_TIMER>, <&xin24m>; + clocks = <&cru PCLK_TIMER>, <&cru SCLK_TIMER2>; clock-names = "pclk", "timer"; }; @@ -257,7 +258,7 @@ compatible = "rockchip,rk3128-timer", "rockchip,rk3288-timer"; reg = <0x20044060 0x20>; interrupts = ; - clocks = <&cru PCLK_TIMER>, <&xin24m>; + clocks = <&cru PCLK_TIMER>, <&cru SCLK_TIMER3>; clock-names = "pclk", "timer"; }; @@ -265,7 +266,7 @@ compatible = "rockchip,rk3128-timer", "rockchip,rk3288-timer"; reg = <0x20044080 0x20>; interrupts = ; - clocks = <&cru PCLK_TIMER>, <&xin24m>; + clocks = <&cru PCLK_TIMER>, <&cru SCLK_TIMER4>; clock-names = "pclk", "timer"; }; @@ -273,7 +274,7 @@ compatible = "rockchip,rk3128-timer", "rockchip,rk3288-timer"; reg = <0x200440a0 0x20>; interrupts = ; - clocks = <&cru PCLK_TIMER>, <&xin24m>; + clocks = <&cru PCLK_TIMER>, <&cru SCLK_TIMER5>; clock-names = "pclk", "timer"; }; @@ -426,7 +427,7 @@ i2c0: i2c@20072000 { compatible = "rockchip,rk3128-i2c", "rockchip,rk3288-i2c"; - reg = <20072000 0x1000>; + reg = <0x20072000 0x1000>; interrupts = ; clock-names = "i2c"; clocks = <&cru PCLK_I2C0>; @@ -458,6 +459,7 @@ interrupts = , ; arm,pl330-broken-no-flushp; + arm,pl330-periph-burst; clocks = <&cru ACLK_DMAC>; clock-names = "apb_pclk"; #dma-cells = <1>; @@ -793,7 +795,7 @@ }; sdmmc_pwren: sdmmc-pwren { - rockchip,pins = <1 RK_PB6 1 &pcfg_pull_default>; + rockchip,pins = <1 RK_PB6 RK_FUNC_GPIO &pcfg_pull_default>; }; sdmmc_bus4: sdmmc-bus4 { --- linux-azure-6.5.0.orig/arch/arm/boot/dts/samsung/exynos4210-i9100.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/samsung/exynos4210-i9100.dts @@ -207,8 +207,8 @@ power-on-delay = <10>; reset-delay = <10>; - panel-width-mm = <90>; - panel-height-mm = <154>; + panel-width-mm = <56>; + panel-height-mm = <93>; display-timings { timing { --- linux-azure-6.5.0.orig/arch/arm/boot/dts/samsung/s3c6410-mini6410.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/samsung/s3c6410-mini6410.dts @@ -51,7 +51,7 @@ ethernet@18000000 { compatible = "davicom,dm9000"; - reg = <0x18000000 0x2 0x18000004 0x2>; + reg = <0x18000000 0x2>, <0x18000004 0x2>; interrupt-parent = <&gpn>; interrupts = <7 IRQ_TYPE_LEVEL_HIGH>; davicom,no-eeprom; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/samsung/s5pv210-smdkv210.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/samsung/s5pv210-smdkv210.dts @@ -41,7 +41,7 @@ ethernet@a8000000 { compatible = "davicom,dm9000"; - reg = <0xA8000000 0x2 0xA8000002 0x2>; + reg = <0xa8000000 0x2>, <0xa8000002 0x2>; interrupt-parent = <&gph1>; interrupts = <1 IRQ_TYPE_LEVEL_HIGH>; local-mac-address = [00 00 de ad be ef]; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/st/stm32mp157c-emstamp-argon.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/st/stm32mp157c-emstamp-argon.dtsi @@ -368,8 +368,8 @@ &m4_rproc { memory-region = <&retram>, <&mcuram>, <&mcuram2>, <&vdev0vring0>, <&vdev0vring1>, <&vdev0buffer>; - mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>; - mbox-names = "vq0", "vq1", "shutdown"; + mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>, <&ipcc 3>; + mbox-names = "vq0", "vq1", "shutdown", "detach"; interrupt-parent = <&exti>; interrupts = <68 1>; interrupt-names = "wdg"; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/st/stm32mp157c-odyssey-som.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/st/stm32mp157c-odyssey-som.dtsi @@ -230,8 +230,8 @@ &m4_rproc { memory-region = <&retram>, <&mcuram>, <&mcuram2>, <&vdev0vring0>, <&vdev0vring1>, <&vdev0buffer>; - mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>; - mbox-names = "vq0", "vq1", "shutdown"; + mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>, <&ipcc 3>; + mbox-names = "vq0", "vq1", "shutdown", "detach"; interrupt-parent = <&exti>; interrupts = <68 1>; status = "okay"; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/st/stm32mp15xx-dhcom-som.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/st/stm32mp15xx-dhcom-som.dtsi @@ -416,8 +416,8 @@ &m4_rproc { memory-region = <&retram>, <&mcuram>, <&mcuram2>, <&vdev0vring0>, <&vdev0vring1>, <&vdev0buffer>; - mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>; - mbox-names = "vq0", "vq1", "shutdown"; + mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>, <&ipcc 3>; + mbox-names = "vq0", "vq1", "shutdown", "detach"; interrupt-parent = <&exti>; interrupts = <68 1>; status = "okay"; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/st/stm32mp15xx-dhcor-som.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/st/stm32mp15xx-dhcor-som.dtsi @@ -227,8 +227,8 @@ &m4_rproc { memory-region = <&retram>, <&mcuram>, <&mcuram2>, <&vdev0vring0>, <&vdev0vring1>, <&vdev0buffer>; - mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>; - mbox-names = "vq0", "vq1", "shutdown"; + mboxes = <&ipcc 0>, <&ipcc 1>, <&ipcc 2>, <&ipcc 3>; + mbox-names = "vq0", "vq1", "shutdown", "detach"; interrupt-parent = <&exti>; interrupts = <68 1>; status = "okay"; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/am33xx.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/am33xx.dtsi @@ -349,6 +349,7 @@ , , ; + ti,sysc-delay-us = <2>; clocks = <&l3s_clkctrl AM3_L3S_USB_OTG_HS_CLKCTRL 0>; clock-names = "fck"; #address-cells = <1>; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/am3517-evm.dts +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/am3517-evm.dts @@ -271,13 +271,6 @@ >; }; - leds_pins: leds-pins { - pinctrl-single,pins = < - OMAP3_WKUP_IOPAD(0x2a24, PIN_OUTPUT_PULLUP | MUX_MODE4) /* jtag_emu0.gpio_11 */ - OMAP3_WKUP_IOPAD(0x2a26, PIN_OUTPUT_PULLUP | MUX_MODE4) /* jtag_emu1.gpio_31 */ - >; - }; - mmc1_pins: mmc1-pins { pinctrl-single,pins = < OMAP3_CORE1_IOPAD(0x2144, PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc1_clk.sdmmc1_clk */ @@ -355,3 +348,12 @@ >; }; }; + +&omap3_pmx_wkup { + leds_pins: leds-pins { + pinctrl-single,pins = < + OMAP3_WKUP_IOPAD(0x2a24, PIN_OUTPUT_PULLUP | MUX_MODE4) /* jtag_emu0.gpio_11 */ + OMAP3_WKUP_IOPAD(0x2a26, PIN_OUTPUT_PULLUP | MUX_MODE4) /* jtag_emu1.gpio_31 */ + >; + }; +}; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/dra7.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/dra7.dtsi @@ -144,7 +144,7 @@ l3-noc@44000000 { compatible = "ti,dra7-l3-noc"; - reg = <0x44000000 0x1000>, + reg = <0x44000000 0x1000000>, <0x45000000 0x1000>; interrupts-extended = <&crossbar_mpu GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, <&wakeupgen GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/motorola-mapphone-common.dtsi @@ -614,12 +614,12 @@ /* Configure pwm clock source for timers 8 & 9 */ &timer8 { assigned-clocks = <&abe_clkctrl OMAP4_TIMER8_CLKCTRL 24>; - assigned-clock-parents = <&sys_clkin_ck>; + assigned-clock-parents = <&sys_32k_ck>; }; &timer9 { assigned-clocks = <&l4_per_clkctrl OMAP4_TIMER9_CLKCTRL 24>; - assigned-clock-parents = <&sys_clkin_ck>; + assigned-clock-parents = <&sys_32k_ck>; }; /* @@ -640,6 +640,7 @@ &uart3 { interrupts-extended = <&wakeupgen GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH &omap4_pmx_core 0x17c>; + overrun-throttle-ms = <500>; }; &uart4 { --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/omap3-cpu-thermal.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/omap3-cpu-thermal.dtsi @@ -12,8 +12,7 @@ polling-delay = <1000>; /* milliseconds */ coefficients = <0 20000>; - /* sensor ID */ - thermal-sensors = <&bandgap 0>; + thermal-sensors = <&bandgap>; cpu_trips: trips { cpu_alert0: cpu_alert { --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/omap4-cpu-thermal.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/omap4-cpu-thermal.dtsi @@ -12,7 +12,10 @@ polling-delay-passive = <250>; /* milliseconds */ polling-delay = <1000>; /* milliseconds */ - /* sensor ID */ + /* + * See 44xx files for single sensor addressing, omap5 and dra7 need + * also sensor ID for addressing. + */ thermal-sensors = <&bandgap 0>; cpu_trips: trips { --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/omap4-l4-abe.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/omap4-l4-abe.dtsi @@ -109,6 +109,8 @@ reg = <0x0 0xff>, /* MPU private access */ <0x49022000 0xff>; /* L3 Interconnect */ reg-names = "mpu", "dma"; + clocks = <&abe_clkctrl OMAP4_MCBSP1_CLKCTRL 24>; + clock-names = "fck"; interrupts = ; interrupt-names = "common"; ti,buffer-size = <128>; @@ -142,6 +144,8 @@ reg = <0x0 0xff>, /* MPU private access */ <0x49024000 0xff>; /* L3 Interconnect */ reg-names = "mpu", "dma"; + clocks = <&abe_clkctrl OMAP4_MCBSP2_CLKCTRL 24>; + clock-names = "fck"; interrupts = ; interrupt-names = "common"; ti,buffer-size = <128>; @@ -175,6 +179,8 @@ reg = <0x0 0xff>, /* MPU private access */ <0x49026000 0xff>; /* L3 Interconnect */ reg-names = "mpu", "dma"; + clocks = <&abe_clkctrl OMAP4_MCBSP3_CLKCTRL 24>; + clock-names = "fck"; interrupts = ; interrupt-names = "common"; ti,buffer-size = <128>; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/omap4-l4.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/omap4-l4.dtsi @@ -2043,6 +2043,8 @@ compatible = "ti,omap4-mcbsp"; reg = <0x0 0xff>; /* L4 Interconnect */ reg-names = "mpu"; + clocks = <&l4_per_clkctrl OMAP4_MCBSP4_CLKCTRL 24>; + clock-names = "fck"; interrupts = ; interrupt-names = "common"; ti,buffer-size = <128>; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/omap443x.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/omap443x.dtsi @@ -69,6 +69,7 @@ }; &cpu_thermal { + thermal-sensors = <&bandgap>; coefficients = <0 20000>; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/omap4460.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/omap4460.dtsi @@ -79,6 +79,7 @@ }; &cpu_thermal { + thermal-sensors = <&bandgap>; coefficients = <348 (-9301)>; }; --- linux-azure-6.5.0.orig/arch/arm/boot/dts/ti/omap/omap5-l4-abe.dtsi +++ linux-azure-6.5.0/arch/arm/boot/dts/ti/omap/omap5-l4-abe.dtsi @@ -109,6 +109,8 @@ reg = <0x0 0xff>, /* MPU private access */ <0x49022000 0xff>; /* L3 Interconnect */ reg-names = "mpu", "dma"; + clocks = <&abe_clkctrl OMAP5_MCBSP1_CLKCTRL 24>; + clock-names = "fck"; interrupts = ; interrupt-names = "common"; ti,buffer-size = <128>; @@ -142,6 +144,8 @@ reg = <0x0 0xff>, /* MPU private access */ <0x49024000 0xff>; /* L3 Interconnect */ reg-names = "mpu", "dma"; + clocks = <&abe_clkctrl OMAP5_MCBSP2_CLKCTRL 24>; + clock-names = "fck"; interrupts = ; interrupt-names = "common"; ti,buffer-size = <128>; @@ -175,6 +179,8 @@ reg = <0x0 0xff>, /* MPU private access */ <0x49026000 0xff>; /* L3 Interconnect */ reg-names = "mpu", "dma"; + clocks = <&abe_clkctrl OMAP5_MCBSP3_CLKCTRL 24>; + clock-names = "fck"; interrupts = ; interrupt-names = "common"; ti,buffer-size = <128>; --- linux-azure-6.5.0.orig/arch/arm/include/asm/arm_pmuv3.h +++ linux-azure-6.5.0/arch/arm/include/asm/arm_pmuv3.h @@ -23,6 +23,8 @@ #define PMUSERENR __ACCESS_CP15(c9, 0, c14, 0) #define PMINTENSET __ACCESS_CP15(c9, 0, c14, 1) #define PMINTENCLR __ACCESS_CP15(c9, 0, c14, 2) +#define PMCEID2 __ACCESS_CP15(c9, 0, c14, 4) +#define PMCEID3 __ACCESS_CP15(c9, 0, c14, 5) #define PMMIR __ACCESS_CP15(c9, 0, c14, 6) #define PMCCFILTR __ACCESS_CP15(c14, 0, c15, 7) @@ -150,21 +152,6 @@ return read_sysreg(PMCCNTR); } -static inline void write_pmxevcntr(u32 val) -{ - write_sysreg(val, PMXEVCNTR); -} - -static inline u32 read_pmxevcntr(void) -{ - return read_sysreg(PMXEVCNTR); -} - -static inline void write_pmxevtyper(u32 val) -{ - write_sysreg(val, PMXEVTYPER); -} - static inline void write_pmcntenset(u32 val) { write_sysreg(val, PMCNTENSET); @@ -205,16 +192,6 @@ write_sysreg(val, PMUSERENR); } -static inline u32 read_pmceid0(void) -{ - return read_sysreg(PMCEID0); -} - -static inline u32 read_pmceid1(void) -{ - return read_sysreg(PMCEID1); -} - static inline void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr) {} static inline void kvm_clr_pmu_events(u32 clr) {} static inline bool kvm_pmu_counter_deferred(struct perf_event_attr *attr) @@ -229,6 +206,7 @@ /* PMU Version in DFR Register */ #define ARMV8_PMU_DFR_VER_NI 0 +#define ARMV8_PMU_DFR_VER_V3P1 0x4 #define ARMV8_PMU_DFR_VER_V3P4 0x5 #define ARMV8_PMU_DFR_VER_V3P5 0x6 #define ARMV8_PMU_DFR_VER_IMP_DEF 0xF @@ -249,4 +227,24 @@ return pmuver >= ARMV8_PMU_DFR_VER_V3P5; } +static inline u64 read_pmceid0(void) +{ + u64 val = read_sysreg(PMCEID0); + + if (read_pmuver() >= ARMV8_PMU_DFR_VER_V3P1) + val |= (u64)read_sysreg(PMCEID2) << 32; + + return val; +} + +static inline u64 read_pmceid1(void) +{ + u64 val = read_sysreg(PMCEID1); + + if (read_pmuver() >= ARMV8_PMU_DFR_VER_V3P1) + val |= (u64)read_sysreg(PMCEID3) << 32; + + return val; +} + #endif --- linux-azure-6.5.0.orig/arch/arm/include/asm/dma.h +++ linux-azure-6.5.0/arch/arm/include/asm/dma.h @@ -12,6 +12,9 @@ extern phys_addr_t arm_dma_zone_size; \ arm_dma_zone_size && arm_dma_zone_size < (0x100000000ULL - PAGE_OFFSET) ? \ (PAGE_OFFSET + arm_dma_zone_size) : 0xffffffffUL; }) + +extern phys_addr_t arm_dma_limit; +#define ARCH_LOW_ADDRESS_LIMIT arm_dma_limit #endif #ifdef CONFIG_ISA_DMA_API --- linux-azure-6.5.0.orig/arch/arm/include/asm/exception.h +++ linux-azure-6.5.0/arch/arm/include/asm/exception.h @@ -10,10 +10,6 @@ #include -#ifdef CONFIG_FUNCTION_GRAPH_TRACER #define __exception_irq_entry __irq_entry -#else -#define __exception_irq_entry -#endif #endif /* __ASM_ARM_EXCEPTION_H */ --- linux-azure-6.5.0.orig/arch/arm/include/asm/irq.h +++ linux-azure-6.5.0/arch/arm/include/asm/irq.h @@ -32,7 +32,7 @@ #include extern void arch_trigger_cpumask_backtrace(const cpumask_t *mask, - bool exclude_self); + int exclude_cpu); #define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace #endif --- linux-azure-6.5.0.orig/arch/arm/include/asm/syscall.h +++ linux-azure-6.5.0/arch/arm/include/asm/syscall.h @@ -25,6 +25,9 @@ if (IS_ENABLED(CONFIG_AEABI) && !IS_ENABLED(CONFIG_OABI_COMPAT)) return task_thread_info(task)->abi_syscall; + if (task_thread_info(task)->abi_syscall == -1) + return -1; + return task_thread_info(task)->abi_syscall & __NR_SYSCALL_MASK; } --- linux-azure-6.5.0.orig/arch/arm/kernel/entry-common.S +++ linux-azure-6.5.0/arch/arm/kernel/entry-common.S @@ -90,6 +90,7 @@ cmp r0, #0 beq no_work_pending movlt scno, #(__NR_restart_syscall - __NR_SYSCALL_BASE) + str scno, [tsk, #TI_ABI_SYSCALL] @ make sure tracers see update ldmia sp, {r0 - r6} @ have to reload r0 - r6 b local_restart @ ... and off we go ENDPROC(ret_fast_syscall) --- linux-azure-6.5.0.orig/arch/arm/kernel/hw_breakpoint.c +++ linux-azure-6.5.0/arch/arm/kernel/hw_breakpoint.c @@ -626,7 +626,7 @@ hw->address &= ~alignment_mask; hw->ctrl.len <<= offset; - if (is_default_overflow_handler(bp)) { + if (uses_default_overflow_handler(bp)) { /* * Mismatch breakpoints are required for single-stepping * breakpoints. @@ -798,7 +798,7 @@ * Otherwise, insert a temporary mismatch breakpoint so that * we can single-step over the watchpoint trigger. */ - if (!is_default_overflow_handler(wp)) + if (!uses_default_overflow_handler(wp)) continue; step: enable_single_step(wp, instruction_pointer(regs)); @@ -811,7 +811,7 @@ info->trigger = addr; pr_debug("watchpoint fired: address = 0x%x\n", info->trigger); perf_bp_event(wp, regs); - if (is_default_overflow_handler(wp)) + if (uses_default_overflow_handler(wp)) enable_single_step(wp, instruction_pointer(regs)); } @@ -886,7 +886,7 @@ info->trigger = addr; pr_debug("breakpoint fired: address = 0x%x\n", addr); perf_bp_event(bp, regs); - if (is_default_overflow_handler(bp)) + if (uses_default_overflow_handler(bp)) enable_single_step(bp, addr); goto unlock; } --- linux-azure-6.5.0.orig/arch/arm/kernel/machine_kexec.c +++ linux-azure-6.5.0/arch/arm/kernel/machine_kexec.c @@ -94,16 +94,28 @@ } } +static DEFINE_PER_CPU(call_single_data_t, cpu_stop_csd) = + CSD_INIT(machine_crash_nonpanic_core, NULL); + void crash_smp_send_stop(void) { static int cpus_stopped; unsigned long msecs; + call_single_data_t *csd; + int cpu, this_cpu = raw_smp_processor_id(); if (cpus_stopped) return; atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1); - smp_call_function(machine_crash_nonpanic_core, NULL, false); + for_each_online_cpu(cpu) { + if (cpu == this_cpu) + continue; + + csd = &per_cpu(cpu_stop_csd, cpu); + smp_call_function_single_async(cpu, csd); + } + msecs = 1000; /* Wait at most a second for the other cpus to stop */ while ((atomic_read(&waiting_for_crash_ipi) > 0) && msecs) { mdelay(1); --- linux-azure-6.5.0.orig/arch/arm/kernel/module-plts.c +++ linux-azure-6.5.0/arch/arm/kernel/module-plts.c @@ -251,7 +251,7 @@ /* sort by type and symbol index */ sort(rels, numrels, sizeof(Elf32_Rel), cmp_rel, NULL); - if (strncmp(secstrings + dstsec->sh_name, ".init", 5) != 0) + if (!module_init_layout_section(secstrings + dstsec->sh_name)) core_plts += count_plts(syms, dstsec->sh_addr, rels, numrels, s->sh_info); else --- linux-azure-6.5.0.orig/arch/arm/kernel/ptrace.c +++ linux-azure-6.5.0/arch/arm/kernel/ptrace.c @@ -783,8 +783,9 @@ break; case PTRACE_SET_SYSCALL: - task_thread_info(child)->abi_syscall = data & - __NR_SYSCALL_MASK; + if (data != -1) + data &= __NR_SYSCALL_MASK; + task_thread_info(child)->abi_syscall = data; ret = 0; break; --- linux-azure-6.5.0.orig/arch/arm/kernel/smp.c +++ linux-azure-6.5.0/arch/arm/kernel/smp.c @@ -846,7 +846,7 @@ __ipi_send_mask(ipi_desc[IPI_CPU_BACKTRACE], mask); } -void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self) +void arch_trigger_cpumask_backtrace(const cpumask_t *mask, int exclude_cpu) { - nmi_trigger_cpumask_backtrace(mask, exclude_self, raise_nmi); + nmi_trigger_cpumask_backtrace(mask, exclude_cpu, raise_nmi); } --- linux-azure-6.5.0.orig/arch/arm/lib/memset.S +++ linux-azure-6.5.0/arch/arm/lib/memset.S @@ -17,6 +17,7 @@ ENTRY(mmioset) WEAK(memset) UNWIND( .fnstart ) + and r1, r1, #255 @ cast to unsigned char ands r3, r0, #3 @ 1 unaligned? mov ip, r0 @ preserve r0 as return value bne 6f @ 1 --- linux-azure-6.5.0.orig/arch/arm/mach-imx/mmdc.c +++ linux-azure-6.5.0/arch/arm/mach-imx/mmdc.c @@ -501,6 +501,10 @@ name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "mmdc%d", ret); + if (!name) { + ret = -ENOMEM; + goto pmu_release_id; + } pmu_mmdc->mmdc_ipg_clk = mmdc_ipg_clk; pmu_mmdc->devtype_data = (struct fsl_mmdc_devtype_data *)of_id->data; @@ -523,9 +527,10 @@ pmu_register_err: pr_warn("MMDC Perf PMU failed (%d), disabled\n", ret); - ida_simple_remove(&mmdc_ida, pmu_mmdc->id); cpuhp_state_remove_instance_nocalls(cpuhp_mmdc_state, &pmu_mmdc->node); hrtimer_cancel(&pmu_mmdc->hrtimer); +pmu_release_id: + ida_simple_remove(&mmdc_ida, pmu_mmdc->id); pmu_free: kfree(pmu_mmdc); return ret; --- linux-azure-6.5.0.orig/arch/arm/mach-omap1/board-ams-delta.c +++ linux-azure-6.5.0/arch/arm/mach-omap1/board-ams-delta.c @@ -550,6 +550,7 @@ &ams_delta_nand_device, &ams_delta_lcd_device, &cx20442_codec_device, + &modem_nreset_device, }; static struct gpiod_lookup_table *ams_delta_gpio_tables[] __initdata = { @@ -782,26 +783,28 @@ { }, }; +static int ams_delta_modem_pm_activate(struct device *dev) +{ + modem_priv.regulator = regulator_get(dev, "RESET#"); + if (IS_ERR(modem_priv.regulator)) + return -EPROBE_DEFER; + + return 0; +} + +static struct dev_pm_domain ams_delta_modem_pm_domain = { + .activate = ams_delta_modem_pm_activate, +}; + static struct platform_device ams_delta_modem_device = { .name = "serial8250", .id = PLAT8250_DEV_PLATFORM1, .dev = { .platform_data = ams_delta_modem_ports, + .pm_domain = &ams_delta_modem_pm_domain, }, }; -static int __init modem_nreset_init(void) -{ - int err; - - err = platform_device_register(&modem_nreset_device); - if (err) - pr_err("Couldn't register the modem regulator device\n"); - - return err; -} - - /* * This function expects MODEM IRQ number already assigned to the port. * The MODEM device requires its RESET# pin kept high during probe. @@ -833,37 +836,6 @@ } arch_initcall_sync(ams_delta_modem_init); -static int __init late_init(void) -{ - int err; - - err = modem_nreset_init(); - if (err) - return err; - - /* - * Once the modem device is registered, the modem_nreset - * regulator can be requested on behalf of that device. - */ - modem_priv.regulator = regulator_get(&ams_delta_modem_device.dev, - "RESET#"); - if (IS_ERR(modem_priv.regulator)) { - err = PTR_ERR(modem_priv.regulator); - goto unregister; - } - return 0; - -unregister: - platform_device_unregister(&ams_delta_modem_device); - return err; -} - -static void __init ams_delta_init_late(void) -{ - omap1_init_late(); - late_init(); -} - static void __init ams_delta_map_io(void) { omap1_map_io(); @@ -877,7 +849,7 @@ .init_early = omap1_init_early, .init_irq = omap1_init_irq, .init_machine = ams_delta_init, - .init_late = ams_delta_init_late, + .init_late = omap1_init_late, .init_time = omap1_timer_init, .restart = omap1_restart, MACHINE_END --- linux-azure-6.5.0.orig/arch/arm/mach-omap1/timer32k.c +++ linux-azure-6.5.0/arch/arm/mach-omap1/timer32k.c @@ -176,17 +176,18 @@ return sync32k_cnt_reg ? readl_relaxed(sync32k_cnt_reg) : 0; } +static struct timespec64 persistent_ts; +static cycles_t cycles; +static unsigned int persistent_mult, persistent_shift; + /** * omap_read_persistent_clock64 - Return time from a persistent clock. + * @ts: &struct timespec64 for the returned time * * Reads the time from a source which isn't disabled during PM, the * 32k sync timer. Convert the cycles elapsed since last read into * nsecs and adds to a monotonically increasing timespec64. */ -static struct timespec64 persistent_ts; -static cycles_t cycles; -static unsigned int persistent_mult, persistent_shift; - static void omap_read_persistent_clock64(struct timespec64 *ts) { unsigned long long nsecs; @@ -206,10 +207,9 @@ /** * omap_init_clocksource_32k - setup and register counter 32k as a * kernel clocksource - * @pbase: base addr of counter_32k module - * @size: size of counter_32k to map + * @vbase: base addr of counter_32k module * - * Returns 0 upon success or negative error code upon failure. + * Returns: %0 upon success or negative error code upon failure. * */ static int __init omap_init_clocksource_32k(void __iomem *vbase) --- linux-azure-6.5.0.orig/arch/arm/mach-omap2/id.c +++ linux-azure-6.5.0/arch/arm/mach-omap2/id.c @@ -793,11 +793,16 @@ soc_dev_attr->machine = soc_name; soc_dev_attr->family = omap_get_family(); + if (!soc_dev_attr->family) { + kfree(soc_dev_attr); + return; + } soc_dev_attr->revision = soc_rev; soc_dev_attr->custom_attr_group = omap_soc_groups[0]; soc_dev = soc_device_register(soc_dev_attr); if (IS_ERR(soc_dev)) { + kfree(soc_dev_attr->family); kfree(soc_dev_attr); return; } --- linux-azure-6.5.0.orig/arch/arm/mach-omap2/powerdomain.c +++ linux-azure-6.5.0/arch/arm/mach-omap2/powerdomain.c @@ -174,7 +174,7 @@ break; case PWRDM_STATE_PREV: prev = pwrdm_read_prev_pwrst(pwrdm); - if (pwrdm->state != prev) + if (prev >= 0 && pwrdm->state != prev) pwrdm->state_counter[prev]++; if (prev == PWRDM_POWER_RET) _update_logic_membank_counters(pwrdm); --- linux-azure-6.5.0.orig/arch/arm/mach-pxa/sharpsl_pm.c +++ linux-azure-6.5.0/arch/arm/mach-pxa/sharpsl_pm.c @@ -216,8 +216,6 @@ { schedule_delayed_work(&sharpsl_bat, msecs_to_jiffies(125)); } -EXPORT_SYMBOL(sharpsl_battery_kick); - static void sharpsl_battery_thread(struct work_struct *private_) { --- linux-azure-6.5.0.orig/arch/arm/mach-pxa/spitz.c +++ linux-azure-6.5.0/arch/arm/mach-pxa/spitz.c @@ -9,7 +9,6 @@ */ #include -#include /* symbol_get ; symbol_put */ #include #include #include @@ -518,17 +517,6 @@ }, }; -static void spitz_bl_kick_battery(void) -{ - void (*kick_batt)(void); - - kick_batt = symbol_get(sharpsl_battery_kick); - if (kick_batt) { - kick_batt(); - symbol_put(sharpsl_battery_kick); - } -} - static struct gpiod_lookup_table spitz_lcdcon_gpio_table = { .dev_id = "spi2.1", .table = { @@ -556,7 +544,7 @@ .max_intensity = 0x2f, .default_intensity = 0x1f, .limit_mask = 0x0b, - .kick_battery = spitz_bl_kick_battery, + .kick_battery = sharpsl_battery_kick, }; static struct spi_board_info spitz_spi_devices[] = { --- linux-azure-6.5.0.orig/arch/arm/mach-sunxi/mc_smp.c +++ linux-azure-6.5.0/arch/arm/mach-sunxi/mc_smp.c @@ -803,16 +803,16 @@ for (i = 0; i < ARRAY_SIZE(sunxi_mc_smp_data); i++) { ret = of_property_match_string(node, "enable-method", sunxi_mc_smp_data[i].enable_method); - if (!ret) + if (ret >= 0) break; } - is_a83t = sunxi_mc_smp_data[i].is_a83t; - of_node_put(node); - if (ret) + if (ret < 0) return -ENODEV; + is_a83t = sunxi_mc_smp_data[i].is_a83t; + if (!sunxi_mc_smp_cpu_table_init()) return -EINVAL; --- linux-azure-6.5.0.orig/arch/arm/xen/enlighten.c +++ linux-azure-6.5.0/arch/arm/xen/enlighten.c @@ -164,9 +164,6 @@ BUG_ON(err); per_cpu(xen_vcpu, cpu) = vcpup; - if (!xen_kernel_unmapped_at_usr()) - xen_setup_runstate_info(cpu); - after_register_vcpu_info: enable_percpu_irq(xen_events_irq, 0); return 0; @@ -207,7 +204,7 @@ static irqreturn_t xen_arm_callback(int irq, void *arg) { - xen_hvm_evtchn_do_upcall(); + xen_evtchn_do_upcall(); return IRQ_HANDLED; } @@ -487,7 +484,8 @@ * for secondary CPUs as they are brought up. * For uniformity we use VCPUOP_register_vcpu_info even on cpu0. */ - xen_vcpu_info = alloc_percpu(struct vcpu_info); + xen_vcpu_info = __alloc_percpu(sizeof(struct vcpu_info), + 1 << fls(sizeof(struct vcpu_info) - 1)); if (xen_vcpu_info == NULL) return -ENOMEM; @@ -523,9 +521,6 @@ return -EINVAL; } - if (!xen_kernel_unmapped_at_usr()) - xen_time_setup_guest(); - if (xen_initial_domain()) pvclock_gtod_register_notifier(&xen_pvclock_gtod_notifier); @@ -535,7 +530,13 @@ } early_initcall(xen_guest_init); -static int __init xen_pm_init(void) +static int xen_starting_runstate_cpu(unsigned int cpu) +{ + xen_setup_runstate_info(cpu); + return 0; +} + +static int __init xen_late_init(void) { if (!xen_domain()) return -ENODEV; @@ -548,9 +549,16 @@ do_settimeofday64(&ts); } - return 0; + if (xen_kernel_unmapped_at_usr()) + return 0; + + xen_time_setup_guest(); + + return cpuhp_setup_state(CPUHP_AP_ARM_XEN_RUNSTATE_STARTING, + "arm/xen_runstate:starting", + xen_starting_runstate_cpu, NULL); } -late_initcall(xen_pm_init); +late_initcall(xen_late_init); /* empty stubs */ --- linux-azure-6.5.0.orig/arch/arm64/Kconfig +++ linux-azure-6.5.0/arch/arm64/Kconfig @@ -1038,6 +1038,19 @@ If unsure, say Y. +config ARM64_ERRATUM_2966298 + bool "Cortex-A520: 2966298: workaround for speculatively executed unprivileged load" + default y + help + This option adds the workaround for ARM Cortex-A520 erratum 2966298. + + On an affected Cortex-A520 core, a speculatively executed unprivileged + load might leak data from a privileged level via a cache side channel. + + Work around this problem by executing a TLBI before returning to EL0. + + If unsure, say Y. + config CAVIUM_ERRATUM_22375 bool "Cavium erratum 22375, 24313" default y @@ -1356,6 +1369,8 @@ config CPU_BIG_ENDIAN bool "Build big-endian kernel" depends on !LD_IS_LLD || LLD_VERSION >= 130000 + # https://github.com/llvm/llvm-project/commit/1379b150991f70a5782e9a143c2ba5308da1161c + depends on AS_IS_GNU || AS_VERSION >= 150000 help Say Y if you plan on running a kernel with a big-endian userspace. @@ -1545,7 +1560,7 @@ # 64K | 29 | 16 | 13 | 13 | config ARCH_FORCE_MAX_ORDER int - default "13" if ARM64_64K_PAGES + default "13" if ARM64_64K_PAGES || (ARCH_THUNDER && ARM64_4K_PAGES) default "11" if ARM64_16K_PAGES default "10" help --- linux-azure-6.5.0.orig/arch/arm64/Makefile +++ linux-azure-6.5.0/arch/arm64/Makefile @@ -158,7 +158,7 @@ all: $(notdir $(KBUILD_IMAGE)) - +vmlinuz.efi: Image Image vmlinuz.efi: vmlinux $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/Makefile +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/Makefile @@ -66,6 +66,7 @@ dtb-$(CONFIG_ARCH_MXC) += imx8mm-nitrogen-r2.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mm-phg.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mm-phyboard-polis-rdk.dtb +dtb-$(CONFIG_ARCH_MXC) += imx8mm-prt8mm.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mm-tqma8mqml-mba8mx.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mm-var-som-symphony.dtb dtb-$(CONFIG_ARCH_MXC) += imx8mm-venice-gw71xx-0x.dtb --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi @@ -1186,26 +1186,34 @@ dma-coherent; }; - usb0: usb@3100000 { - status = "disabled"; - compatible = "snps,dwc3"; - reg = <0x0 0x3100000 0x0 0x10000>; - interrupts = <0 80 0x4>; /* Level high type */ - dr_mode = "host"; - snps,quirk-frame-length-adjustment = <0x20>; - snps,dis_rxdet_inp3_quirk; - snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>; - }; + bus: bus { + #address-cells = <2>; + #size-cells = <2>; + compatible = "simple-bus"; + ranges; + dma-ranges = <0x0 0x0 0x0 0x0 0x100 0x00000000>; + + usb0: usb@3100000 { + compatible = "snps,dwc3"; + reg = <0x0 0x3100000 0x0 0x10000>; + interrupts = <0 80 0x4>; /* Level high type */ + dr_mode = "host"; + snps,quirk-frame-length-adjustment = <0x20>; + snps,dis_rxdet_inp3_quirk; + snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>; + status = "disabled"; + }; - usb1: usb@3110000 { - status = "disabled"; - compatible = "snps,dwc3"; - reg = <0x0 0x3110000 0x0 0x10000>; - interrupts = <0 81 0x4>; /* Level high type */ - dr_mode = "host"; - snps,quirk-frame-length-adjustment = <0x20>; - snps,dis_rxdet_inp3_quirk; - snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>; + usb1: usb@3110000 { + compatible = "snps,dwc3"; + reg = <0x0 0x3110000 0x0 0x10000>; + interrupts = <0 81 0x4>; /* Level high type */ + dr_mode = "host"; + snps,quirk-frame-length-adjustment = <0x20>; + snps,dis_rxdet_inp3_quirk; + snps,incr-burst-type-adjustment = <1>, <4>, <8>, <16>; + status = "disabled"; + }; }; ccn@4000000 { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx8-apalis-v1.1.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx8-apalis-v1.1.dtsi @@ -82,12 +82,9 @@ pinctrl-0 = <&pinctrl_wifi_pdn>; gpio = <&lsio_gpio1 28 GPIO_ACTIVE_HIGH>; enable-active-high; + regulator-always-on; regulator-name = "wifi_pwrdn_fake_regulator"; regulator-settling-time-us = <100>; - - regulator-state-mem { - regulator-off-in-suspend; - }; }; reg_pcie_switch: regulator-pcie-switch { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx8-ss-lsio.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx8-ss-lsio.dtsi @@ -36,7 +36,8 @@ <&pwm0_lpcg 1>; assigned-clocks = <&clk IMX_SC_R_PWM_0 IMX_SC_PM_CLK_PER>; assigned-clock-rates = <24000000>; - #pwm-cells = <2>; + #pwm-cells = <3>; + interrupts = ; status = "disabled"; }; @@ -48,7 +49,8 @@ <&pwm1_lpcg 1>; assigned-clocks = <&clk IMX_SC_R_PWM_1 IMX_SC_PM_CLK_PER>; assigned-clock-rates = <24000000>; - #pwm-cells = <2>; + #pwm-cells = <3>; + interrupts = ; status = "disabled"; }; @@ -60,7 +62,8 @@ <&pwm2_lpcg 1>; assigned-clocks = <&clk IMX_SC_R_PWM_2 IMX_SC_PM_CLK_PER>; assigned-clock-rates = <24000000>; - #pwm-cells = <2>; + #pwm-cells = <3>; + interrupts = ; status = "disabled"; }; @@ -72,7 +75,8 @@ <&pwm3_lpcg 1>; assigned-clocks = <&clk IMX_SC_R_PWM_3 IMX_SC_PM_CLK_PER>; assigned-clock-rates = <24000000>; - #pwm-cells = <2>; + #pwm-cells = <3>; + interrupts = ; status = "disabled"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx8mm-evk.dtsi @@ -26,7 +26,7 @@ port { hdmi_connector_in: endpoint { - remote-endpoint = <&adv7533_out>; + remote-endpoint = <&adv7535_out>; }; }; }; @@ -72,6 +72,13 @@ enable-active-high; }; + reg_vddext_3v3: regulator-vddext-3v3 { + compatible = "regulator-fixed"; + regulator-name = "VDDEXT_3V3"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + backlight: backlight { compatible = "pwm-backlight"; pwms = <&pwm1 0 5000000 0>; @@ -317,15 +324,16 @@ hdmi@3d { compatible = "adi,adv7535"; - reg = <0x3d>, <0x3c>, <0x3e>, <0x3f>; - reg-names = "main", "cec", "edid", "packet"; + reg = <0x3d>; + interrupt-parent = <&gpio1>; + interrupts = <9 IRQ_TYPE_EDGE_FALLING>; adi,dsi-lanes = <4>; - - adi,input-depth = <8>; - adi,input-colorspace = "rgb"; - adi,input-clock = "1x"; - adi,input-style = <1>; - adi,input-justification = "evenly"; + avdd-supply = <&buck5_reg>; + dvdd-supply = <&buck5_reg>; + pvdd-supply = <&buck5_reg>; + a2vdd-supply = <&buck5_reg>; + v3p3-supply = <®_vddext_3v3>; + v1p2-supply = <&buck5_reg>; ports { #address-cells = <1>; @@ -334,7 +342,7 @@ port@0 { reg = <0>; - adv7533_in: endpoint { + adv7535_in: endpoint { remote-endpoint = <&dsi_out>; }; }; @@ -342,7 +350,7 @@ port@1 { reg = <1>; - adv7533_out: endpoint { + adv7535_out: endpoint { remote-endpoint = <&hdmi_connector_in>; }; }; @@ -408,7 +416,7 @@ reg = <1>; dsi_out: endpoint { - remote-endpoint = <&adv7533_in>; + remote-endpoint = <&adv7535_in>; data-lanes = <1 2 3 4>; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx8mm.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx8mm.dtsi @@ -399,6 +399,7 @@ "pll8k", "pll11k", "clkext3"; dmas = <&sdma2 24 25 0x80000000>; dma-names = "rx"; + #sound-dai-cells = <0>; status = "disabled"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx8mn.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx8mn.dtsi @@ -371,6 +371,7 @@ "pll8k", "pll11k", "clkext3"; dmas = <&sdma2 24 25 0x80000000>; dma-names = "rx"; + #sound-dai-cells = <0>; status = "disabled"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx8mp-beacon-kit.dts @@ -381,9 +381,10 @@ &sai3 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sai3>; - assigned-clocks = <&clk IMX8MP_CLK_SAI3>; + assigned-clocks = <&clk IMX8MP_CLK_SAI3>, + <&clk IMX8MP_AUDIO_PLL2> ; assigned-clock-parents = <&clk IMX8MP_AUDIO_PLL2_OUT>; - assigned-clock-rates = <12288000>; + assigned-clock-rates = <12288000>, <361267200>; fsl,sai-mclk-direction-output; status = "okay"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts @@ -285,7 +285,6 @@ usb_hub_2_x: hub@1 { compatible = "usbbda,5411"; reg = <1>; - reset-gpios = <&gpio4 25 GPIO_ACTIVE_LOW>; vdd-supply = <®_usb_hub>; peer-hub = <&usb_hub_3_x>; }; @@ -294,7 +293,6 @@ usb_hub_3_x: hub@2 { compatible = "usbbda,411"; reg = <2>; - reset-gpios = <&gpio4 25 GPIO_ACTIVE_LOW>; vdd-supply = <®_usb_hub>; peer-hub = <&usb_hub_2_x>; }; @@ -355,28 +353,6 @@ >; }; - pinctrl_fec: fecgrp { - fsl,pins = < - MX8MP_IOMUXC_SAI1_RXD2__ENET1_MDC 0x3 - MX8MP_IOMUXC_SAI1_RXD3__ENET1_MDIO 0x3 - MX8MP_IOMUXC_SAI1_RXD4__ENET1_RGMII_RD0 0x91 - MX8MP_IOMUXC_SAI1_RXD5__ENET1_RGMII_RD1 0x91 - MX8MP_IOMUXC_SAI1_RXD6__ENET1_RGMII_RD2 0x91 - MX8MP_IOMUXC_SAI1_RXD7__ENET1_RGMII_RD3 0x91 - MX8MP_IOMUXC_SAI1_TXC__ENET1_RGMII_RXC 0x91 - MX8MP_IOMUXC_SAI1_TXFS__ENET1_RGMII_RX_CTL 0x91 - MX8MP_IOMUXC_SAI1_TXD0__ENET1_RGMII_TD0 0x1f - MX8MP_IOMUXC_SAI1_TXD1__ENET1_RGMII_TD1 0x1f - MX8MP_IOMUXC_SAI1_TXD2__ENET1_RGMII_TD2 0x1f - MX8MP_IOMUXC_SAI1_TXD3__ENET1_RGMII_TD3 0x1f - MX8MP_IOMUXC_SAI1_TXD4__ENET1_RGMII_TX_CTL 0x1f - MX8MP_IOMUXC_SAI1_TXD5__ENET1_RGMII_TXC 0x1f - MX8MP_IOMUXC_SAI1_RXD1__ENET1_1588_EVENT1_OUT 0x1f - MX8MP_IOMUXC_SAI1_RXD0__ENET1_1588_EVENT1_IN 0x1f - MX8MP_IOMUXC_SAI1_TXD7__GPIO4_IO19 0x19 - >; - }; - pinctrl_gpio_led: gpioledgrp { fsl,pins = < MX8MP_IOMUXC_NAND_READY_B__GPIO3_IO16 0x19 @@ -466,7 +442,6 @@ pinctrl_usb1: usb1grp { fsl,pins = < MX8MP_IOMUXC_GPIO1_IO14__USB2_OTG_PWR 0x10 - MX8MP_IOMUXC_SAI2_TXC__GPIO4_IO25 0x19 >; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx8mp.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx8mp.dtsi @@ -794,6 +794,12 @@ reg = ; clocks = <&clk IMX8MP_CLK_AUDIO_ROOT>, <&clk IMX8MP_CLK_AUDIO_AXI>; + assigned-clocks = <&clk IMX8MP_CLK_AUDIO_AHB>, + <&clk IMX8MP_CLK_AUDIO_AXI_SRC>; + assigned-clock-parents = <&clk IMX8MP_SYS_PLL1_800M>, + <&clk IMX8MP_SYS_PLL1_800M>; + assigned-clock-rates = <400000000>, + <600000000>; }; pgc_gpu2d: power-domain@6 { @@ -2028,6 +2034,7 @@ phys = <&usb3_phy0>, <&usb3_phy0>; phy-names = "usb2-phy", "usb3-phy"; snps,gfladj-refclk-lpm-sel-quirk; + snps,parkmode-disable-ss-quirk; }; }; @@ -2070,6 +2077,7 @@ phys = <&usb3_phy1>, <&usb3_phy1>; phy-names = "usb2-phy", "usb3-phy"; snps,gfladj-refclk-lpm-sel-quirk; + snps,parkmode-disable-ss-quirk; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx8mq.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx8mq.dtsi @@ -1457,6 +1457,7 @@ phys = <&usb3_phy0>, <&usb3_phy0>; phy-names = "usb2-phy", "usb3-phy"; power-domains = <&pgc_otg1>; + snps,parkmode-disable-ss-quirk; status = "disabled"; }; @@ -1488,6 +1489,7 @@ phys = <&usb3_phy1>, <&usb3_phy1>; phy-names = "usb2-phy", "usb3-phy"; power-domains = <&pgc_otg2>; + snps,parkmode-disable-ss-quirk; status = "disabled"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx8qm-ss-img.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx8qm-ss-img.dtsi @@ -8,5 +8,5 @@ }; &jpegenc { - compatible = "nxp,imx8qm-jpgdec", "nxp,imx8qxp-jpgenc"; + compatible = "nxp,imx8qm-jpgenc", "nxp,imx8qxp-jpgenc"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/freescale/imx93.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/freescale/imx93.dtsi @@ -146,7 +146,7 @@ #size-cells = <1>; ranges; - anomix_ns_gpr: syscon@44210000 { + aonmix_ns_gpr: syscon@44210000 { compatible = "fsl,imx93-aonmix-ns-syscfg", "syscon"; reg = <0x44210000 0x1000>; }; @@ -280,6 +280,7 @@ assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>; assigned-clock-rates = <40000000>; fsl,clk-source = /bits/ 8 <0>; + fsl,stop-mode = <&aonmix_ns_gpr 0x14 0>; status = "disabled"; }; @@ -333,7 +334,7 @@ compatible = "fsl,imx93-src-slice"; reg = <0x44462400 0x400>, <0x44465800 0x400>; #power-domain-cells = <0>; - clocks = <&clk IMX93_CLK_MEDIA_AXI>, + clocks = <&clk IMX93_CLK_NIC_MEDIA_GATE>, <&clk IMX93_CLK_MEDIA_APB>; }; }; @@ -532,6 +533,7 @@ assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>; assigned-clock-rates = <40000000>; fsl,clk-source = /bits/ 8 <0>; + fsl,stop-mode = <&wakeupmix_gpr 0x0c 2>; status = "disabled"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/marvell/cn9130-crb.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/marvell/cn9130-crb.dtsi @@ -120,7 +120,7 @@ "mpp59", "mpp60", "mpp61"; marvell,function = "sdio"; }; - cp0_spi0_pins: cp0-spi-pins-0 { + cp0_spi1_pins: cp0-spi-pins-1 { marvell,pins = "mpp13", "mpp14", "mpp15", "mpp16"; marvell,function = "spi1"; }; @@ -170,7 +170,7 @@ &cp0_spi1 { pinctrl-names = "default"; - pinctrl-0 = <&cp0_spi0_pins>; + pinctrl-0 = <&cp0_spi1_pins>; reg = <0x700680 0x50>, /* control */ <0x2000000 0x1000000>; /* CS0 */ status = "okay"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/marvell/cn9130-db.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/marvell/cn9130-db.dtsi @@ -307,7 +307,7 @@ &cp0_spi1 { status = "disabled"; pinctrl-names = "default"; - pinctrl-0 = <&cp0_spi0_pins>; + pinctrl-0 = <&cp0_spi1_pins>; reg = <0x700680 0x50>; flash@0 { @@ -371,7 +371,7 @@ "mpp59", "mpp60", "mpp61"; marvell,function = "sdio"; }; - cp0_spi0_pins: cp0-spi-pins-0 { + cp0_spi1_pins: cp0-spi-pins-1 { marvell,pins = "mpp13", "mpp14", "mpp15", "mpp16"; marvell,function = "spi1"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts @@ -73,7 +73,7 @@ }; }; - memory { + memory@40000000 { reg = <0 0x40000000 0 0x40000000>; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts @@ -55,7 +55,7 @@ }; }; - memory { + memory@40000000 { reg = <0 0x40000000 0 0x20000000>; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt7622.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt7622.dtsi @@ -905,7 +905,7 @@ status = "disabled"; }; - sata_phy: t-phy@1a243000 { + sata_phy: t-phy { compatible = "mediatek,mt7622-tphy", "mediatek,generic-tphy-v1"; #address-cells = <2>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts @@ -126,6 +126,7 @@ compatible = "sff,sfp"; i2c-bus = <&i2c_sfp1>; los-gpios = <&pio 46 GPIO_ACTIVE_HIGH>; + maximum-power-milliwatt = <3000>; mod-def0-gpios = <&pio 49 GPIO_ACTIVE_LOW>; tx-disable-gpios = <&pio 20 GPIO_ACTIVE_HIGH>; tx-fault-gpios = <&pio 7 GPIO_ACTIVE_HIGH>; @@ -137,6 +138,7 @@ i2c-bus = <&i2c_sfp2>; los-gpios = <&pio 31 GPIO_ACTIVE_HIGH>; mod-def0-gpios = <&pio 47 GPIO_ACTIVE_LOW>; + maximum-power-milliwatt = <3000>; tx-disable-gpios = <&pio 15 GPIO_ACTIVE_HIGH>; tx-fault-gpios = <&pio 48 GPIO_ACTIVE_HIGH>; }; @@ -150,16 +152,16 @@ trip = <&cpu_trip_active_high>; }; - cpu-active-low { + cpu-active-med { /* active: set fan to cooling level 1 */ cooling-device = <&fan 1 1>; - trip = <&cpu_trip_active_low>; + trip = <&cpu_trip_active_med>; }; - cpu-passive { - /* passive: set fan to cooling level 0 */ + cpu-active-low { + /* active: set fan to cooling level 0 */ cooling-device = <&fan 0 0>; - trip = <&cpu_trip_passive>; + trip = <&cpu_trip_active_low>; }; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt7986a.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt7986a.dtsi @@ -374,6 +374,10 @@ reg = <0 0x11230000 0 0x1000>, <0 0x11c20000 0 0x1000>; interrupts = ; + assigned-clocks = <&topckgen CLK_TOP_EMMC_416M_SEL>, + <&topckgen CLK_TOP_EMMC_250M_SEL>; + assigned-clock-parents = <&apmixedsys CLK_APMIXED_MPLL>, + <&topckgen CLK_TOP_NET1PLL_D5_D2>; clocks = <&topckgen CLK_TOP_EMMC_416M_SEL>, <&infracfg CLK_INFRA_MSDC_HCK_CK>, <&infracfg CLK_INFRA_MSDC_CK>, @@ -434,7 +438,7 @@ }; }; - pcie_phy: t-phy@11c00000 { + pcie_phy: t-phy { compatible = "mediatek,mt7986-tphy", "mediatek,generic-tphy-v2"; #address-cells = <2>; @@ -610,22 +614,34 @@ thermal-sensors = <&thermal 0>; trips { + cpu_trip_crit: crit { + temperature = <125000>; + hysteresis = <2000>; + type = "critical"; + }; + + cpu_trip_hot: hot { + temperature = <120000>; + hysteresis = <2000>; + type = "hot"; + }; + cpu_trip_active_high: active-high { temperature = <115000>; hysteresis = <2000>; type = "active"; }; - cpu_trip_active_low: active-low { + cpu_trip_active_med: active-med { temperature = <85000>; hysteresis = <2000>; type = "active"; }; - cpu_trip_passive: passive { - temperature = <40000>; + cpu_trip_active_low: active-low { + temperature = <60000>; hysteresis = <2000>; - type = "passive"; + type = "active"; }; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt8173-evb.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt8173-evb.dts @@ -44,7 +44,7 @@ id-gpio = <&pio 16 GPIO_ACTIVE_HIGH>; }; - usb_p1_vbus: regulator@0 { + usb_p1_vbus: regulator-usb-p1 { compatible = "regulator-fixed"; regulator-name = "usb_vbus"; regulator-min-microvolt = <5000000>; @@ -53,7 +53,7 @@ enable-active-high; }; - usb_p0_vbus: regulator@1 { + usb_p0_vbus: regulator-usb-p0 { compatible = "regulator-fixed"; regulator-name = "vbus"; regulator-min-microvolt = <5000000>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt8183-evb.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt8183-evb.dts @@ -31,14 +31,14 @@ #address-cells = <2>; #size-cells = <2>; ranges; - scp_mem_reserved: scp_mem_region { + scp_mem_reserved: memory@50000000 { compatible = "shared-dma-pool"; reg = <0 0x50000000 0 0x2900000>; no-map; }; }; - ntc@0 { + thermal-sensor { compatible = "murata,ncp03wf104"; pullup-uv = <1800000>; pullup-ohm = <390000>; @@ -155,8 +155,8 @@ }; &pio { - i2c_pins_0: i2c0{ - pins_i2c{ + i2c_pins_0: i2c0 { + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -164,8 +164,8 @@ }; }; - i2c_pins_1: i2c1{ - pins_i2c{ + i2c_pins_1: i2c1 { + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -173,8 +173,8 @@ }; }; - i2c_pins_2: i2c2{ - pins_i2c{ + i2c_pins_2: i2c2 { + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -182,8 +182,8 @@ }; }; - i2c_pins_3: i2c3{ - pins_i2c{ + i2c_pins_3: i2c3 { + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -191,8 +191,8 @@ }; }; - i2c_pins_4: i2c4{ - pins_i2c{ + i2c_pins_4: i2c4 { + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -200,8 +200,8 @@ }; }; - i2c_pins_5: i2c5{ - pins_i2c{ + i2c_pins_5: i2c5 { + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -209,8 +209,8 @@ }; }; - spi_pins_0: spi0{ - pins_spi{ + spi_pins_0: spi0 { + pins_spi { pinmux = , , , @@ -324,8 +324,8 @@ }; }; - spi_pins_1: spi1{ - pins_spi{ + spi_pins_1: spi1 { + pins_spi { pinmux = , , , @@ -334,8 +334,8 @@ }; }; - spi_pins_2: spi2{ - pins_spi{ + spi_pins_2: spi2 { + pins_spi { pinmux = , , , @@ -344,8 +344,8 @@ }; }; - spi_pins_3: spi3{ - pins_spi{ + spi_pins_3: spi3 { + pins_spi { pinmux = , , , @@ -354,8 +354,8 @@ }; }; - spi_pins_4: spi4{ - pins_spi{ + spi_pins_4: spi4 { + pins_spi { pinmux = , , , @@ -364,8 +364,8 @@ }; }; - spi_pins_5: spi5{ - pins_spi{ + spi_pins_5: spi5 { + pins_spi { pinmux = , , , --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi @@ -91,6 +91,8 @@ &dsi0 { status = "okay"; + /delete-property/#size-cells; + /delete-property/#address-cells; /delete-node/panel@0; ports { port { @@ -441,20 +443,20 @@ }; touchscreen_pins: touchscreen-pins { - touch_int_odl { + touch-int-odl { pinmux = ; input-enable; bias-pull-up; }; - touch_rst_l { + touch-rst-l { pinmux = ; output-high; }; }; trackpad_pins: trackpad-pins { - trackpad_int { + trackpad-int { pinmux = ; input-enable; bias-disable; /* pulled externally */ --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi @@ -108,7 +108,7 @@ #size-cells = <2>; ranges; - scp_mem_reserved: scp_mem_region { + scp_mem_reserved: memory@50000000 { compatible = "shared-dma-pool"; reg = <0 0x50000000 0 0x2900000>; no-map; @@ -432,7 +432,7 @@ &pio { aud_pins_default: audiopins { - pins_bus { + pins-bus { pinmux = , , , @@ -454,7 +454,7 @@ }; aud_pins_tdm_out_on: audiotdmouton { - pins_bus { + pins-bus { pinmux = , , , @@ -466,7 +466,7 @@ }; aud_pins_tdm_out_off: audiotdmoutoff { - pins_bus { + pins-bus { pinmux = , , , @@ -480,13 +480,13 @@ }; bt_pins: bt-pins { - pins_bt_en { + pins-bt-en { pinmux = ; output-low; }; }; - ec_ap_int_odl: ec_ap_int_odl { + ec_ap_int_odl: ec-ap-int-odl { pins1 { pinmux = ; input-enable; @@ -494,7 +494,7 @@ }; }; - h1_int_od_l: h1_int_od_l { + h1_int_od_l: h1-int-od-l { pins1 { pinmux = ; input-enable; @@ -502,7 +502,7 @@ }; i2c0_pins: i2c0 { - pins_bus { + pins-bus { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -511,7 +511,7 @@ }; i2c1_pins: i2c1 { - pins_bus { + pins-bus { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -520,7 +520,7 @@ }; i2c2_pins: i2c2 { - pins_bus { + pins-bus { pinmux = , ; bias-disable; @@ -529,7 +529,7 @@ }; i2c3_pins: i2c3 { - pins_bus { + pins-bus { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -538,7 +538,7 @@ }; i2c4_pins: i2c4 { - pins_bus { + pins-bus { pinmux = , ; bias-disable; @@ -547,7 +547,7 @@ }; i2c5_pins: i2c5 { - pins_bus { + pins-bus { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -556,7 +556,7 @@ }; i2c6_pins: i2c6 { - pins_bus { + pins-bus { pinmux = , ; bias-disable; @@ -564,7 +564,7 @@ }; mmc0_pins_default: mmc0-pins-default { - pins_cmd_dat { + pins-cmd-dat { pinmux = , , , @@ -579,13 +579,13 @@ mediatek,pull-up-adv = <01>; }; - pins_clk { + pins-clk { pinmux = ; drive-strength = ; mediatek,pull-down-adv = <10>; }; - pins_rst { + pins-rst { pinmux = ; drive-strength = ; mediatek,pull-down-adv = <01>; @@ -593,7 +593,7 @@ }; mmc0_pins_uhs: mmc0-pins-uhs { - pins_cmd_dat { + pins-cmd-dat { pinmux = , , , @@ -608,19 +608,19 @@ mediatek,pull-up-adv = <01>; }; - pins_clk { + pins-clk { pinmux = ; drive-strength = ; mediatek,pull-down-adv = <10>; }; - pins_ds { + pins-ds { pinmux = ; drive-strength = ; mediatek,pull-down-adv = <10>; }; - pins_rst { + pins-rst { pinmux = ; drive-strength = ; mediatek,pull-up-adv = <01>; @@ -628,7 +628,7 @@ }; mmc1_pins_default: mmc1-pins-default { - pins_cmd_dat { + pins-cmd-dat { pinmux = , , , @@ -638,7 +638,7 @@ mediatek,pull-up-adv = <10>; }; - pins_clk { + pins-clk { pinmux = ; input-enable; mediatek,pull-down-adv = <10>; @@ -646,7 +646,7 @@ }; mmc1_pins_uhs: mmc1-pins-uhs { - pins_cmd_dat { + pins-cmd-dat { pinmux = , , , @@ -657,7 +657,7 @@ mediatek,pull-up-adv = <10>; }; - pins_clk { + pins-clk { pinmux = ; drive-strength = ; mediatek,pull-down-adv = <10>; @@ -665,15 +665,15 @@ }; }; - panel_pins_default: panel_pins_default { - panel_reset { + panel_pins_default: panel-pins-default { + panel-reset { pinmux = ; output-low; bias-pull-up; }; }; - pwm0_pin_default: pwm0_pin_default { + pwm0_pin_default: pwm0-pin-default { pins1 { pinmux = ; output-high; @@ -685,14 +685,14 @@ }; scp_pins: scp { - pins_scp_uart { + pins-scp-uart { pinmux = , ; }; }; spi0_pins: spi0 { - pins_spi{ + pins-spi { pinmux = , , , @@ -702,7 +702,7 @@ }; spi1_pins: spi1 { - pins_spi{ + pins-spi { pinmux = , , , @@ -712,20 +712,20 @@ }; spi2_pins: spi2 { - pins_spi{ + pins-spi { pinmux = , , ; bias-disable; }; - pins_spi_mi { + pins-spi-mi { pinmux = ; mediatek,pull-down-adv = <00>; }; }; spi3_pins: spi3 { - pins_spi{ + pins-spi { pinmux = , , , @@ -735,7 +735,7 @@ }; spi4_pins: spi4 { - pins_spi{ + pins-spi { pinmux = , , , @@ -745,7 +745,7 @@ }; spi5_pins: spi5 { - pins_spi{ + pins-spi { pinmux = , , , @@ -755,63 +755,63 @@ }; uart0_pins_default: uart0-pins-default { - pins_rx { + pins-rx { pinmux = ; input-enable; bias-pull-up; }; - pins_tx { + pins-tx { pinmux = ; }; }; uart1_pins_default: uart1-pins-default { - pins_rx { + pins-rx { pinmux = ; input-enable; bias-pull-up; }; - pins_tx { + pins-tx { pinmux = ; }; - pins_rts { + pins-rts { pinmux = ; output-enable; }; - pins_cts { + pins-cts { pinmux = ; input-enable; }; }; uart1_pins_sleep: uart1-pins-sleep { - pins_rx { + pins-rx { pinmux = ; input-enable; bias-pull-up; }; - pins_tx { + pins-tx { pinmux = ; }; - pins_rts { + pins-rts { pinmux = ; output-enable; }; - pins_cts { + pins-cts { pinmux = ; input-enable; }; }; wifi_pins_pwrseq: wifi-pins-pwrseq { - pins_wifi_enable { + pins-wifi-enable { pinmux = ; output-low; }; }; wifi_pins_wakeup: wifi-pins-wakeup { - pins_wifi_wakeup { + pins-wifi-wakeup { pinmux = ; input-enable; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt8183-pumpkin.dts @@ -193,7 +193,7 @@ &pio { i2c_pins_0: i2c0 { - pins_i2c{ + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -202,7 +202,7 @@ }; i2c_pins_1: i2c1 { - pins_i2c{ + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -211,7 +211,7 @@ }; i2c_pins_2: i2c2 { - pins_i2c{ + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -220,7 +220,7 @@ }; i2c_pins_3: i2c3 { - pins_i2c{ + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -229,7 +229,7 @@ }; i2c_pins_4: i2c4 { - pins_i2c{ + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; @@ -238,7 +238,7 @@ }; i2c_pins_5: i2c5 { - pins_i2c{ + pins_i2c { pinmux = , ; mediatek,pull-up-adv = <3>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt8183.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt8183.dtsi @@ -1210,127 +1210,6 @@ nvmem-cell-names = "calibration-data"; }; - thermal_zones: thermal-zones { - cpu_thermal: cpu-thermal { - polling-delay-passive = <100>; - polling-delay = <500>; - thermal-sensors = <&thermal 0>; - sustainable-power = <5000>; - - trips { - threshold: trip-point0 { - temperature = <68000>; - hysteresis = <2000>; - type = "passive"; - }; - - target: trip-point1 { - temperature = <80000>; - hysteresis = <2000>; - type = "passive"; - }; - - cpu_crit: cpu-crit { - temperature = <115000>; - hysteresis = <2000>; - type = "critical"; - }; - }; - - cooling-maps { - map0 { - trip = <&target>; - cooling-device = <&cpu0 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu1 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu2 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu3 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>; - contribution = <3072>; - }; - map1 { - trip = <&target>; - cooling-device = <&cpu4 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu5 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu6 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>, - <&cpu7 - THERMAL_NO_LIMIT - THERMAL_NO_LIMIT>; - contribution = <1024>; - }; - }; - }; - - /* The tzts1 ~ tzts6 don't need to polling */ - /* The tzts1 ~ tzts6 don't need to thermal throttle */ - - tzts1: tzts1 { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 1>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - - tzts2: tzts2 { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 2>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - - tzts3: tzts3 { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 3>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - - tzts4: tzts4 { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 4>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - - tzts5: tzts5 { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 5>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - - tztsABB: tztsABB { - polling-delay-passive = <0>; - polling-delay = <0>; - thermal-sensors = <&thermal 6>; - sustainable-power = <5000>; - trips {}; - cooling-maps {}; - }; - }; - pwm0: pwm@1100e000 { compatible = "mediatek,mt8183-disp-pwm"; reg = <0 0x1100e000 0 0x1000>; @@ -2105,4 +1984,125 @@ power-domains = <&spm MT8183_POWER_DOMAIN_CAM>; }; }; + + thermal_zones: thermal-zones { + cpu_thermal: cpu-thermal { + polling-delay-passive = <100>; + polling-delay = <500>; + thermal-sensors = <&thermal 0>; + sustainable-power = <5000>; + + trips { + threshold: trip-point0 { + temperature = <68000>; + hysteresis = <2000>; + type = "passive"; + }; + + target: trip-point1 { + temperature = <80000>; + hysteresis = <2000>; + type = "passive"; + }; + + cpu_crit: cpu-crit { + temperature = <115000>; + hysteresis = <2000>; + type = "critical"; + }; + }; + + cooling-maps { + map0 { + trip = <&target>; + cooling-device = <&cpu0 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu1 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu2 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu3 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>; + contribution = <3072>; + }; + map1 { + trip = <&target>; + cooling-device = <&cpu4 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu5 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu6 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>, + <&cpu7 + THERMAL_NO_LIMIT + THERMAL_NO_LIMIT>; + contribution = <1024>; + }; + }; + }; + + /* The tzts1 ~ tzts6 don't need to polling */ + /* The tzts1 ~ tzts6 don't need to thermal throttle */ + + tzts1: tzts1 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 1>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts2: tzts2 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 2>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts3: tzts3 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 3>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts4: tzts4 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 4>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tzts5: tzts5 { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 5>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + + tztsABB: tztsABB { + polling-delay-passive = <0>; + polling-delay = <0>; + thermal-sensors = <&thermal 6>; + sustainable-power = <5000>; + trips {}; + cooling-maps {}; + }; + }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt8186.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt8186.dtsi @@ -924,7 +924,8 @@ reg = ; clocks = <&topckgen CLK_TOP_SENINF>, <&topckgen CLK_TOP_SENINF1>; - clock-names = "csirx_top0", "csirx_top1"; + clock-names = "subsys-csirx-top0", + "subsys-csirx-top1"; #power-domain-cells = <0>; }; @@ -942,7 +943,8 @@ reg = ; clocks = <&topckgen CLK_TOP_AUDIODSP>, <&topckgen CLK_TOP_ADSP_BUS>; - clock-names = "audioadsp", "adsp_bus"; + clock-names = "audioadsp", + "subsys-adsp-bus"; #address-cells = <1>; #size-cells = <0>; #power-domain-cells = <1>; @@ -975,8 +977,11 @@ <&mmsys CLK_MM_SMI_COMMON>, <&mmsys CLK_MM_SMI_GALS>, <&mmsys CLK_MM_SMI_IOMMU>; - clock-names = "disp", "mdp", "smi_infra", "smi_common", - "smi_gals", "smi_iommu"; + clock-names = "disp", "mdp", + "subsys-smi-infra", + "subsys-smi-common", + "subsys-smi-gals", + "subsys-smi-iommu"; mediatek,infracfg = <&infracfg_ao>; #address-cells = <1>; #size-cells = <0>; @@ -993,15 +998,17 @@ power-domain@MT8186_POWER_DOMAIN_CAM { reg = ; - clocks = <&topckgen CLK_TOP_CAM>, - <&topckgen CLK_TOP_SENINF>, + clocks = <&topckgen CLK_TOP_SENINF>, <&topckgen CLK_TOP_SENINF1>, <&topckgen CLK_TOP_SENINF2>, <&topckgen CLK_TOP_SENINF3>, + <&camsys CLK_CAM2MM_GALS>, <&topckgen CLK_TOP_CAMTM>, - <&camsys CLK_CAM2MM_GALS>; - clock-names = "cam-top", "cam0", "cam1", "cam2", - "cam3", "cam-tm", "gals"; + <&topckgen CLK_TOP_CAM>; + clock-names = "cam0", "cam1", "cam2", + "cam3", "gals", + "subsys-cam-tm", + "subsys-cam-top"; mediatek,infracfg = <&infracfg_ao>; #address-cells = <1>; #size-cells = <0>; @@ -1020,9 +1027,9 @@ power-domain@MT8186_POWER_DOMAIN_IMG { reg = ; - clocks = <&topckgen CLK_TOP_IMG1>, - <&imgsys1 CLK_IMG1_GALS_IMG1>; - clock-names = "img-top", "gals"; + clocks = <&imgsys1 CLK_IMG1_GALS_IMG1>, + <&topckgen CLK_TOP_IMG1>; + clock-names = "gals", "subsys-img-top"; mediatek,infracfg = <&infracfg_ao>; #address-cells = <1>; #size-cells = <0>; @@ -1041,8 +1048,11 @@ <&ipesys CLK_IPE_LARB20>, <&ipesys CLK_IPE_SMI_SUBCOM>, <&ipesys CLK_IPE_GALS_IPE>; - clock-names = "ipe-top", "ipe-larb0", "ipe-larb1", - "ipe-smi", "ipe-gals"; + clock-names = "subsys-ipe-top", + "subsys-ipe-larb0", + "subsys-ipe-larb1", + "subsys-ipe-smi", + "subsys-ipe-gals"; mediatek,infracfg = <&infracfg_ao>; #power-domain-cells = <0>; }; @@ -1061,7 +1071,9 @@ clocks = <&topckgen CLK_TOP_WPE>, <&wpesys CLK_WPE_SMI_LARB8_CK_EN>, <&wpesys CLK_WPE_SMI_LARB8_PCLK_EN>; - clock-names = "wpe0", "larb-ck", "larb-pclk"; + clock-names = "wpe0", + "subsys-larb-ck", + "subsys-larb-pclk"; mediatek,infracfg = <&infracfg_ao>; #power-domain-cells = <0>; }; @@ -1656,7 +1668,7 @@ #address-cells = <1>; #size-cells = <1>; - gpu_speedbin: gpu-speed-bin@59c { + gpu_speedbin: gpu-speedbin@59c { reg = <0x59c 0x4>; bits = <0 3>; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt8195-cherry.dtsi @@ -362,7 +362,7 @@ pinctrl-0 = <&i2c7_pins>; pmic@34 { - #interrupt-cells = <1>; + #interrupt-cells = <2>; compatible = "mediatek,mt6360"; reg = <0x34>; interrupt-controller; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt8195-demo.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt8195-demo.dts @@ -48,7 +48,7 @@ memory@40000000 { device_type = "memory"; - reg = <0 0x40000000 0 0x80000000>; + reg = <0 0x40000000 0x2 0x00000000>; }; reserved-memory { @@ -56,13 +56,8 @@ #size-cells = <2>; ranges; - /* 2 MiB reserved for ARM Trusted Firmware (BL31) */ - bl31_secmon_reserved: secmon@54600000 { - no-map; - reg = <0 0x54600000 0x0 0x200000>; - }; - - /* 12 MiB reserved for OP-TEE (BL32) + /* + * 12 MiB reserved for OP-TEE (BL32) * +-----------------------+ 0x43e0_0000 * | SHMEM 2MiB | * +-----------------------+ 0x43c0_0000 @@ -75,6 +70,34 @@ no-map; reg = <0 0x43200000 0 0x00c00000>; }; + + scp_mem: memory@50000000 { + compatible = "shared-dma-pool"; + reg = <0 0x50000000 0 0x2900000>; + no-map; + }; + + vpu_mem: memory@53000000 { + compatible = "shared-dma-pool"; + reg = <0 0x53000000 0 0x1400000>; /* 20 MB */ + }; + + /* 2 MiB reserved for ARM Trusted Firmware (BL31) */ + bl31_secmon_mem: memory@54600000 { + no-map; + reg = <0 0x54600000 0x0 0x200000>; + }; + + snd_dma_mem: memory@60000000 { + compatible = "shared-dma-pool"; + reg = <0 0x60000000 0 0x1100000>; + no-map; + }; + + apu_mem: memory@62000000 { + compatible = "shared-dma-pool"; + reg = <0 0x62000000 0 0x1400000>; /* 20 MB */ + }; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/mediatek/mt8195.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/mediatek/mt8195.dtsi @@ -313,6 +313,7 @@ interrupts = ; cpus = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>, <&cpu4>, <&cpu5>, <&cpu6>, <&cpu7>; + status = "fail"; }; dmic_codec: dmic-codec { @@ -626,6 +627,8 @@ power-domain@MT8195_POWER_DOMAIN_VENC_CORE1 { reg = ; + clocks = <&vencsys_core1 CLK_VENC_CORE1_LARB>; + clock-names = "venc1-larb"; mediatek,infracfg = <&infracfg_ao>; #power-domain-cells = <0>; }; @@ -688,6 +691,8 @@ power-domain@MT8195_POWER_DOMAIN_VENC { reg = ; + clocks = <&vencsys CLK_VENC_LARB>; + clock-names = "venc0-larb"; mediatek,infracfg = <&infracfg_ao>; #power-domain-cells = <0>; }; @@ -2664,7 +2669,7 @@ reg = <0 0x1b010000 0 0x1000>; mediatek,larb-id = <20>; mediatek,smi = <&smi_common_vpp>; - clocks = <&vencsys_core1 CLK_VENC_CORE1_LARB>, + clocks = <&vencsys_core1 CLK_VENC_CORE1_VENC>, <&vencsys_core1 CLK_VENC_CORE1_GALS>, <&vppsys0 CLK_VPP0_GALS_VDO0_VDO1_VENCSYS_CORE1>; clock-names = "apb", "smi", "gals"; @@ -2957,7 +2962,7 @@ clock-names = "merge","merge_async"; power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>; mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0xc000 0x1000>; - mediatek,merge-mute = <1>; + mediatek,merge-mute; resets = <&vdosys1 MT8195_VDOSYS1_SW0_RST_B_MERGE0_DL_ASYNC>; }; @@ -2970,7 +2975,7 @@ clock-names = "merge","merge_async"; power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>; mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0xd000 0x1000>; - mediatek,merge-mute = <1>; + mediatek,merge-mute; resets = <&vdosys1 MT8195_VDOSYS1_SW0_RST_B_MERGE1_DL_ASYNC>; }; @@ -2983,7 +2988,7 @@ clock-names = "merge","merge_async"; power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>; mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0xe000 0x1000>; - mediatek,merge-mute = <1>; + mediatek,merge-mute; resets = <&vdosys1 MT8195_VDOSYS1_SW0_RST_B_MERGE2_DL_ASYNC>; }; @@ -2996,7 +3001,7 @@ clock-names = "merge","merge_async"; power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>; mediatek,gce-client-reg = <&gce0 SUBSYS_1c10XXXX 0xf000 0x1000>; - mediatek,merge-mute = <1>; + mediatek,merge-mute; resets = <&vdosys1 MT8195_VDOSYS1_SW0_RST_B_MERGE3_DL_ASYNC>; }; @@ -3009,7 +3014,7 @@ clock-names = "merge","merge_async"; power-domains = <&spm MT8195_POWER_DOMAIN_VDOSYS1>; mediatek,gce-client-reg = <&gce0 SUBSYS_1c11XXXX 0x0000 0x1000>; - mediatek,merge-fifo-en = <1>; + mediatek,merge-fifo-en; resets = <&vdosys1 MT8195_VDOSYS1_SW0_RST_B_MERGE4_DL_ASYNC>; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/nvidia/tegra186.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/nvidia/tegra186.dtsi @@ -135,7 +135,8 @@ clocks = <&bpmp TEGRA186_CLK_AHUB>; clock-names = "ahub"; assigned-clocks = <&bpmp TEGRA186_CLK_AHUB>; - assigned-clock-parents = <&bpmp TEGRA186_CLK_PLL_A_OUT0>; + assigned-clock-parents = <&bpmp TEGRA186_CLK_PLLP_OUT0>; + assigned-clock-rates = <81600000>; #address-cells = <1>; #size-cells = <1>; ranges = <0x02900800 0x02900800 0x11800>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/nvidia/tegra194.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/nvidia/tegra194.dtsi @@ -231,7 +231,8 @@ clocks = <&bpmp TEGRA194_CLK_AHUB>; clock-names = "ahub"; assigned-clocks = <&bpmp TEGRA194_CLK_AHUB>; - assigned-clock-parents = <&bpmp TEGRA194_CLK_PLLA_OUT0>; + assigned-clock-parents = <&bpmp TEGRA194_CLK_PLLP_OUT0>; + assigned-clock-rates = <81600000>; status = "disabled"; #address-cells = <2>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/nvidia/tegra210-smaug.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/nvidia/tegra210-smaug.dts @@ -1317,6 +1317,7 @@ uartd: serial@70006300 { compatible = "nvidia,tegra30-hsuart"; + reset-names = "serial"; status = "okay"; bluetooth { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/nvidia/tegra210.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/nvidia/tegra210.dtsi @@ -1386,7 +1386,8 @@ clocks = <&tegra_car TEGRA210_CLK_D_AUDIO>; clock-names = "ahub"; assigned-clocks = <&tegra_car TEGRA210_CLK_D_AUDIO>; - assigned-clock-parents = <&tegra_car TEGRA210_CLK_PLL_A_OUT0>; + assigned-clock-parents = <&tegra_car TEGRA210_CLK_PLL_P>; + assigned-clock-rates = <81600000>; #address-cells = <1>; #size-cells = <1>; ranges = <0x702d0000 0x702d0000 0x0000e400>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/nvidia/tegra234-p3737-0000+p3701-0000.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/nvidia/tegra234-p3737-0000+p3701-0000.dts @@ -2010,6 +2010,7 @@ serial@3100000 { compatible = "nvidia,tegra194-hsuart"; + reset-names = "serial"; status = "okay"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/nvidia/tegra234-p3740-0002+p3701-0008.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/nvidia/tegra234-p3740-0002+p3701-0008.dts @@ -12,6 +12,7 @@ aliases { serial0 = &tcu; + serial1 = &uarta; }; chosen { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/nvidia/tegra234-p3767.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/nvidia/tegra234-p3767.dtsi @@ -28,7 +28,7 @@ flash@0 { compatible = "jedec,spi-nor"; reg = <0>; - spi-max-frequency = <136000000>; + spi-max-frequency = <102000000>; spi-tx-bus-width = <4>; spi-rx-bus-width = <4>; }; @@ -42,7 +42,7 @@ mmc@3400000 { status = "okay"; bus-width = <4>; - cd-gpios = <&gpio TEGRA234_MAIN_GPIO(G, 7) GPIO_ACTIVE_HIGH>; + cd-gpios = <&gpio TEGRA234_MAIN_GPIO(G, 7) GPIO_ACTIVE_LOW>; disable-wp; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/nvidia/tegra234.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/nvidia/tegra234.dtsi @@ -43,12 +43,12 @@ , , , - , - , - , - , - , - ; + , + , + , + , + , + ; status = "okay"; }; @@ -180,7 +180,8 @@ clocks = <&bpmp TEGRA234_CLK_AHUB>; clock-names = "ahub"; assigned-clocks = <&bpmp TEGRA234_CLK_AHUB>; - assigned-clock-parents = <&bpmp TEGRA234_CLK_PLLA_OUT0>; + assigned-clock-parents = <&bpmp TEGRA234_CLK_PLLP_OUT0>; + assigned-clock-rates = <81600000>; status = "disabled"; #address-cells = <2>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/apq8016-sbc.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/apq8016-sbc.dts @@ -198,6 +198,9 @@ pd-gpios = <&tlmm 32 GPIO_ACTIVE_HIGH>; avdd-supply = <&pm8916_l6>; + a2vdd-supply = <&pm8916_l6>; + dvdd-supply = <&pm8916_l6>; + pvdd-supply = <&pm8916_l6>; v1p2-supply = <&pm8916_l6>; v3p3-supply = <&pm8916_l17>; @@ -278,7 +281,7 @@ compatible = "ovti,ov5640"; reg = <0x3b>; - enable-gpios = <&tlmm 34 GPIO_ACTIVE_HIGH>; + powerdown-gpios = <&tlmm 34 GPIO_ACTIVE_HIGH>; reset-gpios = <&tlmm 35 GPIO_ACTIVE_LOW>; pinctrl-names = "default"; pinctrl-0 = <&camera_rear_default>; @@ -287,9 +290,9 @@ clock-names = "xclk"; clock-frequency = <23880000>; - vdddo-supply = <&camera_vdddo_1v8>; - vdda-supply = <&camera_vdda_2v8>; - vddd-supply = <&camera_vddd_1v5>; + DOVDD-supply = <&camera_vdddo_1v8>; + AVDD-supply = <&camera_vdda_2v8>; + DVDD-supply = <&camera_vddd_1v5>; /* No camera mezzanine by default */ status = "disabled"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/apq8096-db820c.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/apq8096-db820c.dts @@ -62,25 +62,23 @@ stdout-path = "serial0:115200n8"; }; - clocks { - divclk4: divclk4 { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <32768>; - clock-output-names = "divclk4"; + div1_mclk: divclk1 { + compatible = "gpio-gate-clock"; + pinctrl-0 = <&audio_mclk>; + pinctrl-names = "default"; + clocks = <&rpmcc RPM_SMD_DIV_CLK1>; + #clock-cells = <0>; + enable-gpios = <&pm8994_gpios 15 0>; + }; - pinctrl-names = "default"; - pinctrl-0 = <&divclk4_pin_a>; - }; + divclk4: divclk4 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "divclk4"; - div1_mclk: divclk1 { - compatible = "gpio-gate-clock"; - pinctrl-0 = <&audio_mclk>; - pinctrl-names = "default"; - clocks = <&rpmcc RPM_SMD_DIV_CLK1>; - #clock-cells = <0>; - enable-gpios = <&pm8994_gpios 15 0>; - }; + pinctrl-names = "default"; + pinctrl-0 = <&divclk4_pin_a>; }; gpio-keys { @@ -208,6 +206,25 @@ status = "okay"; }; +&hdmi { + status = "okay"; + + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&hdmi_hpd_active &hdmi_ddc_active>; + pinctrl-1 = <&hdmi_hpd_suspend &hdmi_ddc_suspend>; + + core-vdda-supply = <&vreg_l12a_1p8>; + core-vcc-supply = <&vreg_s4a_1p8>; +}; + +&hdmi_phy { + status = "okay"; + + vddio-supply = <&vreg_l12a_1p8>; + vcca-supply = <&vreg_l28a_0p925>; + #phy-cells = <0>; +}; + &hsusb_phy1 { status = "okay"; @@ -232,25 +249,6 @@ status = "okay"; }; -&mdss_hdmi { - status = "okay"; - - pinctrl-names = "default", "sleep"; - pinctrl-0 = <&mdss_hdmi_hpd_active &mdss_hdmi_ddc_active>; - pinctrl-1 = <&mdss_hdmi_hpd_suspend &mdss_hdmi_ddc_suspend>; - - core-vdda-supply = <&vreg_l12a_1p8>; - core-vcc-supply = <&vreg_s4a_1p8>; -}; - -&mdss_hdmi_phy { - status = "okay"; - - vddio-supply = <&vreg_l12a_1p8>; - vcca-supply = <&vreg_l28a_0p925>; - #phy-cells = <0>; -}; - &mmcc { vdd-gfx-supply = <&vdd_gfx>; }; @@ -433,28 +431,28 @@ drive-strength = <2>; }; - mdss_hdmi_hpd_active: mdss_hdmi-hpd-active-state { + hdmi_hpd_active: hdmi-hpd-active-state { pins = "gpio34"; function = "hdmi_hot"; bias-pull-down; drive-strength = <16>; }; - mdss_hdmi_hpd_suspend: mdss_hdmi-hpd-suspend-state { + hdmi_hpd_suspend: hdmi-hpd-suspend-state { pins = "gpio34"; function = "hdmi_hot"; bias-pull-down; drive-strength = <2>; }; - mdss_hdmi_ddc_active: mdss_hdmi-ddc-active-state { + hdmi_ddc_active: hdmi-ddc-active-state { pins = "gpio32", "gpio33"; function = "hdmi_ddc"; drive-strength = <2>; bias-pull-up; }; - mdss_hdmi_ddc_suspend: mdss_hdmi-ddc-suspend-state { + hdmi_ddc_suspend: hdmi-ddc-suspend-state { pins = "gpio32", "gpio33"; function = "hdmi_ddc"; drive-strength = <2>; @@ -1043,7 +1041,7 @@ }; }; - mdss_hdmi-dai-link { + hdmi-dai-link { link-name = "HDMI"; cpu { sound-dai = <&q6afedai HDMI_RX>; @@ -1054,7 +1052,7 @@ }; codec { - sound-dai = <&mdss_hdmi 0>; + sound-dai = <&hdmi 0>; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/apq8096-ifc6640.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/apq8096-ifc6640.dts @@ -92,15 +92,15 @@ status = "okay"; }; -&mdss { +&hdmi { status = "okay"; }; -&mdss_hdmi { +&hdmi_phy { status = "okay"; }; -&mdss_hdmi_phy { +&mdss { status = "okay"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/ipq5332.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/ipq5332.dtsi @@ -135,7 +135,7 @@ reg = <0x0 0x4a800000 0x0 0x100000>; no-map; - hwlocks = <&tcsr_mutex 0>; + hwlocks = <&tcsr_mutex 3>; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/ipq6018.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/ipq6018.dtsi @@ -207,7 +207,7 @@ smem { compatible = "qcom,smem"; memory-region = <&smem_region>; - hwlocks = <&tcsr_mutex 0>; + hwlocks = <&tcsr_mutex 3>; }; soc: soc@0 { @@ -389,7 +389,7 @@ tcsr_mutex: hwlock@1905000 { compatible = "qcom,ipq6018-tcsr-mutex", "qcom,tcsr-mutex"; - reg = <0x0 0x01905000 0x0 0x1000>; + reg = <0x0 0x01905000 0x0 0x20000>; #hwlock-cells = <1>; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/ipq8074.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/ipq8074.dtsi @@ -101,7 +101,7 @@ reg = <0x0 0x4ab00000 0x0 0x100000>; no-map; - hwlocks = <&tcsr_mutex 0>; + hwlocks = <&tcsr_mutex 3>; }; memory@4ac00000 { @@ -794,10 +794,10 @@ pcie1: pci@10000000 { compatible = "qcom,pcie-ipq8074"; - reg = <0x10000000 0xf1d>, - <0x10000f20 0xa8>, - <0x00088000 0x2000>, - <0x10100000 0x1000>; + reg = <0x10000000 0xf1d>, + <0x10000f20 0xa8>, + <0x00088000 0x2000>, + <0x10100000 0x1000>; reg-names = "dbi", "elbi", "parf", "config"; device_type = "pci"; linux,pci-domain = <1>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/ipq9574.dtsi @@ -174,7 +174,7 @@ smem@4aa00000 { compatible = "qcom,smem"; reg = <0x0 0x4aa00000 0x0 0x100000>; - hwlocks = <&tcsr_mutex 0>; + hwlocks = <&tcsr_mutex 3>; no-map; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8916-longcheer-l8150.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8916-longcheer-l8150.dts @@ -165,7 +165,7 @@ pinctrl-0 = <&light_int_default>; vdd-supply = <&pm8916_l17>; - vio-supply = <&pm8916_l6>; + vddio-supply = <&pm8916_l6>; }; gyroscope@68 { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8916-samsung-serranove.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8916-samsung-serranove.dts @@ -219,9 +219,9 @@ compatible = "yamaha,yas537"; reg = <0x2e>; - mount-matrix = "0", "1", "0", - "1", "0", "0", - "0", "0", "-1"; + mount-matrix = "0", "1", "0", + "1", "0", "0", + "0", "0", "-1"; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8916.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8916.dtsi @@ -1805,7 +1805,7 @@ #size-cells = <1>; #iommu-cells = <1>; compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1"; - ranges = <0 0x01e20000 0x40000>; + ranges = <0 0x01e20000 0x20000>; reg = <0x01ef0000 0x3000>; clocks = <&gcc GCC_SMMU_CFG_CLK>, <&gcc GCC_APSS_TCU_CLK>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8939.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8939.dtsi @@ -55,6 +55,7 @@ L2_1: l2-cache { compatible = "cache"; cache-level = <2>; + cache-unified; }; }; @@ -111,6 +112,7 @@ L2_0: l2-cache { compatible = "cache"; cache-level = <2>; + cache-unified; }; }; @@ -155,7 +157,7 @@ idle-states { CPU_SLEEP_0: cpu-sleep-0 { - compatible ="qcom,idle-state-spc", "arm,idle-state"; + compatible = "arm,idle-state"; entry-latency-us = <130>; exit-latency-us = <150>; min-residency-us = <2000>; @@ -1447,7 +1449,7 @@ apps_iommu: iommu@1ef0000 { compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1"; reg = <0x01ef0000 0x3000>; - ranges = <0 0x01e20000 0x40000>; + ranges = <0 0x01e20000 0x20000>; clocks = <&gcc GCC_SMMU_CFG_CLK>, <&gcc GCC_APSS_TCU_CLK>; clock-names = "iface", "bus"; @@ -1644,7 +1646,7 @@ clocks = <&gcc GCC_SDCC2_AHB_CLK>, <&gcc GCC_SDCC2_APPS_CLK>, <&rpmcc RPM_SMD_XO_CLK_SRC>; - clock-names = "iface", "core", "xo"; + clock-names = "iface", "core", "xo"; resets = <&gcc GCC_SDCC2_BCR>; pinctrl-0 = <&sdc2_default>; pinctrl-1 = <&sdc2_sleep>; @@ -1731,7 +1733,7 @@ interrupts = ; clocks = <&gcc GCC_BLSP1_QUP2_I2C_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>; - clock-names = "core", "iface"; + clock-names = "core", "iface"; dmas = <&blsp_dma 6>, <&blsp_dma 7>; dma-names = "tx", "rx"; pinctrl-0 = <&blsp_i2c2_default>; @@ -1765,7 +1767,7 @@ interrupts = ; clocks = <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>; - clock-names = "core", "iface"; + clock-names = "core", "iface"; dmas = <&blsp_dma 8>, <&blsp_dma 9>; dma-names = "tx", "rx"; pinctrl-0 = <&blsp_i2c3_default>; @@ -1799,7 +1801,7 @@ interrupts = ; clocks = <&gcc GCC_BLSP1_QUP4_I2C_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>; - clock-names = "core", "iface"; + clock-names = "core", "iface"; dmas = <&blsp_dma 10>, <&blsp_dma 11>; dma-names = "tx", "rx"; pinctrl-0 = <&blsp_i2c4_default>; @@ -1833,7 +1835,7 @@ interrupts = ; clocks = <&gcc GCC_BLSP1_QUP5_I2C_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>; - clock-names = "core", "iface"; + clock-names = "core", "iface"; dmas = <&blsp_dma 12>, <&blsp_dma 13>; dma-names = "tx", "rx"; pinctrl-0 = <&blsp_i2c5_default>; @@ -1867,7 +1869,7 @@ interrupts = ; clocks = <&gcc GCC_BLSP1_QUP6_I2C_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>; - clock-names = "core", "iface"; + clock-names = "core", "iface"; dmas = <&blsp_dma 14>, <&blsp_dma 15>; dma-names = "tx", "rx"; pinctrl-0 = <&blsp_i2c6_default>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8953-xiaomi-daisy.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8953-xiaomi-daisy.dts @@ -17,7 +17,7 @@ compatible = "xiaomi,daisy", "qcom,msm8953"; chassis-type = "handset"; qcom,msm-id = <293 0>; - qcom,board-id= <0x1000b 0x9>; + qcom,board-id = <0x1000b 0x9>; chosen { #address-cells = <2>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8953-xiaomi-vince.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8953-xiaomi-vince.dts @@ -20,7 +20,7 @@ compatible = "xiaomi,vince", "qcom,msm8953"; chassis-type = "handset"; qcom,msm-id = <293 0>; - qcom,board-id= <0x1000b 0x08>; + qcom,board-id = <0x1000b 0x08>; gpio-keys { compatible = "gpio-keys"; @@ -132,7 +132,6 @@ touchscreen@20 { reg = <0x20>; compatible = "syna,rmi4-i2c"; - interrupts-parent = <&tlmm>; interrupts-extended = <&tlmm 65 IRQ_TYPE_EDGE_FALLING>; #address-cells = <1>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8976.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8976.dtsi @@ -303,7 +303,7 @@ smp2p-modem { compatible = "qcom,smp2p"; interrupts = ; - qcom,ipc = <&apcs 8 13>; + qcom,ipc = <&apcs 8 14>; qcom,local-pid = <0>; qcom,remote-pid = <1>; @@ -326,7 +326,7 @@ smp2p-wcnss { compatible = "qcom,smp2p"; interrupts = ; - qcom,ipc = <&apcs 8 17>; + qcom,ipc = <&apcs 8 18>; qcom,local-pid = <0>; qcom,remote-pid = <4>; @@ -428,9 +428,9 @@ #address-cells = <1>; #size-cells = <0>; - qcom,ipc-1 = <&apcs 8 12>; + qcom,ipc-1 = <&apcs 8 13>; qcom,ipc-2 = <&apcs 8 9>; - qcom,ipc-3 = <&apcs 8 18>; + qcom,ipc-3 = <&apcs 8 19>; apps_smsm: apps@0 { reg = <0>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8992-xiaomi-libra.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8992-xiaomi-libra.dts @@ -109,11 +109,6 @@ qcom,client-id = <1>; }; - audio_mem: audio@cb400000 { - reg = <0 0xcb000000 0 0x400000>; - no-mem; - }; - qseecom_mem: qseecom@cb400000 { reg = <0 0xcb400000 0 0x1c00000>; no-mem; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8996-mtp.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8996-mtp.dts @@ -24,10 +24,10 @@ status = "okay"; }; -&mdss_hdmi { +&hdmi { status = "okay"; }; -&mdss_hdmi_phy { +&hdmi_phy { status = "okay"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8996-xiaomi-common.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8996-xiaomi-common.dtsi @@ -11,26 +11,24 @@ #include / { - clocks { - divclk1_cdc: divclk1 { - compatible = "gpio-gate-clock"; - clocks = <&rpmcc RPM_SMD_DIV_CLK1>; - #clock-cells = <0>; - enable-gpios = <&pm8994_gpios 15 GPIO_ACTIVE_HIGH>; + divclk1_cdc: divclk1 { + compatible = "gpio-gate-clock"; + clocks = <&rpmcc RPM_SMD_DIV_CLK1>; + #clock-cells = <0>; + enable-gpios = <&pm8994_gpios 15 GPIO_ACTIVE_HIGH>; - pinctrl-names = "default"; - pinctrl-0 = <&divclk1_default>; - }; + pinctrl-names = "default"; + pinctrl-0 = <&divclk1_default>; + }; - divclk4: divclk4 { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <32768>; - clock-output-names = "divclk4"; + divclk4: divclk4 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "divclk4"; - pinctrl-names = "default"; - pinctrl-0 = <&divclk4_pin_a>; - }; + pinctrl-names = "default"; + pinctrl-0 = <&divclk4_pin_a>; }; gpio-keys { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8996-xiaomi-gemini.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8996-xiaomi-gemini.dts @@ -20,16 +20,14 @@ qcom,pmic-id = <0x20009 0x2000a 0x00 0x00>; qcom,board-id = <31 0>; - clocks { - divclk2_haptics: divclk2 { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <32768>; - clock-output-names = "divclk2"; + divclk2_haptics: divclk2 { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <32768>; + clock-output-names = "divclk2"; - pinctrl-names = "default"; - pinctrl-0 = <&divclk2_pin_a>; - }; + pinctrl-names = "default"; + pinctrl-0 = <&divclk2_pin_a>; }; }; @@ -82,7 +80,7 @@ #size-cells = <0>; interrupt-parent = <&tlmm>; interrupts = <125 IRQ_TYPE_LEVEL_LOW>; - vdda-supply = <&vreg_l6a_1p8>; + vio-supply = <&vreg_l6a_1p8>; vdd-supply = <&vdd_3v2_tp>; reset-gpios = <&tlmm 89 GPIO_ACTIVE_LOW>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8996.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8996.dtsi @@ -895,7 +895,7 @@ <&mdss_dsi0_phy 0>, <&mdss_dsi1_phy 1>, <&mdss_dsi1_phy 0>, - <&mdss_hdmi_phy>; + <&hdmi_phy>; clock-names = "xo", "gpll0", "gcc_mmss_noc_cfg_ahb_clk", @@ -980,7 +980,7 @@ port@0 { reg = <0>; mdp5_intf3_out: endpoint { - remote-endpoint = <&mdss_hdmi_in>; + remote-endpoint = <&hdmi_in>; }; }; @@ -1075,7 +1075,7 @@ reg-names = "dsi_ctrl"; interrupt-parent = <&mdss>; - interrupts = <4>; + interrupts = <5>; clocks = <&mmcc MDSS_MDP_CLK>, <&mmcc MDSS_BYTE1_CLK>, @@ -1136,11 +1136,11 @@ status = "disabled"; }; - mdss_hdmi: mdss_hdmi-tx@9a0000 { - compatible = "qcom,mdss_hdmi-tx-8996"; - reg = <0x009a0000 0x50c>, - <0x00070000 0x6158>, - <0x009e0000 0xfff>; + hdmi: hdmi-tx@9a0000 { + compatible = "qcom,hdmi-tx-8996"; + reg = <0x009a0000 0x50c>, + <0x00070000 0x6158>, + <0x009e0000 0xfff>; reg-names = "core_physical", "qfprom_physical", "hdcp_physical"; @@ -1160,7 +1160,7 @@ "alt_iface", "extp"; - phys = <&mdss_hdmi_phy>; + phys = <&hdmi_phy>; #sound-dai-cells = <1>; status = "disabled"; @@ -1171,16 +1171,16 @@ port@0 { reg = <0>; - mdss_hdmi_in: endpoint { + hdmi_in: endpoint { remote-endpoint = <&mdp5_intf3_out>; }; }; }; }; - mdss_hdmi_phy: phy@9a0600 { + hdmi_phy: phy@9a0600 { #phy-cells = <0>; - compatible = "qcom,mdss_hdmi-phy-8996"; + compatible = "qcom,hdmi-phy-8996"; reg = <0x009a0600 0x1c4>, <0x009a0a00 0x124>, <0x009a0c00 0x124>, @@ -3336,6 +3336,9 @@ #size-cells = <1>; ranges; + interrupts = ; + interrupt-names = "hs_phy_irq"; + clocks = <&gcc GCC_PERIPH_NOC_USB20_AHB_CLK>, <&gcc GCC_USB20_MASTER_CLK>, <&gcc GCC_USB20_MOCK_UTMI_CLK>, --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8996pro-xiaomi-natrium.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8996pro-xiaomi-natrium.dts @@ -106,7 +106,7 @@ &sound { compatible = "qcom,apq8096-sndcard"; model = "natrium"; - audio-routing = "RX_BIAS", "MCLK"; + audio-routing = "RX_BIAS", "MCLK"; mm1-dai-link { link-name = "MultiMedia1"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/msm8998.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/msm8998.dtsi @@ -909,10 +909,10 @@ pcie0: pci@1c00000 { compatible = "qcom,pcie-msm8998", "qcom,pcie-msm8996"; - reg = <0x01c00000 0x2000>, - <0x1b000000 0xf1d>, - <0x1b000f20 0xa8>, - <0x1b100000 0x100000>; + reg = <0x01c00000 0x2000>, + <0x1b000000 0xf1d>, + <0x1b000f20 0xa8>, + <0x1b100000 0x100000>; reg-names = "parf", "dbi", "elbi", "config"; device_type = "pci"; linux,pci-domain = <0>; @@ -2074,11 +2074,11 @@ spmi_bus: spmi@800f000 { compatible = "qcom,spmi-pmic-arb"; - reg = <0x0800f000 0x1000>, - <0x08400000 0x1000000>, - <0x09400000 0x1000000>, - <0x0a400000 0x220000>, - <0x0800a000 0x3000>; + reg = <0x0800f000 0x1000>, + <0x08400000 0x1000000>, + <0x09400000 0x1000000>, + <0x0a400000 0x220000>, + <0x0800a000 0x3000>; reg-names = "core", "chnls", "obsrvr", "intr", "cnfg"; interrupt-names = "periph_irq"; interrupts = ; @@ -2737,10 +2737,10 @@ clocks = <&mmcc MNOC_AHB_CLK>, <&mmcc BIMC_SMMU_AHB_CLK>, - <&rpmcc RPM_SMD_MMAXI_CLK>, <&mmcc BIMC_SMMU_AXI_CLK>; - clock-names = "iface-mm", "iface-smmu", - "bus-mm", "bus-smmu"; + clock-names = "iface-mm", + "iface-smmu", + "bus-smmu"; #global-interrupts = <0>; interrupts = @@ -2764,6 +2764,8 @@ , , ; + + power-domains = <&mmcc BIMC_SMMU_GDSC>; }; remoteproc_adsp: remoteproc@17300000 { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/pm6150l.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/pm6150l.dtsi @@ -121,8 +121,9 @@ pm6150l_wled: leds@d800 { compatible = "qcom,pm6150l-wled"; reg = <0xd800>, <0xd900>; - interrupts = <0x5 0xd8 0x1 IRQ_TYPE_EDGE_RISING>; - interrupt-names = "ovp"; + interrupts = <0x5 0xd8 0x1 IRQ_TYPE_EDGE_RISING>, + <0x5 0xd8 0x2 IRQ_TYPE_EDGE_RISING>; + interrupt-names = "ovp", "short"; label = "backlight"; status = "disabled"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/pm660l.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/pm660l.dtsi @@ -74,8 +74,9 @@ pm660l_wled: leds@d800 { compatible = "qcom,pm660l-wled"; reg = <0xd800>, <0xd900>; - interrupts = <0x3 0xd8 0x1 IRQ_TYPE_EDGE_RISING>; - interrupt-names = "ovp"; + interrupts = <0x3 0xd8 0x1 IRQ_TYPE_EDGE_RISING>, + <0x3 0xd8 0x2 IRQ_TYPE_EDGE_RISING>; + interrupt-names = "ovp", "short"; label = "backlight"; status = "disabled"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/pm8350.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/pm8350.dtsi @@ -8,7 +8,7 @@ / { thermal-zones { - pm8350_thermal: pm8350c-thermal { + pm8350_thermal: pm8350-thermal { polling-delay-passive = <100>; polling-delay = <0>; thermal-sensors = <&pm8350_temp_alarm>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/pm8350b.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/pm8350b.dtsi @@ -8,7 +8,7 @@ / { thermal-zones { - pm8350b_thermal: pm8350c-thermal { + pm8350b_thermal: pm8350b-thermal { polling-delay-passive = <100>; polling-delay = <0>; thermal-sensors = <&pm8350b_temp_alarm>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/pmi8950.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/pmi8950.dtsi @@ -87,8 +87,9 @@ pmi8950_wled: leds@d800 { compatible = "qcom,pmi8950-wled"; reg = <0xd800>, <0xd900>; - interrupts = <0x3 0xd8 0x02 IRQ_TYPE_EDGE_RISING>; - interrupt-names = "short"; + interrupts = <0x3 0xd8 0x1 IRQ_TYPE_EDGE_RISING>, + <0x3 0xd8 0x2 IRQ_TYPE_EDGE_RISING>; + interrupt-names = "ovp", "short"; label = "backlight"; status = "disabled"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/pmi8994.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/pmi8994.dtsi @@ -54,8 +54,9 @@ pmi8994_wled: wled@d800 { compatible = "qcom,pmi8994-wled"; reg = <0xd800>, <0xd900>; - interrupts = <3 0xd8 0x02 IRQ_TYPE_EDGE_RISING>; - interrupt-names = "short"; + interrupts = <0x3 0xd8 0x1 IRQ_TYPE_EDGE_RISING>, + <0x3 0xd8 0x2 IRQ_TYPE_EDGE_RISING>; + interrupt-names = "ovp", "short"; qcom,cabc; qcom,external-pfet; status = "disabled"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/pmk8350.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/pmk8350.dtsi @@ -59,7 +59,7 @@ }; pmk8350_adc_tm: adc-tm@3400 { - compatible = "qcom,adc-tm7"; + compatible = "qcom,spmi-adc-tm5-gen2"; reg = <0x3400>; interrupts = ; #address-cells = <1>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/pmr735b.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/pmr735b.dtsi @@ -8,7 +8,7 @@ / { thermal-zones { - pmr735a_thermal: pmr735a-thermal { + pmr735b_thermal: pmr735b-thermal { polling-delay-passive = <100>; polling-delay = <0>; thermal-sensors = <&pmr735b_temp_alarm>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/qcm2290.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/qcm2290.dtsi @@ -790,7 +790,7 @@ , , ; - dma-channels = <10>; + dma-channels = <10>; dma-channel-mask = <0x1f>; iommus = <&apps_smmu 0xf6 0x0>; #dma-cells = <3>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/qcs404.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/qcs404.dtsi @@ -1459,10 +1459,10 @@ pcie: pci@10000000 { compatible = "qcom,pcie-qcs404"; - reg = <0x10000000 0xf1d>, - <0x10000f20 0xa8>, - <0x07780000 0x2000>, - <0x10001000 0x2000>; + reg = <0x10000000 0xf1d>, + <0x10000f20 0xa8>, + <0x07780000 0x2000>, + <0x10001000 0x2000>; reg-names = "dbi", "elbi", "parf", "config"; device_type = "pci"; linux,pci-domain = <0>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/qrb2210-rb1.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/qrb2210-rb1.dts @@ -13,7 +13,7 @@ compatible = "qcom,qrb2210-rb1", "qcom,qrb2210", "qcom,qcm2290"; aliases { - serial0 = &uart0; + serial0 = &uart4; sdhc1 = &sdhc_1; sdhc2 = &sdhc_2; }; @@ -94,7 +94,7 @@ }; /* UART connected to the Micro-USB port via a FTDI chip */ -&uart0 { +&uart4 { compatible = "qcom,geni-debug-uart"; status = "okay"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sa8540p.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sa8540p.dtsi @@ -207,7 +207,7 @@ linux,pci-domain = <2>; - interrupts = ; + interrupts = ; interrupt-names = "msi"; interrupt-map = <0 0 0 1 &intc 0 0 GIC_SPI 541 IRQ_TYPE_LEVEL_HIGH>, --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sa8775p-pmics.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sa8775p-pmics.dtsi @@ -173,7 +173,7 @@ compatible = "qcom,pmm8654au-gpio", "qcom,spmi-gpio"; reg = <0x8800>; gpio-controller; - gpio-ranges = <&pmm8654au_2_gpios 0 0 12>; + gpio-ranges = <&pmm8654au_1_gpios 0 0 12>; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sc7280-herobrine-audio-rt5682-3mic.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sc7280-herobrine-audio-rt5682-3mic.dtsi @@ -13,7 +13,7 @@ compatible = "google,sc7280-herobrine"; model = "sc7280-rt5682-max98360a-3mic"; - audio-routing = "VA DMIC0", "vdd-micb", + audio-routing = "VA DMIC0", "vdd-micb", "VA DMIC1", "vdd-micb", "VA DMIC2", "vdd-micb", "VA DMIC3", "vdd-micb", --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sc7280.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sc7280.dtsi @@ -649,18 +649,6 @@ }; }; - eud_typec: connector { - compatible = "usb-c-connector"; - - ports { - port@0 { - con_eud: endpoint { - remote-endpoint = <&eud_con>; - }; - }; - }; - }; - memory@80000000 { device_type = "memory"; /* We expect the bootloader to fill in the size */ @@ -869,7 +857,8 @@ clocks = <&rpmhcc RPMH_CXO_CLK>, <&rpmhcc RPMH_CXO_CLK_A>, <&sleep_clk>, <0>, <&pcie1_lane>, - <0>, <0>, <0>, <0>; + <0>, <0>, <0>, + <&usb_1_ssphy>; clock-names = "bi_tcxo", "bi_tcxo_ao", "sleep_clk", "pcie_0_pipe_clk", "pcie_1_pipe_clk", "ufs_phy_rx_symbol_0_clk", "ufs_phy_rx_symbol_1_clk", @@ -2449,7 +2438,7 @@ <&apps_smmu 0x1821 0>, <&apps_smmu 0x1832 0>; - power-domains = <&rpmhpd SC7280_LCX>; + power-domains = <&rpmhpd SC7280_LCX>; power-domain-names = "lcx"; required-opps = <&rpmhpd_opp_nom>; @@ -3624,6 +3613,8 @@ <0 0x88e2000 0 0x1000>; interrupts-extended = <&pdc 11 IRQ_TYPE_LEVEL_HIGH>; + status = "disabled"; + ports { #address-cells = <1>; #size-cells = <0>; @@ -3634,13 +3625,6 @@ remote-endpoint = <&usb2_role_switch>; }; }; - - port@1 { - reg = <1>; - eud_con: endpoint { - remote-endpoint = <&con_eud>; - }; - }; }; }; @@ -5363,6 +5347,14 @@ reg = <0 0x18591000 0 0x1000>, <0 0x18592000 0 0x1000>, <0 0x18593000 0 0x1000>; + + interrupts = , + , + ; + interrupt-names = "dcvsh-irq-0", + "dcvsh-irq-1", + "dcvsh-irq-2"; + clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GCC_GPLL0>; clock-names = "xo", "alternate"; #freq-domain-cells = <1>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sc8180x-pmics.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sc8180x-pmics.dtsi @@ -74,7 +74,7 @@ #address-cells = <1>; #size-cells = <0>; - pon: power-on@800 { + pon: pon@800 { compatible = "qcom,pm8916-pon"; reg = <0x0800>; pwrkey { @@ -142,9 +142,10 @@ }; pmc8180_gpios: gpio@c000 { - compatible = "qcom,pmc8180-gpio"; + compatible = "qcom,pmc8180-gpio", "qcom,spmi-gpio"; reg = <0xc000>; gpio-controller; + gpio-ranges = <&pmc8180_gpios 0 0 10>; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; @@ -246,7 +247,7 @@ #address-cells = <1>; #size-cells = <0>; - power-on@800 { + pon@800 { compatible = "qcom,pm8916-pon"; reg = <0x0800>; @@ -300,9 +301,10 @@ }; pmc8180c_gpios: gpio@c000 { - compatible = "qcom,pmc8180c-gpio"; + compatible = "qcom,pmc8180c-gpio", "qcom,spmi-gpio"; reg = <0xc000>; gpio-controller; + gpio-ranges = <&pmc8180c_gpios 0 0 12>; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; @@ -313,7 +315,7 @@ compatible = "qcom,pmc8180c", "qcom,spmi-pmic"; reg = <0x5 SPMI_USID>; - pmc8180c_lpg: lpg { + pmc8180c_lpg: pwm { compatible = "qcom,pmc8180c-lpg"; #address-cells = <1>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sc8180x.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sc8180x.dtsi @@ -64,6 +64,7 @@ L3_0: l3-cache { compatible = "cache"; cache-level = <3>; + cache-unified; }; }; }; @@ -298,7 +299,7 @@ domain-idle-states { CLUSTER_SLEEP_0: cluster-sleep-0 { compatible = "domain-idle-state"; - arm,psci-suspend-param = <0x4100c244>; + arm,psci-suspend-param = <0x4100a344>; entry-latency-us = <3263>; exit-latency-us = <6562>; min-residency-us = <9987>; @@ -2252,7 +2253,7 @@ }; gmu: gmu@2c6a000 { - compatible="qcom,adreno-gmu-680.1", "qcom,adreno-gmu"; + compatible = "qcom,adreno-gmu-680.1", "qcom,adreno-gmu"; reg = <0 0x02c6a000 0 0x30000>, <0 0x0b290000 0 0x10000>, @@ -2541,8 +2542,11 @@ system-cache-controller@9200000 { compatible = "qcom,sc8180x-llcc"; - reg = <0 0x09200000 0 0x50000>, <0 0x09600000 0 0x50000>; - reg-names = "llcc_base", "llcc_broadcast_base"; + reg = <0 0x09200000 0 0x50000>, <0 0x09280000 0 0x50000>, + <0 0x09300000 0 0x50000>, <0 0x09380000 0 0x50000>, + <0 0x09600000 0 0x50000>; + reg-names = "llcc0_base", "llcc1_base", "llcc2_base", + "llcc3_base", "llcc_broadcast_base"; interrupts = ; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sc8280xp-crd.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sc8280xp-crd.dts @@ -167,7 +167,7 @@ regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; - gpio = <&pmc8280_1_gpios 1 GPIO_ACTIVE_HIGH>; + gpio = <&pmc8280_1_gpios 2 GPIO_ACTIVE_HIGH>; enable-active-high; pinctrl-names = "default"; @@ -757,7 +757,7 @@ }; misc_3p3_reg_en: misc-3p3-reg-en-state { - pins = "gpio1"; + pins = "gpio2"; function = "normal"; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sc8280xp-lenovo-thinkpad-x13s.dts @@ -12,6 +12,7 @@ #include #include #include +#include #include #include "sc8280xp.dtsi" @@ -78,6 +79,21 @@ }; }; + leds { + compatible = "gpio-leds"; + + led-camera-indicator { + label = "white:camera-indicator"; + function = LED_FUNCTION_INDICATOR; + color = ; + gpios = <&tlmm 28 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "none"; + default-state = "off"; + /* Reuse as a panic indicator until we get a "camera on" trigger */ + panic-indicator; + }; + }; + pmic-glink { compatible = "qcom,sc8280xp-pmic-glink", "qcom,pmic-glink"; @@ -1246,7 +1262,7 @@ }; &tlmm { - gpio-reserved-ranges = <70 2>, <74 6>, <83 4>, <125 2>, <128 2>, <154 7>; + gpio-reserved-ranges = <70 2>, <74 6>, <125 2>, <128 2>, <154 4>; bt_default: bt-default-state { hstp-bt-en-pins { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sc8280xp.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sc8280xp.dtsi @@ -298,6 +298,7 @@ firmware { scm: scm { compatible = "qcom,scm-sc8280xp", "qcom,scm"; + interconnects = <&aggre2_noc MASTER_CRYPTO 0 &mc_virt SLAVE_EBI1 0>; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sdm630.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sdm630.dtsi @@ -1196,11 +1196,11 @@ spmi_bus: spmi@800f000 { compatible = "qcom,spmi-pmic-arb"; - reg = <0x0800f000 0x1000>, - <0x08400000 0x1000000>, - <0x09400000 0x1000000>, - <0x0a400000 0x220000>, - <0x0800a000 0x3000>; + reg = <0x0800f000 0x1000>, + <0x08400000 0x1000000>, + <0x09400000 0x1000000>, + <0x0a400000 0x220000>, + <0x0800a000 0x3000>; reg-names = "core", "chnls", "obsrvr", "intr", "cnfg"; interrupt-names = "periph_irq"; interrupts = ; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi @@ -143,16 +143,20 @@ }; }; +&cpufreq_hw { + /delete-property/ interrupts-extended; /* reference to lmh_cluster[01] */ +}; + &psci { - /delete-node/ cpu0; - /delete-node/ cpu1; - /delete-node/ cpu2; - /delete-node/ cpu3; - /delete-node/ cpu4; - /delete-node/ cpu5; - /delete-node/ cpu6; - /delete-node/ cpu7; - /delete-node/ cpu-cluster0; + /delete-node/ power-domain-cpu0; + /delete-node/ power-domain-cpu1; + /delete-node/ power-domain-cpu2; + /delete-node/ power-domain-cpu3; + /delete-node/ power-domain-cpu4; + /delete-node/ power-domain-cpu5; + /delete-node/ power-domain-cpu6; + /delete-node/ power-domain-cpu7; + /delete-node/ power-domain-cluster; }; &cpus { @@ -275,6 +279,14 @@ &CLUSTER_SLEEP_0>; }; +&lmh_cluster0 { + status = "disabled"; +}; + +&lmh_cluster1 { + status = "disabled"; +}; + /* * Reserved memory changes * @@ -338,6 +350,8 @@ &apps_rsc { + /delete-property/ power-domains; + regulators-0 { compatible = "qcom,pm8998-rpmh-regulators"; qcom,pmic-id = "a"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sdm845-db845c.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sdm845-db845c.dts @@ -101,6 +101,14 @@ }; }; + reserved-memory { + /* Cont splash region set up by the bootloader */ + cont_splash_mem: framebuffer@9d400000 { + reg = <0x0 0x9d400000 0x0 0x2400000>; + no-map; + }; + }; + lt9611_1v8: lt9611-vdd18-regulator { compatible = "regulator-fixed"; regulator-name = "LT9611_1V8"; @@ -506,6 +514,7 @@ }; &mdss { + memory-region = <&cont_splash_mem>; status = "okay"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sdm845-mtp.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sdm845-mtp.dts @@ -715,6 +715,8 @@ vdd-1.8-xo-supply = <&vreg_l7a_1p8>; vdd-1.3-rfa-supply = <&vreg_l17a_1p3>; vdd-3.3-ch0-supply = <&vreg_l25a_3p3>; + + qcom,snoc-host-cap-8bit-quirk; }; /* PINCTRL - additions to nodes defined in sdm845.dtsi */ --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sdm845-oneplus-enchilada.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sdm845-oneplus-enchilada.dts @@ -57,7 +57,7 @@ &sound { model = "OnePlus 6"; - audio-routing = "RX_BIAS", "MCLK", + audio-routing = "RX_BIAS", "MCLK", "AMIC2", "MIC BIAS2", "AMIC3", "MIC BIAS4", "AMIC4", "MIC BIAS1", --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sdm845-sony-xperia-tama.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sdm845-sony-xperia-tama.dtsi @@ -15,6 +15,15 @@ qcom,msm-id = <321 0x20001>; /* SDM845 v2.1 */ qcom,board-id = <8 0>; + aliases { + serial0 = &uart6; + serial1 = &uart9; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + gpio-keys { compatible = "gpio-keys"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sdm845.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sdm845.dtsi @@ -1207,6 +1207,7 @@ #clock-cells = <1>; #reset-cells = <1>; #power-domain-cells = <1>; + power-domains = <&rpmhpd SDM845_CX>; }; qfprom@784000 { @@ -2613,7 +2614,7 @@ <0 0>, <0 0>, <0 0>, - <0 300000000>; + <75000000 300000000>; status = "disabled"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sdx75.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sdx75.dtsi @@ -484,14 +484,14 @@ tx-pins { pins = "gpio12"; function = "qup_se1_l2_mira"; - drive-strength= <2>; + drive-strength = <2>; bias-disable; }; rx-pins { pins = "gpio13"; function = "qup_se1_l3_mira"; - drive-strength= <2>; + drive-strength = <2>; bias-disable; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm6115.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm6115.dtsi @@ -1052,7 +1052,7 @@ , , ; - dma-channels = <10>; + dma-channels = <10>; dma-channel-mask = <0xf>; iommus = <&apps_smmu 0xf6 0x0>; #dma-cells = <3>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm6125-sony-xperia-seine-pdx201.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm6125-sony-xperia-seine-pdx201.dts @@ -79,7 +79,7 @@ reg = <0x0 0xffc40000 0x0 0xc0000>; record-size = <0x1000>; console-size = <0x40000>; - msg-size = <0x20000 0x20000>; + pmsg-size = <0x20000>; }; cmdline_mem: memory@ffd00000 { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts @@ -52,7 +52,7 @@ reg = <0x0 0xffc40000 0x0 0xc0000>; record-size = <0x1000>; console-size = <0x40000>; - msg-size = <0x20000 0x20000>; + pmsg-size = <0x20000>; }; cmdline_mem: memory@ffd00000 { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm6125.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm6125.dtsi @@ -1204,7 +1204,7 @@ apps_smmu: iommu@c600000 { compatible = "qcom,sm6125-smmu-500", "qcom,smmu-500", "arm,mmu-500"; - reg = <0xc600000 0x80000>; + reg = <0x0c600000 0x80000>; interrupts = , , , --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm6350.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm6350.dtsi @@ -633,11 +633,6 @@ no-map; }; - pil_gpu_mem: memory@8b715400 { - reg = <0 0x8b715400 0 0x2000>; - no-map; - }; - pil_modem_mem: memory@8b800000 { reg = <0 0x8b800000 0 0xf800000>; no-map; @@ -658,6 +653,11 @@ no-map; }; + pil_gpu_mem: memory@f0d00000 { + reg = <0 0xf0d00000 0 0x1000>; + no-map; + }; + debug_region: memory@ffb00000 { reg = <0 0xffb00000 0 0xc0000>; no-map; @@ -673,7 +673,7 @@ reg = <0 0xffc00000 0 0x100000>; record-size = <0x1000>; console-size = <0x40000>; - msg-size = <0x20000 0x20000>; + pmsg-size = <0x20000>; ecc-size = <16>; no-map; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8150-sony-xperia-kumano.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8150-sony-xperia-kumano.dtsi @@ -222,7 +222,7 @@ reg = <0x0 0xffc00000 0x0 0x100000>; record-size = <0x1000>; console-size = <0x40000>; - msg-size = <0x20000 0x20000>; + pmsg-size = <0x20000>; ecc-size = <16>; no-map; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8150.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8150.dtsi @@ -1231,7 +1231,7 @@ dma-names = "tx", "rx"; pinctrl-names = "default"; pinctrl-0 = <&qup_i2c7_default>; - interrupts = ; + interrupts = ; #address-cells = <1>; #size-cells = <0>; status = "disabled"; @@ -1893,8 +1893,12 @@ ranges; clocks = <&gcc GCC_PCIE_PHY_AUX_CLK>, <&gcc GCC_PCIE_0_CFG_AHB_CLK>, + <&gcc GCC_PCIE_0_CLKREF_CLK>, <&gcc GCC_PCIE0_PHY_REFGEN_CLK>; - clock-names = "aux", "cfg_ahb", "refgen"; + clock-names = "aux", + "cfg_ahb", + "ref", + "refgen"; resets = <&gcc GCC_PCIE_0_PHY_BCR>; reset-names = "phy"; @@ -1991,8 +1995,12 @@ ranges; clocks = <&gcc GCC_PCIE_PHY_AUX_CLK>, <&gcc GCC_PCIE_1_CFG_AHB_CLK>, + <&gcc GCC_PCIE_1_CLKREF_CLK>, <&gcc GCC_PCIE1_PHY_REFGEN_CLK>; - clock-names = "aux", "cfg_ahb", "refgen"; + clock-names = "aux", + "cfg_ahb", + "ref", + "refgen"; resets = <&gcc GCC_PCIE_1_PHY_BCR>; reset-names = "phy"; @@ -3840,7 +3848,7 @@ }; mdss_dsi0_phy: phy@ae94400 { - compatible = "qcom,dsi-phy-7nm"; + compatible = "qcom,dsi-phy-7nm-8150"; reg = <0 0x0ae94400 0 0x200>, <0 0x0ae94600 0 0x280>, <0 0x0ae94900 0 0x260>; @@ -3914,7 +3922,7 @@ }; mdss_dsi1_phy: phy@ae96400 { - compatible = "qcom,dsi-phy-7nm"; + compatible = "qcom,dsi-phy-7nm-8150"; reg = <0 0x0ae96400 0 0x200>, <0 0x0ae96600 0 0x280>, <0 0x0ae96900 0 0x260>; @@ -3958,7 +3966,7 @@ pdc: interrupt-controller@b220000 { compatible = "qcom,sm8150-pdc", "qcom,pdc"; - reg = <0 0x0b220000 0 0x400>; + reg = <0 0x0b220000 0 0x30000>; qcom,pdc-ranges = <0 480 94>, <94 609 31>, <125 63 1>; #interrupt-cells = <2>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8250-sony-xperia-edo-pdx203.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8250-sony-xperia-edo-pdx203.dts @@ -14,3 +14,236 @@ }; /delete-node/ &vreg_l7f_1p8; + +&pm8009_gpios { + gpio-line-names = "NC", /* GPIO_1 */ + "CAM_PWR_LD_EN", + "WIDEC_PWR_EN", + "NC"; +}; + +&pm8150_gpios { + gpio-line-names = "VOL_DOWN_N", /* GPIO_1 */ + "OPTION_2", + "NC", + "PM_SLP_CLK_IN", + "OPTION_1", + "NC", + "NC", + "SP_ARI_PWR_ALARM", + "NC", + "NC"; /* GPIO_10 */ +}; + +&pm8150b_gpios { + gpio-line-names = "SNAPSHOT_N", /* GPIO_1 */ + "FOCUS_N", + "NC", + "NC", + "RF_LCD_ID_EN", + "NC", + "NC", + "LCD_ID", + "NC", + "WLC_EN_N", /* GPIO_10 */ + "NC", + "RF_ID"; +}; + +&pm8150l_gpios { + gpio-line-names = "NC", /* GPIO_1 */ + "PM3003A_EN", + "NC", + "NC", + "NC", + "AUX2_THERM", + "BB_HP_EN", + "FP_LDO_EN", + "PMX_RESET_N", + "AUX3_THERM", /* GPIO_10 */ + "DTV_PWR_EN", + "PM3003A_MODE"; +}; + +&tlmm { + gpio-line-names = "AP_CTI_IN", /* GPIO_0 */ + "MDM2AP_ERR_FATAL", + "AP_CTI_OUT", + "MDM2AP_STATUS", + "NFC_I2C_SDA", + "NFC_I2C_SCL", + "NFC_EN", + "NFC_CLK_REQ", + "NFC_ESE_PWR_REQ", + "DVDT_WRT_DET_AND", + "SPK_AMP_RESET_N", /* GPIO_10 */ + "SPK_AMP_INT_N", + "APPS_I2C_1_SDA", + "APPS_I2C_1_SCL", + "NC", + "TX_GTR_THRES_IN", + "HST_BT_UART_CTS", + "HST_BT_UART_RFR", + "HST_BT_UART_TX", + "HST_BT_UART_RX", + "HST_WLAN_EN", /* GPIO_20 */ + "HST_BT_EN", + "RGBC_IR_PWR_EN", + "FP_INT_N", + "NC", + "NC", + "NC", + "NC", + "NFC_ESE_SPI_MISO", + "NFC_ESE_SPI_MOSI", + "NFC_ESE_SPI_SCLK", /* GPIO_30 */ + "NFC_ESE_SPI_CS_N", + "WCD_RST_N", + "NC", + "SDM_DEBUG_UART_TX", + "SDM_DEBUG_UART_RX", + "TS_I2C_SDA", + "TS_I2C_SCL", + "TS_INT_N", + "FP_SPI_MISO", /* GPIO_40 */ + "FP_SPI_MOSI", + "FP_SPI_SCLK", + "FP_SPI_CS_N", + "APPS_I2C_0_SDA", + "APPS_I2C_0_SCL", + "DISP_ERR_FG", + "UIM2_DETECT_EN", + "NC", + "NC", + "NC", /* GPIO_50 */ + "NC", + "MDM_UART_CTS", + "MDM_UART_RFR", + "MDM_UART_TX", + "MDM_UART_RX", + "AP2MDM_STATUS", + "AP2MDM_ERR_FATAL", + "MDM_IPC_HS_UART_TX", + "MDM_IPC_HS_UART_RX", + "NC", /* GPIO_60 */ + "NC", + "NC", + "NC", + "NC", + "USB_CC_DIR", + "DISP_VSYNC", + "NC", + "NC", + "CAM_PWR_B_CS", + "NC", /* GPIO_70 */ + "CAM_PWR_A_CS", + "SBU_SW_SEL", + "SBU_SW_OE", + "FP_RESET_N", + "FP_RESET_N", + "DISP_RESET_N", + "DEBUG_GPIO0", + "TRAY_DET", + "CAM2_RST_N", + "PCIE0_RST_N", + "PCIE0_CLK_REQ_N", /* GPIO_80 */ + "PCIE0_WAKE_N", + "DVDT_ENABLE", + "DVDT_WRT_DET_OR", + "NC", + "PCIE2_RST_N", + "PCIE2_CLK_REQ_N", + "PCIE2_WAKE_N", + "MDM_VFR_IRQ0", + "MDM_VFR_IRQ1", + "SW_SERVICE", /* GPIO_90 */ + "CAM_SOF", + "CAM1_RST_N", + "CAM0_RST_N", + "CAM0_MCLK", + "CAM1_MCLK", + "CAM2_MCLK", + "CAM3_MCLK", + "CAM4_MCLK", + "TOF_RST_N", + "NC", /* GPIO_100 */ + "CCI0_I2C_SDA", + "CCI0_I2C_SCL", + "CCI1_I2C_SDA", + "CCI1_I2C_SCL_", + "CCI2_I2C_SDA", + "CCI2_I2C_SCL", + "CCI3_I2C_SDA", + "CCI3_I2C_SCL", + "CAM3_RST_N", + "NFC_DWL_REQ", /* GPIO_110 */ + "NFC_IRQ", + "XVS", + "NC", + "RF_ID_EXTENSION", + "SPK_AMP_I2C_SDA", + "SPK_AMP_I2C_SCL", + "NC", + "NC", + "WLC_I2C_SDA", + "WLC_I2C_SCL", /* GPIO_120 */ + "ACC_COVER_OPEN", + "ALS_PROX_INT_N", + "ACCEL_INT", + "WLAN_SW_CTRL", + "CAMSENSOR_I2C_SDA", + "CAMSENSOR_I2C_SCL", + "UDON_SWITCH_SEL", + "WDOG_DISABLE", + "BAROMETER_INT", + "NC", /* GPIO_130 */ + "NC", + "FORCED_USB_BOOT", + "NC", + "NC", + "WLC_INT_N", + "NC", + "NC", + "RGBC_IR_INT", + "NC", + "NC", /* GPIO_140 */ + "NC", + "BT_SLIMBUS_CLK", + "BT_SLIMBUS_DATA", + "HW_ID_0", + "HW_ID_1", + "WCD_SWR_TX_CLK", + "WCD_SWR_TX_DATA0", + "WCD_SWR_TX_DATA1", + "WCD_SWR_RX_CLK", + "WCD_SWR_RX_DATA0", /* GPIO_150 */ + "WCD_SWR_RX_DATA1", + "SDM_DMIC_CLK1", + "SDM_DMIC_DATA1", + "SDM_DMIC_CLK2", + "SDM_DMIC_DATA2", + "SPK_AMP_I2S_CLK", + "SPK_AMP_I2S_WS", + "SPK_AMP_I2S_ASP_DIN", + "SPK_AMP_I2S_ASP_DOUT", + "COMPASS_I2C_SDA", /* GPIO_160 */ + "COMPASS_I2C_SCL", + "NC", + "NC", + "SSC_SPI_1_MISO", + "SSC_SPI_1_MOSI", + "SSC_SPI_1_CLK", + "SSC_SPI_1_CS_N", + "NC", + "NC", + "SSC_SENSOR_I2C_SDA", /* GPIO_170 */ + "SSC_SENSOR_I2C_SCL", + "NC", + "NC", + "NC", + "NC", + "HST_BLE_SNS_UART6_TX", + "HST_BLE_SNS_UART6_RX", + "HST_WLAN_UART_TX", + "HST_WLAN_UART_RX"; +}; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8250-sony-xperia-edo-pdx206.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8250-sony-xperia-edo-pdx206.dts @@ -20,6 +20,8 @@ }; &gpio_keys { + pinctrl-0 = <&focus_n &snapshot_n &vol_down_n &g_assist_n>; + g-assist-key { label = "Google Assistant Key"; linux,code = ; @@ -30,6 +32,247 @@ }; }; +&pm8009_gpios { + gpio-line-names = "NC", /* GPIO_1 */ + "NC", + "WIDEC_PWR_EN", + "NC"; +}; + +&pm8150_gpios { + gpio-line-names = "VOL_DOWN_N", /* GPIO_1 */ + "OPTION_2", + "NC", + "PM_SLP_CLK_IN", + "OPTION_1", + "G_ASSIST_N", + "NC", + "SP_ARI_PWR_ALARM", + "NC", + "NC"; /* GPIO_10 */ + + g_assist_n: g-assist-n-state { + pins = "gpio6"; + function = "normal"; + power-source = <1>; + bias-pull-up; + input-enable; + }; +}; + +&pm8150b_gpios { + gpio-line-names = "SNAPSHOT_N", /* GPIO_1 */ + "FOCUS_N", + "NC", + "NC", + "RF_LCD_ID_EN", + "NC", + "NC", + "LCD_ID", + "NC", + "NC", /* GPIO_10 */ + "NC", + "RF_ID"; +}; + +&pm8150l_gpios { + gpio-line-names = "NC", /* GPIO_1 */ + "PM3003A_EN", + "NC", + "NC", + "NC", + "AUX2_THERM", + "BB_HP_EN", + "FP_LDO_EN", + "PMX_RESET_N", + "NC", /* GPIO_10 */ + "NC", + "PM3003A_MODE"; +}; + +&tlmm { + gpio-line-names = "AP_CTI_IN", /* GPIO_0 */ + "MDM2AP_ERR_FATAL", + "AP_CTI_OUT", + "MDM2AP_STATUS", + "NFC_I2C_SDA", + "NFC_I2C_SCL", + "NFC_EN", + "NFC_CLK_REQ", + "NFC_ESE_PWR_REQ", + "DVDT_WRT_DET_AND", + "SPK_AMP_RESET_N", /* GPIO_10 */ + "SPK_AMP_INT_N", + "APPS_I2C_1_SDA", + "APPS_I2C_1_SCL", + "NC", + "TX_GTR_THRES_IN", + "HST_BT_UART_CTS", + "HST_BT_UART_RFR", + "HST_BT_UART_TX", + "HST_BT_UART_RX", + "HST_WLAN_EN", /* GPIO_20 */ + "HST_BT_EN", + "RGBC_IR_PWR_EN", + "FP_INT_N", + "NC", + "NC", + "NC", + "NC", + "NFC_ESE_SPI_MISO", + "NFC_ESE_SPI_MOSI", + "NFC_ESE_SPI_SCLK", /* GPIO_30 */ + "NFC_ESE_SPI_CS_N", + "WCD_RST_N", + "NC", + "SDM_DEBUG_UART_TX", + "SDM_DEBUG_UART_RX", + "TS_I2C_SDA", + "TS_I2C_SCL", + "TS_INT_N", + "FP_SPI_MISO", /* GPIO_40 */ + "FP_SPI_MOSI", + "FP_SPI_SCLK", + "FP_SPI_CS_N", + "APPS_I2C_0_SDA", + "APPS_I2C_0_SCL", + "DISP_ERR_FG", + "UIM2_DETECT_EN", + "NC", + "NC", + "NC", /* GPIO_50 */ + "NC", + "MDM_UART_CTS", + "MDM_UART_RFR", + "MDM_UART_TX", + "MDM_UART_RX", + "AP2MDM_STATUS", + "AP2MDM_ERR_FATAL", + "MDM_IPC_HS_UART_TX", + "MDM_IPC_HS_UART_RX", + "NC", /* GPIO_60 */ + "NC", + "NC", + "NC", + "NC", + "USB_CC_DIR", + "DISP_VSYNC", + "NC", + "NC", + "CAM_PWR_B_CS", + "NC", /* GPIO_70 */ + "FRONTC_PWR_EN", + "SBU_SW_SEL", + "SBU_SW_OE", + "FP_RESET_N", + "FP_RESET_N", + "DISP_RESET_N", + "DEBUG_GPIO0", + "TRAY_DET", + "CAM2_RST_N", + "PCIE0_RST_N", + "PCIE0_CLK_REQ_N", /* GPIO_80 */ + "PCIE0_WAKE_N", + "DVDT_ENABLE", + "DVDT_WRT_DET_OR", + "NC", + "PCIE2_RST_N", + "PCIE2_CLK_REQ_N", + "PCIE2_WAKE_N", + "MDM_VFR_IRQ0", + "MDM_VFR_IRQ1", + "SW_SERVICE", /* GPIO_90 */ + "CAM_SOF", + "CAM1_RST_N", + "CAM0_RST_N", + "CAM0_MCLK", + "CAM1_MCLK", + "CAM2_MCLK", + "CAM3_MCLK", + "NC", + "NC", + "NC", /* GPIO_100 */ + "CCI0_I2C_SDA", + "CCI0_I2C_SCL", + "CCI1_I2C_SDA", + "CCI1_I2C_SCL_", + "CCI2_I2C_SDA", + "CCI2_I2C_SCL", + "CCI3_I2C_SDA", + "CCI3_I2C_SCL", + "CAM3_RST_N", + "NFC_DWL_REQ", /* GPIO_110 */ + "NFC_IRQ", + "XVS", + "NC", + "RF_ID_EXTENSION", + "SPK_AMP_I2C_SDA", + "SPK_AMP_I2C_SCL", + "NC", + "NC", + "NC", + "NC", + "ACC_COVER_OPEN", + "ALS_PROX_INT_N", + "ACCEL_INT", + "WLAN_SW_CTRL", + "CAMSENSOR_I2C_SDA", + "CAMSENSOR_I2C_SCL", + "UDON_SWITCH_SEL", + "WDOG_DISABLE", + "BAROMETER_INT", + "NC", /* GPIO_130 */ + "NC", + "FORCED_USB_BOOT", + "NC", + "NC", + "NC", + "NC", + "NC", + "RGBC_IR_INT", + "NC", + "NC", /* GPIO_140 */ + "NC", + "BT_SLIMBUS_CLK", + "BT_SLIMBUS_DATA", + "HW_ID_0", + "HW_ID_1", + "WCD_SWR_TX_CLK", + "WCD_SWR_TX_DATA0", + "WCD_SWR_TX_DATA1", + "WCD_SWR_RX_CLK", + "WCD_SWR_RX_DATA0", /* GPIO_150 */ + "WCD_SWR_RX_DATA1", + "SDM_DMIC_CLK1", + "SDM_DMIC_DATA1", + "SDM_DMIC_CLK2", + "SDM_DMIC_DATA2", + "SPK_AMP_I2S_CLK", + "SPK_AMP_I2S_WS", + "SPK_AMP_I2S_ASP_DIN", + "SPK_AMP_I2S_ASP_DOUT", + "COMPASS_I2C_SDA", /* GPIO_160 */ + "COMPASS_I2C_SCL", + "NC", + "NC", + "SSC_SPI_1_MISO", + "SSC_SPI_1_MOSI", + "SSC_SPI_1_CLK", + "SSC_SPI_1_CS_N", + "NC", + "NC", + "SSC_SENSOR_I2C_SDA", /* GPIO_170 */ + "SSC_SENSOR_I2C_SCL", + "NC", + "NC", + "NC", + "NC", + "HST_BLE_SNS_UART6_TX", + "HST_BLE_SNS_UART6_RX", + "HST_WLAN_UART_TX", + "HST_WLAN_UART_RX"; +}; + &vreg_l2f_1p3 { regulator-min-microvolt = <1200000>; regulator-max-microvolt = <1200000>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8250-sony-xperia-edo.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8250-sony-xperia-edo.dtsi @@ -51,12 +51,26 @@ gpio_keys: gpio-keys { compatible = "gpio-keys"; - /* - * Camera focus (light press) and camera snapshot (full press) - * seem not to work properly.. Adding the former one stalls the CPU - * and the latter kills the volume down key for whatever reason. In any - * case, they are both on &pm8150b_gpios: camera focus(2), camera snapshot(1). - */ + pinctrl-0 = <&focus_n &snapshot_n &vol_down_n>; + pinctrl-names = "default"; + + key-camera-focus { + label = "Camera Focus"; + linux,code = ; + gpios = <&pm8150b_gpios 2 GPIO_ACTIVE_LOW>; + debounce-interval = <15>; + linux,can-disable; + wakeup-source; + }; + + key-camera-snapshot { + label = "Camera Snapshot"; + linux,code = ; + gpios = <&pm8150b_gpios 1 GPIO_ACTIVE_LOW>; + debounce-interval = <15>; + linux,can-disable; + wakeup-source; + }; key-vol-down { label = "Volume Down"; @@ -112,7 +126,7 @@ reg = <0x0 0xffc00000 0x0 0x100000>; record-size = <0x1000>; console-size = <0x40000>; - msg-size = <0x20000 0x20000>; + pmsg-size = <0x20000>; ecc-size = <16>; no-map; }; @@ -551,6 +565,34 @@ vdda-pll-supply = <&vreg_l9a_1p2>; }; +&pm8150_gpios { + vol_down_n: vol-down-n-state { + pins = "gpio1"; + function = "normal"; + power-source = <0>; + bias-pull-up; + input-enable; + }; +}; + +&pm8150b_gpios { + snapshot_n: snapshot-n-state { + pins = "gpio1"; + function = "normal"; + power-source = <0>; + bias-pull-up; + input-enable; + }; + + focus_n: focus-n-state { + pins = "gpio2"; + function = "normal"; + power-source = <0>; + bias-pull-up; + input-enable; + }; +}; + &pon_pwrkey { status = "okay"; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8250.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8250.dtsi @@ -100,7 +100,7 @@ clocks = <&cpufreq_hw 0>; enable-method = "psci"; capacity-dmips-mhz = <448>; - dynamic-power-coefficient = <205>; + dynamic-power-coefficient = <105>; next-level-cache = <&L2_0>; power-domains = <&CPU_PD0>; power-domain-names = "psci"; @@ -131,7 +131,7 @@ clocks = <&cpufreq_hw 0>; enable-method = "psci"; capacity-dmips-mhz = <448>; - dynamic-power-coefficient = <205>; + dynamic-power-coefficient = <105>; next-level-cache = <&L2_100>; power-domains = <&CPU_PD1>; power-domain-names = "psci"; @@ -156,7 +156,7 @@ clocks = <&cpufreq_hw 0>; enable-method = "psci"; capacity-dmips-mhz = <448>; - dynamic-power-coefficient = <205>; + dynamic-power-coefficient = <105>; next-level-cache = <&L2_200>; power-domains = <&CPU_PD2>; power-domain-names = "psci"; @@ -181,7 +181,7 @@ clocks = <&cpufreq_hw 0>; enable-method = "psci"; capacity-dmips-mhz = <448>; - dynamic-power-coefficient = <205>; + dynamic-power-coefficient = <105>; next-level-cache = <&L2_300>; power-domains = <&CPU_PD3>; power-domain-names = "psci"; @@ -1905,6 +1905,7 @@ pinctrl-names = "default"; pinctrl-0 = <&pcie0_default_state>; + dma-coherent; status = "disabled"; }; @@ -2011,6 +2012,7 @@ pinctrl-names = "default"; pinctrl-0 = <&pcie1_default_state>; + dma-coherent; status = "disabled"; }; @@ -2119,6 +2121,7 @@ pinctrl-names = "default"; pinctrl-0 = <&pcie2_default_state>; + dma-coherent; status = "disabled"; }; @@ -2726,6 +2729,7 @@ clock-names = "ahb", "bus", "iface"; power-domains = <&gpucc GPU_CX_GDSC>; + dma-coherent; }; slpi: remoteproc@5c00000 { @@ -3059,7 +3063,7 @@ port@7 { reg = <7>; funnel_swao_in_funnel_merg: endpoint { - remote-endpoint= <&funnel_merg_out_funnel_swao>; + remote-endpoint = <&funnel_merg_out_funnel_swao>; }; }; }; @@ -5298,104 +5302,105 @@ reg = <0 0x15000000 0 0x100000>; #iommu-cells = <2>; #global-interrupts = <2>; - interrupts = , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ; + interrupts = , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + dma-coherent; }; adsp: remoteproc@17300000 { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8350.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8350.dtsi @@ -48,7 +48,7 @@ CPU0: cpu@0 { device_type = "cpu"; - compatible = "qcom,kryo685"; + compatible = "arm,cortex-a55"; reg = <0x0 0x0>; clocks = <&cpufreq_hw 0>; enable-method = "psci"; @@ -72,7 +72,7 @@ CPU1: cpu@100 { device_type = "cpu"; - compatible = "qcom,kryo685"; + compatible = "arm,cortex-a55"; reg = <0x0 0x100>; clocks = <&cpufreq_hw 0>; enable-method = "psci"; @@ -91,7 +91,7 @@ CPU2: cpu@200 { device_type = "cpu"; - compatible = "qcom,kryo685"; + compatible = "arm,cortex-a55"; reg = <0x0 0x200>; clocks = <&cpufreq_hw 0>; enable-method = "psci"; @@ -110,7 +110,7 @@ CPU3: cpu@300 { device_type = "cpu"; - compatible = "qcom,kryo685"; + compatible = "arm,cortex-a55"; reg = <0x0 0x300>; clocks = <&cpufreq_hw 0>; enable-method = "psci"; @@ -129,7 +129,7 @@ CPU4: cpu@400 { device_type = "cpu"; - compatible = "qcom,kryo685"; + compatible = "arm,cortex-a78"; reg = <0x0 0x400>; clocks = <&cpufreq_hw 1>; enable-method = "psci"; @@ -148,7 +148,7 @@ CPU5: cpu@500 { device_type = "cpu"; - compatible = "qcom,kryo685"; + compatible = "arm,cortex-a78"; reg = <0x0 0x500>; clocks = <&cpufreq_hw 1>; enable-method = "psci"; @@ -167,7 +167,7 @@ CPU6: cpu@600 { device_type = "cpu"; - compatible = "qcom,kryo685"; + compatible = "arm,cortex-a78"; reg = <0x0 0x600>; clocks = <&cpufreq_hw 1>; enable-method = "psci"; @@ -186,7 +186,7 @@ CPU7: cpu@700 { device_type = "cpu"; - compatible = "qcom,kryo685"; + compatible = "arm,cortex-x1"; reg = <0x0 0x700>; clocks = <&cpufreq_hw 2>; enable-method = "psci"; @@ -246,8 +246,8 @@ compatible = "arm,idle-state"; idle-state-name = "silver-rail-power-collapse"; arm,psci-suspend-param = <0x40000004>; - entry-latency-us = <355>; - exit-latency-us = <909>; + entry-latency-us = <360>; + exit-latency-us = <531>; min-residency-us = <3934>; local-timer-stop; }; @@ -256,8 +256,8 @@ compatible = "arm,idle-state"; idle-state-name = "gold-rail-power-collapse"; arm,psci-suspend-param = <0x40000004>; - entry-latency-us = <241>; - exit-latency-us = <1461>; + entry-latency-us = <702>; + exit-latency-us = <1061>; min-residency-us = <4488>; local-timer-stop; }; @@ -2939,7 +2939,7 @@ }; qup_uart18_default: qup-uart18-default-state { - pins = "gpio58", "gpio59"; + pins = "gpio68", "gpio69"; function = "qup18"; drive-strength = <2>; bias-disable; @@ -3077,104 +3077,104 @@ reg = <0 0x15000000 0 0x100000>; #iommu-cells = <2>; #global-interrupts = <2>; - interrupts = , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ; + interrupts = , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; }; adsp: remoteproc@17300000 { @@ -3399,6 +3399,13 @@ <0 0x18593000 0 0x1000>; reg-names = "freq-domain0", "freq-domain1", "freq-domain2"; + interrupts = , + , + ; + interrupt-names = "dcvsh-irq-0", + "dcvsh-irq-1", + "dcvsh-irq-2"; + clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GCC_GPLL0>; clock-names = "xo", "alternate"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8450-hdk.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8450-hdk.dts @@ -14,7 +14,6 @@ #include "pm8450.dtsi" #include "pmk8350.dtsi" #include "pmr735a.dtsi" -#include "pmr735b.dtsi" / { model = "Qualcomm Technologies, Inc. SM8450 HDK"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8450.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8450.dtsi @@ -3810,103 +3810,103 @@ reg = <0 0x15000000 0 0x100000>; #iommu-cells = <2>; #global-interrupts = <1>; - interrupts = , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ; + interrupts = , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; }; intc: interrupt-controller@17100000 { @@ -4212,7 +4212,7 @@ <&apps_smmu 0x59f 0x0>; }; - crypto: crypto@1de0000 { + crypto: crypto@1dfa000 { compatible = "qcom,sm8450-qce", "qcom,sm8150-qce", "qcom,qce"; reg = <0 0x01dfa000 0 0x6000>; dmas = <&cryptobam 4>, <&cryptobam 5>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8550-mtp.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8550-mtp.dts @@ -186,6 +186,7 @@ vdd-bob1-supply = <&vph_pwr>; vdd-bob2-supply = <&vph_pwr>; + vdd-l1-l4-l10-supply = <&vreg_s6g_1p8>; vdd-l2-l13-l14-supply = <&vreg_bob1>; vdd-l3-supply = <&vreg_s4g_1p3>; vdd-l5-l16-supply = <&vreg_bob1>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/qcom/sm8550.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/qcom/sm8550.dtsi @@ -1600,7 +1600,7 @@ pinctrl-0 = <&qup_uart7_default>; interrupts = ; interconnect-names = "qup-core", "qup-config"; - interconnects = <&clk_virt MASTER_QUP_CORE_1 0 &clk_virt SLAVE_QUP_CORE_1 0>, + interconnects = <&clk_virt MASTER_QUP_CORE_1 0 &clk_virt SLAVE_QUP_CORE_1 0>, <&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_QUP_1 0>; status = "disabled"; }; @@ -3517,103 +3517,103 @@ reg = <0 0x15000000 0 0x100000>; #iommu-cells = <2>; #global-interrupts = <1>; - interrupts = , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - ; + interrupts = , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; }; intc: interrupt-controller@17100000 { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/renesas/rzg2l-smarc-som.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/renesas/rzg2l-smarc-som.dtsi @@ -100,7 +100,7 @@ rxc-skew-psec = <2400>; txc-skew-psec = <2400>; rxdv-skew-psec = <0>; - txdv-skew-psec = <0>; + txen-skew-psec = <0>; rxd0-skew-psec = <0>; rxd1-skew-psec = <0>; rxd2-skew-psec = <0>; @@ -128,7 +128,7 @@ rxc-skew-psec = <2400>; txc-skew-psec = <2400>; rxdv-skew-psec = <0>; - txdv-skew-psec = <0>; + txen-skew-psec = <0>; rxd0-skew-psec = <0>; rxd1-skew-psec = <0>; rxd2-skew-psec = <0>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/renesas/rzg2lc-smarc-som.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/renesas/rzg2lc-smarc-som.dtsi @@ -77,7 +77,7 @@ rxc-skew-psec = <2400>; txc-skew-psec = <2400>; rxdv-skew-psec = <0>; - txdv-skew-psec = <0>; + txen-skew-psec = <0>; rxd0-skew-psec = <0>; rxd1-skew-psec = <0>; rxd2-skew-psec = <0>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/renesas/rzg2ul-smarc-som.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/renesas/rzg2ul-smarc-som.dtsi @@ -83,7 +83,7 @@ rxc-skew-psec = <2400>; txc-skew-psec = <2400>; rxdv-skew-psec = <0>; - txdv-skew-psec = <0>; + txen-skew-psec = <0>; rxd0-skew-psec = <0>; rxd1-skew-psec = <0>; rxd2-skew-psec = <0>; @@ -112,7 +112,7 @@ rxc-skew-psec = <2400>; txc-skew-psec = <2400>; rxdv-skew-psec = <0>; - txdv-skew-psec = <0>; + txen-skew-psec = <0>; rxd0-skew-psec = <0>; rxd1-skew-psec = <0>; rxd2-skew-psec = <0>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/rockchip/px30-ringneck-haikou.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/rockchip/px30-ringneck-haikou.dts @@ -68,15 +68,17 @@ simple-audio-card,format = "i2s"; simple-audio-card,name = "Haikou,I2S-codec"; simple-audio-card,mclk-fs = <512>; + simple-audio-card,frame-master = <&sgtl5000_codec>; + simple-audio-card,bitclock-master = <&sgtl5000_codec>; - simple-audio-card,codec { - clocks = <&sgtl5000_clk>; + sgtl5000_codec: simple-audio-card,codec { sound-dai = <&sgtl5000>; + // Prevent the dai subsystem from overwriting the clock + // frequency. We are using a fixed-frequency oscillator. + system-clock-fixed; }; simple-audio-card,cpu { - bitclock-master; - frame-master; sound-dai = <&i2s0_8ch>; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/rockchip/rk3328.dtsi @@ -668,7 +668,7 @@ vdec: video-codec@ff360000 { compatible = "rockchip,rk3328-vdec", "rockchip,rk3399-vdec"; - reg = <0x0 0xff360000 0x0 0x400>; + reg = <0x0 0xff360000 0x0 0x480>; interrupts = ; clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>, <&cru SCLK_VDEC_CABAC>, <&cru SCLK_VDEC_CORE>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi @@ -509,8 +509,7 @@ &pci_rootport { mvl_wifi: wifi@0,0 { compatible = "pci1b4b,2b42"; - reg = <0x83010000 0x0 0x00000000 0x0 0x00100000 - 0x83010000 0x0 0x00100000 0x0 0x00100000>; + reg = <0x0000 0x0 0x0 0x0 0x0>; interrupt-parent = <&gpio0>; interrupts = <8 IRQ_TYPE_LEVEL_LOW>; pinctrl-names = "default"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet-dumo.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet-dumo.dts @@ -34,8 +34,8 @@ &pci_rootport { wifi@0,0 { compatible = "qcom,ath10k"; - reg = <0x00010000 0x0 0x00000000 0x0 0x00000000>, - <0x03010010 0x0 0x00000000 0x0 0x00200000>; + reg = <0x00000000 0x0 0x00000000 0x0 0x00000000>, + <0x03000010 0x0 0x00000000 0x0 0x00200000>; qcom,ath10k-calibration-variant = "GO_DUMO"; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/rockchip/rk3399-gru.dtsi @@ -489,6 +489,7 @@ #address-cells = <3>; #size-cells = <2>; ranges; + device_type = "pci"; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi @@ -493,6 +493,7 @@ &i2s0 { pinctrl-0 = <&i2s0_2ch_bus>; + pinctrl-1 = <&i2s0_2ch_bus_bclk_off>; rockchip,capture-channels = <2>; rockchip,playback-channels = <2>; status = "okay"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/rockchip/rk3399.dtsi @@ -1082,7 +1082,9 @@ power-domain@RK3399_PD_VDU { reg = ; clocks = <&cru ACLK_VDU>, - <&cru HCLK_VDU>; + <&cru HCLK_VDU>, + <&cru SCLK_VDU_CA>, + <&cru SCLK_VDU_CORE>; pm_qos = <&qos_video_m1_r>, <&qos_video_m1_w>; #power-domain-cells = <0>; @@ -1358,7 +1360,7 @@ vdec: video-codec@ff660000 { compatible = "rockchip,rk3399-vdec"; - reg = <0x0 0xff660000 0x0 0x400>; + reg = <0x0 0xff660000 0x0 0x480>; interrupts = ; clocks = <&cru ACLK_VDU>, <&cru HCLK_VDU>, <&cru SCLK_VDU_CA>, <&cru SCLK_VDU_CORE>; @@ -2426,6 +2428,16 @@ <3 RK_PD1 1 &pcfg_pull_none>, <3 RK_PD2 1 &pcfg_pull_none>, <3 RK_PD3 1 &pcfg_pull_none>, + <3 RK_PD7 1 &pcfg_pull_none>, + <4 RK_PA0 1 &pcfg_pull_none>; + }; + + i2s0_2ch_bus_bclk_off: i2s0-2ch-bus-bclk-off { + rockchip,pins = + <3 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>, + <3 RK_PD1 1 &pcfg_pull_none>, + <3 RK_PD2 1 &pcfg_pull_none>, + <3 RK_PD3 1 &pcfg_pull_none>, <3 RK_PD7 1 &pcfg_pull_none>, <4 RK_PA0 1 &pcfg_pull_none>; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/rockchip/rk3568-radxa-e25.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/rockchip/rk3568-radxa-e25.dts @@ -47,6 +47,9 @@ vin-supply = <&vcc5v0_sys>; }; + /* actually fed by vcc5v0_sys, dependent + * on pi6c clock generator + */ vcc3v3_minipcie: vcc3v3-minipcie-regulator { compatible = "regulator-fixed"; enable-active-high; @@ -54,9 +57,9 @@ pinctrl-names = "default"; pinctrl-0 = <&minipcie_enable_h>; regulator-name = "vcc3v3_minipcie"; - regulator-min-microvolt = <5000000>; - regulator-max-microvolt = <5000000>; - vin-supply = <&vcc5v0_sys>; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc3v3_pi6c_05>; }; vcc3v3_ngff: vcc3v3-ngff-regulator { @@ -71,9 +74,6 @@ vin-supply = <&vcc5v0_sys>; }; - /* actually fed by vcc5v0_sys, dependent - * on pi6c clock generator - */ vcc3v3_pcie30x1: vcc3v3-pcie30x1-regulator { compatible = "regulator-fixed"; enable-active-high; @@ -83,7 +83,7 @@ regulator-name = "vcc3v3_pcie30x1"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; - vin-supply = <&vcc3v3_pi6c_05>; + vin-supply = <&vcc5v0_sys>; }; vcc3v3_pi6c_05: vcc3v3-pi6c-05-regulator { @@ -99,6 +99,10 @@ }; }; +&combphy1 { + phy-supply = <&vcc3v3_pcie30x1>; +}; + &pcie2x1 { pinctrl-names = "default"; pinctrl-0 = <&pcie20_reset_h>; @@ -117,7 +121,7 @@ pinctrl-names = "default"; pinctrl-0 = <&pcie30x1m0_pins>; reset-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>; - vpcie3v3-supply = <&vcc3v3_pcie30x1>; + vpcie3v3-supply = <&vcc3v3_minipcie>; status = "okay"; }; @@ -178,6 +182,10 @@ status = "okay"; }; +&sata1 { + status = "okay"; +}; + &sdmmc0 { bus-width = <4>; cap-sd-highspeed; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/rockchip/rk356x.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/rockchip/rk356x.dtsi @@ -970,7 +970,7 @@ , , ; - interrupt-names = "sys", "pmc", "msi", "legacy", "err"; + interrupt-names = "sys", "pmc", "msg", "legacy", "err"; bus-range = <0x0 0xf>; clocks = <&cru ACLK_PCIE20_MST>, <&cru ACLK_PCIE20_SLV>, <&cru ACLK_PCIE20_DBI>, <&cru PCLK_PCIE20>, --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/rockchip/rk3588s-pinctrl.dtsi @@ -369,7 +369,7 @@ emmc_data_strobe: emmc-data-strobe { rockchip,pins = /* emmc_data_strobe */ - <2 RK_PA2 1 &pcfg_pull_none>; + <2 RK_PA2 1 &pcfg_pull_down>; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/ti/k3-am625-beagleplay.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/ti/k3-am625-beagleplay.dts @@ -58,7 +58,7 @@ ramoops: ramoops@9ca00000 { compatible = "ramoops"; - reg = <0x00 0x9c700000 0x00 0x00100000>; + reg = <0x00 0x9ca00000 0x00 0x00100000>; record-size = <0x8000>; console-size = <0x8000>; ftrace-size = <0x00>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/ti/k3-am62a7-sk.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/ti/k3-am62a7-sk.dts @@ -232,7 +232,7 @@ status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&main_i2c1_pins_default>; - clock-frequency = <400000>; + clock-frequency = <100000>; exp1: gpio@22 { compatible = "ti,tca6424"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/ti/k3-am62x-sk-common.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/ti/k3-am62x-sk-common.dtsi @@ -300,7 +300,7 @@ status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&main_i2c1_pins_default>; - clock-frequency = <400000>; + clock-frequency = <100000>; tlv320aic3106: audio-codec@1b { #sound-dai-cells = <0>; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/ti/k3-j721s2-common-proc-board.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/ti/k3-j721s2-common-proc-board.dts @@ -249,18 +249,19 @@ J721S2_WKUP_IOPAD(0x108, PIN_INPUT, 0) /* (N27) MCU_ADC1_AIN7 */ >; }; +}; +&wkup_pmx1 { mcu_fss0_ospi1_pins_default: mcu-fss0-ospi1-default-pins { pinctrl-single,pins = < - J721S2_WKUP_IOPAD(0x040, PIN_OUTPUT, 0) /* (A19) MCU_OSPI1_CLK */ - J721S2_WKUP_IOPAD(0x05c, PIN_OUTPUT, 0) /* (D20) MCU_OSPI1_CSn0 */ - J721S2_WKUP_IOPAD(0x060, PIN_OUTPUT, 0) /* (C21) MCU_OSPI1_CSn1 */ - J721S2_WKUP_IOPAD(0x04c, PIN_INPUT, 0) /* (D21) MCU_OSPI1_D0 */ - J721S2_WKUP_IOPAD(0x050, PIN_INPUT, 0) /* (G20) MCU_OSPI1_D1 */ - J721S2_WKUP_IOPAD(0x054, PIN_INPUT, 0) /* (C20) MCU_OSPI1_D2 */ - J721S2_WKUP_IOPAD(0x058, PIN_INPUT, 0) /* (A20) MCU_OSPI1_D3 */ - J721S2_WKUP_IOPAD(0x048, PIN_INPUT, 0) /* (B19) MCU_OSPI1_DQS */ - J721S2_WKUP_IOPAD(0x044, PIN_INPUT, 0) /* (B20) MCU_OSPI1_LBCLKO */ + J721S2_WKUP_IOPAD(0x008, PIN_OUTPUT, 0) /* (A19) MCU_OSPI1_CLK */ + J721S2_WKUP_IOPAD(0x024, PIN_OUTPUT, 0) /* (D20) MCU_OSPI1_CSn0 */ + J721S2_WKUP_IOPAD(0x014, PIN_INPUT, 0) /* (D21) MCU_OSPI1_D0 */ + J721S2_WKUP_IOPAD(0x018, PIN_INPUT, 0) /* (G20) MCU_OSPI1_D1 */ + J721S2_WKUP_IOPAD(0x01c, PIN_INPUT, 0) /* (C20) MCU_OSPI1_D2 */ + J721S2_WKUP_IOPAD(0x020, PIN_INPUT, 0) /* (A20) MCU_OSPI1_D3 */ + J721S2_WKUP_IOPAD(0x010, PIN_INPUT, 0) /* (B19) MCU_OSPI1_DQS */ + J721S2_WKUP_IOPAD(0x00c, PIN_INPUT, 0) /* (B20) MCU_OSPI1_LBCLKO */ >; }; }; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/ti/k3-j721s2-som-p0.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/ti/k3-j721s2-som-p0.dtsi @@ -44,9 +44,6 @@ pinctrl-single,pins = < J721S2_WKUP_IOPAD(0x000, PIN_OUTPUT, 0) /* (D19) MCU_OSPI0_CLK */ J721S2_WKUP_IOPAD(0x02c, PIN_OUTPUT, 0) /* (F15) MCU_OSPI0_CSn0 */ - J721S2_WKUP_IOPAD(0x030, PIN_OUTPUT, 0) /* (G17) MCU_OSPI0_CSn1 */ - J721S2_WKUP_IOPAD(0x038, PIN_OUTPUT, 0) /* (F14) MCU_OSPI0_CSn2 */ - J721S2_WKUP_IOPAD(0x03c, PIN_OUTPUT, 0) /* (F17) MCU_OSPI0_CSn3 */ J721S2_WKUP_IOPAD(0x00c, PIN_INPUT, 0) /* (C19) MCU_OSPI0_D0 */ J721S2_WKUP_IOPAD(0x010, PIN_INPUT, 0) /* (F16) MCU_OSPI0_D1 */ J721S2_WKUP_IOPAD(0x014, PIN_INPUT, 0) /* (G15) MCU_OSPI0_D2 */ --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/ti/k3-j784s4-evm.dts +++ linux-azure-6.5.0/arch/arm64/boot/dts/ti/k3-j784s4-evm.dts @@ -340,27 +340,27 @@ mcu_adc0_pins_default: mcu-adc0-default-pins { pinctrl-single,pins = < - J784S4_WKUP_IOPAD(0x134, PIN_INPUT, 0) /* (P36) MCU_ADC0_AIN0 */ - J784S4_WKUP_IOPAD(0x138, PIN_INPUT, 0) /* (V36) MCU_ADC0_AIN1 */ - J784S4_WKUP_IOPAD(0x13c, PIN_INPUT, 0) /* (T34) MCU_ADC0_AIN2 */ - J784S4_WKUP_IOPAD(0x140, PIN_INPUT, 0) /* (T36) MCU_ADC0_AIN3 */ - J784S4_WKUP_IOPAD(0x144, PIN_INPUT, 0) /* (P34) MCU_ADC0_AIN4 */ - J784S4_WKUP_IOPAD(0x148, PIN_INPUT, 0) /* (R37) MCU_ADC0_AIN5 */ - J784S4_WKUP_IOPAD(0x14c, PIN_INPUT, 0) /* (R33) MCU_ADC0_AIN6 */ - J784S4_WKUP_IOPAD(0x150, PIN_INPUT, 0) /* (V38) MCU_ADC0_AIN7 */ + J784S4_WKUP_IOPAD(0x0cc, PIN_INPUT, 0) /* (P36) MCU_ADC0_AIN0 */ + J784S4_WKUP_IOPAD(0x0d0, PIN_INPUT, 0) /* (V36) MCU_ADC0_AIN1 */ + J784S4_WKUP_IOPAD(0x0d4, PIN_INPUT, 0) /* (T34) MCU_ADC0_AIN2 */ + J784S4_WKUP_IOPAD(0x0d8, PIN_INPUT, 0) /* (T36) MCU_ADC0_AIN3 */ + J784S4_WKUP_IOPAD(0x0dc, PIN_INPUT, 0) /* (P34) MCU_ADC0_AIN4 */ + J784S4_WKUP_IOPAD(0x0e0, PIN_INPUT, 0) /* (R37) MCU_ADC0_AIN5 */ + J784S4_WKUP_IOPAD(0x0e4, PIN_INPUT, 0) /* (R33) MCU_ADC0_AIN6 */ + J784S4_WKUP_IOPAD(0x0e8, PIN_INPUT, 0) /* (V38) MCU_ADC0_AIN7 */ >; }; mcu_adc1_pins_default: mcu-adc1-default-pins { pinctrl-single,pins = < - J784S4_WKUP_IOPAD(0x154, PIN_INPUT, 0) /* (Y38) MCU_ADC1_AIN0 */ - J784S4_WKUP_IOPAD(0x158, PIN_INPUT, 0) /* (Y34) MCU_ADC1_AIN1 */ - J784S4_WKUP_IOPAD(0x15c, PIN_INPUT, 0) /* (V34) MCU_ADC1_AIN2 */ - J784S4_WKUP_IOPAD(0x160, PIN_INPUT, 0) /* (W37) MCU_ADC1_AIN3 */ - J784S4_WKUP_IOPAD(0x164, PIN_INPUT, 0) /* (AA37) MCU_ADC1_AIN4 */ - J784S4_WKUP_IOPAD(0x168, PIN_INPUT, 0) /* (W33) MCU_ADC1_AIN5 */ - J784S4_WKUP_IOPAD(0x16c, PIN_INPUT, 0) /* (U33) MCU_ADC1_AIN6 */ - J784S4_WKUP_IOPAD(0x170, PIN_INPUT, 0) /* (Y36) MCU_ADC1_AIN7 */ + J784S4_WKUP_IOPAD(0x0ec, PIN_INPUT, 0) /* (Y38) MCU_ADC1_AIN0 */ + J784S4_WKUP_IOPAD(0x0f0, PIN_INPUT, 0) /* (Y34) MCU_ADC1_AIN1 */ + J784S4_WKUP_IOPAD(0x0f4, PIN_INPUT, 0) /* (V34) MCU_ADC1_AIN2 */ + J784S4_WKUP_IOPAD(0x0f8, PIN_INPUT, 0) /* (W37) MCU_ADC1_AIN3 */ + J784S4_WKUP_IOPAD(0x0fc, PIN_INPUT, 0) /* (AA37) MCU_ADC1_AIN4 */ + J784S4_WKUP_IOPAD(0x100, PIN_INPUT, 0) /* (W33) MCU_ADC1_AIN5 */ + J784S4_WKUP_IOPAD(0x104, PIN_INPUT, 0) /* (U33) MCU_ADC1_AIN6 */ + J784S4_WKUP_IOPAD(0x108, PIN_INPUT, 0) /* (Y36) MCU_ADC1_AIN7 */ >; }; }; @@ -379,21 +379,28 @@ J784S4_WKUP_IOPAD(0x024, PIN_INPUT, 0) /* (E34) MCU_OSPI0_D6 */ J784S4_WKUP_IOPAD(0x028, PIN_INPUT, 0) /* (E33) MCU_OSPI0_D7 */ J784S4_WKUP_IOPAD(0x008, PIN_INPUT, 0) /* (C34) MCU_OSPI0_DQS */ - J784S4_WKUP_IOPAD(0x03c, PIN_OUTPUT, 6) /* (C32) MCU_OSPI0_CSn3.MCU_OSPI0_ECC_FAIL */ - J784S4_WKUP_IOPAD(0x038, PIN_OUTPUT, 6) /* (B34) MCU_OSPI0_CSn2.MCU_OSPI0_RESET_OUT0 */ + >; + }; +}; + +&wkup_pmx1 { + mcu_fss0_ospi0_1_pins_default: mcu-fss0-ospi0-1-default-pins { + pinctrl-single,pins = < + J784S4_WKUP_IOPAD(0x004, PIN_OUTPUT, 6) /* (C32) MCU_OSPI0_ECC_FAIL */ + J784S4_WKUP_IOPAD(0x000, PIN_OUTPUT, 6) /* (B34) MCU_OSPI0_RESET_OUT0 */ >; }; mcu_fss0_ospi1_pins_default: mcu-fss0-ospi1-default-pins { pinctrl-single,pins = < - J784S4_WKUP_IOPAD(0x040, PIN_OUTPUT, 0) /* (F32) MCU_OSPI1_CLK */ - J784S4_WKUP_IOPAD(0x05c, PIN_OUTPUT, 0) /* (G32) MCU_OSPI1_CSn0 */ - J784S4_WKUP_IOPAD(0x04c, PIN_INPUT, 0) /* (E35) MCU_OSPI1_D0 */ - J784S4_WKUP_IOPAD(0x050, PIN_INPUT, 0) /* (D31) MCU_OSPI1_D1 */ - J784S4_WKUP_IOPAD(0x054, PIN_INPUT, 0) /* (G31) MCU_OSPI1_D2 */ - J784S4_WKUP_IOPAD(0x058, PIN_INPUT, 0) /* (F33) MCU_OSPI1_D3 */ - J784S4_WKUP_IOPAD(0x048, PIN_INPUT, 0) /* (F31) MCU_OSPI1_DQS */ - J784S4_WKUP_IOPAD(0x044, PIN_INPUT, 0) /* (C31) MCU_OSPI1_LBCLKO */ + J784S4_WKUP_IOPAD(0x008, PIN_OUTPUT, 0) /* (F32) MCU_OSPI1_CLK */ + J784S4_WKUP_IOPAD(0x024, PIN_OUTPUT, 0) /* (G32) MCU_OSPI1_CSn0 */ + J784S4_WKUP_IOPAD(0x014, PIN_INPUT, 0) /* (E35) MCU_OSPI1_D0 */ + J784S4_WKUP_IOPAD(0x018, PIN_INPUT, 0) /* (D31) MCU_OSPI1_D1 */ + J784S4_WKUP_IOPAD(0x01C, PIN_INPUT, 0) /* (G31) MCU_OSPI1_D2 */ + J784S4_WKUP_IOPAD(0x020, PIN_INPUT, 0) /* (F33) MCU_OSPI1_D3 */ + J784S4_WKUP_IOPAD(0x010, PIN_INPUT, 0) /* (F31) MCU_OSPI1_DQS */ + J784S4_WKUP_IOPAD(0x00C, PIN_INPUT, 0) /* (C31) MCU_OSPI1_LBCLKO */ >; }; }; @@ -437,7 +444,7 @@ &ospi0 { status = "okay"; pinctrl-names = "default"; - pinctrl-0 = <&mcu_fss0_ospi0_pins_default>; + pinctrl-0 = <&mcu_fss0_ospi0_pins_default>, <&mcu_fss0_ospi0_1_pins_default>; flash@0 { compatible = "jedec,spi-nor"; --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/ti/k3-j784s4-main.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/ti/k3-j784s4-main.dtsi @@ -60,7 +60,7 @@ #interrupt-cells = <1>; ti,sci = <&sms>; ti,sci-dev-id = <10>; - ti,interrupt-ranges = <8 360 56>; + ti,interrupt-ranges = <8 392 56>; }; main_pmx0: pinctrl@11c000 { --- linux-azure-6.5.0.orig/arch/arm64/boot/dts/ti/k3-j784s4-mcu-wakeup.dtsi +++ linux-azure-6.5.0/arch/arm64/boot/dts/ti/k3-j784s4-mcu-wakeup.dtsi @@ -107,7 +107,7 @@ #interrupt-cells = <1>; ti,sci = <&sms>; ti,sci-dev-id = <177>; - ti,interrupt-ranges = <16 928 16>; + ti,interrupt-ranges = <16 960 16>; }; /* MCU_TIMERIO pad input CTRLMMR_MCU_TIMER*_CTRL registers */ --- linux-azure-6.5.0.orig/arch/arm64/configs/defconfig +++ linux-azure-6.5.0/arch/arm64/configs/defconfig @@ -1129,7 +1129,6 @@ CONFIG_XEN_GRANT_DEV_ALLOC=y CONFIG_STAGING=y CONFIG_STAGING_MEDIA=y -CONFIG_VIDEO_IMX_MEDIA=m CONFIG_VIDEO_MAX96712=m CONFIG_CHROME_PLATFORMS=y CONFIG_CROS_EC=y @@ -1146,7 +1145,6 @@ CONFIG_COMMON_CLK_PWM=y CONFIG_COMMON_CLK_RS9_PCIE=y CONFIG_COMMON_CLK_VC5=y -CONFIG_COMMON_CLK_NPCM8XX=y CONFIG_COMMON_CLK_BD718XX=m CONFIG_CLK_RASPBERRYPI=m CONFIG_CLK_IMX8MM=y @@ -1182,6 +1180,7 @@ CONFIG_IPQ_GCC_9574=y CONFIG_MSM_GCC_8916=y CONFIG_MSM_GCC_8994=y +CONFIG_MSM_GCC_8996=y CONFIG_MSM_MMCC_8994=m CONFIG_MSM_MMCC_8996=m CONFIG_MSM_MMCC_8998=m --- linux-azure-6.5.0.orig/arch/arm64/include/asm/acpi.h +++ linux-azure-6.5.0/arch/arm64/include/asm/acpi.h @@ -9,6 +9,7 @@ #ifndef _ASM_ACPI_H #define _ASM_ACPI_H +#include #include #include #include @@ -42,6 +43,25 @@ #define ACPI_MADT_GICC_SPE (offsetof(struct acpi_madt_generic_interrupt, \ spe_interrupt) + sizeof(u16)) +/* + * Arm® Functional Fixed Hardware Specification Version 1.2. + * Table 2: Arm Architecture context loss flags + */ +#define CPUIDLE_CORE_CTXT BIT(0) /* Core context Lost */ + +static inline unsigned int arch_get_idle_state_flags(u32 arch_flags) +{ + if (arch_flags & CPUIDLE_CORE_CTXT) + return CPUIDLE_FLAG_TIMER_STOP; + + return 0; +} +#define arch_get_idle_state_flags arch_get_idle_state_flags + +#define CPUIDLE_TRACE_CTXT BIT(1) /* Trace context loss */ +#define CPUIDLE_GICR_CTXT BIT(2) /* GICR */ +#define CPUIDLE_GICD_CTXT BIT(3) /* GICD */ + /* Basic configuration for ACPI */ #ifdef CONFIG_ACPI pgprot_t __acpi_get_mem_attribute(phys_addr_t addr); --- linux-azure-6.5.0.orig/arch/arm64/include/asm/arm_pmuv3.h +++ linux-azure-6.5.0/arch/arm64/include/asm/arm_pmuv3.h @@ -46,12 +46,12 @@ ID_AA64DFR0_EL1_PMUVer_SHIFT); } -static inline void write_pmcr(u32 val) +static inline void write_pmcr(u64 val) { write_sysreg(val, pmcr_el0); } -static inline u32 read_pmcr(void) +static inline u64 read_pmcr(void) { return read_sysreg(pmcr_el0); } @@ -71,21 +71,6 @@ return read_sysreg(pmccntr_el0); } -static inline void write_pmxevcntr(u32 val) -{ - write_sysreg(val, pmxevcntr_el0); -} - -static inline u32 read_pmxevcntr(void) -{ - return read_sysreg(pmxevcntr_el0); -} - -static inline void write_pmxevtyper(u32 val) -{ - write_sysreg(val, pmxevtyper_el0); -} - static inline void write_pmcntenset(u32 val) { write_sysreg(val, pmcntenset_el0); @@ -106,7 +91,7 @@ write_sysreg(val, pmintenclr_el1); } -static inline void write_pmccfiltr(u32 val) +static inline void write_pmccfiltr(u64 val) { write_sysreg(val, pmccfiltr_el0); } @@ -126,12 +111,12 @@ write_sysreg(val, pmuserenr_el0); } -static inline u32 read_pmceid0(void) +static inline u64 read_pmceid0(void) { return read_sysreg(pmceid0_el0); } -static inline u32 read_pmceid1(void) +static inline u64 read_pmceid1(void) { return read_sysreg(pmceid1_el0); } --- linux-azure-6.5.0.orig/arch/arm64/include/asm/cpufeature.h +++ linux-azure-6.5.0/arch/arm64/include/asm/cpufeature.h @@ -663,7 +663,7 @@ isar2 = read_sanitised_ftr_reg(SYS_ID_AA64ISAR2_EL1); return cpuid_feature_extract_unsigned_field(isar2, - ID_AA64ISAR2_EL1_BC_SHIFT); + ID_AA64ISAR2_EL1_CLRBHB_SHIFT); } const struct cpumask *system_32bit_el0_cpumask(void); --- linux-azure-6.5.0.orig/arch/arm64/include/asm/cputype.h +++ linux-azure-6.5.0/arch/arm64/include/asm/cputype.h @@ -79,13 +79,15 @@ #define ARM_CPU_PART_CORTEX_A78AE 0xD42 #define ARM_CPU_PART_CORTEX_X1 0xD44 #define ARM_CPU_PART_CORTEX_A510 0xD46 +#define ARM_CPU_PART_CORTEX_A520 0xD80 #define ARM_CPU_PART_CORTEX_A710 0xD47 #define ARM_CPU_PART_CORTEX_A715 0xD4D #define ARM_CPU_PART_CORTEX_X2 0xD48 #define ARM_CPU_PART_NEOVERSE_N2 0xD49 #define ARM_CPU_PART_CORTEX_A78C 0xD4B -#define APM_CPU_PART_POTENZA 0x000 +#define APM_CPU_PART_XGENE 0x000 +#define APM_CPU_VAR_POTENZA 0x00 #define CAVIUM_CPU_PART_THUNDERX 0x0A1 #define CAVIUM_CPU_PART_THUNDERX_81XX 0x0A2 @@ -148,6 +150,7 @@ #define MIDR_CORTEX_A78AE MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78AE) #define MIDR_CORTEX_X1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X1) #define MIDR_CORTEX_A510 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A510) +#define MIDR_CORTEX_A520 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A520) #define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710) #define MIDR_CORTEX_A715 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A715) #define MIDR_CORTEX_X2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X2) --- linux-azure-6.5.0.orig/arch/arm64/include/asm/hwcap.h +++ linux-azure-6.5.0/arch/arm64/include/asm/hwcap.h @@ -138,6 +138,7 @@ #define KERNEL_HWCAP_SME_B16B16 __khwcap2_feature(SME_B16B16) #define KERNEL_HWCAP_SME_F16F16 __khwcap2_feature(SME_F16F16) #define KERNEL_HWCAP_MOPS __khwcap2_feature(MOPS) +#define KERNEL_HWCAP_HBC __khwcap2_feature(HBC) /* * This yields a mask that user programs can use to figure out what --- linux-azure-6.5.0.orig/arch/arm64/include/asm/pgtable.h +++ linux-azure-6.5.0/arch/arm64/include/asm/pgtable.h @@ -825,6 +825,12 @@ if (pte_hw_dirty(pte)) pte = pte_mkdirty(pte); pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); + /* + * If we end up clearing hw dirtiness for a sw-dirty PTE, set hardware + * dirtiness again. + */ + if (pte_sw_dirty(pte)) + pte = pte_mkdirty(pte); return pte; } --- linux-azure-6.5.0.orig/arch/arm64/include/asm/sdei.h +++ linux-azure-6.5.0/arch/arm64/include/asm/sdei.h @@ -17,6 +17,9 @@ #include +DECLARE_PER_CPU(struct sdei_registered_event *, sdei_active_normal_event); +DECLARE_PER_CPU(struct sdei_registered_event *, sdei_active_critical_event); + extern unsigned long sdei_exit_mode; /* Software Delegated Exception entry point from firmware*/ @@ -29,6 +32,9 @@ unsigned long pc, unsigned long pstate); +/* Abort a running handler. Context is discarded. */ +void __sdei_handler_abort(void); + /* * The above entry point does the minimum to call C code. This function does * anything else, before calling the driver. --- linux-azure-6.5.0.orig/arch/arm64/include/asm/setup.h +++ linux-azure-6.5.0/arch/arm64/include/asm/setup.h @@ -21,9 +21,22 @@ extern bool rodata_enabled; extern bool rodata_full; - if (arg && !strcmp(arg, "full")) { + if (!arg) + return false; + + if (!strcmp(arg, "full")) { + rodata_enabled = rodata_full = true; + return true; + } + + if (!strcmp(arg, "off")) { + rodata_enabled = rodata_full = false; + return true; + } + + if (!strcmp(arg, "on")) { rodata_enabled = true; - rodata_full = true; + rodata_full = false; return true; } --- linux-azure-6.5.0.orig/arch/arm64/include/asm/syscall_wrapper.h +++ linux-azure-6.5.0/arch/arm64/include/asm/syscall_wrapper.h @@ -44,9 +44,6 @@ return sys_ni_syscall(); \ } -#define COMPAT_SYS_NI(name) \ - SYSCALL_ALIAS(__arm64_compat_sys_##name, sys_ni_posix_timers); - #endif /* CONFIG_COMPAT */ #define __SYSCALL_DEFINEx(x, name, ...) \ @@ -82,6 +79,5 @@ } asmlinkage long __arm64_sys_ni_syscall(const struct pt_regs *__unused); -#define SYS_NI(name) SYSCALL_ALIAS(__arm64_sys_##name, sys_ni_posix_timers); #endif /* __ASM_SYSCALL_WRAPPER_H */ --- linux-azure-6.5.0.orig/arch/arm64/include/uapi/asm/hwcap.h +++ linux-azure-6.5.0/arch/arm64/include/uapi/asm/hwcap.h @@ -103,5 +103,6 @@ #define HWCAP2_SME_B16B16 (1UL << 41) #define HWCAP2_SME_F16F16 (1UL << 42) #define HWCAP2_MOPS (1UL << 43) +#define HWCAP2_HBC (1UL << 44) #endif /* _UAPI__ASM_HWCAP_H */ --- linux-azure-6.5.0.orig/arch/arm64/kernel/cpu_errata.c +++ linux-azure-6.5.0/arch/arm64/kernel/cpu_errata.c @@ -730,6 +730,14 @@ .cpu_enable = cpu_clear_bf16_from_user_emulation, }, #endif +#ifdef CONFIG_ARM64_ERRATUM_2966298 + { + .desc = "ARM erratum 2966298", + .capability = ARM64_WORKAROUND_2966298, + /* Cortex-A520 r0p0 - r0p1 */ + ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A520, 0, 0, 1), + }, +#endif #ifdef CONFIG_AMPERE_ERRATUM_AC03_CPU_38 { .desc = "AmpereOne erratum AC03_CPU_38", --- linux-azure-6.5.0.orig/arch/arm64/kernel/cpufeature.c +++ linux-azure-6.5.0/arch/arm64/kernel/cpufeature.c @@ -222,7 +222,8 @@ static const struct arm64_ftr_bits ftr_id_aa64isar2[] = { ARM64_FTR_BITS(FTR_VISIBLE, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64ISAR2_EL1_CSSC_SHIFT, 4, 0), ARM64_FTR_BITS(FTR_VISIBLE, FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64ISAR2_EL1_RPRFM_SHIFT, 4, 0), - ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_HIGHER_SAFE, ID_AA64ISAR2_EL1_BC_SHIFT, 4, 0), + ARM64_FTR_BITS(FTR_HIDDEN, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR2_EL1_CLRBHB_SHIFT, 4, 0), + ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR2_EL1_BC_SHIFT, 4, 0), ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, ID_AA64ISAR2_EL1_MOPS_SHIFT, 4, 0), ARM64_FTR_BITS(FTR_VISIBLE_IF_IS_ENABLED(CONFIG_ARM64_PTR_AUTH), FTR_STRICT, FTR_EXACT, ID_AA64ISAR2_EL1_APA3_SHIFT, 4, 0), @@ -2844,6 +2845,7 @@ HWCAP_CAP(ID_AA64ISAR2_EL1, RPRES, IMP, CAP_HWCAP, KERNEL_HWCAP_RPRES), HWCAP_CAP(ID_AA64ISAR2_EL1, WFxT, IMP, CAP_HWCAP, KERNEL_HWCAP_WFXT), HWCAP_CAP(ID_AA64ISAR2_EL1, MOPS, IMP, CAP_HWCAP, KERNEL_HWCAP_MOPS), + HWCAP_CAP(ID_AA64ISAR2_EL1, BC, IMP, CAP_HWCAP, KERNEL_HWCAP_HBC), #ifdef CONFIG_ARM64_SME HWCAP_CAP(ID_AA64PFR1_EL1, SME, IMP, CAP_HWCAP, KERNEL_HWCAP_SME), HWCAP_CAP(ID_AA64SMFR0_EL1, FA64, IMP, CAP_HWCAP, KERNEL_HWCAP_SME_FA64), --- linux-azure-6.5.0.orig/arch/arm64/kernel/cpuinfo.c +++ linux-azure-6.5.0/arch/arm64/kernel/cpuinfo.c @@ -126,6 +126,7 @@ [KERNEL_HWCAP_SME_B16B16] = "smeb16b16", [KERNEL_HWCAP_SME_F16F16] = "smef16f16", [KERNEL_HWCAP_MOPS] = "mops", + [KERNEL_HWCAP_HBC] = "hbc", }; #ifdef CONFIG_COMPAT --- linux-azure-6.5.0.orig/arch/arm64/kernel/entry.S +++ linux-azure-6.5.0/arch/arm64/kernel/entry.S @@ -428,6 +428,10 @@ ldp x28, x29, [sp, #16 * 14] .if \el == 0 +alternative_if ARM64_WORKAROUND_2966298 + tlbi vale1, xzr + dsb nsh +alternative_else_nop_endif alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0 ldr lr, [sp, #S_LR] add sp, sp, #PT_REGS_SIZE // restore sp @@ -986,9 +990,13 @@ mov x19, x1 -#if defined(CONFIG_VMAP_STACK) || defined(CONFIG_SHADOW_CALL_STACK) + /* Store the registered-event for crash_smp_send_stop() */ ldrb w4, [x19, #SDEI_EVENT_PRIORITY] -#endif + cbnz w4, 1f + adr_this_cpu dst=x5, sym=sdei_active_normal_event, tmp=x6 + b 2f +1: adr_this_cpu dst=x5, sym=sdei_active_critical_event, tmp=x6 +2: str x19, [x5] #ifdef CONFIG_VMAP_STACK /* @@ -1055,6 +1063,14 @@ ldr_l x2, sdei_exit_mode + /* Clear the registered-event seen by crash_smp_send_stop() */ + ldrb w3, [x4, #SDEI_EVENT_PRIORITY] + cbnz w3, 1f + adr_this_cpu dst=x5, sym=sdei_active_normal_event, tmp=x6 + b 2f +1: adr_this_cpu dst=x5, sym=sdei_active_critical_event, tmp=x6 +2: str xzr, [x5] + alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0 sdei_handler_exit exit_mode=x2 alternative_else_nop_endif @@ -1065,4 +1081,15 @@ #endif SYM_CODE_END(__sdei_asm_handler) NOKPROBE(__sdei_asm_handler) + +SYM_CODE_START(__sdei_handler_abort) + mov_q x0, SDEI_1_0_FN_SDEI_EVENT_COMPLETE_AND_RESUME + adr x1, 1f + ldr_l x2, sdei_exit_mode + sdei_handler_exit exit_mode=x2 + // exit the handler and jump to the next instruction. + // Exit will stomp x0-x17, PSTATE, ELR_ELx, and SPSR_ELx. +1: ret +SYM_CODE_END(__sdei_handler_abort) +NOKPROBE(__sdei_handler_abort) #endif /* CONFIG_ARM_SDE_INTERFACE */ --- linux-azure-6.5.0.orig/arch/arm64/kernel/fpsimd.c +++ linux-azure-6.5.0/arch/arm64/kernel/fpsimd.c @@ -1179,9 +1179,6 @@ */ u64 read_zcr_features(void) { - u64 zcr; - unsigned int vq_max; - /* * Set the maximum possible VL, and write zeroes to all other * bits to see if they stick. @@ -1189,12 +1186,8 @@ sve_kernel_enable(NULL); write_sysreg_s(ZCR_ELx_LEN_MASK, SYS_ZCR_EL1); - zcr = read_sysreg_s(SYS_ZCR_EL1); - zcr &= ~(u64)ZCR_ELx_LEN_MASK; /* find sticky 1s outside LEN field */ - vq_max = sve_vq_from_vl(sve_get_vl()); - zcr |= vq_max - 1; /* set LEN field to maximum effective value */ - - return zcr; + /* Return LEN value that would be written to get the maximum VL */ + return sve_vq_from_vl(sve_get_vl()) - 1; } void __init sve_setup(void) @@ -1349,9 +1342,6 @@ */ u64 read_smcr_features(void) { - u64 smcr; - unsigned int vq_max; - sme_kernel_enable(NULL); /* @@ -1360,12 +1350,8 @@ write_sysreg_s(read_sysreg_s(SYS_SMCR_EL1) | SMCR_ELx_LEN_MASK, SYS_SMCR_EL1); - smcr = read_sysreg_s(SYS_SMCR_EL1); - smcr &= ~(u64)SMCR_ELx_LEN_MASK; /* Only the LEN field */ - vq_max = sve_vq_from_vl(sme_get_vl()); - smcr |= vq_max - 1; /* set LEN field to maximum effective value */ - - return smcr; + /* Return LEN value that would be written to get the maximum VL */ + return sve_vq_from_vl(sme_get_vl()) - 1; } void __init sme_setup(void) @@ -1931,7 +1917,7 @@ /* Invalidate any task state remaining in the fpsimd regs: */ fpsimd_flush_cpu_state(); } -EXPORT_SYMBOL_GPL(kernel_neon_begin); +EXPORT_SYMBOL(kernel_neon_begin); /* * kernel_neon_end(): give the CPU FPSIMD registers back to the current task @@ -1949,7 +1935,7 @@ put_cpu_fpsimd_context(); } -EXPORT_SYMBOL_GPL(kernel_neon_end); +EXPORT_SYMBOL(kernel_neon_end); #ifdef CONFIG_EFI --- linux-azure-6.5.0.orig/arch/arm64/kernel/hw_breakpoint.c +++ linux-azure-6.5.0/arch/arm64/kernel/hw_breakpoint.c @@ -654,7 +654,7 @@ perf_bp_event(bp, regs); /* Do we need to handle the stepping? */ - if (is_default_overflow_handler(bp)) + if (uses_default_overflow_handler(bp)) step = 1; unlock: rcu_read_unlock(); @@ -733,7 +733,7 @@ static int watchpoint_report(struct perf_event *wp, unsigned long addr, struct pt_regs *regs) { - int step = is_default_overflow_handler(wp); + int step = uses_default_overflow_handler(wp); struct arch_hw_breakpoint *info = counter_arch_bp(wp); info->trigger = addr; --- linux-azure-6.5.0.orig/arch/arm64/kernel/module-plts.c +++ linux-azure-6.5.0/arch/arm64/kernel/module-plts.c @@ -167,9 +167,6 @@ switch (ELF64_R_TYPE(rela[i].r_info)) { case R_AARCH64_JUMP26: case R_AARCH64_CALL26: - if (!IS_ENABLED(CONFIG_RANDOMIZE_BASE)) - break; - /* * We only have to consider branch targets that resolve * to symbols that are defined in a different section. @@ -269,9 +266,6 @@ { int i = 0, j = numrels - 1; - if (!IS_ENABLED(CONFIG_RANDOMIZE_BASE)) - return 0; - while (i < j) { if (branch_rela_needs_plt(syms, &rela[i], dstidx)) i++; @@ -339,7 +333,7 @@ if (nents) sort(rels, nents, sizeof(Elf64_Rela), cmp_rela, NULL); - if (!str_has_prefix(secstrings + dstsec->sh_name, ".init")) + if (!module_init_layout_section(secstrings + dstsec->sh_name)) core_plts += count_plts(syms, rels, numrels, sechdrs[i].sh_info, dstsec); else --- linux-azure-6.5.0.orig/arch/arm64/kernel/ptrace.c +++ linux-azure-6.5.0/arch/arm64/kernel/ptrace.c @@ -891,7 +891,8 @@ break; default: WARN_ON_ONCE(1); - return -EINVAL; + ret = -EINVAL; + goto out; } /* --- linux-azure-6.5.0.orig/arch/arm64/kernel/sdei.c +++ linux-azure-6.5.0/arch/arm64/kernel/sdei.c @@ -47,6 +47,9 @@ DEFINE_PER_CPU(unsigned long *, sdei_shadow_call_stack_critical_ptr); #endif +DEFINE_PER_CPU(struct sdei_registered_event *, sdei_active_normal_event); +DEFINE_PER_CPU(struct sdei_registered_event *, sdei_active_critical_event); + static void _free_sdei_stack(unsigned long * __percpu *ptr, int cpu) { unsigned long *p; --- linux-azure-6.5.0.orig/arch/arm64/kernel/smp.c +++ linux-azure-6.5.0/arch/arm64/kernel/smp.c @@ -1044,10 +1044,8 @@ * If this cpu is the only one alive at this point in time, online or * not, there are no stop messages to be sent around, so just back out. */ - if (num_other_online_cpus() == 0) { - sdei_mask_local_cpu(); - return; - } + if (num_other_online_cpus() == 0) + goto skip_ipi; cpumask_copy(&mask, cpu_online_mask); cpumask_clear_cpu(smp_processor_id(), &mask); @@ -1066,7 +1064,9 @@ pr_warn("SMP: failed to stop secondary CPUs %*pbl\n", cpumask_pr_args(&mask)); +skip_ipi: sdei_mask_local_cpu(); + sdei_handler_abort(); } bool smp_crash_stop_failed(void) --- linux-azure-6.5.0.orig/arch/arm64/kvm/arm.c +++ linux-azure-6.5.0/arch/arm64/kvm/arm.c @@ -406,7 +406,7 @@ kvm_mmu_free_memory_cache(&vcpu->arch.mmu_page_cache); kvm_timer_vcpu_terminate(vcpu); kvm_pmu_vcpu_destroy(vcpu); - + kvm_vgic_vcpu_destroy(vcpu); kvm_arm_vcpu_destroy(vcpu); } --- linux-azure-6.5.0.orig/arch/arm64/kvm/guest.c +++ linux-azure-6.5.0/arch/arm64/kvm/guest.c @@ -874,7 +874,7 @@ break; case ARM_CPU_IMP_APM: switch (part_number) { - case APM_CPU_PART_POTENZA: + case APM_CPU_PART_XGENE: return KVM_ARM_TARGET_XGENE_POTENZA; } break; --- linux-azure-6.5.0.orig/arch/arm64/kvm/vgic/vgic-init.c +++ linux-azure-6.5.0/arch/arm64/kvm/vgic/vgic-init.c @@ -368,7 +368,7 @@ vgic_v4_teardown(kvm); } -void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) +static void __kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) { struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; @@ -379,29 +379,39 @@ vgic_flush_pending_lpis(vcpu); INIT_LIST_HEAD(&vgic_cpu->ap_list_head); - vgic_cpu->rd_iodev.base_addr = VGIC_ADDR_UNDEF; + if (vcpu->kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) { + vgic_unregister_redist_iodev(vcpu); + vgic_cpu->rd_iodev.base_addr = VGIC_ADDR_UNDEF; + } +} + +void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu) +{ + struct kvm *kvm = vcpu->kvm; + + mutex_lock(&kvm->slots_lock); + __kvm_vgic_vcpu_destroy(vcpu); + mutex_unlock(&kvm->slots_lock); } -static void __kvm_vgic_destroy(struct kvm *kvm) +void kvm_vgic_destroy(struct kvm *kvm) { struct kvm_vcpu *vcpu; unsigned long i; - lockdep_assert_held(&kvm->arch.config_lock); + mutex_lock(&kvm->slots_lock); vgic_debug_destroy(kvm); kvm_for_each_vcpu(i, vcpu, kvm) - kvm_vgic_vcpu_destroy(vcpu); + __kvm_vgic_vcpu_destroy(vcpu); + + mutex_lock(&kvm->arch.config_lock); kvm_vgic_dist_destroy(kvm); -} -void kvm_vgic_destroy(struct kvm *kvm) -{ - mutex_lock(&kvm->arch.config_lock); - __kvm_vgic_destroy(kvm); mutex_unlock(&kvm->arch.config_lock); + mutex_unlock(&kvm->slots_lock); } /** @@ -469,25 +479,26 @@ type = VGIC_V3; } - if (ret) { - __kvm_vgic_destroy(kvm); + if (ret) goto out; - } + dist->ready = true; dist_base = dist->vgic_dist_base; mutex_unlock(&kvm->arch.config_lock); ret = vgic_register_dist_iodev(kvm, dist_base, type); - if (ret) { + if (ret) kvm_err("Unable to register VGIC dist MMIO regions\n"); - kvm_vgic_destroy(kvm); - } - mutex_unlock(&kvm->slots_lock); - return ret; + goto out_slots; out: mutex_unlock(&kvm->arch.config_lock); +out_slots: mutex_unlock(&kvm->slots_lock); + + if (ret) + kvm_vgic_destroy(kvm); + return ret; } --- linux-azure-6.5.0.orig/arch/arm64/kvm/vgic/vgic-mmio-v3.c +++ linux-azure-6.5.0/arch/arm64/kvm/vgic/vgic-mmio-v3.c @@ -820,7 +820,7 @@ return ret; } -static void vgic_unregister_redist_iodev(struct kvm_vcpu *vcpu) +void vgic_unregister_redist_iodev(struct kvm_vcpu *vcpu) { struct vgic_io_device *rd_dev = &vcpu->arch.vgic_cpu.rd_iodev; --- linux-azure-6.5.0.orig/arch/arm64/kvm/vgic/vgic.h +++ linux-azure-6.5.0/arch/arm64/kvm/vgic/vgic.h @@ -243,6 +243,7 @@ int vgic_v3_save_pending_tables(struct kvm *kvm); int vgic_v3_set_redist_base(struct kvm *kvm, u32 index, u64 addr, u32 count); int vgic_register_redist_iodev(struct kvm_vcpu *vcpu); +void vgic_unregister_redist_iodev(struct kvm_vcpu *vcpu); bool vgic_v3_check_base(struct kvm *kvm); void vgic_v3_load(struct kvm_vcpu *vcpu); --- linux-azure-6.5.0.orig/arch/arm64/lib/csum.c +++ linux-azure-6.5.0/arch/arm64/lib/csum.c @@ -24,7 +24,7 @@ const u64 *ptr; u64 data, sum64 = 0; - if (unlikely(len == 0)) + if (unlikely(len <= 0)) return 0; offset = (unsigned long)buff & 7; --- linux-azure-6.5.0.orig/arch/arm64/mm/hugetlbpage.c +++ linux-azure-6.5.0/arch/arm64/mm/hugetlbpage.c @@ -236,7 +236,7 @@ unsigned long i, saddr = addr; for (i = 0; i < ncontig; i++, addr += pgsize, ptep++) - pte_clear(mm, addr, ptep); + ptep_clear(mm, addr, ptep); flush_tlb_range(&vma, saddr, addr); } --- linux-azure-6.5.0.orig/arch/arm64/mm/pageattr.c +++ linux-azure-6.5.0/arch/arm64/mm/pageattr.c @@ -29,8 +29,8 @@ * * KFENCE pool requires page-granular mapping if initialized late. */ - return (rodata_enabled && rodata_full) || debug_pagealloc_enabled() || - arm64_kfence_can_set_direct_map(); + return rodata_full || debug_pagealloc_enabled() || + arm64_kfence_can_set_direct_map(); } static int change_page_range(pte_t *ptep, unsigned long addr, void *data) @@ -105,8 +105,7 @@ * If we are manipulating read-only permissions, apply the same * change to the linear mapping of the pages that back this VM area. */ - if (rodata_enabled && - rodata_full && (pgprot_val(set_mask) == PTE_RDONLY || + if (rodata_full && (pgprot_val(set_mask) == PTE_RDONLY || pgprot_val(clear_mask) == PTE_RDONLY)) { for (i = 0; i < area->nr_pages; i++) { __change_memory_common((u64)page_address(area->pages[i]), --- linux-azure-6.5.0.orig/arch/arm64/tools/cpucaps +++ linux-azure-6.5.0/arch/arm64/tools/cpucaps @@ -83,6 +83,7 @@ WORKAROUND_2457168 WORKAROUND_2645198 WORKAROUND_2658417 +WORKAROUND_2966298 WORKAROUND_AMPERE_AC03_CPU_38 WORKAROUND_TRBE_OVERWRITE_FILL_MODE WORKAROUND_TSB_FLUSH_FAILURE --- linux-azure-6.5.0.orig/arch/arm64/tools/sysreg +++ linux-azure-6.5.0/arch/arm64/tools/sysreg @@ -1347,7 +1347,11 @@ 0b0000 NI 0b0001 IMP EndEnum -Res0 47:28 +Res0 47:32 +UnsignedEnum 31:28 CLRBHB + 0b0000 NI + 0b0001 IMP +EndEnum UnsignedEnum 27:24 PAC_frac 0b0000 NI 0b0001 IMP --- linux-azure-6.5.0.orig/arch/loongarch/Makefile +++ linux-azure-6.5.0/arch/loongarch/Makefile @@ -80,7 +80,7 @@ ifeq ($(CONFIG_RELOCATABLE),y) KBUILD_CFLAGS_KERNEL += -fPIE -LDFLAGS_vmlinux += -static -pie --no-dynamic-linker -z notext +LDFLAGS_vmlinux += -static -pie --no-dynamic-linker -z notext $(call ld-option, --apply-dynamic-relocs) endif cflags-y += $(call cc-option, -mno-check-zero-division) @@ -139,6 +139,8 @@ all: $(notdir $(KBUILD_IMAGE)) +vmlinuz.efi: vmlinux.efi + vmlinux.elf vmlinux.efi vmlinuz.efi: vmlinux $(Q)$(MAKE) $(build)=$(boot) $(bootvars-y) $(boot)/$@ --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/addrspace.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/addrspace.h @@ -19,7 +19,7 @@ */ #ifndef __ASSEMBLY__ #ifndef PHYS_OFFSET -#define PHYS_OFFSET _AC(0, UL) +#define PHYS_OFFSET _UL(0) #endif extern unsigned long vm_map_base; #endif /* __ASSEMBLY__ */ @@ -43,7 +43,7 @@ * Memory above this physical address will be considered highmem. */ #ifndef HIGHMEM_START -#define HIGHMEM_START (_AC(1, UL) << _AC(DMW_PABITS, UL)) +#define HIGHMEM_START (_UL(1) << _UL(DMW_PABITS)) #endif #define TO_PHYS(x) ( ((x) & TO_PHYS_MASK)) @@ -65,16 +65,16 @@ #define _ATYPE_ #define _ATYPE32_ #define _ATYPE64_ -#define _CONST64_(x) x #else #define _ATYPE_ __PTRDIFF_TYPE__ #define _ATYPE32_ int #define _ATYPE64_ __s64 +#endif + #ifdef CONFIG_64BIT -#define _CONST64_(x) x ## UL +#define _CONST64_(x) _UL(x) #else -#define _CONST64_(x) x ## ULL -#endif +#define _CONST64_(x) _ULL(x) #endif /* --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/asmmacro.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/asmmacro.h @@ -677,8 +677,7 @@ lu32i.d \reg, 0 lu52i.d \reg, \reg, 0 .pushsection ".la_abs", "aw", %progbits - 768: - .dword 768b-766b + .dword 766b .dword \sym .popsection #endif --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/efi.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/efi.h @@ -32,6 +32,6 @@ #define EFI_KIMG_PREFERRED_ADDRESS PHYSADDR(VMLINUX_LOAD_ADDRESS) -unsigned long kernel_entry_address(void); +unsigned long kernel_entry_address(unsigned long kernel_addr); #endif /* _ASM_LOONGARCH_EFI_H */ --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/elf.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/elf.h @@ -111,6 +111,15 @@ #define R_LARCH_TLS_GD_HI20 98 #define R_LARCH_32_PCREL 99 #define R_LARCH_RELAX 100 +#define R_LARCH_DELETE 101 +#define R_LARCH_ALIGN 102 +#define R_LARCH_PCREL20_S2 103 +#define R_LARCH_CFA 104 +#define R_LARCH_ADD6 105 +#define R_LARCH_SUB6 106 +#define R_LARCH_ADD_ULEB128 107 +#define R_LARCH_SUB_ULEB128 108 +#define R_LARCH_64_PCREL 109 #ifndef ELF_ARCH @@ -284,7 +293,7 @@ #define ELF_PLAT_INIT(_r, load_addr) do { \ _r->regs[1] = _r->regs[2] = _r->regs[3] = _r->regs[4] = 0; \ _r->regs[5] = _r->regs[6] = _r->regs[7] = _r->regs[8] = 0; \ - _r->regs[9] = _r->regs[10] = _r->regs[11] = _r->regs[12] = 0; \ + _r->regs[9] = _r->regs[10] /* syscall n */ = _r->regs[12] = 0; \ _r->regs[13] = _r->regs[14] = _r->regs[15] = _r->regs[16] = 0; \ _r->regs[17] = _r->regs[18] = _r->regs[19] = _r->regs[20] = 0; \ _r->regs[21] = _r->regs[22] = _r->regs[23] = _r->regs[24] = 0; \ --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/io.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/io.h @@ -54,10 +54,9 @@ * @offset: bus address of the memory * @size: size of the resource to map */ -extern pgprot_t pgprot_wc; - #define ioremap_wc(offset, size) \ - ioremap_prot((offset), (size), pgprot_val(pgprot_wc)) + ioremap_prot((offset), (size), \ + pgprot_val(wc_enabled ? PAGE_KERNEL_WUC : PAGE_KERNEL_SUC)) #define ioremap_cache(offset, size) \ ioremap_prot((offset), (size), pgprot_val(PAGE_KERNEL)) --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/irq.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/irq.h @@ -40,7 +40,7 @@ #define NR_IRQS_LEGACY 16 #define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace -void arch_trigger_cpumask_backtrace(const struct cpumask *mask, bool exclude_self); +void arch_trigger_cpumask_backtrace(const struct cpumask *mask, int exclude_cpu); #define MAX_IO_PICS 2 #define NR_IRQS (64 + (256 * MAX_IO_PICS)) --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/linkage.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/linkage.h @@ -33,4 +33,12 @@ .cfi_endproc; \ SYM_END(name, SYM_T_FUNC) +#define SYM_CODE_START(name) \ + SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \ + .cfi_startproc; + +#define SYM_CODE_END(name) \ + .cfi_endproc; \ + SYM_END(name, SYM_T_NONE) + #endif --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/local.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/local.h @@ -63,8 +63,8 @@ static inline bool local_try_cmpxchg(local_t *l, long *old, long new) { - typeof(l->a.counter) *__old = (typeof(l->a.counter) *) old; - return try_cmpxchg_local(&l->a.counter, __old, new); + return try_cmpxchg_local(&l->a.counter, + (typeof(l->a.counter) *) old, new); } #define local_xchg(l, n) (atomic_long_xchg((&(l)->a), (n))) --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/percpu.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/percpu.h @@ -32,7 +32,7 @@ #define __my_cpu_offset __my_cpu_offset #define PERCPU_OP(op, asm_op, c_op) \ -static inline unsigned long __percpu_##op(void *ptr, \ +static __always_inline unsigned long __percpu_##op(void *ptr, \ unsigned long val, int size) \ { \ unsigned long ret; \ @@ -63,7 +63,7 @@ PERCPU_OP(or, or, |) #undef PERCPU_OP -static inline unsigned long __percpu_read(void *ptr, int size) +static __always_inline unsigned long __percpu_read(void *ptr, int size) { unsigned long ret; @@ -100,7 +100,7 @@ return ret; } -static inline void __percpu_write(void *ptr, unsigned long val, int size) +static __always_inline void __percpu_write(void *ptr, unsigned long val, int size) { switch (size) { case 1: @@ -132,8 +132,8 @@ } } -static inline unsigned long __percpu_xchg(void *ptr, unsigned long val, - int size) +static __always_inline unsigned long __percpu_xchg(void *ptr, unsigned long val, + int size) { switch (size) { case 1: --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/pgtable-bits.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/pgtable-bits.h @@ -105,13 +105,15 @@ return __pgprot(prot); } +extern bool wc_enabled; + #define pgprot_writecombine pgprot_writecombine static inline pgprot_t pgprot_writecombine(pgprot_t _prot) { unsigned long prot = pgprot_val(_prot); - prot = (prot & ~_CACHE_MASK) | _CACHE_WUC; + prot = (prot & ~_CACHE_MASK) | (wc_enabled ? _CACHE_WUC : _CACHE_SUC); return __pgprot(prot); } --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/pgtable.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/pgtable.h @@ -593,6 +593,9 @@ } #endif /* CONFIG_NUMA_BALANCING */ +#define pmd_leaf(pmd) ((pmd_val(pmd) & _PAGE_HUGE) != 0) +#define pud_leaf(pud) ((pud_val(pud) & _PAGE_HUGE) != 0) + /* * We provide our own get_unmapped area to cope with the virtual aliasing * constraints placed on us by the cache architecture. --- linux-azure-6.5.0.orig/arch/loongarch/include/asm/setup.h +++ linux-azure-6.5.0/arch/loongarch/include/asm/setup.h @@ -24,7 +24,7 @@ #ifdef CONFIG_RELOCATABLE struct rela_la_abs { - long offset; + long pc; long symvalue; }; --- linux-azure-6.5.0.orig/arch/loongarch/kernel/entry.S +++ linux-azure-6.5.0/arch/loongarch/kernel/entry.S @@ -18,7 +18,7 @@ .text .cfi_sections .debug_frame .align 5 -SYM_FUNC_START(handle_syscall) +SYM_CODE_START(handle_syscall) csrrd t0, PERCPU_BASE_KS la.pcrel t1, kernelsp add.d t1, t1, t0 @@ -66,7 +66,7 @@ bl do_syscall RESTORE_ALL_AND_RET -SYM_FUNC_END(handle_syscall) +SYM_CODE_END(handle_syscall) _ASM_NOKPROBE(handle_syscall) SYM_CODE_START(ret_from_fork) --- linux-azure-6.5.0.orig/arch/loongarch/kernel/genex.S +++ linux-azure-6.5.0/arch/loongarch/kernel/genex.S @@ -31,7 +31,7 @@ 1: jr ra SYM_FUNC_END(__arch_cpu_idle) -SYM_FUNC_START(handle_vint) +SYM_CODE_START(handle_vint) BACKUP_T0T1 SAVE_ALL la_abs t1, __arch_cpu_idle @@ -46,11 +46,11 @@ la_abs t0, do_vint jirl ra, t0, 0 RESTORE_ALL_AND_RET -SYM_FUNC_END(handle_vint) +SYM_CODE_END(handle_vint) -SYM_FUNC_START(except_vec_cex) +SYM_CODE_START(except_vec_cex) b cache_parity_error -SYM_FUNC_END(except_vec_cex) +SYM_CODE_END(except_vec_cex) .macro build_prep_badv csrrd t0, LOONGARCH_CSR_BADV @@ -66,7 +66,7 @@ .macro BUILD_HANDLER exception handler prep .align 5 - SYM_FUNC_START(handle_\exception) + SYM_CODE_START(handle_\exception) 666: BACKUP_T0T1 SAVE_ALL @@ -76,7 +76,7 @@ jirl ra, t0, 0 668: RESTORE_ALL_AND_RET - SYM_FUNC_END(handle_\exception) + SYM_CODE_END(handle_\exception) SYM_DATA(unwind_hint_\exception, .word 668b - 666b) .endm @@ -93,7 +93,7 @@ BUILD_HANDLER watch watch none BUILD_HANDLER reserved reserved none /* others */ -SYM_FUNC_START(handle_sys) +SYM_CODE_START(handle_sys) la_abs t0, handle_syscall jr t0 -SYM_FUNC_END(handle_sys) +SYM_CODE_END(handle_sys) --- linux-azure-6.5.0.orig/arch/loongarch/kernel/mem.c +++ linux-azure-6.5.0/arch/loongarch/kernel/mem.c @@ -50,7 +50,6 @@ } memblock_set_current_limit(PFN_PHYS(max_low_pfn)); - memblock_set_node(0, PHYS_ADDR_MAX, &memblock.memory, 0); /* Reserve the first 2MB */ memblock_reserve(PHYS_OFFSET, 0x200000); @@ -58,4 +57,7 @@ /* Reserve the kernel text/data/bss */ memblock_reserve(__pa_symbol(&_text), __pa_symbol(&_end) - __pa_symbol(&_text)); + + memblock_set_node(0, PHYS_ADDR_MAX, &memblock.memory, 0); + memblock_set_node(0, PHYS_ADDR_MAX, &memblock.reserved, 0); } --- linux-azure-6.5.0.orig/arch/loongarch/kernel/module.c +++ linux-azure-6.5.0/arch/loongarch/kernel/module.c @@ -367,6 +367,24 @@ return apply_r_larch_pcala(mod, location, got, rela_stack, rela_stack_top, type); } +static int apply_r_larch_32_pcrel(struct module *mod, u32 *location, Elf_Addr v, + s64 *rela_stack, size_t *rela_stack_top, unsigned int type) +{ + ptrdiff_t offset = (void *)v - (void *)location; + + *(u32 *)location = offset; + return 0; +} + +static int apply_r_larch_64_pcrel(struct module *mod, u32 *location, Elf_Addr v, + s64 *rela_stack, size_t *rela_stack_top, unsigned int type) +{ + ptrdiff_t offset = (void *)v - (void *)location; + + *(u64 *)location = offset; + return 0; +} + /* * reloc_handlers_rela() - Apply a particular relocation to a module * @mod: the module to apply the reloc to @@ -382,7 +400,7 @@ /* The handlers for known reloc types */ static reloc_rela_handler reloc_rela_handlers[] = { - [R_LARCH_NONE ... R_LARCH_RELAX] = apply_r_larch_error, + [R_LARCH_NONE ... R_LARCH_64_PCREL] = apply_r_larch_error, [R_LARCH_NONE] = apply_r_larch_none, [R_LARCH_32] = apply_r_larch_32, @@ -396,6 +414,8 @@ [R_LARCH_SOP_POP_32_S_10_5 ... R_LARCH_SOP_POP_32_U] = apply_r_larch_sop_imm_field, [R_LARCH_ADD32 ... R_LARCH_SUB64] = apply_r_larch_add_sub, [R_LARCH_PCALA_HI20...R_LARCH_PCALA64_HI12] = apply_r_larch_pcala, + [R_LARCH_32_PCREL] = apply_r_larch_32_pcrel, + [R_LARCH_64_PCREL] = apply_r_larch_64_pcrel, }; int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab, --- linux-azure-6.5.0.orig/arch/loongarch/kernel/numa.c +++ linux-azure-6.5.0/arch/loongarch/kernel/numa.c @@ -468,7 +468,7 @@ void __init mem_init(void) { - high_memory = (void *) __va(get_num_physpages() << PAGE_SHIFT); + high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT); memblock_free_all(); setup_zero_pages(); /* This comes from node 0 */ } --- linux-azure-6.5.0.orig/arch/loongarch/kernel/process.c +++ linux-azure-6.5.0/arch/loongarch/kernel/process.c @@ -338,9 +338,9 @@ } } -void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self) +void arch_trigger_cpumask_backtrace(const cpumask_t *mask, int exclude_cpu) { - nmi_trigger_cpumask_backtrace(mask, exclude_self, raise_backtrace); + nmi_trigger_cpumask_backtrace(mask, exclude_cpu, raise_backtrace); } #ifdef CONFIG_64BIT --- linux-azure-6.5.0.orig/arch/loongarch/kernel/relocate.c +++ linux-azure-6.5.0/arch/loongarch/kernel/relocate.c @@ -52,7 +52,7 @@ for (p = begin; (void *)p < end; p++) { long v = p->symvalue; uint32_t lu12iw, ori, lu32id, lu52id; - union loongarch_instruction *insn = (void *)p - p->offset; + union loongarch_instruction *insn = (void *)p->pc; lu12iw = (v >> 12) & 0xfffff; ori = v & 0xfff; @@ -102,6 +102,14 @@ return hash; } +static int __init nokaslr(char *p) +{ + pr_info("KASLR is disabled.\n"); + + return 0; /* Print a notice and silence the boot warning */ +} +early_param("nokaslr", nokaslr); + static inline __init bool kaslr_disabled(void) { char *str; --- linux-azure-6.5.0.orig/arch/loongarch/kernel/setup.c +++ linux-azure-6.5.0/arch/loongarch/kernel/setup.c @@ -161,19 +161,19 @@ } #ifdef CONFIG_ARCH_WRITECOMBINE -pgprot_t pgprot_wc = PAGE_KERNEL_WUC; +bool wc_enabled = true; #else -pgprot_t pgprot_wc = PAGE_KERNEL_SUC; +bool wc_enabled = false; #endif -EXPORT_SYMBOL(pgprot_wc); +EXPORT_SYMBOL(wc_enabled); static int __init setup_writecombine(char *p) { if (!strcmp(p, "on")) - pgprot_wc = PAGE_KERNEL_WUC; + wc_enabled = true; else if (!strcmp(p, "off")) - pgprot_wc = PAGE_KERNEL_SUC; + wc_enabled = false; else pr_warn("Unknown writecombine setting \"%s\".\n", p); --- linux-azure-6.5.0.orig/arch/loongarch/kernel/stacktrace.c +++ linux-azure-6.5.0/arch/loongarch/kernel/stacktrace.c @@ -30,7 +30,7 @@ regs->regs[1] = 0; for (unwind_start(&state, task, regs); - !unwind_done(&state) && !unwind_error(&state); unwind_next_frame(&state)) { + !unwind_done(&state); unwind_next_frame(&state)) { addr = unwind_get_return_address(&state); if (!addr || !consume_entry(cookie, addr)) break; --- linux-azure-6.5.0.orig/arch/loongarch/kernel/time.c +++ linux-azure-6.5.0/arch/loongarch/kernel/time.c @@ -58,14 +58,16 @@ return 0; } -static int constant_set_state_oneshot_stopped(struct clock_event_device *evt) +static int constant_set_state_periodic(struct clock_event_device *evt) { + unsigned long period; unsigned long timer_config; raw_spin_lock(&state_lock); - timer_config = csr_read64(LOONGARCH_CSR_TCFG); - timer_config &= ~CSR_TCFG_EN; + period = const_clock_freq / HZ; + timer_config = period & CSR_TCFG_VAL; + timer_config |= (CSR_TCFG_PERIOD | CSR_TCFG_EN); csr_write64(timer_config, LOONGARCH_CSR_TCFG); raw_spin_unlock(&state_lock); @@ -73,16 +75,14 @@ return 0; } -static int constant_set_state_periodic(struct clock_event_device *evt) +static int constant_set_state_shutdown(struct clock_event_device *evt) { - unsigned long period; unsigned long timer_config; raw_spin_lock(&state_lock); - period = const_clock_freq / HZ; - timer_config = period & CSR_TCFG_VAL; - timer_config |= (CSR_TCFG_PERIOD | CSR_TCFG_EN); + timer_config = csr_read64(LOONGARCH_CSR_TCFG); + timer_config &= ~CSR_TCFG_EN; csr_write64(timer_config, LOONGARCH_CSR_TCFG); raw_spin_unlock(&state_lock); @@ -90,11 +90,6 @@ return 0; } -static int constant_set_state_shutdown(struct clock_event_device *evt) -{ - return 0; -} - static int constant_timer_next_event(unsigned long delta, struct clock_event_device *evt) { unsigned long timer_config; @@ -161,7 +156,7 @@ cd->rating = 320; cd->cpumask = cpumask_of(cpu); cd->set_state_oneshot = constant_set_state_oneshot; - cd->set_state_oneshot_stopped = constant_set_state_oneshot_stopped; + cd->set_state_oneshot_stopped = constant_set_state_shutdown; cd->set_state_periodic = constant_set_state_periodic; cd->set_state_shutdown = constant_set_state_shutdown; cd->set_next_event = constant_timer_next_event; --- linux-azure-6.5.0.orig/arch/loongarch/kernel/unwind.c +++ linux-azure-6.5.0/arch/loongarch/kernel/unwind.c @@ -28,6 +28,5 @@ } while (!get_stack_info(state->sp, state->task, info)); - state->error = true; return false; } --- linux-azure-6.5.0.orig/arch/loongarch/kernel/unwind_prologue.c +++ linux-azure-6.5.0/arch/loongarch/kernel/unwind_prologue.c @@ -227,7 +227,7 @@ } while (!get_stack_info(state->sp, state->task, info)); out: - state->error = true; + state->stack_info.type = STACK_TYPE_UNKNOWN; return false; } --- linux-azure-6.5.0.orig/arch/loongarch/kernel/vmlinux.lds.S +++ linux-azure-6.5.0/arch/loongarch/kernel/vmlinux.lds.S @@ -53,33 +53,6 @@ . = ALIGN(PECOFF_SEGMENT_ALIGN); _etext = .; - /* - * struct alt_inst entries. From the header (alternative.h): - * "Alternative instructions for different CPU types or capabilities" - * Think locking instructions on spinlocks. - */ - . = ALIGN(4); - .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) { - __alt_instructions = .; - *(.altinstructions) - __alt_instructions_end = .; - } - -#ifdef CONFIG_RELOCATABLE - . = ALIGN(8); - .la_abs : AT(ADDR(.la_abs) - LOAD_OFFSET) { - __la_abs_begin = .; - *(.la_abs) - __la_abs_end = .; - } -#endif - - .got : ALIGN(16) { *(.got) } - .plt : ALIGN(16) { *(.plt) } - .got.plt : ALIGN(16) { *(.got.plt) } - - .data.rel : { *(.data.rel*) } - . = ALIGN(PECOFF_SEGMENT_ALIGN); __init_begin = .; __inittext_begin = .; @@ -94,6 +67,18 @@ __initdata_begin = .; + /* + * struct alt_inst entries. From the header (alternative.h): + * "Alternative instructions for different CPU types or capabilities" + * Think locking instructions on spinlocks. + */ + . = ALIGN(4); + .altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) { + __alt_instructions = .; + *(.altinstructions) + __alt_instructions_end = .; + } + INIT_DATA_SECTION(16) .exit.data : { EXIT_DATA @@ -113,6 +98,11 @@ _sdata = .; RO_DATA(4096) + + .got : ALIGN(16) { *(.got) } + .plt : ALIGN(16) { *(.plt) } + .got.plt : ALIGN(16) { *(.got.plt) } + RW_DATA(1 << CONFIG_L1_CACHE_SHIFT, PAGE_SIZE, THREAD_SIZE) .rela.dyn : ALIGN(8) { @@ -121,6 +111,17 @@ __rela_dyn_end = .; } + .data.rel : { *(.data.rel*) } + +#ifdef CONFIG_RELOCATABLE + . = ALIGN(8); + .la_abs : AT(ADDR(.la_abs) - LOAD_OFFSET) { + __la_abs_begin = .; + *(.la_abs) + __la_abs_end = .; + } +#endif + .sdata : { *(.sdata) } --- linux-azure-6.5.0.orig/arch/loongarch/mm/init.c +++ linux-azure-6.5.0/arch/loongarch/mm/init.c @@ -68,11 +68,11 @@ { void *vfrom, *vto; - vto = kmap_atomic(to); - vfrom = kmap_atomic(from); + vfrom = kmap_local_page(from); + vto = kmap_local_page(to); copy_page(vto, vfrom); - kunmap_atomic(vfrom); - kunmap_atomic(vto); + kunmap_local(vfrom); + kunmap_local(vto); /* Make sure this page is cleared on other CPU's too before using it */ smp_wmb(); } @@ -267,6 +267,7 @@ pgd_t invalid_pg_dir[_PTRS_PER_PGD] __page_aligned_bss; #ifndef __PAGETABLE_PUD_FOLDED pud_t invalid_pud_table[PTRS_PER_PUD] __page_aligned_bss; +EXPORT_SYMBOL(invalid_pud_table); #endif #ifndef __PAGETABLE_PMD_FOLDED pmd_t invalid_pmd_table[PTRS_PER_PMD] __page_aligned_bss; --- linux-azure-6.5.0.orig/arch/loongarch/mm/tlbex.S +++ linux-azure-6.5.0/arch/loongarch/mm/tlbex.S @@ -17,7 +17,7 @@ #define PTRS_PER_PTE_BITS (PAGE_SHIFT - 3) .macro tlb_do_page_fault, write - SYM_FUNC_START(tlb_do_page_fault_\write) + SYM_CODE_START(tlb_do_page_fault_\write) SAVE_ALL csrrd a2, LOONGARCH_CSR_BADV move a0, sp @@ -25,13 +25,13 @@ li.w a1, \write bl do_page_fault RESTORE_ALL_AND_RET - SYM_FUNC_END(tlb_do_page_fault_\write) + SYM_CODE_END(tlb_do_page_fault_\write) .endm tlb_do_page_fault 0 tlb_do_page_fault 1 -SYM_FUNC_START(handle_tlb_protect) +SYM_CODE_START(handle_tlb_protect) BACKUP_T0T1 SAVE_ALL move a0, sp @@ -41,9 +41,9 @@ la_abs t0, do_page_fault jirl ra, t0, 0 RESTORE_ALL_AND_RET -SYM_FUNC_END(handle_tlb_protect) +SYM_CODE_END(handle_tlb_protect) -SYM_FUNC_START(handle_tlb_load) +SYM_CODE_START(handle_tlb_load) csrwr t0, EXCEPTION_KS0 csrwr t1, EXCEPTION_KS1 csrwr ra, EXCEPTION_KS2 @@ -187,16 +187,16 @@ csrrd ra, EXCEPTION_KS2 la_abs t0, tlb_do_page_fault_0 jr t0 -SYM_FUNC_END(handle_tlb_load) +SYM_CODE_END(handle_tlb_load) -SYM_FUNC_START(handle_tlb_load_ptw) +SYM_CODE_START(handle_tlb_load_ptw) csrwr t0, LOONGARCH_CSR_KS0 csrwr t1, LOONGARCH_CSR_KS1 la_abs t0, tlb_do_page_fault_0 jr t0 -SYM_FUNC_END(handle_tlb_load_ptw) +SYM_CODE_END(handle_tlb_load_ptw) -SYM_FUNC_START(handle_tlb_store) +SYM_CODE_START(handle_tlb_store) csrwr t0, EXCEPTION_KS0 csrwr t1, EXCEPTION_KS1 csrwr ra, EXCEPTION_KS2 @@ -343,16 +343,16 @@ csrrd ra, EXCEPTION_KS2 la_abs t0, tlb_do_page_fault_1 jr t0 -SYM_FUNC_END(handle_tlb_store) +SYM_CODE_END(handle_tlb_store) -SYM_FUNC_START(handle_tlb_store_ptw) +SYM_CODE_START(handle_tlb_store_ptw) csrwr t0, LOONGARCH_CSR_KS0 csrwr t1, LOONGARCH_CSR_KS1 la_abs t0, tlb_do_page_fault_1 jr t0 -SYM_FUNC_END(handle_tlb_store_ptw) +SYM_CODE_END(handle_tlb_store_ptw) -SYM_FUNC_START(handle_tlb_modify) +SYM_CODE_START(handle_tlb_modify) csrwr t0, EXCEPTION_KS0 csrwr t1, EXCEPTION_KS1 csrwr ra, EXCEPTION_KS2 @@ -497,16 +497,16 @@ csrrd ra, EXCEPTION_KS2 la_abs t0, tlb_do_page_fault_1 jr t0 -SYM_FUNC_END(handle_tlb_modify) +SYM_CODE_END(handle_tlb_modify) -SYM_FUNC_START(handle_tlb_modify_ptw) +SYM_CODE_START(handle_tlb_modify_ptw) csrwr t0, LOONGARCH_CSR_KS0 csrwr t1, LOONGARCH_CSR_KS1 la_abs t0, tlb_do_page_fault_1 jr t0 -SYM_FUNC_END(handle_tlb_modify_ptw) +SYM_CODE_END(handle_tlb_modify_ptw) -SYM_FUNC_START(handle_tlb_refill) +SYM_CODE_START(handle_tlb_refill) csrwr t0, LOONGARCH_CSR_TLBRSAVE csrrd t0, LOONGARCH_CSR_PGD lddir t0, t0, 3 @@ -521,4 +521,4 @@ tlbfill csrrd t0, LOONGARCH_CSR_TLBRSAVE ertn -SYM_FUNC_END(handle_tlb_refill) +SYM_CODE_END(handle_tlb_refill) --- linux-azure-6.5.0.orig/arch/loongarch/net/bpf_jit.c +++ linux-azure-6.5.0/arch/loongarch/net/bpf_jit.c @@ -855,8 +855,6 @@ /* function return */ case BPF_JMP | BPF_EXIT: - emit_sext_32(ctx, regmap[BPF_REG_0], true); - if (i == ctx->prog->len - 1) break; @@ -907,14 +905,8 @@ } break; case BPF_DW: - if (is_signed_imm12(off)) { - emit_insn(ctx, ldd, dst, src, off); - } else if (is_signed_imm14(off)) { - emit_insn(ctx, ldptrd, dst, src, off); - } else { - move_imm(ctx, t1, off, is32); - emit_insn(ctx, ldxd, dst, src, t1); - } + move_imm(ctx, t1, off, is32); + emit_insn(ctx, ldxd, dst, src, t1); break; } --- linux-azure-6.5.0.orig/arch/mips/Kconfig +++ linux-azure-6.5.0/arch/mips/Kconfig @@ -482,6 +482,7 @@ config MACH_LOONGSON64 bool "Loongson 64-bit family of machines" + select ARCH_DMA_DEFAULT_COHERENT select ARCH_SPARSEMEM_ENABLE select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO @@ -1273,6 +1274,7 @@ select CPU_SUPPORTS_MSA select CPU_DIEI_BROKEN if !LOONGSON3_ENHANCEMENT select CPU_MIPSR2_IRQ_VI + select DMA_NONCOHERENT select WEAK_ORDERING select WEAK_REORDERING_BEYOND_LLSC select MIPS_ASID_BITS_VARIABLE --- linux-azure-6.5.0.orig/arch/mips/Makefile +++ linux-azure-6.5.0/arch/mips/Makefile @@ -299,8 +299,8 @@ endif endif - ifeq ($(KBUILD_SYM32)$(call cc-option-yn,-msym32), yy) - cflags-y += -msym32 -DKBUILD_64BIT_SYM32 + ifeq ($(KBUILD_SYM32), y) + cflags-$(KBUILD_SYM32) += -msym32 -DKBUILD_64BIT_SYM32 else ifeq ($(CONFIG_CPU_DADDI_WORKAROUNDS), y) $(error CONFIG_CPU_DADDI_WORKAROUNDS unsupported without -msym32) @@ -341,7 +341,7 @@ KBUILD_LDFLAGS += -m $(ld-emul) -ifdef CONFIG_MIPS +ifdef need-compiler CHECKFLAGS += $(shell $(CC) $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ grep -E -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \ sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g') --- linux-azure-6.5.0.orig/arch/mips/alchemy/devboards/db1000.c +++ linux-azure-6.5.0/arch/mips/alchemy/devboards/db1000.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -165,14 +164,10 @@ /******************************************************************************/ +#ifdef CONFIG_MMC_AU1X static irqreturn_t db1100_mmc_cd(int irq, void *ptr) { - void (*mmc_cd)(struct mmc_host *, unsigned long); - /* link against CONFIG_MMC=m */ - mmc_cd = symbol_get(mmc_detect_change); - mmc_cd(ptr, msecs_to_jiffies(500)); - symbol_put(mmc_detect_change); - + mmc_detect_change(ptr, msecs_to_jiffies(500)); return IRQ_HANDLED; } @@ -375,6 +370,7 @@ .num_resources = ARRAY_SIZE(au1100_mmc1_res), .resource = au1100_mmc1_res, }; +#endif /* CONFIG_MMC_AU1X */ /******************************************************************************/ @@ -446,8 +442,10 @@ static struct platform_device *db1100_devs[] = { &au1100_lcd_device, +#ifdef CONFIG_MMC_AU1X &db1100_mmc0_dev, &db1100_mmc1_dev, +#endif }; int __init db1000_dev_setup(void) --- linux-azure-6.5.0.orig/arch/mips/alchemy/devboards/db1200.c +++ linux-azure-6.5.0/arch/mips/alchemy/devboards/db1200.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -327,6 +326,7 @@ /**********************************************************************/ +#ifdef CONFIG_MMC_AU1X /* SD carddetects: they're supposed to be edge-triggered, but ack * doesn't seem to work (CPLD Rev 2). Instead, the screaming one * is disabled and its counterpart enabled. The 200ms timeout is @@ -340,14 +340,7 @@ static irqreturn_t db1200_mmc_cdfn(int irq, void *ptr) { - void (*mmc_cd)(struct mmc_host *, unsigned long); - - /* link against CONFIG_MMC=m */ - mmc_cd = symbol_get(mmc_detect_change); - if (mmc_cd) { - mmc_cd(ptr, msecs_to_jiffies(200)); - symbol_put(mmc_detect_change); - } + mmc_detect_change(ptr, msecs_to_jiffies(200)); msleep(100); /* debounce */ if (irq == DB1200_SD0_INSERT_INT) @@ -431,14 +424,7 @@ static irqreturn_t pb1200_mmc1_cdfn(int irq, void *ptr) { - void (*mmc_cd)(struct mmc_host *, unsigned long); - - /* link against CONFIG_MMC=m */ - mmc_cd = symbol_get(mmc_detect_change); - if (mmc_cd) { - mmc_cd(ptr, msecs_to_jiffies(200)); - symbol_put(mmc_detect_change); - } + mmc_detect_change(ptr, msecs_to_jiffies(200)); msleep(100); /* debounce */ if (irq == PB1200_SD1_INSERT_INT) @@ -599,6 +585,7 @@ .num_resources = ARRAY_SIZE(au1200_mmc1_res), .resource = au1200_mmc1_res, }; +#endif /* CONFIG_MMC_AU1X */ /**********************************************************************/ @@ -766,7 +753,9 @@ static struct platform_device *db1200_devs[] __initdata = { NULL, /* PSC0, selected by S6.8 */ &db1200_ide_dev, +#ifdef CONFIG_MMC_AU1X &db1200_mmc0_dev, +#endif &au1200_lcd_dev, &db1200_eth_dev, &db1200_nand_dev, @@ -777,7 +766,9 @@ }; static struct platform_device *pb1200_devs[] __initdata = { +#ifdef CONFIG_MMC_AU1X &pb1200_mmc1_dev, +#endif }; /* Some peripheral base addresses differ on the PB1200 */ --- linux-azure-6.5.0.orig/arch/mips/alchemy/devboards/db1300.c +++ linux-azure-6.5.0/arch/mips/alchemy/devboards/db1300.c @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -451,6 +450,7 @@ /**********************************************************************/ +#ifdef CONFIG_MMC_AU1X static irqreturn_t db1300_mmc_cd(int irq, void *ptr) { disable_irq_nosync(irq); @@ -459,14 +459,7 @@ static irqreturn_t db1300_mmc_cdfn(int irq, void *ptr) { - void (*mmc_cd)(struct mmc_host *, unsigned long); - - /* link against CONFIG_MMC=m. We can only be called once MMC core has - * initialized the controller, so symbol_get() should always succeed. - */ - mmc_cd = symbol_get(mmc_detect_change); - mmc_cd(ptr, msecs_to_jiffies(200)); - symbol_put(mmc_detect_change); + mmc_detect_change(ptr, msecs_to_jiffies(200)); msleep(100); /* debounce */ if (irq == DB1300_SD1_INSERT_INT) @@ -640,6 +633,7 @@ .resource = au1300_sd0_res, .num_resources = ARRAY_SIZE(au1300_sd0_res), }; +#endif /* CONFIG_MMC_AU1X */ /**********************************************************************/ @@ -775,8 +769,10 @@ &db1300_5waysw_dev, &db1300_nand_dev, &db1300_ide_dev, +#ifdef CONFIG_MMC_AU1X &db1300_sd0_dev, &db1300_sd1_dev, +#endif &db1300_lcd_dev, &db1300_ac97_dev, &db1300_i2s_dev, --- linux-azure-6.5.0.orig/arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi +++ linux-azure-6.5.0/arch/mips/boot/dts/loongson/loongson64-2k1000.dtsi @@ -130,8 +130,7 @@ compatible = "pci0014,7a03.0", "pci0014,7a03", "pciclass0c0320", - "pciclass0c03", - "loongson, pci-gmac"; + "pciclass0c03"; reg = <0x1800 0x0 0x0 0x0 0x0>; interrupts = <12 IRQ_TYPE_LEVEL_LOW>, --- linux-azure-6.5.0.orig/arch/mips/boot/dts/loongson/ls7a-pch.dtsi +++ linux-azure-6.5.0/arch/mips/boot/dts/loongson/ls7a-pch.dtsi @@ -193,8 +193,7 @@ compatible = "pci0014,7a03.0", "pci0014,7a03", "pciclass020000", - "pciclass0200", - "loongson, pci-gmac"; + "pciclass0200"; reg = <0x1800 0x0 0x0 0x0 0x0>; interrupts = <12 IRQ_TYPE_LEVEL_HIGH>, --- linux-azure-6.5.0.orig/arch/mips/cavium-octeon/octeon-usb.c +++ linux-azure-6.5.0/arch/mips/cavium-octeon/octeon-usb.c @@ -243,11 +243,11 @@ while (div < ARRAY_SIZE(clk_div)) { uint64_t rate = octeon_get_io_clock_rate() / clk_div[div]; if (rate <= 300000000 && rate >= 150000000) - break; + return div; div++; } - return div; + return -EINVAL; } static int dwc3_octeon_config_power(struct device *dev, void __iomem *base) @@ -374,6 +374,10 @@ /* Step 4b: Select controller clock frequency. */ div = dwc3_octeon_get_divider(); + if (div < 0) { + dev_err(dev, "clock divider invalid\n"); + return div; + } val = dwc3_octeon_readq(uctl_ctl_reg); val &= ~USBDRD_UCTL_CTL_H_CLKDIV_SEL; val |= FIELD_PREP(USBDRD_UCTL_CTL_H_CLKDIV_SEL, div); --- linux-azure-6.5.0.orig/arch/mips/include/asm/irq.h +++ linux-azure-6.5.0/arch/mips/include/asm/irq.h @@ -77,7 +77,7 @@ extern int get_c0_fdc_int(void); void arch_trigger_cpumask_backtrace(const struct cpumask *mask, - bool exclude_self); + int exclude_cpu); #define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace #endif /* _ASM_IRQ_H */ --- linux-azure-6.5.0.orig/arch/mips/include/asm/local.h +++ linux-azure-6.5.0/arch/mips/include/asm/local.h @@ -101,8 +101,8 @@ static __inline__ bool local_try_cmpxchg(local_t *l, long *old, long new) { - typeof(l->a.counter) *__old = (typeof(l->a.counter) *) old; - return try_cmpxchg_local(&l->a.counter, __old, new); + return try_cmpxchg_local(&l->a.counter, + (typeof(l->a.counter) *) old, new); } #define local_xchg(l, n) (atomic_long_xchg((&(l)->a), (n))) --- linux-azure-6.5.0.orig/arch/mips/include/asm/mach-loongson64/boot_param.h +++ linux-azure-6.5.0/arch/mips/include/asm/mach-loongson64/boot_param.h @@ -14,7 +14,11 @@ #define ADAPTER_ROM 8 #define ACPI_TABLE 9 #define SMBIOS_TABLE 10 -#define MAX_MEMORY_TYPE 11 +#define UMA_VIDEO_RAM 11 +#define VUMA_VIDEO_RAM 12 +#define MAX_MEMORY_TYPE 13 + +#define MEM_SIZE_IS_IN_BYTES (1 << 31) #define LOONGSON3_BOOT_MEM_MAP_MAX 128 struct efi_memory_map_loongson { @@ -117,7 +121,8 @@ u64 pci_io_start_addr; u64 pci_io_end_addr; u64 pci_config_addr; - u32 dma_mask_bits; + u16 dma_mask_bits; + u16 dma_noncoherent; } __packed; struct interface_info { --- linux-azure-6.5.0.orig/arch/mips/kernel/process.c +++ linux-azure-6.5.0/arch/mips/kernel/process.c @@ -121,6 +121,19 @@ /* Put the stack after the struct pt_regs. */ childksp = (unsigned long) childregs; p->thread.cp0_status = (read_c0_status() & ~(ST0_CU2|ST0_CU1)) | ST0_KERNEL_CUMASK; + + /* + * New tasks lose permission to use the fpu. This accelerates context + * switching for most programs since they don't use the fpu. + */ + clear_tsk_thread_flag(p, TIF_USEDFPU); + clear_tsk_thread_flag(p, TIF_USEDMSA); + clear_tsk_thread_flag(p, TIF_MSA_CTX_LIVE); + +#ifdef CONFIG_MIPS_MT_FPAFF + clear_tsk_thread_flag(p, TIF_FPUBOUND); +#endif /* CONFIG_MIPS_MT_FPAFF */ + if (unlikely(args->fn)) { /* kernel thread */ unsigned long status = p->thread.cp0_status; @@ -149,20 +162,8 @@ p->thread.reg29 = (unsigned long) childregs; p->thread.reg31 = (unsigned long) ret_from_fork; - /* - * New tasks lose permission to use the fpu. This accelerates context - * switching for most programs since they don't use the fpu. - */ childregs->cp0_status &= ~(ST0_CU2|ST0_CU1); - clear_tsk_thread_flag(p, TIF_USEDFPU); - clear_tsk_thread_flag(p, TIF_USEDMSA); - clear_tsk_thread_flag(p, TIF_MSA_CTX_LIVE); - -#ifdef CONFIG_MIPS_MT_FPAFF - clear_tsk_thread_flag(p, TIF_FPUBOUND); -#endif /* CONFIG_MIPS_MT_FPAFF */ - #ifdef CONFIG_MIPS_FP_SUPPORT atomic_set(&p->thread.bd_emu_frame, BD_EMUFRAME_NONE); #endif @@ -750,9 +751,9 @@ } } -void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self) +void arch_trigger_cpumask_backtrace(const cpumask_t *mask, int exclude_cpu) { - nmi_trigger_cpumask_backtrace(mask, exclude_self, raise_backtrace); + nmi_trigger_cpumask_backtrace(mask, exclude_cpu, raise_backtrace); } int mips_get_process_fp_mode(struct task_struct *task) --- linux-azure-6.5.0.orig/arch/mips/kvm/mmu.c +++ linux-azure-6.5.0/arch/mips/kvm/mmu.c @@ -592,7 +592,7 @@ gfn_t gfn = gpa >> PAGE_SHIFT; int srcu_idx, err; kvm_pfn_t pfn; - pte_t *ptep, entry, old_pte; + pte_t *ptep, entry; bool writeable; unsigned long prot_bits; unsigned long mmu_seq; @@ -664,7 +664,6 @@ entry = pfn_pte(pfn, __pgprot(prot_bits)); /* Write the PTE */ - old_pte = *ptep; set_pte(ptep, entry); err = 0; --- linux-azure-6.5.0.orig/arch/mips/loongson64/env.c +++ linux-azure-6.5.0/arch/mips/loongson64/env.c @@ -13,6 +13,8 @@ * Copyright (C) 2009 Lemote Inc. * Author: Wu Zhangjin, wuzhangjin@gmail.com */ + +#include #include #include #include @@ -147,8 +149,14 @@ loongson_sysconf.dma_mask_bits = eirq_source->dma_mask_bits; if (loongson_sysconf.dma_mask_bits < 32 || - loongson_sysconf.dma_mask_bits > 64) + loongson_sysconf.dma_mask_bits > 64) { loongson_sysconf.dma_mask_bits = 32; + dma_default_coherent = true; + } else { + dma_default_coherent = !eirq_source->dma_noncoherent; + } + + pr_info("Firmware: Coherent DMA: %s\n", dma_default_coherent ? "on" : "off"); loongson_sysconf.restart_addr = boot_p->reset_system.ResetWarm; loongson_sysconf.poweroff_addr = boot_p->reset_system.Shutdown; --- linux-azure-6.5.0.orig/arch/mips/loongson64/init.c +++ linux-azure-6.5.0/arch/mips/loongson64/init.c @@ -49,8 +49,7 @@ void __init szmem(unsigned int node) { u32 i, mem_type; - static unsigned long num_physpages; - u64 node_id, node_psize, start_pfn, end_pfn, mem_start, mem_size; + phys_addr_t node_id, mem_start, mem_size; /* Otherwise come from DTB */ if (loongson_sysconf.fw_interface != LOONGSON_LEFI) @@ -64,30 +63,46 @@ mem_type = loongson_memmap->map[i].mem_type; mem_size = loongson_memmap->map[i].mem_size; - mem_start = loongson_memmap->map[i].mem_start; + + /* Memory size comes in MB if MEM_SIZE_IS_IN_BYTES not set */ + if (mem_size & MEM_SIZE_IS_IN_BYTES) + mem_size &= ~MEM_SIZE_IS_IN_BYTES; + else + mem_size = mem_size << 20; + + mem_start = (node_id << 44) | loongson_memmap->map[i].mem_start; switch (mem_type) { case SYSTEM_RAM_LOW: case SYSTEM_RAM_HIGH: - start_pfn = ((node_id << 44) + mem_start) >> PAGE_SHIFT; - node_psize = (mem_size << 20) >> PAGE_SHIFT; - end_pfn = start_pfn + node_psize; - num_physpages += node_psize; - pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx MB\n", - (u32)node_id, mem_type, mem_start, mem_size); - pr_info(" start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n", - start_pfn, end_pfn, num_physpages); - memblock_add_node(PFN_PHYS(start_pfn), - PFN_PHYS(node_psize), node, + case UMA_VIDEO_RAM: + pr_info("Node %d, mem_type:%d\t[%pa], %pa bytes usable\n", + (u32)node_id, mem_type, &mem_start, &mem_size); + memblock_add_node(mem_start, mem_size, node, MEMBLOCK_NONE); break; case SYSTEM_RAM_RESERVED: - pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx MB\n", - (u32)node_id, mem_type, mem_start, mem_size); - memblock_reserve(((node_id << 44) + mem_start), mem_size << 20); + case VIDEO_ROM: + case ADAPTER_ROM: + case ACPI_TABLE: + case SMBIOS_TABLE: + pr_info("Node %d, mem_type:%d\t[%pa], %pa bytes reserved\n", + (u32)node_id, mem_type, &mem_start, &mem_size); + memblock_reserve(mem_start, mem_size); + break; + /* We should not reserve VUMA_VIDEO_RAM as it overlaps with MMIO */ + case VUMA_VIDEO_RAM: + default: + pr_info("Node %d, mem_type:%d\t[%pa], %pa bytes unhandled\n", + (u32)node_id, mem_type, &mem_start, &mem_size); break; } } + + /* Reserve vgabios if it comes from firmware */ + if (loongson_sysconf.vgabios_addr) + memblock_reserve(virt_to_phys((void *)loongson_sysconf.vgabios_addr), + SZ_256K); } #ifndef CONFIG_NUMA --- linux-azure-6.5.0.orig/arch/parisc/Kconfig +++ linux-azure-6.5.0/arch/parisc/Kconfig @@ -107,9 +107,12 @@ default n config GENERIC_BUG - bool - default y + def_bool y depends on BUG + select GENERIC_BUG_RELATIVE_POINTERS if 64BIT + +config GENERIC_BUG_RELATIVE_POINTERS + bool config GENERIC_HWEIGHT bool --- linux-azure-6.5.0.orig/arch/parisc/include/asm/alternative.h +++ linux-azure-6.5.0/arch/parisc/include/asm/alternative.h @@ -34,7 +34,8 @@ /* Alternative SMP implementation. */ #define ALTERNATIVE(cond, replacement) "!0:" \ - ".section .altinstructions, \"aw\" !" \ + ".section .altinstructions, \"a\" !" \ + ".align 4 !" \ ".word (0b-4-.) !" \ ".hword 1, " __stringify(cond) " !" \ ".word " __stringify(replacement) " !" \ @@ -44,7 +45,8 @@ /* to replace one single instructions by a new instruction */ #define ALTERNATIVE(from, to, cond, replacement)\ - .section .altinstructions, "aw" ! \ + .section .altinstructions, "a" ! \ + .align 4 ! \ .word (from - .) ! \ .hword (to - from)/4, cond ! \ .word replacement ! \ @@ -52,7 +54,8 @@ /* to replace multiple instructions by new code */ #define ALTERNATIVE_CODE(from, num_instructions, cond, new_instr_ptr)\ - .section .altinstructions, "aw" ! \ + .section .altinstructions, "a" ! \ + .align 4 ! \ .word (from - .) ! \ .hword -num_instructions, cond ! \ .word (new_instr_ptr - .) ! \ --- linux-azure-6.5.0.orig/arch/parisc/include/asm/assembly.h +++ linux-azure-6.5.0/arch/parisc/include/asm/assembly.h @@ -574,6 +574,7 @@ */ #define ASM_EXCEPTIONTABLE_ENTRY(fault_addr, except_addr) \ .section __ex_table,"aw" ! \ + .align 4 ! \ .word (fault_addr - .), (except_addr - .) ! \ .previous --- linux-azure-6.5.0.orig/arch/parisc/include/asm/bug.h +++ linux-azure-6.5.0/arch/parisc/include/asm/bug.h @@ -17,24 +17,27 @@ #define PARISC_BUG_BREAK_ASM "break 0x1f, 0x1fff" #define PARISC_BUG_BREAK_INSN 0x03ffe01f /* PARISC_BUG_BREAK_ASM */ -#if defined(CONFIG_64BIT) -#define ASM_WORD_INSN ".dword\t" +#ifdef CONFIG_GENERIC_BUG_RELATIVE_POINTERS +# define __BUG_REL(val) ".word " __stringify(val) " - ." #else -#define ASM_WORD_INSN ".word\t" +# define __BUG_REL(val) ".word " __stringify(val) #endif + #ifdef CONFIG_DEBUG_BUGVERBOSE #define BUG() \ do { \ asm volatile("\n" \ "1:\t" PARISC_BUG_BREAK_ASM "\n" \ - "\t.pushsection __bug_table,\"aw\"\n" \ - "2:\t" ASM_WORD_INSN "1b, %c0\n" \ - "\t.short %c1, %c2\n" \ - "\t.org 2b+%c3\n" \ + "\t.pushsection __bug_table,\"a\"\n" \ + "\t.align 4\n" \ + "2:\t" __BUG_REL(1b) "\n" \ + "\t" __BUG_REL(%c0) "\n" \ + "\t.short %1, %2\n" \ + "\t.blockz %3-2*4-2*2\n" \ "\t.popsection" \ : : "i" (__FILE__), "i" (__LINE__), \ - "i" (0), "i" (sizeof(struct bug_entry)) ); \ + "i" (0), "i" (sizeof(struct bug_entry)) ); \ unreachable(); \ } while(0) @@ -51,10 +54,12 @@ do { \ asm volatile("\n" \ "1:\t" PARISC_BUG_BREAK_ASM "\n" \ - "\t.pushsection __bug_table,\"aw\"\n" \ - "2:\t" ASM_WORD_INSN "1b, %c0\n" \ - "\t.short %c1, %c2\n" \ - "\t.org 2b+%c3\n" \ + "\t.pushsection __bug_table,\"a\"\n" \ + "\t.align 4\n" \ + "2:\t" __BUG_REL(1b) "\n" \ + "\t" __BUG_REL(%c0) "\n" \ + "\t.short %1, %2\n" \ + "\t.blockz %3-2*4-2*2\n" \ "\t.popsection" \ : : "i" (__FILE__), "i" (__LINE__), \ "i" (BUGFLAG_WARNING|(flags)), \ @@ -65,10 +70,11 @@ do { \ asm volatile("\n" \ "1:\t" PARISC_BUG_BREAK_ASM "\n" \ - "\t.pushsection __bug_table,\"aw\"\n" \ - "2:\t" ASM_WORD_INSN "1b\n" \ - "\t.short %c0\n" \ - "\t.org 2b+%c1\n" \ + "\t.pushsection __bug_table,\"a\"\n" \ + "\t.align 4\n" \ + "2:\t" __BUG_REL(1b) "\n" \ + "\t.short %0\n" \ + "\t.blockz %1-4-2\n" \ "\t.popsection" \ : : "i" (BUGFLAG_WARNING|(flags)), \ "i" (sizeof(struct bug_entry)) ); \ --- linux-azure-6.5.0.orig/arch/parisc/include/asm/jump_label.h +++ linux-azure-6.5.0/arch/parisc/include/asm/jump_label.h @@ -15,10 +15,12 @@ asm_volatile_goto("1:\n\t" "nop\n\t" ".pushsection __jump_table, \"aw\"\n\t" + ".align %1\n\t" ".word 1b - ., %l[l_yes] - .\n\t" __stringify(ASM_ULONG_INSN) " %c0 - .\n\t" ".popsection\n\t" - : : "i" (&((char *)key)[branch]) : : l_yes); + : : "i" (&((char *)key)[branch]), "i" (sizeof(long)) + : : l_yes); return false; l_yes: @@ -30,10 +32,12 @@ asm_volatile_goto("1:\n\t" "b,n %l[l_yes]\n\t" ".pushsection __jump_table, \"aw\"\n\t" + ".align %1\n\t" ".word 1b - ., %l[l_yes] - .\n\t" __stringify(ASM_ULONG_INSN) " %c0 - .\n\t" ".popsection\n\t" - : : "i" (&((char *)key)[branch]) : : l_yes); + : : "i" (&((char *)key)[branch]), "i" (sizeof(long)) + : : l_yes); return false; l_yes: --- linux-azure-6.5.0.orig/arch/parisc/include/asm/ldcw.h +++ linux-azure-6.5.0/arch/parisc/include/asm/ldcw.h @@ -2,39 +2,42 @@ #ifndef __PARISC_LDCW_H #define __PARISC_LDCW_H -#ifndef CONFIG_PA20 /* Because kmalloc only guarantees 8-byte alignment for kmalloc'd data, and GCC only guarantees 8-byte alignment for stack locals, we can't be assured of 16-byte alignment for atomic lock data even if we specify "__attribute ((aligned(16)))" in the type declaration. So, we use a struct containing an array of four ints for the atomic lock type and dynamically select the 16-byte aligned int from the array - for the semaphore. */ + for the semaphore. */ + +/* From: "Jim Hull" + I've attached a summary of the change, but basically, for PA 2.0, as + long as the ",CO" (coherent operation) completer is implemented, then the + 16-byte alignment requirement for ldcw and ldcd is relaxed, and instead + they only require "natural" alignment (4-byte for ldcw, 8-byte for + ldcd). + + Although the cache control hint is accepted by all PA 2.0 processors, + it is only implemented on PA8800/PA8900 CPUs. Prior PA8X00 CPUs still + require 16-byte alignment. If the address is unaligned, the operation + of the instruction is undefined. The ldcw instruction does not generate + unaligned data reference traps so misaligned accesses are not detected. + This hid the problem for years. So, restore the 16-byte alignment dropped + by Kyle McMartin in "Remove __ldcw_align for PA-RISC 2.0 processors". */ #define __PA_LDCW_ALIGNMENT 16 -#define __PA_LDCW_ALIGN_ORDER 4 #define __ldcw_align(a) ({ \ unsigned long __ret = (unsigned long) &(a)->lock[0]; \ __ret = (__ret + __PA_LDCW_ALIGNMENT - 1) \ & ~(__PA_LDCW_ALIGNMENT - 1); \ (volatile unsigned int *) __ret; \ }) -#define __LDCW "ldcw" -#else /*CONFIG_PA20*/ -/* From: "Jim Hull" - I've attached a summary of the change, but basically, for PA 2.0, as - long as the ",CO" (coherent operation) completer is specified, then the - 16-byte alignment requirement for ldcw and ldcd is relaxed, and instead - they only require "natural" alignment (4-byte for ldcw, 8-byte for - ldcd). */ - -#define __PA_LDCW_ALIGNMENT 4 -#define __PA_LDCW_ALIGN_ORDER 2 -#define __ldcw_align(a) (&(a)->slock) +#ifdef CONFIG_PA20 #define __LDCW "ldcw,co" - -#endif /*!CONFIG_PA20*/ +#else +#define __LDCW "ldcw" +#endif /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. We don't explicitly expose that "*a" may be written as reload @@ -52,7 +55,7 @@ }) #ifdef CONFIG_SMP -# define __lock_aligned __section(".data..lock_aligned") +# define __lock_aligned __section(".data..lock_aligned") __aligned(16) #endif #endif /* __PARISC_LDCW_H */ --- linux-azure-6.5.0.orig/arch/parisc/include/asm/led.h +++ linux-azure-6.5.0/arch/parisc/include/asm/led.h @@ -11,8 +11,8 @@ #define LED1 0x02 #define LED0 0x01 /* bottom (or furthest left) LED */ -#define LED_LAN_TX LED0 /* for LAN transmit activity */ -#define LED_LAN_RCV LED1 /* for LAN receive activity */ +#define LED_LAN_RCV LED0 /* for LAN receive activity */ +#define LED_LAN_TX LED1 /* for LAN transmit activity */ #define LED_DISK_IO LED2 /* for disk activity */ #define LED_HEARTBEAT LED3 /* heartbeat */ --- linux-azure-6.5.0.orig/arch/parisc/include/asm/ropes.h +++ linux-azure-6.5.0/arch/parisc/include/asm/ropes.h @@ -29,7 +29,7 @@ struct ioc { void __iomem *ioc_hpa; /* I/O MMU base address */ char *res_map; /* resource map, bit == pdir entry */ - u64 *pdir_base; /* physical base address */ + __le64 *pdir_base; /* physical base address */ unsigned long ibase; /* pdir IOV Space base - shared w/lba_pci */ unsigned long imask; /* pdir IOV Space mask - shared w/lba_pci */ #ifdef ZX1_SUPPORT @@ -86,6 +86,9 @@ struct ioc ioc[MAX_IOC]; }; +/* list of SBA's in system, see drivers/parisc/sba_iommu.c */ +extern struct sba_device *sba_list; + #define ASTRO_RUNWAY_PORT 0x582 #define IKE_MERCED_PORT 0x803 #define REO_MERCED_PORT 0x804 @@ -110,7 +113,7 @@ #define SBA_PDIR_VALID_BIT 0x8000000000000000ULL -#define SBA_AGPGART_COOKIE 0x0000badbadc0ffeeULL +#define SBA_AGPGART_COOKIE (__force __le64) 0x0000badbadc0ffeeULL #define SBA_FUNC_ID 0x0000 /* function id */ #define SBA_FCLASS 0x0008 /* function class, bist, header, rev... */ --- linux-azure-6.5.0.orig/arch/parisc/include/asm/runway.h +++ linux-azure-6.5.0/arch/parisc/include/asm/runway.h @@ -2,9 +2,6 @@ #ifndef ASM_PARISC_RUNWAY_H #define ASM_PARISC_RUNWAY_H -/* declared in arch/parisc/kernel/setup.c */ -extern struct proc_dir_entry * proc_runway_root; - #define RUNWAY_STATUS 0x10 #define RUNWAY_DEBUG 0x40 --- linux-azure-6.5.0.orig/arch/parisc/include/asm/spinlock_types.h +++ linux-azure-6.5.0/arch/parisc/include/asm/spinlock_types.h @@ -9,15 +9,10 @@ #ifndef __ASSEMBLY__ typedef struct { -#ifdef CONFIG_PA20 - volatile unsigned int slock; -# define __ARCH_SPIN_LOCK_UNLOCKED { __ARCH_SPIN_LOCK_UNLOCKED_VAL } -#else volatile unsigned int lock[4]; # define __ARCH_SPIN_LOCK_UNLOCKED \ { { __ARCH_SPIN_LOCK_UNLOCKED_VAL, __ARCH_SPIN_LOCK_UNLOCKED_VAL, \ __ARCH_SPIN_LOCK_UNLOCKED_VAL, __ARCH_SPIN_LOCK_UNLOCKED_VAL } } -#endif } arch_spinlock_t; --- linux-azure-6.5.0.orig/arch/parisc/include/asm/uaccess.h +++ linux-azure-6.5.0/arch/parisc/include/asm/uaccess.h @@ -41,6 +41,7 @@ #define ASM_EXCEPTIONTABLE_ENTRY( fault_addr, except_addr )\ ".section __ex_table,\"aw\"\n" \ + ".align 4\n" \ ".word (" #fault_addr " - .), (" #except_addr " - .)\n\t" \ ".previous\n" --- linux-azure-6.5.0.orig/arch/parisc/include/uapi/asm/errno.h +++ linux-azure-6.5.0/arch/parisc/include/uapi/asm/errno.h @@ -75,7 +75,6 @@ /* We now return you to your regularly scheduled HPUX. */ -#define ENOSYM 215 /* symbol does not exist in executable */ #define ENOTSOCK 216 /* Socket operation on non-socket */ #define EDESTADDRREQ 217 /* Destination address required */ #define EMSGSIZE 218 /* Message too long */ @@ -101,7 +100,6 @@ #define ETIMEDOUT 238 /* Connection timed out */ #define ECONNREFUSED 239 /* Connection refused */ #define EREFUSED ECONNREFUSED /* for HP's NFS apparently */ -#define EREMOTERELEASE 240 /* Remote peer released connection */ #define EHOSTDOWN 241 /* Host is down */ #define EHOSTUNREACH 242 /* No route to host */ --- linux-azure-6.5.0.orig/arch/parisc/include/uapi/asm/pdc.h +++ linux-azure-6.5.0/arch/parisc/include/uapi/asm/pdc.h @@ -472,6 +472,7 @@ unsigned long arch_rev; unsigned long pot_key; unsigned long curr_key; + unsigned long width; /* default of PSW_W bit (1=enabled) */ }; struct pdc_cache_cf { /* for PDC_CACHE (I/D-caches) */ --- linux-azure-6.5.0.orig/arch/parisc/kernel/drivers.c +++ linux-azure-6.5.0/arch/parisc/kernel/drivers.c @@ -925,9 +925,9 @@ pr_info("#define PARISC_MODEL \"%s\"\n\n", boot_cpu_data.pdc.sys_model_name); + #define p ((unsigned long *)&boot_cpu_data.pdc.model) pr_info("#define PARISC_PDC_MODEL 0x%lx, 0x%lx, 0x%lx, " "0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx, 0x%lx\n\n", - #define p ((unsigned long *)&boot_cpu_data.pdc.model) p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8]); #undef p --- linux-azure-6.5.0.orig/arch/parisc/kernel/entry.S +++ linux-azure-6.5.0/arch/parisc/kernel/entry.S @@ -36,6 +36,24 @@ .level 2.0 #endif +/* + * We need seven instructions after a TLB insert for it to take effect. + * The PA8800/PA8900 processors are an exception and need 12 instructions. + * The RFI changes both IAOQ_Back and IAOQ_Front, so it counts as one. + */ +#ifdef CONFIG_64BIT +#define NUM_PIPELINE_INSNS 12 +#else +#define NUM_PIPELINE_INSNS 7 +#endif + + /* Insert num nops */ + .macro insert_nops num + .rept \num + nop + .endr + .endm + /* Get aligned page_table_lock address for this mm from cr28/tr4 */ .macro get_ptl reg mfctl %cr28,\reg @@ -415,24 +433,20 @@ 3: .endm - /* Release page_table_lock without reloading lock address. - We use an ordered store to ensure all prior accesses are - performed prior to releasing the lock. */ - .macro ptl_unlock0 spc,tmp,tmp2 + /* Release page_table_lock if for user space. We use an ordered + store to ensure all prior accesses are performed prior to + releasing the lock. Note stw may not be executed, so we + provide one extra nop when CONFIG_TLB_PTLOCK is defined. */ + .macro ptl_unlock spc,tmp,tmp2 #ifdef CONFIG_TLB_PTLOCK -98: ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmp2 +98: get_ptl \tmp + ldi __ARCH_SPIN_LOCK_UNLOCKED_VAL, \tmp2 or,COND(=) %r0,\spc,%r0 stw,ma \tmp2,0(\tmp) 99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP) -#endif - .endm - - /* Release page_table_lock. */ - .macro ptl_unlock1 spc,tmp,tmp2 -#ifdef CONFIG_TLB_PTLOCK -98: get_ptl \tmp - ptl_unlock0 \spc,\tmp,\tmp2 -99: ALTERNATIVE(98b, 99b, ALT_COND_NO_SMP, INSN_NOP) + insert_nops NUM_PIPELINE_INSNS - 4 +#else + insert_nops NUM_PIPELINE_INSNS - 1 #endif .endm @@ -461,13 +475,13 @@ * to a CPU TLB 4k PFN (4k => 12 bits to shift) */ #define PAGE_ADD_SHIFT (PAGE_SHIFT-12) #define PAGE_ADD_HUGE_SHIFT (REAL_HPAGE_SHIFT-12) + #define PFN_START_BIT (63-ASM_PFN_PTE_SHIFT+(63-58)-PAGE_ADD_SHIFT) /* Drop prot bits and convert to page addr for iitlbt and idtlbt */ .macro convert_for_tlb_insert20 pte,tmp #ifdef CONFIG_HUGETLB_PAGE copy \pte,\tmp - extrd,u \tmp,(63-ASM_PFN_PTE_SHIFT)+(63-58)+PAGE_ADD_SHIFT,\ - 64-PAGE_SHIFT-PAGE_ADD_SHIFT,\pte + extrd,u \tmp,PFN_START_BIT,PFN_START_BIT+1,\pte depdi _PAGE_SIZE_ENCODING_DEFAULT,63,\ (63-58)+PAGE_ADD_SHIFT,\pte @@ -475,8 +489,7 @@ depdi _HUGE_PAGE_SIZE_ENCODING_DEFAULT,63,\ (63-58)+PAGE_ADD_HUGE_SHIFT,\pte #else /* Huge pages disabled */ - extrd,u \pte,(63-ASM_PFN_PTE_SHIFT)+(63-58)+PAGE_ADD_SHIFT,\ - 64-PAGE_SHIFT-PAGE_ADD_SHIFT,\pte + extrd,u \pte,PFN_START_BIT,PFN_START_BIT+1,\pte depdi _PAGE_SIZE_ENCODING_DEFAULT,63,\ (63-58)+PAGE_ADD_SHIFT,\pte #endif @@ -1124,7 +1137,7 @@ idtlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1133,6 +1146,7 @@ idtlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1150,7 +1164,7 @@ idtlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1159,6 +1173,7 @@ idtlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1184,7 +1199,7 @@ mtsp t1, %sr1 /* Restore sr1 */ - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1194,6 +1209,7 @@ idtlba pte,(va) idtlbp prot,(va) + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1217,7 +1233,7 @@ mtsp t1, %sr1 /* Restore sr1 */ - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1227,6 +1243,7 @@ idtlba pte,(va) idtlbp prot,(va) + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1246,7 +1263,7 @@ idtlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1255,6 +1272,7 @@ idtlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1274,7 +1292,7 @@ idtlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1283,6 +1301,7 @@ idtlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1319,7 +1338,7 @@ iitlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1343,7 +1362,7 @@ iitlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1352,6 +1371,7 @@ iitlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1377,7 +1397,7 @@ mtsp t1, %sr1 /* Restore sr1 */ - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1401,7 +1421,7 @@ mtsp t1, %sr1 /* Restore sr1 */ - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1411,6 +1431,7 @@ iitlba pte,(%sr0, va) iitlbp prot,(%sr0, va) + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1431,7 +1452,7 @@ iitlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1451,7 +1472,7 @@ iitlbt pte,prot - ptl_unlock1 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1460,6 +1481,7 @@ iitlbt pte,prot + insert_nops NUM_PIPELINE_INSNS - 1 rfir nop @@ -1481,7 +1503,7 @@ idtlbt pte,prot - ptl_unlock0 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop #else @@ -1507,7 +1529,7 @@ mtsp t1, %sr1 /* Restore sr1 */ - ptl_unlock0 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop @@ -1527,7 +1549,7 @@ idtlbt pte,prot - ptl_unlock0 spc,t0,t1 + ptl_unlock spc,t0,t1 rfir nop #endif --- linux-azure-6.5.0.orig/arch/parisc/kernel/head.S +++ linux-azure-6.5.0/arch/parisc/kernel/head.S @@ -70,9 +70,8 @@ stw,ma %arg2,4(%r1) stw,ma %arg3,4(%r1) -#if !defined(CONFIG_64BIT) && defined(CONFIG_PA20) - /* This 32-bit kernel was compiled for PA2.0 CPUs. Check current CPU - * and halt kernel if we detect a PA1.x CPU. */ +#if defined(CONFIG_PA20) + /* check for 64-bit capable CPU as required by current kernel */ ldi 32,%r10 mtctl %r10,%cr11 .level 2.0 --- linux-azure-6.5.0.orig/arch/parisc/kernel/irq.c +++ linux-azure-6.5.0/arch/parisc/kernel/irq.c @@ -365,7 +365,7 @@ volatile unsigned int lock[1]; }; -DEFINE_PER_CPU(union irq_stack_union, irq_stack_union) = { +static DEFINE_PER_CPU(union irq_stack_union, irq_stack_union) = { .slock = { 1,1,1,1 }, }; #endif --- linux-azure-6.5.0.orig/arch/parisc/kernel/processor.c +++ linux-azure-6.5.0/arch/parisc/kernel/processor.c @@ -378,10 +378,18 @@ show_cpuinfo (struct seq_file *m, void *v) { unsigned long cpu; + char cpu_name[60], *p; + + /* strip PA path from CPU name to not confuse lscpu */ + strlcpy(cpu_name, per_cpu(cpu_data, 0).dev->name, sizeof(cpu_name)); + p = strrchr(cpu_name, '['); + if (p) + *(--p) = 0; for_each_online_cpu(cpu) { - const struct cpuinfo_parisc *cpuinfo = &per_cpu(cpu_data, cpu); #ifdef CONFIG_SMP + const struct cpuinfo_parisc *cpuinfo = &per_cpu(cpu_data, cpu); + if (0 == cpuinfo->hpa) continue; #endif @@ -426,8 +434,7 @@ seq_printf(m, "model\t\t: %s - %s\n", boot_cpu_data.pdc.sys_model_name, - cpuinfo->dev ? - cpuinfo->dev->name : "Unknown"); + cpu_name); seq_printf(m, "hversion\t: 0x%08x\n" "sversion\t: 0x%08x\n", --- linux-azure-6.5.0.orig/arch/parisc/kernel/smp.c +++ linux-azure-6.5.0/arch/parisc/kernel/smp.c @@ -440,7 +440,9 @@ if (cpu_online(cpu)) return 0; - if (num_online_cpus() < setup_max_cpus && smp_boot_one_cpu(cpu, tidle)) + if (num_online_cpus() < nr_cpu_ids && + num_online_cpus() < setup_max_cpus && + smp_boot_one_cpu(cpu, tidle)) return -EIO; return cpu_online(cpu) ? 0 : -EIO; --- linux-azure-6.5.0.orig/arch/parisc/kernel/vmlinux.lds.S +++ linux-azure-6.5.0/arch/parisc/kernel/vmlinux.lds.S @@ -130,6 +130,7 @@ RO_DATA(8) /* unwind info */ + . = ALIGN(4); .PARISC.unwind : { __start___unwind = .; *(.PARISC.unwind) --- linux-azure-6.5.0.orig/arch/powerpc/Kconfig +++ linux-azure-6.5.0/arch/powerpc/Kconfig @@ -917,7 +917,7 @@ default "6" if PPC32 && PPC_64K_PAGES range 4 10 if PPC32 && PPC_256K_PAGES default "4" if PPC32 && PPC_256K_PAGES - range 10 10 + range 10 12 default "10" help The kernel page allocator limits the size of maximal physically --- linux-azure-6.5.0.orig/arch/powerpc/Makefile +++ linux-azure-6.5.0/arch/powerpc/Makefile @@ -224,7 +224,7 @@ all: zImage # With make 3.82 we cannot mix normal and wildcard targets -BOOT_TARGETS1 := zImage zImage.initrd uImage +BOOT_TARGETS1 := zImage zImage.initrd uImage vmlinux.strip BOOT_TARGETS2 := zImage% dtbImage% treeImage.% cuImage.% simpleImage.% uImage.% PHONY += $(BOOT_TARGETS1) $(BOOT_TARGETS2) --- linux-azure-6.5.0.orig/arch/powerpc/configs/skiroot_defconfig +++ linux-azure-6.5.0/arch/powerpc/configs/skiroot_defconfig @@ -302,7 +302,6 @@ CONFIG_DEBUG_SG=y CONFIG_DEBUG_NOTIFIERS=y CONFIG_BUG_ON_DATA_CORRUPTION=y -CONFIG_DEBUG_CREDENTIALS=y # CONFIG_FTRACE is not set CONFIG_XMON=y # CONFIG_RUNTIME_TESTING_MENU is not set --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/cputhreads.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/cputhreads.h @@ -3,6 +3,7 @@ #define _ASM_POWERPC_CPUTHREADS_H #ifndef __ASSEMBLY__ +#include #include #include --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/ftrace.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/ftrace.h @@ -12,7 +12,7 @@ /* Ignore unused weak functions which will have larger offsets */ #ifdef CONFIG_MPROFILE_KERNEL -#define FTRACE_MCOUNT_MAX_OFFSET 12 +#define FTRACE_MCOUNT_MAX_OFFSET 16 #elif defined(CONFIG_PPC32) #define FTRACE_MCOUNT_MAX_OFFSET 8 #endif --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/irq.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/irq.h @@ -55,7 +55,7 @@ #if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_NMI_IPI) extern void arch_trigger_cpumask_backtrace(const cpumask_t *mask, - bool exclude_self); + int exclude_cpu); #define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace #endif --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/lppaca.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/lppaca.h @@ -45,6 +45,7 @@ #include #include #include +#include /* * The lppaca is the "virtual processor area" registered with the hypervisor, @@ -127,13 +128,23 @@ */ #define LPPACA_OLD_SHARED_PROC 2 -static inline bool lppaca_shared_proc(struct lppaca *l) +#ifdef CONFIG_PPC_PSERIES +/* + * All CPUs should have the same shared proc value, so directly access the PACA + * to avoid false positives from DEBUG_PREEMPT. + */ +static inline bool lppaca_shared_proc(void) { + struct lppaca *l = local_paca->lppaca_ptr; + if (!firmware_has_feature(FW_FEATURE_SPLPAR)) return false; return !!(l->__old_status & LPPACA_OLD_SHARED_PROC); } +#define get_lppaca() (get_paca()->lppaca_ptr) +#endif + /* * SLB shadow buffer structure as defined in the PAPR. The save_area * contains adjacent ESID and VSID pairs for each shadowed SLB. The --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/nohash/32/pte-40x.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/nohash/32/pte-40x.h @@ -69,9 +69,6 @@ #define _PTE_NONE_MASK 0 -/* Until my rework is finished, 40x still needs atomic PTE updates */ -#define PTE_ATOMIC_UPDATES 1 - #define _PAGE_BASE_NC (_PAGE_PRESENT | _PAGE_ACCESSED) #define _PAGE_BASE (_PAGE_BASE_NC) --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/nohash/32/pte-8xx.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/nohash/32/pte-8xx.h @@ -94,6 +94,13 @@ #define pte_wrprotect pte_wrprotect +static inline int pte_read(pte_t pte) +{ + return (pte_val(pte) & _PAGE_RO) != _PAGE_NA; +} + +#define pte_read pte_read + static inline int pte_write(pte_t pte) { return !(pte_val(pte) & _PAGE_RO); --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/nohash/64/pgtable.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/nohash/64/pgtable.h @@ -197,7 +197,7 @@ { unsigned long old; - if (pte_young(*ptep)) + if (!pte_young(*ptep)) return 0; old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0, 0); return (old & _PAGE_ACCESSED) != 0; --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/nohash/pgtable.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/nohash/pgtable.h @@ -25,7 +25,9 @@ return pte_val(pte) & _PAGE_RW; } #endif +#ifndef pte_read static inline int pte_read(pte_t pte) { return 1; } +#endif static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } static inline int pte_special(pte_t pte) { return pte_val(pte) & _PAGE_SPECIAL; } static inline int pte_none(pte_t pte) { return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; } --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/paca.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/paca.h @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #ifdef CONFIG_PPC_BOOK3E_64 @@ -47,14 +46,11 @@ #define get_paca() local_paca #endif -#ifdef CONFIG_PPC_PSERIES -#define get_lppaca() (get_paca()->lppaca_ptr) -#endif - #define get_slb_shadow() (get_paca()->slb_shadow_ptr) struct task_struct; struct rtas_args; +struct lppaca; /* * Defines the layout of the paca. --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/paravirt.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/paravirt.h @@ -6,6 +6,7 @@ #include #ifdef CONFIG_PPC64 #include +#include #include #endif --- linux-azure-6.5.0.orig/arch/powerpc/include/asm/plpar_wrappers.h +++ linux-azure-6.5.0/arch/powerpc/include/asm/plpar_wrappers.h @@ -9,6 +9,7 @@ #include #include +#include #include static inline long poll_pending(void) --- linux-azure-6.5.0.orig/arch/powerpc/kernel/entry_32.S +++ linux-azure-6.5.0/arch/powerpc/kernel/entry_32.S @@ -138,8 +138,9 @@ lis r4,icache_44x_need_flush@ha lwz r5,icache_44x_need_flush@l(r4) cmplwi cr0,r5,0 - bne- 2f + bne- .L44x_icache_flush #endif /* CONFIG_PPC_47x */ +.L44x_icache_flush_return: kuep_unlock lwz r4,_LINK(r1) lwz r5,_CCR(r1) @@ -173,10 +174,11 @@ b 1b #ifdef CONFIG_44x -2: li r7,0 +.L44x_icache_flush: + li r7,0 iccci r0,r0 stw r7,icache_44x_need_flush@l(r4) - b 1b + b .L44x_icache_flush_return #endif /* CONFIG_44x */ .globl ret_from_fork --- linux-azure-6.5.0.orig/arch/powerpc/kernel/fadump.c +++ linux-azure-6.5.0/arch/powerpc/kernel/fadump.c @@ -654,6 +654,7 @@ return ret; error_out: fw_dump.fadump_enabled = 0; + fw_dump.reserve_dump_area_size = 0; return 0; } --- linux-azure-6.5.0.orig/arch/powerpc/kernel/fpu.S +++ linux-azure-6.5.0/arch/powerpc/kernel/fpu.S @@ -23,6 +23,15 @@ #include #ifdef CONFIG_VSX +#define __REST_1FPVSR(n,c,base) \ +BEGIN_FTR_SECTION \ + b 2f; \ +END_FTR_SECTION_IFSET(CPU_FTR_VSX); \ + REST_FPR(n,base); \ + b 3f; \ +2: REST_VSR(n,c,base); \ +3: + #define __REST_32FPVSRS(n,c,base) \ BEGIN_FTR_SECTION \ b 2f; \ @@ -41,9 +50,11 @@ 2: SAVE_32VSRS(n,c,base); \ 3: #else +#define __REST_1FPVSR(n,b,base) REST_FPR(n, base) #define __REST_32FPVSRS(n,b,base) REST_32FPRS(n, base) #define __SAVE_32FPVSRS(n,b,base) SAVE_32FPRS(n, base) #endif +#define REST_1FPVSR(n,c,base) __REST_1FPVSR(n,__REG_##c,__REG_##base) #define REST_32FPVSRS(n,c,base) __REST_32FPVSRS(n,__REG_##c,__REG_##base) #define SAVE_32FPVSRS(n,c,base) __SAVE_32FPVSRS(n,__REG_##c,__REG_##base) @@ -67,6 +78,7 @@ SAVE_32FPVSRS(0, R4, R3) mffs fr0 stfd fr0,FPSTATE_FPSCR(r3) + REST_1FPVSR(0, R4, R3) blr EXPORT_SYMBOL(store_fp_state) @@ -138,4 +150,5 @@ 2: SAVE_32FPVSRS(0, R4, R6) mffs fr0 stfd fr0,FPSTATE_FPSCR(r6) + REST_1FPVSR(0, R4, R6) blr --- linux-azure-6.5.0.orig/arch/powerpc/kernel/head_85xx.S +++ linux-azure-6.5.0/arch/powerpc/kernel/head_85xx.S @@ -396,7 +396,7 @@ #ifdef CONFIG_PPC_FPU FP_UNAVAILABLE_EXCEPTION #else - EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, unknown_exception) + EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, emulation_assist_interrupt) #endif /* System Call Interrupt */ --- linux-azure-6.5.0.orig/arch/powerpc/kernel/hw_breakpoint.c +++ linux-azure-6.5.0/arch/powerpc/kernel/hw_breakpoint.c @@ -505,11 +505,13 @@ struct arch_hw_breakpoint *info; int i; + preempt_disable(); + for (i = 0; i < nr_wp_slots(); i++) { if (unlikely(tsk->thread.last_hit_ubp[i])) goto reset; } - return; + goto out; reset: regs_set_return_msr(regs, regs->msr & ~MSR_SE); @@ -518,6 +520,9 @@ __set_breakpoint(i, info); tsk->thread.last_hit_ubp[i] = NULL; } + +out: + preempt_enable(); } static bool is_larx_stcx_instr(int type) @@ -632,6 +637,11 @@ } } +/* + * Handle a DABR or DAWR exception. + * + * Called in atomic context. + */ int hw_breakpoint_handler(struct die_args *args) { bool err = false; @@ -758,6 +768,8 @@ /* * Handle single-step exceptions following a DABR hit. + * + * Called in atomic context. */ static int single_step_dabr_instruction(struct die_args *args) { @@ -815,6 +827,8 @@ /* * Handle debug exception notifications. + * + * Called in atomic context. */ int hw_breakpoint_exceptions_notify( struct notifier_block *unused, unsigned long val, void *data) --- linux-azure-6.5.0.orig/arch/powerpc/kernel/hw_breakpoint_constraints.c +++ linux-azure-6.5.0/arch/powerpc/kernel/hw_breakpoint_constraints.c @@ -131,8 +131,13 @@ int *type, int *size, unsigned long *ea) { struct instruction_op op; + int err; - if (__get_user_instr(*instr, (void __user *)regs->nip)) + pagefault_disable(); + err = __get_user_instr(*instr, (void __user *)regs->nip); + pagefault_enable(); + + if (err) return; analyse_instr(&op, regs, *instr); --- linux-azure-6.5.0.orig/arch/powerpc/kernel/iommu.c +++ linux-azure-6.5.0/arch/powerpc/kernel/iommu.c @@ -172,17 +172,28 @@ return 0; } -static struct notifier_block fail_iommu_bus_notifier = { +/* + * PCI and VIO buses need separate notifier_block structs, since they're linked + * list nodes. Sharing a notifier_block would mean that any notifiers later + * registered for PCI buses would also get called by VIO buses and vice versa. + */ +static struct notifier_block fail_iommu_pci_bus_notifier = { .notifier_call = fail_iommu_bus_notify }; +#ifdef CONFIG_IBMVIO +static struct notifier_block fail_iommu_vio_bus_notifier = { + .notifier_call = fail_iommu_bus_notify +}; +#endif + static int __init fail_iommu_setup(void) { #ifdef CONFIG_PCI - bus_register_notifier(&pci_bus_type, &fail_iommu_bus_notifier); + bus_register_notifier(&pci_bus_type, &fail_iommu_pci_bus_notifier); #endif #ifdef CONFIG_IBMVIO - bus_register_notifier(&vio_bus_type, &fail_iommu_bus_notifier); + bus_register_notifier(&vio_bus_type, &fail_iommu_vio_bus_notifier); #endif return 0; --- linux-azure-6.5.0.orig/arch/powerpc/kernel/module_64.c +++ linux-azure-6.5.0/arch/powerpc/kernel/module_64.c @@ -347,12 +347,13 @@ static void dedotify_versions(struct modversion_info *vers, unsigned long size) { - struct modversion_info *end; + struct modversion_info *end = (void *)vers + size; - for (end = (void *)vers + size; vers < end; vers++) + for (; vers < end && vers->next; vers = (void *)vers + vers->next) { if (vers->name[0] == '.') { memmove(vers->name, vers->name+1, strlen(vers->name)); } + } } /* --- linux-azure-6.5.0.orig/arch/powerpc/kernel/pci-common.c +++ linux-azure-6.5.0/arch/powerpc/kernel/pci-common.c @@ -360,6 +360,7 @@ } return NULL; } +EXPORT_SYMBOL(pci_find_hose_for_OF_device); struct pci_controller *pci_find_controller_for_domain(int domain_nr) { @@ -1631,6 +1632,7 @@ { return pci_bus_find_capability(fake_pci_bus(hose, bus), devfn, cap); } +EXPORT_SYMBOL_GPL(early_find_capability); struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus) { --- linux-azure-6.5.0.orig/arch/powerpc/kernel/process.c +++ linux-azure-6.5.0/arch/powerpc/kernel/process.c @@ -1198,11 +1198,11 @@ usermsr = current->thread.regs->msr; + /* Caller has enabled FP/VEC/VSX/TM in MSR */ if (usermsr & MSR_FP) - save_fpu(current); - + __giveup_fpu(current); if (usermsr & MSR_VEC) - save_altivec(current); + __giveup_altivec(current); #ifdef CONFIG_PPC_TRANSACTIONAL_MEM if (usermsr & MSR_TM) { @@ -2258,6 +2258,22 @@ return ret; } +static bool empty_user_regs(struct pt_regs *regs, struct task_struct *tsk) +{ + unsigned long stack_page; + + // A non-empty pt_regs should never have a zero MSR or TRAP value. + if (regs->msr || regs->trap) + return false; + + // Check it sits at the very base of the stack + stack_page = (unsigned long)task_stack_page(tsk); + if ((unsigned long)(regs + 1) != stack_page + THREAD_SIZE) + return false; + + return true; +} + static int kstack_depth_to_print = CONFIG_PRINT_STACK_DEPTH; void __no_sanitize_address show_stack(struct task_struct *tsk, @@ -2322,9 +2338,13 @@ lr = regs->link; printk("%s--- interrupt: %lx at %pS\n", loglvl, regs->trap, (void *)regs->nip); - __show_regs(regs); - printk("%s--- interrupt: %lx\n", - loglvl, regs->trap); + + // Detect the case of an empty pt_regs at the very base + // of the stack and suppress showing it in full. + if (!empty_user_regs(regs, tsk)) { + __show_regs(regs); + printk("%s--- interrupt: %lx\n", loglvl, regs->trap); + } firstframe = 1; } --- linux-azure-6.5.0.orig/arch/powerpc/kernel/setup-common.c +++ linux-azure-6.5.0/arch/powerpc/kernel/setup-common.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -68,6 +69,7 @@ #include #include #include +#include #include "setup.h" @@ -913,6 +915,16 @@ */ initialize_cache_info(); + /* + * Lock down the kernel if booted in secure mode. This is required to + * maintain kernel integrity. + */ + if (IS_ENABLED(CONFIG_LOCK_DOWN_IN_SECURE_BOOT)) { + if (is_ppc_secureboot_enabled()) + security_lock_kernel_down("PowerNV Secure Boot mode", + LOCKDOWN_INTEGRITY_MAX); + } + /* Initialize RTAS if available. */ rtas_initialize(); @@ -948,6 +960,8 @@ /* Parse memory topology */ mem_topology_setup(); + /* Set max_mapnr before paging_init() */ + set_max_mapnr(max_pfn); /* * Release secondary cpus out of their spinloops at 0x60 now that --- linux-azure-6.5.0.orig/arch/powerpc/kernel/stacktrace.c +++ linux-azure-6.5.0/arch/powerpc/kernel/stacktrace.c @@ -73,29 +73,12 @@ bool firstframe; stack_end = stack_page + THREAD_SIZE; - if (!is_idle_task(task)) { - /* - * For user tasks, this is the SP value loaded on - * kernel entry, see "PACAKSAVE(r13)" in _switch() and - * system_call_common(). - * - * Likewise for non-swapper kernel threads, - * this also happens to be the top of the stack - * as setup by copy_thread(). - * - * Note that stack backlinks are not properly setup by - * copy_thread() and thus, a forked task() will have - * an unreliable stack trace until it's been - * _switch()'ed to for the first time. - */ - stack_end -= STACK_USER_INT_FRAME_SIZE; - } else { - /* - * idle tasks have a custom stack layout, - * c.f. cpu_idle_thread_init(). - */ + + // See copy_thread() for details. + if (task->flags & PF_KTHREAD) stack_end -= STACK_FRAME_MIN_SIZE; - } + else + stack_end -= STACK_USER_INT_FRAME_SIZE; if (task == current) sp = current_stack_frame(); @@ -221,8 +204,8 @@ } } -void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self) +void arch_trigger_cpumask_backtrace(const cpumask_t *mask, int exclude_cpu) { - nmi_trigger_cpumask_backtrace(mask, exclude_self, raise_backtrace_ipi); + nmi_trigger_cpumask_backtrace(mask, exclude_cpu, raise_backtrace_ipi); } #endif /* defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_NMI_IPI) */ --- linux-azure-6.5.0.orig/arch/powerpc/kernel/trace/ftrace_mprofile.S +++ linux-azure-6.5.0/arch/powerpc/kernel/trace/ftrace_mprofile.S @@ -62,7 +62,7 @@ .endif /* Save previous stack pointer (r1) */ - addi r8, r1, SWITCH_FRAME_SIZE + addi r8, r1, SWITCH_FRAME_SIZE+STACK_FRAME_MIN_SIZE PPC_STL r8, GPR1(r1) .if \allregs == 1 @@ -182,7 +182,7 @@ mflr r3 mtctr r3 REST_GPR(3, r1) - addi r1, r1, SWITCH_FRAME_SIZE + addi r1, r1, SWITCH_FRAME_SIZE+STACK_FRAME_MIN_SIZE mtlr r0 bctr #endif --- linux-azure-6.5.0.orig/arch/powerpc/kernel/traps.c +++ linux-azure-6.5.0/arch/powerpc/kernel/traps.c @@ -1164,6 +1164,7 @@ __single_step_exception(regs); } +#ifdef CONFIG_PPC_FPU_REGS static inline int __parse_fpscr(unsigned long fpscr) { int ret = FPE_FLTUNK; @@ -1190,6 +1191,7 @@ return ret; } +#endif static void parse_fpe(struct pt_regs *regs) { @@ -1512,23 +1514,11 @@ return; } - if (cpu_has_feature(CPU_FTR_DEXCR_NPHIE) && user_mode(regs)) { - ppc_inst_t insn; - - if (get_user_instr(insn, (void __user *)regs->nip)) { - _exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip); - return; - } - - if (ppc_inst_primary_opcode(insn) == 31 && - get_xop(ppc_inst_val(insn)) == OP_31_XOP_HASHCHK) { - _exception(SIGILL, regs, ILL_ILLOPN, regs->nip); - return; - } + /* User mode considers other cases after enabling IRQs */ + if (!user_mode(regs)) { + _exception(SIGTRAP, regs, TRAP_BRKPT, regs->nip); + return; } - - _exception(SIGTRAP, regs, TRAP_BRKPT, regs->nip); - return; } #ifdef CONFIG_PPC_TRANSACTIONAL_MEM if (reason & REASON_TM) { @@ -1561,16 +1551,44 @@ /* * If we took the program check in the kernel skip down to sending a - * SIGILL. The subsequent cases all relate to emulating instructions - * which we should only do for userspace. We also do not want to enable - * interrupts for kernel faults because that might lead to further - * faults, and loose the context of the original exception. + * SIGILL. The subsequent cases all relate to user space, such as + * emulating instructions which we should only do for user space. We + * also do not want to enable interrupts for kernel faults because that + * might lead to further faults, and loose the context of the original + * exception. */ if (!user_mode(regs)) goto sigill; interrupt_cond_local_irq_enable(regs); + /* + * (reason & REASON_TRAP) is mostly handled before enabling IRQs, + * except get_user_instr() can sleep so we cannot reliably inspect the + * current instruction in that context. Now that we know we are + * handling a user space trap and can sleep, we can check if the trap + * was a hashchk failure. + */ + if (reason & REASON_TRAP) { + if (cpu_has_feature(CPU_FTR_DEXCR_NPHIE)) { + ppc_inst_t insn; + + if (get_user_instr(insn, (void __user *)regs->nip)) { + _exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip); + return; + } + + if (ppc_inst_primary_opcode(insn) == 31 && + get_xop(ppc_inst_val(insn)) == OP_31_XOP_HASHCHK) { + _exception(SIGILL, regs, ILL_ILLOPN, regs->nip); + return; + } + } + + _exception(SIGTRAP, regs, TRAP_BRKPT, regs->nip); + return; + } + /* (reason & REASON_ILLEGAL) would be the obvious thing here, * but there seems to be a hardware bug on the 405GP (RevD) * that means ESR is sometimes set incorrectly - either to --- linux-azure-6.5.0.orig/arch/powerpc/kernel/vector.S +++ linux-azure-6.5.0/arch/powerpc/kernel/vector.S @@ -33,6 +33,7 @@ mfvscr v0 li r4, VRSTATE_VSCR stvx v0, r4, r3 + lvx v0, 0, r3 blr EXPORT_SYMBOL(store_vr_state) @@ -109,6 +110,7 @@ mfvscr v0 li r4,VRSTATE_VSCR stvx v0,r4,r7 + lvx v0,0,r7 blr #ifdef CONFIG_VSX --- linux-azure-6.5.0.orig/arch/powerpc/kernel/watchdog.c +++ linux-azure-6.5.0/arch/powerpc/kernel/watchdog.c @@ -245,7 +245,7 @@ __cpumask_clear_cpu(c, &wd_smp_cpus_ipi); } } else { - trigger_allbutself_cpu_backtrace(); + trigger_allbutcpu_cpu_backtrace(cpu); cpumask_clear(&wd_smp_cpus_ipi); } @@ -416,7 +416,7 @@ xchg(&__wd_nmi_output, 1); // see wd_lockup_ipi if (sysctl_hardlockup_all_cpu_backtrace) - trigger_allbutself_cpu_backtrace(); + trigger_allbutcpu_cpu_backtrace(cpu); if (hardlockup_panic) nmi_panic(regs, "Hard LOCKUP"); --- linux-azure-6.5.0.orig/arch/powerpc/kvm/book3s_hv_ras.c +++ linux-azure-6.5.0/arch/powerpc/kvm/book3s_hv_ras.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include --- linux-azure-6.5.0.orig/arch/powerpc/lib/qspinlock.c +++ linux-azure-6.5.0/arch/powerpc/lib/qspinlock.c @@ -406,6 +406,9 @@ if ((yield_count & 1) == 0) goto yield_prev; /* owner vcpu is running */ + if (get_owner_cpu(READ_ONCE(lock->val)) != yield_cpu) + goto yield_prev; /* re-sample lock owner */ + spin_end(); preempted = true; --- linux-azure-6.5.0.orig/arch/powerpc/lib/sstep.c +++ linux-azure-6.5.0/arch/powerpc/lib/sstep.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include --- linux-azure-6.5.0.orig/arch/powerpc/mm/book3s64/radix_tlb.c +++ linux-azure-6.5.0/arch/powerpc/mm/book3s64/radix_tlb.c @@ -127,21 +127,6 @@ trace_tlbie(0, 0, rb, rs, ric, prs, r); } -static __always_inline void __tlbie_pid_lpid(unsigned long pid, - unsigned long lpid, - unsigned long ric) -{ - unsigned long rb, rs, prs, r; - - rb = PPC_BIT(53); /* IS = 1 */ - rs = (pid << PPC_BITLSHIFT(31)) | (lpid & ~(PPC_BITMASK(0, 31))); - prs = 1; /* process scoped */ - r = 1; /* radix format */ - - asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1) - : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); - trace_tlbie(0, 0, rb, rs, ric, prs, r); -} static __always_inline void __tlbie_lpid(unsigned long lpid, unsigned long ric) { unsigned long rb,rs,prs,r; @@ -202,23 +187,6 @@ trace_tlbie(0, 0, rb, rs, ric, prs, r); } -static __always_inline void __tlbie_va_lpid(unsigned long va, unsigned long pid, - unsigned long lpid, - unsigned long ap, unsigned long ric) -{ - unsigned long rb, rs, prs, r; - - rb = va & ~(PPC_BITMASK(52, 63)); - rb |= ap << PPC_BITLSHIFT(58); - rs = (pid << PPC_BITLSHIFT(31)) | (lpid & ~(PPC_BITMASK(0, 31))); - prs = 1; /* process scoped */ - r = 1; /* radix format */ - - asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1) - : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); - trace_tlbie(0, 0, rb, rs, ric, prs, r); -} - static __always_inline void __tlbie_lpid_va(unsigned long va, unsigned long lpid, unsigned long ap, unsigned long ric) { @@ -264,22 +232,6 @@ } } -static inline void fixup_tlbie_va_range_lpid(unsigned long va, - unsigned long pid, - unsigned long lpid, - unsigned long ap) -{ - if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) { - asm volatile("ptesync" : : : "memory"); - __tlbie_pid_lpid(0, lpid, RIC_FLUSH_TLB); - } - - if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) { - asm volatile("ptesync" : : : "memory"); - __tlbie_va_lpid(va, pid, lpid, ap, RIC_FLUSH_TLB); - } -} - static inline void fixup_tlbie_pid(unsigned long pid) { /* @@ -299,26 +251,6 @@ } } -static inline void fixup_tlbie_pid_lpid(unsigned long pid, unsigned long lpid) -{ - /* - * We can use any address for the invalidation, pick one which is - * probably unused as an optimisation. - */ - unsigned long va = ((1UL << 52) - 1); - - if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) { - asm volatile("ptesync" : : : "memory"); - __tlbie_pid_lpid(0, lpid, RIC_FLUSH_TLB); - } - - if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) { - asm volatile("ptesync" : : : "memory"); - __tlbie_va_lpid(va, pid, lpid, mmu_get_ap(MMU_PAGE_64K), - RIC_FLUSH_TLB); - } -} - static inline void fixup_tlbie_lpid_va(unsigned long va, unsigned long lpid, unsigned long ap) { @@ -416,31 +348,6 @@ asm volatile("eieio; tlbsync; ptesync": : :"memory"); } -static inline void _tlbie_pid_lpid(unsigned long pid, unsigned long lpid, - unsigned long ric) -{ - asm volatile("ptesync" : : : "memory"); - - /* - * Workaround the fact that the "ric" argument to __tlbie_pid - * must be a compile-time contraint to match the "i" constraint - * in the asm statement. - */ - switch (ric) { - case RIC_FLUSH_TLB: - __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_TLB); - fixup_tlbie_pid_lpid(pid, lpid); - break; - case RIC_FLUSH_PWC: - __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_PWC); - break; - case RIC_FLUSH_ALL: - default: - __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_ALL); - fixup_tlbie_pid_lpid(pid, lpid); - } - asm volatile("eieio; tlbsync; ptesync" : : : "memory"); -} struct tlbiel_pid { unsigned long pid; unsigned long ric; @@ -566,20 +473,6 @@ fixup_tlbie_va_range(addr - page_size, pid, ap); } -static inline void __tlbie_va_range_lpid(unsigned long start, unsigned long end, - unsigned long pid, unsigned long lpid, - unsigned long page_size, - unsigned long psize) -{ - unsigned long addr; - unsigned long ap = mmu_get_ap(psize); - - for (addr = start; addr < end; addr += page_size) - __tlbie_va_lpid(addr, pid, lpid, ap, RIC_FLUSH_TLB); - - fixup_tlbie_va_range_lpid(addr - page_size, pid, lpid, ap); -} - static __always_inline void _tlbie_va(unsigned long va, unsigned long pid, unsigned long psize, unsigned long ric) { @@ -660,18 +553,6 @@ asm volatile("eieio; tlbsync; ptesync": : :"memory"); } -static inline void _tlbie_va_range_lpid(unsigned long start, unsigned long end, - unsigned long pid, unsigned long lpid, - unsigned long page_size, - unsigned long psize, bool also_pwc) -{ - asm volatile("ptesync" : : : "memory"); - if (also_pwc) - __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_PWC); - __tlbie_va_range_lpid(start, end, pid, lpid, page_size, psize); - asm volatile("eieio; tlbsync; ptesync" : : : "memory"); -} - static inline void _tlbiel_va_range_multicast(struct mm_struct *mm, unsigned long start, unsigned long end, unsigned long pid, unsigned long page_size, @@ -1486,6 +1367,127 @@ } #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE +static __always_inline void __tlbie_pid_lpid(unsigned long pid, + unsigned long lpid, + unsigned long ric) +{ + unsigned long rb, rs, prs, r; + + rb = PPC_BIT(53); /* IS = 1 */ + rs = (pid << PPC_BITLSHIFT(31)) | (lpid & ~(PPC_BITMASK(0, 31))); + prs = 1; /* process scoped */ + r = 1; /* radix format */ + + asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1) + : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); + trace_tlbie(0, 0, rb, rs, ric, prs, r); +} + +static __always_inline void __tlbie_va_lpid(unsigned long va, unsigned long pid, + unsigned long lpid, + unsigned long ap, unsigned long ric) +{ + unsigned long rb, rs, prs, r; + + rb = va & ~(PPC_BITMASK(52, 63)); + rb |= ap << PPC_BITLSHIFT(58); + rs = (pid << PPC_BITLSHIFT(31)) | (lpid & ~(PPC_BITMASK(0, 31))); + prs = 1; /* process scoped */ + r = 1; /* radix format */ + + asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1) + : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); + trace_tlbie(0, 0, rb, rs, ric, prs, r); +} + +static inline void fixup_tlbie_pid_lpid(unsigned long pid, unsigned long lpid) +{ + /* + * We can use any address for the invalidation, pick one which is + * probably unused as an optimisation. + */ + unsigned long va = ((1UL << 52) - 1); + + if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) { + asm volatile("ptesync" : : : "memory"); + __tlbie_pid_lpid(0, lpid, RIC_FLUSH_TLB); + } + + if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) { + asm volatile("ptesync" : : : "memory"); + __tlbie_va_lpid(va, pid, lpid, mmu_get_ap(MMU_PAGE_64K), + RIC_FLUSH_TLB); + } +} + +static inline void _tlbie_pid_lpid(unsigned long pid, unsigned long lpid, + unsigned long ric) +{ + asm volatile("ptesync" : : : "memory"); + + /* + * Workaround the fact that the "ric" argument to __tlbie_pid + * must be a compile-time contraint to match the "i" constraint + * in the asm statement. + */ + switch (ric) { + case RIC_FLUSH_TLB: + __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_TLB); + fixup_tlbie_pid_lpid(pid, lpid); + break; + case RIC_FLUSH_PWC: + __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_PWC); + break; + case RIC_FLUSH_ALL: + default: + __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_ALL); + fixup_tlbie_pid_lpid(pid, lpid); + } + asm volatile("eieio; tlbsync; ptesync" : : : "memory"); +} + +static inline void fixup_tlbie_va_range_lpid(unsigned long va, + unsigned long pid, + unsigned long lpid, + unsigned long ap) +{ + if (cpu_has_feature(CPU_FTR_P9_TLBIE_ERAT_BUG)) { + asm volatile("ptesync" : : : "memory"); + __tlbie_pid_lpid(0, lpid, RIC_FLUSH_TLB); + } + + if (cpu_has_feature(CPU_FTR_P9_TLBIE_STQ_BUG)) { + asm volatile("ptesync" : : : "memory"); + __tlbie_va_lpid(va, pid, lpid, ap, RIC_FLUSH_TLB); + } +} + +static inline void __tlbie_va_range_lpid(unsigned long start, unsigned long end, + unsigned long pid, unsigned long lpid, + unsigned long page_size, + unsigned long psize) +{ + unsigned long addr; + unsigned long ap = mmu_get_ap(psize); + + for (addr = start; addr < end; addr += page_size) + __tlbie_va_lpid(addr, pid, lpid, ap, RIC_FLUSH_TLB); + + fixup_tlbie_va_range_lpid(addr - page_size, pid, lpid, ap); +} + +static inline void _tlbie_va_range_lpid(unsigned long start, unsigned long end, + unsigned long pid, unsigned long lpid, + unsigned long page_size, + unsigned long psize, bool also_pwc) +{ + asm volatile("ptesync" : : : "memory"); + if (also_pwc) + __tlbie_pid_lpid(pid, lpid, RIC_FLUSH_PWC); + __tlbie_va_range_lpid(start, end, pid, lpid, page_size, psize); + asm volatile("eieio; tlbsync; ptesync" : : : "memory"); +} + /* * Performs process-scoped invalidations for a given LPID * as part of H_RPT_INVALIDATE hcall. --- linux-azure-6.5.0.orig/arch/powerpc/mm/book3s64/slb.c +++ linux-azure-6.5.0/arch/powerpc/mm/book3s64/slb.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include --- linux-azure-6.5.0.orig/arch/powerpc/mm/mem.c +++ linux-azure-6.5.0/arch/powerpc/mm/mem.c @@ -288,7 +288,6 @@ #endif high_memory = (void *) __va(max_low_pfn * PAGE_SIZE); - set_max_mapnr(max_pfn); kasan_late_init(); --- linux-azure-6.5.0.orig/arch/powerpc/perf/core-book3s.c +++ linux-azure-6.5.0/arch/powerpc/perf/core-book3s.c @@ -1371,8 +1371,7 @@ /* * Disable instruction sampling if it was enabled */ - if (cpuhw->mmcr.mmcra & MMCRA_SAMPLE_ENABLE) - val &= ~MMCRA_SAMPLE_ENABLE; + val &= ~MMCRA_SAMPLE_ENABLE; /* Disable BHRB via mmcra (BHRBRD) for p10 */ if (ppmu->flags & PPMU_ARCH_31) @@ -1383,7 +1382,7 @@ * instruction sampling or BHRB. */ if (val != mmcra) { - mtspr(SPRN_MMCRA, mmcra); + mtspr(SPRN_MMCRA, val); mb(); isync(); } --- linux-azure-6.5.0.orig/arch/powerpc/perf/core-fsl-emb.c +++ linux-azure-6.5.0/arch/powerpc/perf/core-fsl-emb.c @@ -645,7 +645,6 @@ struct cpu_hw_events *cpuhw = this_cpu_ptr(&cpu_hw_events); struct perf_event *event; unsigned long val; - int found = 0; for (i = 0; i < ppmu->n_counter; ++i) { event = cpuhw->event[i]; @@ -654,7 +653,6 @@ if ((int)val < 0) { if (event) { /* event has overflowed */ - found = 1; record_and_restart(event, val, regs); } else { /* @@ -672,11 +670,13 @@ isync(); } -void hw_perf_event_setup(int cpu) +static int fsl_emb_pmu_prepare_cpu(unsigned int cpu) { struct cpu_hw_events *cpuhw = &per_cpu(cpu_hw_events, cpu); memset(cpuhw, 0, sizeof(*cpuhw)); + + return 0; } int register_fsl_emb_pmu(struct fsl_emb_pmu *pmu) @@ -689,6 +689,8 @@ pmu->name); perf_pmu_register(&fsl_emb_pmu, "cpu", PERF_TYPE_RAW); + cpuhp_setup_state(CPUHP_PERF_POWER, "perf/powerpc:prepare", + fsl_emb_pmu_prepare_cpu, NULL); return 0; } --- linux-azure-6.5.0.orig/arch/powerpc/perf/hv-24x7.c +++ linux-azure-6.5.0/arch/powerpc/perf/hv-24x7.c @@ -1418,7 +1418,7 @@ } domain = event_get_domain(event); - if (domain >= HV_PERF_DOMAIN_MAX) { + if (domain == 0 || domain >= HV_PERF_DOMAIN_MAX) { pr_devel("invalid domain %d\n", domain); return -EINVAL; } --- linux-azure-6.5.0.orig/arch/powerpc/perf/imc-pmu.c +++ linux-azure-6.5.0/arch/powerpc/perf/imc-pmu.c @@ -51,7 +51,7 @@ * core and trace-imc */ static struct imc_pmu_ref imc_global_refc = { - .lock = __SPIN_LOCK_INITIALIZER(imc_global_refc.lock), + .lock = __SPIN_LOCK_UNLOCKED(imc_global_refc.lock), .id = 0, .refc = 0, }; --- linux-azure-6.5.0.orig/arch/powerpc/platforms/book3s/vas-api.c +++ linux-azure-6.5.0/arch/powerpc/platforms/book3s/vas-api.c @@ -4,6 +4,8 @@ * Copyright (C) 2019 Haren Myneni, IBM Corp */ +#define pr_fmt(fmt) "vas-api: " fmt + #include #include #include @@ -78,7 +80,7 @@ task_ref->mm = get_task_mm(current); if (!task_ref->mm) { put_pid(task_ref->pid); - pr_err("VAS: pid(%d): mm_struct is not found\n", + pr_err("pid(%d): mm_struct is not found\n", current->pid); return -EPERM; } @@ -235,8 +237,7 @@ rc = kill_pid_info(SIGSEGV, &info, pid); rcu_read_unlock(); - pr_devel("%s(): pid %d kill_proc_info() rc %d\n", __func__, - pid_vnr(pid), rc); + pr_devel("pid %d kill_proc_info() rc %d\n", pid_vnr(pid), rc); } void vas_dump_crb(struct coprocessor_request_block *crb) @@ -294,7 +295,7 @@ rc = copy_from_user(&uattr, uptr, sizeof(uattr)); if (rc) { - pr_err("%s(): copy_from_user() returns %d\n", __func__, rc); + pr_err("copy_from_user() returns %d\n", rc); return -EFAULT; } @@ -311,7 +312,7 @@ txwin = cp_inst->coproc->vops->open_win(uattr.vas_id, uattr.flags, cp_inst->coproc->cop_type); if (IS_ERR(txwin)) { - pr_err("%s() VAS window open failed, %ld\n", __func__, + pr_err_ratelimited("VAS window open failed rc=%ld\n", PTR_ERR(txwin)); return PTR_ERR(txwin); } @@ -405,8 +406,7 @@ * window is not opened. Shouldn't expect this error. */ if (!cp_inst || !cp_inst->txwin) { - pr_err("%s(): Unexpected fault on paste address with TX window closed\n", - __func__); + pr_err("Unexpected fault on paste address with TX window closed\n"); return VM_FAULT_SIGBUS; } @@ -421,8 +421,7 @@ * issue NX request. */ if (txwin->task_ref.vma != vmf->vma) { - pr_err("%s(): No previous mapping with paste address\n", - __func__); + pr_err("No previous mapping with paste address\n"); return VM_FAULT_SIGBUS; } @@ -481,19 +480,19 @@ txwin = cp_inst->txwin; if ((vma->vm_end - vma->vm_start) > PAGE_SIZE) { - pr_debug("%s(): size 0x%zx, PAGE_SIZE 0x%zx\n", __func__, + pr_debug("size 0x%zx, PAGE_SIZE 0x%zx\n", (vma->vm_end - vma->vm_start), PAGE_SIZE); return -EINVAL; } /* Ensure instance has an open send window */ if (!txwin) { - pr_err("%s(): No send window open?\n", __func__); + pr_err("No send window open?\n"); return -EINVAL; } if (!cp_inst->coproc->vops || !cp_inst->coproc->vops->paste_addr) { - pr_err("%s(): VAS API is not registered\n", __func__); + pr_err("VAS API is not registered\n"); return -EACCES; } @@ -510,14 +509,14 @@ */ mutex_lock(&txwin->task_ref.mmap_mutex); if (txwin->status != VAS_WIN_ACTIVE) { - pr_err("%s(): Window is not active\n", __func__); + pr_err("Window is not active\n"); rc = -EACCES; goto out; } paste_addr = cp_inst->coproc->vops->paste_addr(txwin); if (!paste_addr) { - pr_err("%s(): Window paste address failed\n", __func__); + pr_err("Window paste address failed\n"); rc = -EINVAL; goto out; } @@ -533,8 +532,8 @@ rc = remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, vma->vm_end - vma->vm_start, prot); - pr_devel("%s(): paste addr %llx at %lx, rc %d\n", __func__, - paste_addr, vma->vm_start, rc); + pr_devel("paste addr %llx at %lx, rc %d\n", paste_addr, + vma->vm_start, rc); txwin->task_ref.vma = vma; vma->vm_ops = &vas_vm_ops; @@ -609,8 +608,7 @@ goto err; } - pr_devel("%s: Added dev [%d,%d]\n", __func__, MAJOR(devno), - MINOR(devno)); + pr_devel("Added dev [%d,%d]\n", MAJOR(devno), MINOR(devno)); return 0; --- linux-azure-6.5.0.orig/arch/powerpc/platforms/powernv/opal-prd.c +++ linux-azure-6.5.0/arch/powerpc/platforms/powernv/opal-prd.c @@ -24,13 +24,20 @@ #include +struct opal_prd_msg { + union { + struct opal_prd_msg_header header; + DECLARE_FLEX_ARRAY(u8, data); + }; +}; + /* * The msg member must be at the end of the struct, as it's followed by the * message data. */ struct opal_prd_msg_queue_item { - struct list_head list; - struct opal_prd_msg_header msg; + struct list_head list; + struct opal_prd_msg msg; }; static struct device_node *prd_node; @@ -156,7 +163,7 @@ int rc; /* we need at least a header's worth of data */ - if (count < sizeof(item->msg)) + if (count < sizeof(item->msg.header)) return -EINVAL; if (*ppos) @@ -186,7 +193,7 @@ return -EINTR; } - size = be16_to_cpu(item->msg.size); + size = be16_to_cpu(item->msg.header.size); if (size > count) { err = -EINVAL; goto err_requeue; @@ -352,7 +359,7 @@ if (!item) return -ENOMEM; - memcpy(&item->msg, msg->params, msg_size); + memcpy(&item->msg.data, msg->params, msg_size); spin_lock_irqsave(&opal_prd_msg_queue_lock, flags); list_add_tail(&item->list, &opal_prd_msg_queue); --- linux-azure-6.5.0.orig/arch/powerpc/platforms/pseries/hvCall.S +++ linux-azure-6.5.0/arch/powerpc/platforms/pseries/hvCall.S @@ -91,6 +91,7 @@ b 1f; \ END_FTR_SECTION(0, 1); \ LOAD_REG_ADDR(r12, hcall_tracepoint_refcount) ; \ + ld r12,0(r12); \ std r12,32(r1); \ cmpdi r12,0; \ bne- LABEL; \ @@ -184,7 +185,6 @@ plpar_hcall_trace: HCALL_INST_PRECALL(R5) - std r4,STK_PARAM(R4)(r1) mr r0,r4 mr r4,r5 @@ -196,7 +196,7 @@ HVSC - ld r12,STK_PARAM(R4)(r1) + ld r12,STACK_FRAME_MIN_SIZE+STK_PARAM(R4)(r1) std r4,0(r12) std r5,8(r12) std r6,16(r12) @@ -296,7 +296,6 @@ plpar_hcall9_trace: HCALL_INST_PRECALL(R5) - std r4,STK_PARAM(R4)(r1) mr r0,r4 mr r4,r5 --- linux-azure-6.5.0.orig/arch/powerpc/platforms/pseries/ibmebus.c +++ linux-azure-6.5.0/arch/powerpc/platforms/pseries/ibmebus.c @@ -460,6 +460,7 @@ if (err) { printk(KERN_WARNING "%s: device_register returned %i\n", __func__, err); + put_device(&ibmebus_bus_device); bus_unregister(&ibmebus_bus_type); return err; --- linux-azure-6.5.0.orig/arch/powerpc/platforms/pseries/iommu.c +++ linux-azure-6.5.0/arch/powerpc/platforms/pseries/iommu.c @@ -916,7 +916,8 @@ return 0; } -static bool find_existing_ddw(struct device_node *pdn, u64 *dma_addr, int *window_shift) +static bool find_existing_ddw(struct device_node *pdn, u64 *dma_addr, int *window_shift, + bool *direct_mapping) { struct dma_win *window; const struct dynamic_dma_window_prop *dma64; @@ -929,6 +930,7 @@ dma64 = window->prop; *dma_addr = be64_to_cpu(dma64->dma_base); *window_shift = be32_to_cpu(dma64->window_shift); + *direct_mapping = window->direct; found = true; break; } @@ -1272,10 +1274,8 @@ mutex_lock(&dma_win_init_mutex); - if (find_existing_ddw(pdn, &dev->dev.archdata.dma_offset, &len)) { - direct_mapping = (len >= max_ram_len); + if (find_existing_ddw(pdn, &dev->dev.archdata.dma_offset, &len, &direct_mapping)) goto out_unlock; - } /* * If we already went through this for a previous function of --- linux-azure-6.5.0.orig/arch/powerpc/platforms/pseries/lpar.c +++ linux-azure-6.5.0/arch/powerpc/platforms/pseries/lpar.c @@ -525,8 +525,10 @@ if (cmd) { rc = init_cpu_associativity(); - if (rc) + if (rc) { + destroy_cpu_associativity(); goto out; + } for_each_possible_cpu(cpu) { disp = per_cpu_ptr(&vcpu_disp_data, cpu); @@ -639,16 +641,8 @@ static int __init vcpudispatch_stats_procfs_init(void) { - /* - * Avoid smp_processor_id while preemptible. All CPUs should have - * the same value for lppaca_shared_proc. - */ - preempt_disable(); - if (!lppaca_shared_proc(get_lppaca())) { - preempt_enable(); + if (!lppaca_shared_proc()) return 0; - } - preempt_enable(); if (!proc_create("powerpc/vcpudispatch_stats", 0600, NULL, &vcpudispatch_stats_proc_ops)) --- linux-azure-6.5.0.orig/arch/powerpc/platforms/pseries/lparcfg.c +++ linux-azure-6.5.0/arch/powerpc/platforms/pseries/lparcfg.c @@ -206,7 +206,7 @@ ppp_data.active_system_procs); /* pool related entries are appropriate for shared configs */ - if (lppaca_shared_proc(get_lppaca())) { + if (lppaca_shared_proc()) { unsigned long pool_idle_time, pool_procs; seq_printf(m, "pool=%d\n", ppp_data.pool_num); @@ -560,7 +560,7 @@ partition_potential_processors); seq_printf(m, "shared_processor_mode=%d\n", - lppaca_shared_proc(get_lppaca())); + lppaca_shared_proc()); #ifdef CONFIG_PPC_64S_HASH_MMU if (!radix_enabled()) --- linux-azure-6.5.0.orig/arch/powerpc/platforms/pseries/setup.c +++ linux-azure-6.5.0/arch/powerpc/platforms/pseries/setup.c @@ -847,7 +847,7 @@ if (firmware_has_feature(FW_FEATURE_LPAR)) { vpa_init(boot_cpuid); - if (lppaca_shared_proc(get_lppaca())) { + if (lppaca_shared_proc()) { static_branch_enable(&shared_processor); pv_spinlocks_init(); #ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING --- linux-azure-6.5.0.orig/arch/powerpc/platforms/pseries/vas.c +++ linux-azure-6.5.0/arch/powerpc/platforms/pseries/vas.c @@ -340,7 +340,7 @@ if (atomic_inc_return(&cop_feat_caps->nr_used_credits) > atomic_read(&cop_feat_caps->nr_total_credits)) { - pr_err("Credits are not available to allocate window\n"); + pr_err_ratelimited("Credits are not available to allocate window\n"); rc = -EINVAL; goto out; } @@ -384,11 +384,15 @@ * same fault IRQ is not freed by the OS before. */ mutex_lock(&vas_pseries_mutex); - if (migration_in_progress) + if (migration_in_progress) { rc = -EBUSY; - else + } else { rc = allocate_setup_window(txwin, (u64 *)&domain[0], cop_feat_caps->win_type); + if (!rc) + caps->nr_open_wins_progress++; + } + mutex_unlock(&vas_pseries_mutex); if (rc) goto out; @@ -403,8 +407,17 @@ goto out_free; txwin->win_type = cop_feat_caps->win_type; - mutex_lock(&vas_pseries_mutex); + /* + * The migration SUSPEND thread sets migration_in_progress and + * closes all open windows from the list. But the window is + * added to the list after open and modify HCALLs. So possible + * that migration_in_progress is set before modify HCALL which + * may cause some windows are still open when the hypervisor + * initiates the migration. + * So checks the migration_in_progress flag again and close all + * open windows. + * * Possible to lose the acquired credit with DLPAR core * removal after the window is opened. So if there are any * closed windows (means with lost credits), do not give new @@ -412,9 +425,11 @@ * after the existing windows are reopened when credits are * available. */ - if (!caps->nr_close_wins) { + mutex_lock(&vas_pseries_mutex); + if (!caps->nr_close_wins && !migration_in_progress) { list_add(&txwin->win_list, &caps->list); caps->nr_open_windows++; + caps->nr_open_wins_progress--; mutex_unlock(&vas_pseries_mutex); vas_user_win_add_mm_context(&txwin->vas_win.task_ref); return &txwin->vas_win; @@ -423,7 +438,7 @@ put_vas_user_win_ref(&txwin->vas_win.task_ref); rc = -EBUSY; - pr_err("No credit is available to allocate window\n"); + pr_err_ratelimited("No credit is available to allocate window\n"); out_free: /* @@ -432,6 +447,12 @@ */ free_irq_setup(txwin); h_deallocate_vas_window(txwin->vas_win.winid); + /* + * Hold mutex and reduce nr_open_wins_progress counter. + */ + mutex_lock(&vas_pseries_mutex); + caps->nr_open_wins_progress--; + mutex_unlock(&vas_pseries_mutex); out: atomic_dec(&cop_feat_caps->nr_used_credits); kfree(txwin); @@ -936,14 +957,14 @@ struct vas_caps *vcaps; int i, rc = 0; + pr_info("VAS migration event %d\n", action); + /* * NX-GZIP is not enabled. Nothing to do for migration. */ if (!copypaste_feat) return rc; - mutex_lock(&vas_pseries_mutex); - if (action == VAS_SUSPEND) migration_in_progress = true; else @@ -989,12 +1010,27 @@ switch (action) { case VAS_SUSPEND: + mutex_lock(&vas_pseries_mutex); rc = reconfig_close_windows(vcaps, vcaps->nr_open_windows, true); + /* + * Windows are included in the list after successful + * open. So wait for closing these in-progress open + * windows in vas_allocate_window() which will be + * done if the migration_in_progress is set. + */ + while (vcaps->nr_open_wins_progress) { + mutex_unlock(&vas_pseries_mutex); + msleep(10); + mutex_lock(&vas_pseries_mutex); + } + mutex_unlock(&vas_pseries_mutex); break; case VAS_RESUME: + mutex_lock(&vas_pseries_mutex); atomic_set(&caps->nr_total_credits, new_nr_creds); rc = reconfig_open_windows(vcaps, new_nr_creds, true); + mutex_unlock(&vas_pseries_mutex); break; default: /* should not happen */ @@ -1010,8 +1046,9 @@ goto out; } + pr_info("VAS migration event (%d) successful\n", action); + out: - mutex_unlock(&vas_pseries_mutex); return rc; } --- linux-azure-6.5.0.orig/arch/powerpc/platforms/pseries/vas.h +++ linux-azure-6.5.0/arch/powerpc/platforms/pseries/vas.h @@ -91,6 +91,8 @@ struct vas_caps { struct vas_cop_feat_caps caps; struct list_head list; /* List of open windows */ + int nr_open_wins_progress; /* Number of open windows in */ + /* progress. Used in migration */ int nr_close_wins; /* closed windows in the hypervisor for DLPAR */ int nr_open_windows; /* Number of successful open windows */ u8 feat; /* Feature type */ --- linux-azure-6.5.0.orig/arch/powerpc/platforms/pseries/vio.c +++ linux-azure-6.5.0/arch/powerpc/platforms/pseries/vio.c @@ -39,7 +39,6 @@ .name = "vio", .type = "", .dev.init_name = "vio", - .dev.bus = &vio_bus_type, }; #ifdef CONFIG_PPC_SMLPAR --- linux-azure-6.5.0.orig/arch/powerpc/sysdev/mpc5xxx_clocks.c +++ linux-azure-6.5.0/arch/powerpc/sysdev/mpc5xxx_clocks.c @@ -25,8 +25,10 @@ fwnode_for_each_parent_node(fwnode, parent) { ret = fwnode_property_read_u32(parent, "bus-frequency", &bus_freq); - if (!ret) + if (!ret) { + fwnode_handle_put(parent); return bus_freq; + } } return 0; --- linux-azure-6.5.0.orig/arch/powerpc/sysdev/xive/native.c +++ linux-azure-6.5.0/arch/powerpc/sysdev/xive/native.c @@ -802,7 +802,7 @@ if (out_qpage) *out_qpage = be64_to_cpu(qpage); if (out_qsize) - *out_qsize = be32_to_cpu(qsize); + *out_qsize = be64_to_cpu(qsize); if (out_qeoi_page) *out_qeoi_page = be64_to_cpu(qeoi_page); if (out_escalate_irq) --- linux-azure-6.5.0.orig/arch/powerpc/xmon/xmon.c +++ linux-azure-6.5.0/arch/powerpc/xmon/xmon.c @@ -58,6 +58,7 @@ #ifdef CONFIG_PPC64 #include #include +#include #endif #include "nonstdio.h" --- linux-azure-6.5.0.orig/arch/riscv/Kconfig +++ linux-azure-6.5.0/arch/riscv/Kconfig @@ -62,6 +62,7 @@ select COMMON_CLK select CPU_PM if CPU_IDLE || HIBERNATION select EDAC_SUPPORT + select FRAME_POINTER if PERF_EVENTS || (FUNCTION_TRACER && !DYNAMIC_FTRACE) select GENERIC_ARCH_TOPOLOGY select GENERIC_ATOMIC64 if !64BIT select GENERIC_CLOCKEVENTS_BROADCAST if SMP --- linux-azure-6.5.0.orig/arch/riscv/Kconfig.socs +++ linux-azure-6.5.0/arch/riscv/Kconfig.socs @@ -29,6 +29,7 @@ bool "StarFive SoCs" select PINCTRL select RESET_CONTROLLER + select ARM_AMBA help This enables support for StarFive SoC platform hardware. --- linux-azure-6.5.0.orig/arch/riscv/Makefile +++ linux-azure-6.5.0/arch/riscv/Makefile @@ -6,7 +6,6 @@ # for more details. # -OBJCOPYFLAGS := -O binary LDFLAGS_vmlinux := -z norelro ifeq ($(CONFIG_RELOCATABLE),y) LDFLAGS_vmlinux += -shared -Bsymbolic -z notext --emit-relocs @@ -87,9 +86,6 @@ ifeq ($(CONFIG_CMODEL_MEDANY),y) KBUILD_CFLAGS += -mcmodel=medany endif -ifeq ($(CONFIG_PERF_EVENTS),y) - KBUILD_CFLAGS += -fno-omit-frame-pointer -endif # Avoid generating .eh_frame sections. KBUILD_CFLAGS += -fno-asynchronous-unwind-tables -fno-unwind-tables --- linux-azure-6.5.0.orig/arch/riscv/boot/Makefile +++ linux-azure-6.5.0/arch/riscv/boot/Makefile @@ -17,6 +17,7 @@ KCOV_INSTRUMENT := n OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S +OBJCOPYFLAGS_loader.bin :=-O binary OBJCOPYFLAGS_xipImage :=-O binary -R .note -R .note.gnu.build-id -R .comment -S targets := Image Image.* loader loader.o loader.lds loader.bin --- linux-azure-6.5.0.orig/arch/riscv/boot/dts/allwinner/sun20i-d1s.dtsi +++ linux-azure-6.5.0/arch/riscv/boot/dts/allwinner/sun20i-d1s.dtsi @@ -30,7 +30,6 @@ cpu0_intc: interrupt-controller { compatible = "riscv,cpu-intc"; interrupt-controller; - #address-cells = <0>; #interrupt-cells = <1>; }; }; --- linux-azure-6.5.0.orig/arch/riscv/boot/dts/microchip/mpfs-icicle-kit.dts +++ linux-azure-6.5.0/arch/riscv/boot/dts/microchip/mpfs-icicle-kit.dts @@ -167,9 +167,11 @@ status = "okay"; }; +/* UBUNTU: PCIe support is not yet ready, so disable it for now &pcie { status = "okay"; }; +*/ &qspi { status = "okay"; --- linux-azure-6.5.0.orig/arch/riscv/boot/dts/sifive/fu740-c000.dtsi +++ linux-azure-6.5.0/arch/riscv/boot/dts/sifive/fu740-c000.dtsi @@ -39,7 +39,7 @@ }; }; cpu1: cpu@1 { - compatible = "sifive,bullet0", "riscv"; + compatible = "sifive,u74-mc", "sifive,bullet0", "riscv"; d-cache-block-size = <64>; d-cache-sets = <64>; d-cache-size = <32768>; @@ -63,7 +63,7 @@ }; }; cpu2: cpu@2 { - compatible = "sifive,bullet0", "riscv"; + compatible = "sifive,u74-mc", "sifive,bullet0", "riscv"; d-cache-block-size = <64>; d-cache-sets = <64>; d-cache-size = <32768>; @@ -87,7 +87,7 @@ }; }; cpu3: cpu@3 { - compatible = "sifive,bullet0", "riscv"; + compatible = "sifive,u74-mc", "sifive,bullet0", "riscv"; d-cache-block-size = <64>; d-cache-sets = <64>; d-cache-size = <32768>; @@ -111,7 +111,7 @@ }; }; cpu4: cpu@4 { - compatible = "sifive,bullet0", "riscv"; + compatible = "sifive,u74-mc", "sifive,bullet0", "riscv"; d-cache-block-size = <64>; d-cache-sets = <64>; d-cache-size = <32768>; --- linux-azure-6.5.0.orig/arch/riscv/boot/dts/sifive/hifive-unleashed-a00-microsemi.dts +++ linux-azure-6.5.0/arch/riscv/boot/dts/sifive/hifive-unleashed-a00-microsemi.dts @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: (GPL-2.0 OR MIT) + +#include "hifive-unleashed-a00.dts" + +/ { + soc { + pcie: pcie@2030000000 { + #address-cells = <0x3>; + #interrupt-cells = <0x1>; + #size-cells = <0x2>; + compatible = "microsemi,ms-pf-axi-pcie-host"; + device_type = "pci"; + bus-range = <0x01 0x7f>; + interrupt-map = <0 0 0 1 &ms_pcie_intc 0 0 0 0 2 &ms_pcie_intc 1 0 0 0 3 &ms_pcie_intc 2 0 0 0 4 &ms_pcie_intc 3>; + interrupt-map-mask = <0 0 0 7>; + interrupt-parent = <&plic0>; + interrupts = <32>; + ranges = <0x3000000 0x0 0x40000000 0x0 0x40000000 0x0 0x20000000>; + reg = <0x20 0x30000000 0x0 0x4000000 0x20 0x0 0x0 0x100000>; + reg-names = "control", "apb"; + ms_pcie_intc: interrupt-controller { + #address-cells = <0>; + #interrupt-cells = <1>; + interrupt-controller; + }; + }; + }; +}; --- linux-azure-6.5.0.orig/arch/riscv/boot/dts/thead/th1520.dtsi +++ linux-azure-6.5.0/arch/riscv/boot/dts/thead/th1520.dtsi @@ -139,6 +139,7 @@ interrupt-parent = <&plic>; #address-cells = <2>; #size-cells = <2>; + dma-noncoherent; ranges; plic: interrupt-controller@ffd8000000 { --- linux-azure-6.5.0.orig/arch/riscv/include/asm/asm-prototypes.h +++ linux-azure-6.5.0/arch/riscv/include/asm/asm-prototypes.h @@ -25,7 +25,6 @@ DECLARE_DO_ERROR_INFO(do_trap_ecall_m); DECLARE_DO_ERROR_INFO(do_trap_break); -asmlinkage unsigned long get_overflow_stack(void); asmlinkage void handle_bad_stack(struct pt_regs *regs); asmlinkage void do_page_fault(struct pt_regs *regs); asmlinkage void do_irq(struct pt_regs *regs); --- linux-azure-6.5.0.orig/arch/riscv/include/asm/asm.h +++ linux-azure-6.5.0/arch/riscv/include/asm/asm.h @@ -82,6 +82,28 @@ .endr .endm +#ifdef CONFIG_SMP +#ifdef CONFIG_32BIT +#define PER_CPU_OFFSET_SHIFT 2 +#else +#define PER_CPU_OFFSET_SHIFT 3 +#endif + +.macro asm_per_cpu dst sym tmp + REG_L \tmp, TASK_TI_CPU_NUM(tp) + slli \tmp, \tmp, PER_CPU_OFFSET_SHIFT + la \dst, __per_cpu_offset + add \dst, \dst, \tmp + REG_L \tmp, 0(\dst) + la \dst, \sym + add \dst, \dst, \tmp +.endm +#else /* CONFIG_SMP */ +.macro asm_per_cpu dst sym tmp + la \dst, \sym +.endm +#endif /* CONFIG_SMP */ + /* save all GPs except x1 ~ x5 */ .macro save_from_x6_to_x31 REG_S x6, PT_T1(sp) --- linux-azure-6.5.0.orig/arch/riscv/include/asm/errata_list.h +++ linux-azure-6.5.0/arch/riscv/include/asm/errata_list.h @@ -100,7 +100,7 @@ * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | * 0000001 01001 rs1 000 00000 0001011 * dcache.cva rs1 (clean, virtual address) - * 0000001 00100 rs1 000 00000 0001011 + * 0000001 00101 rs1 000 00000 0001011 * * dcache.cipa rs1 (clean then invalidate, physical address) * | 31 - 25 | 24 - 20 | 19 - 15 | 14 - 12 | 11 - 7 | 6 - 0 | @@ -113,7 +113,7 @@ * 0000000 11001 00000 000 00000 0001011 */ #define THEAD_inval_A0 ".long 0x0265000b" -#define THEAD_clean_A0 ".long 0x0245000b" +#define THEAD_clean_A0 ".long 0x0255000b" #define THEAD_flush_A0 ".long 0x0275000b" #define THEAD_SYNC_S ".long 0x0190000b" --- linux-azure-6.5.0.orig/arch/riscv/include/asm/hwprobe.h +++ linux-azure-6.5.0/arch/riscv/include/asm/hwprobe.h @@ -10,4 +10,9 @@ #define RISCV_HWPROBE_MAX_KEY 5 +static inline bool riscv_hwprobe_key_is_valid(__s64 key) +{ + return key >= 0 && key <= RISCV_HWPROBE_MAX_KEY; +} + #endif --- linux-azure-6.5.0.orig/arch/riscv/include/asm/kprobes.h +++ linux-azure-6.5.0/arch/riscv/include/asm/kprobes.h @@ -40,6 +40,15 @@ int kprobe_fault_handler(struct pt_regs *regs, unsigned int trapnr); bool kprobe_breakpoint_handler(struct pt_regs *regs); bool kprobe_single_step_handler(struct pt_regs *regs); +#else +static inline bool kprobe_breakpoint_handler(struct pt_regs *regs) +{ + return false; +} +static inline bool kprobe_single_step_handler(struct pt_regs *regs) +{ + return false; +} #endif /* CONFIG_KPROBES */ #endif /* _ASM_RISCV_KPROBES_H */ --- linux-azure-6.5.0.orig/arch/riscv/include/asm/page.h +++ linux-azure-6.5.0/arch/riscv/include/asm/page.h @@ -33,8 +33,8 @@ #define PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) #endif /* - * By default, CONFIG_PAGE_OFFSET value corresponds to SV48 address space so - * define the PAGE_OFFSET value for SV39. + * By default, CONFIG_PAGE_OFFSET value corresponds to SV57 address space so + * define the PAGE_OFFSET value for SV48 and SV39. */ #define PAGE_OFFSET_L4 _AC(0xffffaf8000000000, UL) #define PAGE_OFFSET_L3 _AC(0xffffffd800000000, UL) --- linux-azure-6.5.0.orig/arch/riscv/include/asm/thread_info.h +++ linux-azure-6.5.0/arch/riscv/include/asm/thread_info.h @@ -34,9 +34,6 @@ #ifndef __ASSEMBLY__ -extern long shadow_stack[SHADOW_OVERFLOW_STACK_SIZE / sizeof(long)]; -extern unsigned long spin_shadow_stack; - #include #include --- linux-azure-6.5.0.orig/arch/riscv/include/asm/uprobes.h +++ linux-azure-6.5.0/arch/riscv/include/asm/uprobes.h @@ -34,7 +34,18 @@ bool simulate; }; +#ifdef CONFIG_UPROBES bool uprobe_breakpoint_handler(struct pt_regs *regs); bool uprobe_single_step_handler(struct pt_regs *regs); +#else +static inline bool uprobe_breakpoint_handler(struct pt_regs *regs) +{ + return false; +} +static inline bool uprobe_single_step_handler(struct pt_regs *regs) +{ + return false; +} +#endif /* CONFIG_UPROBES */ #endif /* _ASM_RISCV_UPROBES_H */ --- linux-azure-6.5.0.orig/arch/riscv/include/asm/vdso/processor.h +++ linux-azure-6.5.0/arch/riscv/include/asm/vdso/processor.h @@ -14,7 +14,7 @@ __asm__ __volatile__ ("div %0, %0, zero" : "=r" (dummy)); #endif -#ifdef __riscv_zihintpause +#ifdef CONFIG_TOOLCHAIN_HAS_ZIHINTPAUSE /* * Reduce instruction retirement. * This assumes the PC changes. --- linux-azure-6.5.0.orig/arch/riscv/include/uapi/asm/ptrace.h +++ linux-azure-6.5.0/arch/riscv/include/uapi/asm/ptrace.h @@ -103,13 +103,18 @@ * In signal handler, datap will be set a correct user stack offset * and vector registers will be copied to the address of datap * pointer. - * - * In ptrace syscall, datap will be set to zero and the vector - * registers will be copied to the address right after this - * structure. */ }; +struct __riscv_v_regset_state { + unsigned long vstart; + unsigned long vl; + unsigned long vtype; + unsigned long vcsr; + unsigned long vlenb; + char vreg[]; +}; + /* * According to spec: The number of bits in a single vector register, * VLEN >= ELEN, which must be a power of 2, and must be no greater than --- linux-azure-6.5.0.orig/arch/riscv/kernel/asm-offsets.c +++ linux-azure-6.5.0/arch/riscv/kernel/asm-offsets.c @@ -39,6 +39,7 @@ OFFSET(TASK_TI_KERNEL_SP, task_struct, thread_info.kernel_sp); OFFSET(TASK_TI_USER_SP, task_struct, thread_info.user_sp); + OFFSET(TASK_TI_CPU_NUM, task_struct, thread_info.cpu); OFFSET(TASK_THREAD_F0, task_struct, thread.fstate.f[0]); OFFSET(TASK_THREAD_F1, task_struct, thread.fstate.f[1]); OFFSET(TASK_THREAD_F2, task_struct, thread.fstate.f[2]); --- linux-azure-6.5.0.orig/arch/riscv/kernel/cpu.c +++ linux-azure-6.5.0/arch/riscv/kernel/cpu.c @@ -88,13 +88,14 @@ */ int riscv_of_parent_hartid(struct device_node *node, unsigned long *hartid) { - int rc; - for (; node; node = node->parent) { if (of_device_is_compatible(node, "riscv")) { - rc = riscv_of_processor_hartid(node, hartid); - if (!rc) - return 0; + *hartid = (unsigned long)of_get_cpu_hwid(node, 0); + if (*hartid == ~0UL) { + pr_warn("Found CPU without hart ID\n"); + return -ENODEV; + } + return 0; } } --- linux-azure-6.5.0.orig/arch/riscv/kernel/elf_kexec.c +++ linux-azure-6.5.0/arch/riscv/kernel/elf_kexec.c @@ -98,7 +98,13 @@ kbuf.image = image; kbuf.buf_min = lowest_paddr; kbuf.buf_max = ULONG_MAX; - kbuf.buf_align = PAGE_SIZE; + + /* + * Current riscv boot protocol requires 2MB alignment for + * RV64 and 4MB alignment for RV32 + * + */ + kbuf.buf_align = PMD_SIZE; kbuf.mem = KEXEC_BUF_MEM_UNKNOWN; kbuf.memsz = ALIGN(kernel_len, PAGE_SIZE); kbuf.top_down = false; --- linux-azure-6.5.0.orig/arch/riscv/kernel/entry.S +++ linux-azure-6.5.0/arch/riscv/kernel/entry.S @@ -10,9 +10,13 @@ #include #include #include +#include #include #include #include +#include + + .section .irqentry.text, "ax" SYM_CODE_START(handle_exception) /* @@ -170,67 +174,15 @@ #ifdef CONFIG_VMAP_STACK SYM_CODE_START_LOCAL(handle_kernel_stack_overflow) - /* - * Takes the psuedo-spinlock for the shadow stack, in case multiple - * harts are concurrently overflowing their kernel stacks. We could - * store any value here, but since we're overflowing the kernel stack - * already we only have SP to use as a scratch register. So we just - * swap in the address of the spinlock, as that's definately non-zero. - * - * Pairs with a store_release in handle_bad_stack(). - */ -1: la sp, spin_shadow_stack - REG_AMOSWAP_AQ sp, sp, (sp) - bnez sp, 1b - - la sp, shadow_stack - addi sp, sp, SHADOW_OVERFLOW_STACK_SIZE - - //save caller register to shadow stack - addi sp, sp, -(PT_SIZE_ON_STACK) - REG_S x1, PT_RA(sp) - REG_S x5, PT_T0(sp) - REG_S x6, PT_T1(sp) - REG_S x7, PT_T2(sp) - REG_S x10, PT_A0(sp) - REG_S x11, PT_A1(sp) - REG_S x12, PT_A2(sp) - REG_S x13, PT_A3(sp) - REG_S x14, PT_A4(sp) - REG_S x15, PT_A5(sp) - REG_S x16, PT_A6(sp) - REG_S x17, PT_A7(sp) - REG_S x28, PT_T3(sp) - REG_S x29, PT_T4(sp) - REG_S x30, PT_T5(sp) - REG_S x31, PT_T6(sp) - - la ra, restore_caller_reg - tail get_overflow_stack - -restore_caller_reg: - //save per-cpu overflow stack - REG_S a0, -8(sp) - //restore caller register from shadow_stack - REG_L x1, PT_RA(sp) - REG_L x5, PT_T0(sp) - REG_L x6, PT_T1(sp) - REG_L x7, PT_T2(sp) - REG_L x10, PT_A0(sp) - REG_L x11, PT_A1(sp) - REG_L x12, PT_A2(sp) - REG_L x13, PT_A3(sp) - REG_L x14, PT_A4(sp) - REG_L x15, PT_A5(sp) - REG_L x16, PT_A6(sp) - REG_L x17, PT_A7(sp) - REG_L x28, PT_T3(sp) - REG_L x29, PT_T4(sp) - REG_L x30, PT_T5(sp) - REG_L x31, PT_T6(sp) + /* we reach here from kernel context, sscratch must be 0 */ + csrrw x31, CSR_SCRATCH, x31 + asm_per_cpu sp, overflow_stack, x31 + li x31, OVERFLOW_STACK_SIZE + add sp, sp, x31 + /* zero out x31 again and restore x31 */ + xor x31, x31, x31 + csrrw x31, CSR_SCRATCH, x31 - //load per-cpu overflow stack - REG_L sp, -8(sp) addi sp, sp, -(PT_SIZE_ON_STACK) //save context to overflow stack --- linux-azure-6.5.0.orig/arch/riscv/kernel/irq.c +++ linux-azure-6.5.0/arch/riscv/kernel/irq.c @@ -60,7 +60,7 @@ } #endif /* CONFIG_VMAP_STACK */ -#ifdef CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK +#ifdef CONFIG_SOFTIRQ_ON_OWN_STACK void do_softirq_own_stack(void) { #ifdef CONFIG_IRQ_STACKS @@ -92,7 +92,7 @@ #endif __do_softirq(); } -#endif /* CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK */ +#endif /* CONFIG_SOFTIRQ_ON_OWN_STACK */ #else static void init_irq_stacks(void) {} --- linux-azure-6.5.0.orig/arch/riscv/kernel/probes/simulate-insn.c +++ linux-azure-6.5.0/arch/riscv/kernel/probes/simulate-insn.c @@ -24,7 +24,7 @@ unsigned long val) { if (index == 0) - return false; + return true; else if (index <= 31) *((unsigned long *)regs + index) = val; else --- linux-azure-6.5.0.orig/arch/riscv/kernel/probes/uprobes.c +++ linux-azure-6.5.0/arch/riscv/kernel/probes/uprobes.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "decode-insn.h" @@ -17,6 +18,11 @@ #endif } +bool is_trap_insn(uprobe_opcode_t *insn) +{ + return riscv_insn_is_ebreak(*insn) || riscv_insn_is_c_ebreak(*insn); +} + unsigned long uprobe_get_swbp_addr(struct pt_regs *regs) { return instruction_pointer(regs); --- linux-azure-6.5.0.orig/arch/riscv/kernel/ptrace.c +++ linux-azure-6.5.0/arch/riscv/kernel/ptrace.c @@ -25,6 +25,9 @@ #ifdef CONFIG_FPU REGSET_F, #endif +#ifdef CONFIG_RISCV_ISA_V + REGSET_V, +#endif }; static int riscv_gpr_get(struct task_struct *target, @@ -81,6 +84,71 @@ } #endif +#ifdef CONFIG_RISCV_ISA_V +static int riscv_vr_get(struct task_struct *target, + const struct user_regset *regset, + struct membuf to) +{ + struct __riscv_v_ext_state *vstate = &target->thread.vstate; + struct __riscv_v_regset_state ptrace_vstate; + + if (!riscv_v_vstate_query(task_pt_regs(target))) + return -EINVAL; + + /* + * Ensure the vector registers have been saved to the memory before + * copying them to membuf. + */ + if (target == current) + riscv_v_vstate_save(current, task_pt_regs(current)); + + ptrace_vstate.vstart = vstate->vstart; + ptrace_vstate.vl = vstate->vl; + ptrace_vstate.vtype = vstate->vtype; + ptrace_vstate.vcsr = vstate->vcsr; + ptrace_vstate.vlenb = vstate->vlenb; + + /* Copy vector header from vstate. */ + membuf_write(&to, &ptrace_vstate, sizeof(struct __riscv_v_regset_state)); + + /* Copy all the vector registers from vstate. */ + return membuf_write(&to, vstate->datap, riscv_v_vsize); +} + +static int riscv_vr_set(struct task_struct *target, + const struct user_regset *regset, + unsigned int pos, unsigned int count, + const void *kbuf, const void __user *ubuf) +{ + int ret; + struct __riscv_v_ext_state *vstate = &target->thread.vstate; + struct __riscv_v_regset_state ptrace_vstate; + + if (!riscv_v_vstate_query(task_pt_regs(target))) + return -EINVAL; + + /* Copy rest of the vstate except datap */ + ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ptrace_vstate, 0, + sizeof(struct __riscv_v_regset_state)); + if (unlikely(ret)) + return ret; + + if (vstate->vlenb != ptrace_vstate.vlenb) + return -EINVAL; + + vstate->vstart = ptrace_vstate.vstart; + vstate->vl = ptrace_vstate.vl; + vstate->vtype = ptrace_vstate.vtype; + vstate->vcsr = ptrace_vstate.vcsr; + + /* Copy all the vector registers. */ + pos = 0; + ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, vstate->datap, + 0, riscv_v_vsize); + return ret; +} +#endif + static const struct user_regset riscv_user_regset[] = { [REGSET_X] = { .core_note_type = NT_PRSTATUS, @@ -100,6 +168,17 @@ .set = riscv_fpr_set, }, #endif +#ifdef CONFIG_RISCV_ISA_V + [REGSET_V] = { + .core_note_type = NT_RISCV_VECTOR, + .align = 16, + .n = ((32 * RISCV_MAX_VLENB) + + sizeof(struct __riscv_v_regset_state)) / sizeof(__u32), + .size = sizeof(__u32), + .regset_get = riscv_vr_get, + .set = riscv_vr_set, + }, +#endif }; static const struct user_regset_view riscv_user_native_view = { --- linux-azure-6.5.0.orig/arch/riscv/kernel/signal.c +++ linux-azure-6.5.0/arch/riscv/kernel/signal.c @@ -311,13 +311,6 @@ /* Align the stack frame. */ sp &= ~0xfUL; - /* - * Fail if the size of the altstack is not large enough for the - * sigframe construction. - */ - if (current->sas_ss_size && sp < current->sas_ss_sp) - return (void __user __force *)-1UL; - return (void __user *)sp; } --- linux-azure-6.5.0.orig/arch/riscv/kernel/traps.c +++ linux-azure-6.5.0/arch/riscv/kernel/traps.c @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include #include #include @@ -246,22 +248,28 @@ return GET_INSN_LENGTH(insn); } +static bool probe_single_step_handler(struct pt_regs *regs) +{ + bool user = user_mode(regs); + + return user ? uprobe_single_step_handler(regs) : kprobe_single_step_handler(regs); +} + +static bool probe_breakpoint_handler(struct pt_regs *regs) +{ + bool user = user_mode(regs); + + return user ? uprobe_breakpoint_handler(regs) : kprobe_breakpoint_handler(regs); +} + void handle_break(struct pt_regs *regs) { -#ifdef CONFIG_KPROBES - if (kprobe_single_step_handler(regs)) + if (probe_single_step_handler(regs)) return; - if (kprobe_breakpoint_handler(regs)) - return; -#endif -#ifdef CONFIG_UPROBES - if (uprobe_single_step_handler(regs)) + if (probe_breakpoint_handler(regs)) return; - if (uprobe_breakpoint_handler(regs)) - return; -#endif current->thread.bad_cause = regs->cause; if (user_mode(regs)) @@ -400,48 +408,14 @@ #endif /* CONFIG_GENERIC_BUG */ #ifdef CONFIG_VMAP_STACK -/* - * Extra stack space that allows us to provide panic messages when the kernel - * has overflowed its stack. - */ -static DEFINE_PER_CPU(unsigned long [OVERFLOW_STACK_SIZE/sizeof(long)], +DEFINE_PER_CPU(unsigned long [OVERFLOW_STACK_SIZE/sizeof(long)], overflow_stack)__aligned(16); -/* - * A temporary stack for use by handle_kernel_stack_overflow. This is used so - * we can call into C code to get the per-hart overflow stack. Usage of this - * stack must be protected by spin_shadow_stack. - */ -long shadow_stack[SHADOW_OVERFLOW_STACK_SIZE/sizeof(long)] __aligned(16); - -/* - * A pseudo spinlock to protect the shadow stack from being used by multiple - * harts concurrently. This isn't a real spinlock because the lock side must - * be taken without a valid stack and only a single register, it's only taken - * while in the process of panicing anyway so the performance and error - * checking a proper spinlock gives us doesn't matter. - */ -unsigned long spin_shadow_stack; - -asmlinkage unsigned long get_overflow_stack(void) -{ - return (unsigned long)this_cpu_ptr(overflow_stack) + - OVERFLOW_STACK_SIZE; -} asmlinkage void handle_bad_stack(struct pt_regs *regs) { unsigned long tsk_stk = (unsigned long)current->stack; unsigned long ovf_stk = (unsigned long)this_cpu_ptr(overflow_stack); - /* - * We're done with the shadow stack by this point, as we're on the - * overflow stack. Tell any other concurrent overflowing harts that - * they can proceed with panicing by releasing the pseudo-spinlock. - * - * This pairs with an amoswap.aq in handle_kernel_stack_overflow. - */ - smp_store_release(&spin_shadow_stack, 0); - console_verbose(); pr_emerg("Insufficient stack space to handle exception!\n"); --- linux-azure-6.5.0.orig/arch/riscv/kernel/traps_misaligned.c +++ linux-azure-6.5.0/arch/riscv/kernel/traps_misaligned.c @@ -342,16 +342,14 @@ } else if ((insn & INSN_MASK_C_SD) == INSN_MATCH_C_SD) { len = 8; val.data_ulong = GET_RS2S(insn, regs); - } else if ((insn & INSN_MASK_C_SDSP) == INSN_MATCH_C_SDSP && - ((insn >> SH_RD) & 0x1f)) { + } else if ((insn & INSN_MASK_C_SDSP) == INSN_MATCH_C_SDSP) { len = 8; val.data_ulong = GET_RS2C(insn, regs); #endif } else if ((insn & INSN_MASK_C_SW) == INSN_MATCH_C_SW) { len = 4; val.data_ulong = GET_RS2S(insn, regs); - } else if ((insn & INSN_MASK_C_SWSP) == INSN_MATCH_C_SWSP && - ((insn >> SH_RD) & 0x1f)) { + } else if ((insn & INSN_MASK_C_SWSP) == INSN_MATCH_C_SWSP) { len = 4; val.data_ulong = GET_RS2C(insn, regs); } else { --- linux-azure-6.5.0.orig/arch/riscv/kernel/vdso/hwprobe.c +++ linux-azure-6.5.0/arch/riscv/kernel/vdso/hwprobe.c @@ -37,7 +37,7 @@ /* This is something we can handle, fill out the pairs. */ while (p < end) { - if (p->key <= RISCV_HWPROBE_MAX_KEY) { + if (riscv_hwprobe_key_is_valid(p->key)) { p->value = avd->all_cpu_hwprobe_values[p->key]; } else { --- linux-azure-6.5.0.orig/arch/riscv/kvm/aia_imsic.c +++ linux-azure-6.5.0/arch/riscv/kvm/aia_imsic.c @@ -55,6 +55,7 @@ /* IMSIC SW-file */ struct imsic_mrif *swfile; phys_addr_t swfile_pa; + spinlock_t swfile_extirq_lock; }; #define imsic_vs_csr_read(__c) \ @@ -613,12 +614,23 @@ { struct imsic *imsic = vcpu->arch.aia_context.imsic_state; struct imsic_mrif *mrif = imsic->swfile; + unsigned long flags; + + /* + * The critical section is necessary during external interrupt + * updates to avoid the risk of losing interrupts due to potential + * interruptions between reading topei and updating pending status. + */ + + spin_lock_irqsave(&imsic->swfile_extirq_lock, flags); if (imsic_mrif_atomic_read(mrif, &mrif->eidelivery) && imsic_mrif_topei(mrif, imsic->nr_eix, imsic->nr_msis)) kvm_riscv_vcpu_set_interrupt(vcpu, IRQ_VS_EXT); else kvm_riscv_vcpu_unset_interrupt(vcpu, IRQ_VS_EXT); + + spin_unlock_irqrestore(&imsic->swfile_extirq_lock, flags); } static void imsic_swfile_read(struct kvm_vcpu *vcpu, bool clear, @@ -1039,6 +1051,7 @@ } imsic->swfile = page_to_virt(swfile_page); imsic->swfile_pa = page_to_phys(swfile_page); + spin_lock_init(&imsic->swfile_extirq_lock); /* Setup IO device */ kvm_iodevice_init(&imsic->iodev, &imsic_iodoev_ops); --- linux-azure-6.5.0.orig/arch/riscv/mm/init.c +++ linux-azure-6.5.0/arch/riscv/mm/init.c @@ -823,6 +823,10 @@ disable_pgtable_l4(); } + /* UBUNTU: Force disable sv57 and fallback to sv48 */ + if (pgtable_l5_enabled) + disable_pgtable_l5(); + memset(early_pg_dir, 0, PAGE_SIZE); memset(early_p4d, 0, PAGE_SIZE); memset(early_pud, 0, PAGE_SIZE); --- linux-azure-6.5.0.orig/arch/riscv/mm/kasan_init.c +++ linux-azure-6.5.0/arch/riscv/mm/kasan_init.c @@ -22,9 +22,9 @@ * region is not and then we have to go down to the PUD level. */ -pgd_t tmp_pg_dir[PTRS_PER_PGD] __page_aligned_bss; -p4d_t tmp_p4d[PTRS_PER_P4D] __page_aligned_bss; -pud_t tmp_pud[PTRS_PER_PUD] __page_aligned_bss; +static pgd_t tmp_pg_dir[PTRS_PER_PGD] __page_aligned_bss; +static p4d_t tmp_p4d[PTRS_PER_P4D] __page_aligned_bss; +static pud_t tmp_pud[PTRS_PER_PUD] __page_aligned_bss; static void __init kasan_populate_pte(pmd_t *pmd, unsigned long vaddr, unsigned long end) { @@ -438,7 +438,7 @@ kasan_shallow_populate_pgd(vaddr, vend); } -static void create_tmp_mapping(void) +static void __init create_tmp_mapping(void) { void *ptr; p4d_t *base_p4d; --- linux-azure-6.5.0.orig/arch/riscv/mm/ptdump.c +++ linux-azure-6.5.0/arch/riscv/mm/ptdump.c @@ -384,6 +384,9 @@ kernel_ptd_info.base_addr = KERN_VIRT_START; + pg_level[1].name = pgtable_l5_enabled ? "P4D" : "PGD"; + pg_level[2].name = pgtable_l4_enabled ? "PUD" : "PGD"; + for (i = 0; i < ARRAY_SIZE(pg_level); i++) for (j = 0; j < ARRAY_SIZE(pte_bits); j++) pg_level[i].mask |= pte_bits[j].mask; --- linux-azure-6.5.0.orig/arch/riscv/net/bpf_jit_comp64.c +++ linux-azure-6.5.0/arch/riscv/net/bpf_jit_comp64.c @@ -239,7 +239,7 @@ emit_addi(RV_REG_SP, RV_REG_SP, stack_adjust, ctx); /* Set return value. */ if (!is_tail_call) - emit_mv(RV_REG_A0, RV_REG_A5, ctx); + emit_addiw(RV_REG_A0, RV_REG_A5, 0, ctx); emit_jalr(RV_REG_ZERO, is_tail_call ? RV_REG_T3 : RV_REG_RA, is_tail_call ? 20 : 0, /* skip reserved nops and TCC init */ ctx); @@ -757,8 +757,10 @@ if (ret) return ret; - if (save_ret) - emit_sd(RV_REG_FP, -retval_off, regmap[BPF_REG_0], ctx); + if (save_ret) { + emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx); + emit_sd(RV_REG_FP, -(retval_off - 8), regmap[BPF_REG_0], ctx); + } /* update branch with beqz */ if (ctx->insns) { @@ -844,7 +846,7 @@ save_ret = flags & (BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_RET_FENTRY_RET); if (save_ret) { - stack_size += 8; + stack_size += 16; /* Save both A5 (BPF R0) and A0 */ retval_off = stack_size; } @@ -931,6 +933,7 @@ if (ret) goto out; emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx); + emit_sd(RV_REG_FP, -(retval_off - 8), regmap[BPF_REG_0], ctx); im->ip_after_call = ctx->insns + ctx->ninsns; /* 2 nops reserved for auipc+jalr pair */ emit(rv_nop(), ctx); @@ -962,8 +965,10 @@ if (flags & BPF_TRAMP_F_RESTORE_REGS) restore_args(nregs, args_off, ctx); - if (save_ret) + if (save_ret) { emit_ld(RV_REG_A0, -retval_off, RV_REG_FP, ctx); + emit_ld(regmap[BPF_REG_0], -(retval_off - 8), RV_REG_FP, ctx); + } emit_ld(RV_REG_S1, -sreg_off, RV_REG_FP, ctx); @@ -1436,7 +1441,8 @@ if (ret) return ret; - emit_mv(bpf_to_rv_reg(BPF_REG_0, ctx), RV_REG_A0, ctx); + if (insn->src_reg != BPF_PSEUDO_CALL) + emit_mv(bpf_to_rv_reg(BPF_REG_0, ctx), RV_REG_A0, ctx); break; } /* tail call */ --- linux-azure-6.5.0.orig/arch/s390/boot/startup.c +++ linux-azure-6.5.0/arch/s390/boot/startup.c @@ -176,6 +176,7 @@ unsigned long asce_limit; unsigned long rte_size; unsigned long pages; + unsigned long vsize; unsigned long vmax; pages = ident_map_size / PAGE_SIZE; @@ -183,11 +184,9 @@ vmemmap_size = SECTION_ALIGN_UP(pages) * sizeof(struct page); /* choose kernel address space layout: 4 or 3 levels. */ - vmemmap_start = round_up(ident_map_size, _REGION3_SIZE); - if (IS_ENABLED(CONFIG_KASAN) || - vmalloc_size > _REGION2_SIZE || - vmemmap_start + vmemmap_size + vmalloc_size + MODULES_LEN > - _REGION2_SIZE) { + vsize = round_up(ident_map_size, _REGION3_SIZE) + vmemmap_size + MODULES_LEN; + vsize = size_add(vsize, vmalloc_size); + if (IS_ENABLED(CONFIG_KASAN) || (vsize > _REGION2_SIZE)) { asce_limit = _REGION1_SIZE; rte_size = _REGION2_SIZE; } else { --- linux-azure-6.5.0.orig/arch/s390/boot/vmem.c +++ linux-azure-6.5.0/arch/s390/boot/vmem.c @@ -57,6 +57,7 @@ pmd_t pmd_z = __pmd(__pa(kasan_early_shadow_pte) | _SEGMENT_ENTRY); pud_t pud_z = __pud(__pa(kasan_early_shadow_pmd) | _REGION3_ENTRY); p4d_t p4d_z = __p4d(__pa(kasan_early_shadow_pud) | _REGION2_ENTRY); + unsigned long memgap_start = 0; unsigned long untracked_end; unsigned long start, end; int i; @@ -101,8 +102,12 @@ * +- shadow end ----+---------+- shadow end ---+ */ - for_each_physmem_usable_range(i, &start, &end) + for_each_physmem_usable_range(i, &start, &end) { kasan_populate(start, end, POPULATE_KASAN_MAP_SHADOW); + if (memgap_start && physmem_info.info_source == MEM_DETECT_DIAG260) + kasan_populate(memgap_start, start, POPULATE_KASAN_ZERO_SHADOW); + memgap_start = end; + } if (IS_ENABLED(CONFIG_KASAN_VMALLOC)) { untracked_end = VMALLOC_START; /* shallowly populate kasan shadow for vmalloc and modules */ --- linux-azure-6.5.0.orig/arch/s390/configs/debug_defconfig +++ linux-azure-6.5.0/arch/s390/configs/debug_defconfig @@ -828,7 +828,6 @@ CONFIG_DEBUG_SG=y CONFIG_DEBUG_NOTIFIERS=y CONFIG_BUG_ON_DATA_CORRUPTION=y -CONFIG_DEBUG_CREDENTIALS=y CONFIG_RCU_TORTURE_TEST=m CONFIG_RCU_REF_SCALE_TEST=m CONFIG_RCU_CPU_STALL_TIMEOUT=300 --- linux-azure-6.5.0.orig/arch/s390/crypto/paes_s390.c +++ linux-azure-6.5.0/arch/s390/crypto/paes_s390.c @@ -35,7 +35,7 @@ * and padding is also possible, the limits need to be generous. */ #define PAES_MIN_KEYSIZE 16 -#define PAES_MAX_KEYSIZE 320 +#define PAES_MAX_KEYSIZE MAXEP11AESKEYBLOBSIZE static u8 *ctrblk; static DEFINE_MUTEX(ctrblk_lock); --- linux-azure-6.5.0.orig/arch/s390/include/asm/fpu/api.h +++ linux-azure-6.5.0/arch/s390/include/asm/fpu/api.h @@ -79,7 +79,7 @@ #define KERNEL_VXR_HIGH (KERNEL_VXR_V16V23|KERNEL_VXR_V24V31) #define KERNEL_VXR (KERNEL_VXR_LOW|KERNEL_VXR_HIGH) -#define KERNEL_FPR (KERNEL_FPC|KERNEL_VXR_V0V7) +#define KERNEL_FPR (KERNEL_FPC|KERNEL_VXR_LOW) struct kernel_fpu; --- linux-azure-6.5.0.orig/arch/s390/include/asm/ipl.h +++ linux-azure-6.5.0/arch/s390/include/asm/ipl.h @@ -139,6 +139,7 @@ unsigned char flags, unsigned short cert); int ipl_report_add_certificate(struct ipl_report *report, void *key, unsigned long addr, unsigned long len); +bool ipl_get_secureboot(void); /* * DIAG 308 support --- linux-azure-6.5.0.orig/arch/s390/include/asm/kvm_host.h +++ linux-azure-6.5.0/arch/s390/include/asm/kvm_host.h @@ -817,6 +817,8 @@ __u64 *fac_list; u64 cpuid; unsigned short ibc; + /* subset of available UV-features for pv-guests enabled by user space */ + struct kvm_s390_vm_cpu_uv_feat uv_feat_guest; }; typedef int (*crypto_hook)(struct kvm_vcpu *vcpu); @@ -1028,6 +1030,9 @@ extern char sie_exit; +bool kvm_s390_pv_is_protected(struct kvm *kvm); +bool kvm_s390_pv_cpu_is_protected(struct kvm_vcpu *vcpu); + extern int kvm_s390_gisc_register(struct kvm *kvm, u32 gisc); extern int kvm_s390_gisc_unregister(struct kvm *kvm, u32 gisc); --- linux-azure-6.5.0.orig/arch/s390/include/asm/syscall_wrapper.h +++ linux-azure-6.5.0/arch/s390/include/asm/syscall_wrapper.h @@ -63,10 +63,6 @@ cond_syscall(__s390x_sys_##name); \ cond_syscall(__s390_sys_##name) -#define SYS_NI(name) \ - SYSCALL_ALIAS(__s390x_sys_##name, sys_ni_posix_timers); \ - SYSCALL_ALIAS(__s390_sys_##name, sys_ni_posix_timers) - #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ long __s390_compat_sys##name(struct pt_regs *regs); \ ALLOW_ERROR_INJECTION(__s390_compat_sys##name, ERRNO); \ @@ -85,15 +81,11 @@ /* * As some compat syscalls may not be implemented, we need to expand - * COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in - * kernel/time/posix-stubs.c to cover this case as well. + * COND_SYSCALL_COMPAT in kernel/sys_ni.c to cover this case as well. */ #define COND_SYSCALL_COMPAT(name) \ cond_syscall(__s390_compat_sys_##name) -#define COMPAT_SYS_NI(name) \ - SYSCALL_ALIAS(__s390_compat_sys_##name, sys_ni_posix_timers) - #define __S390_SYS_STUBx(x, name, ...) \ long __s390_sys##name(struct pt_regs *regs); \ ALLOW_ERROR_INJECTION(__s390_sys##name, ERRNO); \ @@ -124,9 +116,6 @@ #define COND_SYSCALL(name) \ cond_syscall(__s390x_sys_##name) -#define SYS_NI(name) \ - SYSCALL_ALIAS(__s390x_sys_##name, sys_ni_posix_timers) - #define __S390_SYS_STUBx(x, fullname, name, ...) #endif /* CONFIG_COMPAT */ --- linux-azure-6.5.0.orig/arch/s390/include/asm/uv.h +++ linux-azure-6.5.0/arch/s390/include/asm/uv.h @@ -99,6 +99,8 @@ enum uv_feat_ind { BIT_UV_FEAT_MISC = 0, BIT_UV_FEAT_AIV = 1, + BIT_UV_FEAT_AP = 4, + BIT_UV_FEAT_AP_INTR = 5, }; struct uv_cb_header { @@ -159,7 +161,15 @@ u64 guest_handle; u64 conf_base_stor_origin; u64 conf_virt_stor_origin; - u64 reserved30; + u8 reserved30[6]; + union { + struct { + u16 : 14; + u16 ap_instr_intr : 1; + u16 ap_allow_instr : 1; + }; + u16 raw; + } flags; u64 guest_stor_origin; u64 guest_stor_len; u64 guest_sca; @@ -397,6 +407,13 @@ extern struct uv_info uv_info; +static inline bool uv_has_feature(u8 feature_bit) +{ + if (feature_bit >= sizeof(uv_info.uv_feature_indications) * 8) + return false; + return test_bit_inv(feature_bit, &uv_info.uv_feature_indications); +} + #ifdef CONFIG_PROTECTED_VIRTUALIZATION_GUEST extern int prot_virt_guest; @@ -463,6 +480,7 @@ return prot_virt_host; } +int uv_pin_shared(unsigned long paddr); int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb); int gmap_destroy_page(struct gmap *gmap, unsigned long gaddr); int uv_destroy_owned_page(unsigned long paddr); @@ -475,6 +493,11 @@ #define is_prot_virt_host() 0 static inline void setup_uv(void) {} +static inline int uv_pin_shared(unsigned long paddr) +{ + return 0; +} + static inline int uv_destroy_owned_page(unsigned long paddr) { return 0; --- linux-azure-6.5.0.orig/arch/s390/include/uapi/asm/kvm.h +++ linux-azure-6.5.0/arch/s390/include/uapi/asm/kvm.h @@ -159,6 +159,22 @@ __u8 reserved[1728]; }; +#define KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST 6 +#define KVM_S390_VM_CPU_MACHINE_UV_FEAT_GUEST 7 + +#define KVM_S390_VM_CPU_UV_FEAT_NR_BITS 64 +struct kvm_s390_vm_cpu_uv_feat { + union { + struct { + __u64 : 4; + __u64 ap : 1; /* bit 4 */ + __u64 ap_intr : 1; /* bit 5 */ + __u64 : 58; + }; + __u64 feat; + }; +}; + /* kvm attributes for crypto */ #define KVM_S390_VM_CRYPTO_ENABLE_AES_KW 0 #define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW 1 --- linux-azure-6.5.0.orig/arch/s390/include/uapi/asm/pkey.h +++ linux-azure-6.5.0/arch/s390/include/uapi/asm/pkey.h @@ -26,7 +26,7 @@ #define MAXCLRKEYSIZE 32 /* a clear key value may be up to 32 bytes */ #define MAXAESCIPHERKEYSIZE 136 /* our aes cipher keys have always 136 bytes */ #define MINEP11AESKEYBLOBSIZE 256 /* min EP11 AES key blob size */ -#define MAXEP11AESKEYBLOBSIZE 320 /* max EP11 AES key blob size */ +#define MAXEP11AESKEYBLOBSIZE 336 /* max EP11 AES key blob size */ /* Minimum size of a key blob */ #define MINKEYBLOBSIZE SECKEYBLOBSIZE --- linux-azure-6.5.0.orig/arch/s390/kernel/ipl.c +++ linux-azure-6.5.0/arch/s390/kernel/ipl.c @@ -640,6 +640,8 @@ static struct attribute *ipl_unknown_attrs[] = { &sys_ipl_type_attr.attr, + &sys_ipl_secure_attr.attr, + &sys_ipl_has_secure_attr.attr, NULL, }; @@ -678,6 +680,7 @@ &ipl_ccw_attr_group_lpar); break; case IPL_TYPE_ECKD: + case IPL_TYPE_ECKD_DUMP: rc = sysfs_create_group(&ipl_kset->kobj, &ipl_eckd_attr_group); break; case IPL_TYPE_FCP: @@ -2533,3 +2536,8 @@ } #endif + +bool ipl_get_secureboot(void) +{ + return !!ipl_secure_flag; +} --- linux-azure-6.5.0.orig/arch/s390/kernel/setup.c +++ linux-azure-6.5.0/arch/s390/kernel/setup.c @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -914,6 +915,9 @@ log_component_list(); + if (ipl_get_secureboot()) + security_lock_kernel_down("Secure IPL mode", LOCKDOWN_INTEGRITY_MAX); + /* Have one command line that is parsed and saved in /proc/cmdline */ /* boot_command_line has been already set up in early.c */ *cmdline_p = boot_command_line; --- linux-azure-6.5.0.orig/arch/s390/kernel/uv.c +++ linux-azure-6.5.0/arch/s390/kernel/uv.c @@ -88,7 +88,7 @@ * Requests the Ultravisor to pin the page in the shared state. This will * cause an intercept when the guest attempts to unshare the pinned page. */ -static int uv_pin_shared(unsigned long paddr) +int uv_pin_shared(unsigned long paddr) { struct uv_cb_cfs uvcb = { .header.cmd = UVC_CMD_PIN_PAGE_SHARED, @@ -100,6 +100,7 @@ return -EINVAL; return 0; } +EXPORT_SYMBOL_GPL(uv_pin_shared); /* * Requests the Ultravisor to destroy a guest page and make it @@ -257,7 +258,7 @@ * shared page from a different protected VM will automatically also * transfer its ownership. */ - if (test_bit_inv(BIT_UV_FEAT_MISC, &uv_info.uv_feature_indications)) + if (uv_has_feature(BIT_UV_FEAT_MISC)) return false; if (uvcb->cmd == UVC_CMD_UNPIN_PAGE_SHARED) return false; --- linux-azure-6.5.0.orig/arch/s390/kvm/intercept.c +++ linux-azure-6.5.0/arch/s390/kvm/intercept.c @@ -228,6 +228,21 @@ #define per_event(vcpu) (vcpu->arch.sie_block->iprcc & PGM_PER) +static bool should_handle_per_event(const struct kvm_vcpu *vcpu) +{ + if (!guestdbg_enabled(vcpu) || !per_event(vcpu)) + return false; + if (guestdbg_sstep_enabled(vcpu) && + vcpu->arch.sie_block->iprcc != PGM_PER) { + /* + * __vcpu_run() will exit after delivering the concurrently + * indicated condition. + */ + return false; + } + return true; +} + static int handle_prog(struct kvm_vcpu *vcpu) { psw_t psw; @@ -242,7 +257,7 @@ if (kvm_s390_pv_cpu_is_protected(vcpu)) return -EOPNOTSUPP; - if (guestdbg_enabled(vcpu) && per_event(vcpu)) { + if (should_handle_per_event(vcpu)) { rc = kvm_s390_handle_per_event(vcpu); if (rc) return rc; @@ -571,6 +586,19 @@ return handle_instruction(vcpu); } +static bool should_handle_per_ifetch(const struct kvm_vcpu *vcpu, int rc) +{ + /* Process PER, also if the instruction is processed in user space. */ + if (!(vcpu->arch.sie_block->icptstatus & 0x02)) + return false; + if (rc != 0 && rc != -EOPNOTSUPP) + return false; + if (guestdbg_sstep_enabled(vcpu) && vcpu->arch.local_int.pending_irqs) + /* __vcpu_run() will exit after delivering the interrupt. */ + return false; + return true; +} + int kvm_handle_sie_intercept(struct kvm_vcpu *vcpu) { int rc, per_rc = 0; @@ -605,8 +633,8 @@ rc = handle_partial_execution(vcpu); break; case ICPT_KSS: - rc = kvm_s390_skey_check_enable(vcpu); - break; + /* Instruction will be redriven, skip the PER check. */ + return kvm_s390_skey_check_enable(vcpu); case ICPT_MCHKREQ: case ICPT_INT_ENABLE: /* @@ -633,9 +661,7 @@ return -EOPNOTSUPP; } - /* process PER, also if the instruction is processed in user space */ - if (vcpu->arch.sie_block->icptstatus & 0x02 && - (!rc || rc == -EOPNOTSUPP)) + if (should_handle_per_ifetch(vcpu, rc)) per_rc = kvm_s390_handle_per_ifetch_icpt(vcpu); return per_rc ? per_rc : rc; } --- linux-azure-6.5.0.orig/arch/s390/kvm/interrupt.c +++ linux-azure-6.5.0/arch/s390/kvm/interrupt.c @@ -1392,6 +1392,7 @@ { struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; int rc = 0; + bool delivered = false; unsigned long irq_type; unsigned long irqs; @@ -1465,6 +1466,19 @@ WARN_ONCE(1, "Unknown pending irq type %ld", irq_type); clear_bit(irq_type, &li->pending_irqs); } + delivered |= !rc; + } + + /* + * We delivered at least one interrupt and modified the PC. Force a + * singlestep event now. + */ + if (delivered && guestdbg_sstep_enabled(vcpu)) { + struct kvm_debug_exit_arch *debug_exit = &vcpu->run->debug.arch; + + debug_exit->addr = vcpu->arch.sie_block->gpsw.addr; + debug_exit->type = KVM_SINGLESTEP; + vcpu->guest_debug |= KVM_GUESTDBG_EXIT_PENDING; } set_intercept_indicators(vcpu); --- linux-azure-6.5.0.orig/arch/s390/kvm/kvm-s390.c +++ linux-azure-6.5.0/arch/s390/kvm/kvm-s390.c @@ -1531,6 +1531,39 @@ return 0; } +#define KVM_S390_VM_CPU_UV_FEAT_GUEST_MASK \ +( \ + ((struct kvm_s390_vm_cpu_uv_feat){ \ + .ap = 1, \ + .ap_intr = 1, \ + }) \ + .feat \ +) + +static int kvm_s390_set_uv_feat(struct kvm *kvm, struct kvm_device_attr *attr) +{ + struct kvm_s390_vm_cpu_uv_feat __user *ptr = (void __user *)attr->addr; + unsigned long data, filter; + + filter = uv_info.uv_feature_indications & KVM_S390_VM_CPU_UV_FEAT_GUEST_MASK; + if (get_user(data, &ptr->feat)) + return -EFAULT; + if (!bitmap_subset(&data, &filter, KVM_S390_VM_CPU_UV_FEAT_NR_BITS)) + return -EINVAL; + + mutex_lock(&kvm->lock); + if (kvm->created_vcpus) { + mutex_unlock(&kvm->lock); + return -EBUSY; + } + kvm->arch.model.uv_feat_guest.feat = data; + mutex_unlock(&kvm->lock); + + VM_EVENT(kvm, 3, "SET: guest UV-feat: 0x%16.16lx", data); + + return 0; +} + static int kvm_s390_set_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr) { int ret = -ENXIO; @@ -1545,6 +1578,9 @@ case KVM_S390_VM_CPU_PROCESSOR_SUBFUNC: ret = kvm_s390_set_processor_subfunc(kvm, attr); break; + case KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST: + ret = kvm_s390_set_uv_feat(kvm, attr); + break; } return ret; } @@ -1777,6 +1813,33 @@ return 0; } +static int kvm_s390_get_processor_uv_feat(struct kvm *kvm, struct kvm_device_attr *attr) +{ + struct kvm_s390_vm_cpu_uv_feat __user *dst = (void __user *)attr->addr; + unsigned long feat = kvm->arch.model.uv_feat_guest.feat; + + if (put_user(feat, &dst->feat)) + return -EFAULT; + VM_EVENT(kvm, 3, "GET: guest UV-feat: 0x%16.16lx", feat); + + return 0; +} + +static int kvm_s390_get_machine_uv_feat(struct kvm *kvm, struct kvm_device_attr *attr) +{ + struct kvm_s390_vm_cpu_uv_feat __user *dst = (void __user *)attr->addr; + unsigned long feat; + + BUILD_BUG_ON(sizeof(*dst) != sizeof(uv_info.uv_feature_indications)); + + feat = uv_info.uv_feature_indications & KVM_S390_VM_CPU_UV_FEAT_GUEST_MASK; + if (put_user(feat, &dst->feat)) + return -EFAULT; + VM_EVENT(kvm, 3, "GET: guest UV-feat: 0x%16.16lx", feat); + + return 0; +} + static int kvm_s390_get_cpu_model(struct kvm *kvm, struct kvm_device_attr *attr) { int ret = -ENXIO; @@ -1800,6 +1863,12 @@ case KVM_S390_VM_CPU_MACHINE_SUBFUNC: ret = kvm_s390_get_machine_subfunc(kvm, attr); break; + case KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST: + ret = kvm_s390_get_processor_uv_feat(kvm, attr); + break; + case KVM_S390_VM_CPU_MACHINE_UV_FEAT_GUEST: + ret = kvm_s390_get_machine_uv_feat(kvm, attr); + break; } return ret; } @@ -1952,6 +2021,8 @@ case KVM_S390_VM_CPU_MACHINE_FEAT: case KVM_S390_VM_CPU_MACHINE_SUBFUNC: case KVM_S390_VM_CPU_PROCESSOR_SUBFUNC: + case KVM_S390_VM_CPU_MACHINE_UV_FEAT_GUEST: + case KVM_S390_VM_CPU_PROCESSOR_UV_FEAT_GUEST: ret = 0; break; default: @@ -2406,7 +2477,7 @@ struct kvm_vcpu *vcpu; /* Disable the GISA if the ultravisor does not support AIV. */ - if (!test_bit_inv(BIT_UV_FEAT_AIV, &uv_info.uv_feature_indications)) + if (!uv_has_feature(BIT_UV_FEAT_AIV)) kvm_s390_gisa_disable(kvm); kvm_for_each_vcpu(i, vcpu, kvm) { @@ -3296,6 +3367,8 @@ kvm->arch.model.cpuid = kvm_s390_get_initial_cpuid(); kvm->arch.model.ibc = sclp.ibc & 0x0fff; + kvm->arch.model.uv_feat_guest.feat = 0; + kvm_s390_crypto_init(kvm); if (IS_ENABLED(CONFIG_VFIO_PCI_ZDEV_KVM)) { @@ -4611,7 +4684,7 @@ if (!kvm_is_ucontrol(vcpu->kvm)) { rc = kvm_s390_deliver_pending_interrupts(vcpu); - if (rc) + if (rc || guestdbg_exit_pending(vcpu)) return rc; } @@ -4738,7 +4811,7 @@ do { rc = vcpu_pre_run(vcpu); - if (rc) + if (rc || guestdbg_exit_pending(vcpu)) break; kvm_vcpu_srcu_read_unlock(vcpu); @@ -5383,6 +5456,7 @@ { struct kvm_vcpu *vcpu = filp->private_data; void __user *argp = (void __user *)arg; + int rc; switch (ioctl) { case KVM_S390_IRQ: { @@ -5390,7 +5464,8 @@ if (copy_from_user(&s390irq, argp, sizeof(s390irq))) return -EFAULT; - return kvm_s390_inject_vcpu(vcpu, &s390irq); + rc = kvm_s390_inject_vcpu(vcpu, &s390irq); + break; } case KVM_S390_INTERRUPT: { struct kvm_s390_interrupt s390int; @@ -5400,10 +5475,25 @@ return -EFAULT; if (s390int_to_s390irq(&s390int, &s390irq)) return -EINVAL; - return kvm_s390_inject_vcpu(vcpu, &s390irq); + rc = kvm_s390_inject_vcpu(vcpu, &s390irq); + break; } + default: + rc = -ENOIOCTLCMD; + break; } - return -ENOIOCTLCMD; + + /* + * To simplify single stepping of userspace-emulated instructions, + * KVM_EXIT_S390_SIEIC exit sets KVM_GUESTDBG_EXIT_PENDING (see + * should_handle_per_ifetch()). However, if userspace emulation injects + * an interrupt, it needs to be cleared, so that KVM_EXIT_DEBUG happens + * after (and not before) the interrupt delivery. + */ + if (!rc) + vcpu->guest_debug &= ~KVM_GUESTDBG_EXIT_PENDING; + + return rc; } static int kvm_s390_handle_pv_vcpu_dump(struct kvm_vcpu *vcpu, --- linux-azure-6.5.0.orig/arch/s390/kvm/kvm-s390.h +++ linux-azure-6.5.0/arch/s390/kvm/kvm-s390.h @@ -270,18 +270,6 @@ return vcpu->arch.pv.handle; } -static inline bool kvm_s390_pv_is_protected(struct kvm *kvm) -{ - lockdep_assert_held(&kvm->lock); - return !!kvm_s390_pv_get_handle(kvm); -} - -static inline bool kvm_s390_pv_cpu_is_protected(struct kvm_vcpu *vcpu) -{ - lockdep_assert_held(&vcpu->mutex); - return !!kvm_s390_pv_cpu_get_handle(vcpu); -} - /* implemented in interrupt.c */ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu); void kvm_s390_vcpu_wakeup(struct kvm_vcpu *vcpu); --- linux-azure-6.5.0.orig/arch/s390/kvm/pv.c +++ linux-azure-6.5.0/arch/s390/kvm/pv.c @@ -18,6 +18,20 @@ #include #include "kvm-s390.h" +bool kvm_s390_pv_is_protected(struct kvm *kvm) +{ + lockdep_assert_held(&kvm->lock); + return !!kvm_s390_pv_get_handle(kvm); +} +EXPORT_SYMBOL_GPL(kvm_s390_pv_is_protected); + +bool kvm_s390_pv_cpu_is_protected(struct kvm_vcpu *vcpu) +{ + lockdep_assert_held(&vcpu->mutex); + return !!kvm_s390_pv_cpu_get_handle(vcpu); +} +EXPORT_SYMBOL_GPL(kvm_s390_pv_cpu_is_protected); + /** * struct pv_vm_to_be_destroyed - Represents a protected VM that needs to * be destroyed @@ -271,7 +285,8 @@ WRITE_ONCE(kvm->arch.gmap->guest_handle, 0); KVM_UV_EVENT(kvm, 3, "PROTVIRT DESTROY VM FAST: rc %x rrc %x", uvcb.header.rc, uvcb.header.rrc); - WARN_ONCE(cc, "protvirt destroy vm fast failed handle %llx rc %x rrc %x", + WARN_ONCE(cc && uvcb.header.rc != 0x104, + "protvirt destroy vm fast failed handle %llx rc %x rrc %x", kvm_s390_pv_get_handle(kvm), uvcb.header.rc, uvcb.header.rrc); /* Intended memory leak on "impossible" error */ if (!cc) @@ -561,12 +576,14 @@ uvcb.conf_base_stor_origin = virt_to_phys((void *)kvm->arch.pv.stor_base); uvcb.conf_virt_stor_origin = (u64)kvm->arch.pv.stor_var; + uvcb.flags.ap_allow_instr = kvm->arch.model.uv_feat_guest.ap; + uvcb.flags.ap_instr_intr = kvm->arch.model.uv_feat_guest.ap_intr; cc = uv_call_sched(0, (u64)&uvcb); *rc = uvcb.header.rc; *rrc = uvcb.header.rrc; - KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x", - uvcb.guest_handle, uvcb.guest_stor_len, *rc, *rrc); + KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x flags %04x", + uvcb.guest_handle, uvcb.guest_stor_len, *rc, *rrc, uvcb.flags.raw); /* Outputs */ kvm->arch.pv.handle = uvcb.guest_handle; --- linux-azure-6.5.0.orig/arch/s390/kvm/vsie.c +++ linux-azure-6.5.0/arch/s390/kvm/vsie.c @@ -587,10 +587,6 @@ if (!gmap_is_shadow(gmap)) return; - if (start >= 1UL << 31) - /* We are only interested in prefix pages */ - return; - /* * Only new shadow blocks are added to the list during runtime, * therefore we can safely reference them all the time. --- linux-azure-6.5.0.orig/arch/s390/mm/fault.c +++ linux-azure-6.5.0/arch/s390/mm/fault.c @@ -827,7 +827,7 @@ * reliable without the misc UV feature so we need to check * for that as well. */ - if (test_bit_inv(BIT_UV_FEAT_MISC, &uv_info.uv_feature_indications) && + if (uv_has_feature(BIT_UV_FEAT_MISC) && !test_bit_inv(61, ®s->int_parm_long)) { /* * When this happens, userspace did something that it --- linux-azure-6.5.0.orig/arch/s390/mm/page-states.c +++ linux-azure-6.5.0/arch/s390/mm/page-states.c @@ -121,7 +121,7 @@ continue; if (!pud_folded(*pud)) { page = phys_to_page(pud_val(*pud)); - for (i = 0; i < 3; i++) + for (i = 0; i < 4; i++) set_bit(PG_arch_1, &page[i].flags); } mark_kernel_pmd(pud, addr, next); @@ -142,7 +142,7 @@ continue; if (!p4d_folded(*p4d)) { page = phys_to_page(p4d_val(*p4d)); - for (i = 0; i < 3; i++) + for (i = 0; i < 4; i++) set_bit(PG_arch_1, &page[i].flags); } mark_kernel_pud(p4d, addr, next); @@ -164,7 +164,7 @@ continue; if (!pgd_folded(*pgd)) { page = phys_to_page(pgd_val(*pgd)); - for (i = 0; i < 3; i++) + for (i = 0; i < 4; i++) set_bit(PG_arch_1, &page[i].flags); } mark_kernel_p4d(pgd, addr, next); @@ -181,6 +181,12 @@ return; /* Mark pages used in kernel page tables */ mark_kernel_pgd(); + page = virt_to_page(&swapper_pg_dir); + for (i = 0; i < 4; i++) + set_bit(PG_arch_1, &page[i].flags); + page = virt_to_page(&invalid_pg_dir); + for (i = 0; i < 4; i++) + set_bit(PG_arch_1, &page[i].flags); /* Set all kernel pages not used for page tables to stable/no-dat */ for_each_mem_pfn_range(i, MAX_NUMNODES, &start, &end, NULL) { --- linux-azure-6.5.0.orig/arch/s390/mm/pgtable.c +++ linux-azure-6.5.0/arch/s390/mm/pgtable.c @@ -756,7 +756,7 @@ pte_clear(mm, addr, ptep); } if (reset) - pgste_val(pgste) &= ~_PGSTE_GPS_USAGE_MASK; + pgste_val(pgste) &= ~(_PGSTE_GPS_USAGE_MASK | _PGSTE_GPS_NODAT); pgste_set_unlock(ptep, pgste); preempt_enable(); } --- linux-azure-6.5.0.orig/arch/s390/mm/vmem.c +++ linux-azure-6.5.0/arch/s390/mm/vmem.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -46,8 +47,11 @@ unsigned long *table; table = vmem_alloc_pages(CRST_ALLOC_ORDER); - if (table) - crst_table_init(table, val); + if (!table) + return NULL; + crst_table_init(table, val); + if (slab_is_available()) + arch_set_page_dat(virt_to_page(table), CRST_ALLOC_ORDER); return table; } --- linux-azure-6.5.0.orig/arch/s390/net/bpf_jit_comp.c +++ linux-azure-6.5.0/arch/s390/net/bpf_jit_comp.c @@ -2066,6 +2066,7 @@ * func_addr's original caller */ int stack_size; /* Trampoline stack size */ + int backchain_off; /* Offset of backchain */ int stack_args_off; /* Offset of stack arguments for calling * func_addr, has to be at the top */ @@ -2086,8 +2087,10 @@ * for __bpf_prog_enter() return value and * func_addr respectively */ - int r14_off; /* Offset of saved %r14 */ int run_ctx_off; /* Offset of struct bpf_tramp_run_ctx */ + int tccnt_off; /* Offset of saved tailcall counter */ + int r14_off; /* Offset of saved %r14, has to be at the + * bottom */ int do_fexit; /* do_fexit: label */ }; @@ -2246,8 +2249,12 @@ * Calculate the stack layout. */ - /* Reserve STACK_FRAME_OVERHEAD bytes for the callees. */ + /* + * Allocate STACK_FRAME_OVERHEAD bytes for the callees. As the s390x + * ABI requires, put our backchain at the end of the allocated memory. + */ tjit->stack_size = STACK_FRAME_OVERHEAD; + tjit->backchain_off = tjit->stack_size - sizeof(u64); tjit->stack_args_off = alloc_stack(tjit, nr_stack_args * sizeof(u64)); tjit->reg_args_off = alloc_stack(tjit, nr_reg_args * sizeof(u64)); tjit->ip_off = alloc_stack(tjit, sizeof(u64)); @@ -2255,15 +2262,28 @@ tjit->bpf_args_off = alloc_stack(tjit, nr_bpf_args * sizeof(u64)); tjit->retval_off = alloc_stack(tjit, sizeof(u64)); tjit->r7_r8_off = alloc_stack(tjit, 2 * sizeof(u64)); - tjit->r14_off = alloc_stack(tjit, sizeof(u64)); tjit->run_ctx_off = alloc_stack(tjit, sizeof(struct bpf_tramp_run_ctx)); - /* The caller has already reserved STACK_FRAME_OVERHEAD bytes. */ - tjit->stack_size -= STACK_FRAME_OVERHEAD; + tjit->tccnt_off = alloc_stack(tjit, sizeof(u64)); + tjit->r14_off = alloc_stack(tjit, sizeof(u64) * 2); + /* + * In accordance with the s390x ABI, the caller has allocated + * STACK_FRAME_OVERHEAD bytes for us. 8 of them contain the caller's + * backchain, and the rest we can use. + */ + tjit->stack_size -= STACK_FRAME_OVERHEAD - sizeof(u64); tjit->orig_stack_args_off = tjit->stack_size + STACK_FRAME_OVERHEAD; + /* lgr %r1,%r15 */ + EMIT4(0xb9040000, REG_1, REG_15); /* aghi %r15,-stack_size */ EMIT4_IMM(0xa70b0000, REG_15, -tjit->stack_size); + /* stg %r1,backchain_off(%r15) */ + EMIT6_DISP_LH(0xe3000000, 0x0024, REG_1, REG_0, REG_15, + tjit->backchain_off); + /* mvc tccnt_off(4,%r15),stack_size+STK_OFF_TCCNT(%r15) */ + _EMIT6(0xd203f000 | tjit->tccnt_off, + 0xf000 | (tjit->stack_size + STK_OFF_TCCNT)); /* stmg %r2,%rN,fwd_reg_args_off(%r15) */ if (nr_reg_args) EMIT6_DISP_LH(0xeb000000, 0x0024, REG_2, @@ -2400,6 +2420,8 @@ (nr_stack_args * sizeof(u64) - 1) << 16 | tjit->stack_args_off, 0xf000 | tjit->orig_stack_args_off); + /* mvc STK_OFF_TCCNT(4,%r15),tccnt_off(%r15) */ + _EMIT6(0xd203f000 | STK_OFF_TCCNT, 0xf000 | tjit->tccnt_off); /* lgr %r1,%r8 */ EMIT4(0xb9040000, REG_1, REG_8); /* %r1() */ @@ -2456,6 +2478,9 @@ if (flags & (BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_RET_FENTRY_RET)) EMIT6_DISP_LH(0xe3000000, 0x0004, REG_2, REG_0, REG_15, tjit->retval_off); + /* mvc stack_size+STK_OFF_TCCNT(4,%r15),tccnt_off(%r15) */ + _EMIT6(0xd203f000 | (tjit->stack_size + STK_OFF_TCCNT), + 0xf000 | tjit->tccnt_off); /* aghi %r15,stack_size */ EMIT4_IMM(0xa70b0000, REG_15, tjit->stack_size); /* Emit an expoline for the following indirect jump. */ @@ -2503,7 +2528,7 @@ return -E2BIG; } - return ret; + return tjit.common.prg; } bool bpf_jit_supports_subprog_tailcalls(void) --- linux-azure-6.5.0.orig/arch/s390/pci/pci_dma.c +++ linux-azure-6.5.0/arch/s390/pci/pci_dma.c @@ -564,6 +564,17 @@ s->dma_length = 0; } } + +static unsigned long *bitmap_vzalloc(size_t bits, gfp_t flags) +{ + size_t n = BITS_TO_LONGS(bits); + size_t bytes; + + if (unlikely(check_mul_overflow(n, sizeof(unsigned long), &bytes))) + return NULL; + + return vzalloc(bytes); +} int zpci_dma_init_device(struct zpci_dev *zdev) { @@ -604,13 +615,13 @@ zdev->end_dma - zdev->start_dma + 1); zdev->end_dma = zdev->start_dma + zdev->iommu_size - 1; zdev->iommu_pages = zdev->iommu_size >> PAGE_SHIFT; - zdev->iommu_bitmap = vzalloc(zdev->iommu_pages / 8); + zdev->iommu_bitmap = bitmap_vzalloc(zdev->iommu_pages, GFP_KERNEL); if (!zdev->iommu_bitmap) { rc = -ENOMEM; goto free_dma_table; } if (!s390_iommu_strict) { - zdev->lazy_bitmap = vzalloc(zdev->iommu_pages / 8); + zdev->lazy_bitmap = bitmap_vzalloc(zdev->iommu_pages, GFP_KERNEL); if (!zdev->lazy_bitmap) { rc = -ENOMEM; goto free_bitmap; --- linux-azure-6.5.0.orig/arch/sh/Kconfig.debug +++ linux-azure-6.5.0/arch/sh/Kconfig.debug @@ -22,6 +22,17 @@ every function call and will therefore incur a major performance hit. Most users should say N. +config EARLY_PRINTK + bool "Early printk" + depends on SH_STANDARD_BIOS + help + Say Y here to redirect kernel printk messages to the serial port + used by the SH-IPL bootloader, starting very early in the boot + process and ending when the kernel's serial console is initialised. + This option is only useful while porting the kernel to a new machine, + when the kernel may crash or hang before the serial console is + initialised. If unsure, say N. + config 4KSTACKS bool "Use 4Kb for kernel stacks instead of 8Kb" depends on DEBUG_KERNEL && (MMU || BROKEN) && !PAGE_SIZE_64KB --- linux-azure-6.5.0.orig/arch/sh/boards/mach-ap325rxa/setup.c +++ linux-azure-6.5.0/arch/sh/boards/mach-ap325rxa/setup.c @@ -531,7 +531,7 @@ device_initialize(&ap325rxa_ceu_device.dev); dma_declare_coherent_memory(&ap325rxa_ceu_device.dev, ceu_dma_membase, ceu_dma_membase, - ceu_dma_membase + CEU_BUFFER_MEMORY_SIZE - 1); + CEU_BUFFER_MEMORY_SIZE); platform_device_add(&ap325rxa_ceu_device); --- linux-azure-6.5.0.orig/arch/sh/boards/mach-ecovec24/setup.c +++ linux-azure-6.5.0/arch/sh/boards/mach-ecovec24/setup.c @@ -1454,15 +1454,13 @@ device_initialize(&ecovec_ceu_devices[0]->dev); dma_declare_coherent_memory(&ecovec_ceu_devices[0]->dev, ceu0_dma_membase, ceu0_dma_membase, - ceu0_dma_membase + - CEU_BUFFER_MEMORY_SIZE - 1); + CEU_BUFFER_MEMORY_SIZE); platform_device_add(ecovec_ceu_devices[0]); device_initialize(&ecovec_ceu_devices[1]->dev); dma_declare_coherent_memory(&ecovec_ceu_devices[1]->dev, ceu1_dma_membase, ceu1_dma_membase, - ceu1_dma_membase + - CEU_BUFFER_MEMORY_SIZE - 1); + CEU_BUFFER_MEMORY_SIZE); platform_device_add(ecovec_ceu_devices[1]); gpiod_add_lookup_table(&cn12_power_gpiod_table); --- linux-azure-6.5.0.orig/arch/sh/boards/mach-kfr2r09/setup.c +++ linux-azure-6.5.0/arch/sh/boards/mach-kfr2r09/setup.c @@ -603,7 +603,7 @@ device_initialize(&kfr2r09_ceu_device.dev); dma_declare_coherent_memory(&kfr2r09_ceu_device.dev, ceu_dma_membase, ceu_dma_membase, - ceu_dma_membase + CEU_BUFFER_MEMORY_SIZE - 1); + CEU_BUFFER_MEMORY_SIZE); platform_device_add(&kfr2r09_ceu_device); --- linux-azure-6.5.0.orig/arch/sh/boards/mach-migor/setup.c +++ linux-azure-6.5.0/arch/sh/boards/mach-migor/setup.c @@ -604,7 +604,7 @@ device_initialize(&migor_ceu_device.dev); dma_declare_coherent_memory(&migor_ceu_device.dev, ceu_dma_membase, ceu_dma_membase, - ceu_dma_membase + CEU_BUFFER_MEMORY_SIZE - 1); + CEU_BUFFER_MEMORY_SIZE); platform_device_add(&migor_ceu_device); --- linux-azure-6.5.0.orig/arch/sh/boards/mach-se/7724/setup.c +++ linux-azure-6.5.0/arch/sh/boards/mach-se/7724/setup.c @@ -940,15 +940,13 @@ device_initialize(&ms7724se_ceu_devices[0]->dev); dma_declare_coherent_memory(&ms7724se_ceu_devices[0]->dev, ceu0_dma_membase, ceu0_dma_membase, - ceu0_dma_membase + - CEU_BUFFER_MEMORY_SIZE - 1); + CEU_BUFFER_MEMORY_SIZE); platform_device_add(ms7724se_ceu_devices[0]); device_initialize(&ms7724se_ceu_devices[1]->dev); dma_declare_coherent_memory(&ms7724se_ceu_devices[1]->dev, ceu1_dma_membase, ceu1_dma_membase, - ceu1_dma_membase + - CEU_BUFFER_MEMORY_SIZE - 1); + CEU_BUFFER_MEMORY_SIZE); platform_device_add(ms7724se_ceu_devices[1]); return platform_add_devices(ms7724se_devices, --- linux-azure-6.5.0.orig/arch/sh/drivers/push-switch.c +++ linux-azure-6.5.0/arch/sh/drivers/push-switch.c @@ -101,8 +101,8 @@ device_remove_file(&pdev->dev, &dev_attr_switch); platform_set_drvdata(pdev, NULL); - flush_work(&psw->work); timer_shutdown_sync(&psw->debounce); + flush_work(&psw->work); free_irq(irq, pdev); kfree(psw); --- linux-azure-6.5.0.orig/arch/sparc/include/asm/irq_64.h +++ linux-azure-6.5.0/arch/sparc/include/asm/irq_64.h @@ -87,7 +87,7 @@ } void arch_trigger_cpumask_backtrace(const struct cpumask *mask, - bool exclude_self); + int exclude_cpu); #define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace extern void *hardirq_stack[NR_CPUS]; --- linux-azure-6.5.0.orig/arch/sparc/kernel/process_64.c +++ linux-azure-6.5.0/arch/sparc/kernel/process_64.c @@ -236,7 +236,7 @@ } } -void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self) +void arch_trigger_cpumask_backtrace(const cpumask_t *mask, int exclude_cpu) { struct thread_info *tp = current_thread_info(); struct pt_regs *regs = get_irq_regs(); @@ -252,7 +252,7 @@ memset(global_cpu_snapshot, 0, sizeof(global_cpu_snapshot)); - if (cpumask_test_cpu(this_cpu, mask) && !exclude_self) + if (cpumask_test_cpu(this_cpu, mask) && this_cpu != exclude_cpu) __global_reg_self(tp, regs, this_cpu); smp_fetch_global_regs(); @@ -260,7 +260,7 @@ for_each_cpu(cpu, mask) { struct global_reg_snapshot *gp; - if (exclude_self && cpu == this_cpu) + if (cpu == exclude_cpu) continue; gp = &global_cpu_snapshot[cpu].reg; --- linux-azure-6.5.0.orig/arch/sparc/lib/checksum_32.S +++ linux-azure-6.5.0/arch/sparc/lib/checksum_32.S @@ -453,5 +453,5 @@ * we only bother with faults on loads... */ cc_fault: - ret + retl clr %o0 --- linux-azure-6.5.0.orig/arch/um/configs/i386_defconfig +++ linux-azure-6.5.0/arch/um/configs/i386_defconfig @@ -34,6 +34,7 @@ CONFIG_XTERM_CHAN=y CONFIG_CON_CHAN="pts" CONFIG_SSL_CHAN="pts" +CONFIG_SOUND=m CONFIG_UML_SOUND=m CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y --- linux-azure-6.5.0.orig/arch/um/configs/x86_64_defconfig +++ linux-azure-6.5.0/arch/um/configs/x86_64_defconfig @@ -32,6 +32,7 @@ CONFIG_XTERM_CHAN=y CONFIG_CON_CHAN="pts" CONFIG_SSL_CHAN="pts" +CONFIG_SOUND=m CONFIG_UML_SOUND=m CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y --- linux-azure-6.5.0.orig/arch/um/drivers/Kconfig +++ linux-azure-6.5.0/arch/um/drivers/Kconfig @@ -111,24 +111,14 @@ config UML_SOUND tristate "Sound support" + depends on SOUND + select SOUND_OSS_CORE help This option enables UML sound support. If enabled, it will pull in - soundcore and the UML hostaudio relay, which acts as a intermediary + the UML hostaudio relay, which acts as a intermediary between the host's dsp and mixer devices and the UML sound system. It is safe to say 'Y' here. -config SOUND - tristate - default UML_SOUND - -config SOUND_OSS_CORE - bool - default UML_SOUND - -config HOSTAUDIO - tristate - default UML_SOUND - endmenu menu "UML Network Devices" --- linux-azure-6.5.0.orig/arch/um/drivers/Makefile +++ linux-azure-6.5.0/arch/um/drivers/Makefile @@ -54,7 +54,7 @@ obj-$(CONFIG_MCONSOLE) += mconsole.o obj-$(CONFIG_MMAPPER) += mmapper_kern.o obj-$(CONFIG_BLK_DEV_UBD) += ubd.o -obj-$(CONFIG_HOSTAUDIO) += hostaudio.o +obj-$(CONFIG_UML_SOUND) += hostaudio.o obj-$(CONFIG_NULL_CHAN) += null.o obj-$(CONFIG_PORT_CHAN) += port.o obj-$(CONFIG_PTY_CHAN) += pty.o --- linux-azure-6.5.0.orig/arch/um/drivers/virt-pci.c +++ linux-azure-6.5.0/arch/um/drivers/virt-pci.c @@ -544,6 +544,7 @@ } } +#ifdef CONFIG_OF /* Copied from arch/x86/kernel/devicetree.c */ struct device_node *pcibios_get_phb_of_node(struct pci_bus *bus) { @@ -562,6 +563,7 @@ } return NULL; } +#endif static int um_pci_init_vqs(struct um_pci_device *dev) { --- linux-azure-6.5.0.orig/arch/x86/Kconfig +++ linux-azure-6.5.0/arch/x86/Kconfig @@ -1955,6 +1955,7 @@ select UCS2_STRING select EFI_RUNTIME_WRAPPERS select ARCH_USE_MEMREMAP_PROT + select EFI_RUNTIME_MAP if KEXEC_CORE help This enables the kernel to use EFI runtime services that are available (such as the EFI variable services). @@ -2030,7 +2031,6 @@ config EFI_RUNTIME_MAP bool "Export EFI runtime maps to sysfs" if EXPERT depends on EFI - default KEXEC_CORE help Export EFI runtime memory regions to /sys/firmware/efi/runtime-map. That memory map is required by the 2nd kernel to set up EFI virtual --- linux-azure-6.5.0.orig/arch/x86/boot/compressed/head_64.S +++ linux-azure-6.5.0/arch/x86/boot/compressed/head_64.S @@ -459,11 +459,25 @@ /* Save the trampoline address in RCX */ movq %rax, %rcx + /* Set up 32-bit addressable stack */ + leaq TRAMPOLINE_32BIT_STACK_END(%rcx), %rsp + + /* + * Preserve live 64-bit registers on the stack: this is necessary + * because the architecture does not guarantee that GPRs will retain + * their full 64-bit values across a 32-bit mode switch. + */ + pushq %rbp + pushq %rbx + pushq %rsi + /* - * Load the address of trampoline_return() into RDI. - * It will be used by the trampoline to return to the main code. + * Push the 64-bit address of trampoline_return() onto the new stack. + * It will be used by the trampoline to return to the main code. Due to + * the 32-bit mode switch, it cannot be kept it in a register either. */ leaq trampoline_return(%rip), %rdi + pushq %rdi /* Switch to compatibility mode (CS.L = 0 CS.D = 1) via far return */ pushq $__KERNEL32_CS @@ -471,6 +485,11 @@ pushq %rax lretq trampoline_return: + /* Restore live 64-bit registers */ + popq %rsi + popq %rbx + popq %rbp + /* Restore the stack, the 32-bit trampoline uses its own stack */ leaq rva(boot_stack_end)(%rbx), %rsp @@ -582,7 +601,7 @@ /* * This is the 32-bit trampoline that will be copied over to low memory. * - * RDI contains the return address (might be above 4G). + * Return address is at the top of the stack (might be above 4G). * ECX contains the base address of the trampoline memory. * Non zero RDX means trampoline needs to enable 5-level paging. */ @@ -592,9 +611,6 @@ movl %eax, %ds movl %eax, %ss - /* Set up new stack */ - leal TRAMPOLINE_32BIT_STACK_END(%ecx), %esp - /* Disable paging */ movl %cr0, %eax btrl $X86_CR0_PG_BIT, %eax @@ -671,7 +687,7 @@ .code64 SYM_FUNC_START_LOCAL_NOALIGN(.Lpaging_enabled) /* Return from the trampoline */ - jmp *%rdi + retq SYM_FUNC_END(.Lpaging_enabled) /* --- linux-azure-6.5.0.orig/arch/x86/boot/compressed/ident_map_64.c +++ linux-azure-6.5.0/arch/x86/boot/compressed/ident_map_64.c @@ -59,6 +59,14 @@ return NULL; } + /* Consumed more tables than expected? */ + if (pages->pgt_buf_offset == BOOT_PGT_SIZE_WARN) { + debug_putstr("pgt_buf running low in " __FILE__ "\n"); + debug_putstr("Need to raise BOOT_PGT_SIZE?\n"); + debug_putaddr(pages->pgt_buf_offset); + debug_putaddr(pages->pgt_buf_size); + } + entry = pages->pgt_buf + pages->pgt_buf_offset; pages->pgt_buf_offset += PAGE_SIZE; --- linux-azure-6.5.0.orig/arch/x86/boot/compressed/sev.c +++ linux-azure-6.5.0/arch/x86/boot/compressed/sev.c @@ -103,6 +103,16 @@ return ES_OK; } +static enum es_result vc_ioio_check(struct es_em_ctxt *ctxt, u16 port, size_t size) +{ + return ES_OK; +} + +static bool fault_in_kernel_space(unsigned long address) +{ + return false; +} + #undef __init #define __init --- linux-azure-6.5.0.orig/arch/x86/boot/video-vga.c +++ linux-azure-6.5.0/arch/x86/boot/video-vga.c @@ -188,7 +188,7 @@ vga_set_vertical_end(60*8); } -static int vga_set_mode(struct mode_info *mode) +static int __attribute__((optimize("no-jump-tables"))) vga_set_mode(struct mode_info *mode) { /* Set the basic mode */ vga_set_basic_mode(); --- linux-azure-6.5.0.orig/arch/x86/coco/core.c +++ linux-azure-6.5.0/arch/x86/coco/core.c @@ -14,16 +14,20 @@ #include enum cc_vendor cc_vendor __ro_after_init = CC_VENDOR_NONE; +bool cc_attr_cpu_hotplug_disabled __ro_after_init = true; static u64 cc_mask __ro_after_init; static bool noinstr intel_cc_platform_has(enum cc_attr attr) { switch (attr) { case CC_ATTR_GUEST_UNROLL_STRING_IO: - case CC_ATTR_HOTPLUG_DISABLED: case CC_ATTR_GUEST_MEM_ENCRYPT: case CC_ATTR_MEM_ENCRYPT: return true; + + case CC_ATTR_HOTPLUG_DISABLED: + return cc_attr_cpu_hotplug_disabled; + default: return false; } --- linux-azure-6.5.0.orig/arch/x86/coco/tdx/tdcall.S +++ linux-azure-6.5.0/arch/x86/coco/tdx/tdcall.S @@ -195,6 +195,7 @@ xor %r10d, %r10d xor %r11d, %r11d xor %rdi, %rdi + xor %rsi, %rsi xor %rdx, %rdx /* Restore callee-saved GPRs as mandated by the x86_64 ABI */ --- linux-azure-6.5.0.orig/arch/x86/coco/tdx/tdx.c +++ linux-azure-6.5.0/arch/x86/coco/tdx/tdx.c @@ -7,9 +7,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -321,6 +323,18 @@ }; /* + * Work around the segfault issue in glibc 2.35 in Ubuntu 22.04. + * See https://sourceware.org/bugzilla/show_bug.cgi?id=28784 + * Ubuntu 22.04/22.10/23.04's glibc should pick up this glibc fix: + * https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=c242fcce06e3102ca663b2f992611d0bda4f2668 + */ + if (regs->ax == 2) { + regs->ax = 0xf1ff01; + regs->bx = regs->cx = regs->dx = 0; + return ve_instr_len(ve); + } + + /* * Only allow VMM to control range reserved for hypervisor * communication. * @@ -703,14 +717,15 @@ } /* - * Inform the VMM of the guest's intent for this physical page: shared with - * the VMM or private to the guest. The VMM is expected to change its mapping - * of the page in response. + * Notify the VMM about page mapping conversion. More info about ABI + * can be found in TDX Guest-Host-Communication Interface (GHCI), + * section "TDG.VP.VMCALL". */ -static bool tdx_enc_status_changed(unsigned long vaddr, int numpages, bool enc) +static bool tdx_map_gpa(phys_addr_t start, phys_addr_t end, bool enc) { - phys_addr_t start = __pa(vaddr); - phys_addr_t end = __pa(vaddr + numpages * PAGE_SIZE); + /* Retrying the hypercall a second time should succeed; use 3 just in case */ + const int max_retries_per_page = 3; + int retry_count = 0; if (!enc) { /* Set the shared (decrypted) bits: */ @@ -718,12 +733,44 @@ end |= cc_mkdec(0); } - /* - * Notify the VMM about page mapping conversion. More info about ABI - * can be found in TDX Guest-Host-Communication Interface (GHCI), - * section "TDG.VP.VMCALL" - */ - if (_tdx_hypercall(TDVMCALL_MAP_GPA, start, end - start, 0, 0)) + while (retry_count < max_retries_per_page) { + struct tdx_hypercall_args args = { + .r10 = TDX_HYPERCALL_STANDARD, + .r11 = TDVMCALL_MAP_GPA, + .r12 = start, + .r13 = end - start }; + + u64 map_fail_paddr; + u64 ret = __tdx_hypercall_ret(&args); + + if (ret != TDVMCALL_STATUS_RETRY) + return !ret; + /* + * The guest must retry the operation for the pages in the + * region starting at the GPA specified in R11. R11 comes + * from the untrusted VMM. Sanity check it. + */ + map_fail_paddr = args.r11; + if (map_fail_paddr < start || map_fail_paddr >= end) + return false; + + /* "Consume" a retry without forward progress */ + if (map_fail_paddr == start) { + retry_count++; + continue; + } + + start = map_fail_paddr; + retry_count = 0; + } + + return false; +} + +static bool tdx_enc_status_changed_phys(phys_addr_t start, phys_addr_t end, + bool enc) +{ + if (!tdx_map_gpa(start, end, enc)) return false; /* shared->private conversion requires memory to be accepted before use */ @@ -732,6 +779,36 @@ return true; } + +/* + * Inform the VMM of the guest's intent for this physical page: shared with + * the VMM or private to the guest. The VMM is expected to change its mapping + * of the page in response. + */ +static bool tdx_enc_status_changed(unsigned long vaddr, int numpages, bool enc) +{ + unsigned long start = vaddr; + unsigned long end = start + numpages * PAGE_SIZE; + unsigned long step = end - start; + unsigned long addr; + + if (offset_in_page(start) != 0) + return false; + + /* Step through page-by-page for vmalloc() mappings: */ + if (is_vmalloc_addr((void *)vaddr)) + step = PAGE_SIZE; + + for (addr = start; addr < end; addr += step) { + phys_addr_t start_pa = slow_virt_to_phys((void *)addr); + phys_addr_t end_pa = start_pa + step; + + if (!tdx_enc_status_changed_phys(start_pa, end_pa, enc)) + return false; + } + + return true; +} static bool tdx_enc_status_change_prepare(unsigned long vaddr, int numpages, bool enc) --- linux-azure-6.5.0.orig/arch/x86/crypto/sha1_ssse3_glue.c +++ linux-azure-6.5.0/arch/x86/crypto/sha1_ssse3_glue.c @@ -24,8 +24,17 @@ #include #include #include +#include #include +static const struct x86_cpu_id module_cpu_ids[] = { + X86_MATCH_FEATURE(X86_FEATURE_AVX2, NULL), + X86_MATCH_FEATURE(X86_FEATURE_AVX, NULL), + X86_MATCH_FEATURE(X86_FEATURE_SSSE3, NULL), + {} +}; +MODULE_DEVICE_TABLE(x86cpu, module_cpu_ids); + static int sha1_update(struct shash_desc *desc, const u8 *data, unsigned int len, sha1_block_fn *sha1_xform) { @@ -301,6 +310,9 @@ static int __init sha1_ssse3_mod_init(void) { + if (!x86_match_cpu(module_cpu_ids)) + return -ENODEV; + if (register_sha1_ssse3()) goto fail; --- linux-azure-6.5.0.orig/arch/x86/crypto/sha256_ssse3_glue.c +++ linux-azure-6.5.0/arch/x86/crypto/sha256_ssse3_glue.c @@ -38,11 +38,20 @@ #include #include #include +#include #include asmlinkage void sha256_transform_ssse3(struct sha256_state *state, const u8 *data, int blocks); +static const struct x86_cpu_id module_cpu_ids[] = { + X86_MATCH_FEATURE(X86_FEATURE_AVX2, NULL), + X86_MATCH_FEATURE(X86_FEATURE_AVX, NULL), + X86_MATCH_FEATURE(X86_FEATURE_SSSE3, NULL), + {} +}; +MODULE_DEVICE_TABLE(x86cpu, module_cpu_ids); + static int _sha256_update(struct shash_desc *desc, const u8 *data, unsigned int len, sha256_block_fn *sha256_xform) { @@ -366,6 +375,9 @@ static int __init sha256_ssse3_mod_init(void) { + if (!x86_match_cpu(module_cpu_ids)) + return -ENODEV; + if (register_sha256_ssse3()) goto fail; --- linux-azure-6.5.0.orig/arch/x86/entry/common.c +++ linux-azure-6.5.0/arch/x86/entry/common.c @@ -25,6 +25,7 @@ #include #endif +#include #include #include #include @@ -96,6 +97,10 @@ return (int)regs->orig_ax; } +#ifdef CONFIG_IA32_EMULATION +bool __ia32_enabled __ro_after_init = true; +#endif + /* * Invoke a 32-bit syscall. Called with IRQs on in CONTEXT_KERNEL. */ @@ -115,7 +120,96 @@ } } -/* Handles int $0x80 */ +#ifdef CONFIG_IA32_EMULATION +static __always_inline bool int80_is_external(void) +{ + const unsigned int offs = (0x80 / 32) * 0x10; + const u32 bit = BIT(0x80 % 32); + + /* The local APIC on XENPV guests is fake */ + if (cpu_feature_enabled(X86_FEATURE_XENPV)) + return false; + + /* + * If vector 0x80 is set in the APIC ISR then this is an external + * interrupt. Either from broken hardware or injected by a VMM. + * + * Note: In guest mode this is only valid for secure guests where + * the secure module fully controls the vAPIC exposed to the guest. + */ + return apic_read(APIC_ISR + offs) & bit; +} + +/** + * int80_emulation - 32-bit legacy syscall entry + * + * This entry point can be used by 32-bit and 64-bit programs to perform + * 32-bit system calls. Instances of INT $0x80 can be found inline in + * various programs and libraries. It is also used by the vDSO's + * __kernel_vsyscall fallback for hardware that doesn't support a faster + * entry method. Restarted 32-bit system calls also fall back to INT + * $0x80 regardless of what instruction was originally used to do the + * system call. + * + * This is considered a slow path. It is not used by most libc + * implementations on modern hardware except during process startup. + * + * The arguments for the INT $0x80 based syscall are on stack in the + * pt_regs structure: + * eax: system call number + * ebx, ecx, edx, esi, edi, ebp: arg1 - arg 6 + */ +DEFINE_IDTENTRY_RAW(int80_emulation) +{ + int nr; + + /* Kernel does not use INT $0x80! */ + if (unlikely(!user_mode(regs))) { + irqentry_enter(regs); + instrumentation_begin(); + panic("Unexpected external interrupt 0x80\n"); + } + + /* + * Establish kernel context for instrumentation, including for + * int80_is_external() below which calls into the APIC driver. + * Identical for soft and external interrupts. + */ + enter_from_user_mode(regs); + + instrumentation_begin(); + add_random_kstack_offset(); + + /* Validate that this is a soft interrupt to the extent possible */ + if (unlikely(int80_is_external())) + panic("Unexpected external interrupt 0x80\n"); + + /* + * The low level idtentry code pushed -1 into regs::orig_ax + * and regs::ax contains the syscall number. + * + * User tracing code (ptrace or signal handlers) might assume + * that the regs::orig_ax contains a 32-bit number on invoking + * a 32-bit syscall. + * + * Establish the syscall convention by saving the 32bit truncated + * syscall number in regs::orig_ax and by invalidating regs::ax. + */ + regs->orig_ax = regs->ax & GENMASK(31, 0); + regs->ax = -ENOSYS; + + nr = syscall_32_enter(regs); + + local_irq_enable(); + nr = syscall_enter_from_user_mode_work(regs, nr); + do_syscall_32_irqs_on(regs, nr); + + instrumentation_end(); + syscall_exit_to_user_mode(regs); +} +#else /* CONFIG_IA32_EMULATION */ + +/* Handles int $0x80 on a 32bit kernel */ __visible noinstr void do_int80_syscall_32(struct pt_regs *regs) { int nr = syscall_32_enter(regs); @@ -134,6 +228,7 @@ instrumentation_end(); syscall_exit_to_user_mode(regs); } +#endif /* !CONFIG_IA32_EMULATION */ static noinstr bool __do_fast_syscall_32(struct pt_regs *regs) { @@ -294,7 +389,7 @@ inc_irq_stat(irq_hv_callback_count); - xen_hvm_evtchn_do_upcall(); + xen_evtchn_do_upcall(); set_irq_regs(old_regs); } --- linux-azure-6.5.0.orig/arch/x86/entry/entry_64_compat.S +++ linux-azure-6.5.0/arch/x86/entry/entry_64_compat.S @@ -276,80 +276,3 @@ ANNOTATE_NOENDBR int3 SYM_CODE_END(entry_SYSCALL_compat) - -/* - * 32-bit legacy system call entry. - * - * 32-bit x86 Linux system calls traditionally used the INT $0x80 - * instruction. INT $0x80 lands here. - * - * This entry point can be used by 32-bit and 64-bit programs to perform - * 32-bit system calls. Instances of INT $0x80 can be found inline in - * various programs and libraries. It is also used by the vDSO's - * __kernel_vsyscall fallback for hardware that doesn't support a faster - * entry method. Restarted 32-bit system calls also fall back to INT - * $0x80 regardless of what instruction was originally used to do the - * system call. - * - * This is considered a slow path. It is not used by most libc - * implementations on modern hardware except during process startup. - * - * Arguments: - * eax system call number - * ebx arg1 - * ecx arg2 - * edx arg3 - * esi arg4 - * edi arg5 - * ebp arg6 - */ -SYM_CODE_START(entry_INT80_compat) - UNWIND_HINT_ENTRY - ENDBR - /* - * Interrupts are off on entry. - */ - ASM_CLAC /* Do this early to minimize exposure */ - ALTERNATIVE "swapgs", "", X86_FEATURE_XENPV - - /* - * User tracing code (ptrace or signal handlers) might assume that - * the saved RAX contains a 32-bit number when we're invoking a 32-bit - * syscall. Just in case the high bits are nonzero, zero-extend - * the syscall number. (This could almost certainly be deleted - * with no ill effects.) - */ - movl %eax, %eax - - /* switch to thread stack expects orig_ax and rdi to be pushed */ - pushq %rax /* pt_regs->orig_ax */ - - /* Need to switch before accessing the thread stack. */ - SWITCH_TO_KERNEL_CR3 scratch_reg=%rax - - /* In the Xen PV case we already run on the thread stack. */ - ALTERNATIVE "", "jmp .Lint80_keep_stack", X86_FEATURE_XENPV - - movq %rsp, %rax - movq PER_CPU_VAR(pcpu_hot + X86_top_of_stack), %rsp - - pushq 5*8(%rax) /* regs->ss */ - pushq 4*8(%rax) /* regs->rsp */ - pushq 3*8(%rax) /* regs->eflags */ - pushq 2*8(%rax) /* regs->cs */ - pushq 1*8(%rax) /* regs->ip */ - pushq 0*8(%rax) /* regs->orig_ax */ -.Lint80_keep_stack: - - PUSH_AND_CLEAR_REGS rax=$-ENOSYS - UNWIND_HINT_REGS - - cld - - IBRS_ENTER - UNTRAIN_RET - - movq %rsp, %rdi - call do_int80_syscall_32 - jmp swapgs_restore_regs_and_return_to_usermode -SYM_CODE_END(entry_INT80_compat) --- linux-azure-6.5.0.orig/arch/x86/entry/vdso/vma.c +++ linux-azure-6.5.0/arch/x86/entry/vdso/vma.c @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -189,9 +190,13 @@ } } else if (sym_offset == image->sym_hvclock_page) { pfn = hv_get_tsc_pfn(); - - if (pfn && vclock_was_used(VDSO_CLOCKMODE_HVCLOCK)) - return vmf_insert_pfn(vma, vmf->address, pfn); + if (pfn && vclock_was_used(VDSO_CLOCKMODE_HVCLOCK)) { + if (ms_hyperv.paravisor_present) + return vmf_insert_pfn(vma, vmf->address, pfn); + else + return vmf_insert_pfn_prot(vma, vmf->address, + pfn, pgprot_decrypted(vma->vm_page_prot)); + } } else if (sym_offset == image->sym_timens_page) { struct page *timens_page = find_timens_vvar_page(vma); --- linux-azure-6.5.0.orig/arch/x86/events/amd/core.c +++ linux-azure-6.5.0/arch/x86/events/amd/core.c @@ -534,8 +534,12 @@ /* Clear enable bits i.e. PerfCntrGlobalCtl.PerfCntrEn */ wrmsrl(MSR_AMD64_PERF_CNTR_GLOBAL_CTL, 0); - /* Clear overflow bits i.e. PerfCntrGLobalStatus.PerfCntrOvfl */ - wrmsrl(MSR_AMD64_PERF_CNTR_GLOBAL_STATUS_CLR, amd_pmu_global_cntr_mask); + /* + * Clear freeze and overflow bits i.e. PerfCntrGLobalStatus.LbrFreeze + * and PerfCntrGLobalStatus.PerfCntrOvfl + */ + wrmsrl(MSR_AMD64_PERF_CNTR_GLOBAL_STATUS_CLR, + GLOBAL_STATUS_LBRS_FROZEN | amd_pmu_global_cntr_mask); } static int amd_pmu_cpu_prepare(int cpu) @@ -570,6 +574,7 @@ int i, nb_id; cpuc->perf_ctr_virt_mask = AMD64_EVENTSEL_HOSTONLY; + amd_pmu_cpu_reset(cpu); if (!x86_pmu.amd_nb_constraints) return; @@ -591,8 +596,6 @@ cpuc->amd_nb->nb_id = nb_id; cpuc->amd_nb->refcnt++; - - amd_pmu_cpu_reset(cpu); } static void amd_pmu_cpu_dead(int cpu) @@ -601,6 +604,7 @@ kfree(cpuhw->lbr_sel); cpuhw->lbr_sel = NULL; + amd_pmu_cpu_reset(cpu); if (!x86_pmu.amd_nb_constraints) return; @@ -613,8 +617,6 @@ cpuhw->amd_nb = NULL; } - - amd_pmu_cpu_reset(cpu); } static inline void amd_pmu_set_global_ctl(u64 ctl) @@ -884,7 +886,7 @@ struct hw_perf_event *hwc; struct perf_event *event; int handled = 0, idx; - u64 status, mask; + u64 reserved, status, mask; bool pmu_enabled; /* @@ -909,6 +911,14 @@ status &= ~GLOBAL_STATUS_LBRS_FROZEN; } + reserved = status & ~amd_pmu_global_cntr_mask; + if (reserved) + pr_warn_once("Reserved PerfCntrGlobalStatus bits are set (0x%llx), please consider updating microcode\n", + reserved); + + /* Clear any reserved bits set by buggy microcode */ + status &= amd_pmu_global_cntr_mask; + for (idx = 0; idx < x86_pmu.num_counters; idx++) { if (!test_bit(idx, cpuc->active_mask)) continue; --- linux-azure-6.5.0.orig/arch/x86/events/intel/core.c +++ linux-azure-6.5.0/arch/x86/events/intel/core.c @@ -4051,12 +4051,17 @@ u64 pebs_mask = cpuc->pebs_enabled & x86_pmu.pebs_capable; int global_ctrl, pebs_enable; + /* + * In addition to obeying exclude_guest/exclude_host, remove bits being + * used for PEBS when running a guest, because PEBS writes to virtual + * addresses (not physical addresses). + */ *nr = 0; global_ctrl = (*nr)++; arr[global_ctrl] = (struct perf_guest_switch_msr){ .msr = MSR_CORE_PERF_GLOBAL_CTRL, .host = intel_ctrl & ~cpuc->intel_ctrl_guest_mask, - .guest = intel_ctrl & (~cpuc->intel_ctrl_host_mask | ~pebs_mask), + .guest = intel_ctrl & ~cpuc->intel_ctrl_host_mask & ~pebs_mask, }; if (!x86_pmu.pebs) --- linux-azure-6.5.0.orig/arch/x86/events/intel/uncore_snbep.c +++ linux-azure-6.5.0/arch/x86/events/intel/uncore_snbep.c @@ -6474,8 +6474,18 @@ type = uncore_find_type_by_id(uncore_msr_uncores, UNCORE_SPR_CHA); if (type) { + /* + * The value from the discovery table (stored in the type->num_boxes + * of UNCORE_SPR_CHA) is incorrect on some SPR variants because of a + * firmware bug. Using the value from SPR_MSR_UNC_CBO_CONFIG to replace it. + */ rdmsrl(SPR_MSR_UNC_CBO_CONFIG, num_cbo); - type->num_boxes = num_cbo; + /* + * The MSR doesn't work on the EMR XCC, but the firmware bug doesn't impact + * the EMR XCC. Don't let the value from the MSR replace the existing value. + */ + if (num_cbo) + type->num_boxes = num_cbo; } spr_uncore_iio_free_running.num_boxes = uncore_type_max_boxes(uncore_msr_uncores, UNCORE_SPR_IIO); } --- linux-azure-6.5.0.orig/arch/x86/events/utils.c +++ linux-azure-6.5.0/arch/x86/events/utils.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 #include +#include #include "perf_event.h" @@ -132,9 +133,9 @@ * The LBR logs any address in the IP, even if the IP just * faulted. This means userspace can control the from address. * Ensure we don't blindly read any address by validating it is - * a known text address. + * a known text address and not a vsyscall address. */ - if (kernel_text_address(from)) { + if (kernel_text_address(from) && !in_gate_area_no_mm(from)) { addr = (void *)from; /* * Assume we can get the maximum possible size --- linux-azure-6.5.0.orig/arch/x86/hyperv/hv_apic.c +++ linux-azure-6.5.0/arch/x86/hyperv/hv_apic.c @@ -175,8 +175,11 @@ (exclude_self && weight == 1 && cpumask_test_cpu(this_cpu, mask))) return true; - if (!hv_hypercall_pg) - return false; + /* A fully enlightened TDX VM uses GHCI rather than hv_hypercall_pg. */ + if (!hv_hypercall_pg) { + if (ms_hyperv.paravisor_present || !hv_isolation_type_tdx()) + return false; + } if ((vector < HV_IPI_LOW_VECTOR) || (vector > HV_IPI_HIGH_VECTOR)) return false; @@ -229,9 +232,15 @@ trace_hyperv_send_ipi_one(cpu, vector); - if (!hv_hypercall_pg || (vp == VP_INVAL)) + if (vp == VP_INVAL) return false; + /* A fully enlightened TDX VM uses GHCI rather than hv_hypercall_pg. */ + if (!hv_hypercall_pg) { + if (ms_hyperv.paravisor_present || !hv_isolation_type_tdx()) + return false; + } + if ((vector < HV_IPI_LOW_VECTOR) || (vector > HV_IPI_HIGH_VECTOR)) return false; --- linux-azure-6.5.0.orig/arch/x86/hyperv/hv_init.c +++ linux-azure-6.5.0/arch/x86/hyperv/hv_init.c @@ -13,12 +13,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include #include @@ -52,7 +54,7 @@ void *ghcb_va; void **ghcb_base; - if (!hv_isolation_type_snp()) + if (!ms_hyperv.paravisor_present || !hv_isolation_type_snp()) return 0; if (!hv_ghcb_pg) @@ -80,7 +82,7 @@ static int hv_cpu_init(unsigned int cpu) { union hv_vp_assist_msr_contents msr = { 0 }; - struct hv_vp_assist_page **hvp = &hv_vp_assist_page[cpu]; + struct hv_vp_assist_page **hvp; int ret; ret = hv_common_cpu_init(cpu); @@ -90,6 +92,7 @@ if (!hv_vp_assist_page) return 0; + hvp = &hv_vp_assist_page[cpu]; if (hv_root_partition) { /* * For root partition we get the hypervisor provided VP assist @@ -107,8 +110,21 @@ * in hv_cpu_die(), otherwise a CPU may not be stopped in the * case of CPU offlining and the VM will hang. */ - if (!*hvp) + if (!*hvp) { *hvp = __vmalloc(PAGE_SIZE, GFP_KERNEL | __GFP_ZERO); + + /* + * Hyper-V should never specify a VM that is a Confidential + * VM and also running in the root partition. Root partition + * is blocked to run in Confidential VM. So only decrypt assist + * page in non-root partition here. + */ + if (*hvp && !ms_hyperv.paravisor_present && hv_isolation_type_snp()) { + WARN_ON_ONCE(set_memory_decrypted((unsigned long)(*hvp), 1)); + memset(*hvp, 0, PAGE_SIZE); + } + } + if (*hvp) msr.pfn = vmalloc_to_pfn(*hvp); @@ -269,15 +285,31 @@ static int __init hv_pci_init(void) { - int gen2vm = efi_enabled(EFI_BOOT); + bool gen2vm = efi_enabled(EFI_BOOT); /* - * For Generation-2 VM, we exit from pci_arch_init() by returning 0. - * The purpose is to suppress the harmless warning: + * A Generation-2 VM doesn't support legacy PCI/PCIe, so both + * raw_pci_ops and raw_pci_ext_ops are NULL, and pci_subsys_init() -> + * pcibios_init() doesn't call pcibios_resource_survey() -> + * e820__reserve_resources_late(); as a result, any emulated persistent + * memory of E820_TYPE_PRAM (12) via the kernel parameter + * memmap=nn[KMG]!ss is not added into iomem_resource and hence can't be + * detected by register_e820_pmem(). Fix this by directly calling + * e820__reserve_resources_late() here: e820__reserve_resources_late() + * depends on e820__reserve_resources(), which has been called earlier + * from setup_arch(). Note: e820__reserve_resources_late() also adds + * any memory of E820_TYPE_PMEM (7) into iomem_resource, and + * acpi_nfit_register_region() -> acpi_nfit_insert_resource() -> + * region_intersects() returns REGION_INTERSECTS, so the memory of + * E820_TYPE_PMEM won't get added twice. + * + * We return 0 here so that pci_arch_init() won't print the warning: * "PCI: Fatal: No config space access function found" */ - if (gen2vm) + if (gen2vm) { + e820__reserve_resources_late(); return 0; + } /* For Generation-1 VM, we'll proceed in pci_arch_init(). */ return 1; @@ -379,6 +411,36 @@ local_irq_restore(flags); } +static u8 __init get_vtl(void) +{ + u64 control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_REGISTERS; + struct hv_get_vp_registers_input *input; + struct hv_get_vp_registers_output *output; + unsigned long flags; + u64 ret; + + local_irq_save(flags); + input = *this_cpu_ptr(hyperv_pcpu_input_arg); + output = (struct hv_get_vp_registers_output *)input; + + memset(input, 0, struct_size(input, element, 1)); + input->header.partitionid = HV_PARTITION_ID_SELF; + input->header.vpindex = HV_VP_INDEX_SELF; + input->header.inputvtl = 0; + input->element[0].name0 = HV_X64_REGISTER_VSM_VP_STATUS; + + ret = hv_do_hypercall(control, input, output); + if (hv_result_success(ret)) { + ret = output->as64.low & HV_X64_VTL_MASK; + } else { + pr_err("Failed to get VTL(%lld) and set VTL to zero by default.\n", ret); + ret = 0; + } + + local_irq_restore(flags); + return ret; +} + /* * This function is to be invoked early in the boot sequence after the * hypervisor has been detected. @@ -399,14 +461,24 @@ if (hv_common_init()) return; - hv_vp_assist_page = kcalloc(num_possible_cpus(), - sizeof(*hv_vp_assist_page), GFP_KERNEL); + /* + * The VP assist page is useless to a TDX guest: the only use we + * would have for it is lazy EOI, which can not be used with TDX. + */ + if (hv_isolation_type_tdx()) + hv_vp_assist_page = NULL; + else + hv_vp_assist_page = kcalloc(num_possible_cpus(), + sizeof(*hv_vp_assist_page), + GFP_KERNEL); if (!hv_vp_assist_page) { ms_hyperv.hints &= ~HV_X64_ENLIGHTENED_VMCS_RECOMMENDED; - goto common_free; + + if (!hv_isolation_type_tdx()) + goto common_free; } - if (hv_isolation_type_snp()) { + if (ms_hyperv.paravisor_present && hv_isolation_type_snp()) { /* Negotiate GHCB Version. */ if (!hv_ghcb_negotiate_protocol()) hv_ghcb_terminate(SEV_TERM_SET_GEN, @@ -426,12 +498,32 @@ * Setup the hypercall page and enable hypercalls. * 1. Register the guest ID * 2. Enable the hypercall and register the hypercall page + * + * A TDX VM with no paravisor only uses TDX GHCI rather than hv_hypercall_pg: + * when the hypercall input is a page, such a VM must pass a decrypted + * page to Hyper-V, e.g. hv_post_message() uses the per-CPU page + * hyperv_pcpu_input_arg, which is decrypted if no paravisor is present. + * + * A TDX VM with the paravisor uses hv_hypercall_pg for most hypercalls, + * which are handled by the paravisor and the VM must use an encrypted + * input page: in such a VM, the hyperv_pcpu_input_arg is encrypted and + * used in the hypercalls, e.g. see hv_mark_gpa_visibility() and + * hv_arch_irq_unmask(). Such a VM uses TDX GHCI for two hypercalls: + * 1. HVCALL_SIGNAL_EVENT: see vmbus_set_event() and _hv_do_fast_hypercall8(). + * 2. HVCALL_POST_MESSAGE: the input page must be a decrypted page, i.e. + * hv_post_message() in such a VM can't use the encrypted hyperv_pcpu_input_arg; + * instead, hv_post_message() uses the post_msg_page, which is decrypted + * in such a VM and is only used in such a VM. */ guest_id = hv_generate_guest_id(LINUX_VERSION_CODE); wrmsrl(HV_X64_MSR_GUEST_OS_ID, guest_id); - /* Hyper-V requires to write guest os id via ghcb in SNP IVM. */ - hv_ghcb_msr_write(HV_X64_MSR_GUEST_OS_ID, guest_id); + /* With the paravisor, the VM must also write the ID via GHCB/GHCI */ + hv_ivm_msr_write(HV_X64_MSR_GUEST_OS_ID, guest_id); + + /* A TDX VM with no paravisor only uses TDX GHCI rather than hv_hypercall_pg */ + if (hv_isolation_type_tdx() && !ms_hyperv.paravisor_present) + goto skip_hypercall_pg_init; hv_hypercall_pg = __vmalloc_node_range(PAGE_SIZE, 1, VMALLOC_START, VMALLOC_END, GFP_KERNEL, PAGE_KERNEL_ROX, @@ -472,6 +564,7 @@ wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64); } +skip_hypercall_pg_init: /* * Some versions of Hyper-V that provide IBT in guest VMs have a bug * in that there's no ENDBR64 instruction at the entry to the @@ -527,11 +620,15 @@ /* Query the VMs extended capability once, so that it can be cached. */ hv_query_ext_cap(0); + /* Find the VTL */ + if (!ms_hyperv.paravisor_present && hv_isolation_type_snp()) + ms_hyperv.vtl = get_vtl(); + return; clean_guest_os_id: wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0); - hv_ghcb_msr_write(HV_X64_MSR_GUEST_OS_ID, 0); + hv_ivm_msr_write(HV_X64_MSR_GUEST_OS_ID, 0); cpuhp_remove_state(cpuhp); free_ghcb_page: free_percpu(hv_ghcb_pg); @@ -552,7 +649,7 @@ /* Reset our OS id */ wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0); - hv_ghcb_msr_write(HV_X64_MSR_GUEST_OS_ID, 0); + hv_ivm_msr_write(HV_X64_MSR_GUEST_OS_ID, 0); /* * Reset hypercall page reference before reset the page, @@ -615,6 +712,9 @@ if (x86_hyper_type != X86_HYPER_MS_HYPERV) return false; + /* A TDX VM with no paravisor uses TDX GHCI call rather than hv_hypercall_pg */ + if (hv_isolation_type_tdx() && !ms_hyperv.paravisor_present) + return true; /* * Verify that earlier initialization succeeded by checking * that the hypercall page is setup --- linux-azure-6.5.0.orig/arch/x86/hyperv/ivm.c +++ linux-azure-6.5.0/arch/x86/hyperv/ivm.c @@ -18,6 +18,11 @@ #include #include #include +#include +#include +#include +#include +#include #ifdef CONFIG_AMD_MEM_ENCRYPT @@ -56,8 +61,10 @@ } hypercall; } __packed __aligned(HV_HYP_PAGE_SIZE); +/* Only used in an SNP VM with the paravisor */ static u16 hv_ghcb_version __ro_after_init; +/* Functions only used in an SNP VM with the paravisor go here. */ u64 hv_ghcb_hypercall(u64 control, void *input, void *output, u32 input_size) { union hv_ghcb *hv_ghcb; @@ -175,7 +182,7 @@ return true; } -void hv_ghcb_msr_write(u64 msr, u64 value) +static void hv_ghcb_msr_write(u64 msr, u64 value) { union hv_ghcb *hv_ghcb; void **ghcb_base; @@ -203,9 +210,8 @@ local_irq_restore(flags); } -EXPORT_SYMBOL_GPL(hv_ghcb_msr_write); -void hv_ghcb_msr_read(u64 msr, u64 *value) +static void hv_ghcb_msr_read(u64 msr, u64 *value) { union hv_ghcb *hv_ghcb; void **ghcb_base; @@ -235,7 +241,217 @@ | ((u64)lower_32_bits(hv_ghcb->ghcb.save.rdx) << 32); local_irq_restore(flags); } -EXPORT_SYMBOL_GPL(hv_ghcb_msr_read); + +/* Only used in a fully enlightened SNP VM, i.e. without the paravisor */ +static u8 ap_start_input_arg[PAGE_SIZE] __bss_decrypted __aligned(PAGE_SIZE); +static u8 ap_start_stack[PAGE_SIZE] __aligned(PAGE_SIZE); +static DEFINE_PER_CPU(struct sev_es_save_area *, hv_sev_vmsa); + +/* Functions only used in an SNP VM without the paravisor go here. */ + +#define hv_populate_vmcb_seg(seg, gdtr_base) \ +do { \ + if (seg.selector) { \ + seg.base = 0; \ + seg.limit = HV_AP_SEGMENT_LIMIT; \ + seg.attrib = *(u16 *)(gdtr_base + seg.selector + 5); \ + seg.attrib = (seg.attrib & 0xFF) | ((seg.attrib >> 4) & 0xF00); \ + } \ +} while (0) \ + +static int snp_set_vmsa(void *va, bool vmsa) +{ + u64 attrs; + + /* + * Running at VMPL0 allows the kernel to change the VMSA bit for a page + * using the RMPADJUST instruction. However, for the instruction to + * succeed it must target the permissions of a lesser privileged + * (higher numbered) VMPL level, so use VMPL1 (refer to the RMPADJUST + * instruction in the AMD64 APM Volume 3). + */ + attrs = 1; + if (vmsa) + attrs |= RMPADJUST_VMSA_PAGE_BIT; + + return rmpadjust((unsigned long)va, RMP_PG_SIZE_4K, attrs); +} + +static void snp_cleanup_vmsa(struct sev_es_save_area *vmsa) +{ + int err; + + err = snp_set_vmsa(vmsa, false); + if (err) + pr_err("clear VMSA page failed (%u), leaking page\n", err); + else + free_page((unsigned long)vmsa); +} + +int hv_snp_boot_ap(int cpu, unsigned long start_ip) +{ + struct sev_es_save_area *vmsa = (struct sev_es_save_area *) + __get_free_page(GFP_KERNEL | __GFP_ZERO); + struct sev_es_save_area *cur_vmsa; + struct desc_ptr gdtr; + u64 ret, retry = 5; + struct hv_enable_vp_vtl *start_vp_input; + unsigned long flags; + + if (!vmsa) + return -ENOMEM; + + native_store_gdt(&gdtr); + + vmsa->gdtr.base = gdtr.address; + vmsa->gdtr.limit = gdtr.size; + + asm volatile("movl %%es, %%eax;" : "=a" (vmsa->es.selector)); + hv_populate_vmcb_seg(vmsa->es, vmsa->gdtr.base); + + asm volatile("movl %%cs, %%eax;" : "=a" (vmsa->cs.selector)); + hv_populate_vmcb_seg(vmsa->cs, vmsa->gdtr.base); + + asm volatile("movl %%ss, %%eax;" : "=a" (vmsa->ss.selector)); + hv_populate_vmcb_seg(vmsa->ss, vmsa->gdtr.base); + + asm volatile("movl %%ds, %%eax;" : "=a" (vmsa->ds.selector)); + hv_populate_vmcb_seg(vmsa->ds, vmsa->gdtr.base); + + vmsa->efer = native_read_msr(MSR_EFER); + + asm volatile("movq %%cr4, %%rax;" : "=a" (vmsa->cr4)); + asm volatile("movq %%cr3, %%rax;" : "=a" (vmsa->cr3)); + asm volatile("movq %%cr0, %%rax;" : "=a" (vmsa->cr0)); + + vmsa->xcr0 = 1; + vmsa->g_pat = HV_AP_INIT_GPAT_DEFAULT; + vmsa->rip = (u64)secondary_startup_64_no_verify; + vmsa->rsp = (u64)&ap_start_stack[PAGE_SIZE]; + + /* + * Set the SNP-specific fields for this VMSA: + * VMPL level + * SEV_FEATURES (matches the SEV STATUS MSR right shifted 2 bits) + */ + vmsa->vmpl = 0; + vmsa->sev_features = sev_status >> 2; + + ret = snp_set_vmsa(vmsa, true); + if (!ret) { + pr_err("RMPADJUST(%llx) failed: %llx\n", (u64)vmsa, ret); + free_page((u64)vmsa); + return ret; + } + + local_irq_save(flags); + start_vp_input = (struct hv_enable_vp_vtl *)ap_start_input_arg; + memset(start_vp_input, 0, sizeof(*start_vp_input)); + start_vp_input->partition_id = -1; + start_vp_input->vp_index = cpu; + start_vp_input->target_vtl.target_vtl = ms_hyperv.vtl; + *(u64 *)&start_vp_input->vp_context = __pa(vmsa) | 1; + + do { + ret = hv_do_hypercall(HVCALL_START_VP, + start_vp_input, NULL); + } while (hv_result(ret) == HV_STATUS_TIME_OUT && retry--); + + local_irq_restore(flags); + + if (!hv_result_success(ret)) { + pr_err("HvCallStartVirtualProcessor failed: %llx\n", ret); + snp_cleanup_vmsa(vmsa); + vmsa = NULL; + } + + cur_vmsa = per_cpu(hv_sev_vmsa, cpu); + /* Free up any previous VMSA page */ + if (cur_vmsa) + snp_cleanup_vmsa(cur_vmsa); + + /* Record the current VMSA page */ + per_cpu(hv_sev_vmsa, cpu) = vmsa; + + return ret; +} + +#else +static inline void hv_ghcb_msr_write(u64 msr, u64 value) {} +static inline void hv_ghcb_msr_read(u64 msr, u64 *value) {} +#endif /* CONFIG_AMD_MEM_ENCRYPT */ + +#ifdef CONFIG_INTEL_TDX_GUEST +static void hv_tdx_msr_write(u64 msr, u64 val) +{ + struct tdx_hypercall_args args = { + .r10 = TDX_HYPERCALL_STANDARD, + .r11 = EXIT_REASON_MSR_WRITE, + .r12 = msr, + .r13 = val, + }; + + u64 ret = __tdx_hypercall(&args); + + WARN_ONCE(ret, "Failed to emulate MSR write: %lld\n", ret); +} + +static void hv_tdx_msr_read(u64 msr, u64 *val) +{ + struct tdx_hypercall_args args = { + .r10 = TDX_HYPERCALL_STANDARD, + .r11 = EXIT_REASON_MSR_READ, + .r12 = msr, + }; + + u64 ret = __tdx_hypercall_ret(&args); + + if (WARN_ONCE(ret, "Failed to emulate MSR read: %lld\n", ret)) + *val = 0; + else + *val = args.r11; +} + +u64 hv_tdx_hypercall(u64 control, u64 param1, u64 param2) +{ + struct tdx_hypercall_args args = { }; + + args.r10 = control; + args.rdx = param1; + args.r8 = param2; + + (void)__tdx_hypercall_ret(&args); + + return args.r11; +} + +#else +static inline void hv_tdx_msr_write(u64 msr, u64 value) {} +static inline void hv_tdx_msr_read(u64 msr, u64 *value) {} +#endif /* CONFIG_INTEL_TDX_GUEST */ + +#if defined(CONFIG_AMD_MEM_ENCRYPT) || defined(CONFIG_INTEL_TDX_GUEST) +void hv_ivm_msr_write(u64 msr, u64 value) +{ + if (!ms_hyperv.paravisor_present) + return; + + if (hv_isolation_type_tdx()) + hv_tdx_msr_write(msr, value); + else if (hv_isolation_type_snp()) + hv_ghcb_msr_write(msr, value); +} + +void hv_ivm_msr_read(u64 msr, u64 *value) +{ + if (!ms_hyperv.paravisor_present) + return; + + if (hv_isolation_type_tdx()) + hv_tdx_msr_read(msr, value); + else if (hv_isolation_type_snp()) + hv_ghcb_msr_read(msr, value); +} /* * hv_mark_gpa_visibility - Set pages visible to host via hvcall. @@ -358,13 +574,35 @@ void __init hv_vtom_init(void) { + enum hv_isolation_type type = hv_get_isolation_type(); + + switch (type) { + case HV_ISOLATION_TYPE_VBS: + fallthrough; /* * By design, a VM using vTOM doesn't see the SEV setting, * so SEV initialization is bypassed and sev_status isn't set. * Set it here to indicate a vTOM VM. + * + * Note: if CONFIG_AMD_MEM_ENCRYPT is not set, sev_status is + * defined as 0ULL, to which we can't assigned a value. */ - sev_status = MSR_AMD64_SNP_VTOM; - cc_vendor = CC_VENDOR_AMD; +#ifdef CONFIG_AMD_MEM_ENCRYPT + case HV_ISOLATION_TYPE_SNP: + sev_status = MSR_AMD64_SNP_VTOM; + cc_vendor = CC_VENDOR_AMD; + break; +#endif + + case HV_ISOLATION_TYPE_TDX: + cc_vendor = CC_VENDOR_INTEL; + cc_attr_cpu_hotplug_disabled = false; + break; + + default: + panic("hv_vtom_init: unsupported isolation type %d\n", type); + } + cc_set_mask(ms_hyperv.shared_gpa_boundary); physical_mask &= ms_hyperv.shared_gpa_boundary - 1; @@ -377,7 +615,7 @@ mtrr_overwrite_state(NULL, 0, MTRR_TYPE_WRBACK); } -#endif /* CONFIG_AMD_MEM_ENCRYPT */ +#endif /* defined(CONFIG_AMD_MEM_ENCRYPT) || defined(CONFIG_INTEL_TDX_GUEST) */ enum hv_isolation_type hv_get_isolation_type(void) { @@ -405,10 +643,20 @@ DEFINE_STATIC_KEY_FALSE(isolation_type_snp); /* - * hv_isolation_type_snp - Check system runs in the AMD SEV-SNP based + * hv_isolation_type_snp - Check if the system runs in an AMD SEV-SNP based * isolation VM. */ bool hv_isolation_type_snp(void) { return static_branch_unlikely(&isolation_type_snp); } + +DEFINE_STATIC_KEY_FALSE(isolation_type_tdx); +/* + * hv_isolation_type_tdx - Check if the system runs in an Intel TDX based + * isolated VM. + */ +bool hv_isolation_type_tdx(void) +{ + return static_branch_unlikely(&isolation_type_tdx); +} --- linux-azure-6.5.0.orig/arch/x86/include/asm/alternative.h +++ linux-azure-6.5.0/arch/x86/include/asm/alternative.h @@ -58,7 +58,7 @@ #define ANNOTATE_IGNORE_ALTERNATIVE \ "999:\n\t" \ ".pushsection .discard.ignore_alts\n\t" \ - ".long 999b - .\n\t" \ + ".long 999b\n\t" \ ".popsection\n\t" /* @@ -352,7 +352,7 @@ .macro ANNOTATE_IGNORE_ALTERNATIVE .Lannotate_\@: .pushsection .discard.ignore_alts - .long .Lannotate_\@ - . + .long .Lannotate_\@ .popsection .endm --- linux-azure-6.5.0.orig/arch/x86/include/asm/apm.h +++ linux-azure-6.5.0/arch/x86/include/asm/apm.h @@ -35,6 +35,7 @@ __asm__ __volatile__(APM_DO_ZERO_SEGS "pushl %%edi\n\t" "pushl %%ebp\n\t" + ANNOTATE_RETPOLINE_SAFE /* FRBS */ "lcall *%%cs:apm_bios_entry\n\t" "setc %%al\n\t" "popl %%ebp\n\t" @@ -59,6 +60,7 @@ __asm__ __volatile__(APM_DO_ZERO_SEGS "pushl %%edi\n\t" "pushl %%ebp\n\t" + ANNOTATE_RETPOLINE_SAFE /* FRBS */ "lcall *%%cs:apm_bios_entry\n\t" "setc %%bl\n\t" "popl %%ebp\n\t" --- linux-azure-6.5.0.orig/arch/x86/include/asm/boot.h +++ linux-azure-6.5.0/arch/x86/include/asm/boot.h @@ -40,23 +40,40 @@ #ifdef CONFIG_X86_64 # define BOOT_STACK_SIZE 0x4000 +/* + * Used by decompressor's startup_32() to allocate page tables for identity + * mapping of the 4G of RAM in 4-level paging mode: + * - 1 level4 table; + * - 1 level3 table; + * - 4 level2 table that maps everything with 2M pages; + * + * The additional level5 table needed for 5-level paging is allocated from + * trampoline_32bit memory. + */ # define BOOT_INIT_PGT_SIZE (6*4096) -# ifdef CONFIG_RANDOMIZE_BASE + /* - * Assuming all cross the 512GB boundary: - * 1 page for level4 - * (2+2)*4 pages for kernel, param, cmd_line, and randomized kernel - * 2 pages for first 2M (video RAM: CONFIG_X86_VERBOSE_BOOTUP). - * Total is 19 pages. + * Total number of page tables kernel_add_identity_map() can allocate, + * including page tables consumed by startup_32(). + * + * Worst-case scenario: + * - 5-level paging needs 1 level5 table; + * - KASLR needs to map kernel, boot_params, cmdline and randomized kernel, + * assuming all of them cross 256T boundary: + * + 4*2 level4 table; + * + 4*2 level3 table; + * + 4*2 level2 table; + * - X86_VERBOSE_BOOTUP needs to map the first 2M (video RAM): + * + 1 level4 table; + * + 1 level3 table; + * + 1 level2 table; + * Total: 28 tables + * + * Add 4 spare table in case decompressor touches anything beyond what is + * accounted above. Warn if it happens. */ -# ifdef CONFIG_X86_VERBOSE_BOOTUP -# define BOOT_PGT_SIZE (19*4096) -# else /* !CONFIG_X86_VERBOSE_BOOTUP */ -# define BOOT_PGT_SIZE (17*4096) -# endif -# else /* !CONFIG_RANDOMIZE_BASE */ -# define BOOT_PGT_SIZE BOOT_INIT_PGT_SIZE -# endif +# define BOOT_PGT_SIZE_WARN (28*4096) +# define BOOT_PGT_SIZE (32*4096) #else /* !CONFIG_X86_64 */ # define BOOT_STACK_SIZE 0x1000 --- linux-azure-6.5.0.orig/arch/x86/include/asm/coco.h +++ linux-azure-6.5.0/arch/x86/include/asm/coco.h @@ -11,6 +11,7 @@ }; extern enum cc_vendor cc_vendor; +extern bool cc_attr_cpu_hotplug_disabled; #ifdef CONFIG_ARCH_HAS_CC_PLATFORM void cc_set_mask(u64 mask); --- linux-azure-6.5.0.orig/arch/x86/include/asm/fpu/api.h +++ linux-azure-6.5.0/arch/x86/include/asm/fpu/api.h @@ -148,7 +148,8 @@ static inline void fpu_sync_guest_vmexit_xfd_state(void) { } #endif -extern void fpu_copy_guest_fpstate_to_uabi(struct fpu_guest *gfpu, void *buf, unsigned int size, u32 pkru); +extern void fpu_copy_guest_fpstate_to_uabi(struct fpu_guest *gfpu, void *buf, + unsigned int size, u64 xfeatures, u32 pkru); extern int fpu_copy_uabi_to_guest_fpstate(struct fpu_guest *gfpu, const void *buf, u64 xcr0, u32 *vpkru); static inline void fpstate_set_confidential(struct fpu_guest *gfpu) --- linux-azure-6.5.0.orig/arch/x86/include/asm/hyperv-tlfs.h +++ linux-azure-6.5.0/arch/x86/include/asm/hyperv-tlfs.h @@ -169,7 +169,8 @@ enum hv_isolation_type { HV_ISOLATION_TYPE_NONE = 0, HV_ISOLATION_TYPE_VBS = 1, - HV_ISOLATION_TYPE_SNP = 2 + HV_ISOLATION_TYPE_SNP = 2, + HV_ISOLATION_TYPE_TDX = 3 }; /* Hyper-V specific model specific registers (MSRs) */ @@ -301,6 +302,13 @@ #define HV_X64_MSR_TIME_REF_COUNT HV_REGISTER_TIME_REF_COUNT #define HV_X64_MSR_REFERENCE_TSC HV_REGISTER_REFERENCE_TSC +/* + * Registers are only accessible via HVCALL_GET_VP_REGISTERS hvcall and + * there is not associated MSR address. + */ +#define HV_X64_REGISTER_VSM_VP_STATUS 0x000D0003 +#define HV_X64_VTL_MASK GENMASK(3, 0) + /* Hyper-V memory host visibility */ enum hv_mem_host_visibility { VMBUS_PAGE_NOT_VISIBLE = 0, --- linux-azure-6.5.0.orig/arch/x86/include/asm/i8259.h +++ linux-azure-6.5.0/arch/x86/include/asm/i8259.h @@ -69,6 +69,8 @@ void (*make_irq)(unsigned int irq); }; +void legacy_pic_pcat_compat(void); + extern struct legacy_pic *legacy_pic; extern struct legacy_pic null_legacy_pic; --- linux-azure-6.5.0.orig/arch/x86/include/asm/ia32.h +++ linux-azure-6.5.0/arch/x86/include/asm/ia32.h @@ -68,6 +68,27 @@ #endif -#endif /* CONFIG_IA32_EMULATION */ +extern bool __ia32_enabled; + +static inline bool ia32_enabled(void) +{ + return __ia32_enabled; +} + +static inline void ia32_disable(void) +{ + __ia32_enabled = false; +} + +#else /* !CONFIG_IA32_EMULATION */ + +static inline bool ia32_enabled(void) +{ + return IS_ENABLED(CONFIG_X86_32); +} + +static inline void ia32_disable(void) {} + +#endif #endif /* _ASM_X86_IA32_H */ --- linux-azure-6.5.0.orig/arch/x86/include/asm/idtentry.h +++ linux-azure-6.5.0/arch/x86/include/asm/idtentry.h @@ -569,6 +569,10 @@ DECLARE_IDTENTRY_RAW(X86_TRAP_BP, exc_int3); DECLARE_IDTENTRY_RAW_ERRORCODE(X86_TRAP_PF, exc_page_fault); +#if defined(CONFIG_IA32_EMULATION) +DECLARE_IDTENTRY_RAW(IA32_SYSCALL_VECTOR, int80_emulation); +#endif + #ifdef CONFIG_X86_MCE #ifdef CONFIG_X86_64 DECLARE_IDTENTRY_MCE(X86_TRAP_MC, exc_machine_check); --- linux-azure-6.5.0.orig/arch/x86/include/asm/intel-family.h +++ linux-azure-6.5.0/arch/x86/include/asm/intel-family.h @@ -27,6 +27,7 @@ * _X - regular server parts * _D - micro server parts * _N,_P - other mobile parts + * _H - premium mobile parts * _S - other client parts * * Historical OPTDIFFs: @@ -125,6 +126,7 @@ #define INTEL_FAM6_LUNARLAKE_M 0xBD +#define INTEL_FAM6_ARROWLAKE_H 0xC5 #define INTEL_FAM6_ARROWLAKE 0xC6 /* "Small Core" Processors (Atom/E-Core) */ --- linux-azure-6.5.0.orig/arch/x86/include/asm/irq.h +++ linux-azure-6.5.0/arch/x86/include/asm/irq.h @@ -42,7 +42,7 @@ #ifdef CONFIG_X86_LOCAL_APIC void arch_trigger_cpumask_backtrace(const struct cpumask *mask, - bool exclude_self); + int exclude_cpu); #define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace #endif --- linux-azure-6.5.0.orig/arch/x86/include/asm/kexec.h +++ linux-azure-6.5.0/arch/x86/include/asm/kexec.h @@ -205,8 +205,6 @@ #endif #endif -typedef void crash_vmclear_fn(void); -extern crash_vmclear_fn __rcu *crash_vmclear_loaded_vmcss; extern void kdump_nmi_shootdown_cpus(void); #endif /* __ASSEMBLY__ */ --- linux-azure-6.5.0.orig/arch/x86/include/asm/kvm-x86-ops.h +++ linux-azure-6.5.0/arch/x86/include/asm/kvm-x86-ops.h @@ -108,6 +108,7 @@ KVM_X86_OP_OPTIONAL(vcpu_unblocking) KVM_X86_OP_OPTIONAL(pi_update_irte) KVM_X86_OP_OPTIONAL(pi_start_assignment) +KVM_X86_OP_OPTIONAL(apicv_pre_state_restore) KVM_X86_OP_OPTIONAL(apicv_post_state_restore) KVM_X86_OP_OPTIONAL_RET0(dy_apicv_has_pending_interrupt) KVM_X86_OP_OPTIONAL(set_hv_timer) --- linux-azure-6.5.0.orig/arch/x86/include/asm/kvm_host.h +++ linux-azure-6.5.0/arch/x86/include/asm/kvm_host.h @@ -1400,7 +1400,6 @@ * the thread holds the MMU lock in write mode. */ spinlock_t tdp_mmu_pages_lock; - struct workqueue_struct *tdp_mmu_zap_wq; #endif /* CONFIG_X86_64 */ /* @@ -1691,6 +1690,7 @@ int (*pi_update_irte)(struct kvm *kvm, unsigned int host_irq, uint32_t guest_irq, bool set); void (*pi_start_assignment)(struct kvm *kvm); + void (*apicv_pre_state_restore)(struct kvm_vcpu *vcpu); void (*apicv_post_state_restore)(struct kvm_vcpu *vcpu); bool (*dy_apicv_has_pending_interrupt)(struct kvm_vcpu *vcpu); @@ -1814,7 +1814,7 @@ void kvm_mmu_destroy(struct kvm_vcpu *vcpu); int kvm_mmu_create(struct kvm_vcpu *vcpu); -int kvm_mmu_init_vm(struct kvm *kvm); +void kvm_mmu_init_vm(struct kvm *kvm); void kvm_mmu_uninit_vm(struct kvm *kvm); void kvm_mmu_after_set_cpuid(struct kvm_vcpu *vcpu); --- linux-azure-6.5.0.orig/arch/x86/include/asm/linkage.h +++ linux-azure-6.5.0/arch/x86/include/asm/linkage.h @@ -8,6 +8,14 @@ #undef notrace #define notrace __attribute__((no_instrument_function)) +#ifdef CONFIG_64BIT +/* + * The generic version tends to create spurious ENDBR instructions under + * certain conditions. + */ +#define _THIS_IP_ ({ unsigned long __here; asm ("lea 0(%%rip), %0" : "=r" (__here)); __here; }) +#endif + #ifdef CONFIG_X86_32 #define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0))) #endif /* CONFIG_X86_32 */ @@ -97,6 +105,13 @@ CFI_POST_PADDING \ SYM_FUNC_END(__cfi_##name) +/* UML needs to be able to override memcpy() and friends for KASAN. */ +#ifdef CONFIG_UML +# define SYM_FUNC_ALIAS_MEMFUNC SYM_FUNC_ALIAS_WEAK +#else +# define SYM_FUNC_ALIAS_MEMFUNC SYM_FUNC_ALIAS +#endif + /* SYM_TYPED_FUNC_START -- use for indirectly called globals, w/ CFI type */ #define SYM_TYPED_FUNC_START(name) \ SYM_TYPED_START(name, SYM_L_GLOBAL, SYM_F_ALIGN) \ --- linux-azure-6.5.0.orig/arch/x86/include/asm/local.h +++ linux-azure-6.5.0/arch/x86/include/asm/local.h @@ -127,8 +127,8 @@ static inline bool local_try_cmpxchg(local_t *l, long *old, long new) { - typeof(l->a.counter) *__old = (typeof(l->a.counter) *) old; - return try_cmpxchg_local(&l->a.counter, __old, new); + return try_cmpxchg_local(&l->a.counter, + (typeof(l->a.counter) *) old, new); } /* Always has a lock prefix */ --- linux-azure-6.5.0.orig/arch/x86/include/asm/mem_encrypt.h +++ linux-azure-6.5.0/arch/x86/include/asm/mem_encrypt.h @@ -50,8 +50,8 @@ int __init early_set_memory_decrypted(unsigned long vaddr, unsigned long size); int __init early_set_memory_encrypted(unsigned long vaddr, unsigned long size); -void __init early_set_mem_enc_dec_hypercall(unsigned long vaddr, int npages, - bool enc); +void __init early_set_mem_enc_dec_hypercall(unsigned long vaddr, + unsigned long size, bool enc); void __init mem_encrypt_free_decrypted_mem(void); @@ -85,7 +85,7 @@ static inline int __init early_set_memory_encrypted(unsigned long vaddr, unsigned long size) { return 0; } static inline void __init -early_set_mem_enc_dec_hypercall(unsigned long vaddr, int npages, bool enc) {} +early_set_mem_enc_dec_hypercall(unsigned long vaddr, unsigned long size, bool enc) {} static inline void mem_encrypt_free_decrypted_mem(void) { } --- linux-azure-6.5.0.orig/arch/x86/include/asm/mshyperv.h +++ linux-azure-6.5.0/arch/x86/include/asm/mshyperv.h @@ -26,6 +26,7 @@ union hv_ghcb; DECLARE_STATIC_KEY_FALSE(isolation_type_snp); +DECLARE_STATIC_KEY_FALSE(isolation_type_tdx); typedef int (*hyperv_fill_flush_list_func)( struct hv_guest_mapping_flush_list *flush, @@ -40,6 +41,7 @@ #if IS_ENABLED(CONFIG_HYPERV) extern int hyperv_init_cpuhp; +extern bool hyperv_paravisor_present; extern void *hv_hypercall_pg; @@ -47,10 +49,25 @@ extern union hv_ghcb * __percpu *hv_ghcb_pg; +bool hv_isolation_type_snp(void); +bool hv_isolation_type_tdx(void); +u64 hv_tdx_hypercall(u64 control, u64 param1, u64 param2); + +/* + * DEFAULT INIT GPAT and SEGMENT LIMIT value in struct VMSA + * to start AP in enlightened SEV guest. + */ +#define HV_AP_INIT_GPAT_DEFAULT 0x0007040600070406ULL +#define HV_AP_SEGMENT_LIMIT 0xffffffff + int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages); int hv_call_add_logical_proc(int node, u32 lp_index, u32 acpi_id); int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u32 flags); +/* + * If the hypercall involves no input or output parameters, the hypervisor + * ignores the corresponding GPA pointer. + */ static inline u64 hv_do_hypercall(u64 control, void *input, void *output) { u64 input_address = input ? virt_to_phys(input) : 0; @@ -58,6 +75,19 @@ u64 hv_status; #ifdef CONFIG_X86_64 + if (hv_isolation_type_tdx() && !hyperv_paravisor_present) + return hv_tdx_hypercall(control, input_address, output_address); + + if (hv_isolation_type_snp() && !hyperv_paravisor_present) { + __asm__ __volatile__("mov %4, %%r8\n" + "vmmcall" + : "=a" (hv_status), ASM_CALL_CONSTRAINT, + "+c" (control), "+d" (input_address) + : "r" (output_address) + : "cc", "memory", "r8", "r9", "r10", "r11"); + return hv_status; + } + if (!hv_hypercall_pg) return U64_MAX; @@ -101,7 +131,16 @@ u64 hv_status; #ifdef CONFIG_X86_64 - { + if (hv_isolation_type_tdx() && !hyperv_paravisor_present) + return hv_tdx_hypercall(control, input1, 0); + + if (hv_isolation_type_snp() && !hyperv_paravisor_present) { + __asm__ __volatile__( + "vmmcall" + : "=a" (hv_status), ASM_CALL_CONSTRAINT, + "+c" (control), "+d" (input1) + :: "cc", "r8", "r9", "r10", "r11"); + } else { __asm__ __volatile__(CALL_NOSPEC : "=a" (hv_status), ASM_CALL_CONSTRAINT, "+c" (control), "+d" (input1) @@ -146,7 +185,17 @@ u64 hv_status; #ifdef CONFIG_X86_64 - { + if (hv_isolation_type_tdx() && !hyperv_paravisor_present) + return hv_tdx_hypercall(control, input1, input2); + + if (hv_isolation_type_snp() && !hyperv_paravisor_present) { + __asm__ __volatile__("mov %4, %%r8\n" + "vmmcall" + : "=a" (hv_status), ASM_CALL_CONSTRAINT, + "+c" (control), "+d" (input1) + : "r" (input2) + : "cc", "r8", "r9", "r10", "r11"); + } else { __asm__ __volatile__("mov %4, %%r8\n" CALL_NOSPEC : "=a" (hv_status), ASM_CALL_CONSTRAINT, @@ -225,20 +274,24 @@ int hv_unmap_ioapic_interrupt(int ioapic_id, struct hv_interrupt_entry *entry); #ifdef CONFIG_AMD_MEM_ENCRYPT -void hv_ghcb_msr_write(u64 msr, u64 value); -void hv_ghcb_msr_read(u64 msr, u64 *value); bool hv_ghcb_negotiate_protocol(void); void __noreturn hv_ghcb_terminate(unsigned int set, unsigned int reason); -void hv_vtom_init(void); +int hv_snp_boot_ap(int cpu, unsigned long start_ip); #else -static inline void hv_ghcb_msr_write(u64 msr, u64 value) {} -static inline void hv_ghcb_msr_read(u64 msr, u64 *value) {} static inline bool hv_ghcb_negotiate_protocol(void) { return false; } static inline void hv_ghcb_terminate(unsigned int set, unsigned int reason) {} -static inline void hv_vtom_init(void) {} +static inline int hv_snp_boot_ap(int cpu, unsigned long start_ip) { return 0; } #endif -extern bool hv_isolation_type_snp(void); +#if defined(CONFIG_AMD_MEM_ENCRYPT) || defined(CONFIG_INTEL_TDX_GUEST) +void hv_vtom_init(void); +void hv_ivm_msr_write(u64 msr, u64 value); +void hv_ivm_msr_read(u64 msr, u64 *value); +#else +static inline void hv_vtom_init(void) {} +static inline void hv_ivm_msr_write(u64 msr, u64 value) {} +static inline void hv_ivm_msr_read(u64 msr, u64 *value) {} +#endif static inline bool hv_is_synic_reg(unsigned int reg) { --- linux-azure-6.5.0.orig/arch/x86/include/asm/msr-index.h +++ linux-azure-6.5.0/arch/x86/include/asm/msr-index.h @@ -553,6 +553,7 @@ #define MSR_AMD64_CPUID_FN_1 0xc0011004 #define MSR_AMD64_LS_CFG 0xc0011020 #define MSR_AMD64_DC_CFG 0xc0011022 +#define MSR_AMD64_TW_CFG 0xc0011023 #define MSR_AMD64_DE_CFG 0xc0011029 #define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT 1 @@ -637,12 +638,17 @@ /* AMD Last Branch Record MSRs */ #define MSR_AMD64_LBR_SELECT 0xc000010e -/* Fam 17h MSRs */ -#define MSR_F17H_IRPERF 0xc00000e9 +/* Zen4 */ +#define MSR_ZEN4_BP_CFG 0xc001102e +#define MSR_ZEN4_BP_CFG_SHARED_BTB_FIX_BIT 5 +/* Zen 2 */ #define MSR_ZEN2_SPECTRAL_CHICKEN 0xc00110e3 #define MSR_ZEN2_SPECTRAL_CHICKEN_BIT BIT_ULL(1) +/* Fam 17h MSRs */ +#define MSR_F17H_IRPERF 0xc00000e9 + /* Fam 16h MSRs */ #define MSR_F16H_L2I_PERF_CTL 0xc0010230 #define MSR_F16H_L2I_PERF_CTR 0xc0010231 --- linux-azure-6.5.0.orig/arch/x86/include/asm/nospec-branch.h +++ linux-azure-6.5.0/arch/x86/include/asm/nospec-branch.h @@ -196,7 +196,7 @@ .macro ANNOTATE_RETPOLINE_SAFE .Lhere_\@: .pushsection .discard.retpoline_safe - .long .Lhere_\@ - . + .long .Lhere_\@ .popsection .endm @@ -271,7 +271,7 @@ .Lskip_rsb_\@: .endm -#ifdef CONFIG_CPU_UNRET_ENTRY +#if defined(CONFIG_CPU_UNRET_ENTRY) || defined(CONFIG_CPU_SRSO) #define CALL_UNTRAIN_RET "call entry_untrain_ret" #else #define CALL_UNTRAIN_RET "" @@ -312,7 +312,7 @@ .macro UNTRAIN_RET_FROM_CALL #if defined(CONFIG_CPU_UNRET_ENTRY) || defined(CONFIG_CPU_IBPB_ENTRY) || \ - defined(CONFIG_CALL_DEPTH_TRACKING) + defined(CONFIG_CALL_DEPTH_TRACKING) || defined(CONFIG_CPU_SRSO) VALIDATE_UNRET_END ALTERNATIVE_3 "", \ CALL_UNTRAIN_RET, X86_FEATURE_UNRET, \ @@ -334,7 +334,7 @@ #define ANNOTATE_RETPOLINE_SAFE \ "999:\n\t" \ ".pushsection .discard.retpoline_safe\n\t" \ - ".long 999b - .\n\t" \ + ".long 999b\n\t" \ ".popsection\n\t" typedef u8 retpoline_thunk_t[RETPOLINE_THUNK_SIZE]; --- linux-azure-6.5.0.orig/arch/x86/include/asm/numa.h +++ linux-azure-6.5.0/arch/x86/include/asm/numa.h @@ -12,13 +12,6 @@ #define NR_NODE_MEMBLKS (MAX_NUMNODES*2) -/* - * Too small node sizes may confuse the VM badly. Usually they - * result from BIOS bugs. So dont recognize nodes as standalone - * NUMA entities that have less than this amount of RAM listed: - */ -#define NODE_MIN_SIZE (4*1024*1024) - extern int numa_off; /* --- linux-azure-6.5.0.orig/arch/x86/include/asm/pci-direct.h +++ linux-azure-6.5.0/arch/x86/include/asm/pci-direct.h @@ -10,9 +10,11 @@ extern u32 read_pci_config(u8 bus, u8 slot, u8 func, u8 offset); extern u8 read_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset); extern u16 read_pci_config_16(u8 bus, u8 slot, u8 func, u8 offset); +extern u32 pci_early_find_cap(int bus, int slot, int func, int cap); extern void write_pci_config(u8 bus, u8 slot, u8 func, u8 offset, u32 val); extern void write_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset, u8 val); extern void write_pci_config_16(u8 bus, u8 slot, u8 func, u8 offset, u16 val); +extern unsigned int pci_early_clear_msi; extern int early_pci_allowed(void); #endif /* _ASM_X86_PCI_DIRECT_H */ --- linux-azure-6.5.0.orig/arch/x86/include/asm/pgtable_types.h +++ linux-azure-6.5.0/arch/x86/include/asm/pgtable_types.h @@ -125,11 +125,12 @@ * instance, and is *not* included in this mask since * pte_modify() does modify it. */ -#define _PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT | \ - _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY | \ - _PAGE_SOFT_DIRTY | _PAGE_DEVMAP | _PAGE_ENC | \ - _PAGE_UFFD_WP) -#define _HPAGE_CHG_MASK (_PAGE_CHG_MASK | _PAGE_PSE) +#define _COMMON_PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT | \ + _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY |\ + _PAGE_SOFT_DIRTY | _PAGE_DEVMAP | _PAGE_ENC | \ + _PAGE_UFFD_WP) +#define _PAGE_CHG_MASK (_COMMON_PAGE_CHG_MASK | _PAGE_PAT) +#define _HPAGE_CHG_MASK (_COMMON_PAGE_CHG_MASK | _PAGE_PSE | _PAGE_PAT_LARGE) /* * The cache modes defined here are used to translate between pure SW usage --- linux-azure-6.5.0.orig/arch/x86/include/asm/processor.h +++ linux-azure-6.5.0/arch/x86/include/asm/processor.h @@ -676,12 +676,10 @@ #ifdef CONFIG_CPU_SUP_AMD extern u32 amd_get_nodes_per_socket(void); extern u32 amd_get_highest_perf(void); -extern bool cpu_has_ibpb_brtype_microcode(void); extern void amd_clear_divider(void); #else static inline u32 amd_get_nodes_per_socket(void) { return 0; } static inline u32 amd_get_highest_perf(void) { return 0; } -static inline bool cpu_has_ibpb_brtype_microcode(void) { return false; } static inline void amd_clear_divider(void) { } #endif --- linux-azure-6.5.0.orig/arch/x86/include/asm/proto.h +++ linux-azure-6.5.0/arch/x86/include/asm/proto.h @@ -32,10 +32,6 @@ void entry_SYSCALL_compat_safe_stack(void); void entry_SYSRETL_compat_unsafe_stack(void); void entry_SYSRETL_compat_end(void); -void entry_INT80_compat(void); -#ifdef CONFIG_XEN_PV -void xen_entry_INT80_compat(void); -#endif #endif void x86_configure_nx(void); --- linux-azure-6.5.0.orig/arch/x86/include/asm/reboot.h +++ linux-azure-6.5.0/arch/x86/include/asm/reboot.h @@ -25,6 +25,8 @@ #define MRR_BIOS 0 #define MRR_APM 1 +typedef void crash_vmclear_fn(void); +extern crash_vmclear_fn __rcu *crash_vmclear_loaded_vmcss; void cpu_emergency_disable_virtualization(void); typedef void (*nmi_shootdown_cb)(int, struct pt_regs*); --- linux-azure-6.5.0.orig/arch/x86/include/asm/sections.h +++ linux-azure-6.5.0/arch/x86/include/asm/sections.h @@ -2,8 +2,6 @@ #ifndef _ASM_X86_SECTIONS_H #define _ASM_X86_SECTIONS_H -#define arch_is_kernel_initmem_freed arch_is_kernel_initmem_freed - #include #include @@ -18,20 +16,4 @@ extern unsigned long _brk_start, _brk_end; -static inline bool arch_is_kernel_initmem_freed(unsigned long addr) -{ - /* - * If _brk_start has not been cleared, brk allocation is incomplete, - * and we can not make assumptions about its use. - */ - if (_brk_start) - return 0; - - /* - * After brk allocation is complete, space between _brk_end and _end - * is available for allocation. - */ - return addr >= _brk_end && addr < (unsigned long)&_end; -} - #endif /* _ASM_X86_SECTIONS_H */ --- linux-azure-6.5.0.orig/arch/x86/include/asm/shared/tdx.h +++ linux-azure-6.5.0/arch/x86/include/asm/shared/tdx.h @@ -24,6 +24,8 @@ #define TDVMCALL_MAP_GPA 0x10001 #define TDVMCALL_REPORT_FATAL_ERROR 0x10003 +#define TDVMCALL_STATUS_RETRY 1 + #ifndef __ASSEMBLY__ /* --- linux-azure-6.5.0.orig/arch/x86/include/asm/smp.h +++ linux-azure-6.5.0/arch/x86/include/asm/smp.h @@ -134,8 +134,6 @@ void native_send_call_func_single_ipi(int cpu); void x86_idle_thread_init(unsigned int cpu, struct task_struct *idle); -bool smp_park_other_cpus_in_init(void); - void smp_store_boot_cpu_info(void); void smp_store_cpu_info(int id); --- linux-azure-6.5.0.orig/arch/x86/include/asm/sparsemem.h +++ linux-azure-6.5.0/arch/x86/include/asm/sparsemem.h @@ -37,6 +37,8 @@ #define phys_to_target_node phys_to_target_node extern int memory_add_physaddr_to_nid(u64 start); #define memory_add_physaddr_to_nid memory_add_physaddr_to_nid +extern int numa_fill_memblks(u64 start, u64 end); +#define numa_fill_memblks numa_fill_memblks #endif #endif /* __ASSEMBLY__ */ --- linux-azure-6.5.0.orig/arch/x86/include/asm/svm.h +++ linux-azure-6.5.0/arch/x86/include/asm/svm.h @@ -268,6 +268,7 @@ AVIC_IPI_FAILURE_TARGET_NOT_RUNNING, AVIC_IPI_FAILURE_INVALID_TARGET, AVIC_IPI_FAILURE_INVALID_BACKING_PAGE, + AVIC_IPI_FAILURE_INVALID_IPI_VECTOR, }; #define AVIC_PHYSICAL_MAX_INDEX_MASK GENMASK_ULL(8, 0) --- linux-azure-6.5.0.orig/arch/x86/include/asm/syscall_wrapper.h +++ linux-azure-6.5.0/arch/x86/include/asm/syscall_wrapper.h @@ -86,9 +86,6 @@ return sys_ni_syscall(); \ } -#define __SYS_NI(abi, name) \ - SYSCALL_ALIAS(__##abi##_##name, sys_ni_posix_timers); - #ifdef CONFIG_X86_64 #define __X64_SYS_STUB0(name) \ __SYS_STUB0(x64, sys_##name) @@ -100,13 +97,10 @@ #define __X64_COND_SYSCALL(name) \ __COND_SYSCALL(x64, sys_##name) -#define __X64_SYS_NI(name) \ - __SYS_NI(x64, sys_##name) #else /* CONFIG_X86_64 */ #define __X64_SYS_STUB0(name) #define __X64_SYS_STUBx(x, name, ...) #define __X64_COND_SYSCALL(name) -#define __X64_SYS_NI(name) #endif /* CONFIG_X86_64 */ #if defined(CONFIG_X86_32) || defined(CONFIG_IA32_EMULATION) @@ -120,13 +114,10 @@ #define __IA32_COND_SYSCALL(name) \ __COND_SYSCALL(ia32, sys_##name) -#define __IA32_SYS_NI(name) \ - __SYS_NI(ia32, sys_##name) #else /* CONFIG_X86_32 || CONFIG_IA32_EMULATION */ #define __IA32_SYS_STUB0(name) #define __IA32_SYS_STUBx(x, name, ...) #define __IA32_COND_SYSCALL(name) -#define __IA32_SYS_NI(name) #endif /* CONFIG_X86_32 || CONFIG_IA32_EMULATION */ #ifdef CONFIG_IA32_EMULATION @@ -135,8 +126,7 @@ * additional wrappers (aptly named __ia32_sys_xyzzy) which decode the * ia32 regs in the proper order for shared or "common" syscalls. As some * syscalls may not be implemented, we need to expand COND_SYSCALL in - * kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this - * case as well. + * kernel/sys_ni.c to cover this case as well. */ #define __IA32_COMPAT_SYS_STUB0(name) \ __SYS_STUB0(ia32, compat_sys_##name) @@ -148,14 +138,10 @@ #define __IA32_COMPAT_COND_SYSCALL(name) \ __COND_SYSCALL(ia32, compat_sys_##name) -#define __IA32_COMPAT_SYS_NI(name) \ - __SYS_NI(ia32, compat_sys_##name) - #else /* CONFIG_IA32_EMULATION */ #define __IA32_COMPAT_SYS_STUB0(name) #define __IA32_COMPAT_SYS_STUBx(x, name, ...) #define __IA32_COMPAT_COND_SYSCALL(name) -#define __IA32_COMPAT_SYS_NI(name) #endif /* CONFIG_IA32_EMULATION */ @@ -175,13 +161,10 @@ #define __X32_COMPAT_COND_SYSCALL(name) \ __COND_SYSCALL(x64, compat_sys_##name) -#define __X32_COMPAT_SYS_NI(name) \ - __SYS_NI(x64, compat_sys_##name) #else /* CONFIG_X86_X32_ABI */ #define __X32_COMPAT_SYS_STUB0(name) #define __X32_COMPAT_SYS_STUBx(x, name, ...) #define __X32_COMPAT_COND_SYSCALL(name) -#define __X32_COMPAT_SYS_NI(name) #endif /* CONFIG_X86_X32_ABI */ @@ -212,17 +195,12 @@ /* * As some compat syscalls may not be implemented, we need to expand - * COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in - * kernel/time/posix-stubs.c to cover this case as well. + * COND_SYSCALL_COMPAT in kernel/sys_ni.c to cover this case as well. */ #define COND_SYSCALL_COMPAT(name) \ __IA32_COMPAT_COND_SYSCALL(name) \ __X32_COMPAT_COND_SYSCALL(name) -#define COMPAT_SYS_NI(name) \ - __IA32_COMPAT_SYS_NI(name) \ - __X32_COMPAT_SYS_NI(name) - #endif /* CONFIG_COMPAT */ #define __SYSCALL_DEFINEx(x, name, ...) \ @@ -243,8 +221,8 @@ * As the generic SYSCALL_DEFINE0() macro does not decode any parameters for * obvious reasons, and passing struct pt_regs *regs to it in %rdi does not * hurt, we only need to re-define it here to keep the naming congruent to - * SYSCALL_DEFINEx() -- which is essential for the COND_SYSCALL() and SYS_NI() - * macros to work correctly. + * SYSCALL_DEFINEx() -- which is essential for the COND_SYSCALL() macro + * to work correctly. */ #define SYSCALL_DEFINE0(sname) \ SYSCALL_METADATA(_##sname, 0); \ @@ -257,10 +235,6 @@ __X64_COND_SYSCALL(name) \ __IA32_COND_SYSCALL(name) -#define SYS_NI(name) \ - __X64_SYS_NI(name) \ - __IA32_SYS_NI(name) - /* * For VSYSCALLS, we need to declare these three syscalls with the new --- linux-azure-6.5.0.orig/arch/x86/include/asm/uaccess.h +++ linux-azure-6.5.0/arch/x86/include/asm/uaccess.h @@ -496,7 +496,7 @@ #define copy_mc_to_kernel copy_mc_to_kernel unsigned long __must_check -copy_mc_to_user(void *to, const void *from, unsigned len); +copy_mc_to_user(void __user *to, const void *from, unsigned len); #endif /* --- linux-azure-6.5.0.orig/arch/x86/include/asm/uaccess_64.h +++ linux-azure-6.5.0/arch/x86/include/asm/uaccess_64.h @@ -116,7 +116,7 @@ "2:\n" _ASM_EXTABLE_UA(1b, 2b) :"+c" (len), "+D" (to), "+S" (from), ASM_CALL_CONSTRAINT - : : "memory", "rax", "r8", "r9", "r10", "r11"); + : : "memory", "rax"); clac(); return len; } --- linux-azure-6.5.0.orig/arch/x86/include/asm/virtext.h +++ linux-azure-6.5.0/arch/x86/include/asm/virtext.h @@ -101,12 +101,6 @@ return 0; } - if (boot_cpu_data.extended_cpuid_level < SVM_CPUID_FUNC) { - if (msg) - *msg = "can't execute cpuid_8000000a"; - return 0; - } - if (!boot_cpu_has(X86_FEATURE_SVM)) { if (msg) *msg = "svm not available"; --- linux-azure-6.5.0.orig/arch/x86/kernel/acpi/boot.c +++ linux-azure-6.5.0/arch/x86/kernel/acpi/boot.c @@ -148,6 +148,9 @@ pr_debug("Local APIC address 0x%08x\n", madt->address); } + if (madt->flags & ACPI_MADT_PCAT_COMPAT) + legacy_pic_pcat_compat(); + /* ACPI 6.3 and newer support the online capable bit. */ if (acpi_gbl_FADT.header.revision > 6 || (acpi_gbl_FADT.header.revision == 6 && --- linux-azure-6.5.0.orig/arch/x86/kernel/acpi/wakeup_32.S +++ linux-azure-6.5.0/arch/x86/kernel/acpi/wakeup_32.S @@ -3,6 +3,7 @@ #include #include #include +#include # Copyright 2003, 2008 Pavel Machek %px", start, end); + + /* + * In the case CONFIG_X86_5LEVEL=y, KASAN_SHADOW_START is defined using + * cpu_feature_enabled(X86_FEATURE_LA57) and is therefore patched here. + * During the process, KASAN becomes confused seeing partial LA57 + * conversion and triggers a false-positive out-of-bound report. + * + * Disable KASAN until the patching is complete. + */ + kasan_disable_current(); + /* * The scan order should be from start to end. A later scanned * alternative code can overwrite previously scanned alternative code. @@ -427,7 +448,7 @@ * patch if feature is *NOT* present. */ if (!boot_cpu_has(a->cpuid) == !(a->flags & ALT_FLAG_NOT)) { - optimize_nops(instr, a->instrlen); + optimize_nops_inplace(instr, a->instrlen); continue; } @@ -452,6 +473,8 @@ text_poke_early(instr, insn_buff, insn_buff_sz); } + + kasan_enable_current(); } static inline bool is_jcc32(struct insn *insn) @@ -720,13 +743,8 @@ { s32 *s; - /* - * Do not patch out the default return thunks if those needed are the - * ones generated by the compiler. - */ - if (cpu_feature_enabled(X86_FEATURE_RETHUNK) && - (x86_return_thunk == __x86_return_thunk)) - return; + if (cpu_feature_enabled(X86_FEATURE_RETHUNK)) + static_call_force_reinit(); for (s = start; s < end; s++) { void *dest = NULL, *addr = (void *)s + *s; @@ -1676,8 +1694,8 @@ } else { local_irq_save(flags); memcpy(addr, opcode, len); - local_irq_restore(flags); sync_core(); + local_irq_restore(flags); /* * Could also do a CLFLUSH here to speed up CPU recovery; but --- linux-azure-6.5.0.orig/arch/x86/kernel/amd_nb.c +++ linux-azure-6.5.0/arch/x86/kernel/amd_nb.c @@ -24,6 +24,8 @@ #define PCI_DEVICE_ID_AMD_19H_M40H_ROOT 0x14b5 #define PCI_DEVICE_ID_AMD_19H_M60H_ROOT 0x14d8 #define PCI_DEVICE_ID_AMD_19H_M70H_ROOT 0x14e8 +#define PCI_DEVICE_ID_AMD_1AH_M00H_ROOT 0x153a +#define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507 #define PCI_DEVICE_ID_AMD_MI200_ROOT 0x14bb #define PCI_DEVICE_ID_AMD_17H_DF_F4 0x1464 @@ -39,6 +41,7 @@ #define PCI_DEVICE_ID_AMD_19H_M60H_DF_F4 0x14e4 #define PCI_DEVICE_ID_AMD_19H_M70H_DF_F4 0x14f4 #define PCI_DEVICE_ID_AMD_19H_M78H_DF_F4 0x12fc +#define PCI_DEVICE_ID_AMD_1AH_M00H_DF_F4 0x12c4 #define PCI_DEVICE_ID_AMD_MI200_DF_F4 0x14d4 /* Protect the PCI config register pairs used for SMN. */ @@ -56,6 +59,8 @@ { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M40H_ROOT) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M60H_ROOT) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M70H_ROOT) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M00H_ROOT) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M20H_ROOT) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_MI200_ROOT) }, {} }; @@ -85,6 +90,8 @@ { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M60H_DF_F3) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M70H_DF_F3) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M78H_DF_F3) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M00H_DF_F3) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M20H_DF_F3) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_MI200_DF_F3) }, {} }; @@ -105,7 +112,11 @@ { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M10H_DF_F4) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M40H_DF_F4) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M50H_DF_F4) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M60H_DF_F4) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M70H_DF_F4) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M78H_DF_F4) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CNB17H_F4) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M00H_DF_F4) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_MI200_DF_F4) }, {} }; --- linux-azure-6.5.0.orig/arch/x86/kernel/aperture_64.c +++ linux-azure-6.5.0/arch/x86/kernel/aperture_64.c @@ -136,32 +136,6 @@ } -/* Find a PCI capability */ -static u32 __init find_cap(int bus, int slot, int func, int cap) -{ - int bytes; - u8 pos; - - if (!(read_pci_config_16(bus, slot, func, PCI_STATUS) & - PCI_STATUS_CAP_LIST)) - return 0; - - pos = read_pci_config_byte(bus, slot, func, PCI_CAPABILITY_LIST); - for (bytes = 0; bytes < 48 && pos >= 0x40; bytes++) { - u8 id; - - pos &= ~3; - id = read_pci_config_byte(bus, slot, func, pos+PCI_CAP_LIST_ID); - if (id == 0xff) - break; - if (id == cap) - return pos; - pos = read_pci_config_byte(bus, slot, func, - pos+PCI_CAP_LIST_NEXT); - } - return 0; -} - /* Read a standard AGPv3 bridge header */ static u32 __init read_agp(int bus, int slot, int func, int cap, u32 *order) { @@ -250,8 +224,8 @@ case PCI_CLASS_BRIDGE_HOST: case PCI_CLASS_BRIDGE_OTHER: /* needed? */ /* AGP bridge? */ - cap = find_cap(bus, slot, func, - PCI_CAP_ID_AGP); + cap = pci_early_find_cap(bus, slot, + func, PCI_CAP_ID_AGP); if (!cap) break; *valid_agp = 1; --- linux-azure-6.5.0.orig/arch/x86/kernel/apic/apic.c +++ linux-azure-6.5.0/arch/x86/kernel/apic/apic.c @@ -36,6 +36,8 @@ #include #include +#include + #include #include #include @@ -2408,6 +2410,15 @@ { unsigned int cpu; + /* + * XEN/PV provides either none or useless topology information. + * Pretend that all vCPUs are primary threads. + */ + if (xen_pv_domain()) { + cpumask_copy(&__cpu_primary_thread_mask, cpu_possible_mask); + return 0; + } + for (cpu = 0; cpu < nr_logical_cpuids; cpu++) cpu_mark_primary_thread(cpu, cpuid_to_apicid[cpu]); return 0; --- linux-azure-6.5.0.orig/arch/x86/kernel/apic/hw_nmi.c +++ linux-azure-6.5.0/arch/x86/kernel/apic/hw_nmi.c @@ -34,9 +34,9 @@ apic->send_IPI_mask(mask, NMI_VECTOR); } -void arch_trigger_cpumask_backtrace(const cpumask_t *mask, bool exclude_self) +void arch_trigger_cpumask_backtrace(const cpumask_t *mask, int exclude_cpu) { - nmi_trigger_cpumask_backtrace(mask, exclude_self, + nmi_trigger_cpumask_backtrace(mask, exclude_cpu, nmi_raise_cpu_backtrace); } --- linux-azure-6.5.0.orig/arch/x86/kernel/apic/msi.c +++ linux-azure-6.5.0/arch/x86/kernel/apic/msi.c @@ -55,14 +55,14 @@ * caused by the non-atomic update of the address/data pair. * * Direct update is possible when: - * - The MSI is maskable (remapped MSI does not use this code path)). - * The quirk bit is not set in this case. + * - The MSI is maskable (remapped MSI does not use this code path). + * The reservation mode bit is set in this case. * - The new vector is the same as the old vector * - The old vector is MANAGED_IRQ_SHUTDOWN_VECTOR (interrupt starts up) * - The interrupt is not yet started up * - The new destination CPU is the same as the old destination CPU */ - if (!irqd_msi_nomask_quirk(irqd) || + if (!irqd_can_reserve(irqd) || cfg->vector == old_cfg.vector || old_cfg.vector == MANAGED_IRQ_SHUTDOWN_VECTOR || !irqd_is_started(irqd) || @@ -215,8 +215,6 @@ if (WARN_ON_ONCE(domain != real_parent)) return false; info->chip->irq_set_affinity = msi_set_affinity; - /* See msi_set_affinity() for the gory details */ - info->flags |= MSI_FLAG_NOMASK_QUIRK; break; case DOMAIN_BUS_DMAR: case DOMAIN_BUS_AMDVI: --- linux-azure-6.5.0.orig/arch/x86/kernel/apic/x2apic_uv_x.c +++ linux-azure-6.5.0/arch/x86/kernel/apic/x2apic_uv_x.c @@ -1571,7 +1571,7 @@ { struct uv_gam_range_entry *gre = uv_gre_table; int nums, numn, nump; - int cpu, i, lnid; + int i, lnid, apicid; int minsock = _min_socket; int maxsock = _max_socket; int minpnode = _min_pnode; @@ -1622,15 +1622,14 @@ /* Set socket -> node values: */ lnid = NUMA_NO_NODE; - for_each_possible_cpu(cpu) { - int nid = cpu_to_node(cpu); - int apicid, sockid; + for (apicid = 0; apicid < ARRAY_SIZE(__apicid_to_node); apicid++) { + int nid = __apicid_to_node[apicid]; + int sockid; - if (lnid == nid) + if ((nid == NUMA_NO_NODE) || (lnid == nid)) continue; lnid = nid; - apicid = per_cpu(x86_cpu_to_apicid, cpu); sockid = apicid >> uv_cpuid.socketid_shift; if (_socket_to_node[sockid - minsock] == SOCK_EMPTY) --- linux-azure-6.5.0.orig/arch/x86/kernel/apm_32.c +++ linux-azure-6.5.0/arch/x86/kernel/apm_32.c @@ -239,12 +239,6 @@ #endif /* - * The apm_bios device is one of the misc char devices. - * This is its minor number. - */ -#define APM_MINOR_DEV 134 - -/* * Various options can be changed at boot time as follows: * (We allow underscores for compatibility with the modules code) * apm=on/off enable/disable APM --- linux-azure-6.5.0.orig/arch/x86/kernel/callthunks.c +++ linux-azure-6.5.0/arch/x86/kernel/callthunks.c @@ -272,7 +272,6 @@ pr_info("Setting up call depth tracking\n"); mutex_lock(&text_mutex); callthunks_setup(&cs, &builtin_coretext); - static_call_force_reinit(); thunks_initialized = true; mutex_unlock(&text_mutex); } --- linux-azure-6.5.0.orig/arch/x86/kernel/cpu/amd.c +++ linux-azure-6.5.0/arch/x86/kernel/cpu/amd.c @@ -80,6 +80,10 @@ AMD_LEGACY_ERRATUM(AMD_MODEL_RANGE(0x17, 0x00, 0x0, 0x2f, 0xf), AMD_MODEL_RANGE(0x17, 0x50, 0x0, 0x5f, 0xf)); +static const int amd_erratum_1485[] = + AMD_LEGACY_ERRATUM(AMD_MODEL_RANGE(0x19, 0x10, 0x0, 0x1f, 0xf), + AMD_MODEL_RANGE(0x19, 0x60, 0x0, 0xaf, 0xf)); + static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum) { int osvw_id = *erratum++; @@ -766,6 +770,15 @@ if (cpu_has(c, X86_FEATURE_TOPOEXT)) smp_num_siblings = ((cpuid_ebx(0x8000001e) >> 8) & 0xff) + 1; + + if (!cpu_has(c, X86_FEATURE_HYPERVISOR) && !cpu_has(c, X86_FEATURE_IBPB_BRTYPE)) { + if (c->x86 == 0x17 && boot_cpu_has(X86_FEATURE_AMD_IBPB)) + setup_force_cpu_cap(X86_FEATURE_IBPB_BRTYPE); + else if (c->x86 >= 0x19 && !wrmsrl_safe(MSR_IA32_PRED_CMD, PRED_CMD_SBPB)) { + setup_force_cpu_cap(X86_FEATURE_IBPB_BRTYPE); + setup_force_cpu_cap(X86_FEATURE_SBPB); + } + } } static void init_amd_k8(struct cpuinfo_x86 *c) @@ -1140,6 +1153,10 @@ pr_notice_once("AMD Zen1 DIV0 bug detected. Disable SMT for full protection.\n"); setup_force_cpu_bug(X86_BUG_DIV0); } + + if (!cpu_has(c, X86_FEATURE_HYPERVISOR) && + cpu_has_amd_erratum(c, amd_erratum_1485)) + msr_set_bit(MSR_ZEN4_BP_CFG, MSR_ZEN4_BP_CFG_SHARED_BTB_FIX_BIT); } #ifdef CONFIG_X86_32 @@ -1298,26 +1315,10 @@ void amd_check_microcode(void) { - on_each_cpu(zenbleed_check_cpu, NULL, 1); -} + if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) + return; -bool cpu_has_ibpb_brtype_microcode(void) -{ - switch (boot_cpu_data.x86) { - /* Zen1/2 IBPB flushes branch type predictions too. */ - case 0x17: - return boot_cpu_has(X86_FEATURE_AMD_IBPB); - case 0x19: - /* Poke the MSR bit on Zen3/4 to check its presence. */ - if (!wrmsrl_safe(MSR_IA32_PRED_CMD, PRED_CMD_SBPB)) { - setup_force_cpu_cap(X86_FEATURE_SBPB); - return true; - } else { - return false; - } - default: - return false; - } + on_each_cpu(zenbleed_check_cpu, NULL, 1); } /* --- linux-azure-6.5.0.orig/arch/x86/kernel/cpu/bugs.c +++ linux-azure-6.5.0/arch/x86/kernel/cpu/bugs.c @@ -2353,6 +2353,8 @@ enum srso_mitigation { SRSO_MITIGATION_NONE, + SRSO_MITIGATION_UCODE_NEEDED, + SRSO_MITIGATION_SAFE_RET_UCODE_NEEDED, SRSO_MITIGATION_MICROCODE, SRSO_MITIGATION_SAFE_RET, SRSO_MITIGATION_IBPB, @@ -2368,11 +2370,13 @@ }; static const char * const srso_strings[] = { - [SRSO_MITIGATION_NONE] = "Vulnerable", - [SRSO_MITIGATION_MICROCODE] = "Mitigation: microcode", - [SRSO_MITIGATION_SAFE_RET] = "Mitigation: safe RET", - [SRSO_MITIGATION_IBPB] = "Mitigation: IBPB", - [SRSO_MITIGATION_IBPB_ON_VMEXIT] = "Mitigation: IBPB on VMEXIT only" + [SRSO_MITIGATION_NONE] = "Vulnerable", + [SRSO_MITIGATION_UCODE_NEEDED] = "Vulnerable: No microcode", + [SRSO_MITIGATION_SAFE_RET_UCODE_NEEDED] = "Vulnerable: Safe RET, no microcode", + [SRSO_MITIGATION_MICROCODE] = "Vulnerable: Microcode, no safe RET", + [SRSO_MITIGATION_SAFE_RET] = "Mitigation: Safe RET", + [SRSO_MITIGATION_IBPB] = "Mitigation: IBPB", + [SRSO_MITIGATION_IBPB_ON_VMEXIT] = "Mitigation: IBPB on VMEXIT only" }; static enum srso_mitigation srso_mitigation __ro_after_init = SRSO_MITIGATION_NONE; @@ -2404,26 +2408,12 @@ static void __init srso_select_mitigation(void) { - bool has_microcode; + bool has_microcode = boot_cpu_has(X86_FEATURE_IBPB_BRTYPE); if (!boot_cpu_has_bug(X86_BUG_SRSO) || cpu_mitigations_off()) goto pred_cmd; - /* - * The first check is for the kernel running as a guest in order - * for guests to verify whether IBPB is a viable mitigation. - */ - has_microcode = boot_cpu_has(X86_FEATURE_IBPB_BRTYPE) || cpu_has_ibpb_brtype_microcode(); - if (!has_microcode) { - pr_warn("IBPB-extending microcode not applied!\n"); - pr_warn(SRSO_NOTICE); - } else { - /* - * Enable the synthetic (even if in a real CPUID leaf) - * flags for guests. - */ - setup_force_cpu_cap(X86_FEATURE_IBPB_BRTYPE); - + if (has_microcode) { /* * Zen1/2 with SMT off aren't vulnerable after the right * IBPB microcode has been applied. @@ -2436,15 +2426,20 @@ if (retbleed_mitigation == RETBLEED_MITIGATION_IBPB) { if (has_microcode) { - pr_err("Retbleed IBPB mitigation enabled, using same for SRSO\n"); srso_mitigation = SRSO_MITIGATION_IBPB; - goto pred_cmd; + goto out; } + } else { + pr_warn("IBPB-extending microcode not applied!\n"); + pr_warn(SRSO_NOTICE); + + /* may be overwritten by SRSO_CMD_SAFE_RET below */ + srso_mitigation = SRSO_MITIGATION_UCODE_NEEDED; } switch (srso_cmd) { case SRSO_CMD_OFF: - return; + goto pred_cmd; case SRSO_CMD_MICROCODE: if (has_microcode) { @@ -2469,7 +2464,10 @@ setup_force_cpu_cap(X86_FEATURE_SRSO); x86_return_thunk = srso_return_thunk; } - srso_mitigation = SRSO_MITIGATION_SAFE_RET; + if (has_microcode) + srso_mitigation = SRSO_MITIGATION_SAFE_RET; + else + srso_mitigation = SRSO_MITIGATION_SAFE_RET_UCODE_NEEDED; } else { pr_err("WARNING: kernel not compiled with CPU_SRSO.\n"); goto pred_cmd; @@ -2504,10 +2502,11 @@ break; } - pr_info("%s%s\n", srso_strings[srso_mitigation], (has_microcode ? "" : ", no microcode")); +out: + pr_info("%s\n", srso_strings[srso_mitigation]); pred_cmd: - if ((boot_cpu_has(X86_FEATURE_SRSO_NO) || srso_cmd == SRSO_CMD_OFF) && + if ((!boot_cpu_has_bug(X86_BUG_SRSO) || srso_cmd == SRSO_CMD_OFF) && boot_cpu_has(X86_FEATURE_SBPB)) x86_pred_cmd = PRED_CMD_SBPB; } @@ -2715,9 +2714,7 @@ if (boot_cpu_has(X86_FEATURE_SRSO_NO)) return sysfs_emit(buf, "Mitigation: SMT disabled\n"); - return sysfs_emit(buf, "%s%s\n", - srso_strings[srso_mitigation], - (cpu_has_ibpb_brtype_microcode() ? "" : ", no microcode")); + return sysfs_emit(buf, "%s\n", srso_strings[srso_mitigation]); } static ssize_t gds_show_state(char *buf) --- linux-azure-6.5.0.orig/arch/x86/kernel/cpu/common.c +++ linux-azure-6.5.0/arch/x86/kernel/cpu/common.c @@ -1111,6 +1111,7 @@ c->x86_phys_bits = 36; #endif c->x86_cache_bits = c->x86_phys_bits; + c->x86_cache_alignment = c->x86_clflush_size; } static void identify_cpu_without_cpuid(struct cpuinfo_x86 *c) @@ -1265,11 +1266,11 @@ VULNBL_INTEL_STEPPINGS(BROADWELL_G, X86_STEPPING_ANY, SRBDS), VULNBL_INTEL_STEPPINGS(BROADWELL_X, X86_STEPPING_ANY, MMIO), VULNBL_INTEL_STEPPINGS(BROADWELL, X86_STEPPING_ANY, SRBDS), - VULNBL_INTEL_STEPPINGS(SKYLAKE_L, X86_STEPPING_ANY, SRBDS | MMIO | RETBLEED), VULNBL_INTEL_STEPPINGS(SKYLAKE_X, X86_STEPPING_ANY, MMIO | RETBLEED | GDS), - VULNBL_INTEL_STEPPINGS(SKYLAKE, X86_STEPPING_ANY, SRBDS | MMIO | RETBLEED), - VULNBL_INTEL_STEPPINGS(KABYLAKE_L, X86_STEPPING_ANY, SRBDS | MMIO | RETBLEED | GDS), - VULNBL_INTEL_STEPPINGS(KABYLAKE, X86_STEPPING_ANY, SRBDS | MMIO | RETBLEED | GDS), + VULNBL_INTEL_STEPPINGS(SKYLAKE_L, X86_STEPPING_ANY, MMIO | RETBLEED | GDS | SRBDS), + VULNBL_INTEL_STEPPINGS(SKYLAKE, X86_STEPPING_ANY, MMIO | RETBLEED | GDS | SRBDS), + VULNBL_INTEL_STEPPINGS(KABYLAKE_L, X86_STEPPING_ANY, MMIO | RETBLEED | GDS | SRBDS), + VULNBL_INTEL_STEPPINGS(KABYLAKE, X86_STEPPING_ANY, MMIO | RETBLEED | GDS | SRBDS), VULNBL_INTEL_STEPPINGS(CANNONLAKE_L, X86_STEPPING_ANY, RETBLEED), VULNBL_INTEL_STEPPINGS(ICELAKE_L, X86_STEPPING_ANY, MMIO | MMIO_SBDS | RETBLEED | GDS), VULNBL_INTEL_STEPPINGS(ICELAKE_D, X86_STEPPING_ANY, MMIO | GDS), @@ -1288,7 +1289,7 @@ VULNBL_AMD(0x15, RETBLEED), VULNBL_AMD(0x16, RETBLEED), VULNBL_AMD(0x17, RETBLEED | SMT_RSB | SRSO), - VULNBL_HYGON(0x18, RETBLEED | SMT_RSB), + VULNBL_HYGON(0x18, RETBLEED | SMT_RSB | SRSO), VULNBL_AMD(0x19, SRSO), {} }; @@ -1570,7 +1571,6 @@ c->x86_phys_bits = 32; c->x86_virt_bits = 32; #endif - c->x86_cache_alignment = c->x86_clflush_size; memset(&c->x86_capability, 0, sizeof(c->x86_capability)); c->extended_cpuid_level = 0; --- linux-azure-6.5.0.orig/arch/x86/kernel/cpu/hygon.c +++ linux-azure-6.5.0/arch/x86/kernel/cpu/hygon.c @@ -86,8 +86,12 @@ if (!err) c->x86_coreid_bits = get_count_order(c->x86_max_cores); - /* Socket ID is ApicId[6] for these processors. */ - c->phys_proc_id = c->apicid >> APICID_SOCKET_ID_BIT; + /* + * Socket ID is ApicId[6] for the processors with model <= 0x3 + * when running on host. + */ + if (!boot_cpu_has(X86_FEATURE_HYPERVISOR) && c->x86_model <= 0x3) + c->phys_proc_id = c->apicid >> APICID_SOCKET_ID_BIT; cacheinfo_hygon_init_llc_id(c, cpu); } else if (cpu_has(c, X86_FEATURE_NODEID_MSR)) { --- linux-azure-6.5.0.orig/arch/x86/kernel/cpu/mce/core.c +++ linux-azure-6.5.0/arch/x86/kernel/cpu/mce/core.c @@ -843,6 +843,26 @@ } /* + * Some Zen-based Instruction Fetch Units set EIPV=RIPV=0 on poison consumption + * errors. This means mce_gather_info() will not save the "ip" and "cs" registers. + * + * However, the context is still valid, so save the "cs" register for later use. + * + * The "ip" register is truly unknown, so don't save it or fixup EIPV/RIPV. + * + * The Instruction Fetch Unit is at MCA bank 1 for all affected systems. + */ +static __always_inline void quirk_zen_ifu(int bank, struct mce *m, struct pt_regs *regs) +{ + if (bank != 1) + return; + if (!(m->status & MCI_STATUS_POISON)) + return; + + m->cs = regs->cs; +} + +/* * Do a quick check if any of the events requires a panic. * This decides if we keep the events around or clear them. */ @@ -861,6 +881,9 @@ if (mce_flags.snb_ifu_quirk) quirk_sandybridge_ifu(i, m, regs); + if (mce_flags.zen_ifu_quirk) + quirk_zen_ifu(i, m, regs); + m->bank = i; if (mce_severity(m, regs, &tmp, true) >= MCE_PANIC_SEVERITY) { mce_read_aux(m, i); @@ -1842,6 +1865,9 @@ if (c->x86 == 0x15 && c->x86_model <= 0xf) mce_flags.overflow_recov = 1; + if (c->x86 >= 0x17 && c->x86 <= 0x1A) + mce_flags.zen_ifu_quirk = 1; + } if (c->x86_vendor == X86_VENDOR_INTEL) { --- linux-azure-6.5.0.orig/arch/x86/kernel/cpu/mce/internal.h +++ linux-azure-6.5.0/arch/x86/kernel/cpu/mce/internal.h @@ -157,6 +157,9 @@ */ smca : 1, + /* Zen IFU quirk */ + zen_ifu_quirk : 1, + /* AMD-style error thresholding banks present. */ amd_threshold : 1, @@ -172,7 +175,7 @@ /* Skylake, Cascade Lake, Cooper Lake REP;MOVS* quirk */ skx_repmov_quirk : 1, - __reserved_0 : 56; + __reserved_0 : 55; }; extern struct mce_vendor_flags mce_flags; --- linux-azure-6.5.0.orig/arch/x86/kernel/cpu/microcode/core.c +++ linux-azure-6.5.0/arch/x86/kernel/cpu/microcode/core.c @@ -212,6 +212,11 @@ struct cpuinfo_x86 *c = &boot_cpu_data; int ret = -EINVAL; + if (dis_ucode_ldr) { + ret = 0; + goto out; + } + switch (c->x86_vendor) { case X86_VENDOR_INTEL: if (c->x86 >= 6) @@ -225,6 +230,7 @@ break; } +out: initrd_gone = true; return ret; --- linux-azure-6.5.0.orig/arch/x86/kernel/cpu/mshyperv.c +++ linux-azure-6.5.0/arch/x86/kernel/cpu/mshyperv.c @@ -32,6 +32,7 @@ #include #include #include +#include /* Is Linux running as the root partition? */ bool hv_root_partition; @@ -39,6 +40,10 @@ bool hv_nested; struct ms_hyperv_info ms_hyperv; +/* Used in modules via hv_do_hypercall(): see arch/x86/include/asm/mshyperv.h */ +bool hyperv_paravisor_present __ro_after_init; +EXPORT_SYMBOL_GPL(hyperv_paravisor_present); + #if IS_ENABLED(CONFIG_HYPERV) static inline unsigned int hv_get_nested_reg(unsigned int reg) { @@ -65,8 +70,8 @@ { u64 value; - if (hv_is_synic_reg(reg) && hv_isolation_type_snp()) - hv_ghcb_msr_read(reg, &value); + if (hv_is_synic_reg(reg) && ms_hyperv.paravisor_present) + hv_ivm_msr_read(reg, &value); else rdmsrl(reg, value); return value; @@ -75,8 +80,8 @@ void hv_set_non_nested_register(unsigned int reg, u64 value) { - if (hv_is_synic_reg(reg) && hv_isolation_type_snp()) { - hv_ghcb_msr_write(reg, value); + if (hv_is_synic_reg(reg) && ms_hyperv.paravisor_present) { + hv_ivm_msr_write(reg, value); /* Write proxy bit via wrmsl instruction */ if (hv_is_sint_reg(reg)) @@ -295,6 +300,15 @@ native_smp_prepare_cpus(max_cpus); + /* + * Override wakeup_secondary_cpu_64 callback for SEV-SNP + * enlightened guest. + */ + if (!ms_hyperv.paravisor_present && hv_isolation_type_snp()) { + apic->wakeup_secondary_cpu_64 = hv_snp_boot_ap; + return; + } + #ifdef CONFIG_X86_64 for_each_present_cpu(i) { if (i == 0) @@ -313,6 +327,26 @@ } #endif +/* + * When a fully enlightened TDX VM runs on Hyper-V, the firmware sets the + * HW_REDUCED flag: refer to acpi_tb_create_local_fadt(). Consequently ttyS0 + * interrupts can't work because request_irq() -> ... -> irq_to_desc() returns + * NULL for ttyS0. This happens because mp_config_acpi_legacy_irqs() sees a + * nr_legacy_irqs() of 0, so it doesn't initialize the array 'mp_irqs[]', and + * later setup_IO_APIC_irqs() -> find_irq_entry() fails to find the legacy irqs + * from the array and hence doesn't create the necessary irq description info. + * + * Clone arch/x86/kernel/acpi/boot.c: acpi_generic_reduced_hw_init() here, + * except don't change 'legacy_pic', which keeps its default value + * 'default_legacy_pic'. This way, mp_config_acpi_legacy_irqs() sees a non-zero + * nr_legacy_irqs() and eventually serial console interrupts works properly. + */ +static void __init reduced_hw_init(void) +{ + x86_init.timers.timer_init = x86_init_noop; + x86_init.irqs.pre_vector_init = x86_init_noop; +} + static void __init ms_hyperv_init_platform(void) { int hv_max_functions_eax; @@ -399,11 +433,30 @@ ms_hyperv.shared_gpa_boundary = BIT_ULL(ms_hyperv.shared_gpa_boundary_bits); + hyperv_paravisor_present = !!ms_hyperv.paravisor_present; + pr_info("Hyper-V: Isolation Config: Group A 0x%x, Group B 0x%x\n", ms_hyperv.isolation_config_a, ms_hyperv.isolation_config_b); - if (hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP) + + if (hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP) { static_branch_enable(&isolation_type_snp); + } else if (hv_get_isolation_type() == HV_ISOLATION_TYPE_TDX) { + static_branch_enable(&isolation_type_tdx); + + /* A TDX VM must use x2APIC and doesn't use lazy EOI. */ + ms_hyperv.hints &= ~HV_X64_APIC_ACCESS_RECOMMENDED; + + if (!ms_hyperv.paravisor_present) { + /* HV_REGISTER_CRASH_CTL is unsupported. */ + ms_hyperv.misc_features &= ~HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE; + + /* Don't trust Hyper-V's TLB-flushing hypercalls. */ + ms_hyperv.hints &= ~HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED; + + x86_init.acpi.reduced_hw_early_init = reduced_hw_init; + } + } } if (hv_max_functions_eax >= HYPERV_CPUID_NESTED_FEATURES) { @@ -473,7 +526,7 @@ #if IS_ENABLED(CONFIG_HYPERV) if ((hv_get_isolation_type() == HV_ISOLATION_TYPE_VBS) || - (hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP)) + ms_hyperv.paravisor_present) hv_vtom_init(); /* * Setup the hook to get control post apic initialization. @@ -497,7 +550,8 @@ # ifdef CONFIG_SMP smp_ops.smp_prepare_boot_cpu = hv_smp_prepare_boot_cpu; - if (hv_root_partition) + if (hv_root_partition || + (!ms_hyperv.paravisor_present && hv_isolation_type_snp())) smp_ops.smp_prepare_cpus = hv_smp_prepare_cpus; # endif @@ -560,6 +614,22 @@ return eax & HYPERV_VS_PROPERTIES_EAX_EXTENDED_IOAPIC_RTE; } +#ifdef CONFIG_AMD_MEM_ENCRYPT +static void hv_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs) +{ + /* RAX and CPL are already in the GHCB */ + ghcb_set_rcx(ghcb, regs->cx); + ghcb_set_rdx(ghcb, regs->dx); + ghcb_set_r8(ghcb, regs->r8); +} + +static bool hv_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs) +{ + /* No checking of the return state needed */ + return true; +} +#endif + const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = { .name = "Microsoft Hyper-V", .detect = ms_hyperv_platform, @@ -567,4 +637,8 @@ .init.x2apic_available = ms_hyperv_x2apic_available, .init.msi_ext_dest_id = ms_hyperv_msi_ext_dest_id, .init.init_platform = ms_hyperv_init_platform, +#ifdef CONFIG_AMD_MEM_ENCRYPT + .runtime.sev_es_hcall_prepare = hv_sev_es_hcall_prepare, + .runtime.sev_es_hcall_finish = hv_sev_es_hcall_finish, +#endif }; --- linux-azure-6.5.0.orig/arch/x86/kernel/cpu/sgx/encl.c +++ linux-azure-6.5.0/arch/x86/kernel/cpu/sgx/encl.c @@ -235,6 +235,21 @@ return epc_page; } +/* + * Ensure the SECS page is not swapped out. Must be called with encl->lock + * to protect the enclave states including SECS and ensure the SECS page is + * not swapped out again while being used. + */ +static struct sgx_epc_page *sgx_encl_load_secs(struct sgx_encl *encl) +{ + struct sgx_epc_page *epc_page = encl->secs.epc_page; + + if (!epc_page) + epc_page = sgx_encl_eldu(&encl->secs, NULL); + + return epc_page; +} + static struct sgx_encl_page *__sgx_encl_load_page(struct sgx_encl *encl, struct sgx_encl_page *entry) { @@ -248,11 +263,9 @@ return entry; } - if (!(encl->secs.epc_page)) { - epc_page = sgx_encl_eldu(&encl->secs, NULL); - if (IS_ERR(epc_page)) - return ERR_CAST(epc_page); - } + epc_page = sgx_encl_load_secs(encl); + if (IS_ERR(epc_page)) + return ERR_CAST(epc_page); epc_page = sgx_encl_eldu(entry, encl->secs.epc_page); if (IS_ERR(epc_page)) @@ -339,6 +352,13 @@ mutex_lock(&encl->lock); + epc_page = sgx_encl_load_secs(encl); + if (IS_ERR(epc_page)) { + if (PTR_ERR(epc_page) == -EBUSY) + vmret = VM_FAULT_NOPAGE; + goto err_out_unlock; + } + epc_page = sgx_alloc_epc_page(encl_page, false); if (IS_ERR(epc_page)) { if (PTR_ERR(epc_page) == -EBUSY) --- linux-azure-6.5.0.orig/arch/x86/kernel/cpu/sgx/virt.c +++ linux-azure-6.5.0/arch/x86/kernel/cpu/sgx/virt.c @@ -204,6 +204,7 @@ continue; xa_erase(&vepc->page_array, index); + cond_resched(); } /* @@ -222,6 +223,7 @@ list_add_tail(&epc_page->list, &secs_pages); xa_erase(&vepc->page_array, index); + cond_resched(); } /* @@ -243,6 +245,7 @@ if (sgx_vepc_free_page(epc_page)) list_add_tail(&epc_page->list, &secs_pages); + cond_resched(); } if (!list_empty(&secs_pages)) --- linux-azure-6.5.0.orig/arch/x86/kernel/crash.c +++ linux-azure-6.5.0/arch/x86/kernel/crash.c @@ -48,27 +48,6 @@ unsigned int type; }; -/* - * This is used to VMCLEAR all VMCSs loaded on the - * processor. And when loading kvm_intel module, the - * callback function pointer will be assigned. - * - * protected by rcu. - */ -crash_vmclear_fn __rcu *crash_vmclear_loaded_vmcss = NULL; -EXPORT_SYMBOL_GPL(crash_vmclear_loaded_vmcss); - -static inline void cpu_crash_vmclear_loaded_vmcss(void) -{ - crash_vmclear_fn *do_vmclear_operation = NULL; - - rcu_read_lock(); - do_vmclear_operation = rcu_dereference(crash_vmclear_loaded_vmcss); - if (do_vmclear_operation) - do_vmclear_operation(); - rcu_read_unlock(); -} - #if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC) static void kdump_nmi_callback(int cpu, struct pt_regs *regs) @@ -76,11 +55,6 @@ crash_save_cpu(regs, cpu); /* - * VMCLEAR VMCSs loaded on all cpus if needed. - */ - cpu_crash_vmclear_loaded_vmcss(); - - /* * Disable Intel PT to stop its logging */ cpu_emergency_stop_pt(); @@ -133,11 +107,6 @@ crash_smp_send_stop(); - /* - * VMCLEAR VMCSs loaded on this cpu if needed. - */ - cpu_crash_vmclear_loaded_vmcss(); - cpu_emergency_disable_virtualization(); /* --- linux-azure-6.5.0.orig/arch/x86/kernel/early-quirks.c +++ linux-azure-6.5.0/arch/x86/kernel/early-quirks.c @@ -29,6 +29,37 @@ #include #include +static void __init early_pci_clear_msi(int bus, int slot, int func) +{ + int pos; + u16 ctrl; + + if (likely(!pci_early_clear_msi)) + return; + + pr_info_once("Clearing MSI/MSI-X enable bits early in boot (quirk)\n"); + + pos = pci_early_find_cap(bus, slot, func, PCI_CAP_ID_MSI); + if (pos) { + ctrl = read_pci_config_16(bus, slot, func, pos + PCI_MSI_FLAGS); + ctrl &= ~PCI_MSI_FLAGS_ENABLE; + write_pci_config_16(bus, slot, func, pos + PCI_MSI_FLAGS, ctrl); + + /* Read again to flush previous write */ + ctrl = read_pci_config_16(bus, slot, func, pos + PCI_MSI_FLAGS); + } + + pos = pci_early_find_cap(bus, slot, func, PCI_CAP_ID_MSIX); + if (pos) { + ctrl = read_pci_config_16(bus, slot, func, pos + PCI_MSIX_FLAGS); + ctrl &= ~PCI_MSIX_FLAGS_ENABLE; + write_pci_config_16(bus, slot, func, pos + PCI_MSIX_FLAGS, ctrl); + + /* Read again to flush previous write */ + ctrl = read_pci_config_16(bus, slot, func, pos + PCI_MSIX_FLAGS); + } +} + static void __init fix_hypertransport_config(int num, int slot, int func) { u32 htcfg; @@ -728,6 +759,7 @@ PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet}, { PCI_VENDOR_ID_BROADCOM, 0x4331, PCI_CLASS_NETWORK_OTHER, PCI_ANY_ID, 0, apple_airport_reset}, + { PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, early_pci_clear_msi}, {} }; @@ -780,6 +812,10 @@ PCI_HEADER_TYPE); if ((type & 0x7f) == PCI_HEADER_TYPE_BRIDGE) { + /* pci_early_clear_msi scans the buses differently. */ + if (pci_early_clear_msi) + return -1; + sec = read_pci_config_byte(num, slot, func, PCI_SECONDARY_BUS); if (sec > num) early_pci_scan_bus(sec); @@ -806,8 +842,13 @@ void __init early_quirks(void) { + int bus; + if (!early_pci_allowed()) return; early_pci_scan_bus(0); + /* pci_early_clear_msi scans more buses. */ + for (bus = 1; pci_early_clear_msi && bus < 256; bus++) + early_pci_scan_bus(bus); } --- linux-azure-6.5.0.orig/arch/x86/kernel/eisa.c +++ linux-azure-6.5.0/arch/x86/kernel/eisa.c @@ -8,10 +8,20 @@ #include +extern bool hyperv_paravisor_present; + static __init int eisa_bus_probe(void) { void __iomem *p; + /* + * Hyper-V hasn't emulated this MMIO access yet for a TDX VM with + * the pavavisor: in such a VM, the "readl(p)" below causes a + * soft lockup. Work around the issue for now. + */ + if (hyperv_paravisor_present) + return 0; + if (xen_pv_domain() && !xen_initial_domain()) return 0; --- linux-azure-6.5.0.orig/arch/x86/kernel/fpu/core.c +++ linux-azure-6.5.0/arch/x86/kernel/fpu/core.c @@ -369,14 +369,15 @@ EXPORT_SYMBOL_GPL(fpu_swap_kvm_fpstate); void fpu_copy_guest_fpstate_to_uabi(struct fpu_guest *gfpu, void *buf, - unsigned int size, u32 pkru) + unsigned int size, u64 xfeatures, u32 pkru) { struct fpstate *kstate = gfpu->fpstate; union fpregs_state *ustate = buf; struct membuf mb = { .p = buf, .left = size }; if (cpu_feature_enabled(X86_FEATURE_XSAVE)) { - __copy_xstate_to_uabi_buf(mb, kstate, pkru, XSTATE_COPY_XSAVE); + __copy_xstate_to_uabi_buf(mb, kstate, xfeatures, pkru, + XSTATE_COPY_XSAVE); } else { memcpy(&ustate->fxsave, &kstate->regs.fxsave, sizeof(ustate->fxsave)); --- linux-azure-6.5.0.orig/arch/x86/kernel/fpu/xstate.c +++ linux-azure-6.5.0/arch/x86/kernel/fpu/xstate.c @@ -1053,6 +1053,7 @@ * __copy_xstate_to_uabi_buf - Copy kernel saved xstate to a UABI buffer * @to: membuf descriptor * @fpstate: The fpstate buffer from which to copy + * @xfeatures: The mask of xfeatures to save (XSAVE mode only) * @pkru_val: The PKRU value to store in the PKRU component * @copy_mode: The requested copy mode * @@ -1063,7 +1064,8 @@ * It supports partial copy but @to.pos always starts from zero. */ void __copy_xstate_to_uabi_buf(struct membuf to, struct fpstate *fpstate, - u32 pkru_val, enum xstate_copy_mode copy_mode) + u64 xfeatures, u32 pkru_val, + enum xstate_copy_mode copy_mode) { const unsigned int off_mxcsr = offsetof(struct fxregs_state, mxcsr); struct xregs_state *xinit = &init_fpstate.regs.xsave; @@ -1087,7 +1089,7 @@ break; case XSTATE_COPY_XSAVE: - header.xfeatures &= fpstate->user_xfeatures; + header.xfeatures &= fpstate->user_xfeatures & xfeatures; break; } @@ -1189,6 +1191,7 @@ enum xstate_copy_mode copy_mode) { __copy_xstate_to_uabi_buf(to, tsk->thread.fpu.fpstate, + tsk->thread.fpu.fpstate->user_xfeatures, tsk->thread.pkru, copy_mode); } @@ -1540,10 +1543,7 @@ fpregs_restore_userregs(); newfps->xfeatures = curfps->xfeatures | xfeatures; - - if (!guest_fpu) - newfps->user_xfeatures = curfps->user_xfeatures | xfeatures; - + newfps->user_xfeatures = curfps->user_xfeatures | xfeatures; newfps->xfd = curfps->xfd & ~xfeatures; /* Do the final updates within the locked region */ --- linux-azure-6.5.0.orig/arch/x86/kernel/fpu/xstate.h +++ linux-azure-6.5.0/arch/x86/kernel/fpu/xstate.h @@ -43,7 +43,8 @@ struct membuf; extern void __copy_xstate_to_uabi_buf(struct membuf to, struct fpstate *fpstate, - u32 pkru_val, enum xstate_copy_mode copy_mode); + u64 xfeatures, u32 pkru_val, + enum xstate_copy_mode copy_mode); extern void copy_xstate_to_uabi_buf(struct membuf to, struct task_struct *tsk, enum xstate_copy_mode mode); extern int copy_uabi_from_kernel_to_xstate(struct fpstate *fpstate, const void *kbuf, u32 *pkru); --- linux-azure-6.5.0.orig/arch/x86/kernel/head64.c +++ linux-azure-6.5.0/arch/x86/kernel/head64.c @@ -80,7 +80,7 @@ * while the kernel still uses a direct mapping. */ static struct desc_ptr startup_gdt_descr = { - .size = sizeof(startup_gdt), + .size = sizeof(startup_gdt)-1, .address = 0, }; --- linux-azure-6.5.0.orig/arch/x86/kernel/head_32.S +++ linux-azure-6.5.0/arch/x86/kernel/head_32.S @@ -27,6 +27,7 @@ #include #include #include +#include /* Physical address */ #define pa(X) ((X) - __PAGE_OFFSET) --- linux-azure-6.5.0.orig/arch/x86/kernel/head_64.S +++ linux-azure-6.5.0/arch/x86/kernel/head_64.S @@ -261,6 +261,22 @@ testl $X2APIC_ENABLE, %eax jnz .Lread_apicid_msr +#ifdef CONFIG_X86_X2APIC + /* + * If system is in X2APIC mode then MMIO base might not be + * mapped causing the MMIO read below to fault. Faults can't + * be handled at that point. + */ + cmpl $0, x2apic_mode(%rip) + jz .Lread_apicid_mmio + + /* Force the AP into X2APIC mode. */ + orl $X2APIC_ENABLE, %eax + wrmsr + jmp .Lread_apicid_msr +#endif + +.Lread_apicid_mmio: /* Read the APIC ID from the fix-mapped MMIO space. */ movq apic_mmio_base(%rip), %rcx addq $APIC_ID, %rcx --- linux-azure-6.5.0.orig/arch/x86/kernel/i8259.c +++ linux-azure-6.5.0/arch/x86/kernel/i8259.c @@ -32,6 +32,7 @@ */ static void init_8259A(int auto_eoi); +static bool pcat_compat __ro_after_init; static int i8259A_auto_eoi; DEFINE_RAW_SPINLOCK(i8259A_lock); @@ -301,15 +302,32 @@ static int probe_8259A(void) { + unsigned char new_val, probe_val = ~(1 << PIC_CASCADE_IR); unsigned long flags; - unsigned char probe_val = ~(1 << PIC_CASCADE_IR); - unsigned char new_val; + + /* + * If MADT has the PCAT_COMPAT flag set, then do not bother probing + * for the PIC. Some BIOSes leave the PIC uninitialized and probing + * fails. + * + * Right now this causes problems as quite some code depends on + * nr_legacy_irqs() > 0 or has_legacy_pic() == true. This is silly + * when the system has an IO/APIC because then PIC is not required + * at all, except for really old machines where the timer interrupt + * must be routed through the PIC. So just pretend that the PIC is + * there and let legacy_pic->init() initialize it for nothing. + * + * Alternatively this could just try to initialize the PIC and + * repeat the probe, but for cases where there is no PIC that's + * just pointless. + */ + if (pcat_compat) + return nr_legacy_irqs(); + /* - * Check to see if we have a PIC. - * Mask all except the cascade and read - * back the value we just wrote. If we don't - * have a PIC, we will read 0xff as opposed to the - * value we wrote. + * Check to see if we have a PIC. Mask all except the cascade and + * read back the value we just wrote. If we don't have a PIC, we + * will read 0xff as opposed to the value we wrote. */ raw_spin_lock_irqsave(&i8259A_lock, flags); @@ -431,5 +449,9 @@ return 0; } - device_initcall(i8259A_init_ops); + +void __init legacy_pic_pcat_compat(void) +{ + pcat_compat = true; +} --- linux-azure-6.5.0.orig/arch/x86/kernel/idt.c +++ linux-azure-6.5.0/arch/x86/kernel/idt.c @@ -117,7 +117,7 @@ SYSG(X86_TRAP_OF, asm_exc_overflow), #if defined(CONFIG_IA32_EMULATION) - SYSG(IA32_SYSCALL_VECTOR, entry_INT80_compat), + SYSG(IA32_SYSCALL_VECTOR, asm_int80_emulation), #elif defined(CONFIG_X86_32) SYSG(IA32_SYSCALL_VECTOR, entry_INT80_32), #endif --- linux-azure-6.5.0.orig/arch/x86/kernel/kprobes/core.c +++ linux-azure-6.5.0/arch/x86/kernel/kprobes/core.c @@ -542,7 +542,8 @@ { unsigned long offs = addrmode_regoffs[p->ainsn.indirect.reg]; - int3_emulate_call(regs, regs_get_register(regs, offs)); + int3_emulate_push(regs, regs->ip - INT3_INSN_SIZE + p->ainsn.size); + int3_emulate_jmp(regs, regs_get_register(regs, offs)); } NOKPROBE_SYMBOL(kprobe_emulate_call_indirect); --- linux-azure-6.5.0.orig/arch/x86/kernel/kvm.c +++ linux-azure-6.5.0/arch/x86/kernel/kvm.c @@ -966,10 +966,8 @@ * Ensure that _bss_decrypted section is marked as decrypted in the * shared pages list. */ - nr_pages = DIV_ROUND_UP(__end_bss_decrypted - __start_bss_decrypted, - PAGE_SIZE); early_set_mem_enc_dec_hypercall((unsigned long)__start_bss_decrypted, - nr_pages, 0); + __end_bss_decrypted - __start_bss_decrypted, 0); /* * If not booted using EFI, enable Live migration support. --- linux-azure-6.5.0.orig/arch/x86/kernel/nmi.c +++ linux-azure-6.5.0/arch/x86/kernel/nmi.c @@ -507,12 +507,13 @@ } this_cpu_write(nmi_state, NMI_EXECUTING); this_cpu_write(nmi_cr2, read_cr2()); + +nmi_restart: if (IS_ENABLED(CONFIG_NMI_CHECK_CPU)) { WRITE_ONCE(nsp->idt_seq, nsp->idt_seq + 1); WARN_ON_ONCE(!(nsp->idt_seq & 0x1)); WRITE_ONCE(nsp->recv_jiffies, jiffies); } -nmi_restart: /* * Needs to happen before DR7 is accessed, because the hypervisor can @@ -548,16 +549,16 @@ if (unlikely(this_cpu_read(nmi_cr2) != read_cr2())) write_cr2(this_cpu_read(nmi_cr2)); - if (this_cpu_dec_return(nmi_state)) - goto nmi_restart; - - if (user_mode(regs)) - mds_user_clear_cpu_buffers(); if (IS_ENABLED(CONFIG_NMI_CHECK_CPU)) { WRITE_ONCE(nsp->idt_seq, nsp->idt_seq + 1); WARN_ON_ONCE(nsp->idt_seq & 0x1); WRITE_ONCE(nsp->recv_jiffies, jiffies); } + if (this_cpu_dec_return(nmi_state)) + goto nmi_restart; + + if (user_mode(regs)) + mds_user_clear_cpu_buffers(); } #if IS_ENABLED(CONFIG_KVM_INTEL) --- linux-azure-6.5.0.orig/arch/x86/kernel/reboot.c +++ linux-azure-6.5.0/arch/x86/kernel/reboot.c @@ -32,6 +32,7 @@ #include #include #include +#include /* * Power off function, if any @@ -488,7 +489,46 @@ DMI_MATCH(DMI_PRODUCT_NAME, "VGN-Z540N"), }, }, - + { /* Handle problems with rebooting on the Latitude E6520. */ + .callback = set_pci_reboot, + .ident = "Dell Latitude E6520", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E6520"), + }, + }, + { /* Handle problems with rebooting on the OptiPlex 790. */ + .callback = set_pci_reboot, + .ident = "Dell OptiPlex 790", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 790"), + }, + }, + { /* Handle problems with rebooting on the OptiPlex 990. */ + .callback = set_pci_reboot, + .ident = "Dell OptiPlex 990", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 990"), + }, + }, + { /* Handle problems with rebooting on the Latitude E6220. */ + .callback = set_pci_reboot, + .ident = "Dell Latitude E6220", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E6220"), + }, + }, + { /* Handle problems with rebooting on the OptiPlex 390. */ + .callback = set_pci_reboot, + .ident = "Dell OptiPlex 390", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 390"), + }, + }, { } }; @@ -787,6 +827,26 @@ } #endif +/* + * This is used to VMCLEAR all VMCSs loaded on the + * processor. And when loading kvm_intel module, the + * callback function pointer will be assigned. + * + * protected by rcu. + */ +crash_vmclear_fn __rcu *crash_vmclear_loaded_vmcss; +EXPORT_SYMBOL_GPL(crash_vmclear_loaded_vmcss); + +static inline void cpu_crash_vmclear_loaded_vmcss(void) +{ + crash_vmclear_fn *do_vmclear_operation = NULL; + + rcu_read_lock(); + do_vmclear_operation = rcu_dereference(crash_vmclear_loaded_vmcss); + if (do_vmclear_operation) + do_vmclear_operation(); + rcu_read_unlock(); +} /* This is the CPU performing the emergency shutdown work. */ int crashing_cpu = -1; @@ -798,6 +858,8 @@ */ void cpu_emergency_disable_virtualization(void) { + cpu_crash_vmclear_loaded_vmcss(); + cpu_emergency_vmxoff(); cpu_emergency_svm_disable(); } --- linux-azure-6.5.0.orig/arch/x86/kernel/relocate_kernel_32.S +++ linux-azure-6.5.0/arch/x86/kernel/relocate_kernel_32.S @@ -9,6 +9,7 @@ #include #include #include +#include /* * Must be relocatable PIC code callable as a C function, in particular --- linux-azure-6.5.0.orig/arch/x86/kernel/setup.c +++ linux-azure-6.5.0/arch/x86/kernel/setup.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -359,15 +360,11 @@ #if defined(CONFIG_HAVE_IMA_KEXEC) && !defined(CONFIG_OF_FLATTREE) int __init ima_free_kexec_buffer(void) { - int rc; - if (!ima_kexec_buffer_size) return -ENOENT; - rc = memblock_phys_free(ima_kexec_buffer_phys, - ima_kexec_buffer_size); - if (rc) - return rc; + memblock_free_late(ima_kexec_buffer_phys, + ima_kexec_buffer_size); ima_kexec_buffer_phys = 0; ima_kexec_buffer_size = 0; @@ -1032,6 +1029,14 @@ efi_init(); reserve_ibft_region(); + + efi_set_secure_boot(boot_params.secure_boot); + +#ifdef CONFIG_LOCK_DOWN_IN_SECURE_BOOT + if (efi_enabled(EFI_SECURE_BOOT)) + security_lock_kernel_down("EFI Secure Boot mode", LOCKDOWN_INTEGRITY_MAX); +#endif + dmi_setup(); /* @@ -1192,19 +1197,7 @@ /* Allocate bigger log buffer */ setup_log_buf(1); - if (efi_enabled(EFI_BOOT)) { - switch (boot_params.secure_boot) { - case efi_secureboot_mode_disabled: - pr_info("Secure boot disabled\n"); - break; - case efi_secureboot_mode_enabled: - pr_info("Secure boot enabled\n"); - break; - default: - pr_info("Secure boot could not be determined\n"); - break; - } - } + efi_set_secure_boot(boot_params.secure_boot); reserve_initrd(); --- linux-azure-6.5.0.orig/arch/x86/kernel/sev-shared.c +++ linux-azure-6.5.0/arch/x86/kernel/sev-shared.c @@ -256,7 +256,7 @@ return 0; } -static int sev_cpuid_hv(struct cpuid_leaf *leaf) +static int __sev_cpuid_hv_msr(struct cpuid_leaf *leaf) { int ret; @@ -279,6 +279,45 @@ return ret; } +static int __sev_cpuid_hv_ghcb(struct ghcb *ghcb, struct es_em_ctxt *ctxt, struct cpuid_leaf *leaf) +{ + u32 cr4 = native_read_cr4(); + int ret; + + ghcb_set_rax(ghcb, leaf->fn); + ghcb_set_rcx(ghcb, leaf->subfn); + + if (cr4 & X86_CR4_OSXSAVE) + /* Safe to read xcr0 */ + ghcb_set_xcr0(ghcb, xgetbv(XCR_XFEATURE_ENABLED_MASK)); + else + /* xgetbv will cause #UD - use reset value for xcr0 */ + ghcb_set_xcr0(ghcb, 1); + + ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_CPUID, 0, 0); + if (ret != ES_OK) + return ret; + + if (!(ghcb_rax_is_valid(ghcb) && + ghcb_rbx_is_valid(ghcb) && + ghcb_rcx_is_valid(ghcb) && + ghcb_rdx_is_valid(ghcb))) + return ES_VMM_ERROR; + + leaf->eax = ghcb->save.rax; + leaf->ebx = ghcb->save.rbx; + leaf->ecx = ghcb->save.rcx; + leaf->edx = ghcb->save.rdx; + + return ES_OK; +} + +static int sev_cpuid_hv(struct ghcb *ghcb, struct es_em_ctxt *ctxt, struct cpuid_leaf *leaf) +{ + return ghcb ? __sev_cpuid_hv_ghcb(ghcb, ctxt, leaf) + : __sev_cpuid_hv_msr(leaf); +} + /* * This may be called early while still running on the initial identity * mapping. Use RIP-relative addressing to obtain the correct address @@ -388,19 +427,20 @@ return false; } -static void snp_cpuid_hv(struct cpuid_leaf *leaf) +static void snp_cpuid_hv(struct ghcb *ghcb, struct es_em_ctxt *ctxt, struct cpuid_leaf *leaf) { - if (sev_cpuid_hv(leaf)) + if (sev_cpuid_hv(ghcb, ctxt, leaf)) sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_CPUID_HV); } -static int snp_cpuid_postprocess(struct cpuid_leaf *leaf) +static int snp_cpuid_postprocess(struct ghcb *ghcb, struct es_em_ctxt *ctxt, + struct cpuid_leaf *leaf) { struct cpuid_leaf leaf_hv = *leaf; switch (leaf->fn) { case 0x1: - snp_cpuid_hv(&leaf_hv); + snp_cpuid_hv(ghcb, ctxt, &leaf_hv); /* initial APIC ID */ leaf->ebx = (leaf_hv.ebx & GENMASK(31, 24)) | (leaf->ebx & GENMASK(23, 0)); @@ -419,7 +459,7 @@ break; case 0xB: leaf_hv.subfn = 0; - snp_cpuid_hv(&leaf_hv); + snp_cpuid_hv(ghcb, ctxt, &leaf_hv); /* extended APIC ID */ leaf->edx = leaf_hv.edx; @@ -467,7 +507,7 @@ } break; case 0x8000001E: - snp_cpuid_hv(&leaf_hv); + snp_cpuid_hv(ghcb, ctxt, &leaf_hv); /* extended APIC ID */ leaf->eax = leaf_hv.eax; @@ -488,7 +528,7 @@ * Returns -EOPNOTSUPP if feature not enabled. Any other non-zero return value * should be treated as fatal by caller. */ -static int snp_cpuid(struct cpuid_leaf *leaf) +static int snp_cpuid(struct ghcb *ghcb, struct es_em_ctxt *ctxt, struct cpuid_leaf *leaf) { const struct snp_cpuid_table *cpuid_table = snp_cpuid_get_table(); @@ -522,7 +562,7 @@ return 0; } - return snp_cpuid_postprocess(leaf); + return snp_cpuid_postprocess(ghcb, ctxt, leaf); } /* @@ -544,14 +584,14 @@ leaf.fn = fn; leaf.subfn = subfn; - ret = snp_cpuid(&leaf); + ret = snp_cpuid(NULL, NULL, &leaf); if (!ret) goto cpuid_done; if (ret != -EOPNOTSUPP) goto fail; - if (sev_cpuid_hv(&leaf)) + if (__sev_cpuid_hv_msr(&leaf)) goto fail; cpuid_done: @@ -592,6 +632,23 @@ sev_es_terminate(SEV_TERM_SET_GEN, GHCB_SEV_ES_GEN_REQ); } +static enum es_result vc_insn_string_check(struct es_em_ctxt *ctxt, + unsigned long address, + bool write) +{ + if (user_mode(ctxt->regs) && fault_in_kernel_space(address)) { + ctxt->fi.vector = X86_TRAP_PF; + ctxt->fi.error_code = X86_PF_USER; + ctxt->fi.cr2 = address; + if (write) + ctxt->fi.error_code |= X86_PF_WRITE; + + return ES_EXCEPTION; + } + + return ES_OK; +} + static enum es_result vc_insn_string_read(struct es_em_ctxt *ctxt, void *src, char *buf, unsigned int data_size, @@ -599,7 +656,12 @@ bool backwards) { int i, b = backwards ? -1 : 1; - enum es_result ret = ES_OK; + unsigned long address = (unsigned long)src; + enum es_result ret; + + ret = vc_insn_string_check(ctxt, address, false); + if (ret != ES_OK) + return ret; for (i = 0; i < count; i++) { void *s = src + (i * data_size * b); @@ -620,7 +682,12 @@ bool backwards) { int i, s = backwards ? -1 : 1; - enum es_result ret = ES_OK; + unsigned long address = (unsigned long)dst; + enum es_result ret; + + ret = vc_insn_string_check(ctxt, address, true); + if (ret != ES_OK) + return ret; for (i = 0; i < count; i++) { void *d = dst + (i * data_size * s); @@ -656,6 +723,9 @@ static enum es_result vc_ioio_exitinfo(struct es_em_ctxt *ctxt, u64 *exitinfo) { struct insn *insn = &ctxt->insn; + size_t size; + u64 port; + *exitinfo = 0; switch (insn->opcode.bytes[0]) { @@ -664,7 +734,7 @@ case 0x6d: *exitinfo |= IOIO_TYPE_INS; *exitinfo |= IOIO_SEG_ES; - *exitinfo |= (ctxt->regs->dx & 0xffff) << 16; + port = ctxt->regs->dx & 0xffff; break; /* OUTS opcodes */ @@ -672,41 +742,43 @@ case 0x6f: *exitinfo |= IOIO_TYPE_OUTS; *exitinfo |= IOIO_SEG_DS; - *exitinfo |= (ctxt->regs->dx & 0xffff) << 16; + port = ctxt->regs->dx & 0xffff; break; /* IN immediate opcodes */ case 0xe4: case 0xe5: *exitinfo |= IOIO_TYPE_IN; - *exitinfo |= (u8)insn->immediate.value << 16; + port = (u8)insn->immediate.value & 0xffff; break; /* OUT immediate opcodes */ case 0xe6: case 0xe7: *exitinfo |= IOIO_TYPE_OUT; - *exitinfo |= (u8)insn->immediate.value << 16; + port = (u8)insn->immediate.value & 0xffff; break; /* IN register opcodes */ case 0xec: case 0xed: *exitinfo |= IOIO_TYPE_IN; - *exitinfo |= (ctxt->regs->dx & 0xffff) << 16; + port = ctxt->regs->dx & 0xffff; break; /* OUT register opcodes */ case 0xee: case 0xef: *exitinfo |= IOIO_TYPE_OUT; - *exitinfo |= (ctxt->regs->dx & 0xffff) << 16; + port = ctxt->regs->dx & 0xffff; break; default: return ES_DECODE_FAILED; } + *exitinfo |= port << 16; + switch (insn->opcode.bytes[0]) { case 0x6c: case 0x6e: @@ -716,12 +788,15 @@ case 0xee: /* Single byte opcodes */ *exitinfo |= IOIO_DATA_8; + size = 1; break; default: /* Length determined by instruction parsing */ *exitinfo |= (insn->opnd_bytes == 2) ? IOIO_DATA_16 : IOIO_DATA_32; + size = (insn->opnd_bytes == 2) ? 2 : 4; } + switch (insn->addr_bytes) { case 2: *exitinfo |= IOIO_ADDR_16; @@ -737,7 +812,7 @@ if (insn_has_rep_prefix(insn)) *exitinfo |= IOIO_REP; - return ES_OK; + return vc_ioio_check(ctxt, (u16)port, size); } static enum es_result vc_handle_ioio(struct ghcb *ghcb, struct es_em_ctxt *ctxt) @@ -848,14 +923,15 @@ return ret; } -static int vc_handle_cpuid_snp(struct pt_regs *regs) +static int vc_handle_cpuid_snp(struct ghcb *ghcb, struct es_em_ctxt *ctxt) { + struct pt_regs *regs = ctxt->regs; struct cpuid_leaf leaf; int ret; leaf.fn = regs->ax; leaf.subfn = regs->cx; - ret = snp_cpuid(&leaf); + ret = snp_cpuid(ghcb, ctxt, &leaf); if (!ret) { regs->ax = leaf.eax; regs->bx = leaf.ebx; @@ -874,7 +950,7 @@ enum es_result ret; int snp_cpuid_ret; - snp_cpuid_ret = vc_handle_cpuid_snp(regs); + snp_cpuid_ret = vc_handle_cpuid_snp(ghcb, ctxt); if (!snp_cpuid_ret) return ES_OK; if (snp_cpuid_ret != -EOPNOTSUPP) --- linux-azure-6.5.0.orig/arch/x86/kernel/sev.c +++ linux-azure-6.5.0/arch/x86/kernel/sev.c @@ -524,6 +524,33 @@ return ES_OK; } +static enum es_result vc_ioio_check(struct es_em_ctxt *ctxt, u16 port, size_t size) +{ + BUG_ON(size > 4); + + if (user_mode(ctxt->regs)) { + struct thread_struct *t = ¤t->thread; + struct io_bitmap *iobm = t->io_bitmap; + size_t idx; + + if (!iobm) + goto fault; + + for (idx = port; idx < port + size; ++idx) { + if (test_bit(idx, iobm->bitmap)) + goto fault; + } + } + + return ES_OK; + +fault: + ctxt->fi.vector = X86_TRAP_GP; + ctxt->fi.error_code = 0; + + return ES_EXCEPTION; +} + /* Include code shared with pre-decompression boot stage */ #include "sev-shared.c" @@ -868,8 +895,7 @@ void snp_accept_memory(phys_addr_t start, phys_addr_t end) { - unsigned long vaddr; - unsigned int npages; + unsigned long vaddr, npages; if (!cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) return; @@ -1208,10 +1234,6 @@ if (!cc_platform_has(CC_ATTR_GUEST_STATE_ENCRYPT)) return; - /* First make sure the hypervisor talks a supported protocol. */ - if (!sev_es_negotiate_protocol()) - sev_es_terminate(SEV_TERM_SET_GEN, GHCB_SEV_ES_GEN_REQ); - /* * Check whether the runtime #VC exception handler is active. It uses * the per-CPU GHCB page which is set up by sev_es_init_vc_handling(). @@ -1229,6 +1251,13 @@ } /* + * Make sure the hypervisor talks a supported protocol. + * This gets called only in the BSP boot phase. + */ + if (!sev_es_negotiate_protocol()) + sev_es_terminate(SEV_TERM_SET_GEN, GHCB_SEV_ES_GEN_REQ); + + /* * Clear the boot_ghcb. The first exception comes in before the bss * section is cleared. */ @@ -1509,6 +1538,9 @@ return ES_DECODE_FAILED; } + if (user_mode(ctxt->regs)) + return ES_UNSUPPORTED; + switch (mmio) { case INSN_MMIO_WRITE: memcpy(ghcb->shared_buffer, reg_data, bytes); --- linux-azure-6.5.0.orig/arch/x86/kernel/smp.c +++ linux-azure-6.5.0/arch/x86/kernel/smp.c @@ -131,7 +131,7 @@ } /* - * Disable virtualization, APIC etc. and park the CPU in a HLT loop + * this function calls the 'stop' function on all other CPUs in the system. */ DEFINE_IDTENTRY_SYSVEC(sysvec_reboot) { @@ -172,17 +172,13 @@ * 2) Wait for all other CPUs to report that they reached the * HLT loop in stop_this_cpu() * - * 3) If the system uses INIT/STARTUP for CPU bringup, then - * send all present CPUs an INIT vector, which brings them - * completely out of the way. + * 3) If #2 timed out send an NMI to the CPUs which did not + * yet report * - * 4) If #3 is not possible and #2 timed out send an NMI to the - * CPUs which did not yet report - * - * 5) Wait for all other CPUs to report that they reached the + * 4) Wait for all other CPUs to report that they reached the * HLT loop in stop_this_cpu() * - * #4 can obviously race against a CPU reaching the HLT loop late. + * #3 can obviously race against a CPU reaching the HLT loop late. * That CPU will have reported already and the "have all CPUs * reached HLT" condition will be true despite the fact that the * other CPU is still handling the NMI. Again, there is no @@ -198,7 +194,7 @@ /* * Don't wait longer than a second for IPI completion. The * wait request is not checked here because that would - * prevent an NMI/INIT shutdown in case that not all + * prevent an NMI shutdown attempt in case that not all * CPUs reach shutdown state. */ timeout = USEC_PER_SEC; @@ -206,27 +202,7 @@ udelay(1); } - /* - * Park all other CPUs in INIT including "offline" CPUs, if - * possible. That's a safe place where they can't resume execution - * of HLT and then execute the HLT loop from overwritten text or - * page tables. - * - * The only downside is a broadcast MCE, but up to the point where - * the kexec() kernel brought all APs online again an MCE will just - * make HLT resume and handle the MCE. The machine crashes and burns - * due to overwritten text, page tables and data. So there is a - * choice between fire and frying pan. The result is pretty much - * the same. Chose frying pan until x86 provides a sane mechanism - * to park a CPU. - */ - if (smp_park_other_cpus_in_init()) - goto done; - - /* - * If park with INIT was not possible and the REBOOT_VECTOR didn't - * take all secondary CPUs offline, try with the NMI. - */ + /* if the REBOOT_VECTOR didn't work, try with the NMI */ if (!cpumask_empty(&cpus_stop_mask)) { /* * If NMI IPI is enabled, try to register the stop handler @@ -249,7 +225,6 @@ udelay(1); } -done: local_irq_save(flags); disable_local_APIC(); mcheck_cpu_clear(this_cpu_ptr(&cpu_info)); --- linux-azure-6.5.0.orig/arch/x86/kernel/smpboot.c +++ linux-azure-6.5.0/arch/x86/kernel/smpboot.c @@ -587,7 +587,6 @@ } -#if defined(CONFIG_SCHED_SMT) || defined(CONFIG_SCHED_CLUSTER) || defined(CONFIG_SCHED_MC) static inline int x86_sched_itmt_flags(void) { return sysctl_sched_itmt_enabled ? SD_ASYM_PACKING : 0; @@ -611,7 +610,14 @@ return cpu_cluster_flags() | x86_sched_itmt_flags(); } #endif -#endif + +static int x86_die_flags(void) +{ + if (cpu_feature_enabled(X86_FEATURE_HYBRID_CPU)) + return x86_sched_itmt_flags(); + + return 0; +} /* * Set if a package/die has multiple NUMA nodes inside. @@ -653,7 +659,7 @@ */ if (!x86_has_numa_in_package) { x86_topology[i++] = (struct sched_domain_topology_level){ - cpu_cpu_mask, SD_INIT_NAME(DIE) + cpu_cpu_mask, x86_die_flags, SD_INIT_NAME(DIE) }; } @@ -1340,33 +1346,6 @@ cache_aps_init(); } -bool smp_park_other_cpus_in_init(void) -{ - unsigned int cpu, this_cpu = smp_processor_id(); - unsigned int apicid; - - if (apic->wakeup_secondary_cpu_64 || apic->wakeup_secondary_cpu) - return false; - - /* - * If this is a crash stop which does not execute on the boot CPU, - * then this cannot use the INIT mechanism because INIT to the boot - * CPU will reset the machine. - */ - if (this_cpu) - return false; - - for_each_present_cpu(cpu) { - if (cpu == this_cpu) - continue; - apicid = apic->cpu_present_to_apicid(cpu); - if (apicid == BAD_APICID) - continue; - send_init_sequence(apicid); - } - return true; -} - /* * Early setup to make printk work. */ --- linux-azure-6.5.0.orig/arch/x86/kernel/tsc.c +++ linux-azure-6.5.0/arch/x86/kernel/tsc.c @@ -1258,7 +1258,7 @@ if (boot_cpu_has(X86_FEATURE_CONSTANT_TSC) && boot_cpu_has(X86_FEATURE_NONSTOP_TSC) && boot_cpu_has(X86_FEATURE_TSC_ADJUST) && - nr_online_nodes <= 2) + nr_online_nodes <= 4) tsc_disable_clocksource_watchdog(); } --- linux-azure-6.5.0.orig/arch/x86/kernel/tsc_sync.c +++ linux-azure-6.5.0/arch/x86/kernel/tsc_sync.c @@ -15,6 +15,7 @@ * ( The serial nature of the boot logic and the CPU hotplug lock * protects against more than 2 CPUs entering this code. ) */ +#include #include #include #include @@ -342,6 +343,13 @@ return (cpumask_weight(topology_core_cpumask(cpu)) > 1) ? 2 : 20; } +static void tsc_sync_mark_tsc_unstable(struct work_struct *work) +{ + mark_tsc_unstable("check_tsc_sync_source failed"); +} + +static DECLARE_WORK(tsc_sync_work, tsc_sync_mark_tsc_unstable); + /* * The freshly booted CPU initiates this via an async SMP function call. */ @@ -395,7 +403,7 @@ "turning off TSC clock.\n", max_warp); if (random_warps) pr_warn("TSC warped randomly between CPUs\n"); - mark_tsc_unstable("check_tsc_sync_source failed"); + schedule_work(&tsc_sync_work); } /* --- linux-azure-6.5.0.orig/arch/x86/kernel/vmlinux.lds.S +++ linux-azure-6.5.0/arch/x86/kernel/vmlinux.lds.S @@ -156,7 +156,7 @@ ALIGN_ENTRY_TEXT_END *(.gnu.warning) - } :text =0xcccc + } :text = 0xcccccccc /* End of text section, which should occupy whole number of pages */ _etext = .; --- linux-azure-6.5.0.orig/arch/x86/kvm/cpuid.c +++ linux-azure-6.5.0/arch/x86/kvm/cpuid.c @@ -326,14 +326,6 @@ vcpu->arch.guest_supported_xcr0 = cpuid_get_supported_xcr0(vcpu->arch.cpuid_entries, vcpu->arch.cpuid_nent); - /* - * FP+SSE can always be saved/restored via KVM_{G,S}ET_XSAVE, even if - * XSAVE/XCRO are not exposed to the guest, and even if XSAVE isn't - * supported by the host. - */ - vcpu->arch.guest_fpu.fpstate->user_xfeatures = vcpu->arch.guest_supported_xcr0 | - XFEATURE_MASK_FPSSE; - kvm_update_pv_runtime(vcpu); vcpu->arch.maxphyaddr = cpuid_query_maxphyaddr(vcpu); --- linux-azure-6.5.0.orig/arch/x86/kvm/hyperv.c +++ linux-azure-6.5.0/arch/x86/kvm/hyperv.c @@ -727,10 +727,12 @@ stimer_cleanup(stimer); stimer->count = count; - if (stimer->count == 0) - stimer->config.enable = 0; - else if (stimer->config.auto_enable) - stimer->config.enable = 1; + if (!host) { + if (stimer->count == 0) + stimer->config.enable = 0; + else if (stimer->config.auto_enable) + stimer->config.enable = 1; + } if (stimer->config.enable) stimer_mark_pending(stimer, false); --- linux-azure-6.5.0.orig/arch/x86/kvm/lapic.c +++ linux-azure-6.5.0/arch/x86/kvm/lapic.c @@ -2423,22 +2423,22 @@ void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset) { struct kvm_lapic *apic = vcpu->arch.apic; - u64 val; /* - * ICR is a single 64-bit register when x2APIC is enabled. For legacy - * xAPIC, ICR writes need to go down the common (slightly slower) path - * to get the upper half from ICR2. + * ICR is a single 64-bit register when x2APIC is enabled, all others + * registers hold 32-bit values. For legacy xAPIC, ICR writes need to + * go down the common path to get the upper half from ICR2. + * + * Note, using the write helpers may incur an unnecessary write to the + * virtual APIC state, but KVM needs to conditionally modify the value + * in certain cases, e.g. to clear the ICR busy bit. The cost of extra + * conditional branches is likely a wash relative to the cost of the + * maybe-unecessary write, and both are in the noise anyways. */ - if (apic_x2apic_mode(apic) && offset == APIC_ICR) { - val = kvm_lapic_get_reg64(apic, APIC_ICR); - kvm_apic_send_ipi(apic, (u32)val, (u32)(val >> 32)); - trace_kvm_apic_write(APIC_ICR, val); - } else { - /* TODO: optimize to just emulate side effect w/o one more write */ - val = kvm_lapic_get_reg(apic, offset); - kvm_lapic_reg_write(apic, offset, (u32)val); - } + if (apic_x2apic_mode(apic) && offset == APIC_ICR) + kvm_x2apic_icr_write(apic, kvm_lapic_get_reg64(apic, APIC_ICR)); + else + kvm_lapic_reg_write(apic, offset, kvm_lapic_get_reg(apic, offset)); } EXPORT_SYMBOL_GPL(kvm_apic_write_nodecode); @@ -2649,6 +2649,8 @@ u64 msr_val; int i; + static_call_cond(kvm_x86_apicv_pre_state_restore)(vcpu); + if (!init_event) { msr_val = APIC_DEFAULT_PHYS_BASE | MSR_IA32_APICBASE_ENABLE; if (kvm_vcpu_is_reset_bsp(vcpu)) @@ -2738,13 +2740,17 @@ { u32 reg = kvm_lapic_get_reg(apic, lvt_type); int vector, mode, trig_mode; + int r; if (kvm_apic_hw_enabled(apic) && !(reg & APIC_LVT_MASKED)) { vector = reg & APIC_VECTOR_MASK; mode = reg & APIC_MODE_MASK; trig_mode = reg & APIC_LVT_LEVEL_TRIGGER; - return __apic_accept_irq(apic, mode, vector, 1, trig_mode, - NULL); + + r = __apic_accept_irq(apic, mode, vector, 1, trig_mode, NULL); + if (r && lvt_type == APIC_LVTPC) + kvm_lapic_set_reg(apic, APIC_LVTPC, reg | APIC_LVT_MASKED); + return r; } return 0; } @@ -2956,6 +2962,8 @@ struct kvm_lapic *apic = vcpu->arch.apic; int r; + static_call_cond(kvm_x86_apicv_pre_state_restore)(vcpu); + kvm_lapic_set_base(vcpu, vcpu->arch.apic_base); /* set SPIV separately to get count of SW disabled APICs right */ apic_set_spiv(apic, *((u32 *)(s->regs + APIC_SPIV))); --- linux-azure-6.5.0.orig/arch/x86/kvm/mmu/mmu.c +++ linux-azure-6.5.0/arch/x86/kvm/mmu/mmu.c @@ -6206,21 +6206,17 @@ kvm_mmu_zap_all_fast(kvm); } -int kvm_mmu_init_vm(struct kvm *kvm) +void kvm_mmu_init_vm(struct kvm *kvm) { struct kvm_page_track_notifier_node *node = &kvm->arch.mmu_sp_tracker; - int r; INIT_LIST_HEAD(&kvm->arch.active_mmu_pages); INIT_LIST_HEAD(&kvm->arch.zapped_obsolete_pages); INIT_LIST_HEAD(&kvm->arch.possible_nx_huge_pages); spin_lock_init(&kvm->arch.mmu_unsync_pages_lock); - if (tdp_mmu_enabled) { - r = kvm_mmu_init_tdp_mmu(kvm); - if (r < 0) - return r; - } + if (tdp_mmu_enabled) + kvm_mmu_init_tdp_mmu(kvm); node->track_write = kvm_mmu_pte_write; node->track_flush_slot = kvm_mmu_invalidate_zap_pages_in_memslot; @@ -6233,8 +6229,6 @@ kvm->arch.split_desc_cache.kmem_cache = pte_list_desc_cache; kvm->arch.split_desc_cache.gfp_zero = __GFP_ZERO; - - return 0; } static void mmu_free_vm_memory_caches(struct kvm *kvm) @@ -6294,7 +6288,6 @@ void kvm_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end) { bool flush; - int i; if (WARN_ON_ONCE(gfn_end <= gfn_start)) return; @@ -6305,11 +6298,8 @@ flush = kvm_rmap_zap_gfn_range(kvm, gfn_start, gfn_end); - if (tdp_mmu_enabled) { - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) - flush = kvm_tdp_mmu_zap_leafs(kvm, i, gfn_start, - gfn_end, true, flush); - } + if (tdp_mmu_enabled) + flush = kvm_tdp_mmu_zap_leafs(kvm, gfn_start, gfn_end, flush); if (flush) kvm_flush_remote_tlbs_range(kvm, gfn_start, gfn_end - gfn_start); --- linux-azure-6.5.0.orig/arch/x86/kvm/mmu/mmu_internal.h +++ linux-azure-6.5.0/arch/x86/kvm/mmu/mmu_internal.h @@ -56,7 +56,12 @@ bool tdp_mmu_page; bool unsync; - u8 mmu_valid_gen; + union { + u8 mmu_valid_gen; + + /* Only accessed under slots_lock. */ + bool tdp_mmu_scheduled_root_to_zap; + }; /* * The shadow page can't be replaced by an equivalent huge page @@ -98,13 +103,7 @@ struct kvm_rmap_head parent_ptes; /* rmap pointers to parent sptes */ tdp_ptep_t ptep; }; - union { - DECLARE_BITMAP(unsync_child_bitmap, 512); - struct { - struct work_struct tdp_mmu_async_work; - void *tdp_mmu_async_data; - }; - }; + DECLARE_BITMAP(unsync_child_bitmap, 512); /* * Tracks shadow pages that, if zapped, would allow KVM to create an NX --- linux-azure-6.5.0.orig/arch/x86/kvm/mmu/tdp_mmu.c +++ linux-azure-6.5.0/arch/x86/kvm/mmu/tdp_mmu.c @@ -12,18 +12,10 @@ #include /* Initializes the TDP MMU for the VM, if enabled. */ -int kvm_mmu_init_tdp_mmu(struct kvm *kvm) +void kvm_mmu_init_tdp_mmu(struct kvm *kvm) { - struct workqueue_struct *wq; - - wq = alloc_workqueue("kvm", WQ_UNBOUND|WQ_MEM_RECLAIM|WQ_CPU_INTENSIVE, 0); - if (!wq) - return -ENOMEM; - INIT_LIST_HEAD(&kvm->arch.tdp_mmu_roots); spin_lock_init(&kvm->arch.tdp_mmu_pages_lock); - kvm->arch.tdp_mmu_zap_wq = wq; - return 1; } /* Arbitrarily returns true so that this may be used in if statements. */ @@ -46,20 +38,15 @@ * ultimately frees all roots. */ kvm_tdp_mmu_invalidate_all_roots(kvm); - - /* - * Destroying a workqueue also first flushes the workqueue, i.e. no - * need to invoke kvm_tdp_mmu_zap_invalidated_roots(). - */ - destroy_workqueue(kvm->arch.tdp_mmu_zap_wq); + kvm_tdp_mmu_zap_invalidated_roots(kvm); WARN_ON(atomic64_read(&kvm->arch.tdp_mmu_pages)); WARN_ON(!list_empty(&kvm->arch.tdp_mmu_roots)); /* * Ensure that all the outstanding RCU callbacks to free shadow pages - * can run before the VM is torn down. Work items on tdp_mmu_zap_wq - * can call kvm_tdp_mmu_put_root and create new callbacks. + * can run before the VM is torn down. Putting the last reference to + * zapped roots will create new callbacks. */ rcu_barrier(); } @@ -86,46 +73,6 @@ tdp_mmu_free_sp(sp); } -static void tdp_mmu_zap_root(struct kvm *kvm, struct kvm_mmu_page *root, - bool shared); - -static void tdp_mmu_zap_root_work(struct work_struct *work) -{ - struct kvm_mmu_page *root = container_of(work, struct kvm_mmu_page, - tdp_mmu_async_work); - struct kvm *kvm = root->tdp_mmu_async_data; - - read_lock(&kvm->mmu_lock); - - /* - * A TLB flush is not necessary as KVM performs a local TLB flush when - * allocating a new root (see kvm_mmu_load()), and when migrating vCPU - * to a different pCPU. Note, the local TLB flush on reuse also - * invalidates any paging-structure-cache entries, i.e. TLB entries for - * intermediate paging structures, that may be zapped, as such entries - * are associated with the ASID on both VMX and SVM. - */ - tdp_mmu_zap_root(kvm, root, true); - - /* - * Drop the refcount using kvm_tdp_mmu_put_root() to test its logic for - * avoiding an infinite loop. By design, the root is reachable while - * it's being asynchronously zapped, thus a different task can put its - * last reference, i.e. flowing through kvm_tdp_mmu_put_root() for an - * asynchronously zapped root is unavoidable. - */ - kvm_tdp_mmu_put_root(kvm, root, true); - - read_unlock(&kvm->mmu_lock); -} - -static void tdp_mmu_schedule_zap_root(struct kvm *kvm, struct kvm_mmu_page *root) -{ - root->tdp_mmu_async_data = kvm; - INIT_WORK(&root->tdp_mmu_async_work, tdp_mmu_zap_root_work); - queue_work(kvm->arch.tdp_mmu_zap_wq, &root->tdp_mmu_async_work); -} - void kvm_tdp_mmu_put_root(struct kvm *kvm, struct kvm_mmu_page *root, bool shared) { @@ -211,8 +158,12 @@ #define for_each_valid_tdp_mmu_root_yield_safe(_kvm, _root, _as_id, _shared) \ __for_each_tdp_mmu_root_yield_safe(_kvm, _root, _as_id, _shared, true) -#define for_each_tdp_mmu_root_yield_safe(_kvm, _root, _as_id) \ - __for_each_tdp_mmu_root_yield_safe(_kvm, _root, _as_id, false, false) +#define for_each_tdp_mmu_root_yield_safe(_kvm, _root, _shared) \ + for (_root = tdp_mmu_next_root(_kvm, NULL, _shared, false); \ + _root; \ + _root = tdp_mmu_next_root(_kvm, _root, _shared, false)) \ + if (!kvm_lockdep_assert_mmu_lock_held(_kvm, _shared)) { \ + } else /* * Iterate over all TDP MMU roots. Requires that mmu_lock be held for write, @@ -292,7 +243,7 @@ * by a memslot update or by the destruction of the VM. Initialize the * refcount to two; one reference for the vCPU, and one reference for * the TDP MMU itself, which is held until the root is invalidated and - * is ultimately put by tdp_mmu_zap_root_work(). + * is ultimately put by kvm_tdp_mmu_zap_invalidated_roots(). */ refcount_set(&root->tdp_mmu_root_count, 2); @@ -877,13 +828,12 @@ * true if a TLB flush is needed before releasing the MMU lock, i.e. if one or * more SPTEs were zapped since the MMU lock was last acquired. */ -bool kvm_tdp_mmu_zap_leafs(struct kvm *kvm, int as_id, gfn_t start, gfn_t end, - bool can_yield, bool flush) +bool kvm_tdp_mmu_zap_leafs(struct kvm *kvm, gfn_t start, gfn_t end, bool flush) { struct kvm_mmu_page *root; - for_each_tdp_mmu_root_yield_safe(kvm, root, as_id) - flush = tdp_mmu_zap_leafs(kvm, root, start, end, can_yield, flush); + for_each_tdp_mmu_root_yield_safe(kvm, root, false) + flush = tdp_mmu_zap_leafs(kvm, root, start, end, true, flush); return flush; } @@ -891,7 +841,6 @@ void kvm_tdp_mmu_zap_all(struct kvm *kvm) { struct kvm_mmu_page *root; - int i; /* * Zap all roots, including invalid roots, as all SPTEs must be dropped @@ -905,10 +854,8 @@ * is being destroyed or the userspace VMM has exited. In both cases, * KVM_RUN is unreachable, i.e. no vCPUs will ever service the request. */ - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { - for_each_tdp_mmu_root_yield_safe(kvm, root, i) - tdp_mmu_zap_root(kvm, root, false); - } + for_each_tdp_mmu_root_yield_safe(kvm, root, false) + tdp_mmu_zap_root(kvm, root, false); } /* @@ -917,18 +864,47 @@ */ void kvm_tdp_mmu_zap_invalidated_roots(struct kvm *kvm) { - flush_workqueue(kvm->arch.tdp_mmu_zap_wq); + struct kvm_mmu_page *root; + + read_lock(&kvm->mmu_lock); + + for_each_tdp_mmu_root_yield_safe(kvm, root, true) { + if (!root->tdp_mmu_scheduled_root_to_zap) + continue; + + root->tdp_mmu_scheduled_root_to_zap = false; + KVM_BUG_ON(!root->role.invalid, kvm); + + /* + * A TLB flush is not necessary as KVM performs a local TLB + * flush when allocating a new root (see kvm_mmu_load()), and + * when migrating a vCPU to a different pCPU. Note, the local + * TLB flush on reuse also invalidates paging-structure-cache + * entries, i.e. TLB entries for intermediate paging structures, + * that may be zapped, as such entries are associated with the + * ASID on both VMX and SVM. + */ + tdp_mmu_zap_root(kvm, root, true); + + /* + * The referenced needs to be put *after* zapping the root, as + * the root must be reachable by mmu_notifiers while it's being + * zapped + */ + kvm_tdp_mmu_put_root(kvm, root, true); + } + + read_unlock(&kvm->mmu_lock); } /* * Mark each TDP MMU root as invalid to prevent vCPUs from reusing a root that * is about to be zapped, e.g. in response to a memslots update. The actual - * zapping is performed asynchronously. Using a separate workqueue makes it - * easy to ensure that the destruction is performed before the "fast zap" - * completes, without keeping a separate list of invalidated roots; the list is - * effectively the list of work items in the workqueue. + * zapping is done separately so that it happens with mmu_lock with read, + * whereas invalidating roots must be done with mmu_lock held for write (unless + * the VM is being destroyed). * - * Note, the asynchronous worker is gifted the TDP MMU's reference. + * Note, kvm_tdp_mmu_zap_invalidated_roots() is gifted the TDP MMU's reference. * See kvm_tdp_mmu_get_vcpu_root_hpa(). */ void kvm_tdp_mmu_invalidate_all_roots(struct kvm *kvm) @@ -953,19 +929,20 @@ /* * As above, mmu_lock isn't held when destroying the VM! There can't * be other references to @kvm, i.e. nothing else can invalidate roots - * or be consuming roots, but walking the list of roots does need to be - * guarded against roots being deleted by the asynchronous zap worker. + * or get/put references to roots. */ - rcu_read_lock(); - - list_for_each_entry_rcu(root, &kvm->arch.tdp_mmu_roots, link) { + list_for_each_entry(root, &kvm->arch.tdp_mmu_roots, link) { + /* + * Note, invalid roots can outlive a memslot update! Invalid + * roots must be *zapped* before the memslot update completes, + * but a different task can acquire a reference and keep the + * root alive after its been zapped. + */ if (!root->role.invalid) { + root->tdp_mmu_scheduled_root_to_zap = true; root->role.invalid = true; - tdp_mmu_schedule_zap_root(kvm, root); } } - - rcu_read_unlock(); } /* @@ -1146,8 +1123,13 @@ bool kvm_tdp_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range, bool flush) { - return kvm_tdp_mmu_zap_leafs(kvm, range->slot->as_id, range->start, - range->end, range->may_block, flush); + struct kvm_mmu_page *root; + + __for_each_tdp_mmu_root_yield_safe(kvm, root, range->slot->as_id, false, false) + flush = tdp_mmu_zap_leafs(kvm, root, range->start, range->end, + range->may_block, flush); + + return flush; } typedef bool (*tdp_handler_t)(struct kvm *kvm, struct tdp_iter *iter, --- linux-azure-6.5.0.orig/arch/x86/kvm/mmu/tdp_mmu.h +++ linux-azure-6.5.0/arch/x86/kvm/mmu/tdp_mmu.h @@ -7,7 +7,7 @@ #include "spte.h" -int kvm_mmu_init_tdp_mmu(struct kvm *kvm); +void kvm_mmu_init_tdp_mmu(struct kvm *kvm); void kvm_mmu_uninit_tdp_mmu(struct kvm *kvm); hpa_t kvm_tdp_mmu_get_vcpu_root_hpa(struct kvm_vcpu *vcpu); @@ -20,8 +20,7 @@ void kvm_tdp_mmu_put_root(struct kvm *kvm, struct kvm_mmu_page *root, bool shared); -bool kvm_tdp_mmu_zap_leafs(struct kvm *kvm, int as_id, gfn_t start, - gfn_t end, bool can_yield, bool flush); +bool kvm_tdp_mmu_zap_leafs(struct kvm *kvm, gfn_t start, gfn_t end, bool flush); bool kvm_tdp_mmu_zap_sp(struct kvm *kvm, struct kvm_mmu_page *sp); void kvm_tdp_mmu_zap_all(struct kvm *kvm); void kvm_tdp_mmu_invalidate_all_roots(struct kvm *kvm); --- linux-azure-6.5.0.orig/arch/x86/kvm/pmu.h +++ linux-azure-6.5.0/arch/x86/kvm/pmu.h @@ -74,6 +74,12 @@ return counter & pmc_bitmask(pmc); } +static inline void pmc_write_counter(struct kvm_pmc *pmc, u64 val) +{ + pmc->counter += val - pmc_read_counter(pmc); + pmc->counter &= pmc_bitmask(pmc); +} + static inline void pmc_release_perf_event(struct kvm_pmc *pmc) { if (pmc->perf_event) { --- linux-azure-6.5.0.orig/arch/x86/kvm/svm/avic.c +++ linux-azure-6.5.0/arch/x86/kvm/svm/avic.c @@ -529,8 +529,11 @@ case AVIC_IPI_FAILURE_INVALID_BACKING_PAGE: WARN_ONCE(1, "Invalid backing page\n"); break; + case AVIC_IPI_FAILURE_INVALID_IPI_VECTOR: + /* Invalid IPI with vector < 16 */ + break; default: - pr_err("Unknown IPI interception\n"); + vcpu_unimpl(vcpu, "Unknown avic incomplete IPI interception\n"); } return 1; @@ -791,6 +794,7 @@ int ret = 0; unsigned long flags; struct amd_svm_iommu_ir *ir; + u64 entry; /** * In some cases, the existing irte is updated and re-set, @@ -824,6 +828,18 @@ ir->data = pi->ir_data; spin_lock_irqsave(&svm->ir_list_lock, flags); + + /* + * Update the target pCPU for IOMMU doorbells if the vCPU is running. + * If the vCPU is NOT running, i.e. is blocking or scheduled out, KVM + * will update the pCPU info when the vCPU awkened and/or scheduled in. + * See also avic_vcpu_load(). + */ + entry = READ_ONCE(*(svm->avic_physical_id_cache)); + if (entry & AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK) + amd_iommu_update_ga(entry & AVIC_PHYSICAL_ID_ENTRY_HOST_PHYSICAL_ID_MASK, + true, pi->ir_data); + list_add(&ir->node, &svm->ir_list); spin_unlock_irqrestore(&svm->ir_list_lock, flags); out: @@ -986,10 +1002,11 @@ avic_update_iommu_vcpu_affinity(struct kvm_vcpu *vcpu, int cpu, bool r) { int ret = 0; - unsigned long flags; struct amd_svm_iommu_ir *ir; struct vcpu_svm *svm = to_svm(vcpu); + lockdep_assert_held(&svm->ir_list_lock); + if (!kvm_arch_has_assigned_device(vcpu->kvm)) return 0; @@ -997,19 +1014,15 @@ * Here, we go through the per-vcpu ir_list to update all existing * interrupt remapping table entry targeting this vcpu. */ - spin_lock_irqsave(&svm->ir_list_lock, flags); - if (list_empty(&svm->ir_list)) - goto out; + return 0; list_for_each_entry(ir, &svm->ir_list, node) { ret = amd_iommu_update_ga(cpu, r, ir->data); if (ret) - break; + return ret; } -out: - spin_unlock_irqrestore(&svm->ir_list_lock, flags); - return ret; + return 0; } void avic_vcpu_load(struct kvm_vcpu *vcpu, int cpu) @@ -1017,6 +1030,7 @@ u64 entry; int h_physical_id = kvm_cpu_get_apicid(cpu); struct vcpu_svm *svm = to_svm(vcpu); + unsigned long flags; lockdep_assert_preemption_disabled(); @@ -1033,6 +1047,15 @@ if (kvm_vcpu_is_blocking(vcpu)) return; + /* + * Grab the per-vCPU interrupt remapping lock even if the VM doesn't + * _currently_ have assigned devices, as that can change. Holding + * ir_list_lock ensures that either svm_ir_list_add() will consume + * up-to-date entry information, or that this task will wait until + * svm_ir_list_add() completes to set the new target pCPU. + */ + spin_lock_irqsave(&svm->ir_list_lock, flags); + entry = READ_ONCE(*(svm->avic_physical_id_cache)); WARN_ON_ONCE(entry & AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK); @@ -1042,25 +1065,48 @@ WRITE_ONCE(*(svm->avic_physical_id_cache), entry); avic_update_iommu_vcpu_affinity(vcpu, h_physical_id, true); + + spin_unlock_irqrestore(&svm->ir_list_lock, flags); } void avic_vcpu_put(struct kvm_vcpu *vcpu) { u64 entry; struct vcpu_svm *svm = to_svm(vcpu); + unsigned long flags; lockdep_assert_preemption_disabled(); + /* + * Note, reading the Physical ID entry outside of ir_list_lock is safe + * as only the pCPU that has loaded (or is loading) the vCPU is allowed + * to modify the entry, and preemption is disabled. I.e. the vCPU + * can't be scheduled out and thus avic_vcpu_{put,load}() can't run + * recursively. + */ entry = READ_ONCE(*(svm->avic_physical_id_cache)); /* Nothing to do if IsRunning == '0' due to vCPU blocking. */ if (!(entry & AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK)) return; + /* + * Take and hold the per-vCPU interrupt remapping lock while updating + * the Physical ID entry even though the lock doesn't protect against + * multiple writers (see above). Holding ir_list_lock ensures that + * either svm_ir_list_add() will consume up-to-date entry information, + * or that this task will wait until svm_ir_list_add() completes to + * mark the vCPU as not running. + */ + spin_lock_irqsave(&svm->ir_list_lock, flags); + avic_update_iommu_vcpu_affinity(vcpu, -1, 0); entry &= ~AVIC_PHYSICAL_ID_ENTRY_IS_RUNNING_MASK; WRITE_ONCE(*(svm->avic_physical_id_cache), entry); + + spin_unlock_irqrestore(&svm->ir_list_lock, flags); + } void avic_refresh_virtual_apic_mode(struct kvm_vcpu *vcpu) --- linux-azure-6.5.0.orig/arch/x86/kvm/svm/nested.c +++ linux-azure-6.5.0/arch/x86/kvm/svm/nested.c @@ -695,10 +695,9 @@ vmcb02->control.tsc_offset = vcpu->arch.tsc_offset; - if (svm->tsc_ratio_msr != kvm_caps.default_tsc_scaling_ratio) { - WARN_ON(!svm->tsc_scaling_enabled); + if (svm->tsc_scaling_enabled && + svm->tsc_ratio_msr != kvm_caps.default_tsc_scaling_ratio) nested_svm_update_tsc_ratio_msr(vcpu); - } vmcb02->control.int_ctl = (svm->nested.ctl.int_ctl & int_ctl_vmcb12_bits) | @@ -1101,8 +1100,8 @@ vmcb_mark_dirty(vmcb01, VMCB_INTERCEPTS); } - if (svm->tsc_ratio_msr != kvm_caps.default_tsc_scaling_ratio) { - WARN_ON(!svm->tsc_scaling_enabled); + if (kvm_caps.has_tsc_control && + vcpu->arch.tsc_scaling_ratio != vcpu->arch.l1_tsc_scaling_ratio) { vcpu->arch.tsc_scaling_ratio = vcpu->arch.l1_tsc_scaling_ratio; __svm_write_tsc_multiplier(vcpu->arch.tsc_scaling_ratio); } @@ -1244,6 +1243,9 @@ nested_svm_uninit_mmu_context(vcpu); vmcb_mark_all_dirty(svm->vmcb); + + if (kvm_apicv_activated(vcpu->kvm)) + kvm_make_request(KVM_REQ_APICV_UPDATE, vcpu); } kvm_clear_request(KVM_REQ_GET_NESTED_STATE_PAGES, vcpu); --- linux-azure-6.5.0.orig/arch/x86/kvm/svm/pmu.c +++ linux-azure-6.5.0/arch/x86/kvm/svm/pmu.c @@ -160,7 +160,7 @@ /* MSR_PERFCTRn */ pmc = get_gp_pmc_amd(pmu, msr, PMU_TYPE_COUNTER); if (pmc) { - pmc->counter += data - pmc_read_counter(pmc); + pmc_write_counter(pmc, data); pmc_update_sample_period(pmc); return 0; } --- linux-azure-6.5.0.orig/arch/x86/kvm/svm/sev.c +++ linux-azure-6.5.0/arch/x86/kvm/svm/sev.c @@ -1725,7 +1725,7 @@ * Note, the source is not required to have the same number of * vCPUs as the destination when migrating a vanilla SEV VM. */ - src_vcpu = kvm_get_vcpu(dst_kvm, i); + src_vcpu = kvm_get_vcpu(src_kvm, i); src_svm = to_svm(src_vcpu); /* @@ -2881,7 +2881,10 @@ svm->sev_es.ghcb_sa); break; case SVM_VMGEXIT_NMI_COMPLETE: - ret = svm_invoke_exit_handler(vcpu, SVM_EXIT_IRET); + ++vcpu->stat.nmi_window_exits; + svm->nmi_masked = false; + kvm_make_request(KVM_REQ_EVENT, vcpu); + ret = 1; break; case SVM_VMGEXIT_AP_HLT_LOOP: ret = kvm_emulate_ap_reset_hold(vcpu); @@ -2942,6 +2945,32 @@ count, in); } +static void sev_es_vcpu_after_set_cpuid(struct vcpu_svm *svm) +{ + struct kvm_vcpu *vcpu = &svm->vcpu; + + if (boot_cpu_has(X86_FEATURE_V_TSC_AUX)) { + bool v_tsc_aux = guest_cpuid_has(vcpu, X86_FEATURE_RDTSCP) || + guest_cpuid_has(vcpu, X86_FEATURE_RDPID); + + set_msr_interception(vcpu, svm->msrpm, MSR_TSC_AUX, v_tsc_aux, v_tsc_aux); + } +} + +void sev_vcpu_after_set_cpuid(struct vcpu_svm *svm) +{ + struct kvm_vcpu *vcpu = &svm->vcpu; + struct kvm_cpuid_entry2 *best; + + /* For sev guests, the memory encryption bit is not reserved in CR3. */ + best = kvm_find_cpuid_entry(vcpu, 0x8000001F); + if (best) + vcpu->arch.reserved_gpa_bits &= ~(1UL << (best->ebx & 0x3f)); + + if (sev_es_guest(svm->vcpu.kvm)) + sev_es_vcpu_after_set_cpuid(svm); +} + static void sev_es_init_vmcb(struct vcpu_svm *svm) { struct kvm_vcpu *vcpu = &svm->vcpu; @@ -2952,9 +2981,12 @@ /* * An SEV-ES guest requires a VMSA area that is a separate from the * VMCB page. Do not include the encryption mask on the VMSA physical - * address since hardware will access it using the guest key. + * address since hardware will access it using the guest key. Note, + * the VMSA will be NULL if this vCPU is the destination for intrahost + * migration, and will be copied later. */ - svm->vmcb->control.vmsa_pa = __pa(svm->sev_es.vmsa); + if (svm->sev_es.vmsa) + svm->vmcb->control.vmsa_pa = __pa(svm->sev_es.vmsa); /* Can't intercept CR register access, HV can't modify CR registers */ svm_clr_intercept(svm, INTERCEPT_CR0_READ); @@ -2985,14 +3017,6 @@ set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTBRANCHTOIP, 1, 1); set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTFROMIP, 1, 1); set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP, 1, 1); - - if (boot_cpu_has(X86_FEATURE_V_TSC_AUX) && - (guest_cpuid_has(&svm->vcpu, X86_FEATURE_RDTSCP) || - guest_cpuid_has(&svm->vcpu, X86_FEATURE_RDPID))) { - set_msr_interception(vcpu, svm->msrpm, MSR_TSC_AUX, 1, 1); - if (guest_cpuid_has(&svm->vcpu, X86_FEATURE_RDTSCP)) - svm_clr_intercept(svm, INTERCEPT_RDTSCP); - } } void sev_init_vmcb(struct vcpu_svm *svm) --- linux-azure-6.5.0.orig/arch/x86/kvm/svm/svm.c +++ linux-azure-6.5.0/arch/x86/kvm/svm/svm.c @@ -365,6 +365,8 @@ svm->vmcb->control.int_state |= SVM_INTERRUPT_SHADOW_MASK; } +static bool svm_can_emulate_instruction(struct kvm_vcpu *vcpu, int emul_type, + void *insn, int insn_len); static int __svm_skip_emulated_instruction(struct kvm_vcpu *vcpu, bool commit_side_effects) @@ -385,6 +387,14 @@ } if (!svm->next_rip) { + /* + * FIXME: Drop this when kvm_emulate_instruction() does the + * right thing and treats "can't emulate" as outright failure + * for EMULTYPE_SKIP. + */ + if (!svm_can_emulate_instruction(vcpu, EMULTYPE_SKIP, NULL, 0)) + return 0; + if (unlikely(!commit_side_effects)) old_rflags = svm->vmcb->save.rflags; @@ -819,8 +829,7 @@ if (intercept == svm->x2avic_msrs_intercepted) return; - if (!x2avic_enabled || - !apic_x2apic_mode(svm->vcpu.arch.apic)) + if (!x2avic_enabled) return; for (i = 0; i < MAX_DIRECT_ACCESS_MSRS; i++) { @@ -1800,15 +1809,17 @@ bool old_paging = is_paging(vcpu); #ifdef CONFIG_X86_64 - if (vcpu->arch.efer & EFER_LME && !vcpu->arch.guest_state_protected) { + if (vcpu->arch.efer & EFER_LME) { if (!is_paging(vcpu) && (cr0 & X86_CR0_PG)) { vcpu->arch.efer |= EFER_LMA; - svm->vmcb->save.efer |= EFER_LMA | EFER_LME; + if (!vcpu->arch.guest_state_protected) + svm->vmcb->save.efer |= EFER_LMA | EFER_LME; } if (is_paging(vcpu) && !(cr0 & X86_CR0_PG)) { vcpu->arch.efer &= ~EFER_LMA; - svm->vmcb->save.efer &= ~(EFER_LMA | EFER_LME); + if (!vcpu->arch.guest_state_protected) + svm->vmcb->save.efer &= ~(EFER_LMA | EFER_LME); } } #endif @@ -2510,12 +2521,13 @@ { struct vcpu_svm *svm = to_svm(vcpu); + WARN_ON_ONCE(sev_es_guest(vcpu->kvm)); + ++vcpu->stat.nmi_window_exits; svm->awaiting_iret_completion = true; svm_clr_iret_intercept(svm); - if (!sev_es_guest(vcpu->kvm)) - svm->nmi_iret_rip = kvm_rip_read(vcpu); + svm->nmi_iret_rip = kvm_rip_read(vcpu); kvm_make_request(KVM_REQ_EVENT, vcpu); return 1; @@ -3918,12 +3930,11 @@ svm->soft_int_injected = false; /* - * If we've made progress since setting HF_IRET_MASK, we've + * If we've made progress since setting awaiting_iret_completion, we've * executed an IRET and can allow NMI injection. */ if (svm->awaiting_iret_completion && - (sev_es_guest(vcpu->kvm) || - kvm_rip_read(vcpu) != svm->nmi_iret_rip)) { + kvm_rip_read(vcpu) != svm->nmi_iret_rip) { svm->awaiting_iret_completion = false; svm->nmi_masked = false; kvm_make_request(KVM_REQ_EVENT, vcpu); @@ -4207,7 +4218,6 @@ static void svm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu) { struct vcpu_svm *svm = to_svm(vcpu); - struct kvm_cpuid_entry2 *best; vcpu->arch.xsaves_enabled = guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && boot_cpu_has(X86_FEATURE_XSAVE) && @@ -4242,12 +4252,8 @@ set_msr_interception(vcpu, svm->msrpm, MSR_IA32_FLUSH_CMD, 0, !!guest_cpuid_has(vcpu, X86_FEATURE_FLUSH_L1D)); - /* For sev guests, the memory encryption bit is not reserved in CR3. */ - if (sev_guest(vcpu->kvm)) { - best = kvm_find_cpuid_entry(vcpu, 0x8000001F); - if (best) - vcpu->arch.reserved_gpa_bits &= ~(1UL << (best->ebx & 0x3f)); - } + if (sev_guest(vcpu->kvm)) + sev_vcpu_after_set_cpuid(svm); init_vmcb_after_set_cpuid(vcpu); } @@ -4651,16 +4657,25 @@ * and cannot be decrypted by KVM, i.e. KVM would read cyphertext and * decode garbage. * - * Inject #UD if KVM reached this point without an instruction buffer. - * In practice, this path should never be hit by a well-behaved guest, - * e.g. KVM doesn't intercept #UD or #GP for SEV guests, but this path - * is still theoretically reachable, e.g. via unaccelerated fault-like - * AVIC access, and needs to be handled by KVM to avoid putting the - * guest into an infinite loop. Injecting #UD is somewhat arbitrary, - * but its the least awful option given lack of insight into the guest. + * If KVM is NOT trying to simply skip an instruction, inject #UD if + * KVM reached this point without an instruction buffer. In practice, + * this path should never be hit by a well-behaved guest, e.g. KVM + * doesn't intercept #UD or #GP for SEV guests, but this path is still + * theoretically reachable, e.g. via unaccelerated fault-like AVIC + * access, and needs to be handled by KVM to avoid putting the guest + * into an infinite loop. Injecting #UD is somewhat arbitrary, but + * its the least awful option given lack of insight into the guest. + * + * If KVM is trying to skip an instruction, simply resume the guest. + * If a #NPF occurs while the guest is vectoring an INT3/INTO, then KVM + * will attempt to re-inject the INT3/INTO and skip the instruction. + * In that scenario, retrying the INT3/INTO and hoping the guest will + * make forward progress is the only option that has a chance of + * success (and in practice it will work the vast majority of the time). */ if (unlikely(!insn)) { - kvm_queue_exception(vcpu, UD_VECTOR); + if (!(emul_type & EMULTYPE_SKIP)) + kvm_queue_exception(vcpu, UD_VECTOR); return false; } --- linux-azure-6.5.0.orig/arch/x86/kvm/svm/svm.h +++ linux-azure-6.5.0/arch/x86/kvm/svm/svm.h @@ -733,6 +733,7 @@ void sev_hardware_unsetup(void); int sev_cpu_init(struct svm_cpu_data *sd); void sev_init_vmcb(struct vcpu_svm *svm); +void sev_vcpu_after_set_cpuid(struct vcpu_svm *svm); void sev_free_vcpu(struct kvm_vcpu *vcpu); int sev_handle_vmgexit(struct kvm_vcpu *vcpu); int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in); --- linux-azure-6.5.0.orig/arch/x86/kvm/vmx/pmu_intel.c +++ linux-azure-6.5.0/arch/x86/kvm/vmx/pmu_intel.c @@ -406,11 +406,11 @@ if (!msr_info->host_initiated && !(msr & MSR_PMC_FULL_WIDTH_BIT)) data = (s64)(s32)data; - pmc->counter += data - pmc_read_counter(pmc); + pmc_write_counter(pmc, data); pmc_update_sample_period(pmc); break; } else if ((pmc = get_fixed_pmc(pmu, msr))) { - pmc->counter += data - pmc_read_counter(pmc); + pmc_write_counter(pmc, data); pmc_update_sample_period(pmc); break; } else if ((pmc = get_gp_pmc(pmu, msr, MSR_P6_EVNTSEL0))) { --- linux-azure-6.5.0.orig/arch/x86/kvm/vmx/vmx.c +++ linux-azure-6.5.0/arch/x86/kvm/vmx/vmx.c @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include #include #include @@ -754,7 +754,6 @@ return ret; } -#ifdef CONFIG_KEXEC_CORE static void crash_vmclear_local_loaded_vmcss(void) { int cpu = raw_smp_processor_id(); @@ -764,7 +763,6 @@ loaded_vmcss_on_cpu_link) vmcs_clear(v->vmcs); } -#endif /* CONFIG_KEXEC_CORE */ static void __loaded_vmcs_clear(void *arg) { @@ -6911,7 +6909,7 @@ vmcs_write64(EOI_EXIT_BITMAP3, eoi_exit_bitmap[3]); } -static void vmx_apicv_post_state_restore(struct kvm_vcpu *vcpu) +static void vmx_apicv_pre_state_restore(struct kvm_vcpu *vcpu) { struct vcpu_vmx *vmx = to_vmx(vcpu); @@ -7243,13 +7241,20 @@ flags); vcpu->arch.cr2 = native_read_cr2(); + vcpu->arch.regs_avail &= ~VMX_REGS_LAZY_LOAD_SET; + + vmx->idt_vectoring_info = 0; vmx_enable_fb_clear(vmx); - if (unlikely(vmx->fail)) + if (unlikely(vmx->fail)) { vmx->exit_reason.full = 0xdead; - else - vmx->exit_reason.full = vmcs_read32(VM_EXIT_REASON); + goto out; + } + + vmx->exit_reason.full = vmcs_read32(VM_EXIT_REASON); + if (likely(!vmx->exit_reason.failed_vmentry)) + vmx->idt_vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD); if ((u16)vmx->exit_reason.basic == EXIT_REASON_EXCEPTION_NMI && is_nmi(vmx_get_intr_info(vcpu))) { @@ -7258,6 +7263,7 @@ kvm_after_interrupt(vcpu); } +out: guest_state_exit_irqoff(); } @@ -7379,8 +7385,6 @@ loadsegment(es, __USER_DS); #endif - vcpu->arch.regs_avail &= ~VMX_REGS_LAZY_LOAD_SET; - pt_guest_exit(vmx); kvm_load_host_xsave_state(vcpu); @@ -7397,17 +7401,12 @@ vmx->nested.nested_run_pending = 0; } - vmx->idt_vectoring_info = 0; - if (unlikely(vmx->fail)) return EXIT_FASTPATH_NONE; if (unlikely((u16)vmx->exit_reason.basic == EXIT_REASON_MCE_DURING_VMENTRY)) kvm_machine_check(); - if (likely(!vmx->exit_reason.failed_vmentry)) - vmx->idt_vectoring_info = vmcs_read32(IDT_VECTORING_INFO_FIELD); - trace_kvm_exit(vcpu, KVM_ISA_VMX); if (unlikely(vmx->exit_reason.failed_vmentry)) @@ -8276,7 +8275,7 @@ .set_apic_access_page_addr = vmx_set_apic_access_page_addr, .refresh_apicv_exec_ctrl = vmx_refresh_apicv_exec_ctrl, .load_eoi_exitmap = vmx_load_eoi_exitmap, - .apicv_post_state_restore = vmx_apicv_post_state_restore, + .apicv_pre_state_restore = vmx_apicv_pre_state_restore, .required_apicv_inhibits = VMX_REQUIRED_APICV_INHIBITS, .hwapic_irr_update = vmx_hwapic_irr_update, .hwapic_isr_update = vmx_hwapic_isr_update, @@ -8622,10 +8621,9 @@ { allow_smaller_maxphyaddr = false; -#ifdef CONFIG_KEXEC_CORE RCU_INIT_POINTER(crash_vmclear_loaded_vmcss, NULL); synchronize_rcu(); -#endif + vmx_cleanup_l1d_flush(); } @@ -8674,10 +8672,9 @@ pi_init_cpu(cpu); } -#ifdef CONFIG_KEXEC_CORE rcu_assign_pointer(crash_vmclear_loaded_vmcss, crash_vmclear_local_loaded_vmcss); -#endif + vmx_check_vmcs12_offsets(); /* --- linux-azure-6.5.0.orig/arch/x86/kvm/x86.c +++ linux-azure-6.5.0/arch/x86/kvm/x86.c @@ -3643,6 +3643,7 @@ case MSR_AMD64_PATCH_LOADER: case MSR_AMD64_BU_CFG2: case MSR_AMD64_DC_CFG: + case MSR_AMD64_TW_CFG: case MSR_F15H_EX_CFG: break; @@ -4067,6 +4068,7 @@ case MSR_AMD64_BU_CFG2: case MSR_IA32_PERF_CTL: case MSR_AMD64_DC_CFG: + case MSR_AMD64_TW_CFG: case MSR_F15H_EX_CFG: /* * Intel Sandy Bridge CPUs must support the RAPL (running average power @@ -5385,26 +5387,37 @@ return 0; } -static void kvm_vcpu_ioctl_x86_get_xsave(struct kvm_vcpu *vcpu, - struct kvm_xsave *guest_xsave) -{ - if (fpstate_is_confidential(&vcpu->arch.guest_fpu)) - return; - - fpu_copy_guest_fpstate_to_uabi(&vcpu->arch.guest_fpu, - guest_xsave->region, - sizeof(guest_xsave->region), - vcpu->arch.pkru); -} static void kvm_vcpu_ioctl_x86_get_xsave2(struct kvm_vcpu *vcpu, u8 *state, unsigned int size) { + /* + * Only copy state for features that are enabled for the guest. The + * state itself isn't problematic, but setting bits in the header for + * features that are supported in *this* host but not exposed to the + * guest can result in KVM_SET_XSAVE failing when live migrating to a + * compatible host without the features that are NOT exposed to the + * guest. + * + * FP+SSE can always be saved/restored via KVM_{G,S}ET_XSAVE, even if + * XSAVE/XCRO are not exposed to the guest, and even if XSAVE isn't + * supported by the host. + */ + u64 supported_xcr0 = vcpu->arch.guest_supported_xcr0 | + XFEATURE_MASK_FPSSE; + if (fpstate_is_confidential(&vcpu->arch.guest_fpu)) return; - fpu_copy_guest_fpstate_to_uabi(&vcpu->arch.guest_fpu, - state, size, vcpu->arch.pkru); + fpu_copy_guest_fpstate_to_uabi(&vcpu->arch.guest_fpu, state, size, + supported_xcr0, vcpu->arch.pkru); +} + +static void kvm_vcpu_ioctl_x86_get_xsave(struct kvm_vcpu *vcpu, + struct kvm_xsave *guest_xsave) +{ + return kvm_vcpu_ioctl_x86_get_xsave2(vcpu, (void *)guest_xsave->region, + sizeof(guest_xsave->region)); } static int kvm_vcpu_ioctl_x86_set_xsave(struct kvm_vcpu *vcpu, @@ -12302,9 +12315,7 @@ if (ret) goto out; - ret = kvm_mmu_init_vm(kvm); - if (ret) - goto out_page_track; + kvm_mmu_init_vm(kvm); ret = static_call(kvm_x86_vm_init)(kvm); if (ret) @@ -12349,7 +12360,6 @@ out_uninit_mmu: kvm_mmu_uninit_vm(kvm); -out_page_track: kvm_page_track_cleanup(kvm); out: return ret; --- linux-azure-6.5.0.orig/arch/x86/lib/copy_mc.c +++ linux-azure-6.5.0/arch/x86/lib/copy_mc.c @@ -70,23 +70,23 @@ } EXPORT_SYMBOL_GPL(copy_mc_to_kernel); -unsigned long __must_check copy_mc_to_user(void *dst, const void *src, unsigned len) +unsigned long __must_check copy_mc_to_user(void __user *dst, const void *src, unsigned len) { unsigned long ret; if (copy_mc_fragile_enabled) { __uaccess_begin(); - ret = copy_mc_fragile(dst, src, len); + ret = copy_mc_fragile((__force void *)dst, src, len); __uaccess_end(); return ret; } if (static_cpu_has(X86_FEATURE_ERMS)) { __uaccess_begin(); - ret = copy_mc_enhanced_fast_string(dst, src, len); + ret = copy_mc_enhanced_fast_string((__force void *)dst, src, len); __uaccess_end(); return ret; } - return copy_user_generic(dst, src, len); + return copy_user_generic((__force void *)dst, src, len); } --- linux-azure-6.5.0.orig/arch/x86/lib/copy_user_64.S +++ linux-azure-6.5.0/arch/x86/lib/copy_user_64.S @@ -27,7 +27,7 @@ * NOTE! The calling convention is very intentionally the same as * for 'rep movs', so that we can rewrite the function call with * just a plain 'rep movs' on machines that have FSRM. But to make - * it simpler for us, we can clobber rsi/rdi and rax/r8-r11 freely. + * it simpler for us, we can clobber rsi/rdi and rax freely. */ SYM_FUNC_START(rep_movs_alternative) cmpq $64,%rcx @@ -68,55 +68,24 @@ _ASM_EXTABLE_UA( 3b, .Lcopy_user_tail) .Llarge: -0: ALTERNATIVE "jmp .Lunrolled", "rep movsb", X86_FEATURE_ERMS +0: ALTERNATIVE "jmp .Llarge_movsq", "rep movsb", X86_FEATURE_ERMS 1: RET - _ASM_EXTABLE_UA( 0b, 1b) + _ASM_EXTABLE_UA( 0b, 1b) - .p2align 4 -.Lunrolled: -10: movq (%rsi),%r8 -11: movq 8(%rsi),%r9 -12: movq 16(%rsi),%r10 -13: movq 24(%rsi),%r11 -14: movq %r8,(%rdi) -15: movq %r9,8(%rdi) -16: movq %r10,16(%rdi) -17: movq %r11,24(%rdi) -20: movq 32(%rsi),%r8 -21: movq 40(%rsi),%r9 -22: movq 48(%rsi),%r10 -23: movq 56(%rsi),%r11 -24: movq %r8,32(%rdi) -25: movq %r9,40(%rdi) -26: movq %r10,48(%rdi) -27: movq %r11,56(%rdi) - addq $64,%rsi - addq $64,%rdi - subq $64,%rcx - cmpq $64,%rcx - jae .Lunrolled - cmpl $8,%ecx - jae .Lword +.Llarge_movsq: + movq %rcx,%rax + shrq $3,%rcx + andl $7,%eax +0: rep movsq + movl %eax,%ecx testl %ecx,%ecx jne .Lcopy_user_tail RET - _ASM_EXTABLE_UA(10b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(11b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(12b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(13b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(14b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(15b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(16b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(17b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(20b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(21b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(22b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(23b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(24b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(25b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(26b, .Lcopy_user_tail) - _ASM_EXTABLE_UA(27b, .Lcopy_user_tail) +1: leaq (%rax,%rcx,8),%rcx + jmp .Lcopy_user_tail + + _ASM_EXTABLE_UA( 0b, 1b) SYM_FUNC_END(rep_movs_alternative) EXPORT_SYMBOL(rep_movs_alternative) --- linux-azure-6.5.0.orig/arch/x86/lib/csum-partial_64.c +++ linux-azure-6.5.0/arch/x86/lib/csum-partial_64.c @@ -11,26 +11,23 @@ #include #include -static inline unsigned short from32to16(unsigned a) +static inline __wsum csum_finalize_sum(u64 temp64) { - unsigned short b = a >> 16; - asm("addw %w2,%w0\n\t" - "adcw $0,%w0\n" - : "=r" (b) - : "0" (b), "r" (a)); - return b; + return (__force __wsum)((temp64 + ror64(temp64, 32)) >> 32); } -static inline __wsum csum_tail(u64 temp64, int odd) +static inline unsigned long update_csum_40b(unsigned long sum, const unsigned long m[5]) { - unsigned int result; - - result = add32_with_carry(temp64 >> 32, temp64 & 0xffffffff); - if (unlikely(odd)) { - result = from32to16(result); - result = ((result >> 8) & 0xff) | ((result & 0xff) << 8); - } - return (__force __wsum)result; + asm("addq %1,%0\n\t" + "adcq %2,%0\n\t" + "adcq %3,%0\n\t" + "adcq %4,%0\n\t" + "adcq %5,%0\n\t" + "adcq $0,%0" + :"+r" (sum) + :"m" (m[0]), "m" (m[1]), "m" (m[2]), + "m" (m[3]), "m" (m[4])); + return sum; } /* @@ -47,64 +44,32 @@ __wsum csum_partial(const void *buff, int len, __wsum sum) { u64 temp64 = (__force u64)sum; - unsigned odd; - odd = 1 & (unsigned long) buff; - if (unlikely(odd)) { - if (unlikely(len == 0)) - return sum; - temp64 = ror32((__force u32)sum, 8); - temp64 += (*(unsigned char *)buff << 8); - len--; - buff++; + /* Do two 40-byte chunks in parallel to get better ILP */ + if (likely(len >= 80)) { + u64 temp64_2 = 0; + do { + temp64 = update_csum_40b(temp64, buff); + temp64_2 = update_csum_40b(temp64_2, buff + 40); + buff += 80; + len -= 80; + } while (len >= 80); + + asm("addq %1,%0\n\t" + "adcq $0,%0" + :"+r" (temp64): "r" (temp64_2)); } /* - * len == 40 is the hot case due to IPv6 headers, but annotating it likely() - * has noticeable negative affect on codegen for all other cases with - * minimal performance benefit here. + * len == 40 is the hot case due to IPv6 headers, so return + * early for that exact case without checking the tail bytes. */ - if (len == 40) { - asm("addq 0*8(%[src]),%[res]\n\t" - "adcq 1*8(%[src]),%[res]\n\t" - "adcq 2*8(%[src]),%[res]\n\t" - "adcq 3*8(%[src]),%[res]\n\t" - "adcq 4*8(%[src]),%[res]\n\t" - "adcq $0,%[res]" - : [res] "+r"(temp64) - : [src] "r"(buff), "m"(*(const char(*)[40])buff)); - return csum_tail(temp64, odd); - } - if (unlikely(len >= 64)) { - /* - * Extra accumulators for better ILP in the loop. - */ - u64 tmp_accum, tmp_carries; - - asm("xorl %k[tmp_accum],%k[tmp_accum]\n\t" - "xorl %k[tmp_carries],%k[tmp_carries]\n\t" - "subl $64, %[len]\n\t" - "1:\n\t" - "addq 0*8(%[src]),%[res]\n\t" - "adcq 1*8(%[src]),%[res]\n\t" - "adcq 2*8(%[src]),%[res]\n\t" - "adcq 3*8(%[src]),%[res]\n\t" - "adcl $0,%k[tmp_carries]\n\t" - "addq 4*8(%[src]),%[tmp_accum]\n\t" - "adcq 5*8(%[src]),%[tmp_accum]\n\t" - "adcq 6*8(%[src]),%[tmp_accum]\n\t" - "adcq 7*8(%[src]),%[tmp_accum]\n\t" - "adcl $0,%k[tmp_carries]\n\t" - "addq $64, %[src]\n\t" - "subl $64, %[len]\n\t" - "jge 1b\n\t" - "addq %[tmp_accum],%[res]\n\t" - "adcq %[tmp_carries],%[res]\n\t" - "adcq $0,%[res]" - : [tmp_accum] "=&r"(tmp_accum), - [tmp_carries] "=&r"(tmp_carries), [res] "+r"(temp64), - [len] "+r"(len), [src] "+r"(buff) - : "m"(*(const char *)buff)); + if (len >= 40) { + temp64 = update_csum_40b(temp64, buff); + len -= 40; + if (!len) + return csum_finalize_sum(temp64); + buff += 40; } if (len & 32) { @@ -143,7 +108,7 @@ : [res] "+r"(temp64) : [trail] "r"(trail)); } - return csum_tail(temp64, odd); + return csum_finalize_sum(temp64); } EXPORT_SYMBOL(csum_partial); --- linux-azure-6.5.0.orig/arch/x86/lib/memcpy_64.S +++ linux-azure-6.5.0/arch/x86/lib/memcpy_64.S @@ -40,7 +40,7 @@ SYM_FUNC_END(__memcpy) EXPORT_SYMBOL(__memcpy) -SYM_FUNC_ALIAS(memcpy, __memcpy) +SYM_FUNC_ALIAS_MEMFUNC(memcpy, __memcpy) EXPORT_SYMBOL(memcpy) SYM_FUNC_START_LOCAL(memcpy_orig) --- linux-azure-6.5.0.orig/arch/x86/lib/memmove_64.S +++ linux-azure-6.5.0/arch/x86/lib/memmove_64.S @@ -212,5 +212,5 @@ SYM_FUNC_END(__memmove) EXPORT_SYMBOL(__memmove) -SYM_FUNC_ALIAS(memmove, __memmove) +SYM_FUNC_ALIAS_MEMFUNC(memmove, __memmove) EXPORT_SYMBOL(memmove) --- linux-azure-6.5.0.orig/arch/x86/lib/memset_64.S +++ linux-azure-6.5.0/arch/x86/lib/memset_64.S @@ -40,7 +40,7 @@ SYM_FUNC_END(__memset) EXPORT_SYMBOL(__memset) -SYM_FUNC_ALIAS(memset, __memset) +SYM_FUNC_ALIAS_MEMFUNC(memset, __memset) EXPORT_SYMBOL(memset) SYM_FUNC_START_LOCAL(memset_orig) --- linux-azure-6.5.0.orig/arch/x86/lib/putuser.S +++ linux-azure-6.5.0/arch/x86/lib/putuser.S @@ -56,7 +56,6 @@ EXPORT_SYMBOL(__put_user_1) SYM_FUNC_START(__put_user_nocheck_1) - ENDBR ASM_STAC 2: movb %al,(%_ASM_CX) xor %ecx,%ecx @@ -76,7 +75,6 @@ EXPORT_SYMBOL(__put_user_2) SYM_FUNC_START(__put_user_nocheck_2) - ENDBR ASM_STAC 4: movw %ax,(%_ASM_CX) xor %ecx,%ecx @@ -96,7 +94,6 @@ EXPORT_SYMBOL(__put_user_4) SYM_FUNC_START(__put_user_nocheck_4) - ENDBR ASM_STAC 6: movl %eax,(%_ASM_CX) xor %ecx,%ecx @@ -119,7 +116,6 @@ EXPORT_SYMBOL(__put_user_8) SYM_FUNC_START(__put_user_nocheck_8) - ENDBR ASM_STAC 9: mov %_ASM_AX,(%_ASM_CX) #ifdef CONFIG_X86_32 --- linux-azure-6.5.0.orig/arch/x86/mm/maccess.c +++ linux-azure-6.5.0/arch/x86/mm/maccess.c @@ -9,12 +9,21 @@ unsigned long vaddr = (unsigned long)unsafe_src; /* - * Range covering the highest possible canonical userspace address - * as well as non-canonical address range. For the canonical range - * we also need to include the userspace guard page. + * Do not allow userspace addresses. This disallows + * normal userspace and the userspace guard page: */ - return vaddr >= TASK_SIZE_MAX + PAGE_SIZE && - __is_canonical_address(vaddr, boot_cpu_data.x86_virt_bits); + if (vaddr < TASK_SIZE_MAX + PAGE_SIZE) + return false; + + /* + * Allow everything during early boot before 'x86_virt_bits' + * is initialized. Needed for instruction decoding in early + * exception handlers. + */ + if (!boot_cpu_data.x86_virt_bits) + return true; + + return __is_canonical_address(vaddr, boot_cpu_data.x86_virt_bits); } #else bool copy_from_kernel_nofault_allowed(const void *unsafe_src, size_t size) --- linux-azure-6.5.0.orig/arch/x86/mm/mem_encrypt.c +++ linux-azure-6.5.0/arch/x86/mm/mem_encrypt.c @@ -41,38 +41,42 @@ static void print_mem_encrypt_feature_info(void) { - pr_info("Memory Encryption Features active:"); + pr_info("Memory Encryption Features active: "); - if (cpu_feature_enabled(X86_FEATURE_TDX_GUEST)) { - pr_cont(" Intel TDX\n"); - return; - } - - pr_cont(" AMD"); + switch (cc_vendor) { + case CC_VENDOR_INTEL: + pr_cont("Intel TDX\n"); + break; + case CC_VENDOR_AMD: + pr_cont("AMD"); - /* Secure Memory Encryption */ - if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) { + /* Secure Memory Encryption */ + if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) { /* * SME is mutually exclusive with any of the SEV * features below. - */ - pr_cont(" SME\n"); - return; + */ + pr_cont(" SME\n"); + return; + } + + /* Secure Encrypted Virtualization */ + if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT)) + pr_cont(" SEV"); + + /* Encrypted Register State */ + if (cc_platform_has(CC_ATTR_GUEST_STATE_ENCRYPT)) + pr_cont(" SEV-ES"); + + /* Secure Nested Paging */ + if (cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) + pr_cont(" SEV-SNP"); + + pr_cont("\n"); + break; + default: + pr_cont("Unknown\n"); } - - /* Secure Encrypted Virtualization */ - if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT)) - pr_cont(" SEV"); - - /* Encrypted Register State */ - if (cc_platform_has(CC_ATTR_GUEST_STATE_ENCRYPT)) - pr_cont(" SEV-ES"); - - /* Secure Nested Paging */ - if (cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) - pr_cont(" SEV-SNP"); - - pr_cont("\n"); } /* Architecture __weak replacement functions */ --- linux-azure-6.5.0.orig/arch/x86/mm/mem_encrypt_amd.c +++ linux-azure-6.5.0/arch/x86/mm/mem_encrypt_amd.c @@ -34,6 +34,7 @@ #include #include #include +#include #include "mm_internal.h" @@ -288,11 +289,10 @@ return !cpu_feature_enabled(X86_FEATURE_SME_COHERENT); } -static void enc_dec_hypercall(unsigned long vaddr, int npages, bool enc) +static void enc_dec_hypercall(unsigned long vaddr, unsigned long size, bool enc) { #ifdef CONFIG_PARAVIRT - unsigned long sz = npages << PAGE_SHIFT; - unsigned long vaddr_end = vaddr + sz; + unsigned long vaddr_end = vaddr + size; while (vaddr < vaddr_end) { int psize, pmask, level; @@ -342,7 +342,7 @@ snp_set_memory_private(vaddr, npages); if (!cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) - enc_dec_hypercall(vaddr, npages, enc); + enc_dec_hypercall(vaddr, npages << PAGE_SHIFT, enc); return true; } @@ -466,7 +466,7 @@ ret = 0; - early_set_mem_enc_dec_hypercall(start, PAGE_ALIGN(size) >> PAGE_SHIFT, enc); + early_set_mem_enc_dec_hypercall(start, size, enc); out: __flush_tlb_all(); return ret; @@ -482,9 +482,9 @@ return early_set_memory_enc_dec(vaddr, size, true); } -void __init early_set_mem_enc_dec_hypercall(unsigned long vaddr, int npages, bool enc) +void __init early_set_mem_enc_dec_hypercall(unsigned long vaddr, unsigned long size, bool enc) { - enc_dec_hypercall(vaddr, npages, enc); + enc_dec_hypercall(vaddr, size, enc); } void __init sme_early_init(void) @@ -505,6 +505,16 @@ x86_platform.guest.enc_cache_flush_required = amd_enc_cache_flush_required; /* + * The VMM is capable of injecting interrupt 0x80 and triggering the + * compatibility syscall path. + * + * By default, the 32-bit emulation is disabled in order to ensure + * the safety of the VM. + */ + if (sev_status & MSR_AMD64_SEV_ENABLED) + ia32_disable(); + + /* * AMD-SEV-ES intercepts the RDMSR to read the X2APIC ID in the * parallel bringup low level code. That raises #VC which cannot be * handled there. --- linux-azure-6.5.0.orig/arch/x86/mm/numa.c +++ linux-azure-6.5.0/arch/x86/mm/numa.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -601,13 +602,6 @@ if (start >= end) continue; - /* - * Don't confuse VM with a node that doesn't have the - * minimum amount of memory: - */ - if (end && (end - start) < NODE_MIN_SIZE) - continue; - alloc_node_data(nid); } @@ -961,4 +955,83 @@ return nid; } EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); + +static int __init cmp_memblk(const void *a, const void *b) +{ + const struct numa_memblk *ma = *(const struct numa_memblk **)a; + const struct numa_memblk *mb = *(const struct numa_memblk **)b; + + return ma->start - mb->start; +} + +static struct numa_memblk *numa_memblk_list[NR_NODE_MEMBLKS] __initdata; + +/** + * numa_fill_memblks - Fill gaps in numa_meminfo memblks + * @start: address to begin fill + * @end: address to end fill + * + * Find and extend numa_meminfo memblks to cover the @start-@end + * physical address range, such that the first memblk includes + * @start, the last memblk includes @end, and any gaps in between + * are filled. + * + * RETURNS: + * 0 : Success + * NUMA_NO_MEMBLK : No memblk exists in @start-@end range + */ + +int __init numa_fill_memblks(u64 start, u64 end) +{ + struct numa_memblk **blk = &numa_memblk_list[0]; + struct numa_meminfo *mi = &numa_meminfo; + int count = 0; + u64 prev_end; + + /* + * Create a list of pointers to numa_meminfo memblks that + * overlap start, end. Exclude (start == bi->end) since + * end addresses in both a CFMWS range and a memblk range + * are exclusive. + * + * This list of pointers is used to make in-place changes + * that fill out the numa_meminfo memblks. + */ + for (int i = 0; i < mi->nr_blks; i++) { + struct numa_memblk *bi = &mi->blk[i]; + + if (start < bi->end && end >= bi->start) { + blk[count] = &mi->blk[i]; + count++; + } + } + if (!count) + return NUMA_NO_MEMBLK; + + /* Sort the list of pointers in memblk->start order */ + sort(&blk[0], count, sizeof(blk[0]), cmp_memblk, NULL); + + /* Make sure the first/last memblks include start/end */ + blk[0]->start = min(blk[0]->start, start); + blk[count - 1]->end = max(blk[count - 1]->end, end); + + /* + * Fill any gaps by tracking the previous memblks + * end address and backfilling to it if needed. + */ + prev_end = blk[0]->end; + for (int i = 1; i < count; i++) { + struct numa_memblk *curr = blk[i]; + + if (prev_end >= curr->start) { + if (prev_end < curr->end) + prev_end = curr->end; + } else { + curr->start = prev_end; + prev_end = curr->end; + } + } + return 0; +} + #endif --- linux-azure-6.5.0.orig/arch/x86/net/bpf_jit_comp.c +++ linux-azure-6.5.0/arch/x86/net/bpf_jit_comp.c @@ -963,6 +963,10 @@ #define INSN_SZ_DIFF (((addrs[i] - addrs[i - 1]) - (prog - temp))) +/* mov rax, qword ptr [rbp - rounded_stack_depth - 8] */ +#define RESTORE_TAIL_CALL_CNT(stack) \ + EMIT3_off32(0x48, 0x8B, 0x85, -round_up(stack, 8) - 8) + static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image, u8 *rw_image, int oldproglen, struct jit_context *ctx, bool jmp_padding) { @@ -1538,9 +1542,7 @@ func = (u8 *) __bpf_call_base + imm32; if (tail_call_reachable) { - /* mov rax, qword ptr [rbp - rounded_stack_depth - 8] */ - EMIT3_off32(0x48, 0x8B, 0x85, - -round_up(bpf_prog->aux->stack_depth, 8) - 8); + RESTORE_TAIL_CALL_CNT(bpf_prog->aux->stack_depth); if (!imm32) return -EINVAL; offs = 7 + x86_call_depth_emit_accounting(&prog, func); @@ -1730,16 +1732,24 @@ break; case BPF_JMP | BPF_JA: - if (insn->off == -1) - /* -1 jmp instructions will always jump - * backwards two bytes. Explicitly handling - * this case avoids wasting too many passes - * when there are long sequences of replaced - * dead code. - */ - jmp_offset = -2; - else - jmp_offset = addrs[i + insn->off] - addrs[i]; + case BPF_JMP32 | BPF_JA: + if (BPF_CLASS(insn->code) == BPF_JMP) { + if (insn->off == -1) + /* -1 jmp instructions will always jump + * backwards two bytes. Explicitly handling + * this case avoids wasting too many passes + * when there are long sequences of replaced + * dead code. + */ + jmp_offset = -2; + else + jmp_offset = addrs[i + insn->off] - addrs[i]; + } else { + if (insn->imm == -1) + jmp_offset = -2; + else + jmp_offset = addrs[i + insn->imm] - addrs[i]; + } if (!jmp_offset) { /* @@ -1857,59 +1867,177 @@ return proglen; } -static void save_regs(const struct btf_func_model *m, u8 **prog, int nr_regs, - int stack_size) +static void clean_stack_garbage(const struct btf_func_model *m, + u8 **pprog, int nr_stack_slots, + int stack_size) +{ + int arg_size, off; + u8 *prog; + + /* Generally speaking, the compiler will pass the arguments + * on-stack with "push" instruction, which will take 8-byte + * on the stack. In this case, there won't be garbage values + * while we copy the arguments from origin stack frame to current + * in BPF_DW. + * + * However, sometimes the compiler will only allocate 4-byte on + * the stack for the arguments. For now, this case will only + * happen if there is only one argument on-stack and its size + * not more than 4 byte. In this case, there will be garbage + * values on the upper 4-byte where we store the argument on + * current stack frame. + * + * arguments on origin stack: + * + * stack_arg_1(4-byte) xxx(4-byte) + * + * what we copy: + * + * stack_arg_1(8-byte): stack_arg_1(origin) xxx + * + * and the xxx is the garbage values which we should clean here. + */ + if (nr_stack_slots != 1) + return; + + /* the size of the last argument */ + arg_size = m->arg_size[m->nr_args - 1]; + if (arg_size <= 4) { + off = -(stack_size - 4); + prog = *pprog; + /* mov DWORD PTR [rbp + off], 0 */ + if (!is_imm8(off)) + EMIT2_off32(0xC7, 0x85, off); + else + EMIT3(0xC7, 0x45, off); + EMIT(0, 4); + *pprog = prog; + } +} + +/* get the count of the regs that are used to pass arguments */ +static int get_nr_used_regs(const struct btf_func_model *m) +{ + int i, arg_regs, nr_used_regs = 0; + + for (i = 0; i < min_t(int, m->nr_args, MAX_BPF_FUNC_ARGS); i++) { + arg_regs = (m->arg_size[i] + 7) / 8; + if (nr_used_regs + arg_regs <= 6) + nr_used_regs += arg_regs; + + if (nr_used_regs >= 6) + break; + } + + return nr_used_regs; +} + +static void save_args(const struct btf_func_model *m, u8 **prog, + int stack_size, bool for_call_origin) { - int i, j, arg_size; - bool next_same_struct = false; + int arg_regs, first_off = 0, nr_regs = 0, nr_stack_slots = 0; + int i, j; /* Store function arguments to stack. * For a function that accepts two pointers the sequence will be: * mov QWORD PTR [rbp-0x10],rdi * mov QWORD PTR [rbp-0x8],rsi */ - for (i = 0, j = 0; i < min(nr_regs, 6); i++) { - /* The arg_size is at most 16 bytes, enforced by the verifier. */ - arg_size = m->arg_size[j]; - if (arg_size > 8) { - arg_size = 8; - next_same_struct = !next_same_struct; - } + for (i = 0; i < min_t(int, m->nr_args, MAX_BPF_FUNC_ARGS); i++) { + arg_regs = (m->arg_size[i] + 7) / 8; - emit_stx(prog, bytes_to_bpf_size(arg_size), - BPF_REG_FP, - i == 5 ? X86_REG_R9 : BPF_REG_1 + i, - -(stack_size - i * 8)); + /* According to the research of Yonghong, struct members + * should be all in register or all on the stack. + * Meanwhile, the compiler will pass the argument on regs + * if the remaining regs can hold the argument. + * + * Disorder of the args can happen. For example: + * + * struct foo_struct { + * long a; + * int b; + * }; + * int foo(char, char, char, char, char, struct foo_struct, + * char); + * + * the arg1-5,arg7 will be passed by regs, and arg6 will + * by stack. + */ + if (nr_regs + arg_regs > 6) { + /* copy function arguments from origin stack frame + * into current stack frame. + * + * The starting address of the arguments on-stack + * is: + * rbp + 8(push rbp) + + * 8(return addr of origin call) + + * 8(return addr of the caller) + * which means: rbp + 24 + */ + for (j = 0; j < arg_regs; j++) { + emit_ldx(prog, BPF_DW, BPF_REG_0, BPF_REG_FP, + nr_stack_slots * 8 + 0x18); + emit_stx(prog, BPF_DW, BPF_REG_FP, BPF_REG_0, + -stack_size); + + if (!nr_stack_slots) + first_off = stack_size; + stack_size -= 8; + nr_stack_slots++; + } + } else { + /* Only copy the arguments on-stack to current + * 'stack_size' and ignore the regs, used to + * prepare the arguments on-stack for orign call. + */ + if (for_call_origin) { + nr_regs += arg_regs; + continue; + } - j = next_same_struct ? j : j + 1; + /* copy the arguments from regs into stack */ + for (j = 0; j < arg_regs; j++) { + emit_stx(prog, BPF_DW, BPF_REG_FP, + nr_regs == 5 ? X86_REG_R9 : BPF_REG_1 + nr_regs, + -stack_size); + stack_size -= 8; + nr_regs++; + } + } } + + clean_stack_garbage(m, prog, nr_stack_slots, first_off); } -static void restore_regs(const struct btf_func_model *m, u8 **prog, int nr_regs, +static void restore_regs(const struct btf_func_model *m, u8 **prog, int stack_size) { - int i, j, arg_size; - bool next_same_struct = false; + int i, j, arg_regs, nr_regs = 0; /* Restore function arguments from stack. * For a function that accepts two pointers the sequence will be: * EMIT4(0x48, 0x8B, 0x7D, 0xF0); mov rdi,QWORD PTR [rbp-0x10] * EMIT4(0x48, 0x8B, 0x75, 0xF8); mov rsi,QWORD PTR [rbp-0x8] + * + * The logic here is similar to what we do in save_args() */ - for (i = 0, j = 0; i < min(nr_regs, 6); i++) { - /* The arg_size is at most 16 bytes, enforced by the verifier. */ - arg_size = m->arg_size[j]; - if (arg_size > 8) { - arg_size = 8; - next_same_struct = !next_same_struct; + for (i = 0; i < min_t(int, m->nr_args, MAX_BPF_FUNC_ARGS); i++) { + arg_regs = (m->arg_size[i] + 7) / 8; + if (nr_regs + arg_regs <= 6) { + for (j = 0; j < arg_regs; j++) { + emit_ldx(prog, BPF_DW, + nr_regs == 5 ? X86_REG_R9 : BPF_REG_1 + nr_regs, + BPF_REG_FP, + -stack_size); + stack_size -= 8; + nr_regs++; + } + } else { + stack_size -= 8 * arg_regs; } - emit_ldx(prog, bytes_to_bpf_size(arg_size), - i == 5 ? X86_REG_R9 : BPF_REG_1 + i, - BPF_REG_FP, - -(stack_size - i * 8)); - - j = next_same_struct ? j : j + 1; + if (nr_regs >= 6) + break; } } @@ -1938,7 +2066,10 @@ /* arg1: mov rdi, progs[i] */ emit_mov_imm64(&prog, BPF_REG_1, (long) p >> 32, (u32) (long) p); /* arg2: lea rsi, [rbp - ctx_cookie_off] */ - EMIT4(0x48, 0x8D, 0x75, -run_ctx_off); + if (!is_imm8(-run_ctx_off)) + EMIT3_off32(0x48, 0x8D, 0xB5, -run_ctx_off); + else + EMIT4(0x48, 0x8D, 0x75, -run_ctx_off); if (emit_rsb_call(&prog, bpf_trampoline_enter(p), prog)) return -EINVAL; @@ -1954,7 +2085,10 @@ emit_nops(&prog, 2); /* arg1: lea rdi, [rbp - stack_size] */ - EMIT4(0x48, 0x8D, 0x7D, -stack_size); + if (!is_imm8(-stack_size)) + EMIT3_off32(0x48, 0x8D, 0xBD, -stack_size); + else + EMIT4(0x48, 0x8D, 0x7D, -stack_size); /* arg2: progs[i]->insnsi for interpreter */ if (!p->jited) emit_mov_imm64(&prog, BPF_REG_2, @@ -1984,7 +2118,10 @@ /* arg2: mov rsi, rbx <- start time in nsec */ emit_mov_reg(&prog, true, BPF_REG_2, BPF_REG_6); /* arg3: lea rdx, [rbp - run_ctx_off] */ - EMIT4(0x48, 0x8D, 0x55, -run_ctx_off); + if (!is_imm8(-run_ctx_off)) + EMIT3_off32(0x48, 0x8D, 0x95, -run_ctx_off); + else + EMIT4(0x48, 0x8D, 0x55, -run_ctx_off); if (emit_rsb_call(&prog, bpf_trampoline_exit(p), prog)) return -EINVAL; @@ -2136,7 +2273,7 @@ void *func_addr) { int i, ret, nr_regs = m->nr_args, stack_size = 0; - int regs_off, nregs_off, ip_off, run_ctx_off; + int regs_off, nregs_off, ip_off, run_ctx_off, arg_stack_off, rbx_off; struct bpf_tramp_links *fentry = &tlinks[BPF_TRAMP_FENTRY]; struct bpf_tramp_links *fexit = &tlinks[BPF_TRAMP_FEXIT]; struct bpf_tramp_links *fmod_ret = &tlinks[BPF_TRAMP_MODIFY_RETURN]; @@ -2150,8 +2287,10 @@ if (m->arg_flags[i] & BTF_FMODEL_STRUCT_ARG) nr_regs += (m->arg_size[i] + 7) / 8 - 1; - /* x86-64 supports up to 6 arguments. 7+ can be added in the future */ - if (nr_regs > 6) + /* x86-64 supports up to MAX_BPF_FUNC_ARGS arguments. 1-6 + * are passed through regs, the remains are through stack. + */ + if (nr_regs > MAX_BPF_FUNC_ARGS) return -ENOTSUPP; /* Generated trampoline stack layout: @@ -2170,7 +2309,15 @@ * * RBP - ip_off [ traced function ] BPF_TRAMP_F_IP_ARG flag * + * RBP - rbx_off [ rbx value ] always + * * RBP - run_ctx_off [ bpf_tramp_run_ctx ] + * + * [ stack_argN ] BPF_TRAMP_F_CALL_ORIG + * [ ... ] + * [ stack_arg2 ] + * RBP - arg_stack_off [ stack_arg1 ] + * RSP [ tail_call_cnt ] BPF_TRAMP_F_TAIL_CALL_CTX */ /* room for return value of orig_call or fentry prog */ @@ -2190,9 +2337,26 @@ ip_off = stack_size; + stack_size += 8; + rbx_off = stack_size; + stack_size += (sizeof(struct bpf_tramp_run_ctx) + 7) & ~0x7; run_ctx_off = stack_size; + if (nr_regs > 6 && (flags & BPF_TRAMP_F_CALL_ORIG)) { + /* the space that used to pass arguments on-stack */ + stack_size += (nr_regs - get_nr_used_regs(m)) * 8; + /* make sure the stack pointer is 16-byte aligned if we + * need pass arguments on stack, which means + * [stack_size + 8(rbp) + 8(rip) + 8(origin rip)] + * should be 16-byte aligned. Following code depend on + * that stack_size is already 8-byte aligned. + */ + stack_size += (stack_size % 16) ? 0 : 8; + } + + arg_stack_off = stack_size; + if (flags & BPF_TRAMP_F_SKIP_FRAME) { /* skip patched call instruction and point orig_call to actual * body of the kernel function. @@ -2212,8 +2376,16 @@ x86_call_depth_emit_accounting(&prog, NULL); EMIT1(0x55); /* push rbp */ EMIT3(0x48, 0x89, 0xE5); /* mov rbp, rsp */ - EMIT4(0x48, 0x83, 0xEC, stack_size); /* sub rsp, stack_size */ - EMIT1(0x53); /* push rbx */ + if (!is_imm8(stack_size)) + /* sub rsp, stack_size */ + EMIT3_off32(0x48, 0x81, 0xEC, stack_size); + else + /* sub rsp, stack_size */ + EMIT4(0x48, 0x83, 0xEC, stack_size); + if (flags & BPF_TRAMP_F_TAIL_CALL_CTX) + EMIT1(0x50); /* push rax */ + /* mov QWORD PTR [rbp - rbx_off], rbx */ + emit_stx(&prog, BPF_DW, BPF_REG_FP, BPF_REG_6, -rbx_off); /* Store number of argument registers of the traced function: * mov rax, nr_regs @@ -2231,7 +2403,7 @@ emit_stx(&prog, BPF_DW, BPF_REG_FP, BPF_REG_0, -ip_off); } - save_regs(m, &prog, nr_regs, regs_off); + save_args(m, &prog, regs_off, false); if (flags & BPF_TRAMP_F_CALL_ORIG) { /* arg1: mov rdi, im */ @@ -2261,11 +2433,18 @@ } if (flags & BPF_TRAMP_F_CALL_ORIG) { - restore_regs(m, &prog, nr_regs, regs_off); + restore_regs(m, &prog, regs_off); + save_args(m, &prog, arg_stack_off, true); + + if (flags & BPF_TRAMP_F_TAIL_CALL_CTX) + /* Before calling the original function, restore the + * tail_call_cnt from stack to rax. + */ + RESTORE_TAIL_CALL_CNT(stack_size); if (flags & BPF_TRAMP_F_ORIG_STACK) { - emit_ldx(&prog, BPF_DW, BPF_REG_0, BPF_REG_FP, 8); - EMIT2(0xff, 0xd0); /* call *rax */ + emit_ldx(&prog, BPF_DW, BPF_REG_6, BPF_REG_FP, 8); + EMIT2(0xff, 0xd3); /* call *rbx */ } else { /* call original function */ if (emit_rsb_call(&prog, orig_call, prog)) { @@ -2302,7 +2481,7 @@ } if (flags & BPF_TRAMP_F_RESTORE_REGS) - restore_regs(m, &prog, nr_regs, regs_off); + restore_regs(m, &prog, regs_off); /* This needs to be done regardless. If there were fmod_ret programs, * the return value is only updated on the stack and still needs to be @@ -2316,12 +2495,17 @@ ret = -EINVAL; goto cleanup; } - } + } else if (flags & BPF_TRAMP_F_TAIL_CALL_CTX) + /* Before running the original function, restore the + * tail_call_cnt from stack to rax. + */ + RESTORE_TAIL_CALL_CNT(stack_size); + /* restore return value of orig_call or fentry prog back into RAX */ if (save_ret) emit_ldx(&prog, BPF_DW, BPF_REG_0, BPF_REG_FP, -8); - EMIT1(0x5B); /* pop rbx */ + emit_ldx(&prog, BPF_DW, BPF_REG_6, BPF_REG_FP, -rbx_off); EMIT1(0xC9); /* leave */ if (flags & BPF_TRAMP_F_SKIP_FRAME) /* skip our return address and return to parent */ @@ -2660,3 +2844,49 @@ bpf_prog_unlock_free(prog); } + +void bpf_arch_poke_desc_update(struct bpf_jit_poke_descriptor *poke, + struct bpf_prog *new, struct bpf_prog *old) +{ + u8 *old_addr, *new_addr, *old_bypass_addr; + int ret; + + old_bypass_addr = old ? NULL : poke->bypass_addr; + old_addr = old ? (u8 *)old->bpf_func + poke->adj_off : NULL; + new_addr = new ? (u8 *)new->bpf_func + poke->adj_off : NULL; + + /* + * On program loading or teardown, the program's kallsym entry + * might not be in place, so we use __bpf_arch_text_poke to skip + * the kallsyms check. + */ + if (new) { + ret = __bpf_arch_text_poke(poke->tailcall_target, + BPF_MOD_JUMP, + old_addr, new_addr); + BUG_ON(ret < 0); + if (!old) { + ret = __bpf_arch_text_poke(poke->tailcall_bypass, + BPF_MOD_JUMP, + poke->bypass_addr, + NULL); + BUG_ON(ret < 0); + } + } else { + ret = __bpf_arch_text_poke(poke->tailcall_bypass, + BPF_MOD_JUMP, + old_bypass_addr, + poke->bypass_addr); + BUG_ON(ret < 0); + /* let other CPUs finish the execution of program + * so that it will not possible to expose them + * to invalid nop, stack unwind, nop state + */ + if (!ret) + synchronize_rcu(); + ret = __bpf_arch_text_poke(poke->tailcall_target, + BPF_MOD_JUMP, + old_addr, NULL); + BUG_ON(ret < 0); + } +} --- linux-azure-6.5.0.orig/arch/x86/pci/common.c +++ linux-azure-6.5.0/arch/x86/pci/common.c @@ -34,6 +34,7 @@ #endif int pcibios_last_bus = -1; unsigned long pirq_table_addr; +unsigned int pci_early_clear_msi; const struct pci_raw_ops *__read_mostly raw_pci_ops; const struct pci_raw_ops *__read_mostly raw_pci_ext_ops; @@ -614,6 +615,9 @@ } else if (!strcmp(str, "skip_isa_align")) { pci_probe |= PCI_CAN_SKIP_ISA_ALIGN; return NULL; + } else if (!strcmp(str, "clearmsi")) { + pci_early_clear_msi = 1; + return NULL; } else if (!strcmp(str, "noioapicquirk")) { noioapicquirk = 1; return NULL; --- linux-azure-6.5.0.orig/arch/x86/pci/early.c +++ linux-azure-6.5.0/arch/x86/pci/early.c @@ -51,6 +51,31 @@ outw(val, 0xcfc + (offset&2)); } +u32 pci_early_find_cap(int bus, int slot, int func, int cap) +{ + int bytes; + u8 pos; + + if (!(read_pci_config_16(bus, slot, func, PCI_STATUS) & + PCI_STATUS_CAP_LIST)) + return 0; + + pos = read_pci_config_byte(bus, slot, func, PCI_CAPABILITY_LIST); + for (bytes = 0; bytes < 48 && pos >= 0x40; bytes++) { + u8 id; + + pos &= ~3; + id = read_pci_config_byte(bus, slot, func, pos+PCI_CAP_LIST_ID); + if (id == 0xff) + break; + if (id == cap) + return pos; + pos = read_pci_config_byte(bus, slot, func, + pos+PCI_CAP_LIST_NEXT); + } + return 0; +} + int early_pci_allowed(void) { return (pci_probe & (PCI_PROBE_CONF1|PCI_PROBE_NOEARLY)) == --- linux-azure-6.5.0.orig/arch/x86/pci/fixup.c +++ linux-azure-6.5.0/arch/x86/pci/fixup.c @@ -3,9 +3,11 @@ * Exceptions for specific devices. Usually work-arounds for fatal design flaws. */ +#include #include #include #include +#include #include #include #include @@ -904,3 +906,60 @@ } DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x5ad6, chromeos_save_apl_pci_l1ss_capability); DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, 0x5ad6, chromeos_fixup_apl_pci_l1ss_capability); + +#ifdef CONFIG_SUSPEND +/* + * Root Ports on some AMD SoCs advertise PME_Support for D3hot and D3cold, but + * if the SoC is put into a hardware sleep state by the amd-pmc driver, the + * Root Ports don't generate wakeup interrupts for USB devices. + * + * When suspending, remove D3hot and D3cold from the PME_Support advertised + * by the Root Port so we don't use those states if we're expecting wakeup + * interrupts. Restore the advertised PME_Support when resuming. + */ +static void amd_rp_pme_suspend(struct pci_dev *dev) +{ + struct pci_dev *rp; + + /* + * PM_SUSPEND_ON means we're doing runtime suspend, which means + * amd-pmc will not be involved so PMEs during D3 work as advertised. + * + * The PMEs *do* work if amd-pmc doesn't put the SoC in the hardware + * sleep state, but we assume amd-pmc is always present. + */ + if (pm_suspend_target_state == PM_SUSPEND_ON) + return; + + rp = pcie_find_root_port(dev); + if (!rp->pm_cap) + return; + + rp->pme_support &= ~((PCI_PM_CAP_PME_D3hot|PCI_PM_CAP_PME_D3cold) >> + PCI_PM_CAP_PME_SHIFT); + dev_info_once(&rp->dev, "quirk: disabling D3cold for suspend\n"); +} + +static void amd_rp_pme_resume(struct pci_dev *dev) +{ + struct pci_dev *rp; + u16 pmc; + + rp = pcie_find_root_port(dev); + if (!rp->pm_cap) + return; + + pci_read_config_word(rp, rp->pm_cap + PCI_PM_PMC, &pmc); + rp->pme_support = FIELD_GET(PCI_PM_CAP_PME_MASK, pmc); +} +/* Rembrandt (yellow_carp) */ +DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_AMD, 0x162e, amd_rp_pme_suspend); +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x162e, amd_rp_pme_resume); +DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_AMD, 0x162f, amd_rp_pme_suspend); +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x162f, amd_rp_pme_resume); +/* Phoenix (pink_sardine) */ +DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_AMD, 0x1668, amd_rp_pme_suspend); +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x1668, amd_rp_pme_resume); +DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_AMD, 0x1669, amd_rp_pme_suspend); +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, 0x1669, amd_rp_pme_resume); +#endif /* CONFIG_SUSPEND */ --- linux-azure-6.5.0.orig/arch/x86/purgatory/Makefile +++ linux-azure-6.5.0/arch/x86/purgatory/Makefile @@ -19,6 +19,10 @@ # optimization flags. KBUILD_CFLAGS := $(filter-out -fprofile-sample-use=% -fprofile-use=%,$(KBUILD_CFLAGS)) +# When LTO is enabled, llvm emits many text sections, which is not supported +# by kexec. Remove -flto=* flags. +KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_LTO),$(KBUILD_CFLAGS)) + # When linking purgatory.ro with -r unresolved symbols are not checked, # also link a purgatory.chk binary without -r to check for unresolved symbols. PURGATORY_LDFLAGS := -e purgatory_start -z nodefaultlib --- linux-azure-6.5.0.orig/arch/x86/realmode/rm/trampoline_32.S +++ linux-azure-6.5.0/arch/x86/realmode/rm/trampoline_32.S @@ -23,6 +23,7 @@ #include #include #include +#include #include "realmode.h" .text @@ -59,6 +60,7 @@ .section ".text32","ax" .code32 SYM_CODE_START(startup_32) # note: also used from wakeup_asm.S + ANNOTATE_RETPOLINE_SAFE jmp *%eax SYM_CODE_END(startup_32) --- linux-azure-6.5.0.orig/arch/x86/xen/Kconfig +++ linux-azure-6.5.0/arch/x86/xen/Kconfig @@ -9,6 +9,7 @@ select PARAVIRT_CLOCK select X86_HV_CALLBACK_VECTOR depends on X86_64 || (X86_32 && X86_PAE) + depends on X86_64 || (X86_GENERIC || MPENTIUM4 || MCORE2 || MATOM || MK8) depends on X86_LOCAL_APIC && X86_TSC help This is the Linux Xen port. Enabling this will allow the --- linux-azure-6.5.0.orig/arch/x86/xen/enlighten.c +++ linux-azure-6.5.0/arch/x86/xen/enlighten.c @@ -32,10 +32,13 @@ * &HYPERVISOR_shared_info->vcpu_info[cpu]. See xen_hvm_init_shared_info * and xen_vcpu_setup for details. By default it points to share_info->vcpu_info * but during boot it is switched to point to xen_vcpu_info. - * The pointer is used in __xen_evtchn_do_upcall to acknowledge pending events. + * The pointer is used in xen_evtchn_do_upcall to acknowledge pending events. + * Make sure that xen_vcpu_info doesn't cross a page boundary by making it + * cache-line aligned (the struct is guaranteed to have a size of 64 bytes, + * which matches the cache line size of 64-bit x86 processors). */ DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu); -DEFINE_PER_CPU(struct vcpu_info, xen_vcpu_info); +DEFINE_PER_CPU_ALIGNED(struct vcpu_info, xen_vcpu_info); /* Linux <-> Xen vCPU id mapping */ DEFINE_PER_CPU(uint32_t, xen_vcpu_id); @@ -160,6 +163,7 @@ int err; struct vcpu_info *vcpup; + BUILD_BUG_ON(sizeof(*vcpup) > SMP_CACHE_BYTES); BUG_ON(HYPERVISOR_shared_info == &xen_dummy_shared_info); /* --- linux-azure-6.5.0.orig/arch/x86/xen/enlighten_hvm.c +++ linux-azure-6.5.0/arch/x86/xen/enlighten_hvm.c @@ -136,7 +136,7 @@ inc_irq_stat(irq_hv_callback_count); - xen_hvm_evtchn_do_upcall(); + xen_evtchn_do_upcall(); set_irq_regs(old_regs); } --- linux-azure-6.5.0.orig/arch/x86/xen/enlighten_pv.c +++ linux-azure-6.5.0/arch/x86/xen/enlighten_pv.c @@ -678,7 +678,7 @@ TRAP_ENTRY(exc_int3, false ), TRAP_ENTRY(exc_overflow, false ), #ifdef CONFIG_IA32_EMULATION - { entry_INT80_compat, xen_entry_INT80_compat, false }, + TRAP_ENTRY(int80_emulation, false ), #endif TRAP_ENTRY(exc_page_fault, false ), TRAP_ENTRY(exc_divide_error, false ), --- linux-azure-6.5.0.orig/arch/x86/xen/xen-asm.S +++ linux-azure-6.5.0/arch/x86/xen/xen-asm.S @@ -156,7 +156,7 @@ #endif /* CONFIG_X86_MCE */ xen_pv_trap asm_exc_simd_coprocessor_error #ifdef CONFIG_IA32_EMULATION -xen_pv_trap entry_INT80_compat +xen_pv_trap asm_int80_emulation #endif xen_pv_trap asm_exc_xen_unknown_trap xen_pv_trap asm_exc_xen_hypervisor_callback --- linux-azure-6.5.0.orig/arch/x86/xen/xen-ops.h +++ linux-azure-6.5.0/arch/x86/xen/xen-ops.h @@ -21,7 +21,7 @@ struct trap_info; void xen_copy_trap_info(struct trap_info *traps); -DECLARE_PER_CPU(struct vcpu_info, xen_vcpu_info); +DECLARE_PER_CPU_ALIGNED(struct vcpu_info, xen_vcpu_info); DECLARE_PER_CPU(unsigned long, xen_cr3); DECLARE_PER_CPU(unsigned long, xen_current_cr3); --- linux-azure-6.5.0.orig/arch/xtensa/boot/Makefile +++ linux-azure-6.5.0/arch/xtensa/boot/Makefile @@ -9,8 +9,7 @@ # KBUILD_CFLAGS used when building rest of boot (takes effect recursively) -KBUILD_CFLAGS += -fno-builtin -Iarch/$(ARCH)/boot/include -HOSTFLAGS += -Iarch/$(ARCH)/boot/include +KBUILD_CFLAGS += -fno-builtin subdir-y := lib targets += vmlinux.bin vmlinux.bin.gz --- linux-azure-6.5.0.orig/arch/xtensa/boot/lib/zmem.c +++ linux-azure-6.5.0/arch/xtensa/boot/lib/zmem.c @@ -4,13 +4,14 @@ /* bits taken from ppc */ extern void *avail_ram, *end_avail; +void gunzip(void *dst, int dstlen, unsigned char *src, int *lenp); -void exit (void) +static void exit(void) { for (;;); } -void *zalloc(unsigned size) +static void *zalloc(unsigned int size) { void *p = avail_ram; --- linux-azure-6.5.0.orig/arch/xtensa/include/asm/core.h +++ linux-azure-6.5.0/arch/xtensa/include/asm/core.h @@ -6,6 +6,10 @@ #include +#ifndef XCHAL_HAVE_DIV32 +#define XCHAL_HAVE_DIV32 0 +#endif + #ifndef XCHAL_HAVE_EXCLUSIVE #define XCHAL_HAVE_EXCLUSIVE 0 #endif @@ -52,4 +56,13 @@ #define XTENSA_STACK_ALIGNMENT 16 #endif +#ifndef XCHAL_HW_MIN_VERSION +#if defined(XCHAL_HW_MIN_VERSION_MAJOR) && defined(XCHAL_HW_MIN_VERSION_MINOR) +#define XCHAL_HW_MIN_VERSION (XCHAL_HW_MIN_VERSION_MAJOR * 100 + \ + XCHAL_HW_MIN_VERSION_MINOR) +#else +#define XCHAL_HW_MIN_VERSION 0 +#endif +#endif + #endif --- linux-azure-6.5.0.orig/arch/xtensa/kernel/perf_event.c +++ linux-azure-6.5.0/arch/xtensa/kernel/perf_event.c @@ -13,17 +13,26 @@ #include #include +#include #include #include +#define XTENSA_HWVERSION_RG_2015_0 260000 + +#if XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RG_2015_0 +#define XTENSA_PMU_ERI_BASE 0x00101000 +#else +#define XTENSA_PMU_ERI_BASE 0x00001000 +#endif + /* Global control/status for all perf counters */ -#define XTENSA_PMU_PMG 0x1000 +#define XTENSA_PMU_PMG XTENSA_PMU_ERI_BASE /* Perf counter values */ -#define XTENSA_PMU_PM(i) (0x1080 + (i) * 4) +#define XTENSA_PMU_PM(i) (XTENSA_PMU_ERI_BASE + 0x80 + (i) * 4) /* Perf counter control registers */ -#define XTENSA_PMU_PMCTRL(i) (0x1100 + (i) * 4) +#define XTENSA_PMU_PMCTRL(i) (XTENSA_PMU_ERI_BASE + 0x100 + (i) * 4) /* Perf counter status registers */ -#define XTENSA_PMU_PMSTAT(i) (0x1180 + (i) * 4) +#define XTENSA_PMU_PMSTAT(i) (XTENSA_PMU_ERI_BASE + 0x180 + (i) * 4) #define XTENSA_PMU_PMG_PMEN 0x1 --- linux-azure-6.5.0.orig/arch/xtensa/lib/umulsidi3.S +++ linux-azure-6.5.0/arch/xtensa/lib/umulsidi3.S @@ -3,7 +3,9 @@ #include #include -#if !XCHAL_HAVE_MUL16 && !XCHAL_HAVE_MUL32 && !XCHAL_HAVE_MAC16 +#if XCHAL_HAVE_MUL16 || XCHAL_HAVE_MUL32 || XCHAL_HAVE_MAC16 +#define XCHAL_NO_MUL 0 +#else #define XCHAL_NO_MUL 1 #endif --- linux-azure-6.5.0.orig/arch/xtensa/platforms/iss/network.c +++ linux-azure-6.5.0/arch/xtensa/platforms/iss/network.c @@ -201,7 +201,7 @@ return simc_write(lp->tp.info.tuntap.fd, (*skb)->data, (*skb)->len); } -unsigned short tuntap_protocol(struct sk_buff *skb) +static unsigned short tuntap_protocol(struct sk_buff *skb) { return eth_type_trans(skb, skb->dev); } @@ -441,7 +441,7 @@ return -EINVAL; } -void iss_net_user_timer_expire(struct timer_list *unused) +static void iss_net_user_timer_expire(struct timer_list *unused) { } --- linux-azure-6.5.0.orig/block/bdev.c +++ linux-azure-6.5.0/block/bdev.c @@ -442,6 +442,8 @@ void bdev_add(struct block_device *bdev, dev_t dev) { + if (bdev_stable_writes(bdev)) + mapping_set_stable_writes(bdev->bd_inode->i_mapping); bdev->bd_dev = dev; bdev->bd_inode->i_rdev = dev; bdev->bd_inode->i_ino = dev; --- linux-azure-6.5.0.orig/block/bio-integrity.c +++ linux-azure-6.5.0/block/bio-integrity.c @@ -123,17 +123,34 @@ int bio_integrity_add_page(struct bio *bio, struct page *page, unsigned int len, unsigned int offset) { + struct request_queue *q = bdev_get_queue(bio->bi_bdev); struct bio_integrity_payload *bip = bio_integrity(bio); - if (bip->bip_vcnt >= bip->bip_max_vcnt) { - printk(KERN_ERR "%s: bip_vec full\n", __func__); + if (((bip->bip_iter.bi_size + len) >> SECTOR_SHIFT) > + queue_max_hw_sectors(q)) return 0; - } - if (bip->bip_vcnt && - bvec_gap_to_prev(&bdev_get_queue(bio->bi_bdev)->limits, - &bip->bip_vec[bip->bip_vcnt - 1], offset)) - return 0; + if (bip->bip_vcnt > 0) { + struct bio_vec *bv = &bip->bip_vec[bip->bip_vcnt - 1]; + bool same_page = false; + + if (bvec_try_merge_hw_page(q, bv, page, len, offset, + &same_page)) { + bip->bip_iter.bi_size += len; + return len; + } + + if (bip->bip_vcnt >= + min(bip->bip_max_vcnt, queue_max_integrity_segments(q))) + return 0; + + /* + * If the queue doesn't support SG gaps and adding this segment + * would create a gap, disallow it. + */ + if (bvec_gap_to_prev(&q->limits, bv, offset)) + return 0; + } bvec_set_page(&bip->bip_vec[bip->bip_vcnt], page, len, offset); bip->bip_vcnt++; --- linux-azure-6.5.0.orig/block/bio.c +++ linux-azure-6.5.0/block/bio.c @@ -903,9 +903,8 @@ return false; } -static inline bool page_is_mergeable(const struct bio_vec *bv, - struct page *page, unsigned int len, unsigned int off, - bool *same_page) +static bool bvec_try_merge_page(struct bio_vec *bv, struct page *page, + unsigned int len, unsigned int off, bool *same_page) { size_t bv_end = bv->bv_offset + bv->bv_len; phys_addr_t vec_end_addr = page_to_phys(bv->bv_page) + bv_end - 1; @@ -919,49 +918,15 @@ return false; *same_page = ((vec_end_addr & PAGE_MASK) == page_addr); - if (*same_page) - return true; - else if (IS_ENABLED(CONFIG_KMSAN)) - return false; - return (bv->bv_page + bv_end / PAGE_SIZE) == (page + off / PAGE_SIZE); -} - -/** - * __bio_try_merge_page - try appending data to an existing bvec. - * @bio: destination bio - * @page: start page to add - * @len: length of the data to add - * @off: offset of the data relative to @page - * @same_page: return if the segment has been merged inside the same page - * - * Try to add the data at @page + @off to the last bvec of @bio. This is a - * useful optimisation for file systems with a block size smaller than the - * page size. - * - * Warn if (@len, @off) crosses pages in case that @same_page is true. - * - * Return %true on success or %false on failure. - */ -static bool __bio_try_merge_page(struct bio *bio, struct page *page, - unsigned int len, unsigned int off, bool *same_page) -{ - if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED))) - return false; - - if (bio->bi_vcnt > 0) { - struct bio_vec *bv = &bio->bi_io_vec[bio->bi_vcnt - 1]; - - if (page_is_mergeable(bv, page, len, off, same_page)) { - if (bio->bi_iter.bi_size > UINT_MAX - len) { - *same_page = false; - return false; - } - bv->bv_len += len; - bio->bi_iter.bi_size += len; - return true; - } + if (!*same_page) { + if (IS_ENABLED(CONFIG_KMSAN)) + return false; + if (bv->bv_page + bv_end / PAGE_SIZE != page + off / PAGE_SIZE) + return false; } - return false; + + bv->bv_len += len; + return true; } /* @@ -969,11 +934,10 @@ * size limit. This is not for normal read/write bios, but for passthrough * or Zone Append operations that we can't split. */ -static bool bio_try_merge_hw_seg(struct request_queue *q, struct bio *bio, - struct page *page, unsigned len, - unsigned offset, bool *same_page) +bool bvec_try_merge_hw_page(struct request_queue *q, struct bio_vec *bv, + struct page *page, unsigned len, unsigned offset, + bool *same_page) { - struct bio_vec *bv = &bio->bi_io_vec[bio->bi_vcnt - 1]; unsigned long mask = queue_segment_boundary(q); phys_addr_t addr1 = page_to_phys(bv->bv_page) + bv->bv_offset; phys_addr_t addr2 = page_to_phys(page) + offset + len - 1; @@ -982,7 +946,7 @@ return false; if (bv->bv_len + len > queue_max_segment_size(q)) return false; - return __bio_try_merge_page(bio, page, len, offset, same_page); + return bvec_try_merge_page(bv, page, len, offset, same_page); } /** @@ -1002,8 +966,6 @@ struct page *page, unsigned int len, unsigned int offset, unsigned int max_sectors, bool *same_page) { - struct bio_vec *bvec; - if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED))) return 0; @@ -1011,15 +973,19 @@ return 0; if (bio->bi_vcnt > 0) { - if (bio_try_merge_hw_seg(q, bio, page, len, offset, same_page)) + struct bio_vec *bv = &bio->bi_io_vec[bio->bi_vcnt - 1]; + + if (bvec_try_merge_hw_page(q, bv, page, len, offset, + same_page)) { + bio->bi_iter.bi_size += len; return len; + } /* * If the queue doesn't support SG gaps and adding this segment * would create a gap, disallow it. */ - bvec = &bio->bi_io_vec[bio->bi_vcnt - 1]; - if (bvec_gap_to_prev(&q->limits, bvec, offset)) + if (bvec_gap_to_prev(&q->limits, bv, offset)) return 0; } @@ -1129,11 +1095,21 @@ { bool same_page = false; - if (!__bio_try_merge_page(bio, page, len, offset, &same_page)) { - if (bio_full(bio, len)) - return 0; - __bio_add_page(bio, page, len, offset); + if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED))) + return 0; + if (bio->bi_iter.bi_size > UINT_MAX - len) + return 0; + + if (bio->bi_vcnt > 0 && + bvec_try_merge_page(&bio->bi_io_vec[bio->bi_vcnt - 1], + page, len, offset, &same_page)) { + bio->bi_iter.bi_size += len; + return len; } + + if (bio_full(bio, len)) + return 0; + __bio_add_page(bio, page, len, offset); return len; } EXPORT_SYMBOL(bio_add_page); @@ -1207,13 +1183,18 @@ { bool same_page = false; - if (!__bio_try_merge_page(bio, page, len, offset, &same_page)) { - __bio_add_page(bio, page, len, offset); + if (WARN_ON_ONCE(bio->bi_iter.bi_size > UINT_MAX - len)) + return -EIO; + + if (bio->bi_vcnt > 0 && + bvec_try_merge_page(&bio->bi_io_vec[bio->bi_vcnt - 1], + page, len, offset, &same_page)) { + bio->bi_iter.bi_size += len; + if (same_page) + bio_release_page(bio, page); return 0; } - - if (same_page) - bio_release_page(bio, page); + __bio_add_page(bio, page, len, offset); return 0; } @@ -1337,6 +1318,9 @@ { int ret = 0; + if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED))) + return -EIO; + if (iov_iter_is_bvec(iter)) { bio_iov_bvec_set(bio, iter); iov_iter_advance(iter, bio->bi_iter.bi_size); --- linux-azure-6.5.0.orig/block/blk-cgroup.c +++ linux-azure-6.5.0/block/blk-cgroup.c @@ -577,6 +577,7 @@ struct request_queue *q = disk->queue; struct blkcg_gq *blkg, *n; int count = BLKG_DESTROY_BATCH_SIZE; + int i; restart: spin_lock_irq(&q->queue_lock); @@ -602,6 +603,18 @@ } } + /* + * Mark policy deactivated since policy offline has been done, and + * the free is scheduled, so future blkcg_deactivate_policy() can + * be bypassed + */ + for (i = 0; i < BLKCG_MAX_POLS; i++) { + struct blkcg_policy *pol = blkcg_policy[i]; + + if (pol) + __clear_bit(pol->plid, q->blkcg_pols); + } + q->root_blkg = NULL; spin_unlock_irq(&q->queue_lock); } @@ -1511,7 +1524,7 @@ retry: spin_lock_irq(&q->queue_lock); - /* blkg_list is pushed at the head, reverse walk to allocate parents first */ + /* blkg_list is pushed at the head, reverse walk to initialize parents first */ list_for_each_entry_reverse(blkg, &q->blkg_list, q_node) { struct blkg_policy_data *pd; @@ -1549,21 +1562,20 @@ goto enomem; } - blkg->pd[pol->plid] = pd; + spin_lock(&blkg->blkcg->lock); + pd->blkg = blkg; pd->plid = pol->plid; - pd->online = false; - } + blkg->pd[pol->plid] = pd; - /* all allocated, init in the same order */ - if (pol->pd_init_fn) - list_for_each_entry_reverse(blkg, &q->blkg_list, q_node) - pol->pd_init_fn(blkg->pd[pol->plid]); + if (pol->pd_init_fn) + pol->pd_init_fn(pd); - list_for_each_entry_reverse(blkg, &q->blkg_list, q_node) { if (pol->pd_online_fn) - pol->pd_online_fn(blkg->pd[pol->plid]); - blkg->pd[pol->plid]->online = true; + pol->pd_online_fn(pd); + pd->online = true; + + spin_unlock(&blkg->blkcg->lock); } __set_bit(pol->plid, q->blkcg_pols); @@ -1580,14 +1592,19 @@ return ret; enomem: - /* alloc failed, nothing's initialized yet, free everything */ + /* alloc failed, take down everything */ spin_lock_irq(&q->queue_lock); list_for_each_entry(blkg, &q->blkg_list, q_node) { struct blkcg *blkcg = blkg->blkcg; + struct blkg_policy_data *pd; spin_lock(&blkcg->lock); - if (blkg->pd[pol->plid]) { - pol->pd_free_fn(blkg->pd[pol->plid]); + pd = blkg->pd[pol->plid]; + if (pd) { + if (pd->online && pol->pd_offline_fn) + pol->pd_offline_fn(pd); + pd->online = false; + pol->pd_free_fn(pd); blkg->pd[pol->plid] = NULL; } spin_unlock(&blkcg->lock); --- linux-azure-6.5.0.orig/block/blk-cgroup.h +++ linux-azure-6.5.0/block/blk-cgroup.h @@ -249,8 +249,6 @@ { struct blkcg_gq *blkg; - WARN_ON_ONCE(!rcu_read_lock_held()); - if (blkcg == &blkcg_root) return q->root_blkg; --- linux-azure-6.5.0.orig/block/blk-core.c +++ linux-azure-6.5.0/block/blk-core.c @@ -500,9 +500,17 @@ if (op_is_write(bio_op(bio)) && bdev_read_only(bio->bi_bdev)) { if (op_is_flush(bio->bi_opf) && !bio_sectors(bio)) return; + + if (bio->bi_bdev->bd_ro_warned) + return; + + bio->bi_bdev->bd_ro_warned = true; + /* + * Use ioctl to set underlying disk of raid/dm to read-only + * will trigger this. + */ pr_warn("Trying to write to read-only block-device %pg\n", bio->bi_bdev); - /* Older lvm-tools actually trigger this */ } } --- linux-azure-6.5.0.orig/block/blk-flush.c +++ linux-azure-6.5.0/block/blk-flush.c @@ -443,7 +443,7 @@ * the post flush, and then just pass the command on. */ blk_rq_init_flush(rq); - rq->flush.seq |= REQ_FSEQ_POSTFLUSH; + rq->flush.seq |= REQ_FSEQ_PREFLUSH; spin_lock_irq(&fq->mq_flush_lock); list_move_tail(&rq->flush.list, &fq->flush_data_in_flight); spin_unlock_irq(&fq->mq_flush_lock); --- linux-azure-6.5.0.orig/block/blk-map.c +++ linux-azure-6.5.0/block/blk-map.c @@ -315,12 +315,11 @@ n = bytes; if (!bio_add_hw_page(rq->q, bio, page, n, offs, - max_sectors, &same_page)) { - if (same_page) - bio_release_page(bio, page); + max_sectors, &same_page)) break; - } + if (same_page) + bio_release_page(bio, page); bytes -= n; offs = 0; } --- linux-azure-6.5.0.orig/block/blk-mq.c +++ linux-azure-6.5.0/block/blk-mq.c @@ -1514,14 +1514,26 @@ } EXPORT_SYMBOL(blk_mq_delay_kick_requeue_list); +static bool blk_is_flush_data_rq(struct request *rq) +{ + return (rq->rq_flags & RQF_FLUSH_SEQ) && !is_flush_rq(rq); +} + static bool blk_mq_rq_inflight(struct request *rq, void *priv) { /* * If we find a request that isn't idle we know the queue is busy * as it's checked in the iter. * Return false to stop the iteration. - */ - if (blk_mq_request_started(rq)) { + * + * In case of queue quiesce, if one flush data request is completed, + * don't count it as inflight given the flush sequence is suspended, + * and the original flush data request is invisible to driver, just + * like other pending requests because of quiesce + */ + if (blk_mq_request_started(rq) && !(blk_queue_quiesced(rq->q) && + blk_is_flush_data_rq(rq) && + blk_mq_request_completed(rq))) { bool *busy = priv; *busy = true; @@ -2874,11 +2886,8 @@ }; struct request *rq; - if (unlikely(bio_queue_enter(bio))) - return NULL; - if (blk_mq_attempt_bio_merge(q, bio, nsegs)) - goto queue_exit; + return NULL; rq_qos_throttle(q, bio); @@ -2894,35 +2903,23 @@ rq_qos_cleanup(q, bio); if (bio->bi_opf & REQ_NOWAIT) bio_wouldblock_error(bio); -queue_exit: - blk_queue_exit(q); return NULL; } -static inline struct request *blk_mq_get_cached_request(struct request_queue *q, - struct blk_plug *plug, struct bio **bio, unsigned int nsegs) +/* return true if this @rq can be used for @bio */ +static bool blk_mq_can_use_cached_rq(struct request *rq, struct blk_plug *plug, + struct bio *bio) { - struct request *rq; - enum hctx_type type, hctx_type; + enum hctx_type type = blk_mq_get_hctx_type(bio->bi_opf); + enum hctx_type hctx_type = rq->mq_hctx->type; - if (!plug) - return NULL; - rq = rq_list_peek(&plug->cached_rq); - if (!rq || rq->q != q) - return NULL; + WARN_ON_ONCE(rq_list_peek(&plug->cached_rq) != rq); - if (blk_mq_attempt_bio_merge(q, *bio, nsegs)) { - *bio = NULL; - return NULL; - } - - type = blk_mq_get_hctx_type((*bio)->bi_opf); - hctx_type = rq->mq_hctx->type; if (type != hctx_type && !(type == HCTX_TYPE_READ && hctx_type == HCTX_TYPE_DEFAULT)) - return NULL; - if (op_is_flush(rq->cmd_flags) != op_is_flush((*bio)->bi_opf)) - return NULL; + return false; + if (op_is_flush(rq->cmd_flags) != op_is_flush(bio->bi_opf)) + return false; /* * If any qos ->throttle() end up blocking, we will have flushed the @@ -2930,12 +2927,12 @@ * before we throttle. */ plug->cached_rq = rq_list_next(rq); - rq_qos_throttle(q, *bio); + rq_qos_throttle(rq->q, bio); blk_mq_rq_time_init(rq, 0); - rq->cmd_flags = (*bio)->bi_opf; + rq->cmd_flags = bio->bi_opf; INIT_LIST_HEAD(&rq->queuelist); - return rq; + return true; } static void bio_set_ioprio(struct bio *bio) @@ -2965,7 +2962,7 @@ struct blk_plug *plug = blk_mq_plug(bio); const int is_sync = op_is_sync(bio->bi_opf); struct blk_mq_hw_ctx *hctx; - struct request *rq; + struct request *rq = NULL; unsigned int nr_segs = 1; blk_status_t ret; @@ -2976,20 +2973,36 @@ return; } - if (!bio_integrity_prep(bio)) - return; - bio_set_ioprio(bio); - rq = blk_mq_get_cached_request(q, plug, &bio, nr_segs); - if (!rq) { - if (!bio) + if (plug) { + rq = rq_list_peek(&plug->cached_rq); + if (rq && rq->q != q) + rq = NULL; + } + if (rq) { + if (!bio_integrity_prep(bio)) return; - rq = blk_mq_get_new_requests(q, plug, bio, nr_segs); - if (unlikely(!rq)) + if (blk_mq_attempt_bio_merge(q, bio, nr_segs)) return; + if (blk_mq_can_use_cached_rq(rq, plug, bio)) + goto done; + percpu_ref_get(&q->q_usage_counter); + } else { + if (unlikely(bio_queue_enter(bio))) + return; + if (!bio_integrity_prep(bio)) + goto fail; } + rq = blk_mq_get_new_requests(q, plug, bio, nr_segs); + if (unlikely(!rq)) { +fail: + blk_queue_exit(q); + return; + } + +done: trace_block_getrq(bio); rq_qos_track(q, rq, bio); @@ -4402,6 +4415,7 @@ int new_nr_hw_queues) { struct blk_mq_tags **new_tags; + int i; if (set->nr_hw_queues >= new_nr_hw_queues) goto done; @@ -4416,6 +4430,16 @@ sizeof(*set->tags)); kfree(set->tags); set->tags = new_tags; + + for (i = set->nr_hw_queues; i < new_nr_hw_queues; i++) { + if (!__blk_mq_alloc_map_and_rqs(set, i)) { + while (--i >= set->nr_hw_queues) + __blk_mq_free_map_and_rqs(set, i); + return -ENOMEM; + } + cond_resched(); + } + done: set->nr_hw_queues = new_nr_hw_queues; return 0; @@ -4704,7 +4728,8 @@ { struct request_queue *q; LIST_HEAD(head); - int prev_nr_hw_queues; + int prev_nr_hw_queues = set->nr_hw_queues; + int i; lockdep_assert_held(&set->tag_list_lock); @@ -4731,7 +4756,6 @@ blk_mq_sysfs_unregister_hctxs(q); } - prev_nr_hw_queues = set->nr_hw_queues; if (blk_mq_realloc_tag_set_tags(set, nr_hw_queues) < 0) goto reregister; @@ -4767,6 +4791,10 @@ list_for_each_entry(q, &set->tag_list, tag_set_list) blk_mq_unfreeze_queue(q); + + /* Free the excess tags when nr_hw_queues shrink. */ + for (i = set->nr_hw_queues; i < prev_nr_hw_queues; i++) + __blk_mq_free_map_and_rqs(set, i); } void blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, int nr_hw_queues) --- linux-azure-6.5.0.orig/block/blk-settings.c +++ linux-azure-6.5.0/block/blk-settings.c @@ -830,10 +830,13 @@ */ void blk_queue_write_cache(struct request_queue *q, bool wc, bool fua) { - if (wc) + if (wc) { + blk_queue_flag_set(QUEUE_FLAG_HW_WC, q); blk_queue_flag_set(QUEUE_FLAG_WC, q); - else + } else { + blk_queue_flag_clear(QUEUE_FLAG_HW_WC, q); blk_queue_flag_clear(QUEUE_FLAG_WC, q); + } if (fua) blk_queue_flag_set(QUEUE_FLAG_FUA, q); else --- linux-azure-6.5.0.orig/block/blk-sysfs.c +++ linux-azure-6.5.0/block/blk-sysfs.c @@ -449,21 +449,16 @@ static ssize_t queue_wc_store(struct request_queue *q, const char *page, size_t count) { - int set = -1; - - if (!strncmp(page, "write back", 10)) - set = 1; - else if (!strncmp(page, "write through", 13) || - !strncmp(page, "none", 4)) - set = 0; - - if (set == -1) - return -EINVAL; - - if (set) + if (!strncmp(page, "write back", 10)) { + if (!test_bit(QUEUE_FLAG_HW_WC, &q->queue_flags)) + return -EINVAL; blk_queue_flag_set(QUEUE_FLAG_WC, q); - else + } else if (!strncmp(page, "write through", 13) || + !strncmp(page, "none", 4)) { blk_queue_flag_clear(QUEUE_FLAG_WC, q); + } else { + return -EINVAL; + } return count; } --- linux-azure-6.5.0.orig/block/blk-throttle.c +++ linux-azure-6.5.0/block/blk-throttle.c @@ -697,11 +697,47 @@ return true; } +static unsigned int calculate_io_allowed(u32 iops_limit, + unsigned long jiffy_elapsed) +{ + unsigned int io_allowed; + u64 tmp; + + /* + * jiffy_elapsed should not be a big value as minimum iops can be + * 1 then at max jiffy elapsed should be equivalent of 1 second as we + * will allow dispatch after 1 second and after that slice should + * have been trimmed. + */ + + tmp = (u64)iops_limit * jiffy_elapsed; + do_div(tmp, HZ); + + if (tmp > UINT_MAX) + io_allowed = UINT_MAX; + else + io_allowed = tmp; + + return io_allowed; +} + +static u64 calculate_bytes_allowed(u64 bps_limit, unsigned long jiffy_elapsed) +{ + /* + * Can result be wider than 64 bits? + * We check against 62, not 64, due to ilog2 truncation. + */ + if (ilog2(bps_limit) + ilog2(jiffy_elapsed) - ilog2(HZ) > 62) + return U64_MAX; + return mul_u64_u64_div_u64(bps_limit, (u64)jiffy_elapsed, (u64)HZ); +} + /* Trim the used slices and adjust slice start accordingly */ static inline void throtl_trim_slice(struct throtl_grp *tg, bool rw) { - unsigned long nr_slices, time_elapsed, io_trim; - u64 bytes_trim, tmp; + unsigned long time_elapsed; + long long bytes_trim; + int io_trim; BUG_ON(time_before(tg->slice_end[rw], tg->slice_start[rw])); @@ -723,67 +759,38 @@ throtl_set_slice_end(tg, rw, jiffies + tg->td->throtl_slice); - time_elapsed = jiffies - tg->slice_start[rw]; - - nr_slices = time_elapsed / tg->td->throtl_slice; - - if (!nr_slices) + time_elapsed = rounddown(jiffies - tg->slice_start[rw], + tg->td->throtl_slice); + if (!time_elapsed) return; - tmp = tg_bps_limit(tg, rw) * tg->td->throtl_slice * nr_slices; - do_div(tmp, HZ); - bytes_trim = tmp; - io_trim = (tg_iops_limit(tg, rw) * tg->td->throtl_slice * nr_slices) / - HZ; - - if (!bytes_trim && !io_trim) + bytes_trim = calculate_bytes_allowed(tg_bps_limit(tg, rw), + time_elapsed) + + tg->carryover_bytes[rw]; + io_trim = calculate_io_allowed(tg_iops_limit(tg, rw), time_elapsed) + + tg->carryover_ios[rw]; + if (bytes_trim <= 0 && io_trim <= 0) return; - if (tg->bytes_disp[rw] >= bytes_trim) + tg->carryover_bytes[rw] = 0; + if ((long long)tg->bytes_disp[rw] >= bytes_trim) tg->bytes_disp[rw] -= bytes_trim; else tg->bytes_disp[rw] = 0; - if (tg->io_disp[rw] >= io_trim) + tg->carryover_ios[rw] = 0; + if ((int)tg->io_disp[rw] >= io_trim) tg->io_disp[rw] -= io_trim; else tg->io_disp[rw] = 0; - tg->slice_start[rw] += nr_slices * tg->td->throtl_slice; + tg->slice_start[rw] += time_elapsed; throtl_log(&tg->service_queue, - "[%c] trim slice nr=%lu bytes=%llu io=%lu start=%lu end=%lu jiffies=%lu", - rw == READ ? 'R' : 'W', nr_slices, bytes_trim, io_trim, - tg->slice_start[rw], tg->slice_end[rw], jiffies); -} - -static unsigned int calculate_io_allowed(u32 iops_limit, - unsigned long jiffy_elapsed) -{ - unsigned int io_allowed; - u64 tmp; - - /* - * jiffy_elapsed should not be a big value as minimum iops can be - * 1 then at max jiffy elapsed should be equivalent of 1 second as we - * will allow dispatch after 1 second and after that slice should - * have been trimmed. - */ - - tmp = (u64)iops_limit * jiffy_elapsed; - do_div(tmp, HZ); - - if (tmp > UINT_MAX) - io_allowed = UINT_MAX; - else - io_allowed = tmp; - - return io_allowed; -} - -static u64 calculate_bytes_allowed(u64 bps_limit, unsigned long jiffy_elapsed) -{ - return mul_u64_u64_div_u64(bps_limit, (u64)jiffy_elapsed, (u64)HZ); + "[%c] trim slice nr=%lu bytes=%lld io=%d start=%lu end=%lu jiffies=%lu", + rw == READ ? 'R' : 'W', time_elapsed / tg->td->throtl_slice, + bytes_trim, io_trim, tg->slice_start[rw], tg->slice_end[rw], + jiffies); } static void __tg_update_carryover(struct throtl_grp *tg, bool rw) @@ -1314,6 +1321,7 @@ tg_bps_limit(tg, READ), tg_bps_limit(tg, WRITE), tg_iops_limit(tg, READ), tg_iops_limit(tg, WRITE)); + rcu_read_lock(); /* * Update has_rules[] flags for the updated tg's subtree. A tg is * considered to have rules if either the tg itself or any of its @@ -1341,6 +1349,7 @@ this_tg->latency_target = max(this_tg->latency_target, parent_tg->latency_target); } + rcu_read_unlock(); /* * We're already holding queue_lock and know @tg is valid. Let's --- linux-azure-6.5.0.orig/block/blk.h +++ linux-azure-6.5.0/block/blk.h @@ -76,6 +76,10 @@ gfp_t gfp_mask); void bvec_free(mempool_t *pool, struct bio_vec *bv, unsigned short nr_vecs); +bool bvec_try_merge_hw_page(struct request_queue *q, struct bio_vec *bv, + struct page *page, unsigned len, unsigned offset, + bool *same_page); + static inline bool biovec_phys_mergeable(struct request_queue *q, struct bio_vec *vec1, struct bio_vec *vec2) { --- linux-azure-6.5.0.orig/block/fops.c +++ linux-azure-6.5.0/block/fops.c @@ -659,24 +659,35 @@ filemap_invalidate_lock(inode->i_mapping); - /* Invalidate the page cache, including dirty pages. */ - error = truncate_bdev_range(bdev, file_to_blk_mode(file), start, end); - if (error) - goto fail; - + /* + * Invalidate the page cache, including dirty pages, for valid + * de-allocate mode calls to fallocate(). + */ switch (mode) { case FALLOC_FL_ZERO_RANGE: case FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE: + error = truncate_bdev_range(bdev, file_to_blk_mode(file), start, end); + if (error) + goto fail; + error = blkdev_issue_zeroout(bdev, start >> SECTOR_SHIFT, len >> SECTOR_SHIFT, GFP_KERNEL, BLKDEV_ZERO_NOUNMAP); break; case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE: + error = truncate_bdev_range(bdev, file_to_blk_mode(file), start, end); + if (error) + goto fail; + error = blkdev_issue_zeroout(bdev, start >> SECTOR_SHIFT, len >> SECTOR_SHIFT, GFP_KERNEL, BLKDEV_ZERO_NOFALLBACK); break; case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | FALLOC_FL_NO_HIDE_STALE: + error = truncate_bdev_range(bdev, file_to_blk_mode(file), start, end); + if (error) + goto fail; + error = blkdev_issue_discard(bdev, start >> SECTOR_SHIFT, len >> SECTOR_SHIFT, GFP_KERNEL); break; --- linux-azure-6.5.0.orig/block/mq-deadline.c +++ linux-azure-6.5.0/block/mq-deadline.c @@ -646,8 +646,9 @@ struct request_queue *q = hctx->queue; struct deadline_data *dd = q->elevator->elevator_data; struct blk_mq_tags *tags = hctx->sched_tags; + unsigned int shift = tags->bitmap_tags.sb.shift; - dd->async_depth = max(1UL, 3 * q->nr_requests / 4); + dd->async_depth = max(1U, 3 * (1U << shift) / 4); sbitmap_queue_min_shallow_depth(&tags->bitmap_tags, dd->async_depth); } --- linux-azure-6.5.0.orig/block/partitions/core.c +++ linux-azure-6.5.0/block/partitions/core.c @@ -461,6 +461,11 @@ goto out; } + if (disk->flags & GENHD_FL_NO_PART) { + ret = -EINVAL; + goto out; + } + if (partition_overlaps(disk, start, length, -1)) { ret = -EBUSY; goto out; --- linux-azure-6.5.0.orig/certs/blacklist.c +++ linux-azure-6.5.0/certs/blacklist.c @@ -276,6 +276,9 @@ if (IS_ERR(key)) { pr_err("Problem with revocation key (%ld)\n", PTR_ERR(key)); return PTR_ERR(key); + } else { + pr_notice("Revoked X.509 cert '%s'\n", + key_ref_to_ptr(key)->description); } return 0; --- linux-azure-6.5.0.orig/crypto/aegis128-neon-inner.c +++ linux-azure-6.5.0/crypto/aegis128-neon-inner.c @@ -148,8 +148,8 @@ kiv, vld1q_u8(const1), vld1q_u8(const0), - k ^ vld1q_u8(const0), - k ^ vld1q_u8(const1), + (uint8x16_t) (k ^ vld1q_u8(const0)), + (uint8x16_t) (k ^ vld1q_u8(const1)), }}; int i; --- linux-azure-6.5.0.orig/crypto/af_alg.c +++ linux-azure-6.5.0/crypto/af_alg.c @@ -320,18 +320,21 @@ if (IS_ERR(ret)) { up_read(&key->sem); + key_put(key); return PTR_ERR(ret); } key_data = sock_kmalloc(&ask->sk, key_datalen, GFP_KERNEL); if (!key_data) { up_read(&key->sem); + key_put(key); return -ENOMEM; } memcpy(key_data, ret, key_datalen); up_read(&key->sem); + key_put(key); err = type->setkey(ask->private, key_data, key_datalen); @@ -1192,6 +1195,7 @@ areq->areqlen = areqlen; areq->sk = sk; + areq->first_rsgl.sgl.sgt.sgl = areq->first_rsgl.sgl.sgl; areq->last_rsgl = NULL; INIT_LIST_HEAD(&areq->rsgl_list); areq->tsgl = NULL; --- linux-azure-6.5.0.orig/crypto/algapi.c +++ linux-azure-6.5.0/crypto/algapi.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "internal.h" @@ -74,15 +75,26 @@ inst->alg.cra_type->free(inst); } -static void crypto_destroy_instance(struct crypto_alg *alg) +static void crypto_destroy_instance_workfn(struct work_struct *w) { - struct crypto_instance *inst = (void *)alg; + struct crypto_instance *inst = container_of(w, struct crypto_instance, + free_work); struct crypto_template *tmpl = inst->tmpl; crypto_free_instance(inst); crypto_tmpl_put(tmpl); } +static void crypto_destroy_instance(struct crypto_alg *alg) +{ + struct crypto_instance *inst = container_of(alg, + struct crypto_instance, + alg); + + INIT_WORK(&inst->free_work, crypto_destroy_instance_workfn); + schedule_work(&inst->free_work); +} + /* * This function adds a spawn to the list secondary_spawns which * will be used at the end of crypto_remove_spawns to unregister --- linux-azure-6.5.0.orig/crypto/asymmetric_keys/Kconfig +++ linux-azure-6.5.0/crypto/asymmetric_keys/Kconfig @@ -76,7 +76,7 @@ signed PE binary. config FIPS_SIGNATURE_SELFTEST - bool "Run FIPS selftests on the X.509+PKCS7 signature verification" + tristate "Run FIPS selftests on the X.509+PKCS7 signature verification" help This option causes some selftests to be run on the signature verification code, using some built in data. This is required @@ -84,5 +84,6 @@ depends on KEYS depends on ASYMMETRIC_KEY_TYPE depends on PKCS7_MESSAGE_PARSER=X509_CERTIFICATE_PARSER + depends on X509_CERTIFICATE_PARSER endif # ASYMMETRIC_KEY_TYPE --- linux-azure-6.5.0.orig/crypto/asymmetric_keys/Makefile +++ linux-azure-6.5.0/crypto/asymmetric_keys/Makefile @@ -22,7 +22,8 @@ x509_cert_parser.o \ x509_loader.o \ x509_public_key.o -x509_key_parser-$(CONFIG_FIPS_SIGNATURE_SELFTEST) += selftest.o +obj-$(CONFIG_FIPS_SIGNATURE_SELFTEST) += x509_selftest.o +x509_selftest-y += selftest.o $(obj)/x509_cert_parser.o: \ $(obj)/x509.asn1.h \ --- linux-azure-6.5.0.orig/crypto/asymmetric_keys/public_key.c +++ linux-azure-6.5.0/crypto/asymmetric_keys/public_key.c @@ -81,14 +81,13 @@ * RSA signatures usually use EMSA-PKCS1-1_5 [RFC3447 sec 8.2]. */ if (strcmp(encoding, "pkcs1") == 0) { + *sig = op == kernel_pkey_sign || + op == kernel_pkey_verify; if (!hash_algo) { - *sig = false; n = snprintf(alg_name, CRYPTO_MAX_ALG_NAME, "pkcs1pad(%s)", pkey->pkey_algo); } else { - *sig = op == kernel_pkey_sign || - op == kernel_pkey_verify; n = snprintf(alg_name, CRYPTO_MAX_ALG_NAME, "pkcs1pad(%s,%s)", pkey->pkey_algo, hash_algo); --- linux-azure-6.5.0.orig/crypto/asymmetric_keys/selftest.c +++ linux-azure-6.5.0/crypto/asymmetric_keys/selftest.c @@ -4,10 +4,11 @@ * Written by David Howells (dhowells@redhat.com) */ -#include +#include #include +#include #include -#include +#include #include "x509_parser.h" struct certs_test { @@ -175,7 +176,7 @@ TEST(certs_selftest_1_data, certs_selftest_1_pkcs7), }; -int __init fips_signature_selftest(void) +static int __init fips_signature_selftest(void) { struct key *keyring; int ret, i; @@ -222,3 +223,9 @@ key_put(keyring); return 0; } + +late_initcall(fips_signature_selftest); + +MODULE_DESCRIPTION("X.509 self tests"); +MODULE_AUTHOR("Red Hat, Inc."); +MODULE_LICENSE("GPL"); --- linux-azure-6.5.0.orig/crypto/asymmetric_keys/x509_loader.c +++ linux-azure-6.5.0/crypto/asymmetric_keys/x509_loader.c @@ -41,6 +41,7 @@ if (IS_ERR(key)) { pr_err("Problem loading in-kernel X.509 certificate (%ld)\n", PTR_ERR(key)); + WARN_ON_ONCE(1); } else { pr_notice("Loaded X.509 cert '%s'\n", key_ref_to_ptr(key)->description); --- linux-azure-6.5.0.orig/crypto/asymmetric_keys/x509_parser.h +++ linux-azure-6.5.0/crypto/asymmetric_keys/x509_parser.h @@ -41,15 +41,6 @@ }; /* - * selftest.c - */ -#ifdef CONFIG_FIPS_SIGNATURE_SELFTEST -extern int __init fips_signature_selftest(void); -#else -static inline int fips_signature_selftest(void) { return 0; } -#endif - -/* * x509_cert_parser.c */ extern void x509_free_certificate(struct x509_certificate *cert); --- linux-azure-6.5.0.orig/crypto/asymmetric_keys/x509_public_key.c +++ linux-azure-6.5.0/crypto/asymmetric_keys/x509_public_key.c @@ -130,6 +130,11 @@ goto out; } + if (cert->unsupported_sig) { + ret = 0; + goto out; + } + ret = public_key_verify_signature(cert->pub, cert->sig); if (ret < 0) { if (ret == -ENOPKG) { @@ -257,15 +262,9 @@ /* * Module stuff */ -extern int __init certs_selftest(void); static int __init x509_key_init(void) { - int ret; - - ret = register_asymmetric_key_parser(&x509_key_parser); - if (ret < 0) - return ret; - return fips_signature_selftest(); + return register_asymmetric_key_parser(&x509_key_parser); } static void __exit x509_key_exit(void) --- linux-azure-6.5.0.orig/crypto/lrw.c +++ linux-azure-6.5.0/crypto/lrw.c @@ -357,10 +357,10 @@ * cipher name. */ if (!strncmp(cipher_name, "ecb(", 4)) { - unsigned len; + int len; - len = strlcpy(ecb_name, cipher_name + 4, sizeof(ecb_name)); - if (len < 2 || len >= sizeof(ecb_name)) + len = strscpy(ecb_name, cipher_name + 4, sizeof(ecb_name)); + if (len < 2) goto err_free_inst; if (ecb_name[len - 1] != ')') --- linux-azure-6.5.0.orig/crypto/pcrypt.c +++ linux-azure-6.5.0/crypto/pcrypt.c @@ -117,6 +117,8 @@ err = padata_do_parallel(ictx->psenc, padata, &ctx->cb_cpu); if (!err) return -EINPROGRESS; + if (err == -EBUSY) + return -EAGAIN; return err; } @@ -164,6 +166,8 @@ err = padata_do_parallel(ictx->psdec, padata, &ctx->cb_cpu); if (!err) return -EINPROGRESS; + if (err == -EBUSY) + return -EAGAIN; return err; } --- linux-azure-6.5.0.orig/crypto/sm2.c +++ linux-azure-6.5.0/crypto/sm2.c @@ -278,10 +278,14 @@ if (!ec) return -ENOMEM; - err = __sm2_set_pub_key(ec, key, keylen); + err = sm2_ec_ctx_init(ec); if (err) goto out_free_ec; + err = __sm2_set_pub_key(ec, key, keylen); + if (err) + goto out_deinit_ec; + bits_len = SM2_DEFAULT_USERID_LEN * 8; entl[0] = bits_len >> 8; entl[1] = bits_len & 0xff; --- linux-azure-6.5.0.orig/crypto/xts.c +++ linux-azure-6.5.0/crypto/xts.c @@ -28,7 +28,7 @@ struct xts_instance_ctx { struct crypto_skcipher_spawn spawn; - char name[CRYPTO_MAX_ALG_NAME]; + struct crypto_cipher_spawn tweak_spawn; }; struct xts_request_ctx { @@ -306,7 +306,7 @@ ctx->child = child; - tweak = crypto_alloc_cipher(ictx->name, 0, 0); + tweak = crypto_spawn_cipher(&ictx->tweak_spawn); if (IS_ERR(tweak)) { crypto_free_skcipher(ctx->child); return PTR_ERR(tweak); @@ -333,11 +333,13 @@ struct xts_instance_ctx *ictx = skcipher_instance_ctx(inst); crypto_drop_skcipher(&ictx->spawn); + crypto_drop_cipher(&ictx->tweak_spawn); kfree(inst); } static int xts_create(struct crypto_template *tmpl, struct rtattr **tb) { + char name[CRYPTO_MAX_ALG_NAME]; struct skcipher_instance *inst; struct xts_instance_ctx *ctx; struct skcipher_alg *alg; @@ -363,13 +365,13 @@ cipher_name, 0, mask); if (err == -ENOENT) { err = -ENAMETOOLONG; - if (snprintf(ctx->name, CRYPTO_MAX_ALG_NAME, "ecb(%s)", + if (snprintf(name, CRYPTO_MAX_ALG_NAME, "ecb(%s)", cipher_name) >= CRYPTO_MAX_ALG_NAME) goto err_free_inst; err = crypto_grab_skcipher(&ctx->spawn, skcipher_crypto_instance(inst), - ctx->name, 0, mask); + name, 0, mask); } if (err) @@ -396,25 +398,30 @@ * cipher name. */ if (!strncmp(cipher_name, "ecb(", 4)) { - unsigned len; + int len; - len = strlcpy(ctx->name, cipher_name + 4, sizeof(ctx->name)); - if (len < 2 || len >= sizeof(ctx->name)) + len = strscpy(name, cipher_name + 4, sizeof(name)); + if (len < 2) goto err_free_inst; - if (ctx->name[len - 1] != ')') + if (name[len - 1] != ')') goto err_free_inst; - ctx->name[len - 1] = 0; + name[len - 1] = 0; if (snprintf(inst->alg.base.cra_name, CRYPTO_MAX_ALG_NAME, - "xts(%s)", ctx->name) >= CRYPTO_MAX_ALG_NAME) { + "xts(%s)", name) >= CRYPTO_MAX_ALG_NAME) { err = -ENAMETOOLONG; goto err_free_inst; } } else goto err_free_inst; + err = crypto_grab_cipher(&ctx->tweak_spawn, + skcipher_crypto_instance(inst), name, 0, mask); + if (err) + goto err_free_inst; + inst->alg.base.cra_priority = alg->base.cra_priority; inst->alg.base.cra_blocksize = XTS_BLOCK_SIZE; inst->alg.base.cra_alignmask = alg->base.cra_alignmask | --- linux-azure-6.5.0.orig/debian.azure/changelog +++ linux-azure-6.5.0/debian.azure/changelog @@ -0,0 +1,10915 @@ +linux-azure (6.5.0-1018.19) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1018.19 -proposed tracker (LP: #2055566) + + * linux: please move erofs.ko (CONFIG_EROFS for EROFS support) from linux- + modules-extra to linux-modules (LP: #2054809) + - UBUNTU [Packaging]: Azure: Include erofs in linux-modules instead of linux- + modules-extra + + * Packaging resync (LP: #1786013) + - [Packaging] drop ABI data + - debian.azure/dkms-versions -- update from kernel-versions (main/2024.03.04) + + * Azure: hv: hyperv.h: Replace one-element array with flexible-array member + (LP: #2057936) + - hv: hyperv.h: Replace one-element array with flexible-array member + + [ Ubuntu: 6.5.0-27.28 ] + + * mantic/linux: 6.5.0-27.28 -proposed tracker (LP: #2055584) + * Packaging resync (LP: #1786013) + - [Packaging] drop ABI data + - [Packaging] update annotations scripts + - debian.master/dkms-versions -- update from kernel-versions (main/2024.03.04) + * CVE-2024-26597 + - net: qualcomm: rmnet: fix global oob in rmnet_policy + * CVE-2024-26599 + - pwm: Fix out-of-bounds access in of_pwm_single_xlate() + * Drop ABI checks from kernel build (LP: #2055686) + - [Packaging] Remove in-tree abi checks + * Cranky update-dkms-versions rollout (LP: #2055685) + - [Packaging] remove update-dkms-versions + - Move debian/dkms-versions to debian.master/dkms-versions + - [Packaging] Replace debian/dkms-versions with $(DEBIAN)/dkms-versions + * linux: please move erofs.ko (CONFIG_EROFS for EROFS support) from linux- + modules-extra to linux-modules (LP: #2054809) + - UBUNTU [Packaging]: Include erofs in linux-modules instead of linux-modules- + extra + * performance: Scheduler: ratelimit updating of load_avg (LP: #2053251) + - sched/fair: Ratelimit update to tg->load_avg + * IB peer memory feature regressed in 6.5 (LP: #2055082) + - SAUCE: RDMA/core: Introduce peer memory interface + * linux-tools-common: man page of usbip[d] is misplaced (LP: #2054094) + - [Packaging] rules: Put usbip manpages in the correct directory + * CVE-2024-23851 + - dm: limit the number of targets and parameter size area + * CVE-2024-23850 + - btrfs: do not ASSERT() if the newly created subvolume already got read + * x86: performance: tsc: Extend watchdog check exemption to 4-Sockets platform + (LP: #2054699) + - x86/tsc: Extend watchdog check exemption to 4-Sockets platform + * linux: please move dmi-sysfs.ko (CONFIG_DMI_SYSFS for SMBIOS support) from + linux-modules-extra to linux-modules (LP: #2045561) + - [Packaging] Move dmi-sysfs.ko into linux-modules + * Fix AMD brightness issue on AUO panel (LP: #2054773) + - drm/amdgpu: make damage clips support configurable + * Mantic update: upstream stable patchset 2024-02-28 (LP: #2055199) + - f2fs: explicitly null-terminate the xattr list + - pinctrl: lochnagar: Don't build on MIPS + - ALSA: hda - Fix speaker and headset mic pin config for CHUWI CoreBook XPro + - mptcp: fix uninit-value in mptcp_incoming_options + - wifi: cfg80211: lock wiphy mutex for rfkill poll + - wifi: avoid offset calculation on NULL pointer + - wifi: mac80211: handle 320 MHz in ieee80211_ht_cap_ie_to_sta_ht_cap + - debugfs: fix automount d_fsdata usage + - nvme-core: fix a memory leak in nvme_ns_info_from_identify() + - drm/amd/display: update dcn315 lpddr pstate latency + - drm/amdgpu: Fix cat debugfs amdgpu_regs_didt causes kernel null pointer + - smb: client, common: fix fortify warnings + - blk-mq: don't count completed flush data request as inflight in case of + quiesce + - nvme-core: check for too small lba shift + - hwtracing: hisi_ptt: Handle the interrupt in hardirq context + - hwtracing: hisi_ptt: Don't try to attach a task + - ASoC: wm8974: Correct boost mixer inputs + - arm64: dts: rockchip: fix rk356x pcie msg interrupt name + - ASoC: Intel: Skylake: Fix mem leak in few functions + - ASoC: nau8822: Fix incorrect type in assignment and cast to restricted + __be16 + - ASoC: Intel: Skylake: mem leak in skl register function + - ASoC: cs43130: Fix the position of const qualifier + - ASoC: cs43130: Fix incorrect frame delay configuration + - ASoC: rt5650: add mutex to avoid the jack detection failure + - ASoC: Intel: skl_hda_dsp_generic: Drop HDMI routes when HDMI is not + available + - nouveau/tu102: flush all pdbs on vmm flush + - ASoC: amd: yc: Add DMI entry to support System76 Pangolin 13 + - ASoC: hdac_hda: Conditionally register dais for HDMI and Analog + - net/tg3: fix race condition in tg3_reset_task() + - ASoC: da7219: Support low DC impedance headset + - nvme: introduce helper function to get ctrl state + - nvme: prevent potential spectre v1 gadget + - arm64: dts: rockchip: Fix PCI node addresses on rk3399-gru + - drm/amdgpu: Add NULL checks for function pointers + - drm/exynos: fix a potential error pointer dereference + - drm/exynos: fix a wrong error checking + - hwmon: (corsair-psu) Fix probe when built-in + - LoongArch: Preserve syscall nr across execve() + - clk: rockchip: rk3568: Add PLL rate for 292.5MHz + - clk: rockchip: rk3128: Fix HCLK_OTG gate register + - jbd2: correct the printing of write_flags in jbd2_write_superblock() + - jbd2: increase the journal IO's priority + - drm/crtc: Fix uninit-value bug in drm_mode_setcrtc + - neighbour: Don't let neigh_forced_gc() disable preemption for long + - platform/x86: intel-vbtn: Fix missing tablet-mode-switch events + - jbd2: fix soft lockup in journal_finish_inode_data_buffers() + - tracing: Have large events show up as '[LINE TOO BIG]' instead of nothing + - tracing: Add size check when printing trace_marker output + - stmmac: dwmac-loongson: drop useless check for compatible fallback + - MIPS: dts: loongson: drop incorrect dwmac fallback compatible + - tracing: Fix uaf issue when open the hist or hist_debug file + - ring-buffer: Do not record in NMI if the arch does not support cmpxchg in + NMI + - Input: psmouse - enable Synaptics InterTouch for ThinkPad L14 G1 + - reset: hisilicon: hi6220: fix Wvoid-pointer-to-enum-cast warning + - Input: atkbd - skip ATKBD_CMD_GETID in translated mode + - Input: i8042 - add nomux quirk for Acer P459-G2-M + - s390/scm: fix virtual vs physical address confusion + - ARC: fix spare error + - wifi: iwlwifi: pcie: avoid a NULL pointer dereference + - Input: xpad - add Razer Wolverine V2 support + - kselftest: alsa: fixed a print formatting warning + - HID: nintendo: fix initializer element is not constant error + - platform/x86: thinkpad_acpi: fix for incorrect fan reporting on some + ThinkPad systems + - ASoC: Intel: bytcr_rt5640: Add quirk for the Medion Lifetab S10346 + - ASoC: Intel: bytcr_rt5640: Add new swapped-speakers quirk + - ALSA: hda/realtek: Add quirks for ASUS Zenbook 2022 Models + - dm audit: fix Kconfig so DM_AUDIT depends on BLK_DEV_DM + - HID: nintendo: Prevent divide-by-zero on code + - smb: client: fix potential OOB in smb2_dump_detail() + - i2c: rk3x: fix potential spinlock recursion on poll + - drm/amd/display: get dprefclk ss info from integration info table + - pinctrl: cy8c95x0: Fix typo + - pinctrl: cy8c95x0: Fix get_pincfg + - virtio_blk: fix snprintf truncation compiler warning + - net: qrtr: ns: Return 0 if server port is not present + - ARM: sun9i: smp: fix return code check of of_property_match_string + - drm/crtc: fix uninitialized variable use + - ALSA: hda/realtek: Fix mute and mic-mute LEDs for HP Envy X360 13-ay0xxx + - ACPI: resource: Add another DMI match for the TongFang GMxXGxx + - ASoC: SOF: Intel: hda-codec: Delay the codec device registration + - ksmbd: don't allow O_TRUNC open on read-only share + - ksmbd: free ppace array on error in parse_dacl + - binder: use EPOLLERR from eventpoll.h + - binder: fix use-after-free in shinker's callback + - binder: fix trivial typo of binder_free_buf_locked() + - binder: fix comment on binder_alloc_new_buf() return value + - uio: Fix use-after-free in uio_open + - parport: parport_serial: Add Brainboxes BAR details + - parport: parport_serial: Add Brainboxes device IDs and geometry + - leds: ledtrig-tty: Free allocated ttyname buffer on deactivate + - PCI: Add ACS quirk for more Zhaoxin Root Ports + - coresight: etm4x: Fix width of CCITMIN field + - scripts/decode_stacktrace.sh: optionally use LLVM utilities + - pinctrl: s32cc: Avoid possible string truncation + - kunit: Warn if tests are slow + - kunit: Reset suite counter right before running tests + - io_uring: use fget/fput consistently + - block: warn once for each partition in bio_check_ro() + - drm/amdkfd: Use common function for IP version check + - drm/amdkfd: Free gang_ctx_bo and wptr_bo in pqm_uninit + - drm/amdgpu: Use another offset for GC 9.4.3 remap + - ASoC: amd: yc: Add HP 255 G10 into quirk table + - ASoC: SOF: topology: Fix mem leak in sof_dai_load() + - ASoC: fsl_xcvr: Enable 2 * TX bit clock for spdif only case + - ASoC: fsl_xcvr: refine the requested phy clock frequency + - ASoC: SOF: ipc4-topology: Add core_mask in struct snd_sof_pipeline + - ASoC: SOF: sof-audio: Modify logic for enabling/disabling topology cores + - ASoC: SOF: ipc4-topology: Correct data structures for the SRC module + - ASoC: SOF: ipc4-topology: Correct data structures for the GAIN module + - pds_vdpa: fix up format-truncation complaint + - pds_vdpa: clear config callback when status goes to 0 + - pds_vdpa: set features order + - nvme: ensure reset state check ordering + - nvme-ioctl: move capable() admin check to the end + - nvme: fix deadlock between reset and scan + - LoongArch: Apply dynamic relocations for LLD + - LoongArch: Set unwind stack type to unknown rather than set error flag + - soundwire: intel_ace2x: fix AC timing setting for ACE2.x + - efi/loongarch: Use load address to calculate kernel entry address + - pinctrl: amd: Mask non-wake source pins with interrupt enabled at suspend + - ASoC: cs35l45: Use modern pm_ops + - ASoC: cs35l45: Prevent IRQ handling when suspending/resuming + - ASoC: cs35l45: Prevents spinning during runtime suspend + - driver core: Add a guard() definition for the device_lock() + - platform/x86/amd/pmc: Move platform defines to header + - platform/x86/amd/pmc: Only run IRQ1 firmware version check on Cezanne + - platform/x86/amd/pmc: Move keyboard wakeup disablement detection to pmc- + quirks + - platform/x86/amd/pmc: Disable keyboard wakeup on AMD Framework 13 + - drm/amdkfd: svm range always mapped flag not working on APU + - drm/amd/display: Add case for dcn35 to support usb4 dmub hpd event + - pinctrl: cy8c95x0: Fix regression + - posix-timers: Get rid of [COMPAT_]SYS_NI() uses + - nfc: Do not send datagram if socket state isn't LLCP_BOUND + - x86/csum: Remove unnecessary odd handling + - x86/csum: clean up `csum_partial' further + - x86/microcode: do not cache microcode if it will not be used + - bus: moxtet: Mark the irq as shared + - bus: moxtet: Add spi device table + - drm/amd/display: Pass pwrseq inst for backlight and ABM + - Upstream stable to v6.1.74, v6.6.13 + * Mantic update: upstream stable patchset 2024-02-27 (LP: #2055002) + - Revert "nfsd: call nfsd_last_thread() before final nfsd_put()" + - cifs: fix flushing folio regression for 6.1 backport + - Upstream stable to v6.1.73, v6.6.12 + * Mantic update: upstream stable patchset 2024-02-26 (LP: #2054779) + - keys, dns: Fix missing size check of V1 server-list header + - ALSA: hda/realtek: enable SND_PCI_QUIRK for hp pavilion 14-ec1xxx series + - ALSA: hda/realtek: fix mute/micmute LEDs for a HP ZBook + - ALSA: hda/realtek: Fix mute and mic-mute LEDs for HP ProBook 440 G6 + - mptcp: prevent tcp diag from closing listener subflows + - Revert "PCI/ASPM: Remove pcie_aspm_pm_state_change()" + - drm/mgag200: Fix gamma lut not initialized for G200ER, G200EV, G200SE + - cifs: cifs_chan_is_iface_active should be called with chan_lock held + - cifs: do not depend on release_iface for maintaining iface_list + - wifi: iwlwifi: pcie: don't synchronize IRQs from IRQ + - drm/bridge: ti-sn65dsi86: Never store more than msg->size bytes in AUX xfer + - netfilter: nf_tables: set transport offset from mac header for netdev/egress + - nfc: llcp_core: Hold a ref to llcp_local->dev when holding a ref to + llcp_local + - octeontx2-af: Fix marking couple of structure as __packed + - drm/i915/dp: Fix passing the correct DPCD_REV for + drm_dp_set_phy_test_pattern + - ice: Fix link_down_on_close message + - ice: Shut down VSI with "link-down-on-close" enabled + - i40e: Fix filter input checks to prevent config with invalid values + - igc: Report VLAN EtherType matching back to user + - igc: Check VLAN TCI mask + - igc: Check VLAN EtherType mask + - ASoC: fsl_rpmsg: Fix error handler with pm_runtime_enable + - ASoC: mediatek: mt8186: fix AUD_PAD_TOP register and offset + - mlxbf_gige: fix receive packet race condition + - net: sched: em_text: fix possible memory leak in em_text_destroy() + - r8169: Fix PCI error on system resume + - net: Implement missing getsockopt(SO_TIMESTAMPING_NEW) + - selftests: bonding: do not set port down when adding to bond + - ARM: sun9i: smp: Fix array-index-out-of-bounds read in sunxi_mc_smp_init + - sfc: fix a double-free bug in efx_probe_filters + - net: bcmgenet: Fix FCS generation for fragmented skbuffs + - netfilter: nft_immediate: drop chain reference counter on error + - net: Save and restore msg_namelen in sock_sendmsg + - i40e: fix use-after-free in i40e_aqc_add_filters() + - ASoC: meson: g12a-toacodec: Validate written enum values + - ASoC: meson: g12a-tohdmitx: Validate written enum values + - ASoC: meson: g12a-toacodec: Fix event generation + - ASoC: meson: g12a-tohdmitx: Fix event generation for S/PDIF mux + - i40e: Restore VF MSI-X state during PCI reset + - igc: Fix hicredit calculation + - net/qla3xxx: fix potential memleak in ql_alloc_buffer_queues + - net/smc: fix invalid link access in dumping SMC-R connections + - octeontx2-af: Always configure NIX TX link credits based on max frame size + - octeontx2-af: Re-enable MAC TX in otx2_stop processing + - asix: Add check for usbnet_get_endpoints + - net: ravb: Wait for operating mode to be applied + - bnxt_en: Remove mis-applied code from bnxt_cfg_ntp_filters() + - net: Implement missing SO_TIMESTAMPING_NEW cmsg support + - bpf: Support new 32bit offset jmp instruction + - mm: merge folio_has_private()/filemap_release_folio() call pairs + - mm, netfs, fscache: stop read optimisation when folio removed from pagecache + - smb: client: fix missing mode bits for SMB symlinks + - ALSA: hda/realtek: Add quirk for Lenovo Yoga Pro 7 + - firewire: ohci: suppress unexpected system reboot in AMD Ryzen machines and + ASM108x/VT630x PCIe cards + - x86/kprobes: fix incorrect return address calculation in + kprobe_emulate_call_indirect + - i2c: core: Fix atomic xfer check for non-preempt config + - mm: fix unmap_mapping_range high bits shift bug + - drm/amdgpu: skip gpu_info fw loading on navi12 + - drm/amd/display: add nv12 bounding box + - mmc: meson-mx-sdhc: Fix initialization frozen issue + - mmc: rpmb: fixes pause retune on all RPMB partitions. + - mmc: core: Cancel delayed work before releasing host + - mmc: sdhci-sprd: Fix eMMC init failure after hw reset + - bpf: Fix a verifier bug due to incorrect branch offset comparison with + cpu=v4 + - media: qcom: camss: Comment CSID dt_id field + - Revert "interconnect: qcom: sm8250: Enable sync_state" + - drm/amd/display: pbn_div need be updated for hotplug event + - accel/qaic: Fix GEM import path code + - accel/qaic: Implement quirk for SOC_HW_VERSION + - drm/bridge: parade-ps8640: Never store more than msg->size bytes in AUX xfer + - drm/bridge: ps8640: Fix size mismatch warning w/ len + - drm/i915/perf: Update handling of MMIO triggered reports + - igc: Check VLAN EtherType mask + - netfilter: nf_nat: fix action not being set for all ct states + - virtio_net: avoid data-races on dev->stats fields + - mm: convert DAX lock/unlock page to lock/unlock folio + - mm/memory-failure: pass the folio and the page to collect_procs() + - tcp: derive delack_max from rto_min + - bpftool: Fix -Wcast-qual warning + - bpftool: Align output skeleton ELF code + - crypto: xts - use 'spawn' for underlying single-block cipher + - crypto: qat - fix double free during reset + - crypto: hisilicon/qm - fix EQ/AEQ interrupt issue + - vfio/mtty: Overhaul mtty interrupt handling + - clk: si521xx: Increase stack based print buffer size in probe + - RDMA/mlx5: Fix mkey cache WQ flush + - rcu: Break rcu_node_0 --> &rq->__lock order + - rcu: Introduce rcu_cpu_online() + - rcu/tasks: Handle new PF_IDLE semantics + - rcu/tasks-trace: Handle new PF_IDLE semantics + - KVM: s390: vsie: fix wrong VIR 37 when MSO is used + - dmaengine: ti: k3-psil-am62: Fix SPI PDMA data + - dmaengine: ti: k3-psil-am62a: Fix SPI PDMA data + - iio: imu: adis16475: use bit numbers in assign_bit() + - iommu/vt-d: Support enforce_cache_coherency only for empty domains + - phy: mediatek: mipi: mt8183: fix minimal supported frequency + - phy: sunplus: return negative error code in sp_usb_phy_probe + - clk: rockchip: rk3128: Fix aclk_peri_src's parent + - clk: rockchip: rk3128: Fix SCLK_SDMMC's clock name + - drm/i915: Call intel_pre_plane_updates() also for pipes getting enabled + - drm/amd/display: Increase num voltage states to 40 + - cxl: Add cxl_decoders_committed() helper + - cxl/core: Always hold region_rwsem while reading poison lists + - kernel/resource: Increment by align value in get_free_mem_region() + - drm/amd/display: Increase frame warning limit with KASAN or KCSAN in dml + - dmaengine: idxd: Protect int_handle field in hw descriptor + - RISCV: KVM: update external interrupt atomically for IMSIC swfile + - powerpc/pseries/vas: Migration suspend waits for no in-progress open windows + - net: prevent mss overflow in skb_segment() + - cxl/pmu: Ensure put_device on pmu devices + - net: libwx: fix memory leak on free page + - net: constify sk_dst_get() and __sk_dst_get() argument + - mm/mglru: skip special VMAs in lru_gen_look_around() + - cxl: Add cxl_num_decoders_committed() usage to cxl_test + - cxl/hdm: Fix a benign lockdep splat + - cxl/memdev: Hold region_rwsem during inject and clear poison ops + * kvm: Running perf against qemu processes results in page fault inside guest + (LP: #2054218) // Mantic update: upstream stable patchset 2024-02-26 + (LP: #2054779) + - KVM: x86/pmu: fix masking logic for MSR_CORE_PERF_GLOBAL_CTRL + * smb: wsize blocks of bytes followed with binary zeros on copy, destroying + data (LP: #2049634) + - smb: Fix regression in writes when non-standard maximum write size + negotiated + * CVE-2024-1085 + - netfilter: nf_tables: check if catch-all set element is active in next + generation + * move_mount mediation does not detect if source is detached (LP: #2052662) + - apparmor: Fix move_mount mediation by detecting if source is detached + * CVE-2023-46838 + - xen-netback: don't produce zero-size SKB frags + * CVE-2024-1086 + - netfilter: nf_tables: reject QUEUE/DROP verdict parameters + * Validate connection interval to pass Bluetooth Test Suite (LP: #2052005) + - Bluetooth: Enforce validation on max value of connection interval + * Sound: Add rtl quirk of M70-Gen5 (LP: #2051947) + - ALSA: hda/realtek: Enable headset mic on Lenovo M70 Gen5 + * Fix spurious wakeup caused by Cirque touchpad (LP: #2051896) + - HID: i2c-hid: Remove I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV quirk + - HID: i2c-hid: Renumber I2C_HID_QUIRK_ defines + - HID: i2c-hid: Skip SET_POWER SLEEP for Cirque touchpad on system suspend + * Mantic update: upstream stable patchset 2024-02-09 (LP: #2052792) + - ksmbd: switch to use kmemdup_nul() helper + - ksmbd: add support for read compound + - ksmbd: fix wrong interim response on compound + - ksmbd: fix `force create mode' and `force directory mode' + - ksmbd: Fix one kernel-doc comment + - ksmbd: add missing calling smb2_set_err_rsp() on error + - ksmbd: remove experimental warning + - ksmbd: remove unneeded mark_inode_dirty in set_info_sec() + - ksmbd: fix passing freed memory 'aux_payload_buf' + - ksmbd: return invalid parameter error response if smb2 request is invalid + - ksmbd: check iov vector index in ksmbd_conn_write() + - ksmbd: fix race condition with fp + - ksmbd: fix race condition from parallel smb2 logoff requests + - ksmbd: fix race condition between tree conn lookup and disconnect + - ksmbd: fix wrong error response status by using set_smb2_rsp_status() + - ksmbd: fix Null pointer dereferences in ksmbd_update_fstate() + - ksmbd: fix potential double free on smb2_read_pipe() error path + - ksmbd: Remove unused field in ksmbd_user struct + - ksmbd: reorganize ksmbd_iov_pin_rsp() + - ksmbd: fix kernel-doc comment of ksmbd_vfs_setxattr() + - ksmbd: fix missing RDMA-capable flag for IPoIB device in + ksmbd_rdma_capable_netdev() + - ksmbd: add support for surrogate pair conversion + - ksmbd: no need to wait for binded connection termination at logoff + - ksmbd: fix kernel-doc comment of ksmbd_vfs_kern_path_locked() + - ksmbd: prevent memory leak on error return + - ksmbd: separately allocate ci per dentry + - ksmbd: move oplock handling after unlock parent dir + - ksmbd: release interim response after sending status pending response + - ksmbd: move setting SMB2_FLAGS_ASYNC_COMMAND and AsyncId + - ksmbd: don't update ->op_state as OPLOCK_STATE_NONE on error + - ksmbd: set epoch in create context v2 lease + - ksmbd: set v2 lease capability + - ksmbd: downgrade RWH lease caching state to RH for directory + - ksmbd: send v2 lease break notification for directory + - ksmbd: lazy v2 lease break on smb2_write() + - ksmbd: avoid duplicate opinfo_put() call on error of smb21_lease_break_ack() + - ksmbd: fix wrong allocation size update in smb2_open() + - linux/export: Ensure natural alignment of kcrctab array + - block: renumber QUEUE_FLAG_HW_WC + - platform/x86: p2sb: Allow p2sb_bar() calls during PCI device probe + - mm/filemap: avoid buffered read/write race to read inconsistent data + - mm: migrate high-order folios in swap cache correctly + - mm/memory-failure: cast index to loff_t before shifting it + - mm/memory-failure: check the mapcount of the precise page + - ring-buffer: Fix wake ups when buffer_percent is set to 100 + - tracing: Fix blocked reader of snapshot buffer + - NFSD: fix possible oops when nfsd/pool_stats is closed. + - Revert "platform/x86: p2sb: Allow p2sb_bar() calls during PCI device probe" + - fs: cifs: Fix atime update check + - linux/export: Fix alignment for 64-bit ksymtab entries + - mptcp: refactor sndbuf auto-tuning + - mptcp: fix possible NULL pointer dereference on close + - mptcp: fix inconsistent state on fastopen race + - platform/x86/intel/pmc: Add suspend callback + - platform/x86/intel/pmc: Allow reenabling LTRs + - platform/x86/intel/pmc: Move GBE LTR ignore to suspend callback + - selftests: secretmem: floor the memory size to the multiple of page_size + - Revert "nvme-fc: fix race between error recovery and creating association" + - ftrace: Fix modification of direct_function hash while in use + - Upstream stable to v6.1.71, v6.6.10 + * Mantic update: upstream stable patchset 2024-02-06 (LP: #2052499) + - kasan: disable kasan_non_canonical_hook() for HW tags + - bpf: Fix prog_array_map_poke_run map poke update + - ARM: dts: dra7: Fix DRA7 L3 NoC node register size + - ARM: OMAP2+: Fix null pointer dereference and memory leak in + omap_soc_device_init + - reset: Fix crash when freeing non-existent optional resets + - s390/vx: fix save/restore of fpu kernel context + - wifi: iwlwifi: pcie: add another missing bh-disable for rxq->lock + - wifi: mac80211: check if the existing link config remains unchanged + - wifi: mac80211: mesh: check element parsing succeeded + - wifi: mac80211: mesh_plink: fix matches_local logic + - Revert "net/mlx5e: fix double free of encap_header in update funcs" + - Revert "net/mlx5e: fix double free of encap_header" + - net/mlx5e: Fix slab-out-of-bounds in mlx5_query_nic_vport_mac_list() + - net/mlx5: Re-organize mlx5_cmd struct + - net/mlx5e: Fix a race in command alloc flow + - net/mlx5e: fix a potential double-free in fs_udp_create_groups + - net/mlx5: Fix fw tracer first block check + - net/mlx5e: Correct snprintf truncation handling for fw_version buffer + - net/mlx5e: Correct snprintf truncation handling for fw_version buffer used + by representors + - net: mscc: ocelot: fix eMAC TX RMON stats for bucket 256-511 and above + - octeontx2-pf: Fix graceful exit during PFC configuration failure + - net: Return error from sk_stream_wait_connect() if sk_wait_event() fails + - net: sched: ife: fix potential use-after-free + - ethernet: atheros: fix a memleak in atl1e_setup_ring_resources + - net/rose: fix races in rose_kill_by_device() + - Bluetooth: Fix deadlock in vhci_send_frame + - Bluetooth: hci_event: shut up a false-positive warning + - net: mana: select PAGE_POOL + - net: check vlan filter feature in vlan_vids_add_by_dev() and + vlan_vids_del_by_dev() + - afs: Fix the dynamic root's d_delete to always delete unused dentries + - afs: Fix dynamic root lookup DNS check + - net: check dev->gso_max_size in gso_features_check() + - keys, dns: Allow key types (eg. DNS) to be reclaimed immediately on expiry + - afs: Fix overwriting of result of DNS query + - afs: Fix use-after-free due to get/remove race in volume tree + - ASoC: hdmi-codec: fix missing report for jack initial status + - ASoC: fsl_sai: Fix channel swap issue on i.MX8MP + - i2c: aspeed: Handle the coalesced stop conditions with the start conditions. + - x86/xen: add CPU dependencies for 32-bit build + - pinctrl: at91-pio4: use dedicated lock class for IRQ + - gpiolib: cdev: add gpio_device locking wrapper around gpio_ioctl() + - nvme-pci: fix sleeping function called from interrupt context + - interconnect: Treat xlate() returning NULL node as an error + - iio: imu: inv_mpu6050: fix an error code problem in inv_mpu6050_read_raw + - Input: ipaq-micro-keys - add error handling for devm_kmemdup + - scsi: bnx2fc: Fix skb double free in bnx2fc_rcv() + - iio: common: ms_sensors: ms_sensors_i2c: fix humidity conversion time table + - iio: adc: ti_am335x_adc: Fix return value check of tiadc_request_dma() + - iio: triggered-buffer: prevent possible freeing of wrong buffer + - ALSA: usb-audio: Increase delay in MOTU M quirk + - usb-storage: Add quirk for incorrect WP on Kingston DT Ultimate 3.0 G3 + - wifi: cfg80211: Add my certificate + - wifi: cfg80211: fix certs build to not depend on file order + - USB: serial: ftdi_sio: update Actisense PIDs constant names + - USB: serial: option: add Quectel EG912Y module support + - USB: serial: option: add Foxconn T99W265 with new baseline + - USB: serial: option: add Quectel RM500Q R13 firmware support + - ALSA: hda/realtek: Add quirk for ASUS ROG GV302XA + - Bluetooth: hci_event: Fix not checking if HCI_OP_INQUIRY has been sent + - Bluetooth: MGMT/SMP: Fix address type when using SMP over BREDR/LE + - Bluetooth: Add more enc key size check + - net: usb: ax88179_178a: avoid failed operations when device is disconnected + - Input: soc_button_array - add mapping for airplane mode button + - net: 9p: avoid freeing uninit memory in p9pdu_vreadf + - net: rfkill: gpio: set GPIO direction + - net: ks8851: Fix TX stall caused by TX buffer overrun + - dt-bindings: nvmem: mxs-ocotp: Document fsl,ocotp + - smb: client: fix OOB in cifsd when receiving compounded resps + - smb: client: fix potential OOB in cifs_dump_detail() + - smb: client: fix OOB in SMB2_query_info_init() + - drm/i915: Reject async flips with bigjoiner + - 9p: prevent read overrun in protocol dump tracepoint + - btrfs: zoned: no longer count fresh BG region as zone unusable + - ubifs: fix possible dereference after free + - ublk: move ublk_cancel_dev() out of ub->mutex + - selftests: mptcp: join: fix subflow_send_ack lookup + - Revert "scsi: aacraid: Reply queue mapping to CPUs based on IRQ affinity" + - scsi: core: Always send batch on reset or error handling command + - tracing / synthetic: Disable events after testing in + synth_event_gen_test_init() + - dm-integrity: don't modify bio's immutable bio_vec in integrity_metadata() + - pinctrl: starfive: jh7100: ignore disabled device tree nodes + - bus: ti-sysc: Flush posted write only after srst_udelay + - gpio: dwapb: mask/unmask IRQ when disable/enale it + - lib/vsprintf: Fix %pfwf when current node refcount == 0 + - thunderbolt: Fix memory leak in margining_port_remove() + - KVM: arm64: vgic: Simplify kvm_vgic_destroy() + - KVM: arm64: vgic: Add a non-locking primitive for kvm_vgic_vcpu_destroy() + - KVM: arm64: vgic: Force vcpu vgic teardown on vcpu destroy + - x86/alternatives: Sync core before enabling interrupts + - mm/damon/core: make damon_start() waits until kdamond_fn() starts + - wifi: cfg80211: fix CQM for non-range use + - wifi: nl80211: fix deadlock in nl80211_set_cqm_rssi (6.6.x) + - mm/damon/core: use number of passed access sampling as a timer + - btrfs: qgroup: iterate qgroups without memory allocation for + qgroup_reserve() + - btrfs: qgroup: use qgroup_iterator in qgroup_convert_meta() + - btrfs: free qgroup pertrans reserve on transaction abort + - drm/i915: Fix FEC state dump + - drm/i915: Introduce crtc_state->enhanced_framing + - drm/i915/edp: don't write to DP_LINK_BW_SET when using rate select + - drm: Fix FD ownership check in drm_master_check_perm() + - platform/x86/intel/pmc: Fix hang in pmc_core_send_ltr_ignore() + - SUNRPC: Revert 5f7fc5d69f6e92ec0b38774c387f5cf7812c5806 + - wifi: ieee80211: don't require protected vendor action frames + - wifi: mac80211: don't re-add debugfs during reconfig + - wifi: mac80211: check defragmentation succeeded + - ice: fix theoretical out-of-bounds access in ethtool link modes + - bpf: syzkaller found null ptr deref in unix_bpf proto add + - net/mlx5e: Fix overrun reported by coverity + - net/mlx5e: XDP, Drop fragmented packets larger than MTU size + - net/mlx5: Refactor mlx5_flow_destination->rep pointer to vport num + - net/mlx5e: Fix error code in mlx5e_tc_action_miss_mapping_get() + - net/mlx5e: Fix error codes in alloc_branch_attr() + - net: mscc: ocelot: fix pMAC TX RMON stats for bucket 256-511 and above + - Bluetooth: Fix not notifying when connection encryption changes + - Bluetooth: hci_core: Fix hci_conn_hash_lookup_cis + - bnxt_en: do not map packet buffers twice + - net: phy: skip LED triggers on PHYs on SFP modules + - ice: stop trashing VF VSI aggregator node ID information + - ice: Fix PF with enabled XDP going no-carrier after reset + - net: ethernet: mtk_wed: fix possible NULL pointer dereference in + mtk_wed_wo_queue_tx_clean() + - drm/i915/hwmon: Fix static analysis tool reported issues + - drm/i915/mtl: Fix HDMI/DP PLL clock selection + - i2c: qcom-geni: fix missing clk_disable_unprepare() and + geni_se_resources_off() + - drm/amdgpu: re-create idle bo's PTE during VM state machine reset + - interconnect: qcom: sm8250: Enable sync_state + - scsi: ufs: qcom: Return ufs_qcom_clk_scale_*() errors in + ufs_qcom_clk_scale_notify() + - scsi: ufs: core: Let the sq_lock protect sq_tail_slot access + - iio: kx022a: Fix acceleration value scaling + - iio: adc: imx93: add four channels for imx93 adc + - iio: imu: adis16475: add spi_device_id table + - iio: tmag5273: fix temperature offset + - ARM: dts: Fix occasional boot hang for am3 usb + - wifi: mt76: fix crash with WED rx support enabled + - ASoC: tas2781: check the validity of prm_no/cfg_no + - usb: typec: ucsi: fix gpio-based orientation detection + - usb: fotg210-hcd: delete an incorrect bounds test + - net: avoid build bug in skb extension length calculation + - nfsd: call nfsd_last_thread() before final nfsd_put() + - ring-buffer: Fix 32-bit rb_time_read() race with rb_time_cmpxchg() + - ring-buffer: Remove useless update to write_stamp in rb_try_to_discard() + - ring-buffer: Fix slowpath of interrupted event + - spi: atmel: Do not cancel a transfer upon any signal + - spi: atmel: Prevent spi transfers from being killed + - spi: atmel: Fix clock issue when using devices with different polarities + - nvmem: brcm_nvram: store a copy of NVRAM content + - pinctrl: starfive: jh7110: ignore disabled device tree nodes + - x86/alternatives: Disable interrupts and sync when optimizing NOPs in place + - x86/smpboot/64: Handle X2APIC BIOS inconsistency gracefully + - spi: cadence: revert "Add SPI transfer delays" + - Upstream stable to v6.1.70, v6.6.9 + * Mantic update: upstream stable patchset 2024-02-01 (LP: #2051924) + - r8152: add vendor/device ID pair for D-Link DUB-E250 + - r8152: add vendor/device ID pair for ASUS USB-C2500 + - ext4: fix warning in ext4_dio_write_end_io() + - ksmbd: fix memory leak in smb2_lock() + - afs: Fix refcount underflow from error handling race + - HID: lenovo: Restrict detection of patched firmware only to USB cptkbd + - net/mlx5e: Fix possible deadlock on mlx5e_tx_timeout_work + - net: ipv6: support reporting otherwise unknown prefix flags in RTM_NEWPREFIX + - qca_debug: Prevent crash on TX ring changes + - qca_debug: Fix ethtool -G iface tx behavior + - qca_spi: Fix reset behavior + - bnxt_en: Fix wrong return value check in bnxt_close_nic() + - bnxt_en: Fix HWTSTAMP_FILTER_ALL packet timestamp logic + - atm: solos-pci: Fix potential deadlock on &cli_queue_lock + - atm: solos-pci: Fix potential deadlock on &tx_queue_lock + - net: fec: correct queue selection + - octeontx2-af: fix a use-after-free in rvu_nix_register_reporters + - octeontx2-pf: Fix promisc mcam entry action + - octeontx2-af: Update RSS algorithm index + - iavf: Introduce new state machines for flow director + - iavf: Handle ntuple on/off based on new state machines for flow director + - qed: Fix a potential use-after-free in qed_cxt_tables_alloc + - net: Remove acked SYN flag from packet in the transmit queue correctly + - net: ena: Destroy correct number of xdp queues upon failure + - net: ena: Fix xdp drops handling due to multibuf packets + - net: ena: Fix XDP redirection error + - stmmac: dwmac-loongson: Make sure MDIO is initialized before use + - sign-file: Fix incorrect return values check + - vsock/virtio: Fix unsigned integer wrap around in + virtio_transport_has_space() + - dpaa2-switch: fix size of the dma_unmap + - dpaa2-switch: do not ask for MDB, VLAN and FDB replay + - net: stmmac: Handle disabled MDIO busses from devicetree + - net: atlantic: fix double free in ring reinit logic + - cred: switch to using atomic_long_t + - fuse: dax: set fc->dax to NULL in fuse_dax_conn_free() + - ALSA: hda/hdmi: add force-connect quirk for NUC5CPYB + - ALSA: hda/hdmi: add force-connect quirks for ASUSTeK Z170 variants + - ALSA: hda/realtek: Apply mute LED quirk for HP15-db + - PCI: loongson: Limit MRRS to 256 + - ksmbd: fix wrong name of SMB2_CREATE_ALLOCATION_SIZE + - drm/mediatek: Add spinlock for setting vblank event in atomic_begin + - x86/hyperv: Fix the detection of E820_TYPE_PRAM in a Gen2 VM + - usb: aqc111: check packet for fixup for true limit + - stmmac: dwmac-loongson: Add architecture dependency + - [Config] updateconfigs for DWMAC_LOONGSON + - blk-throttle: fix lockdep warning of "cgroup_mutex or RCU read lock + required!" + - blk-cgroup: bypass blkcg_deactivate_policy after destroying + - bcache: avoid oversize memory allocation by small stripe_size + - bcache: remove redundant assignment to variable cur_idx + - bcache: add code comments for bch_btree_node_get() and + __bch_btree_node_alloc() + - bcache: avoid NULL checking to c->root in run_cache_set() + - nbd: fold nbd config initialization into nbd_alloc_config() + - nvme-auth: set explanation code for failure2 msgs + - nvme: catch errors from nvme_configure_metadata() + - selftests/bpf: fix bpf_loop_bench for new callback verification scheme + - LoongArch: Add dependency between vmlinuz.efi and vmlinux.efi + - LoongArch: Implement constant timer shutdown interface + - platform/x86: intel_telemetry: Fix kernel doc descriptions + - HID: glorious: fix Glorious Model I HID report + - HID: add ALWAYS_POLL quirk for Apple kb + - nbd: pass nbd_sock to nbd_read_reply() instead of index + - HID: hid-asus: reset the backlight brightness level on resume + - HID: multitouch: Add quirk for HONOR GLO-GXXX touchpad + - asm-generic: qspinlock: fix queued_spin_value_unlocked() implementation + - net: usb: qmi_wwan: claim interface 4 for ZTE MF290 + - arm64: add dependency between vmlinuz.efi and Image + - HID: hid-asus: add const to read-only outgoing usb buffer + - btrfs: do not allow non subvolume root targets for snapshot + - soundwire: stream: fix NULL pointer dereference for multi_link + - ext4: prevent the normalized size from exceeding EXT_MAX_BLOCKS + - arm64: mm: Always make sw-dirty PTEs hw-dirty in pte_modify + - team: Fix use-after-free when an option instance allocation fails + - drm/amdgpu/sdma5.2: add begin/end_use ring callbacks + - dmaengine: stm32-dma: avoid bitfield overflow assertion + - mm/mglru: fix underprotected page cache + - mm/shmem: fix race in shmem_undo_range w/THP + - btrfs: free qgroup reserve when ORDERED_IOERR is set + - btrfs: don't clear qgroup reserved bit in release_folio + - drm/amdgpu: fix tear down order in amdgpu_vm_pt_free + - drm/amd/display: Disable PSR-SU on Parade 0803 TCON again + - drm/i915: Fix remapped stride with CCS on ADL+ + - smb: client: fix NULL deref in asn1_ber_decoder() + - smb: client: fix OOB in smb2_query_reparse_point() + - ring-buffer: Fix memory leak of free page + - tracing: Update snapshot buffer on resize if it is allocated + - ring-buffer: Do not update before stamp when switching sub-buffers + - ring-buffer: Have saved event hold the entire event + - ring-buffer: Fix writing to the buffer with max_data_size + - ring-buffer: Fix a race in rb_time_cmpxchg() for 32 bit archs + - ring-buffer: Do not try to put back write_stamp + - ring-buffer: Have rb_time_cmpxchg() set the msb counter too + - net/mlx5e: Honor user choice of IPsec replay window size + - net/mlx5e: Ensure that IPsec sequence packet number starts from 1 + - RDMA/mlx5: Send events from IB driver about device affiliation state + - net/mlx5e: Disable IPsec offload support if not FW steering + - net/mlx5e: TC, Don't offload post action rule if not supported + - net/mlx5: Nack sync reset request when HotPlug is enabled + - net/mlx5e: Check netdev pointer before checking its net ns + - net/mlx5: Fix a NULL vs IS_ERR() check + - bnxt_en: Fix skb recycling logic in bnxt_deliver_skb() + - net/sched: act_ct: Take per-cb reference to tcf_ct_flow_table + - octeon_ep: explicitly test for firmware ready value + - octeontx2-af: Fix pause frame configuration + - iavf: Fix iavf_shutdown to call iavf_remove instead iavf_close + - net: ena: Fix DMA syncing in XDP path when SWIOTLB is on + - net: stmmac: dwmac-qcom-ethqos: Fix drops in 10M SGMII RX + - cred: get rid of CONFIG_DEBUG_CREDENTIALS + - [Config] updateconfigs for DEBUG_CREDENTIALS + - HID: i2c-hid: Add IDEA5002 to i2c_hid_acpi_blacklist[] + - HID: Add quirk for Labtec/ODDOR/aikeec handbrake + - fuse: share lookup state between submount and its parent + - io_uring/cmd: fix breakage in SOCKET_URING_OP_SIOC* implementation + - PCI/ASPM: Add pci_enable_link_state_locked() + - PCI: vmd: Fix potential deadlock when enabling ASPM + - drm/mediatek: fix kernel oops if no crtc is found + - drm/i915/selftests: Fix engine reset count storage for multi-tile + - drm/i915: Use internal class when counting engine resets + - selftests/mm: cow: print ksft header before printing anything else + - rxrpc: Fix some minor issues with bundle tracing + - nbd: factor out a helper to get nbd_config without holding 'config_lock' + - nbd: fix null-ptr-dereference while accessing 'nbd->config' + - LoongArch: Record pc instead of offset in la_abs relocation + - LoongArch: Silence the boot warning about 'nokaslr' + - HID: mcp2221: Set driver data before I2C adapter add + - HID: mcp2221: Allow IO to start during probe + - HID: apple: add Jamesdonkey and A3R to non-apple keyboards list + - nfc: virtual_ncidev: Add variable to check if ndev is running + - scripts/checkstack.pl: match all stack sizes for s390 + - cxl/hdm: Fix dpa translation locking + - Revert "selftests: error out if kernel header files are not yet built" + - drm/mediatek: Fix access violation in mtk_drm_crtc_dma_dev_get + - mm/mglru: try to stop at high watermarks + - mm/mglru: respect min_ttl_ms with memcgs + - mm/mglru: reclaim offlined memcgs harder + - btrfs: fix qgroup_free_reserved_data int overflow + - drm/edid: also call add modes in EDID connector update fallback + - drm/i915: Fix ADL+ tiled plane stride when the POT stride is smaller than + the original + - drm/i915: Fix intel_atomic_setup_scalers() plane_state handling + - smb: client: fix potential OOBs in smb2_parse_contexts() + - x86/speculation, objtool: Use absolute relocations for annotations + - RDMA/mlx5: Change the key being sent for MPV device affiliation + - Upstream stable to v6.1.69, v6.6.8 + * CVE-2023-50431 + - accel/habanalabs: fix information leak in sec_attest_info() + * CVE-2024-22705 + - ksmbd: fix slab-out-of-bounds in smb_strndup_from_utf16() + + -- Tim Gardner Mon, 18 Mar 2024 07:23:24 -0600 + +linux-azure (6.5.0-1017.17) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1017.17 -proposed tracker (LP: #2056032) + + [ Ubuntu: 6.5.0-26.26 ] + + * mantic/linux: 6.5.0-26.26 -proposed tracker (LP: #2056049) + * Packaging resync (LP: #1786013) + - [Packaging] update annotations scripts + - debian/dkms-versions -- update from kernel-versions (main/s2024.02.05) + * CVE-2024-26599 + - pwm: Fix out-of-bounds access in of_pwm_single_xlate() + * CVE-2024-26597 + - net: qualcomm: rmnet: fix global oob in rmnet_policy + * CVE-2024-1086 + - netfilter: nf_tables: reject QUEUE/DROP verdict parameters + * CVE-2024-1085 + - netfilter: nf_tables: check if catch-all set element is active in next + generation + + -- Tim Gardner Fri, 08 Mar 2024 19:26:03 -0700 + +linux-azure (6.5.0-1016.16) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1016.16 -proposed tracker (LP: #2052023) + + * Packaging resync (LP: #1786013) + - [Packaging] update Ubuntu.md + + * Azure: Enable CONFIG_TEST_LOCKUP (LP: #2052723) + - [Config] CONFIG_TEST_LOCKUP=m + + [ Ubuntu: 6.5.0-25.25 ] + + * mantic/linux: 6.5.0-25.25 -proposed tracker (LP: #2052615) + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/2024.02.05) + * [SRU][22.04.04]: mpi3mr driver update (LP: #2045233) + - scsi: mpi3mr: Invoke soft reset upon TSU or event ack time out + - scsi: mpi3mr: Update MPI Headers to version 3.00.28 + - scsi: mpi3mr: Add support for more than 1MB I/O + - scsi: mpi3mr: WRITE SAME implementation + - scsi: mpi3mr: Enhance handling of devices removed after controller reset + - scsi: mpi3mr: Update driver version to 8.5.0.0.0 + - scsi: mpi3mr: Split off bus_reset function from host_reset + - scsi: mpi3mr: Add support for SAS5116 PCI IDs + - scsi: mpi3mr: Add PCI checks where SAS5116 diverges from SAS4116 + - scsi: mpi3mr: Increase maximum number of PHYs to 64 from 32 + - scsi: mpi3mr: Add support for status reply descriptor + - scsi: mpi3mr: driver version upgrade to 8.5.0.0.50 + - scsi: mpi3mr: Refresh sdev queue depth after controller reset + - scsi: mpi3mr: Clean up block devices post controller reset + - scsi: mpi3mr: Block PEL Enable Command on Controller Reset and Unrecoverable + State + - scsi: mpi3mr: Fetch correct device dev handle for status reply descriptor + - scsi: mpi3mr: Support for preallocation of SGL BSG data buffers part-1 + - scsi: mpi3mr: Support for preallocation of SGL BSG data buffers part-2 + - scsi: mpi3mr: Support for preallocation of SGL BSG data buffers part-3 + - scsi: mpi3mr: Update driver version to 8.5.1.0.0 + * The display becomes frozen after some time when a HDMI device is connected. + (LP: #2049027) + - drm/i915/dmc: Don't enable any pipe DMC events + * Audio balancing setting doesn't work with the cirrus codec (LP: #2051050) + - ALSA: hda/cs8409: Suppress vmaster control for Dolphin models + * partproke is broken on empty loopback device (LP: #2049689) + - block: Move checking GENHD_FL_NO_PART to bdev_add_partition() + * CVE-2023-51780 + - atm: Fix Use-After-Free in do_vcc_ioctl + * CVE-2023-6915 + - ida: Fix crash in ida_free when the bitmap is empty + * Update Ubuntu.md (LP: #2051176) + - [Packaging] update Ubuntu.md + * test_021_aslr_dapper_libs from ubuntu_qrt_kernel_security failed on K-5.19 / + J-OEM-6.1 / J-6.2 AMD64 (LP: #1983357) + - [Config]: set ARCH_MMAP_RND_{COMPAT_, }BITS to the maximum + * Intel E810-XXV - NETDEV WATCHDOG: (ice): transmit queue timed out + (LP: #2036239) + - ice: Add driver support for firmware changes for LAG + - ice: alter feature support check for SRIOV and LAG + * Mantic update: upstream stable patchset 2024-01-29 (LP: #2051584) + - Upstream stable to v6.1.67, v6.6.6 + - vdpa/mlx5: preserve CVQ vringh index + - hrtimers: Push pending hrtimers away from outgoing CPU earlier + - i2c: designware: Fix corrupted memory seen in the ISR + - netfilter: ipset: fix race condition between swap/destroy and kernel side + add/del/test + - zstd: Fix array-index-out-of-bounds UBSAN warning + - tg3: Move the [rt]x_dropped counters to tg3_napi + - tg3: Increment tx_dropped in tg3_tso_bug() + - kconfig: fix memory leak from range properties + - drm/amdgpu: correct chunk_ptr to a pointer to chunk. + - x86: Introduce ia32_enabled() + - x86/coco: Disable 32-bit emulation by default on TDX and SEV + - x86/entry: Convert INT 0x80 emulation to IDTENTRY + - x86/entry: Do not allow external 0x80 interrupts + - x86/tdx: Allow 32-bit emulation by default + - dt: dt-extract-compatibles: Handle cfile arguments in generator function + - dt: dt-extract-compatibles: Don't follow symlinks when walking tree + - platform/x86: asus-wmi: Move i8042 filter install to shared asus-wmi code + - of: dynamic: Fix of_reconfig_get_state_change() return value documentation + - platform/x86: wmi: Skip blocks with zero instances + - ipv6: fix potential NULL deref in fib6_add() + - octeontx2-pf: Add missing mutex lock in otx2_get_pauseparam + - octeontx2-af: Check return value of nix_get_nixlf before using nixlf + - hv_netvsc: rndis_filter needs to select NLS + - r8152: Rename RTL8152_UNPLUG to RTL8152_INACCESSIBLE + - r8152: Add RTL8152_INACCESSIBLE checks to more loops + - r8152: Add RTL8152_INACCESSIBLE to r8156b_wait_loading_flash() + - r8152: Add RTL8152_INACCESSIBLE to r8153_pre_firmware_1() + - r8152: Add RTL8152_INACCESSIBLE to r8153_aldps_en() + - mlxbf-bootctl: correctly identify secure boot with development keys + - platform/mellanox: Add null pointer checks for devm_kasprintf() + - platform/mellanox: Check devm_hwmon_device_register_with_groups() return + value + - arcnet: restoring support for multiple Sohard Arcnet cards + - octeontx2-pf: consider both Rx and Tx packet stats for adaptive interrupt + coalescing + - net: stmmac: fix FPE events losing + - xsk: Skip polling event check for unbound socket + - octeontx2-af: fix a use-after-free in rvu_npa_register_reporters + - i40e: Fix unexpected MFS warning message + - iavf: validate tx_coalesce_usecs even if rx_coalesce_usecs is zero + - tcp: fix mid stream window clamp. + - ionic: fix snprintf format length warning + - ionic: Fix dim work handling in split interrupt mode + - ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit() + - net: atlantic: Fix NULL dereference of skb pointer in + - net: hns: fix wrong head when modify the tx feature when sending packets + - net: hns: fix fake link up on xge port + - octeontx2-af: Adjust Tx credits when MCS external bypass is disabled + - octeontx2-af: Fix mcs sa cam entries size + - octeontx2-af: Fix mcs stats register address + - octeontx2-af: Add missing mcs flr handler call + - octeontx2-af: Update Tx link register range + - dt-bindings: interrupt-controller: Allow #power-domain-cells + - netfilter: nf_tables: fix 'exist' matching on bigendian arches + - netfilter: nf_tables: validate family when identifying table via handle + - netfilter: xt_owner: Fix for unsafe access of sk->sk_socket + - tcp: do not accept ACK of bytes we never sent + - bpf: sockmap, updating the sg structure should also update curr + - psample: Require 'CAP_NET_ADMIN' when joining "packets" group + - drop_monitor: Require 'CAP_SYS_ADMIN' when joining "events" group + - mm/damon/sysfs: eliminate potential uninitialized variable warning + - tee: optee: Fix supplicant based device enumeration + - RDMA/hns: Fix unnecessary err return when using invalid congest control + algorithm + - RDMA/irdma: Do not modify to SQD on error + - RDMA/irdma: Add wait for suspend on SQD + - arm64: dts: rockchip: Expand reg size of vdec node for RK3328 + - arm64: dts: rockchip: Expand reg size of vdec node for RK3399 + - ASoC: fsl_sai: Fix no frame sync clock issue on i.MX8MP + - RDMA/rtrs-srv: Do not unconditionally enable irq + - RDMA/rtrs-clt: Start hb after path_up + - RDMA/rtrs-srv: Check return values while processing info request + - RDMA/rtrs-srv: Free srv_mr iu only when always_invalidate is true + - RDMA/rtrs-srv: Destroy path files after making sure no IOs in-flight + - RDMA/rtrs-clt: Fix the max_send_wr setting + - RDMA/rtrs-clt: Remove the warnings for req in_use check + - RDMA/bnxt_re: Correct module description string + - RDMA/irdma: Refactor error handling in create CQP + - RDMA/irdma: Fix UAF in irdma_sc_ccq_get_cqe_info() + - hwmon: (acpi_power_meter) Fix 4.29 MW bug + - ASoC: codecs: lpass-tx-macro: set active_decimator correct default value + - hwmon: (nzxt-kraken2) Fix error handling path in kraken2_probe() + - ASoC: wm_adsp: fix memleak in wm_adsp_buffer_populate + - RDMA/core: Fix umem iterator when PAGE_SIZE is greater then HCA pgsz + - RDMA/irdma: Avoid free the non-cqp_request scratch + - drm/bridge: tc358768: select CONFIG_VIDEOMODE_HELPERS + - arm64: dts: imx8mp: imx8mq: Add parkmode-disable-ss-quirk on DWC3 + - ARM: dts: imx6ul-pico: Describe the Ethernet PHY clock + - tracing: Fix a warning when allocating buffered events fails + - scsi: be2iscsi: Fix a memleak in beiscsi_init_wrb_handle() + - ARM: imx: Check return value of devm_kasprintf in imx_mmdc_perf_init + - ARM: dts: imx7: Declare timers compatible with fsl,imx6dl-gpt + - ARM: dts: imx28-xea: Pass the 'model' property + - riscv: fix misaligned access handling of C.SWSP and C.SDSP + - md: don't leave 'MD_RECOVERY_FROZEN' in error path of md_set_readonly() + - rethook: Use __rcu pointer for rethook::handler + - kprobes: consistent rcu api usage for kretprobe holder + - ASoC: amd: yc: Fix non-functional mic on ASUS E1504FA + - nvme-pci: Add sleep quirk for Kingston drives + - io_uring: fix mutex_unlock with unreferenced ctx + - ALSA: usb-audio: Add Pioneer DJM-450 mixer controls + - ALSA: pcm: fix out-of-bounds in snd_pcm_state_names + - ALSA: hda/realtek: add new Framework laptop to quirks + - ALSA: hda/realtek: Add Framework laptop 16 to quirks + - ring-buffer: Test last update in 32bit version of __rb_time_read() + - nilfs2: fix missing error check for sb_set_blocksize call + - nilfs2: prevent WARNING in nilfs_sufile_set_segment_usage() + - cgroup_freezer: cgroup_freezing: Check if not frozen + - checkstack: fix printed address + - tracing: Always update snapshot buffer size + - tracing: Disable snapshot buffer when stopping instance tracers + - tracing: Fix incomplete locking when disabling buffered events + - tracing: Fix a possible race when disabling buffered events + - packet: Move reference count in packet_sock to atomic_long_t + - r8169: fix rtl8125b PAUSE frames blasting when suspended + - regmap: fix bogus error on regcache_sync success + - platform/surface: aggregator: fix recv_buf() return value + - hugetlb: fix null-ptr-deref in hugetlb_vma_lock_write + - mm: fix oops when filemap_map_pmd() without prealloc_pte + - powercap: DTPM: Fix missing cpufreq_cpu_put() calls + - md/raid6: use valid sector values to determine if an I/O should wait on the + reshape + - arm64: dts: mediatek: mt7622: fix memory node warning check + - arm64: dts: mediatek: mt8183-kukui-jacuzzi: fix dsi unnecessary cells + properties + - arm64: dts: mediatek: cherry: Fix interrupt cells for MT6360 on I2C7 + - arm64: dts: mediatek: mt8173-evb: Fix regulator-fixed node names + - arm64: dts: mediatek: mt8195: Fix PM suspend/resume with venc clocks + - arm64: dts: mediatek: mt8183: Fix unit address for scp reserved memory + - arm64: dts: mediatek: mt8183: Move thermal-zones to the root node + - arm64: dts: mediatek: mt8183-evb: Fix unit_address_vs_reg warning on ntc + - coresight: etm4x: Remove bogous __exit annotation for some functions + - hwtracing: hisi_ptt: Add dummy callback pmu::read() + - misc: mei: client.c: return negative error code in mei_cl_write + - misc: mei: client.c: fix problem of return '-EOVERFLOW' in mei_cl_write + - LoongArch: BPF: Don't sign extend memory load operand + - LoongArch: BPF: Don't sign extend function return value + - ring-buffer: Force absolute timestamp on discard of event + - tracing: Set actual size after ring buffer resize + - tracing: Stop current tracer when resizing buffer + - parisc: Reduce size of the bug_table on 64-bit kernel by half + - parisc: Fix asm operand number out of range build error in bug table + - arm64: dts: mediatek: add missing space before { + - arm64: dts: mt8183: kukui: Fix underscores in node names + - x86/sev: Fix kernel crash due to late update to read-only ghcb_version + - gpiolib: sysfs: Fix error handling on failed export + - drm/amd/amdgpu: Fix warnings in amdgpu/amdgpu_display.c + - drm/amdgpu: Add I2C EEPROM support on smu v13_0_6 + - usb: gadget: f_hid: fix report descriptor allocation + - serial: 8250_dw: Add ACPI ID for Granite Rapids-D UART + - parport: Add support for Brainboxes IX/UC/PX parallel cards + - cifs: Fix non-availability of dedup breaking generic/304 + - Revert "xhci: Loosen RPM as default policy to cover for AMD xHC 1.1" + - smb: client: fix potential NULL deref in parse_dfs_referrals() + - ARM: PL011: Fix DMA support + - serial: sc16is7xx: address RX timeout interrupt errata + - serial: 8250: 8250_omap: Clear UART_HAS_RHR_IT_DIS bit + - serial: 8250: 8250_omap: Do not start RX DMA on THRI interrupt + - serial: 8250_omap: Add earlycon support for the AM654 UART controller + - devcoredump: Send uevent once devcd is ready + - x86/CPU/AMD: Check vendor in the AMD microcode callback + - USB: gadget: core: adjust uevent timing on gadget unbind + - cifs: Fix flushing, invalidation and file size with copy_file_range() + - cifs: Fix flushing, invalidation and file size with FICLONE + - MIPS: kernel: Clear FPU states when setting up kernel threads + - KVM: s390/mm: Properly reset no-dat + - KVM: SVM: Update EFER software model on CR0 trap for SEV-ES + - MIPS: Loongson64: Reserve vgabios memory on boot + - MIPS: Loongson64: Handle more memory types passed from firmware + - MIPS: Loongson64: Enable DMA noncoherent support + - riscv: Kconfig: Add select ARM_AMBA to SOC_STARFIVE + - [Config] updateconfigs after enabling ARM_AMBA on riscv + - scsi: sd: Fix sshdr use in sd_suspend_common() + - nouveau: use an rwlock for the event lock. + - modpost: fix section mismatch message for RELA + - drm/amdgpu: Do not program VF copy regs in mmhub v1.8 under SRIOV (v2) + - drm/amdgpu: finalizing mem_partitions at the end of GMC v9 sw_fini + - dm-crypt: start allocating with MAX_ORDER + - r8152: Hold the rtnl_lock for all of reset + - net: dsa: microchip: provide a list of valid protocols for xmit handler + - net/smc: fix missing byte order conversion in CLC handshake + - RDMA/core: Fix uninit-value access in ib_get_eth_speed() + - ARM: dts: imx6q: skov: fix ethernet clock regression + - ARM: dts: rockchip: Fix sdmmc_pwren's pinmux setting for RK3128 + - ARM: dts: bcm2711-rpi-400: Fix delete-node of led_act + - firmware: arm_scmi: Extend perf protocol ops to get number of domains + - firmware: arm_scmi: Extend perf protocol ops to get information of a domain + - firmware: arm_scmi: Fix frequency truncation by promoting multiplier type + - firmware: arm_scmi: Simplify error path in scmi_dvfs_device_opps_add() + - RDMA/irdma: Ensure iWarp QP queue memory is OS paged aligned + - RDMA/irdma: Fix support for 64k pages + - io_uring/kbuf: Fix an NULL vs IS_ERR() bug in io_alloc_pbuf_ring() + - io_uring/kbuf: check for buffer list readiness after NULL check + - arm64: dts: imx8-ss-lsio: Add PWM interrupts + - arm64: dts: freescale: imx8-ss-lsio: Fix #pwm-cells + - arm64: dts: imx93: correct mediamix power + - arm64: dts: imx8-apalis: set wifi regulator to always-on + - arm64: dts: rockchip: Fix eMMC Data Strobe PD on rk3588 + - scripts/gdb: fix lx-device-list-bus and lx-device-list-class + - ASoC: amd: yc: Fix non-functional mic on ASUS E1504FA + - ALSA: hda/realtek: Apply quirk for ASUS UM3504DA + - ALSA: hda/realtek: fix speakers on XPS 9530 (2023) + - ALSA: hda/realtek: Add quirk for Lenovo Yoga Pro 7 + - lib/group_cpus.c: avoid acquiring cpu hotplug lock in group_cpus_evenly + - leds: trigger: netdev: fix RTNL handling to prevent potential deadlock + - nfp: flower: fix for take a mutex lock in soft irq context and rcu lock + - workqueue: Make sure that wq_unbound_cpumask is never empty + - drivers/base/cpu: crash data showing should depends on KEXEC_CORE + - mm/memory_hotplug: add missing mem_hotplug_lock + - mm/memory_hotplug: fix error handling in add_memory_resource() + - drm/atomic-helpers: Invoke end_fb_access while owning plane state + - drm/i915/mst: Fix .mode_valid_ctx() return values + - drm/i915/mst: Reject modes that require the bigjoiner + - arm64: dts: mt7986: change cooling trips + - arm64: dts: mt7986: define 3W max power to both SFP on BPI-R3 + - arm64: dts: mt7986: fix emmc hs400 mode without uboot initialization + - arm64: dts: mediatek: mt8186: fix clock names for power domains + - arm64: dts: mediatek: mt8186: Change gpu speedbin nvmem cell name + - coresight: Fix crash when Perf and sysfs modes are used concurrently + - coresight: ultrasoc-smb: Fix sleep while close preempt in enable_smb + - coresight: ultrasoc-smb: Config SMB buffer before register sink + - coresight: ultrasoc-smb: Fix uninitialized before use buf_hw_base + - ASoC: ops: add correct range check for limiting volume + - nvmem: Do not expect fixed layouts to grab a layout driver + - serial: ma35d1: Validate console index before assignment + - powerpc/ftrace: Fix stack teardown in ftrace_no_trace + - perf metrics: Avoid segv if default metricgroup isn't set + - ASoC: qcom: sc8280xp: Limit speaker digital volumes + - gcc-plugins: randstruct: Update code comment in relayout_struct() + - drm/amdgpu: Fix refclk reporting for SMU v13.0.6 + - drm/amdgpu: Add bootloader status check + - drm/amdgpu: Add bootloader wait for PSP v13 + - drm/amdgpu: Restrict bootloader wait to SMUv13.0.6 + - drm/amdgpu: update retry times for psp vmbx wait + - drm/amdgpu: update retry times for psp BL wait + - drm/amdgpu: Restrict extended wait to PSP v13.0.6 + - Upstream stable to v6.1.68, v6.6.7 + * i915 regression introduced with 5.5 kernel (LP: #2044131) + - drm/i915: Skip some timing checks on BXT/GLK DSI transcoders + * Mantic update: upstream stable patchset 2024-01-26 (LP: #2051366) + - cifs: Fix FALLOC_FL_ZERO_RANGE by setting i_size if EOF moved + - cifs: Fix FALLOC_FL_INSERT_RANGE by setting i_size after EOF moved + - smb: client: report correct st_size for SMB and NFS symlinks + - pinctrl: avoid reload of p state in list iteration + - firewire: core: fix possible memory leak in create_units() + - mmc: sdhci-pci-gli: Disable LPM during initialization + - mmc: cqhci: Increase recovery halt timeout + - mmc: cqhci: Warn of halt or task clear failure + - mmc: cqhci: Fix task clearing in CQE error recovery + - mmc: block: Retry commands in CQE error recovery + - mmc: block: Do not lose cache flush during CQE error recovery + - mmc: block: Be sure to wait while busy in CQE error recovery + - ALSA: hda: Disable power-save on KONTRON SinglePC + - ALSA: hda/realtek: Headset Mic VREF to 100% + - ALSA: hda/realtek: Add supported ALC257 for ChromeOS + - dm-verity: align struct dm_verity_fec_io properly + - scsi: Change SCSI device boolean fields to single bit flags + - scsi: sd: Fix system start for ATA devices + - drm/amd: Enable PCIe PME from D3 + - drm/amdgpu: Force order between a read and write to the same address + - drm/amd/display: Include udelay when waiting for INBOX0 ACK + - drm/amd/display: Remove min_dst_y_next_start check for Z8 + - drm/amd/display: Use DRAM speed from validation for dummy p-state + - drm/amd/display: Update min Z8 residency time to 2100 for DCN314 + - drm/amd/display: fix ABM disablement + - dm verity: initialize fec io before freeing it + - dm verity: don't perform FEC for failed readahead IO + - nvme: check for valid nvme_identify_ns() before using it + - powercap: DTPM: Fix unneeded conversions to micro-Watts + - cpufreq/amd-pstate: Fix the return value of amd_pstate_fast_switch() + - dma-buf: fix check in dma_resv_add_fence + - bcache: revert replacing IS_ERR_OR_NULL with IS_ERR + - iommu/vt-d: Add MTL to quirk list to skip TE disabling + - KVM: PPC: Book3S HV: Fix KVM_RUN clobbering FP/VEC user registers + - powerpc: Don't clobber f0/vs0 during fp|altivec register save + - parisc: Mark ex_table entries 32-bit aligned in assembly.h + - parisc: Mark ex_table entries 32-bit aligned in uaccess.h + - parisc: Use natural CPU alignment for bug_table + - parisc: Mark lock_aligned variables 16-byte aligned on SMP + - parisc: Drop the HP-UX ENOSYM and EREMOTERELEASE error codes + - parisc: Mark jump_table naturally aligned + - parisc: Ensure 32-bit alignment on parisc unwind section + - parisc: Mark altinstructions read-only and 32-bit aligned + - btrfs: add dmesg output for first mount and last unmount of a filesystem + - btrfs: ref-verify: fix memory leaks in btrfs_ref_tree_mod() + - btrfs: fix off-by-one when checking chunk map includes logical address + - btrfs: send: ensure send_fd is writable + - btrfs: make error messages more clear when getting a chunk map + - btrfs: fix 64bit compat send ioctl arguments not initializing version member + - auxdisplay: hd44780: move cursor home after clear display command + - serial: sc16is7xx: Put IOControl register into regmap_volatile + - serial: sc16is7xx: add missing support for rs485 devicetree properties + - dpaa2-eth: increase the needed headroom to account for alignment + - uapi: propagate __struct_group() attributes to the container union + - selftests/net: ipsec: fix constant out of range + - selftests/net: fix a char signedness issue + - selftests/net: unix: fix unused variable compiler warning + - selftests/net: mptcp: fix uninitialized variable warnings + - octeontx2-af: Fix possible buffer overflow + - net: stmmac: xgmac: Disable FPE MMC interrupts + - octeontx2-pf: Fix adding mbox work queue entry when num_vfs > 64 + - octeontx2-af: Install TC filter rules in hardware based on priority + - octeontx2-pf: Restore TC ingress police rules when interface is up + - r8169: prevent potential deadlock in rtl8169_close + - ravb: Fix races between ravb_tx_timeout_work() and net related ops + - net: ravb: Check return value of reset_control_deassert() + - net: ravb: Use pm_runtime_resume_and_get() + - net: ravb: Make write access to CXR35 first before accessing other EMAC + registers + - net: ravb: Start TX queues after HW initialization succeeded + - net: ravb: Stop DMA in case of failures on ravb_open() + - net: ravb: Keep reverse order of operations in ravb_remove() + - octeontx2-af: Initialize 'cntr_val' to fix uninitialized symbol error + - spi: Fix null dereference on suspend + - cpufreq: imx6q: Don't disable 792 Mhz OPP unnecessarily + - iommu/vt-d: Omit devTLB invalidation requests when TES=0 + - iommu/vt-d: Disable PCI ATS in legacy passthrough mode + - iommu/vt-d: Make context clearing consistent with context mapping + - drm/amd/pm: fix a memleak in aldebaran_tables_init + - mmc: sdhci-sprd: Fix vqmmc not shutting down after the card was pulled + - drm/amd/display: Fix MPCC 1DLUT programming + - r8169: fix deadlock on RTL8125 in jumbo mtu mode + - xen: simplify evtchn_do_upcall() call maze + - x86/xen: fix percpu vcpu_info allocation + - smb: client: fix missing mode bits for SMB symlinks + - ksmbd: fix possible deadlock in smb2_open + - drm/i915: Also check for VGA converter in eDP probe + - net: libwx: fix memory leak on msix entry + - drm/amdgpu: correct the amdgpu runtime dereference usage count + - drm/amdgpu: fix memory overflow in the IB test + - drm/amdgpu: Update EEPROM I2C address for smu v13_0_0 + - drm/amd/display: force toggle rate wa for first link training for a retimer + - ACPI: video: Use acpi_video_device for cooling-dev driver data + - iommu/vt-d: Fix incorrect cache invalidation for mm notification + - io_uring: free io_buffer_list entries via RCU + - io_uring: don't guard IORING_OFF_PBUF_RING with SETUP_NO_MMAP + - iommu: Avoid more races around device probe + - ext2: Fix ki_pos update for DIO buffered-io fallback case + - btrfs: free the allocated memory if btrfs_alloc_page_array() fails + - io_uring/kbuf: recycle freed mapped buffer ring entries + - media: v4l2-subdev: Fix a 64bit bug + - netdevsim: Don't accept device bound programs + - net: rswitch: Fix type of ret in rswitch_start_xmit() + - net: rswitch: Fix return value in rswitch_start_xmit() + - net: rswitch: Fix missing dev_kfree_skb_any() in error path + - wifi: iwlwifi: mvm: fix an error code in iwl_mvm_mld_add_sta() + - wifi: mac80211: do not pass AP_VLAN vif pointer to drivers during flush + - net: dsa: mv88e6xxx: fix marvell 6350 switch probing + - dpaa2-eth: recycle the RX buffer only after all processing done + - bpf: Add missed allocation hint for bpf_mem_cache_alloc_flags() + - neighbour: Fix __randomize_layout crash in struct neighbour + - efi/unaccepted: Fix off-by-one when checking for overlapping ranges + - ethtool: don't propagate EOPNOTSUPP from dumps + - bpf, sockmap: af_unix stream sockets need to hold ref for pair sock + - powerpc/pseries/iommu: enable_ddw incorrectly returns direct mapping for SR- + IOV device + - s390/cmma: fix handling of swapper_pg_dir and invalid_pg_dir + - drm/amd/display: Refactor edp power control + - drm/amd/display: Remove power sequencing check + - drm/i915/gsc: Mark internal GSC engine with reserved uabi class + - drm/panel: starry-2081101qfh032011-53g: Fine tune the panel power sequence + - drm/panel: nt36523: fix return value check in nt36523_probe() + - cpufreq/amd-pstate: Fix scaling_min_freq and scaling_max_freq update + - cpufreq/amd-pstate: Only print supported EPP values for performance governor + - iommu: Fix printk arg in of_iommu_get_resv_regions() + - drm/amd/display: refactor ILR to make it work + - drm/amd/display: Reduce default backlight min from 5 nits to 1 nits + - Upstream stable to v6.1.66, v6.6.5 + * Mantic update: upstream stable patchset 2024-01-25 (LP: #2051231) + - afs: Fix afs_server_list to be cleaned up with RCU + - afs: Make error on cell lookup failure consistent with OpenAFS + - drm/panel: auo,b101uan08.3: Fine tune the panel power sequence + - drm/panel: simple: Fix Innolux G101ICE-L01 bus flags + - drm/panel: simple: Fix Innolux G101ICE-L01 timings + - wireguard: use DEV_STATS_INC() + - octeontx2-pf: Fix memory leak during interface down + - ata: pata_isapnp: Add missing error check for devm_ioport_map() + - drm/i915: do not clean GT table on error path + - drm/rockchip: vop: Fix color for RGB888/BGR888 format on VOP full + - HID: fix HID device resource race between HID core and debugging support + - ipv4: Correct/silence an endian warning in __ip_do_redirect + - net: usb: ax88179_178a: fix failed operations during ax88179_reset + - net/smc: avoid data corruption caused by decline + - arm/xen: fix xen_vcpu_info allocation alignment + - octeontx2-pf: Fix ntuple rule creation to direct packet to VF with higher Rx + queue than its PF + - amd-xgbe: handle corner-case during sfp hotplug + - amd-xgbe: handle the corner-case during tx completion + - amd-xgbe: propagate the correct speed and duplex status + - net: axienet: Fix check for partial TX checksum + - afs: Return ENOENT if no cell DNS record can be found + - afs: Fix file locking on R/O volumes to operate in local mode + - arm64: mm: Fix "rodata=on" when CONFIG_RODATA_FULL_DEFAULT_ENABLED=y + - i40e: Fix adding unsupported cloud filters + - nvmet: nul-terminate the NQNs passed in the connect command + - USB: dwc3: qcom: fix resource leaks on probe deferral + - USB: dwc3: qcom: fix ACPI platform device leak + - lockdep: Fix block chain corruption + - cifs: distribute channels across interfaces based on speed + - cifs: account for primary channel in the interface list + - cifs: fix leak of iface for primary channel + - MIPS: KVM: Fix a build warning about variable set but not used + - media: qcom: Initialise V4L2 async notifier later + - media: qcom: camss: Fix V4L2 async notifier error path + - media: qcom: camss: Fix genpd cleanup + - NFSD: Fix "start of NFS reply" pointer passed to nfsd_cache_update() + - NFSD: Fix checksum mismatches in the duplicate reply cache + - ACPI: resource: Skip IRQ override on ASUS ExpertBook B1402CVA + - swiotlb-xen: provide the "max_mapping_size" method + - bcache: replace a mistaken IS_ERR() by IS_ERR_OR_NULL() in + btree_gc_coalesce() + - md: fix bi_status reporting in md_end_clone_io + - bcache: fixup multi-threaded bch_sectors_dirty_init() wake-up race + - io_uring/fs: consider link->flags when getting path for LINKAT + - s390/dasd: protect device queue against concurrent access + - USB: serial: option: add Luat Air72*U series products + - hv_netvsc: fix race of netvsc and VF register_netdevice + - hv_netvsc: Fix race of register_netdevice_notifier and VF register + - hv_netvsc: Mark VF as slave before exposing it to user-mode + - dm-delay: fix a race between delay_presuspend and delay_bio + - bcache: check return value from btree_node_alloc_replacement() + - bcache: prevent potential division by zero error + - bcache: fixup init dirty data errors + - bcache: fixup lock c->root error + - usb: cdnsp: Fix deadlock issue during using NCM gadget + - USB: serial: option: add Fibocom L7xx modules + - USB: serial: option: fix FM101R-GL defines + - USB: serial: option: don't claim interface 4 for ZTE MF290 + - usb: typec: tcpm: Skip hard reset when in error recovery + - USB: dwc2: write HCINT with INTMASK applied + - usb: dwc3: Fix default mode initialization + - usb: dwc3: set the dma max_seg_size + - USB: dwc3: qcom: fix software node leak on probe errors + - USB: dwc3: qcom: fix wakeup after probe deferral + - io_uring: fix off-by one bvec index + - irqchip/gic-v3-its: Flush ITS tables correctly in non-coherent GIC designs + - drm/msm/dsi: use the correct VREG_CTRL_1 value for 4nm cphy + - s390/ism: ism driver implies smc protocol + - rxrpc: Fix RTT determination to use any ACK as a source + - rxrpc: Defer the response to a PING ACK until we've parsed it + - blk-cgroup: avoid to warn !rcu_read_lock_held() in blkg_lookup() + - fs: Pass AT_GETATTR_NOSEC flag to getattr interface function + - net: wangxun: fix kernel panic due to null pointer + - filemap: add a per-mapping stable writes flag + - block: update the stable_writes flag in bdev_add + - PM: tools: Fix sleepgraph syntax error + - net, vrf: Move dstats structure to core + - net: Move {l,t,d}stats allocation to core and convert veth & vrf + - bpf: Fix dev's rx stats for bpf_redirect_peer traffic + - drm/panel: boe-tv101wum-nl6: Fine tune Himax83102-j02 panel HFP and HBP + - s390/ipl: add missing IPL_TYPE_ECKD_DUMP case to ipl_init() + - net: veth: fix ethtool stats reporting + - vsock/test: fix SEQPACKET message bounds test + - net: ipa: fix one GSI register field width + - nvme: blank out authentication fabrics options if not configured + - mm: add a NO_INHERIT flag to the PR_SET_MDWE prctl + - prctl: Disable prctl(PR_SET_MDWE) on parisc + - kselftest/arm64: Fix output formatting for za-fork + - drm/msm/dpu: Add missing safe_lut_tbl in sc8280xp catalog + - drm/ast: Disconnect BMC if physical connector is connected + - thunderbolt: Set lane bonding bit only for downstream port + - ACPI: video: Use acpi_device_fix_up_power_children() + - ACPI: processor_idle: use raw_safe_halt() in acpi_idle_play_dead() + - ACPI: resource: Skip IRQ override on ASUS ExpertBook B1402CVA + - ACPI: PM: Add acpi_device_fix_up_power_children() function + - tls: fix NULL deref on tls_sw_splice_eof() with empty record + - dt-bindings: usb: microchip,usb5744: Add second supply + - usb: misc: onboard-hub: add support for Microchip USB5744 + - platform/x86/amd/pmc: adjust getting DRAM size behavior + - ALSA: hda: ASUS UM5302LA: Added quirks for cs35L41/10431A83 on i2c bus + - ALSA: hda/realtek: Add quirks for ASUS 2024 Zenbooks + - veth: Use tstats per-CPU traffic counters + - USB: xhci-plat: fix legacy PHY double init + - usb: config: fix iteration issue in 'usb_get_bos_descriptor()' + - Upstream stable to v6.1.65, v6.6.4 + * Mantic update: v6.5.13 upstream stable release (LP: #2051142) + - locking/ww_mutex/test: Fix potential workqueue corruption + - btrfs: abort transaction on generation mismatch when marking eb as dirty + - lib/generic-radix-tree.c: Don't overflow in peek() + - x86/retpoline: Make sure there are no unconverted return thunks due to KCSAN + - perf/core: Bail out early if the request AUX area is out of bound + - srcu: Fix srcu_struct node grpmask overflow on 64-bit systems + - selftests/lkdtm: Disable CONFIG_UBSAN_TRAP in test config + - clocksource/drivers/timer-imx-gpt: Fix potential memory leak + - clocksource/drivers/timer-atmel-tcb: Fix initialization on SAM9 hardware + - srcu: Only accelerate on enqueue time + - smp,csd: Throw an error if a CSD lock is stuck for too long + - cpu/hotplug: Don't offline the last non-isolated CPU + - workqueue: Provide one lock class key per work_on_cpu() callsite + - x86/mm: Drop the 4 MB restriction on minimal NUMA node memory size + - wifi: plfxlc: fix clang-specific fortify warning + - wifi: ath12k: Ignore fragments from uninitialized peer in dp + - wifi: mac80211_hwsim: fix clang-specific fortify warning + - wifi: mac80211: don't return unset power in ieee80211_get_tx_power() + - atl1c: Work around the DMA RX overflow issue + - bpf: Detect IP == ksym.end as part of BPF program + - wifi: ath9k: fix clang-specific fortify warnings + - wifi: ath12k: fix possible out-of-bound read in ath12k_htt_pull_ppdu_stats() + - wifi: ath10k: fix clang-specific fortify warning + - wifi: ath12k: fix possible out-of-bound write in + ath12k_wmi_ext_hal_reg_caps() + - ACPI: APEI: Fix AER info corruption when error status data has multiple + sections + - net: sfp: add quirk for Fiberstone GPON-ONU-34-20BI + - wifi: mt76: mt7921e: Support MT7992 IP in Xiaomi Redmibook 15 Pro (2023) + - net: annotate data-races around sk->sk_tx_queue_mapping + - net: annotate data-races around sk->sk_dst_pending_confirm + - wifi: ath12k: mhi: fix potential memory leak in ath12k_mhi_register() + - wifi: ath10k: Don't touch the CE interrupt registers after power up + - net: sfp: add quirk for FS's 2.5G copper SFP + - vsock: read from socket's error queue + - bpf: Ensure proper register state printing for cond jumps + - wifi: iwlwifi: mvm: fix size check for fw_link_id + - Bluetooth: btusb: Add date->evt_skb is NULL check + - Bluetooth: Fix double free in hci_conn_cleanup + - ACPI: EC: Add quirk for HP 250 G7 Notebook PC + - tsnep: Fix tsnep_request_irq() format-overflow warning + - gpiolib: acpi: Add a ignore interrupt quirk for Peaq C1010 + - platform/chrome: kunit: initialize lock for fake ec_dev + - of: address: Fix address translation when address-size is greater than 2 + - platform/x86: thinkpad_acpi: Add battery quirk for Thinkpad X120e + - drm/gma500: Fix call trace when psb_gem_mm_init() fails + - drm/amdkfd: ratelimited SQ interrupt messages + - drm/komeda: drop all currently held locks if deadlock happens + - drm/amd/display: Blank phantom OTG before enabling + - drm/amd/display: Don't lock phantom pipe on disabling + - drm/amd/display: add seamless pipe topology transition check + - drm/edid: Fixup h/vsync_end instead of h/vtotal + - md: don't rely on 'mddev->pers' to be set in mddev_suspend() + - drm/amdgpu: not to save bo in the case of RAS err_event_athub + - drm/amdkfd: Fix a race condition of vram buffer unref in svm code + - drm/amd: Update `update_pcie_parameters` functions to use uint8_t arguments + - drm/amd/display: use full update for clip size increase of large plane + source + - string.h: add array-wrappers for (v)memdup_user() + - kernel: kexec: copy user-array safely + - kernel: watch_queue: copy user-array safely + - drm_lease.c: copy user-array safely + - drm: vmwgfx_surface.c: copy user-array safely + - drm/msm/dp: skip validity check for DP CTS EDID checksum + - drm/amd: Fix UBSAN array-index-out-of-bounds for SMU7 + - drm/amd: Fix UBSAN array-index-out-of-bounds for Polaris and Tonga + - drm/amdgpu: Fix potential null pointer derefernce + - drm/panel: fix a possible null pointer dereference + - drm/panel/panel-tpo-tpg110: fix a possible null pointer dereference + - drm/radeon: fix a possible null pointer dereference + - drm/amdgpu/vkms: fix a possible null pointer dereference + - drm/panel: st7703: Pick different reset sequence + - drm/amdkfd: Fix shift out-of-bounds issue + - drm/amdgpu: Fix a null pointer access when the smc_rreg pointer is NULL + - drm/amd: Disable PP_PCIE_DPM_MASK when dynamic speed switching not supported + - drm/amd/display: fix num_ways overflow error + - drm/amd: check num of link levels when update pcie param + - arm64: dts: ls208xa: use a pseudo-bus to constrain usb dma size + - selftests/efivarfs: create-read: fix a resource leak + - ASoC: mediatek: mt8188-mt6359: support dynamic pinctrl + - ASoC: soc-card: Add storage for PCI SSID + - ASoC: SOF: Pass PCI SSID to machine driver + - crypto: pcrypt - Fix hungtask for PADATA_RESET + - ASoC: SOF: ipc4: handle EXCEPTION_CAUGHT notification from firmware + - RDMA/hfi1: Use FIELD_GET() to extract Link Width + - scsi: hisi_sas: Set debugfs_dir pointer to NULL after removing debugfs + - scsi: ibmvfc: Remove BUG_ON in the case of an empty event pool + - fs/jfs: Add check for negative db_l2nbperpage + - fs/jfs: Add validity check for db_maxag and db_agpref + - jfs: fix array-index-out-of-bounds in dbFindLeaf + - jfs: fix array-index-out-of-bounds in diAlloc + - HID: lenovo: Detect quirk-free fw on cptkbd and stop applying workaround + - ARM: 9320/1: fix stack depot IRQ stack filter + - ALSA: hda: Fix possible null-ptr-deref when assigning a stream + - gpiolib: of: Add quirk for mt2701-cs42448 ASoC sound + - PCI: tegra194: Use FIELD_GET()/FIELD_PREP() with Link Width fields + - PCI: mvebu: Use FIELD_PREP() with Link Width + - atm: iphase: Do PCI error checks on own line + - PCI: Do error check on own line to split long "if" conditions + - scsi: libfc: Fix potential NULL pointer dereference in fc_lport_ptp_setup() + - PCI: Use FIELD_GET() to extract Link Width + - PCI: Extract ATS disabling to a helper function + - PCI: Disable ATS for specific Intel IPU E2000 devices + - PCI: dwc: Add dw_pcie_link_set_max_link_width() + - PCI: dwc: Add missing PCI_EXP_LNKCAP_MLW handling + - misc: pci_endpoint_test: Add Device ID for R-Car S4-8 PCIe controller + - PCI: Use FIELD_GET() in Sapphire RX 5600 XT Pulse quirk + - ASoC: Intel: soc-acpi-cht: Add Lenovo Yoga Tab 3 Pro YT3-X90 quirk + - crypto: hisilicon/qm - prevent soft lockup in receive loop + - HID: Add quirk for Dell Pro Wireless Keyboard and Mouse KM5221W + - exfat: support handle zero-size directory + - mfd: intel-lpss: Add Intel Lunar Lake-M PCI IDs + - iio: adc: stm32-adc: harden against NULL pointer deref in stm32_adc_probe() + - thunderbolt: Apply USB 3.x bandwidth quirk only in software connection + manager + - tty: vcc: Add check for kstrdup() in vcc_probe() + - dt-bindings: phy: qcom,snps-eusb2-repeater: Add magic tuning overrides + - phy: qualcomm: phy-qcom-eusb2-repeater: Use regmap_fields + - phy: qualcomm: phy-qcom-eusb2-repeater: Zero out untouched tuning regs + - usb: dwc3: core: configure TX/RX threshold for DWC3_IP + - usb: ucsi: glink: use the connector orientation GPIO to provide switch + events + - soundwire: dmi-quirks: update HP Omen match + - f2fs: fix error path of __f2fs_build_free_nids + - f2fs: fix error handling of __get_node_page + - usb: host: xhci: Avoid XHCI resume delay if SSUSB device is not present + - usb: gadget: f_ncm: Always set current gadget in ncm_bind() + - 9p/trans_fd: Annotate data-racy writes to file::f_flags + - 9p: v9fs_listxattr: fix %s null argument warning + - i3c: mipi-i3c-hci: Fix out of bounds access in hci_dma_irq_handler + - i2c: i801: Add support for Intel Birch Stream SoC + - i2c: fix memleak in i2c_new_client_device() + - i2c: sun6i-p2wi: Prevent potential division by zero + - virtio-blk: fix implicit overflow on virtio_max_dma_size + - i3c: master: mipi-i3c-hci: Fix a kernel panic for accessing DAT_data. + - media: gspca: cpia1: shift-out-of-bounds in set_flicker + - media: vivid: avoid integer overflow + - media: ipu-bridge: increase sensor_name size + - gfs2: ignore negated quota changes + - gfs2: fix an oops in gfs2_permission + - media: cobalt: Use FIELD_GET() to extract Link Width + - media: ccs: Fix driver quirk struct documentation + - media: imon: fix access to invalid resource for the second interface + - drm/amd/display: Avoid NULL dereference of timing generator + - kgdb: Flush console before entering kgdb on panic + - riscv: VMAP_STACK overflow detection thread-safe + - i2c: dev: copy userspace array safely + - ASoC: ti: omap-mcbsp: Fix runtime PM underflow warnings + - drm/qxl: prevent memory leak + - ALSA: hda/realtek: Add quirk for ASUS UX7602ZM + - drm/amdgpu: fix software pci_unplug on some chips + - pwm: Fix double shift bug + - mtd: rawnand: tegra: add missing check for platform_get_irq() + - wifi: iwlwifi: Use FW rate for non-data frames + - sched/core: Optimize in_task() and in_interrupt() a bit + - samples/bpf: syscall_tp_user: Rename num_progs into nr_tests + - samples/bpf: syscall_tp_user: Fix array out-of-bound access + - dt-bindings: serial: fix regex pattern for matching serial node children + - SUNRPC: ECONNRESET might require a rebind + - mtd: rawnand: intel: check return value of devm_kasprintf() + - mtd: rawnand: meson: check return value of devm_kasprintf() + - drm/i915/mtl: avoid stringop-overflow warning + - NFSv4.1: fix handling NFS4ERR_DELAY when testing for session trunking + - SUNRPC: Add an IS_ERR() check back to where it was + - NFSv4.1: fix SP4_MACH_CRED protection for pnfs IO + - SUNRPC: Fix RPC client cleaned up the freed pipefs dentries + - RISC-V: hwprobe: Fix vDSO SIGSEGV + - riscv: provide riscv-specific is_trap_insn() + - gfs2: Silence "suspicious RCU usage in gfs2_permission" warning + - drm/i915/tc: Fix -Wformat-truncation in intel_tc_port_init + - vdpa_sim_blk: allocate the buffer zeroed + - vhost-vdpa: fix use after free in vhost_vdpa_probe() + - gcc-plugins: randstruct: Only warn about true flexible arrays + - bpf: handle ldimm64 properly in check_cfg() + - bpf: fix precision backtracking instruction iteration + - net: set SOCK_RCU_FREE before inserting socket into hashtable + - ipvlan: add ipvlan_route_v6_outbound() helper + - tty: Fix uninit-value access in ppp_sync_receive() + - xen/events: avoid using info_for_irq() in xen_send_IPI_one() + - net: hns3: fix add VLAN fail issue + - net: hns3: add barrier in vf mailbox reply process + - net: hns3: fix incorrect capability bit display for copper port + - net: hns3: fix out-of-bounds access may occur when coalesce info is read via + debugfs + - net: hns3: fix variable may not initialized problem in hns3_init_mac_addr() + - net: hns3: fix VF reset fail issue + - net: hns3: fix VF wrong speed and duplex issue + - tipc: Fix kernel-infoleak due to uninitialized TLV value + - net: mvneta: fix calls to page_pool_get_stats + - ppp: limit MRU to 64K + - xen/events: fix delayed eoi list handling + - blk-mq: make sure active queue usage is held for bio_integrity_prep() + - ptp: annotate data-race around q->head and q->tail + - bonding: stop the device in bond_setup_by_slave() + - net: ethernet: cortina: Fix max RX frame define + - net: ethernet: cortina: Handle large frames + - net: ethernet: cortina: Fix MTU max setting + - af_unix: fix use-after-free in unix_stream_read_actor() + - netfilter: nf_conntrack_bridge: initialize err to 0 + - netfilter: nf_tables: fix pointer math issue in nft_byteorder_eval() + - netfilter: nf_tables: bogus ENOENT when destroying element which does not + exist + - net: stmmac: fix rx budget limit check + - net: stmmac: avoid rx queue overrun + - pds_core: use correct index to mask irq + - pds_core: fix up some format-truncation complaints + - gve: Fixes for napi_poll when budget is 0 + - io_uring/fdinfo: remove need for sqpoll lock for thread/pid retrieval + - net/mlx5: Decouple PHC .adjtime and .adjphase implementations + - net/mlx5e: fix double free of encap_header + - net/mlx5e: fix double free of encap_header in update funcs + - net/mlx5e: Fix pedit endianness + - net/mlx5: Consolidate devlink documentation in devlink/mlx5.rst + - net/mlx5e: Make tx_port_ts logic resilient to out-of-order CQEs + - net/mlx5e: Add recovery flow for tx devlink health reporter for unhealthy + PTP SQ + - net/mlx5e: Update doorbell for port timestamping CQ before the software + counter + - net/mlx5: Increase size of irq name buffer + - net/mlx5e: Reduce the size of icosq_str + - net/mlx5e: Check return value of snprintf writing to fw_version buffer + - net/mlx5e: Check return value of snprintf writing to fw_version buffer for + representors + - net: sched: do not offload flows with a helper in act_ct + - macvlan: Don't propagate promisc change to lower dev in passthru + - tools/power/turbostat: Fix a knl bug + - tools/power/turbostat: Enable the C-state Pre-wake printing + - scsi: ufs: core: Expand MCQ queue slot to DeviceQueueDepth + 1 + - cifs: spnego: add ';' in HOST_KEY_LEN + - cifs: fix check of rc in function generate_smb3signingkey + - perf/core: Fix cpuctx refcounting + - i915/perf: Fix NULL deref bugs with drm_dbg() calls + - perf: arm_cspmu: Reject events meant for other PMUs + - drivers: perf: Check find_first_bit() return value + - media: venus: hfi: add checks to perform sanity on queue pointers + - perf intel-pt: Fix async branch flags + - powerpc/perf: Fix disabling BHRB and instruction sampling + - randstruct: Fix gcc-plugin performance mode to stay in group + - bpf: Fix check_stack_write_fixed_off() to correctly spill imm + - bpf: Fix precision tracking for BPF_ALU | BPF_TO_BE | BPF_END + - scsi: mpt3sas: Fix loop logic + - scsi: megaraid_sas: Increase register read retry rount from 3 to 30 for + selected registers + - scsi: ufs: qcom: Update PHY settings only when scaling to higher gears + - scsi: qla2xxx: Fix system crash due to bad pointer access + - scsi: ufs: core: Fix racing issue between ufshcd_mcq_abort() and ISR + - crypto: x86/sha - load modules based on CPU features + - x86/PCI: Avoid PME from D3hot/D3cold for AMD Rembrandt and Phoenix USB4 + - x86/apic/msi: Fix misconfigured non-maskable MSI quirk + - x86/cpu/hygon: Fix the CPU topology evaluation for real + - KVM: x86: hyper-v: Don't auto-enable stimer on write from user-space + - KVM: x86: Ignore MSR_AMD64_TW_CFG access + - KVM: x86: Clear bit12 of ICR after APIC-write VM-exit + - KVM: x86: Fix lapic timer interrupt lost after loading a snapshot. + - mmc: sdhci-pci-gli: GL9755: Mask the replay timer timeout of AER + - sched: psi: fix unprivileged polling against cgroups + - audit: don't take task_lock() in audit_exe_compare() code path + - audit: don't WARN_ON_ONCE(!current->mm) in audit_exe_compare() + - proc: sysctl: prevent aliased sysctls from getting passed to init + - tty/sysrq: replace smp_processor_id() with get_cpu() + - tty: serial: meson: fix hard LOCKUP on crtscts mode + - hvc/xen: fix console unplug + - hvc/xen: fix error path in xen_hvc_init() to always register frontend driver + - hvc/xen: fix event channel handling for secondary consoles + - PCI/sysfs: Protect driver's D3cold preference from user space + - mm/damon/sysfs: remove requested targets when online-commit inputs + - mm/damon/sysfs: update monitoring target regions for online input commit + - watchdog: move softlockup_panic back to early_param + - iommufd: Fix missing update of domains_itree after splitting iopt_area + - fbdev: stifb: Make the STI next font pointer a 32-bit signed offset + - dm crypt: account large pages in cc->n_allocated_pages + - mm/damon/lru_sort: avoid divide-by-zero in hot threshold calculation + - mm/damon/ops-common: avoid divide-by-zero during region hotness calculation + - mm/damon: implement a function for max nr_accesses safe calculation + - mm/damon/core: avoid divide-by-zero during monitoring results update + - mm/damon/sysfs-schemes: handle tried region directory allocation failure + - mm/damon/sysfs-schemes: handle tried regions sysfs directory allocation + failure + - mm/damon/sysfs: check error from damon_sysfs_update_target() + - parisc: Add nop instructions after TLB inserts + - ACPI: resource: Do IRQ override on TongFang GMxXGxx + - regmap: Ensure range selector registers are updated after cache sync + - wifi: ath11k: fix temperature event locking + - wifi: ath11k: fix dfs radar event locking + - wifi: ath11k: fix htt pktlog locking + - wifi: ath11k: fix gtk offload status event locking + - wifi: ath12k: fix htt mlo-offset event locking + - wifi: ath12k: fix dfs-radar and temperature event locking + - mmc: meson-gx: Remove setting of CMD_CFG_ERROR + - genirq/generic_chip: Make irq_remove_generic_chip() irqdomain aware + - sched/core: Fix RQCF_ACT_SKIP leak + - KEYS: trusted: tee: Refactor register SHM usage + - KEYS: trusted: Rollback init_trusted() consistently + - PCI: keystone: Don't discard .remove() callback + - PCI: keystone: Don't discard .probe() callback + - arm64: Restrict CPU_BIG_ENDIAN to GNU as or LLVM IAS 15.x or newer + - arm64: module: Fix PLT counting when CONFIG_RANDOMIZE_BASE=n + - parisc/agp: Use 64-bit LE values in SBA IOMMU PDIR table + - parisc/pdc: Add width field to struct pdc_model + - parisc/power: Add power soft-off when running on qemu + - cpufreq: stats: Fix buffer overflow detection in trans_stats() + - powercap: intel_rapl: Downgrade BIOS locked limits pr_warn() to pr_debug() + - clk: socfpga: Fix undefined behavior bug in struct stratix10_clock_data + - clk: visconti: Fix undefined behavior bug in struct visconti_pll_provider + - clk: qcom: ipq8074: drop the CLK_SET_RATE_PARENT flag from PLL clocks + - clk: qcom: ipq6018: drop the CLK_SET_RATE_PARENT flag from PLL clocks + - ksmbd: fix recursive locking in vfs helpers + - ksmbd: handle malformed smb1 message + - ksmbd: fix slab out of bounds write in smb_inherit_dacl() + - mmc: vub300: fix an error code + - mmc: sdhci_am654: fix start loop index for TAP value parsing + - mmc: Add quirk MMC_QUIRK_BROKEN_CACHE_FLUSH for Micron eMMC Q2J54A + - PCI/ASPM: Fix L1 substate handling in aspm_attr_store_common() + - PCI: kirin: Don't discard .remove() callback + - PCI: exynos: Don't discard .remove() callback + - wifi: wilc1000: use vmm_table as array in wilc struct + - svcrdma: Drop connection after an RDMA Read error + - rcu/tree: Defer setting of jiffies during stall reset + - arm64: dts: qcom: ipq6018: Fix hwlock index for SMEM + - dt-bindings: timer: renesas,rz-mtu3: Fix overflow/underflow interrupt names + - PM: hibernate: Use __get_safe_page() rather than touching the list + - PM: hibernate: Clean up sync_read handling in snapshot_write_next() + - rcu: kmemleak: Ignore kmemleak false positives when RCU-freeing objects + - btrfs: don't arbitrarily slow down delalloc if we're committing + - thermal: intel: powerclamp: fix mismatch in get function for max_idle + - arm64: dts: qcom: ipq5332: Fix hwlock index for SMEM + - arm64: dts: qcom: ipq8074: Fix hwlock index for SMEM + - firmware: qcom_scm: use 64-bit calling convention only when client is 64-bit + - ACPI: FPDT: properly handle invalid FPDT subtables + - arm64: dts: qcom: ipq9574: Fix hwlock index for SMEM + - arm64: dts: qcom: ipq6018: Fix tcsr_mutex register size + - leds: trigger: netdev: Move size check in set_device_name + - mfd: qcom-spmi-pmic: Fix reference leaks in revid helper + - mfd: qcom-spmi-pmic: Fix revid implementation + - ima: annotate iint mutex to avoid lockdep false positive warnings + - ima: detect changes to the backing overlay file + - netfilter: nf_tables: split async and sync catchall in two functions + - ASoC: soc-dai: add flag to mute and unmute stream during trigger + - ASoC: codecs: wsa883x: make use of new mute_unmute_on_trigger flag + - selftests/resctrl: Fix uninitialized .sa_flags + - selftests/resctrl: Remove duplicate feature check from CMT test + - selftests/resctrl: Move _GNU_SOURCE define into Makefile + - selftests/resctrl: Reduce failures due to outliers in MBA/MBM tests + - hid: lenovo: Resend all settings on reset_resume for compact keyboards + - ASoC: codecs: wsa-macro: fix uninitialized stack variables with name prefix + - jbd2: fix potential data lost in recovering journal raced with synchronizing + fs bdev + - quota: explicitly forbid quota files from being encrypted + - kernel/reboot: emergency_restart: Set correct system_state + - i2c: core: Run atomic i2c xfer when !preemptible + - selftests/clone3: Fix broken test under !CONFIG_TIME_NS + - tracing: Have the user copy of synthetic event address use correct context + - driver core: Release all resources during unbind before updating device + links + - mcb: fix error handling for different scenarios when parsing + - dmaengine: stm32-mdma: correct desc prep when channel running + - s390/mm: add missing arch_set_page_dat() call to vmem_crst_alloc() + - s390/cmma: fix detection of DAT pages + - mm/cma: use nth_page() in place of direct struct page manipulation + - mm/memory_hotplug: use pfn math in place of direct struct page manipulation + - mm: make PR_MDWE_REFUSE_EXEC_GAIN an unsigned long + - mtd: cfi_cmdset_0001: Byte swap OTP info + - cxl/region: Do not try to cleanup after cxl_region_setup_targets() fails + - i3c: master: cdns: Fix reading status register + - i3c: master: svc: fix race condition in ibi work thread + - i3c: master: svc: fix wrong data return when IBI happen during start frame + - i3c: master: svc: fix ibi may not return mandatory data byte + - i3c: master: svc: fix check wrong status register in irq handler + - i3c: master: svc: fix SDA keep low when polling IBIWON timeout happen + - i3c: master: svc: fix random hot join failure since timeout error + - cxl/region: Fix x1 root-decoder granularity calculations + - cxl/port: Fix delete_endpoint() vs parent unregistration race + - pmdomain: bcm: bcm2835-power: check if the ASB register is equal to enable + - pmdomain: amlogic: Fix mask for the second NNA mem PD domain + - pmdomain: imx: Make imx pgc power domain also set the fwnode + - PCI: qcom-ep: Add dedicated callback for writing to DBI2 registers + - PCI: Lengthen reset delay for VideoPropulsion Torrent QN16e card + - torture: Add a kthread-creation callback to _torture_create_kthread() + - torture: Add lock_torture writer_fifo module parameter + - torture: Make torture_hrtimeout_*() use TASK_IDLE + - torture: Move stutter_wait() timeouts to hrtimers + - torture: Make torture_hrtimeout_ns() take an hrtimer mode parameter + - rcutorture: Fix stuttering races and other issues + - mm/hugetlb: prepare hugetlb_follow_page_mask() for FOLL_PIN + - mm/hugetlb: use nth_page() in place of direct struct page manipulation + - parisc: Prevent booting 64-bit kernels on PA1.x machines + - parisc/pgtable: Do not drop upper 5 address bits of physical address + - parisc/power: Fix power soft-off when running on qemu + - xhci: Enable RPM on controllers that support low-power states + - fs: add ctime accessors infrastructure + - smb3: fix creating FIFOs when mounting with "sfu" mount option + - smb3: fix touch -h of symlink + - smb3: allow dumping session and tcon id to improve stats analysis and + debugging + - smb3: fix caching of ctime on setxattr + - smb: client: fix use-after-free bug in cifs_debug_data_proc_show() + - smb: client: fix use-after-free in smb2_query_info_compound() + - smb: client: fix potential deadlock when releasing mids + - cifs: reconnect helper should set reconnect for the right channel + - cifs: force interface update before a fresh session setup + - cifs: do not reset chan_max if multichannel is not supported at mount + - cifs: Fix encryption of cleared, but unset rq_iter data buffers + - xfs: recovery should not clear di_flushiter unconditionally + - btrfs: zoned: wait for data BG to be finished on direct IO allocation + - ALSA: info: Fix potential deadlock at disconnection + - ALSA: hda/realtek: Enable Mute LED on HP 255 G8 + - ALSA: hda/realtek - Add Dell ALC295 to pin fall back table + - ALSA: hda/realtek - Enable internal speaker of ASUS K6500ZC + - ALSA: hda/realtek: Enable Mute LED on HP 255 G10 + - ALSA: hda/realtek: Add quirks for HP Laptops + - Revert ncsi: Propagate carrier gain/loss events to the NCSI controller + - Revert "i2c: pxa: move to generic GPIO recovery" + - lsm: fix default return value for vm_enough_memory + - lsm: fix default return value for inode_getsecctx + - sbsa_gwdt: Calculate timeout with 64-bit math + - i2c: designware: Disable TX_EMPTY irq while waiting for block length byte + - s390/ap: fix AP bus crash on early config change callback invocation + - net: ethtool: Fix documentation of ethtool_sprintf() + - net: dsa: lan9303: consequently nested-lock physical MDIO + - net: phylink: initialize carrier state at creation + - gfs2: don't withdraw if init_threads() got interrupted + - i2c: i801: fix potential race in i801_block_transaction_byte_by_byte + - f2fs: do not return EFSCORRUPTED, but try to run online repair + - f2fs: set the default compress_level on ioctl + - f2fs: avoid format-overflow warning + - f2fs: split initial and dynamic conditions for extent_cache + - media: lirc: drop trailing space from scancode transmit + - media: sharp: fix sharp encoding + - media: venus: hfi_parser: Add check to keep the number of codecs within + range + - media: venus: hfi: fix the check to handle session buffer requirement + - media: venus: hfi: add checks to handle capabilities from firmware + - media: ccs: Correctly initialise try compose rectangle + - drm/mediatek/dp: fix memory leak on ->get_edid callback audio detection + - drm/mediatek/dp: fix memory leak on ->get_edid callback error path + - dm-bufio: fix no-sleep mode + - dm-verity: don't use blocking calls from tasklets + - nfsd: fix file memleak on client_opens_release + - NFSD: Update nfsd_cache_append() to use xdr_stream + - LoongArch: Mark __percpu functions as always inline + - riscv: Using TOOLCHAIN_HAS_ZIHINTPAUSE marco replace zihintpause + - riscv: put interrupt entries into .irqentry.text + - riscv: mm: Update the comment of CONFIG_PAGE_OFFSET + - riscv: correct pt_level name via pgtable_l5/4_enabled + - riscv: kprobes: allow writing to x0 + - mmc: sdhci-pci-gli: A workaround to allow GL9750 to enter ASPM L1.2 + - mm: fix for negative counter: nr_file_hugepages + - mm: kmem: drop __GFP_NOFAIL when allocating objcg vectors + - mptcp: deal with large GSO size + - mptcp: add validity check for sending RM_ADDR + - mptcp: fix setsockopt(IP_TOS) subflow locking + - selftests: mptcp: fix fastclose with csum failure + - mmc: sdhci-pci-gli: GL9750: Mask the replay timer timeout of AER + - media: qcom: camss: Fix pm_domain_on sequence in probe + - media: qcom: camss: Fix vfe_get() error jump + - media: qcom: camss: Fix VFE-17x vfe_disable_output() + - media: qcom: camss: Fix VFE-480 vfe_disable_output() + - media: qcom: camss: Fix missing vfe_lite clocks check + - media: qcom: camss: Fix set CSI2_RX_CFG1_VC_MODE when VC is greater than 3 + - media: qcom: camss: Fix invalid clock enable bit disjunction + - media: qcom: camss: Fix csid-gen2 for test pattern generator + - ext4: fix race between writepages and remount + - ext4: make sure allocate pending entry not fail + - ext4: apply umask if ACL support is disabled + - ext4: correct offset of gdb backup in non meta_bg group to update_backups + - ext4: mark buffer new if it is unwritten to avoid stale data exposure + - ext4: correct return value of ext4_convert_meta_bg + - ext4: correct the start block of counting reserved clusters + - ext4: remove gdb backup copy for meta bg in setup_new_flex_group_blocks + - ext4: add missed brelse in update_backups + - ext4: properly sync file size update after O_SYNC direct IO + - ext4: fix racy may inline data check in dio write + - drm/amd/pm: Handle non-terminated overdrive commands. + - drm: bridge: it66121: ->get_edid callback must not return err pointers + - drm/i915/mtl: Support HBR3 rate with C10 phy and eDP in MTL + - drm/i915: Bump GLK CDCLK frequency when driving multiple pipes + - drm/i915: Fix potential spectre vulnerability + - drm/i915: Flush WC GGTT only on required platforms + - drm/amdgpu/smu13: drop compute workload workaround + - drm/amdgpu: don't use pci_is_thunderbolt_attached() + - drm/amdgpu: fix GRBM read timeout when do mes_self_test + - drm/amdgpu: add a retry for IP discovery init + - drm/amdgpu: don't use ATRM for external devices + - drm/amdgpu: fix error handling in amdgpu_vm_init + - drm/amdgpu: fix error handling in amdgpu_bo_list_get() + - drm/amdgpu: lower CS errors to debug severity + - drm/amdgpu: Fix possible null pointer dereference + - drm/amd/display: Guard against invalid RPTR/WPTR being set + - drm/amd/display: Fix DSC not Enabled on Direct MST Sink + - drm/amd/display: fix a NULL pointer dereference in amdgpu_dm_i2c_xfer() + - drm/amd/display: Enable fast plane updates on DCN3.2 and above + - drm/amd/display: Change the DMCUB mailbox memory location from FB to inbox + - powerpc/powernv: Fix fortify source warnings in opal-prd.c + - tracing: Have trace_event_file have ref counters + - net/mlx5e: Avoid referencing skb after free-ing in drop path of + mlx5e_sq_xmit_wqe + - net/mlx5e: Track xmit submission to PTP WQ after populating metadata map + - Linux 6.5.13 + * Mantic update: v6.5.12 upstream stable release (LP: #2051129) + - hwmon: (nct6775) Fix incorrect variable reuse in fan_div calculation + - numa: Generalize numa_map_to_online_node() + - sched/topology: Fix sched_numa_find_nth_cpu() in CPU-less case + - sched/topology: Fix sched_numa_find_nth_cpu() in non-NUMA case + - sched/fair: Fix cfs_rq_is_decayed() on !SMP + - iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user() + - sched/uclamp: Set max_spare_cap_cpu even if max_spare_cap is 0 + - sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0 + - objtool: Propagate early errors + - sched: Fix stop_one_cpu_nowait() vs hotplug + - nfsd: Handle EOPENSTALE correctly in the filecache + - vfs: fix readahead(2) on block devices + - writeback, cgroup: switch inodes with dirty timestamps to release dying + cgwbs + - x86/srso: Fix SBPB enablement for (possible) future fixed HW + - x86/srso: Print mitigation for retbleed IBPB case + - x86/srso: Fix vulnerability reporting for missing microcode + - x86/srso: Fix unret validation dependencies + - futex: Don't include process MM in futex key on no-MMU + - x86/numa: Introduce numa_fill_memblks() + - ACPI/NUMA: Apply SRAT proximity domain to entire CFMWS window + - x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot + - x86/boot: Fix incorrect startup_gdt_descr.size + - cpu/hotplug: Remove dependancy against cpu_primary_thread_mask + - cpu/SMT: Create topology_smt_thread_allowed() + - cpu/SMT: Make SMT control more robust against enumeration failures + - x86/apic: Fake primary thread mask for XEN/PV + - srcu: Fix callbacks acceleration mishandling + - drivers/clocksource/timer-ti-dm: Don't call clk_get_rate() in stop function + - x86/nmi: Fix out-of-order NMI nesting checks & false positive warning + - pstore/platform: Add check for kstrdup + - perf: Optimize perf_cgroup_switch() + - selftests/x86/lam: Zero out buffer for readlink() + - PCI/MSI: Provide stubs for IMS functions + - string: Adjust strtomem() logic to allow for smaller sources + - genirq/matrix: Exclude managed interrupts in irq_matrix_allocated() + - irqchip/sifive-plic: Fix syscore registration for multi-socket systems + - wifi: ath12k: fix undefined behavior with __fls in dp + - wifi: cfg80211: add flush functions for wiphy work + - wifi: mac80211: move radar detect work to wiphy work + - wifi: mac80211: move scan work to wiphy work + - wifi: mac80211: move offchannel works to wiphy work + - wifi: mac80211: move sched-scan stop work to wiphy work + - wifi: mac80211: fix RCU usage warning in mesh fast-xmit + - wifi: cfg80211: fix off-by-one in element defrag + - wifi: mac80211: fix # of MSDU in A-MSDU calculation + - wifi: iwlwifi: honor the enable_ini value + - wifi: iwlwifi: don't use an uninitialized variable + - i40e: fix potential memory leaks in i40e_remove() + - iavf: Fix promiscuous mode configuration flow messages + - selftests/bpf: Correct map_fd to data_fd in tailcalls + - bpf, x86: save/restore regs with BPF_DW size + - bpf, x86: allow function arguments up to 12 for TRACING + - bpf, x64: Fix tailcall infinite loop + - wifi: cfg80211: fix kernel-doc for wiphy_delayed_work_flush() + - udp: introduce udp->udp_flags + - udp: move udp->no_check6_tx to udp->udp_flags + - udp: move udp->no_check6_rx to udp->udp_flags + - udp: move udp->gro_enabled to udp->udp_flags + - udp: add missing WRITE_ONCE() around up->encap_rcv + - udp: move udp->accept_udp_{l4|fraglist} to udp->udp_flags + - udp: lockless UDP_ENCAP_L2TPINUDP / UDP_GRO + - udp: annotate data-races around udp->encap_type + - udplite: remove UDPLITE_BIT + - udplite: fix various data-races + - selftests/bpf: Skip module_fentry_shadow test when bpf_testmod is not + available + - tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed + - bpf: Fix kfunc callback register type handling + - gve: Use size_add() in call to struct_size() + - mlxsw: Use size_mul() in call to struct_size() + - tls: Use size_add() in call to struct_size() + - tipc: Use size_add() in calls to struct_size() + - net: spider_net: Use size_add() in call to struct_size() + - net: ethernet: mtk_wed: fix EXT_INT_STATUS_RX_FBUF definitions for MT7986 + SoC + - wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file() + - wifi: ath12k: fix DMA unmap warning on NULL DMA address + - wifi: ath11k: fix boot failure with one MSI vector + - wifi: mac80211: fix check for unusable RX result + - PM: sleep: Fix symbol export for _SIMPLE_ variants of _PM_OPS() + - cpufreq: tegra194: fix warning due to missing opp_put + - wifi: mt76: mt7603: rework/fix rx pse hang check + - wifi: mt76: mt7603: improve watchdog reset reliablity + - wifi: mt76: mt7603: improve stuck beacon handling + - wifi: mt76: connac: move connac3 definitions in mt76_connac3_mac.h + - wifi: mt76: remove unused error path in mt76_connac_tx_complete_skb + - wifi: mt76: mt7996: set correct wcid in txp + - wifi: mt76: mt7996: fix beamform mcu cmd configuration + - wifi: mt76: mt7996: fix beamformee ss subfield in EHT PHY cap + - wifi: mt76: mt7996: fix wmm queue mapping + - wifi: mt76: mt7996: fix rx rate report for CBW320-2 + - wifi: mt76: mt7996: fix TWT command format + - wifi: mt76: update beacon size limitation + - wifi: mt76: fix potential memory leak of beacon commands + - wifi: mt76: get rid of false alamrs of tx emission issues + - wifi: mt76: fix per-band IEEE80211_CONF_MONITOR flag comparison + - wifi: mt76: mt7915: fix beamforming availability check + - wifi: ath: dfs_pattern_detector: Fix a memory initialization issue + - tcp_metrics: add missing barriers on delete + - tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics() + - tcp_metrics: do not create an entry from tcp_init_metrics() + - wifi: rtlwifi: fix EDCA limit set by BT coexistence + - ACPI: property: Allow _DSD buffer data only for byte accessors + - ACPI: video: Add acpi_backlight=vendor quirk for Toshiba Portégé R100 + - can: etas_es58x: rework the version check logic to silence -Wformat- + truncation + - can: etas_es58x: add missing a blank line after declaration + - wifi: ath11k: fix Tx power value during active CAC + - can: dev: can_restart(): don't crash kernel if carrier is OK + - can: dev: can_restart(): fix race condition between controller restart and + netif_carrier_on() + - can: dev: can_put_echo_skb(): don't crash kernel if can_priv::echo_skb is + accessed out of bounds + - PM / devfreq: rockchip-dfi: Make pmu regmap mandatory + - wifi: wfx: fix case where rates are out of order + - netfilter: nf_tables: Drop pointless memset when dumping rules + - wifi: rtw88: Remove duplicate NULL check before calling usb_kill/free_urb() + - thermal: core: prevent potential string overflow + - r8169: fix rare issue with broken rx after link-down on RTL8125 + - thermal/drivers/mediatek: Fix probe for THERMAL_V2 + - bpf: Fix missed rcu read lock in bpf_task_under_cgroup() + - selftests: netfilter: test for sctp collision processing in nf_conntrack + - net: skb_find_text: Ignore patterns extending past 'to' + - thermal: core: Don't update trip points inside the hysteresis range + - chtls: fix tp->rcv_tstamp initialization + - tcp: fix cookie_init_timestamp() overflows + - wifi: iwlwifi: mvm: update station's MFP flag after association + - wifi: iwlwifi: mvm: fix removing pasn station for responder + - wifi: iwlwifi: mvm: use correct sta ID for IGTK/BIGTK + - wifi: mac80211: don't recreate driver link debugfs in reconfig + - wifi: mac80211: Fix setting vif links + - wifi: iwlwifi: yoyo: swap cdb and jacket bits values + - wifi: iwlwifi: mvm: Correctly set link configuration + - wifi: iwlwifi: mvm: Fix key flags for IGTK on AP interface + - wifi: iwlwifi: mvm: Don't always bind/link the P2P Device interface + - wifi: iwlwifi: mvm: change iwl_mvm_flush_sta() API + - wifi: iwlwifi: mvm: fix iwl_mvm_mac_flush_sta() + - wifi: iwlwifi: mvm: remove TDLS stations from FW + - wifi: iwlwifi: increase number of RX buffers for EHT devices + - wifi: iwlwifi: mvm: fix netif csum flags + - wifi: iwlwifi: pcie: synchronize IRQs before NAPI + - wifi: iwlwifi: mvm: update IGTK in mvmvif upon D3 resume + - wifi: iwlwifi: empty overflow queue during flush + - Bluetooth: ISO: Use defer setup to separate PA sync and BIG sync + - Bluetooth: ISO: Pass BIG encryption info through QoS + - Bluetooth: Make handle of hci_conn be unique + - Bluetooth: hci_sync: Fix Opcode prints in bt_dev_dbg/err + - bpf: Fix unnecessary -EBUSY from htab_lock_bucket + - ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias() + - mptcp: properly account fastopen data + - ipv6: avoid atomic fragment on GSO packets + - virtio_net: use u64_stats_t infra to avoid data-races + - net: add DEV_STATS_READ() helper + - ipvlan: properly track tx_errors + - regmap: debugfs: Fix a erroneous check after snprintf() + - spi: tegra: Fix missing IRQ check in tegra_slink_probe() + - clk: qcom: ipq5332: Drop set rate parent from gpll0 dependent clocks + - clk: qcom: gcc-msm8996: Remove RPM bus clocks + - clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies + - clk: qcom: mmcc-msm8998: Don't check halt bit on some branch clks + - clk: qcom: mmcc-msm8998: Fix the SMMU GDSC + - clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src + - regulator: mt6358: Fail probe on unknown chip ID + - clk: imx: Select MXC_CLK for CLK_IMX8QXP + - clk: imx: imx8mq: correct error handling path + - clk: imx: imx8qxp: Fix elcdif_pll clock + - clk: renesas: rcar-gen3: Extend SDnH divider table + - clk: renesas: rzg2l: Wait for status bit of SD mux before continuing + - clk: renesas: rzg2l: Lock around writes to mux register + - clk: renesas: rzg2l: Trust value returned by hardware + - clk: renesas: rzg2l: Use FIELD_GET() for PLL register fields + - clk: renesas: rzg2l: Fix computation formula + - clk: linux/clk-provider.h: fix kernel-doc warnings and typos + - spi: nxp-fspi: use the correct ioremap function + - clk: ralink: mtmips: quiet unused variable warning + - clk: keystone: pll: fix a couple NULL vs IS_ERR() checks + - clk: ti: fix double free in of_ti_divider_clk_setup() + - clk: npcm7xx: Fix incorrect kfree + - clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data + - clk: mediatek: clk-mt6779: Add check for mtk_alloc_clk_data + - clk: mediatek: clk-mt6797: Add check for mtk_alloc_clk_data + - clk: mediatek: clk-mt7629-eth: Add check for mtk_alloc_clk_data + - clk: mediatek: clk-mt7629: Add check for mtk_alloc_clk_data + - clk: mediatek: clk-mt2701: Add check for mtk_alloc_clk_data + - clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM + - clk: qcom: clk-alpha-pll: introduce stromer plus ops + - clk: qcom: apss-ipq-pll: Use stromer plus ops for stromer plus pll + - clk: qcom: apss-ipq-pll: Fix 'l' value for ipq5332_pll_config + - clk: qcom: ipq9574: drop the CLK_SET_RATE_PARENT flag from GPLL clocks + - clk: qcom: ipq5332: drop the CLK_SET_RATE_PARENT flag from GPLL clocks + - clk: mediatek: fix double free in mtk_clk_register_pllfh() + - platform/x86: wmi: Fix probe failure when failing to register WMI devices + - platform/x86: wmi: Fix opening of char device + - regulator: qcom-rpmh: Fix smps4 regulator for pm8550ve + - hwmon: (axi-fan-control) Fix possible NULL pointer dereference + - hwmon: (coretemp) Fix potentially truncated sysfs attribute name + - Revert "hwmon: (sch56xx-common) Add DMI override table" + - Revert "hwmon: (sch56xx-common) Add automatic module loading on supported + devices" + - hwmon: (sch5627) Use bit macros when accessing the control register + - hwmon: (sch5627) Disallow write access if virtual registers are locked + - hte: tegra: Fix missing error code in tegra_hte_test_probe() + - platform/chrome: cros_ec_lpc: Separate host command and irq disable + - spi: omap2-mcspi: remove redundant dev_err_probe() + - spi: omap2-mcspi: switch to use modern name + - spi: omap2-mcspi: Fix hardcoded reference clock + - drm: bridge: samsung-dsim: Initialize ULPS EXIT for i.MX8M DSIM + - drm: bridge: for GENERIC_PHY_MIPI_DPHY also select GENERIC_PHY + - drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older + Exynos + - drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs + - drm/rockchip: vop: Fix call to crtc reset helper + - drm/rockchip: vop2: Don't crash for invalid duplicate_state + - drm/rockchip: vop2: Add missing call to crtc reset helper + - drm/radeon: possible buffer overflow + - drm: bridge: it66121: Fix invalid connector dereference + - drm/bridge: lt8912b: Fix bridge_detach + - drm/bridge: lt8912b: Fix crash on bridge detach + - drm/bridge: lt8912b: Manually disable HPD only if it was enabled + - drm/bridge: lt8912b: Add missing drm_bridge_attach call + - drm/mediatek: Fix coverity issue with unintentional integer overflow + - x86/tdx: Zero out the missing RSI in TDX_HYPERCALL macro + - drm/bridge: tc358768: Fix use of uninitialized variable + - drm/bridge: tc358768: Fix bit updates + - drm/bridge: tc358768: Use struct videomode + - drm/bridge: tc358768: Print logical values, not raw register values + - drm/bridge: tc358768: Use dev for dbg prints, not priv->dev + - drm/bridge: tc358768: Rename dsibclk to hsbyteclk + - drm/bridge: tc358768: Clean up clock period code + - drm/bridge: tc358768: Fix tc358768_ns_to_cnt() + - drm/aspeed: Convert to platform remove callback returning void + - drm/stm: Convert to platform remove callback returning void + - drm/tve200: Convert to platform remove callback returning void + - drm: Call drm_atomic_helper_shutdown() at shutdown/remove time for misc + drivers + - drm/amdgpu: Increase IH soft ring size for GFX v9.4.3 dGPU + - drm/amdkfd: fix some race conditions in vram buffer alloc/free of svm code + - drm/amdkfd: retry after EBUSY is returned from hmm_ranges_get_pages + - drm/amdkfd: Remove svm range validated_once flag + - drm/amdkfd: Handle errors from svm validate and map + - drm/amd/display: Fix null pointer dereference in error message + - drm/amd/display: Check all enabled planes in dm_check_crtc_cursor + - drm/amd/display: Refactor dm_get_plane_scale helper + - drm/amd/display: Bail from dm_check_crtc_cursor if no relevant change + - io_uring/kbuf: Fix check of BID wrapping in provided buffers + - io_uring/kbuf: Allow the full buffer id space for provided buffers + - drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data + - drm/mediatek: Fix iommu fault by swapping FBs after updating plane state + - drm/mediatek: Fix iommu fault during crtc enabling + - accel/habanalabs/gaudi2: Fix incorrect string length computation in + gaudi2_psoc_razwi_get_engines() + - drm/rockchip: cdn-dp: Fix some error handling paths in cdn_dp_probe() + - gpu: host1x: Correct allocated size for contexts + - drm/bridge: lt9611uxc: fix the race in the error path + - arm64/arm: xen: enlighten: Fix KPTI checks + - drm/rockchip: Fix type promotion bug in rockchip_gem_iommu_map() + - xenbus: fix error exit in xenbus_init() + - xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled + - drm/msm/dsi: use msm_gem_kernel_put to free TX buffer + - drm/msm/dsi: free TX buffer in unbind + - clocksource/drivers/arm_arch_timer: limit XGene-1 workaround + - drm: mediatek: mtk_dsi: Fix NO_EOT_PACKET settings/handling + - drivers/perf: hisi: use cpuhp_state_remove_instance_nocalls() for + hisi_hns3_pmu uninit process + - drm/amd/pm: Fix a memory leak on an error path + - perf/arm-cmn: Fix DTC domain detection + - drivers/perf: hisi_pcie: Check the type first in pmu::event_init() + - perf: hisi: Fix use-after-free when register pmu fails + - ARM: dts: renesas: blanche: Fix typo in GP_11_2 pin name + - arm64: dts: qcom: sdm845: Fix PSCI power domain names + - arm64: dts: qcom: sdm845: cheza doesn't support LMh node + - arm64: dts: qcom: sc7280: link usb3_phy_wrapper_gcc_usb30_pipe_clk + - arm64: dts: qcom: msm8916: Fix iommu local address range + - arm64: dts: qcom: msm8992-libra: drop duplicated reserved memory + - arm64: dts: qcom: sm6125: Pad APPS IOMMU address to 8 characters + - arm64: dts: qcom: sc7280: Add missing LMH interrupts + - arm64: dts: qcom: qrb2210-rb1: Swap UART index + - arm64: dts: qcom: sc7280: drop incorrect EUD port on SoC side + - arm64: dts: qcom: sm8150: add ref clock to PCIe PHYs + - arm64: dts: qcom: sm8350: fix pinctrl for UART18 + - arm64: dts: qcom: sdm845-mtp: fix WiFi configuration + - ARM64: dts: marvell: cn9310: Use appropriate label for spi1 pins + - arm64: dts: qcom: msm8976: Fix ipc bit shifts + - arm64: dts: qcom: msm8939: Fix iommu local address range + - riscv: dts: allwinner: remove address-cells from intc node + - arm64: dts: qcom: apq8016-sbc: Add missing ADV7533 regulators + - ARM: dts: qcom: apq8026-samsung-matisse-wifi: Fix inverted hall sensor + - ARM: dts: qcom: mdm9615: populate vsdcc fixed regulator + - soc: qcom: llcc: Handle a second device without data corruption + - kunit: Fix missed memory release in kunit_free_suite_set() + - firmware: ti_sci: Mark driver as non removable + - arm64: dts: ti: k3-am625-beagleplay: Fix typo in ramoops reg + - arm64: dts: ti: k3-am62a7-sk: Drop i2c-1 to 100Khz + - firmware: arm_ffa: Assign the missing IDR allocation ID to the FFA device + - firmware: arm_ffa: Allow the FF-A drivers to use 32bit mode of messaging + - ARM: dts: am3517-evm: Fix LED3/4 pinmux + - clk: scmi: Free scmi_clk allocated when the clocks with invalid info are + skipped + - arm64: dts: imx8qm-ss-img: Fix jpegenc compatible entry + - arm64: dts: imx8mp-debix-model-a: Remove USB hub reset-gpios + - arm64: dts: imx8mm: Add sound-dai-cells to micfil node + - arm64: dts: imx8mn: Add sound-dai-cells to micfil node + - arm64: tegra: Fix P3767 card detect polarity + - arm64: tegra: Fix P3767 QSPI speed + - firmware: tegra: Add suspend hook and reset BPMP IPC early on resume + - memory: tegra: Set BPMP msg flags to reset IPC channels + - arm64: tegra: Use correct interrupts for Tegra234 TKE + - selftests/pidfd: Fix ksft print formats + - selftests/resctrl: Ensure the benchmark commands fits to its array + - soc: qcom: pmic_glink: fix connector type to be DisplayPort + - ARM: dts: BCM5301X: Explicitly disable unused switch CPU ports + - iommufd: Add iopt_area_alloc() + - module/decompress: use vmalloc() for gzip decompression workspace + - ASoC: cs35l41: Handle mdsync_down reg write errors + - ASoC: cs35l41: Initialize completion object before requesting IRQ + - ASoC: cs35l41: Verify PM runtime resume errors in IRQ handler + - ASoC: cs35l41: Undo runtime PM changes at driver exit time + - ALSA: hda: cs35l41: Fix unbalanced pm_runtime_get() + - ALSA: hda: cs35l41: Undo runtime PM changes at driver exit time + - KEYS: Include linux/errno.h in linux/verification.h + - crypto: hisilicon/hpre - Fix a erroneous check after snprintf() + - hwrng: bcm2835 - Fix hwrng throughput regression + - hwrng: geode - fix accessing registers + - RDMA/core: Use size_{add,sub,mul}() in calls to struct_size() + - crypto: qat - fix state machines cleanup paths + - crypto: qat - ignore subsequent state up commands + - crypto: qat - fix unregistration of crypto algorithms + - crypto: qat - fix unregistration of compression algorithms + - scsi: ibmvfc: Fix erroneous use of rtas_busy_delay with hcall return code + - ASoC: soc-pcm.c: Make sure DAI parameters cleared if the DAI becomes + inactive + - libnvdimm/of_pmem: Use devm_kstrdup instead of kstrdup and check its return + value + - nd_btt: Make BTT lanes preemptible + - crypto: caam/qi2 - fix Chacha20 + Poly1305 self test failure + - crypto: caam/jr - fix Chacha20 + Poly1305 self test failure + - crypto: qat - increase size of buffers + - ASoC: SOF: ipc4-topology: Use size_add() in call to struct_size() + - PCI: vmd: Correct PCI Header Type Register's multi-function check + - hid: cp2112: Fix duplicate workqueue initialization + - crypto: hisilicon/qm - fix PF queue parameter issue + - ARM: 9321/1: memset: cast the constant byte to unsigned char + - ARM: 9323/1: mm: Fix ARCH_LOW_ADDRESS_LIMIT when CONFIG_ZONE_DMA + - ext4: move 'ix' sanity check to corrent position + - kselftest: vm: fix mdwe's mmap_FIXED test case + - ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not + described + - backlight: pwm_bl: Disable PWM on shutdown, suspend and remove + - ASoC: fsl-asoc-card: Add comment for mclk in the codec_priv + - dlm: fix no ack after final message + - IB/mlx5: Fix rdma counter binding for RAW QP + - RDMA/hns: Fix printing level of asynchronous events + - RDMA/hns: Fix uninitialized ucmd in hns_roce_create_qp_common() + - RDMA/hns: Fix signed-unsigned mixed comparisons + - RDMA/hns: Add check for SL + - RDMA/hns: The UD mode can only be configured with DCQCN + - ASoC: SOF: core: Ensure sof_ops_free() is still called when probe never ran. + - ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe + - scsi: ufs: core: Leave space for '\0' in utf8 desc string + - RDMA/hfi1: Workaround truncation compilation error + - HID: cp2112: Make irq_chip immutable + - hid: cp2112: Fix IRQ shutdown stopping polling for all IRQs on chip + - HID: uclogic: Fix user-memory-access bug in + uclogic_params_ugee_v2_init_event_hooks() + - HID: uclogic: Fix a work->entry not empty bug in __queue_work() + - sh: bios: Revive earlyprintk support + - HID: logitech-hidpp: Don't restart IO, instead defer hid_connect() only + - HID: logitech-hidpp: Revert "Don't restart communication if not necessary" + - HID: logitech-hidpp: Move get_wireless_feature_index() check to + hidpp_connect_event() + - ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails + - PCI: endpoint: Fix double free in __pci_epc_create() + - padata: Fix refcnt handling in padata_free_shell() + - certs: Break circular dependency when selftest is modular + - crypto: qat - fix deadlock in backlog processing + - ASoC: ams-delta.c: use component after check + - erofs: fix erofs_insert_workgroup() lockref usage + - IB/mlx5: Fix init stage error handling to avoid double free of same QP and + UAF + - mfd: core: Un-constify mfd_cell.of_reg + - mfd: core: Ensure disabled devices are skipped without aborting + - mfd: dln2: Fix double put in dln2_probe + - dt-bindings: mfd: mt6397: Split out compatible for MediaTek MT6366 PMIC + - mfd: arizona-spi: Set pdata.hpdet_channel for ACPI enumerated devs + - leds: turris-omnia: Drop unnecessary mutex locking + - leds: turris-omnia: Do not use SMBUS calls + - leds: pwm: Don't disable the PWM when the LED should be off + - leds: trigger: ledtrig-cpu:: Fix 'output may be truncated' issue for 'cpu' + - scripts/gdb: fix usage of MOD_TEXT not defined when CONFIG_MODULES=n + - perf stat: Fix aggr mode initialization + - iio: frequency: adf4350: Use device managed functions and fix power down + issue. + - perf kwork: Fix incorrect and missing free atom in work_push_atom() + - perf kwork: Add the supported subcommands to the document + - perf kwork: Set ordered_events to true in 'struct perf_tool' + - f2fs: compress: fix deadloop in f2fs_write_cache_pages() + - f2fs: compress: fix to avoid use-after-free on dic + - f2fs: compress: fix to avoid redundant compress extension + - f2fs: fix to drop meta_inode's page cache in f2fs_put_super() + - tty: tty_jobctrl: fix pid memleak in disassociate_ctty() + - perf parse-events: Remove unused PE_PMU_EVENT_FAKE token + - perf parse-events: Remove unused PE_KERNEL_PMU_EVENT token + - perf parse-events: Remove ABORT_ON + - perf tools: Revert enable indices setting syntax for BPF map + - perf parse-events: Fix tracepoint name memory leak + - livepatch: Fix missing newline character in klp_resolve_symbols() + - pinctrl: renesas: rzg2l: Make reverse order of enable() for disable() + - perf record: Fix BTF type checks in the off-cpu profiling + - dmaengine: idxd: Register dsa_bus_type before registering idxd sub-drivers + - usb: dwc2: fix possible NULL pointer dereference caused by driver + concurrency + - usb: chipidea: Fix DMA overwrite for Tegra + - usb: chipidea: Simplify Tegra DMA alignment code + - dmaengine: ti: edma: handle irq_of_parse_and_map() errors + - tools/perf: Update call stack check in builtin-lock.c + - misc: st_core: Do not call kfree_skb() under spin_lock_irqsave() + - tools: iio: iio_generic_buffer ensure alignment + - USB: usbip: fix stub_dev hub disconnect + - dmaengine: pxa_dma: Remove an erroneous BUG_ON() in pxad_free_desc() + - f2fs: fix to initialize map.m_pblk in f2fs_precache_extents() + - interconnect: qcom: qdu1000: Set ACV enable_mask + - interconnect: qcom: sc7180: Retire DEFINE_QBCM + - interconnect: qcom: sc7180: Set ACV enable_mask + - interconnect: qcom: sc7280: Set ACV enable_mask + - interconnect: qcom: sc8180x: Set ACV enable_mask + - interconnect: qcom: sc8280xp: Set ACV enable_mask + - interconnect: qcom: sdm670: Retire DEFINE_QBCM + - interconnect: qcom: sdm670: Set ACV enable_mask + - interconnect: qcom: sdm845: Retire DEFINE_QBCM + - interconnect: qcom: sdm845: Set ACV enable_mask + - interconnect: qcom: sm6350: Retire DEFINE_QBCM + - interconnect: qcom: sm6350: Set ACV enable_mask + - interconnect: qcom: sm8150: Retire DEFINE_QBCM + - interconnect: qcom: sm8150: Set ACV enable_mask + - interconnect: qcom: sm8350: Retire DEFINE_QBCM + - interconnect: qcom: sm8350: Set ACV enable_mask + - powerpc: Only define __parse_fpscr() when required + - interconnect: fix error handling in qnoc_probe() + - perf build: Add missing comment about NO_LIBTRACEEVENT=1 + - perf parse-events: Fix for term values that are raw events + - perf pmu: Remove logic for PMU name being NULL + - perf mem-events: Avoid uninitialized read + - s390/ap: re-init AP queues on config on + - modpost: fix tee MODULE_DEVICE_TABLE built on big-endian host + - modpost: fix ishtp MODULE_DEVICE_TABLE built on big-endian host + - perf tools: Do not ignore the default vmlinux.h + - powerpc/40x: Remove stale PTE_ATOMIC_UPDATES macro + - powerpc/xive: Fix endian conversion size + - powerpc: Hide empty pt_regs at base of the stack + - perf trace: Use the right bpf_probe_read(_str) variant for reading user data + - powerpc/vas: Limit open window failure messages in log bufffer + - powerpc/imc-pmu: Use the correct spinlock initializer. + - powerpc/pseries: fix potential memory leak in init_cpu_associativity() + - perf vendor events: Update PMC used in PM_RUN_INST_CMPL event for power10 + platform + - xhci: Loosen RPM as default policy to cover for AMD xHC 1.1 + - usb: host: xhci-plat: fix possible kernel oops while resuming + - perf machine: Avoid out of bounds LBR memory read + - libperf rc_check: Make implicit enabling work for GCC + - perf hist: Add missing puts to hist__account_cycles + - perf vendor events intel: Fix broadwellde tma_info_system_dram_bw_use metric + - perf vendor events intel: Add broadwellde two metrics + - 9p/net: fix possible memory leak in p9_check_errors() + - rtla: Fix uninitialized variable found + - i3c: Fix potential refcount leak in i3c_master_register_new_i3c_devs + - rtc: brcmstb-waketimer: support level alarm_irq + - cxl/pci: Remove unnecessary device reference management in sanitize work + - cxl/pci: Cleanup 'sanitize' to always poll + - cxl/pci: Remove inconsistent usage of dev_err_probe() + - cxl/pci: Clarify devm host for memdev relative setup + - cxl/pci: Fix sanitize notifier setup + - cxl/memdev: Fix sanitize vs decoder setup locking + - cxl/mem: Fix shutdown order + - virt: sevguest: Fix passing a stack buffer as a scatterlist target + - rtc: pcf85363: Allow to wake up system without IRQ + - rtc: pcf85363: fix wrong mask/val parameters in regmap_update_bits call + - cxl/region: Prepare the decoder match range helper for reuse + - cxl/region: Calculate a target position in a region interleave + - cxl/region: Use cxl_calc_interleave_pos() for auto-discovery + - cxl/region: Fix cxl_region_rwsem lock held when returning to user space + - cxl/core/regs: Rename @dev to @host in struct cxl_register_map + - cxl/port: Fix @host confusion in cxl_dport_setup_regs() + - cxl/hdm: Remove broken error path + - pcmcia: cs: fix possible hung task and memory leak pccardd() + - pcmcia: ds: fix refcount leak in pcmcia_device_add() + - pcmcia: ds: fix possible name leak in error path in pcmcia_device_add() + - media: imx-jpeg: initiate a drain of the capture queue in dynamic resolution + change + - media: hantro: Check whether reset op is defined before use + - media: verisilicon: Do not enable G2 postproc downscale if source is + narrower than destination + - media: ov5640: fix vblank unchange issue when work at dvp mode + - media: i2c: max9286: Fix some redundant of_node_put() calls + - media: ov5640: Fix a memory leak when ov5640_probe fails + - media: bttv: fix use after free error due to btv->timeout timer + - media: amphion: handle firmware debug message + - media: mtk-jpegenc: Fix bug in JPEG encode quality selection + - media: s3c-camif: Avoid inappropriate kfree() + - media: vidtv: psi: Add check for kstrdup + - media: vidtv: mux: Add check and kfree for kstrdup + - media: cedrus: Fix clock/reset sequence + - media: cadence: csi2rx: Unregister v4l2 async notifier + - media: dvb-usb-v2: af9035: fix missing unlock + - media: verisilicon: Fixes clock list for rk3588 av1 decoder + - media: imx-jpeg: notify source chagne event when the first picture parsed + - media: platform: mtk-mdp3: fix uninitialized variable in mdp_path_config() + - media: cec: meson: always include meson sub-directory in Makefile + - cpupower: fix reference to nonexistent document + - regmap: prevent noinc writes from clobbering cache + - drm/amdgpu/gfx10,11: use memcpy_to/fromio for MQDs + - drm/amdgpu: don't put MQDs in VRAM on ARM | ARM64 + - pwm: sti: Reduce number of allocations and drop usage of chip_data + - pwm: brcmstb: Utilize appropriate clock APIs in suspend/resume + - Input: synaptics-rmi4 - fix use after free in rmi_unregister_function() + - watchdog: ixp4xx: Make sure restart always works + - llc: verify mac len before reading mac header + - hsr: Prevent use after free in prp_create_tagged_frame() + - tipc: Change nla_policy for bearer-related names to NLA_NUL_STRING + - rxrpc: Fix two connection reaping bugs + - bpf: Check map->usercnt after timer->timer is assigned + - inet: shrink struct flowi_common + - octeontx2-pf: Fix error codes + - octeontx2-pf: Fix holes in error code + - net: page_pool: add missing free_percpu when page_pool_init fail + - dccp: Call security_inet_conn_request() after setting IPv4 addresses. + - dccp/tcp: Call security_inet_conn_request() after setting IPv6 addresses. + - Fix termination state for idr_for_each_entry_ul() + - net: stmmac: xgmac: Enable support for multiple Flexible PPS outputs + - selftests: pmtu.sh: fix result checking + - octeontx2-pf: Free pending and dropped SQEs + - net/smc: fix dangling sock under state SMC_APPFINCLOSEWAIT + - net/smc: allow cdc msg send rather than drop it with NULL sndbuf_desc + - net/smc: put sk reference if close work was canceled + - nvme: fix error-handling for io_uring nvme-passthrough + - riscv: boot: Fix creation of loader.bin + - tg3: power down device only on SYSTEM_POWER_OFF + - nbd: fix uaf in nbd_open + - blk-core: use pr_warn_ratelimited() in bio_check_ro() + - vsock/virtio: remove socket from connected/bound list on shutdown + - r8169: respect userspace disabling IFF_MULTICAST + - net: enetc: shorten enetc_setup_xdp_prog() error message to fit + NETLINK_MAX_FMTMSG_LEN + - i2c: iproc: handle invalid slave state + - netfilter: xt_recent: fix (increase) ipv6 literal buffer length + - netfilter: nat: fix ipv6 nat redirect with mapped and scoped addresses + - net/sched: act_ct: Always fill offloading tuple iifidx + - RISC-V: Don't fail in riscv_of_parent_hartid() for disabled HARTs + - module/decompress: use kvmalloc() consistently + - drm/vc4: tests: Fix UAF in the mock helpers + - drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE + - ASoC: mediatek: mt8186_mt6366_rt1019_rt5682s: trivial: fix error messages + - ASoC: hdmi-codec: register hpd callback on component probe + - ASoC: dapm: fix clock get name + - spi: spi-zynq-qspi: add spi-mem to driver kconfig dependencies + - arm64/arm: arm_pmuv3: perf: Don't truncate 64-bit registers + - fbdev: imsttfb: fix double free in probe() + - fbdev: imsttfb: fix a resource leak in probe + - fbdev: fsl-diu-fb: mark wr_reg_wa() static + - tracing/kprobes: Fix the order of argument descriptions + - Revert "drm/ast: report connection status on Display Port." + - selftests: mptcp: fix wait_rm_addr/sf parameters + - io_uring/net: ensure socket is marked connected on connect retry + - x86/amd_nb: Use Family 19h Models 60h-7Fh Function 4 IDs + - Revert "PCI/ASPM: Disable only ASPM_STATE_L1 when driver, disables L1" + - btrfs: use u64 for buffer sizes in the tree search ioctls + - bpf, x86: initialize the variable "first_off" in save_args() + - perf parse-events: Fix driver config term + - btrfs: make found_logical_ret parameter mandatory for function + queue_scrub_stripe() + - Linux 6.5.12 + * Mantic update: v6.5.11 upstream stable release (LP: #2051117) + - ASoC: Intel: sof_sdw: add support for SKU 0B14 + - ASoC: simple-card: fixup asoc_simple_probe() error handling + - coresight: tmc-etr: Disable warnings for allocation failures + - ASoC: fsl-asoc-card: use integer type for fll_id and pll_id + - ASoC: core: Do not call link_exit() on uninitialized rtd objects + - ASoC: tlv320adc3xxx: BUG: Correct micbias setting + - net: sched: cls_u32: Fix allocation size in u32_init() + - arm64: dts: imx93: add the Flex-CAN stop mode by GPR + - can: flexcan: remove the auto stop mode for IMX93 + - irqchip/riscv-intc: Mark all INTC nodes as initialized + - irqchip/stm32-exti: add missing DT IRQ flag translation + - dmaengine: ste_dma40: Fix PM disable depth imbalance in d40_probe + - ata: pata_parport: add custom version of wait_after_reset + - ata: pata_parport: fit3: implement IDE command set registers + - powerpc/85xx: Fix math emulation exception + - media: i2c: ov8858: Don't set fwnode in the driver + - Input: synaptics-rmi4 - handle reset delay when using SMBus trsnsport + - fbdev: atyfb: only use ioremap_uc() on i386 and ia64 + - fs/ntfs3: Add ckeck in ni_update_parent() + - fs/ntfs3: Write immediately updated ntfs state + - fs/ntfs3: Use kvmalloc instead of kmalloc(... __GFP_NOWARN) + - fs/ntfs3: Add more attributes checks in mi_enum_attr() + - fs/ntfs3: Fix alternative boot searching + - fs/ntfs3: Add more info into /proc/fs/ntfs3//volinfo + - fs/ntfs3: Do not allow to change label if volume is read-only + - fs/ntfs3: Fix possible NULL-ptr-deref in ni_readpage_cmpr() + - fs/ntfs3: Fix NULL pointer dereference on error in attr_allocate_frame() + - fs/ntfs3: Fix directory element type detection + - fs/ntfs3: Avoid possible memory leak + - spi: npcm-fiu: Fix UMA reads when dummy.nbytes == 0 + - ASoC: soc-dapm: Add helper for comparing widget name + - netfilter: nfnetlink_log: silence bogus compiler warning + - net/mlx5: Bridge, fix peer entry ageing in LAG mode + - x86/efistub: Don't try to print after ExitBootService() + - efi: fix memory leak in krealloc failure handling + - ASoC: rt5650: fix the wrong result of key button + - ASoC: codecs: tas2780: Fix log of failed reset via I2C. + - s390/kasan: handle DCSS mapping in memory holes + - fbdev: omapfb: fix some error codes + - fbdev: uvesafb: Call cn_del_callback() at the end of uvesafb_exit() + - scsi: mpt3sas: Fix in error path + - ASoC: da7219: Correct the process of setting up Gnd switch in AAD + - drm/amdgpu: Unset context priority is now invalid + - gpu/drm: Eliminate DRM_SCHED_PRIORITY_UNSET + - LoongArch: Use SYM_CODE_* to annotate exception handlers + - LoongArch: Export symbol invalid_pud_table for modules building + - LoongArch: Replace kmap_atomic() with kmap_local_page() in + copy_user_highpage() + - LoongArch: Disable WUC for pgprot_writecombine() like ioremap_wc() + - netfilter: nf_tables: audit log object reset once per table + - platform/mellanox: mlxbf-tmfifo: Fix a warning message + - drm/amdgpu: Reserve fences for VM update + - riscv: dts: thead: set dma-noncoherent to soc bus + - net: chelsio: cxgb4: add an error code check in t4_load_phy_fw + - r8152: Check for unplug in rtl_phy_patch_request() + - r8152: Check for unplug in r8153b_ups_en() / r8153c_ups_en() + - powerpc/mm: Fix boot crash with FLATMEM + - ceph_wait_on_conflict_unlink(): grab reference before dropping ->d_lock + - drm/amd/display: Don't use fsleep for PSR exit waits + - rust: make `UnsafeCell` the outer type in `Opaque` + - rust: types: make `Opaque` be `!Unpin` + - perf evlist: Avoid frequency mode for the dummy event + - mmap: fix vma_iterator in error path of vma_merge() + - mmap: fix error paths with dup_anon_vma() + - ALSA: usb-audio: add quirk flag to enable native DSD for McIntosh devices + - PCI: Prevent xHCI driver from claiming AMD VanGogh USB3 DRD device + - usb: storage: set 1.50 as the lower bcdDevice for older "Super Top" + compatibility + - usb: typec: tcpm: Add additional checks for contaminant + - usb: typec: tcpm: Fix NULL pointer dereference in tcpm_pd_svdm() + - usb: raw-gadget: properly handle interrupted requests + - Bluetooth: hci_bcm4377: Mark bcm4378/bcm4387 as BROKEN_LE_CODED + - tty: n_gsm: fix race condition in status line change on dead connections + - tty: 8250: Remove UC-257 and UC-431 + - tty: 8250: Add support for additional Brainboxes UC cards + - tty: 8250: Add support for Brainboxes UP cards + - tty: 8250: Add support for Intashield IS-100 + - tty: 8250: Fix port count of PX-257 + - tty: 8250: Fix up PX-803/PX-857 + - tty: 8250: Add support for additional Brainboxes PX cards + - tty: 8250: Add support for Intashield IX cards + - tty: 8250: Add Brainboxes Oxford Semiconductor-based quirks + - dt-bindings: serial: rs485: Add rs485-rts-active-high + - misc: pci_endpoint_test: Add deviceID for J721S2 PCIe EP device support + - serial: core: Fix runtime PM handling for pending tx + - ALSA: hda: intel-dsp-config: Fix JSL Chromebook quirk detection + - ASoC: SOF: sof-pci-dev: Fix community key quirk detection + - Linux 6.5.11 + * Mantic update: v6.5.11 upstream stable release (LP: #2051117) // black + screen when wake up from s3 with AMD W7600 gfx (LP: #2051341) + - drm/ttm: Reorder sys manager cleanup step + * CVE-2024-0646 + - net: tls, update curr on splice as well + * CVE-2024-0582 + - io_uring: enable io_mem_alloc/free to be used in other parts + - io_uring/kbuf: defer release of mapped buffer rings + * CVE-2024-0565 + - smb: client: fix OOB in receive_encrypted_standard() + * CVE-2023-51781 + - appletalk: Fix Use-After-Free in atalk_ioctl + * Reject connection when malformed L2CAP signal packet is received + (LP: #2047634) + - Bluetooth: L2CAP: Send reject on command corrupted request + * Mantic update: v6.5.10 upstream stable release (LP: #2049412) + - vdpa/mlx5: Fix firmware error on creation of 1k VQs + - smb3: allow controlling length of time directory entries are cached with dir + leases + - smb3: allow controlling maximum number of cached directories + - smb3: do not start laundromat thread when dir leases disabled + - smb: client: do not start laundromat thread on nohandlecache + - smb: client: make laundromat a delayed worker + - smb: client: prevent new fids from being removed by laundromat + - virtio_balloon: Fix endless deflation and inflation on arm64 + - virtio-mmio: fix memory leak of vm_dev + - virtio-crypto: handle config changed by work queue + - virtio_pci: fix the common cfg map size + - vsock/virtio: initialize the_virtio_vsock before using VQs + - vhost: Allow null msg.size on VHOST_IOTLB_INVALIDATE + - arm64: dts: qcom: apq8096-db820c: fix missing clock populate + - arm64: dts: qcom: msm8996-xiaomi: fix missing clock populate + - arm64: dts: rockchip: use codec as clock master on px30-ringneck-haikou + - arm64: dts: rockchip: set codec system-clock-fixed on px30-ringneck-haikou + - arm64: dts: qcom: sa8775p: correct PMIC GPIO label in gpio-ranges + - arm64: dts: rockchip: Add i2s0-2ch-bus-bclk-off pins to RK3399 + - arm64: dts: rockchip: Fix i2s0 pin conflict on ROCK Pi 4 boards + - i40e: sync next_to_clean and next_to_process for programming status desc + - mm: fix vm_brk_flags() to not bail out while holding lock + - hugetlbfs: clear resv_map pointer if mmap fails + - mm/page_alloc: correct start page when guard page debug is enabled + - mm/migrate: fix do_pages_move for compat pointers + - selftests/mm: include mman header to access MREMAP_DONTUNMAP identifier + - mm/mempolicy: fix set_mempolicy_home_node() previous VMA pointer + - hugetlbfs: extend hugetlb_vma_lock to private VMAs + - maple_tree: add GFP_KERNEL to allocations in mas_expected_entries() + - nfsd: lock_rename() needs both directories to live on the same fs + - vdpa_sim_blk: Fix the potential leak of mgmt_dev + - vdpa/mlx5: Fix double release of debugfs entry + - ARM: OMAP1: ams-delta: Fix MODEM initialization failure + - ARM: dts: rockchip: Fix i2c0 register address for RK3128 + - ARM: dts: rockchip: Add missing arm timer interrupt for RK3128 + - ARM: dts: rockchip: Add missing quirk for RK3128's dma engine + - ARM: dts: rockchip: Fix timer clocks for RK3128 + - accel/ivpu: Don't enter d0i3 during FLR + - drm/i915/pmu: Check if pmu is closed before stopping event + - drm/amd: Disable ASPM for VI w/ all Intel systems + - drm/dp_mst: Fix NULL deref in get_mst_branch_device_by_guid_helper() + - btrfs: remove v0 extent handling + - btrfs: fix unwritten extent buffer after snapshotting a new subvolume + - ARM: OMAP: timer32K: fix all kernel-doc warnings + - firmware/imx-dsp: Fix use_after_free in imx_dsp_setup_channels() + - clk: ti: Fix missing omap4 mcbsp functional clock and aliases + - clk: ti: Fix missing omap5 mcbsp functional clock and aliases + - r8169: fix the KCSAN reported data-race in rtl_tx() while reading tp->cur_tx + - r8169: fix the KCSAN reported data-race in rtl_tx while reading + TxDescArray[entry].opts1 + - r8169: fix the KCSAN reported data race in rtl_rx while reading desc->opts1 + - iavf: initialize waitqueues before starting watchdog_task + - i40e: Fix I40E_FLAG_VF_VLAN_PRUNING value + - treewide: Spelling fix in comment + - igb: Fix potential memory leak in igb_add_ethtool_nfc_entry + - net: do not leave an empty skb in write queue + - neighbour: fix various data-races + - igc: Fix ambiguity in the ethtool advertising + - net: ethernet: adi: adin1110: Fix uninitialized variable + - net: ieee802154: adf7242: Fix some potential buffer overflow in + adf7242_stats_show() + - net: usb: smsc95xx: Fix uninit-value access in smsc95xx_read_reg + - r8152: Increase USB control msg timeout to 5000ms as per spec + - r8152: Run the unload routine if we have errors during probe + - r8152: Cancel hw_phy_work if we have an error in probe + - r8152: Release firmware if we have an error in probe + - tcp: fix wrong RTO timeout when received SACK reneging + - wifi: cfg80211: pass correct pointer to rdev_inform_bss() + - wifi: cfg80211: fix assoc response warning on failed links + - wifi: mac80211: don't drop all unprotected public action frames + - net/handshake: fix file ref count in handshake_nl_accept_doit() + - gtp: uapi: fix GTPA_MAX + - gtp: fix fragmentation needed check with gso + - drm/i915/perf: Determine context valid in OA reports + - i40e: Fix wrong check for I40E_TXR_FLAGS_WB_ON_ITR + - netfilter: flowtable: GC pushes back packets to classic path + - net/sched: act_ct: additional checks for outdated flows + - drm/logicvc: Kconfig: select REGMAP and REGMAP_MMIO + - drm/i915/mcr: Hold GT forcewake during steering operations + - iavf: in iavf_down, disable queues when removing the driver + - scsi: sd: Introduce manage_shutdown device flag + - blk-throttle: check for overflow in calculate_bytes_allowed + - kasan: print the original fault addr when access invalid shadow + - iio: afe: rescale: Accept only offset channels + - iio: exynos-adc: request second interupt only when touchscreen mode is used + - iio: adc: xilinx-xadc: Don't clobber preset voltage/temperature thresholds + - iio: adc: xilinx-xadc: Correct temperature offset/scale for UltraScale + - i2c: muxes: i2c-mux-pinctrl: Use of_get_i2c_adapter_by_node() + - i2c: muxes: i2c-mux-gpmux: Use of_get_i2c_adapter_by_node() + - i2c: muxes: i2c-demux-pinctrl: Use of_get_i2c_adapter_by_node() + - i2c: stm32f7: Fix PEC handling in case of SMBUS transfers + - i2c: aspeed: Fix i2c bus hang in slave read + - tracing/kprobes: Fix symbol counting logic by looking at modules as well + - tracing/kprobes: Fix the description of variable length arguments + - misc: fastrpc: Reset metadata buffer to avoid incorrect free + - misc: fastrpc: Free DMA handles for RPC calls with no arguments + - misc: fastrpc: Clean buffers on remote invocation failures + - misc: fastrpc: Unmap only if buffer is unmapped from DSP + - nvmem: imx: correct nregs for i.MX6ULL + - nvmem: imx: correct nregs for i.MX6SLL + - nvmem: imx: correct nregs for i.MX6UL + - x86/tsc: Defer marking TSC unstable to a worker + - x86/i8259: Skip probing when ACPI/MADT advertises PCAT compatibility + - x86/cpu: Add model number for Intel Arrow Lake mobile processor + - perf/core: Fix potential NULL deref + - sparc32: fix a braino in fault handling in csum_and_copy_..._user() + - clk: Sanitize possible_parent_show to Handle Return Value of + of_clk_get_parent_name + - clk: socfpga: gate: Account for the divider in determine_rate + - clk: stm32: Fix a signedness issue in clk_stm32_composite_determine_rate() + - platform/x86: Add s2idle quirk for more Lenovo laptops + - mm/damon/sysfs: check DAMOS regions update progress from before_terminate() + - accel/ivpu/37xx: Fix missing VPUIP interrupts + - Linux 6.5.10 + * CVE-2023-6560 + - io_uring: don't allow discontig pages for IORING_SETUP_NO_MMAP + * CVE-2023-51782 + - net/rose: Fix Use-After-Free in rose_ioctl + * Mantic update: v6.5.9 upstream stable release (LP: #2049202) + - Bluetooth: hci_event: Ignore NULL link key + - Bluetooth: Reject connection with the device which has same BD_ADDR + - Bluetooth: Fix a refcnt underflow problem for hci_conn + - Bluetooth: vhci: Fix race when opening vhci device + - Bluetooth: hci_event: Fix coding style + - Bluetooth: avoid memcmp() out of bounds warning + - Bluetooth: hci_conn: Fix modifying handle while aborting + - ice: fix over-shifted variable + - ice: Fix safe mode when DDP is missing + - ice: reset first in crash dump kernels + - net/smc: return the right falback reason when prefix checks fail + - btrfs: fix stripe length calculation for non-zoned data chunk allocation + - nfc: nci: fix possible NULL pointer dereference in send_acknowledge() + - regmap: fix NULL deref on lookup + - KVM: x86: Mask LVTPC when handling a PMI + - x86/fpu: Allow caller to constrain xfeatures when copying to uabi buffer + - KVM: x86/pmu: Truncate counter value to allowed width on write + - KVM: x86: Constrain guest-supported xfeatures only at KVM_GET_XSAVE{2} + - x86: KVM: SVM: add support for Invalid IPI Vector interception + - x86: KVM: SVM: refresh AVIC inhibition in svm_leave_nested() + - tcp: check mptcp-level constraints for backlog coalescing + - mptcp: more conservative check for zero probes + - selftests: mptcp: join: no RST when rm subflow/addr + - mm: slab: Do not create kmalloc caches smaller than arch_slab_minalign() + - fs/ntfs3: Fix OOB read in ntfs_init_from_boot + - fs/ntfs3: Fix possible null-pointer dereference in hdr_find_e() + - fs/ntfs3: fix panic about slab-out-of-bounds caused by ntfs_list_ea() + - fs/ntfs3: Fix shift-out-of-bounds in ntfs_fill_super + - fs/ntfs3: fix deadlock in mark_as_free_ex + - Revert "net: wwan: iosm: enable runtime pm support for 7560" + - netfilter: nft_payload: fix wrong mac header matching + - drm/i915: Retry gtt fault when out of fence registers + - drm/mediatek: Correctly free sg_table in gem prime vmap + - drm/nouveau/disp: fix DP capable DSM connectors + - drm/edid: add 8 bpc quirk to the BenQ GW2765 + - ALSA: hda/realtek - Fixed ASUS platform headset Mic issue + - ALSA: hda/realtek: Add quirk for ASUS ROG GU603ZV + - ALSA: hda/relatek: Enable Mute LED on HP Laptop 15s-fq5xxx + - ASoC: codecs: wcd938x-sdw: fix use after free on driver unbind + - ASoC: codecs: wcd938x-sdw: fix runtime PM imbalance on probe errors + - ASoC: codecs: wcd938x: drop bogus bind error handling + - ASoC: codecs: wcd938x: fix unbind tear down order + - ASoC: codecs: wcd938x: fix resource leaks on bind errors + - ASoC: codecs: wcd938x: fix regulator leaks on probe errors + - ASoC: codecs: wcd938x: fix runtime PM imbalance on remove + - qed: fix LL2 RX buffer allocation + - xfrm: fix a data-race in xfrm_lookup_with_ifid() + - xfrm6: fix inet6_dev refcount underflow problem + - xfrm: fix a data-race in xfrm_gen_index() + - xfrm: interface: use DEV_STATS_INC() + - net: xfrm: skip policies marked as dead while reinserting policies + - fprobe: Fix to ensure the number of active retprobes is not zero + - wifi: cfg80211: use system_unbound_wq for wiphy work + - net: ipv4: fix return value check in esp_remove_trailer + - net: ipv6: fix return value check in esp_remove_trailer + - net: rfkill: gpio: prevent value glitch during probe + - tcp: fix excessive TLP and RACK timeouts from HZ rounding + - tcp: tsq: relax tcp_small_queue_check() when rtx queue contains a single skb + - tcp: Fix listen() warning with v4-mapped-v6 address. + - docs: fix info about representor identification + - tun: prevent negative ifindex + - gve: Do not fully free QPL pages on prefill errors + - ipv4: fib: annotate races around nh->nh_saddr_genid and nh->nh_saddr + - net: usb: smsc95xx: Fix an error code in smsc95xx_reset() + - octeon_ep: update BQL sent bytes before ringing doorbell + - i40e: prevent crash on probe if hw registers have invalid values + - net: dsa: bcm_sf2: Fix possible memory leak in bcm_sf2_mdio_register() + - bonding: Return pointer to data after pull on skb + - net/sched: sch_hfsc: upgrade 'rt' to 'sc' when it becomes a inner curve + - neighbor: tracing: Move pin6 inside CONFIG_IPV6=y section + - selftests: openvswitch: Catch cases where the tests are killed + - selftests: openvswitch: Fix the ct_tuple for v4 + - selftests: netfilter: Run nft_audit.sh in its own netns + - netfilter: nft_set_rbtree: .deactivate fails if element has expired + - netlink: Correct offload_xstats size + - netfilter: nf_tables: do not refresh timeout when resetting element + - netfilter: nf_tables: do not remove elements if set backend implements + .abort + - netfilter: nf_tables: revert do not remove elements if set backend + implements .abort + - selftests: openvswitch: Add version check for pyroute2 + - net: phy: bcm7xxx: Add missing 16nm EPHY statistics + - net: pktgen: Fix interface flags printing + - net: more strict VIRTIO_NET_HDR_GSO_UDP_L4 validation + - net: mdio-mux: fix C45 access returning -EIO after API change + - net: avoid UAF on deleted altname + - net: fix ifname in netlink ntf during netns move + - net: check for altname conflicts when changing netdev's netns + - iio: light: vcnl4000: Don't power on/off chip in config + - pwr-mlxbf: extend Kconfig to include gpio-mlxbf3 dependency + - ARM: dts: ti: omap: Fix noisy serial with overrun-throttle-ms for mapphone + - arm64: dts: mediatek: Fix "mediatek,merge-mute" and "mediatek,merge-fifo-en" + types + - fs-writeback: do not requeue a clean inode having skipped pages + - btrfs: fix race when refilling delayed refs block reserve + - btrfs: prevent transaction block reserve underflow when starting transaction + - btrfs: return -EUCLEAN for delayed tree ref with a ref count not equals to 1 + - btrfs: initialize start_slot in btrfs_log_prealloc_extents + - i2c: mux: Avoid potential false error message in i2c_mux_add_adapter + - overlayfs: set ctime when setting mtime and atime + - accel/ivpu: Don't flood dmesg with VPU ready message + - gpio: timberdale: Fix potential deadlock on &tgpio->lock + - ata: libata-core: Fix compilation warning in ata_dev_config_ncq() + - ata: libata-eh: Fix compilation warning in ata_eh_link_report() + - tracing: relax trace_event_eval_update() execution with cond_resched() + - wifi: mwifiex: Sanity check tlv_len and tlv_bitmap_len + - wifi: cfg80211: validate AP phy operation before starting it + - wifi: iwlwifi: Ensure ack flag is properly cleared. + - rfkill: sync before userspace visibility/changes + - HID: logitech-hidpp: Add Bluetooth ID for the Logitech M720 Triathlon mouse + - HID: holtek: fix slab-out-of-bounds Write in holtek_kbd_input_event + - Bluetooth: btusb: add shutdown function for QCA6174 + - Bluetooth: Avoid redundant authentication + - Bluetooth: hci_core: Fix build warnings + - wifi: cfg80211: Fix 6GHz scan configuration + - wifi: mac80211: work around Cisco AP 9115 VHT MPDU length + - wifi: mac80211: allow transmitting EAPOL frames with tainted key + - wifi: cfg80211: avoid leaking stack data into trace + - regulator/core: Revert "fix kobject release warning and memory leak in + regulator_register()" + - SUNRPC: Fail quickly when server does not recognize TLS + - SUNRPC/TLS: Lock the lower_xprt during the tls handshake + - nfs: decrement nrequests counter before releasing the req + - sky2: Make sure there is at least one frag_addr available + - ipv4/fib: send notify when delete source address routes + - drm: panel-orientation-quirks: Add quirk for One Mix 2S + - btrfs: fix some -Wmaybe-uninitialized warnings in ioctl.c + - btrfs: error out when COWing block using a stale transaction + - btrfs: error when COWing block from a root that is being deleted + - btrfs: error out when reallocating block for defrag using a stale + transaction + - platform/x86: touchscreen_dmi: Add info for the BUSH Bush Windows tablet + - drm/amd/pm: add unique_id for gc 11.0.3 + - HID: multitouch: Add required quirk for Synaptics 0xcd7e device + - HID: nintendo: reinitialize USB Pro Controller after resuming from suspend + - HID: Add quirk to ignore the touchscreen battery on HP ENVY 15-eu0556ng + - platform/x86: touchscreen_dmi: Add info for the Positivo C4128B + - cpufreq: schedutil: Update next_freq when cpufreq_limits change + - Bluetooth: hci_sync: Fix not handling ISO_LINK in hci_abort_conn_sync + - Bluetooth: hci_sync: Introduce PTR_UINT/UINT_PTR macros + - Bluetooth: ISO: Fix invalid context error + - Bluetooth: hci_sync: delete CIS in BT_OPEN/CONNECT/BOUND when aborting + - Bluetooth: hci_sync: always check if connection is alive before deleting + - net/mlx5: E-switch, register event handler before arming the event + - net/mlx5: Handle fw tracer change ownership event based on MTRC + - net/mlx5e: RX, Fix page_pool allocation failure recovery for striding rq + - net/mlx5e: RX, Fix page_pool allocation failure recovery for legacy rq + - net/mlx5e: XDP, Fix XDP_REDIRECT mpwqe page fragment leaks on shutdown + - net/mlx5e: Take RTNL lock before triggering netdev notifiers + - net/mlx5e: Don't offload internal port if filter device is out device + - net/mlx5e: Fix VF representors reporting zero counters to "ip -s" command + - net/tls: split tls_rx_reader_lock + - tcp: allow again tcp_disconnect() when threads are waiting + - Bluetooth: hci_event: Fix using memcmp when comparing keys + - tcp_bpf: properly release resources on error paths + - mtd: rawnand: qcom: Unmap the right resource upon probe failure + - mtd: rawnand: pl353: Ensure program page operations are successful + - mtd: rawnand: marvell: Ensure program page operations are successful + - mtd: rawnand: arasan: Ensure program page operations are successful + - mtd: rawnand: Ensure the nand chip supports cached reads + - mtd: spinand: micron: correct bitmask for ecc status + - mtd: physmap-core: Restore map_rom fallback + - dt-bindings: mmc: sdhci-msm: correct minimum number of clocks + - mmc: sdhci-pci-gli: fix LPM negotiation so x86/S0ix SoCs can suspend + - mmc: mtk-sd: Use readl_poll_timeout_atomic in msdc_reset_hw + - mmc: core: Fix error propagation for some ioctl commands + - mmc: core: sdio: hold retuning if sdio in 1-bit mode + - pinctrl: qcom: lpass-lpi: fix concurrent register updates + - pNFS: Fix a hang in nfs4_evict_inode() + - pNFS/flexfiles: Check the layout validity in ff_layout_mirror_prepare_stats + - NFSv4.1: fixup use EXCHGID4_FLAG_USE_PNFS_DS for DS server + - ACPI: irq: Fix incorrect return value in acpi_register_gsi() + - ACPI: bus: Move acpi_arm_init() to the place of after acpi_ghes_init() + - perf dlfilter: Fix use of addr_location__exit() in dlfilter__object_code() + - fanotify: limit reporting of event with non-decodeable file handles + - NFS: Fix potential oops in nfs_inode_remove_request() + - nfs42: client needs to strip file mode's suid/sgid bit after ALLOCATE op + - nvme: sanitize metadata bounce buffer for reads + - nvme-pci: add BOGUS_NID for Intel 0a54 device + - nvme-auth: use chap->s2 to indicate bidirectional authentication + - nvmet-auth: complete a request only after freeing the dhchap pointers + - nvme-rdma: do not try to stop unallocated queues + - USB: serial: option: add Telit LE910C4-WWX 0x1035 composition + - USB: serial: option: add entry for Sierra EM9191 with new firmware + - USB: serial: option: add Fibocom to DELL custom modem FM101R-GL + - thunderbolt: Call tb_switch_put() once DisplayPort bandwidth request is + finished + - s390/pci: fix iommu bitmap allocation + - tracing/kprobes: Return EADDRNOTAVAIL when func matches several symbols + - selftests/ftrace: Add new test case which checks non unique symbol + - KEYS: asymmetric: Fix sign/verify on pkcs1pad without a hash + - apple-gmux: Hard Code max brightness for MMIO gmux + - s390/cio: fix a memleak in css_alloc_subchannel + - platform/surface: platform_profile: Propagate error if profile registration + fails + - platform/x86: intel-uncore-freq: Conditionally create attribute for read + frequency + - platform/x86: msi-ec: Fix the 3rd config + - platform/x86: asus-wmi: Change ASUS_WMI_BRN_DOWN code from 0x20 to 0x2e + - platform/x86: asus-wmi: Only map brightness codes when using asus-wmi + backlight control + - platform/x86: asus-wmi: Map 0x2a code, Ignore 0x2b and 0x2c events + - rust: error: fix the description for `ECHILD` + - gpiolib: acpi: Add missing memset(0) to acpi_get_gpiod_from_data() + - gpio: vf610: set value before the direction to avoid a glitch + - gpio: vf610: mask the gpio irq in system suspend and support wakeup + - ASoC: cs35l56: Fix illegal use of init_completion() + - ASoC: pxa: fix a memory leak in probe() + - ASoC: cs42l42: Fix missing include of gpio/consumer.h + - drm/bridge: ti-sn65dsi86: Associate DSI device lifetime with auxiliary + device + - drm/i915/cx0: Only clear/set the Pipe Reset bit of the PHY Lanes Owned + - drm/amdgpu: Fix possible null pointer dereference + - powerpc/mm: Allow ARCH_FORCE_MAX_ORDER up to 12 + - powerpc/qspinlock: Fix stale propagated yield_cpu + - docs: Move rustdoc output, cross-reference it + - rust: docs: fix logo replacement + - phy: mapphone-mdm6600: Fix runtime disable on probe + - phy: mapphone-mdm6600: Fix runtime PM for remove + - phy: mapphone-mdm6600: Fix pinctrl_pm handling for sleep pins + - phy: qcom-qmp-usb: initialize PCS_USB registers + - phy: qcom-qmp-usb: split PCS_USB init table for sc8280xp and sa8775p + - phy: qcom-qmp-combo: Square out 8550 POWER_STATE_CONFIG1 + - phy: qcom-qmp-combo: initialize PCS_USB registers + - efi/unaccepted: Fix soft lockups caused by parallel memory acceptance + - net: move altnames together with the netdevice + - Bluetooth: hci_sock: fix slab oob read in create_monitor_event + - net: rfkill: reduce data->mtx scope in rfkill_fop_open + - docs: rust: update Rust docs output path + - kbuild: remove old Rust docs output path + - Bluetooth: hci_sock: Correctly bounds check and pad HCI_MON_NEW_INDEX name + - mptcp: avoid sending RST when closing the initial subflow + - selftests: mptcp: join: correctly check for no RST + - Linux 6.5.9 + * CVE-2023-51779 + - Bluetooth: af_bluetooth: Fix Use-After-Free in bt_sock_recvmsg + + -- Tim Gardner Thu, 15 Feb 2024 15:52:47 -0700 + +linux-azure (6.5.0-1015.15) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1015.15 -proposed tracker (LP: #2052984) + + * Azure: cifs modules missing from the linux-modules package (LP: #2052980) + - [Config] Move cifs.ko to linux-modules package + + -- Tim Gardner Mon, 12 Feb 2024 16:30:58 -0700 + +linux-azure (6.5.0-1014.14) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1014.14 -proposed tracker (LP: #2052273) + + [ Ubuntu: 6.5.0-21.21 ] + + * mantic/linux: 6.5.0-21.21 -proposed tracker (LP: #2052603) + * The display becomes frozen after some time when a HDMI device is connected. + (LP: #2049027) + - drm/i915/dmc: Don't enable any pipe DMC events + * partproke is broken on empty loopback device (LP: #2049689) + - block: Move checking GENHD_FL_NO_PART to bdev_add_partition() + * CVE-2023-51781 + - appletalk: Fix Use-After-Free in atalk_ioctl + * CVE-2023-51780 + - atm: Fix Use-After-Free in do_vcc_ioctl + * CVE-2023-6915 + - ida: Fix crash in ida_free when the bitmap is empty + * CVE-2024-0565 + - smb: client: fix OOB in receive_encrypted_standard() + * CVE-2024-0582 + - io_uring: enable io_mem_alloc/free to be used in other parts + - io_uring/kbuf: defer release of mapped buffer rings + * CVE-2024-0646 + - net: tls, update curr on splice as well + + -- Tim Gardner Thu, 08 Feb 2024 11:42:35 -0700 + +linux-azure (6.5.0-1013.13) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1013.13 -proposed tracker (LP: #2052541) + + * Azure: Fix TDX regressions in Azure 6.5 (LP: #2052519) + - x86/hyperv: Add sev-snp enlightened guest static key + - x86/hyperv: Set Virtual Trust Level in VMBus init message + - x86/hyperv: Mark Hyper-V vp assist page unencrypted in SEV-SNP enlightened + guest + - drivers: hv: Mark percpu hvcall input arg page unencrypted in SEV-SNP + enlightened guest + - x86/hyperv: Use vmmcall to implement Hyper-V hypercall in sev-snp + enlightened guest + - clocksource: hyper-v: Mark hyperv tsc page unencrypted in sev-snp + enlightened guest + - x86/hyperv: Add smp support for SEV-SNP guest + - x86/hyperv: Add hyperv-specific handling for VMMCALL under SEV-ES + - x86/hyperv: Add missing 'inline' to hv_snp_boot_ap() stub + - x86/hyperv: Fix undefined reference to isolation_type_en_snp without + CONFIG_HYPERV + - x86/hyperv: Add hv_isolation_type_tdx() to detect TDX guests + - x86/hyperv: Support hypercalls for fully enlightened TDX guests + - Drivers: hv: vmbus: Support fully enlightened TDX guests + - x86/hyperv: Fix serial console interrupts for fully enlightened TDX guests + - Drivers: hv: vmbus: Support >64 VPs for a fully enlightened TDX/SNP VM + - x86/hyperv: Introduce a global variable hyperv_paravisor_present + - Drivers: hv: vmbus: Bring the post_msg_page back for TDX VMs with the + paravisor + - x86/hyperv: Use TDX GHCI to access some MSRs in a TDX VM with the paravisor + - x86/hyperv: Remove hv_isolation_type_en_snp + - x86/hyperv: Move the code in ivm.c around to avoid unnecessary ifdef's + - x86/hyperv: Remove duplicate include + - x86/tdx: Retry partially-completed page conversion hypercalls + - x86/mm: Fix memory encryption features advertisement + - SAUCE: x86/EISA: Don't probe EISA bus for a TDX VM (with the paravisor) on + Hyper-V + - SAUCE: Drivers: hv: vmbus: Hardcode MMIO resources in vmbus_walk_resources() + when necessary + - SAUCE: x86/tdx: Support vmalloc() for tdx_enc_status_changed() + - SAUCE: x86/coco: Allow CPU online/offline for a TDX VM with the paravisor on + Hyper-V + - SAUCE: clocksource: hyper-v: Use InvariantTSC and enable TSC page for a TDX + VM without paravisor + + * Azure: Fix regression introduced in LP: #2045069 (LP: #2052453) + - hv_netvsc: Fix race condition between netvsc_probe and netvsc_remove + - hv_netvsc: Register VF in netvsc_probe if NET_DEVICE_REGISTER missed + + * Azure: MANA: Fix doorbell access for receives (LP: #2027615) + - net: mana: Batch ringing RX queue doorbell on receiving packets + - net: mana: Use the correct WQE count for ringing RQ doorbell + + * Kernel oops on 32-0bit kernels due to x86_cache_alignment initialization + (LP: #2039191) + - x86/boot: Move x86_cache_alignment initialization to correct spot + + -- Tim Gardner Tue, 06 Feb 2024 11:36:59 -0700 + +linux-azure (6.5.0-1012.12) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1012.12 -proposed tracker (LP: #2048356) + + * Azure: Deprecate Netvsc and implement MANA direct (LP: #2045069) + - hv_netvsc: fix race of netvsc and VF register_netdevice + - hv_netvsc: Fix race of register_netdevice_notifier and VF register + - hv_netvsc: Mark VF as slave before exposing it to user-mode + + [ Ubuntu: 6.5.0-17.17 ] + + * mantic/linux: 6.5.0-17.17 -proposed tracker (LP: #2049026) + * [UBUNTU 23.04] Regression: Ubuntu 23.04/23.10 do not include uvdevice + anymore (LP: #2048919) + - [Config] Enable S390_UV_UAPI (built-in) + + [ Ubuntu: 6.5.0-16.16 ] + + * mantic/linux: 6.5.0-16.16 -proposed tracker (LP: #2048372) + * Packaging resync (LP: #1786013) + - [Packaging] resync git-ubuntu-log + - [Packaging] resync update-dkms-versions helper + - [Packaging] remove helper scripts + - [Packaging] update annotations scripts + - debian/dkms-versions -- update from kernel-versions (main/2024.01.08) + * Add missing RPL P/U CPU IDs (LP: #2047398) + - drm/i915/rpl: Update pci ids for RPL P/U + * Fix BCM57416 lost after resume (LP: #2047518) + - bnxt_en: Clear resource reservation during resume + * Hotplugging SCSI disk in QEMU VM fails (LP: #2047382) + - Revert "PCI: acpiphp: Reassign resources on bridge if necessary" + * Update bnxt_en with bug fixes and support for Broadcom 5760X network + adapters (LP: #2045796) + - bnxt_en: use dev_consume_skb_any() in bnxt_tx_int + - eth: bnxt: move and rename reset helpers + - eth: bnxt: take the bit to set as argument of bnxt_queue_sp_work() + - eth: bnxt: handle invalid Tx completions more gracefully + - eth: bnxt: fix one of the W=1 warnings about fortified memcpy() + - eth: bnxt: fix warning for define in struct_group + - bnxt_en: Fix W=1 warning in bnxt_dcb.c from fortify memcpy() + - bnxt_en: Fix W=stringop-overflow warning in bnxt_dcb.c + - bnxt_en: Use the unified RX page pool buffers for XDP and non-XDP + - bnxt_en: Let the page pool manage the DMA mapping + - bnxt_en: Increment rx_resets counter in bnxt_disable_napi() + - bnxt_en: Save ring error counters across reset + - bnxt_en: Display the ring error counters under ethtool -S + - bnxt_en: Add tx_resets ring counter + - bnxt: use the NAPI skb allocation cache + - bnxt_en: Update firmware interface to 1.10.2.171 + - bnxt_en: Enhance hwmon temperature reporting + - bnxt_en: Move hwmon functions into a dedicated file + - bnxt_en: Modify the driver to use hwmon_device_register_with_info + - bnxt_en: Expose threshold temperatures through hwmon + - bnxt_en: Use non-standard attribute to expose shutdown temperature + - bnxt_en: Event handler for Thermal event + - bnxt_en: Support QOS and TPID settings for the SRIOV VLAN + - bnxt_en: Update VNIC resource calculation for VFs + - Revert "bnxt_en: Support QOS and TPID settings for the SRIOV VLAN" + - eth: bnxt: fix backward compatibility with older devices + - bnxt_en: Do not call sleeping hwmon_notify_event() from NAPI + - bnxt_en: Fix invoking hwmon_notify_event + - bnxt_en: add infrastructure to lookup ethtool link mode + - bnxt_en: support lane configuration via ethtool + - bnxt_en: refactor speed independent ethtool modes + - bnxt_en: Refactor NRZ/PAM4 link speed related logic + - bnxt_en: convert to linkmode_set_bit() API + - bnxt_en: extend media types to supported and autoneg modes + - bnxt_en: Fix 2 stray ethtool -S counters + - bnxt_en: Put the TX producer information in the TX BD opaque field + - bnxt_en: Add completion ring pointer in TX and RX ring structures + - bnxt_en: Restructure cp_ring_arr in struct bnxt_cp_ring_info + - bnxt_en: Add completion ring pointer in TX and RX ring structures + - bnxt_en: Remove BNXT_RX_HDL and BNXT_TX_HDL + - bnxt_en: Refactor bnxt_tx_int() + - bnxt_en: New encoding for the TX opaque field + - bnxt_en: Refactor bnxt_hwrm_set_coal() + - bnxt_en: Support up to 8 TX rings per MSIX + - bnxt_en: Add helper to get the number of CP rings required for TX rings + - bnxt_en: Add macros related to TC and TX rings + - bnxt_en: Use existing MSIX vectors for all mqprio TX rings + - bnxt_en: Optimize xmit_more TX path + - bnxt_en: The caller of bnxt_alloc_ctx_mem() should always free bp->ctx + - bnxt_en: Free bp->ctx inside bnxt_free_ctx_mem() + - bnxt_en: Restructure context memory data structures + - bnxt_en: Add page info to struct bnxt_ctx_mem_type + - bnxt_en: Use the pg_info field in bnxt_ctx_mem_type struct + - bnxt_en: Add bnxt_setup_ctxm_pg_tbls() helper function + - bnxt_en: Add support for new backing store query firmware API + - bnxt_en: Add support for HWRM_FUNC_BACKING_STORE_CFG_V2 firmware calls + - bnxt_en: Add db_ring_mask and related macro to bnxt_db_info struct. + - bnxt_en: Modify TX ring indexing logic. + - bnxt_en: Modify RX ring indexing logic. + - bnxt_en: Modify the NAPI logic for the new P7 chips + - bnxt_en: Rename some macros for the P5 chips + - bnxt_en: Fix backing store V2 logic + - bnxt_en: Update firmware interface to 1.10.3.15 + - bnxt_en: Define basic P7 macros + - bnxt_en: Consolidate DB offset calculation + - bnxt_en: Implement the new toggle bit doorbell mechanism on P7 chips + - bnxt_en: Refactor RSS capability fields + - bnxt_en: Add new P7 hardware interface definitions + - bnxt_en: Refactor RX VLAN acceleration logic. + - bnxt_en: Refactor and refine bnxt_tpa_start() and bnxt_tpa_end(). + - bnxt_en: Add support for new RX and TPA_START completion types for P7 + - bnxt_en: Refactor ethtool speeds logic + - bnxt_en: Support new firmware link parameters + - bnxt_en: Support force speed using the new HWRM fields + - bnxt_en: Report the new ethtool link modes in the new firmware interface + - bnxt_en: Add 5760X (P7) PCI IDs + - net: bnxt: fix a potential use-after-free in bnxt_init_tc + * drm: Update file owner during use (LP: #2047461) + - drm: Update file owner during use + * CVE-2023-6622 + - netfilter: nf_tables: bail out on mismatching dynset and set expressions + * CVE-2024-0193 + - netfilter: nf_tables: skip set commit for deleted/destroyed sets + * Support Cirrus CS35L41 codec on Dell Oasis 13/14/16 laptops (LP: #2044096) + - ALSA: hda/realtek: Add support dual speaker for Dell + * Add support of MTL audio of Lenovo (LP: #2048078) + - ALSA: hda: intel-nhlt: Ignore vbps when looking for DMIC 32 bps format + * Fix AMDGPU crash on 6.5 kernel (LP: #2047389) + - drm/amdgpu: disable MCBP by default + * Some machines can't pass the pm-graph test (LP: #2046217) + - wifi: iwlwifi: pcie: rescan bus if no parent + * Sound: Add rtl quirk of M90-Gen5 (LP: #2046105) + - ALSA: hda/realtek: Enable headset on Lenovo M90 Gen5 + * linux tools packages for derived kernels refuse to install simultaneously + due to libcpupower name collision (LP: #2035971) + - [Packaging] Statically link libcpupower into cpupower tool + * [Debian] autoreconstruct - Do not generate chmod -x for deleted files + (LP: #2045562) + - [Debian] autoreconstruct - Do not generate chmod -x for deleted files + * CVE-2023-6931 + - perf: Fix perf_event_validate_size() + - perf: Fix perf_event_validate_size() lockdep splat + * Mantic update: v6.5.8 upstream stable release (LP: #2046269) + - net: stmmac: remove unneeded stmmac_poll_controller + - RDMA/cxgb4: Check skb value for failure to allocate + - perf/arm-cmn: Fix the unhandled overflow status of counter 4 to 7 + - platform/x86: think-lmi: Fix reference leak + - drm/i915: Register engines early to avoid type confusion + - cpuidle, ACPI: Evaluate LPI arch_flags for broadcast timer + - drm/amdgpu: Fix a memory leak + - platform/x86: hp-wmi:: Mark driver struct with __refdata to prevent section + mismatch warning + - media: dt-bindings: imx7-csi: Make power-domains not required for imx8mq + - drm/amd/display: implement pipe type definition and adding accessors + - drm/amd/display: apply edge-case DISPCLK WDIVIDER changes to master OTG + pipes only + - scsi: Do not rescan devices with a suspended queue + - ata: pata_parport: fix pata_parport_devchk + - ata: pata_parport: implement set_devctl + - HID: logitech-hidpp: Fix kernel crash on receiver USB disconnect + - quota: Fix slow quotaoff + - dm crypt: Fix reqsize in crypt_iv_eboiv_gen + - ASoC: amd: yc: Fix non-functional mic on Lenovo 82YM + - ASoC: hdmi-codec: Fix broken channel map reporting + - ata: libata-scsi: Disable scsi device manage_system_start_stop + - net: prevent address rewrite in kernel_bind() + - arm64: dts: qcom: sm8150: extend the size of the PDC resource + - dt-bindings: interrupt-controller: renesas,rzg2l-irqc: Update description + for '#interrupt-cells' property + - irqchip: renesas-rzg2l: Fix logic to clear TINT interrupt source + - KEYS: trusted: Remove redundant static calls usage + - ALSA: usb-audio: Fix microphone sound on Opencomm2 Headset + - ALSA: usb-audio: Fix microphone sound on Nexigo webcam. + - ALSA: hda: cs35l41: Cleanup and fix double free in firmware request + - ALSA: hda/realtek: Change model for Intel RVP board + - ASoC: SOF: amd: fix for firmware reload failure after playback + - ASoC: simple-card-utils: fixup simple_util_startup() error handling + - ASoC: Intel: soc-acpi: fix Dell SKU 0B34 + - ASoC: Intel: soc-acpi: Add entry for HDMI_In capture support in MTL match + table + - ASoC: fsl_sai: Don't disable bitclock for i.MX8MP + - ASoC: Intel: sof_sdw: add support for SKU 0B14 + - ASoC: Intel: soc-acpi: Add entry for sof_es8336 in MTL match table. + - ALSA: hda/realtek - ALC287 merge RTK codec with CS CS35L41 AMP + - ALSA: hda/realtek: Add quirk for HP Victus 16-d1xxx to enable mute LED + - ALSA: hda/realtek: Add quirk for mute LEDs on HP ENVY x360 15-eu0xxx + - pinctrl: nuvoton: wpcm450: fix out of bounds write + - pinctrl: starfive: jh7110: Fix failure to set irq after CONFIG_PM is enabled + - drm/msm/dp: do not reinitialize phy unless retry during link training + - drm/msm/dsi: skip the wait for video mode done if not applicable + - drm/msm/dsi: fix irq_of_parse_and_map() error checking + - drm/msm/dpu: change _dpu_plane_calc_bw() to use u64 to avoid overflow + - drm/msm/dp: Add newlines to debug printks + - drm/msm/dpu: fail dpu_plane_atomic_check() based on mdp clk limits + - phy: lynx-28g: cancel the CDR check work item on the remove path + - phy: lynx-28g: lock PHY while performing CDR lock workaround + - phy: lynx-28g: serialize concurrent phy_set_mode_ext() calls to shared + registers + - net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems + - net: dsa: qca8k: fix potential MDIO bus conflict when accessing internal + PHYs via management frames + - can: isotp: isotp_sendmsg(): fix TX state detection and wait behavior + - can: sun4i_can: Only show Kconfig if ARCH_SUNXI is set + - arm64: dts: mediatek: fix t-phy unit name + - arm64: dts: mediatek: mt8195: Set DSU PMU status to fail + - devlink: Hold devlink lock on health reporter dump get + - ravb: Fix up dma_free_coherent() call in ravb_remove() + - ravb: Fix use-after-free issue in ravb_tx_timeout_work() + - ieee802154: ca8210: Fix a potential UAF in ca8210_probe + - mlxsw: fix mlxsw_sp2_nve_vxlan_learning_set() return type + - xen-netback: use default TX queue size for vifs + - riscv, bpf: Sign-extend return values + - riscv, bpf: Track both a0 (RISC-V ABI) and a5 (BPF) return values + - xdp: Fix zero-size allocation warning in xskq_create() + - drm/vmwgfx: fix typo of sizeof argument + - bpf: Fix verifier log for async callback return values + - net: refine debug info in skb_checksum_help() + - octeontx2-pf: mcs: update PN only when update_pn is true + - net: macsec: indicate next pn update when offloading + - net: phy: mscc: macsec: reject PN update requests + - net/mlx5e: macsec: use update_pn flag instead of PN comparation + - drm/panel: boe-tv101wum-nl6: Completely pull GPW to VGL before TP term + - ixgbe: fix crash with empty VF macvlan list + - net/smc: Fix dependency of SMC on ISM + - net/mlx5e: Again mutually exclude RX-FCS and RX-port-timestamp + - s390/bpf: Fix clobbering the caller's backchain in the trampoline + - s390/bpf: Fix unwinding past the trampoline + - net: nfc: fix races in nfc_llcp_sock_get() and nfc_llcp_sock_get_sn() + - net: tcp: fix crashes trying to free half-baked MTU probes + - pinctrl: renesas: rzn1: Enable missing PINMUX + - af_packet: Fix fortified memcpy() without flex array. + - nfc: nci: assert requested protocol is valid + - octeontx2-pf: Fix page pool frag allocation warning + - rswitch: Fix renesas_eth_sw_remove() implementation + - rswitch: Fix imbalance phy_power_off() calling + - workqueue: Override implicit ordered attribute in + workqueue_apply_unbound_cpumask() + - riscv: signal: fix sigaltstack frame size checking + - ovl: temporarily disable appending lowedirs + - dmaengine: stm32-mdma: abort resume if no ongoing transfer + - dmaengine: stm32-dma: fix stm32_dma_prep_slave_sg in case of MDMA chaining + - dmaengine: stm32-dma: fix residue in case of MDMA chaining + - dmaengine: stm32-mdma: use Link Address Register to compute residue + - dmaengine: stm32-mdma: set in_flight_bytes in case CRQA flag is set + - usb: xhci: xhci-ring: Use sysdev for mapping bounce buffer + - xhci: track port suspend state correctly in unsuccessful resume cases + - xhci: Clear EHB bit only at end of interrupt handler + - xhci: Preserve RsvdP bits in ERSTBA register correctly + - net: usb: dm9601: fix uninitialized variable use in dm9601_mdio_read + - usb: dwc3: Soft reset phy on probe for host + - usb: cdns3: Modify the return value of cdns_set_active () to void when + CONFIG_PM_SLEEP is disabled + - usb: hub: Guard against accesses to uninitialized BOS descriptors + - usb: musb: Get the musb_qh poniter after musb_giveback + - usb: musb: Modify the "HWVers" register address + - iio: pressure: bmp280: Fix NULL pointer exception + - iio: imu: bno055: Fix missing Kconfig dependencies + - iio: cros_ec: fix an use-after-free in cros_ec_sensors_push_data() + - iio: adc: imx8qxp: Fix address for command buffer registers + - iio: dac: ad3552r: Correct device IDs + - iio: admv1013: add mixer_vgate corner cases + - iio: pressure: dps310: Adjust Timeout Settings + - iio: pressure: ms5611: ms5611_prom_is_valid false negative bug + - iio: adc: ad7192: Correct reference voltage + - iio: addac: Kconfig: update ad74413r selections + - media: subdev: Don't report V4L2_SUBDEV_CAP_STREAMS when the streams API is + disabled + - arm64: dts: mediatek: mt8195-demo: fix the memory size to 8GB + - arm64: dts: mediatek: mt8195-demo: update and reorder reserved memory + regions + - drm: Do not overrun array in drm_gem_get_pages() + - drm/tiny: correctly print `struct resource *` on error + - drm/atomic-helper: relax unregistered connector check + - drm/amdgpu: add missing NULL check + - drm/amd/display: Don't set dpms_off for seamless boot + - ACPI: resource: Skip IRQ override on ASUS ExpertBook B1402CBA + - ACPI: resource: Add TongFang GM6BGEQ, GM6BG5Q and GM6BG0Q to + irq1_edge_low_force_override[] + - ACPI: EC: Add quirk for the HP Pavilion Gaming 15-dk1xxx + - serial: Reduce spinlocked portion of uart_rs485_config() + - serial: 8250_omap: Fix errors with no_console_suspend + - serial: core: Fix checks for tx runtime PM state + - binder: fix memory leaks of spam and pending work + - ksmbd: not allow to open file if delelete on close bit is set + - perf/x86/lbr: Filter vsyscall addresses + - x86/cpu: Fix AMD erratum #1485 on Zen4-based CPUs + - x86/alternatives: Disable KASAN in apply_alternatives() + - mcb: remove is_added flag from mcb_device struct + - thunderbolt: Workaround an IOMMU fault on certain systems with Intel Maple + Ridge + - thunderbolt: Check that lane 1 is in CL0 before enabling lane bonding + - thunderbolt: Correct TMU mode initialization from hardware + - thunderbolt: Restart XDomain discovery handshake after failure + - powerpc/pseries: Fix STK_PARAM access in the hcall tracing code + - powerpc/47x: Fix 47x syscall return crash + - libceph: use kernel_connect() + - ceph: fix incorrect revoked caps assert in ceph_fill_file_size() + - ceph: fix type promotion bug on 32bit systems + - Input: powermate - fix use-after-free in powermate_config_complete + - Input: psmouse - fix fast_reconnect function for PS/2 mode + - Input: xpad - add PXN V900 support + - Input: i8042 - add Fujitsu Lifebook E5411 to i8042 quirk table + - Input: xpad - add HyperX Clutch Gladiate Support + - Input: goodix - ensure int GPIO is in input for gpio_count == 1 && + gpio_int_idx == 0 case + - tee: amdtee: fix use-after-free vulnerability in amdtee_close_session + - mctp: perform route lookups under a RCU read-side lock + - block: Don't invalidate pagecache for invalid falloc modes + - nfp: flower: avoid rmmod nfp crash issues + - can: sja1000: Always restart the Tx queue after an overrun + - power: supply: qcom_battmgr: fix battery_id type + - power: supply: qcom_battmgr: fix enable request endianness + - usb: typec: ucsi: Use GET_CAPABILITY attributes data to set power supply + scope + - cgroup: Remove duplicates in cgroup v1 tasks file + - dma-buf: add dma_fence_timestamp helper + - scsi: ufs: core: Correct clear TM error log + - riscv: Only consider swbp/ss handlers for correct privileged mode + - counter: chrdev: fix getting array extensions + - counter: microchip-tcb-capture: Fix the use of internal GCLK logic + - coresight: Fix run time warnings while reusing ETR buffer + - riscv: Remove duplicate objcopy flag + - RISC-V: Fix wrong use of CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK + - usb: typec: ucsi: Fix missing link removal + - usb: typec: altmodes/displayport: Signal hpd low when exiting mode + - usb: typec: ucsi: Clear EVENT_PENDING bit if ucsi_send_command fails + - usb: gadget: udc-xilinx: replace memcpy with memcpy_toio + - usb: gadget: ncm: Handle decoding of multiple NTB's in unwrap call + - usb: cdnsp: Fixes issue with dequeuing not queued requests + - usb: typec: qcom: Update the logic of regulator enable and disable + - usb: misc: onboard_hub: add support for Microchip USB2412 USB 2.0 hub + - dmaengine: idxd: use spin_lock_irqsave before wait_event_lock_irq + - dmaengine: mediatek: Fix deadlock caused by synchronize_irq() + - powerpc/8xx: Fix pte_access_permitted() for PAGE_NONE + - powerpc/64e: Fix wrong test in __ptep_test_and_clear_young() + - fs: Fix kernel-doc warnings + - fs: factor out vfs_parse_monolithic_sep() helper + - ovl: fix regression in parsing of mount options with escaped comma + - ovl: make use of ->layers safe in rcu pathwalk + - ovl: fix regression in showing lowerdir mount option + - ALSA: hda/realtek - Fixed two speaker platform + - Linux 6.5.8 + * Mantic update: v6.5.7 upstream stable release (LP: #2045806) + - ASoC: soc-utils: Export snd_soc_dai_is_dummy() symbol + - ASoC: tegra: Fix redundant PLLA and PLLA_OUT0 updates + - maple_tree: add mas_is_active() to detect in-tree walks + - mptcp: Remove unnecessary test for __mptcp_init_sock() + - mptcp: rename timer related helper to less confusing names + - mptcp: fix dangling connection hang-up + - scsi: core: Improve type safety of scsi_rescan_device() + - scsi: Do not attempt to rescan suspended devices + - ata: libata-scsi: Fix delayed scsi_rescan_device() execution + - btrfs: remove btrfs_writepage_endio_finish_ordered + - btrfs: remove end_extent_writepage + - btrfs: don't clear uptodate on write errors + - arm64: add HWCAP for FEAT_HBC (hinted conditional branches) + - arm64: cpufeature: Fix CLRBHB and BC detection + - net: add sysctl accept_ra_min_rtr_lft + - net: change accept_ra_min_rtr_lft to affect all RA lifetimes + - net: release reference to inet6_dev pointer + - iommu/arm-smmu-v3: Avoid constructing invalid range commands + - maple_tree: reduce resets during store setup + - maple_tree: add MAS_UNDERFLOW and MAS_OVERFLOW states + - iommu/apple-dart: Handle DMA_FQ domains in attach_dev() + - scsi: zfcp: Fix a double put in zfcp_port_enqueue() + - iommu/vt-d: Avoid memory allocation in iommu_suspend() + - net: mana: Fix TX CQE error handling + - net: ethernet: mediatek: disable irq before schedule napi + - mptcp: fix delegated action races + - mptcp: userspace pm allow creating id 0 subflow + - qed/red_ll2: Fix undefined behavior bug in struct qed_ll2_info + - Bluetooth: hci_codec: Fix leaking content of local_codecs + - wifi: brcmfmac: Replace 1-element arrays with flexible arrays + - Bluetooth: hci_sync: Fix handling of HCI_QUIRK_STRICT_DUPLICATE_FILTER + - wifi: rtw88: rtw8723d: Fix MAC address offset in EEPROM + - wifi: mwifiex: Fix tlv_buf_left calculation + - md/raid5: release batch_last before waiting for another stripe_head + - PCI/PM: Mark devices disconnected if upstream PCIe link is down on resume + - PCI: qcom: Fix IPQ8074 enumeration + - platform/x86/intel/ifs: release cpus_read_lock() + - net: replace calls to sock->ops->connect() with kernel_connect() + - btrfs: always print transaction aborted messages with an error level + - net: prevent rewrite of msg_name in sock_sendmsg() + - drm/i915: Don't set PIPE_CONTROL_FLUSH_L3 for aux inval + - drm/amd: Fix detection of _PR3 on the PCIe root port + - drm/amd: Fix logic error in sienna_cichlid_update_pcie_parameters() + - arm64: Add Cortex-A520 CPU part definition + - [Config] updateconfigs for ARM64_ERRATUM_2966298 + - arm64: errata: Add Cortex-A520 speculative unprivileged load workaround + - HID: sony: Fix a potential memory leak in sony_probe() + - wifi: mt76: fix lock dependency problem for wed_lock + - ubi: Refuse attaching if mtd's erasesize is 0 + - erofs: fix memory leak of LZMA global compressed deduplication + - wifi: cfg80211/mac80211: hold link BSSes when assoc fails for MLO connection + - iwlwifi: mvm: handle PS changes in vif_cfg_changed + - wifi: iwlwifi: dbg_ini: fix structure packing + - wifi: iwlwifi: mvm: Fix a memory corruption issue + - wifi: cfg80211: fix cqm_config access race + - rtla/timerlat_aa: Zero thread sum after every sample analysis + - rtla/timerlat_aa: Fix negative IRQ delay + - rtla/timerlat_aa: Fix previous IRQ delay for IRQs that happens after thread + sample + - wifi: cfg80211: add missing kernel-doc for cqm_rssi_work + - wifi: mac80211: fix mesh id corruption on 32 bit systems + - wifi: mwifiex: Fix oob check condition in mwifiex_process_rx_packet + - HID: nvidia-shield: add LEDS_CLASS dependency + - erofs: allow empty device tags in flatdev mode + - s390/bpf: Let arch_prepare_bpf_trampoline return program size + - leds: Drop BUG_ON check for LED_COLOR_ID_MULTI + - bpf: Fix tr dereferencing + - bpf: unconditionally reset backtrack_state masks on global func exit + - regulator: mt6358: split ops for buck and linear range LDO regulators + - Bluetooth: Delete unused hci_req_prepare_suspend() declaration + - Bluetooth: Fix hci_link_tx_to RCU lock usage + - Bluetooth: ISO: Fix handling of listen for unicast + - drivers/net: process the result of hdlc_open() and add call of hdlc_close() + in uhdlc_close() + - wifi: mt76: mt76x02: fix MT76x0 external LNA gain handling + - perf/x86/amd/core: Fix overflow reset on hotplug + - rtla/timerlat: Do not stop user-space if a cpu is offline + - regmap: rbtree: Fix wrong register marked as in-cache when creating new node + - wifi: mac80211: fix potential key use-after-free + - perf/x86/amd: Do not WARN() on every IRQ + - iommu/mediatek: Fix share pgtable for iova over 4GB + - wifi: mac80211: Create resources for disabled links + - regulator/core: regulator_register: set device->class earlier + - ima: Finish deprecation of IMA_TRUSTED_KEYRING Kconfig + - [Config] updateconfigs for IMA_BLACKLIST_KEYRING + - wifi: iwlwifi: mvm: Fix incorrect usage of scan API + - scsi: target: core: Fix deadlock due to recursive locking + - ima: rework CONFIG_IMA dependency block + - NFSv4: Fix a nfs4_state_manager() race + - ice: always add legacy 32byte RXDID in supported_rxdids + - bpf: tcp_read_skb needs to pop skb regardless of seq + - bpf, sockmap: Do not inc copied_seq when PEEK flag set + - bpf, sockmap: Reject sk_msg egress redirects to non-TCP sockets + - modpost: add missing else to the "of" check + - net: stmmac: platform: fix the incorrect parameter + - net: fix possible store tearing in neigh_periodic_work() + - neighbour: fix data-races around n->output + - ipv4, ipv6: Fix handling of transhdrlen in __ip{,6}_append_data() + - ptp: ocp: Fix error handling in ptp_ocp_device_init + - net: dsa: mv88e6xxx: Avoid EEPROM timeout when EEPROM is absent + - ovl: move freeing ovl_entry past rcu delay + - ovl: fetch inode once in ovl_dentry_revalidate_common() + - ipv6: tcp: add a missing nf_reset_ct() in 3WHS handling + - net: usb: smsc75xx: Fix uninit-value access in __smsc75xx_read_reg + - ethtool: plca: fix plca enable data type while parsing the value + - net: nfc: llcp: Add lock when modifying device list + - net: renesas: rswitch: Add spin lock protection for irq {un}mask + - rswitch: Fix PHY station management clock setting + - net: ethernet: ti: am65-cpsw: Fix error code in + am65_cpsw_nuss_init_tx_chns() + - ibmveth: Remove condition to recompute TCP header checksum. + - netfilter: nft_payload: rebuild vlan header on h_proto access + - netfilter: handle the connecting collision properly in + nf_conntrack_proto_sctp + - selftests: netfilter: Test nf_tables audit logging + - selftests: netfilter: Extend nft_audit.sh + - netfilter: nf_tables: Deduplicate nft_register_obj audit logs + - netfilter: nf_tables: nft_set_rbtree: fix spurious insertion failure + - ipv4: Set offload_failed flag in fibmatch results + - net: stmmac: dwmac-stm32: fix resume on STM32 MCU + - tipc: fix a potential deadlock on &tx->lock + - tcp: fix quick-ack counting to count actual ACKs of new data + - tcp: fix delayed ACKs for MSS boundary condition + - sctp: update transport state when processing a dupcook packet + - sctp: update hb timer immediately after users change hb_interval + - netlink: annotate data-races around sk->sk_err + - net: mana: Fix the tso_bytes calculation + - net: mana: Fix oversized sge0 for GSO packets + - HID: nvidia-shield: Fix a missing led_classdev_unregister() in the probe + error handling path + - HID: sony: remove duplicate NULL check before calling usb_free_urb() + - HID: intel-ish-hid: ipc: Disable and reenable ACPI GPE bit + - net: lan743x: also select PHYLIB + - parisc: Restore __ldcw_align for PA-RISC 2.0 processors + - smb: use kernel_connect() and kernel_bind() + - parisc: Fix crash with nr_cpus=1 option + - dm zoned: free dmz->ddev array in dmz_put_zoned_devices + - RDMA/core: Require admin capabilities to set system parameters + - of: dynamic: Fix potential memory leak in of_changeset_action() + - IB/mlx4: Fix the size of a buffer in add_port_entries() + - gpio: aspeed: fix the GPIO number passed to pinctrl_gpio_set_config() + - gpio: pxa: disable pinctrl calls for MMP_GPIO + - RDMA/cma: Initialize ib_sa_multicast structure to 0 when join + - RDMA/cma: Fix truncation compilation warning in make_cma_ports + - RDMA/bnxt_re: Fix the handling of control path response data + - RDMA/uverbs: Fix typo of sizeof argument + - RDMA/srp: Do not call scsi_done() from srp_abort() + - RDMA/siw: Fix connection failure handling + - RDMA/mlx5: Fix mkey cache possible deadlock on cleanup + - RDMA/mlx5: Fix assigning access flags to cache mkeys + - RDMA/mlx5: Fix mutex unlocking on error flow for steering anchor creation + - RDMA/mlx5: Fix NULL string error + - x86/sev: Change npages to unsigned long in snp_accept_memory() + - x86/sev: Use the GHCB protocol when available for SNP CPUID requests + - ksmbd: fix race condition between session lookup and expire + - ksmbd: fix uaf in smb20_oplock_break_ack + - ksmbd: fix race condition from parallel smb2 lock requests + - RDMA/mlx5: Remove not-used cache disable flag + - Linux 6.5.7 + * Mantic update: v6.5.7 upstream stable release (LP: #2045806) // + CVE-2023-34324 + - xen/events: replace evtchn_rwlock with RCU + * CVE-2023-6932 + - ipv4: igmp: fix refcnt uaf issue when receiving igmp query packet + * CVE-2023-6531 + - io_uring/af_unix: disable sending io_uring over sockets + * CVE-2023-6606 + - smb: client: fix OOB in smbCalcSize() + * CVE-2023-6817 + - netfilter: nft_set_pipapo: skip inactive elements during set walk + * Avoid using damage rectangle under hardware rotation mode when PSR is + enabled (LP: #2045958) + - drm/amd/display: fix hw rotated modes when PSR-SU is enabled + * CVE-2023-46813 + - x86/sev: Disable MMIO emulation from user mode + - x86/sev: Check IOBM for IOIO exceptions from user-space + - x86/sev: Check for user-space IOIO pointing to kernel space + * CVE-2023-6111 + - netfilter: nf_tables: remove catchall element in GC sync path + * CVE-2023-5972 + - nf_tables: fix NULL pointer dereference in nft_inner_init() + - nf_tables: fix NULL pointer dereference in nft_expr_inner_parse() + * Orchid Bay MLK2/Maya Bay MLK soundwire support (LP: #2042090) + - ASoC: Intel: soc-acpi-intel-mtl-match: add rt713 rt1316 config + - ASoC: Intel: sof_sdw_rt_sdca_jack_common: add rt713 support + - ASoC: Intel: sof_sdw_rt712_sdca: construct cards->components by name_prefix + - ASoC: Intel: soc-acpi: rt713+rt1316, no sdw-dmic config + * Build failure if run in a console (LP: #2044512) + - [Packaging] Fix kernel module compression failures + * Fix system suspend problem for Cirrus CS35L41 HDA codec on HP ZBook Fury 16 + G9 (LP: #2042060) + - ALSA: hda: cs35l41: Override the _DSD for HP Zbook Fury 17 G9 to correct + boost type + - ALSA: hda: cs35l41: Use reset label to get GPIO for HP Zbook Fury 17 G9 + - ALSA: hda: cs35l41: Assert reset before system suspend + - ALSA: hda: cs35l41: Assert Reset prior to de-asserting in probe and system + resume + - ALSA: hda: cs35l41: Run boot process during resume callbacks + - ALSA: hda: cs35l41: Force a software reset after hardware reset + - ALSA: hda: cs35l41: Do not unload firmware before reset in system suspend + - ALSA: hda: cs35l41: Check CSPL state after loading firmware + - ASoC: cs35l41: Detect CSPL errors when sending CSPL commands + * Support speaker mute hotkey for Cirrus CS35L41 HDA codec (LP: #2039151) + - ALSA: hda: cs35l41: Support systems with missing _DSD properties + - ALSA: hda: cs35l41: Fix the loop check in cs35l41_add_dsd_properties + - ALSA: hda: cs35l41: Add notification support into component binding + - ALSA: hda/realtek: Support ACPI Notification framework via component binding + - ALSA: hda: cs35l41: Support mute notifications for CS35L41 HDA + - ALSA: hda: cs35l41: Add read-only ALSA control for forced mute + * Add SoF topology support on Intel RaptorLake DELL SKU 0C11 (LP: #2038263) + - ASoC: Intel: soc-acpi-intel-rpl-match: add rt711-l0-rt1316-l12 support + * Update io_uring to 6.6 (LP: #2043730) + - fs: create kiocb_{start,end}_write() helpers + - fs: add IOCB flags related to passing back dio completions + - io_uring/poll: always set 'ctx' in io_cancel_data + - io_uring/timeout: always set 'ctx' in io_cancel_data + - io_uring/cancel: abstract out request match helper + - io_uring/cancel: fix sequence matching for IORING_ASYNC_CANCEL_ANY + - io_uring: use cancelation match helper for poll and timeout requests + - io_uring/cancel: add IORING_ASYNC_CANCEL_USERDATA + - io_uring/cancel: support opcode based lookup and cancelation + - io_uring/cancel: wire up IORING_ASYNC_CANCEL_OP for sync cancel + - io_uring/rw: add write support for IOCB_DIO_CALLER_COMP + - io_uring: Add io_uring command support for sockets + - io_uring/rsrc: Remove unused declaration io_rsrc_put_tw() + - io_uring: cleanup 'ret' handling in io_iopoll_check() + - io_uring/fdinfo: get rid of ref tryget + - io_uring/splice: use fput() directly + - io_uring: have io_file_put() take an io_kiocb rather than the file + - io_uring: remove unnecessary forward declaration + - io_uring/io-wq: don't grab wq->lock for worker activation + - io_uring/io-wq: reduce frequency of acct->lock acquisitions + - io_uring/io-wq: don't gate worker wake up success on wake_up_process() + - io_uring: open code io_fill_cqe_req() + - io_uring: remove return from io_req_cqe_overflow() + - io_uring: never overflow io_aux_cqe + - io_uring/rsrc: keep one global dummy_ubuf + - io_uring: simplify io_run_task_work_sig return + - io_uring/rsrc: Annotate struct io_mapped_ubuf with __counted_by + - io_uring: rename kiocb_end_write() local helper + - io_uring: use kiocb_{start,end}_write() helpers + - io_uring: stop calling free_compound_page() + - io_uring: improve cqe !tracing hot path + - io_uring: cqe init hardening + - io_uring: simplify big_cqe handling + - io_uring: refactor __io_get_cqe() + - io_uring: optimise extra io_get_cqe null check + - io_uring: reorder cqring_flush and wakeups + - io_uring: merge iopoll and normal completion paths + - io_uring: force inline io_fill_cqe_req + - io_uring: compact SQ/CQ heads/tails + - io_uring: add option to remove SQ indirection + - io_uring: move non aligned field to the end + - io_uring: banish non-hot data to end of io_ring_ctx + - io_uring: separate task_work/waiting cache line + - io_uring: move multishot cqe cache in ctx + - io_uring: move iopoll ctx fields around + - io_uring: fix IO hang in io_wq_put_and_exit from do_exit() + - io_uring/fdinfo: only print ->sq_array[] if it's there + - io_uring: fix unprotected iopoll overflow + - Revert "io_uring: fix IO hang in io_wq_put_and_exit from do_exit()" + - io_uring/kbuf: don't allow registered buffer rings on highmem pages + - io_uring: ensure io_lockdep_assert_cq_locked() handles disabled rings + - io_uring: don't allow IORING_SETUP_NO_MMAP rings on highmem pages + - io-wq: fully initialize wqe before calling + cpuhp_state_add_instance_nocalls() + - io_uring: fix crash with IORING_SETUP_NO_MMAP and invalid SQ ring address + - io_uring/fdinfo: lock SQ thread while retrieving thread cpu/pid + - io_uring/rw: disable IOCB_DIO_CALLER_COMP + - io_uring: kiocb_done() should *not* trust ->ki_pos if ->{read,write}_iter() + failed + * System hang after unplug/plug DP monitor with AMD W7500 card (LP: #2042912) + - drm/amd/pm: Fix error of MACO flag setting code + * correct cephfs pull request for uidmap support (LP: #2041613) + - Revert "UBUNTU: SAUCE: ceph: BUG if MDS changed truncate_seq with client + caps still outstanding" + - Revert "UBUNTU: SAUCE: ceph: make sure all the files successfully put before + unmounting" + - Revert "UBUNTU: SAUCE: mm: BUG if filemap_alloc_folio gives us a folio with + a non-NULL ->private" + - Revert "UBUNTU: SAUCE: ceph: dump info about cap flushes when we're waiting + too long for them" + - Revert "UBUNTU: SAUCE: rbd: bump RBD_MAX_PARENT_CHAIN_LEN to 128" + * RTL8111EPP: Fix the network lost after resume with DASH (LP: #2043786) + - r8169: add handling DASH when DASH is disabled + - r8169: fix network lost after resume on DASH systems + * kernel BUG: io_uring openat triggers audit reference count underflow + (LP: #2043841) + - audit, io_uring: io_uring openat triggers audit reference count underflow + * Fix ADL: System enabled AHCI can't get into s0ix when attached ODD + (LP: #2037493) + - ata: ahci: Add Intel Alder Lake-P AHCI controller to low power chipsets list + * [UBUNTU 23.04] Kernel config option missing for s390x PCI passthrough + (LP: #2042853) + - [Config] CONFIG_VFIO_PCI_ZDEV_KVM=y + * Azure: Fix Azure vendor ID (LP: #2036600) + - SAUCE: (no-up) hv: Fix supply vendor ID + * Mantic update: v6.5.6 upstream stable release (LP: #2044174) + - NFS: Fix error handling for O_DIRECT write scheduling + - NFS: Fix O_DIRECT locking issues + - NFS: More O_DIRECT accounting fixes for error paths + - NFS: Use the correct commit info in nfs_join_page_group() + - NFS: More fixes for nfs_direct_write_reschedule_io() + - NFS/pNFS: Report EINVAL errors from connect() to the server + - SUNRPC: Mark the cred for revalidation if the server rejects it + - NFSv4.1: use EXCHGID4_FLAG_USE_PNFS_DS for DS server + - NFSv4.1: fix pnfs MDS=DS session trunking + - media: v4l: Use correct dependency for camera sensor drivers + - media: via: Use correct dependency for camera sensor drivers + - gfs2: Fix another freeze/thaw hang + - netfs: Only call folio_start_fscache() one time for each folio + - btrfs: improve error message after failure to add delayed dir index item + - btrfs: remove BUG() after failure to insert delayed dir index item + - ext4: replace the traditional ternary conditional operator with with + max()/min() + - ext4: move setting of trimmed bit into ext4_try_to_trim_range() + - ext4: do not let fstrim block system suspend + - netfilter: nft_set_rbtree: use read spinlock to avoid datapath contention + - netfilter: nft_set_pipapo: call nft_trans_gc_queue_sync() in catchall GC + - netfilter: nft_set_pipapo: stop GC iteration if GC transaction allocation + fails + - netfilter: nft_set_hash: try later when GC hits EAGAIN on iteration + - netfilter: nf_tables: fix memleak when more than 255 elements expired + - ASoC: meson: spdifin: start hw on dai probe + - netfilter: nf_tables: disallow element removal on anonymous sets + - bpf: Avoid deadlock when using queue and stack maps from NMI + - bpf: Avoid dummy bpf_offload_netdev in __bpf_prog_dev_bound_init + - ALSA: docs: Fix a typo of midi2_ump_probe option for snd-usb-audio + - ALSA: seq: Avoid delivery of events for disabled UMP groups + - ASoC: rt5640: Revert "Fix sleep in atomic context" + - ASoC: rt5640: Fix sleep in atomic context + - ASoC: rt5640: fix typos + - ASoC: rt5640: Do not disable/enable IRQ twice on suspend/resume + - ASoC: rt5640: Enable the IRQ on resume after configuring jack-detect + - ASoC: rt5640: Fix IRQ not being free-ed for HDA jack detect mode + - bpf: Fix a erroneous check after snprintf() + - selftests/bpf: fix unpriv_disabled check in test_verifier + - ALSA: hda/realtek: Splitting the UX3402 into two separate models + - netfilter: conntrack: fix extension size table + - netfilter: nf_tables: Fix entries val in rule reset audit log + - Compiler Attributes: counted_by: Adjust name and identifier expansion + - uapi: stddef.h: Fix header guard location + - uapi: stddef.h: Fix __DECLARE_FLEX_ARRAY for C++ + - memblock tests: Fix compilation errors. + - ASoC: SOF: ipc4-topology: fix wrong sizeof argument + - net: microchip: sparx5: Fix memory leak for + vcap_api_rule_add_keyvalue_test() + - net: microchip: sparx5: Fix memory leak for + vcap_api_rule_add_actionvalue_test() + - net: microchip: sparx5: Fix possible memory leak in + vcap_api_encode_rule_test() + - net: microchip: sparx5: Fix possible memory leaks in + test_vcap_xn_rule_creator() + - net: microchip: sparx5: Fix possible memory leaks in vcap_api_kunit + - selftests: tls: swap the TX and RX sockets in some tests + - net/core: Fix ETH_P_1588 flow dissector + - ALSA: seq: ump: Fix -Wformat-truncation warning + - ASoC: hdaudio.c: Add missing check for devm_kstrdup + - ASoC: imx-audmix: Fix return error with devm_clk_get() + - octeon_ep: fix tx dma unmap len values in SG + - iavf: do not process adminq tasks when __IAVF_IN_REMOVE_TASK is set + - ASoC: SOF: core: Only call sof_ops_free() on remove if the probe was + successful + - iavf: add iavf_schedule_aq_request() helper + - iavf: schedule a request immediately after add/delete vlan + - i40e: Fix VF VLAN offloading when port VLAN is configured + - netfilter, bpf: Adjust timeouts of non-confirmed CTs in + bpf_ct_insert_entry() + - ionic: fix 16bit math issue when PAGE_SIZE >= 64KB + - igc: Fix infinite initialization loop with early XDP redirect + - scsi: iscsi_tcp: restrict to TCP sockets + - powerpc/perf/hv-24x7: Update domain value check + - powerpc/dexcr: Move HASHCHK trap handler + - dccp: fix dccp_v4_err()/dccp_v6_err() again + - x86/mm, kexec, ima: Use memblock_free_late() from ima_free_kexec_buffer() + - net: hsr: Properly parse HSRv1 supervisor frames. + - platform/x86: intel_scu_ipc: Check status after timeout in busy_loop() + - platform/x86: intel_scu_ipc: Check status upon timeout in + ipc_wait_for_interrupt() + - platform/x86: intel_scu_ipc: Don't override scu in + intel_scu_ipc_dev_simple_command() + - platform/x86: intel_scu_ipc: Fail IPC send if still busy + - x86/asm: Fix build of UML with KASAN + - x86/srso: Fix srso_show_state() side effect + - x86/srso: Set CPUID feature bits independently of bug or mitigation status + - x86/srso: Don't probe microcode in a guest + - x86/srso: Fix SBPB enablement for spec_rstack_overflow=off + - net: hns3: add cmdq check for vf periodic service task + - net: hns3: fix GRE checksum offload issue + - net: hns3: only enable unicast promisc when mac table full + - net: hns3: fix fail to delete tc flower rules during reset issue + - net: hns3: add 5ms delay before clear firmware reset irq source + - net: bridge: use DEV_STATS_INC() + - team: fix null-ptr-deref when team device type is changed + - net: rds: Fix possible NULL-pointer dereference + - vxlan: Add missing entries to vxlan_get_size() + - netfilter: nf_tables: disable toggling dormant table state more than once + - net: hinic: Fix warning-hinic_set_vlan_fliter() warn: variable dereferenced + before check 'hwdev' + - net/handshake: Fix memory leak in __sock_create() and sock_alloc_file() + - i915/pmu: Move execlist stats initialization to execlist specific setup + - drm/virtio: clean out_fence on complete_submit + - locking/seqlock: Do the lockdep annotation before locking in + do_write_seqcount_begin_nested() + - net: ena: Flush XDP packets on error. + - bnxt_en: Flush XDP for bnxt_poll_nitroa0()'s NAPI + - octeontx2-pf: Do xdp_do_flush() after redirects. + - igc: Expose tx-usecs coalesce setting to user + - cxl/region: Match auto-discovered region decoders by HPA range + - proc: nommu: /proc//maps: release mmap read lock + - proc: nommu: fix empty /proc//maps + - cifs: Fix UAF in cifs_demultiplex_thread() + - gpio: tb10x: Fix an error handling path in tb10x_gpio_probe() + - i2c: mux: demux-pinctrl: check the return value of devm_kstrdup() + - i2c: mux: gpio: Add missing fwnode_handle_put() + - i2c: xiic: Correct return value check for xiic_reinit() + - drm/amdgpu: set completion status as preempted for the resubmission + - ASoC: cs35l56: Disable low-power hibernation mode + - drm/amd/display: Update DPG test pattern programming + - drm/amd/display: fix a regression in blank pixel data caused by coding + mistake + - arm64: dts: qcom: sdm845-db845c: Mark cont splash memory region as reserved + - direct_write_fallback(): on error revert the ->ki_pos update from buffered + write + - btrfs: reset destination buffer when read_extent_buffer() gets invalid range + - vfio/mdev: Fix a null-ptr-deref bug for mdev_unregister_parent() + - MIPS: Alchemy: only build mmc support helpers if au1xmmc is enabled + - spi: spi-gxp: BUG: Correct spi write return value + - bus: ti-sysc: Use fsleep() instead of usleep_range() in sysc_reset() + - bus: ti-sysc: Fix missing AM35xx SoC matching + - firmware: arm_scmi: Harden perf domain info access + - firmware: arm_scmi: Fixup perf power-cost/microwatt support + - power: supply: mt6370: Fix missing error code in mt6370_chg_toggle_cfo() + - clk: sprd: Fix thm_parents incorrect configuration + - clk: si521xx: Use REGCACHE_FLAT instead of NONE + - clk: si521xx: Fix regmap write accessor + - clk: tegra: fix error return case for recalc_rate + - ARM: dts: ti: omap: Fix bandgap thermal cells addressing for omap3/4 + - ARM: dts: ti: omap: motorola-mapphone: Fix abe_clkctrl warning on boot + - bus: ti-sysc: Fix SYSC_QUIRK_SWSUP_SIDLE_ACT handling for uart wake-up + - swiotlb: use the calculated number of areas + - power: supply: ucs1002: fix error code in ucs1002_get_property() + - power: supply: rt9467: Fix rt9467_run_aicl() + - power: supply: core: fix use after free in uevent + - firmware: imx-dsp: Fix an error handling path in imx_dsp_setup_channels() + - xtensa: add default definition for XCHAL_HAVE_DIV32 + - xtensa: iss/network: make functions static + - xtensa: boot: don't add include-dirs + - xtensa: umulsidi3: fix conditional expression + - xtensa: boot/lib: fix function prototypes + - power: supply: rk817: Fix node refcount leak + - powerpc/stacktrace: Fix arch_stack_walk_reliable() + - selftests/powerpc: Fix emit_tests to work with run_kselftest.sh + - arm64: dts: imx8mp: Fix SDMA2/3 clocks + - arm64: dts: imx8mp-beacon-kit: Fix audio_pll2 clock + - soc: imx8m: Enable OCOTP clock for imx8mm before reading registers + - arm64: dts: imx8mm-evk: Fix hdmi@3d node + - arm64: dts: imx: Add imx8mm-prt8mm.dtb to build + - firmware: arm_ffa: Don't set the memory region attributes for MEM_LEND + - i915/guc: Get runtime pm in busyness worker only if already active + - accel/ivpu: Do not use wait event interruptible + - gpio: pmic-eic-sprd: Add can_sleep flag for PMIC EIC chip + - i2c: npcm7xx: Fix callback completion ordering + - NFSD: Fix zero NFSv4 READ results when RQ_SPLICE_OK is not set + - x86/reboot: VMCLEAR active VMCSes before emergency reboot + - dma-debug: don't call __dma_entry_alloc_check_leak() under free_entries_lock + - bpf: Annotate bpf_long_memcpy with data_race + - ASoC: amd: yc: Add DMI entries to support Victus by HP Gaming Laptop + 15-fb0xxx (8A3E) + - spi: sun6i: reduce DMA RX transfer width to single byte + - spi: sun6i: fix race between DMA RX transfer completion and RX FIFO drain + - nvme-fc: Prevent null pointer dereference in nvme_fc_io_getuuid() + - parisc: sba: Fix compile warning wrt list of SBA devices + - parisc: sba-iommu: Fix sparse warnigs + - parisc: ccio-dma: Fix sparse warnings + - parisc: iosapic.c: Fix sparse warnings + - parisc: drivers: Fix sparse warning + - parisc: irq: Make irq_stack_union static to avoid sparse warning + - scsi: qedf: Add synchronization between I/O completions and abort + - scsi: ufs: core: Move __ufshcd_send_uic_cmd() outside host_lock + - scsi: ufs: core: Poll HCS.UCRDY before issuing a UIC command + - selftests/ftrace: Correctly enable event in instance-event.tc + - ring-buffer: Avoid softlockup in ring_buffer_resize() + - btrfs: assert delayed node locked when removing delayed item + - selftests: fix dependency checker script + - ring-buffer: Do not attempt to read past "commit" + - net/smc: bugfix for smcr v2 server connect success statistic + - ata: sata_mv: Fix incorrect string length computation in mv_dump_mem() + - efi/x86: Ensure that EFI_RUNTIME_MAP is enabled for kexec + - platform/mellanox: mlxbf-bootctl: add NET dependency into Kconfig + - platform/x86: asus-wmi: Support 2023 ROG X16 tablet mode + - thermal/of: add missing of_node_put() + - drm/amdgpu: Store CU info from all XCCs for GFX v9.4.3 + - drm/amdkfd: Update cache info reporting for GFX v9.4.3 + - drm/amdkfd: Update CU masking for GFX 9.4.3 + - drm/amd/display: Don't check registers, if using AUX BL control + - drm/amdgpu/soc21: don't remap HDP registers for SR-IOV + - drm/amdgpu/nbio4.3: set proper rmmio_remap.reg_offset for SR-IOV + - drm/amdgpu: fallback to old RAS error message for aqua_vanjaram + - drm/amdkfd: Checkpoint and restore queues on GFX11 + - drm/amdgpu: Handle null atom context in VBIOS info ioctl + - objtool: Fix _THIS_IP_ detection for cold functions + - nvme-pci: do not set the NUMA node of device if it has none + - riscv: errata: fix T-Head dcache.cva encoding + - scsi: pm80xx: Use phy-specific SAS address when sending PHY_START command + - scsi: pm80xx: Avoid leaking tags when processing + OPC_INB_SET_CONTROLLER_CONFIG command + - smb3: correct places where ENOTSUPP is used instead of preferred EOPNOTSUPP + - ata: libata-eh: do not clear ATA_PFLAG_EH_PENDING in ata_eh_reset() + - ata: libata-eh: do not thaw the port twice in ata_eh_reset() + - Add DMI ID for MSI Bravo 15 B7ED + - spi: nxp-fspi: reset the FLSHxCR1 registers + - spi: stm32: add a delay before SPI disable + - ASoC: fsl: imx-pcm-rpmsg: Add SNDRV_PCM_INFO_BATCH flag + - spi: intel-pci: Add support for Granite Rapids SPI serial flash + - bpf: Clarify error expectations from bpf_clone_redirect + - ASoC: rt5640: Only cancel jack-detect work on suspend if active + - ALSA: hda: intel-sdw-acpi: Use u8 type for link index + - ASoC: cs42l42: Ensure a reset pulse meets minimum pulse width. + - ASoC: cs42l42: Don't rely on GPIOD_OUT_LOW to set RESET initially low + - ASoC: cs42l42: Avoid stale SoundWire ATTACH after hard reset + - firmware: cirrus: cs_dsp: Only log list of algorithms in debug build + - ASoC: wm_adsp: Fix missing locking in wm_adsp_[read|write]_ctl() + - memblock tests: fix warning: "__ALIGN_KERNEL" redefined + - memblock tests: fix warning ‘struct seq_file’ declared inside parameter list + - ASoC: imx-rpmsg: Set ignore_pmdown_time for dai_link + - ASoC: SOF: sof-audio: Fix DSP core put imbalance on widget setup failure + - media: vb2: frame_vector.c: replace WARN_ONCE with a comment + - NFSv4.1: fix zero value filehandle in post open getattr + - ASoC: SOF: Intel: MTL: Reduce the DSP init timeout + - powerpc/watchpoints: Disable preemption in thread_change_pc() + - powerpc/watchpoint: Disable pagefaults when getting user instruction + - powerpc/watchpoints: Annotate atomic context in more places + - ncsi: Propagate carrier gain/loss events to the NCSI controller + - net: hsr: Add __packed to struct hsr_sup_tlv. + - tsnep: Fix NAPI scheduling + - tsnep: Fix ethtool channels + - tsnep: Fix NAPI polling with budget 0 + - gfs2: fix glock shrinker ref issues + - i2c: designware: fix __i2c_dw_disable() in case master is holding SCL low + - LoongArch: Use _UL() and _ULL() + - LoongArch: Set all reserved memblocks on Node#0 at initialization + - fbdev/sh7760fb: Depend on FB=y + - perf build: Define YYNOMEM as YYNOABORT for bison < 3.81 + - ASoC: cs35l56: Call pm_runtime_dont_use_autosuspend() + - iommu/arm-smmu-v3: Fix soft lockup triggered by arm_smmu_mm_invalidate_range + - spi: zynqmp-gqspi: fix clock imbalance on probe failure + - x86/sgx: Resolves SECS reclaim vs. page fault for EAUG race + - x86/srso: Add SRSO mitigation for Hygon processors + - KVM: SVM: INTERCEPT_RDTSCP is never intercepted anyway + - KVM: SVM: Fix TSC_AUX virtualization setup + - KVM: x86/mmu: Open code leaf invalidation from mmu_notifier + - KVM: x86/mmu: Do not filter address spaces in + for_each_tdp_mmu_root_yield_safe() + - KVM: x86/mmu: Stop zapping invalidated TDP MMU roots asynchronously + - mptcp: fix bogus receive window shrinkage with multiple subflows + - mptcp: move __mptcp_error_report in protocol.c + - mptcp: process pending subflow error on close + - Revert "tty: n_gsm: fix UAF in gsm_cleanup_mux" + - scsi: core: ata: Do no try to probe for CDL on old drives + - serial: 8250_port: Check IRQ data before use + - nilfs2: fix potential use after free in nilfs_gccache_submit_read_data() + - crypto: sm2 - Fix crash caused by uninitialized context + - ALSA: rawmidi: Fix NULL dereference at proc read + - ALSA: hda: Disable power save for solving pop issue on Lenovo ThinkCentre + M70q + - LoongArch: Fix lockdep static memory detection + - LoongArch: Define relocation types for ABI v2.10 + - LoongArch: numa: Fix high_memory calculation + - LoongArch: Add support for 32_PCREL relocation type + - LoongArch: Add support for 64_PCREL relocation type + - ata: libata-scsi: link ata port and scsi device + - scsi: sd: Differentiate system and runtime start/stop management + - scsi: sd: Do not issue commands to suspended disks on shutdown + - ata: libata-scsi: ignore reserved bits for REPORT SUPPORTED OPERATION CODES + - io_uring/fs: remove sqe->rw_flags checking from LINKAT + - i2c: i801: unregister tco_pdev in i801_probe() error path + - ASoC: amd: yc: Fix non-functional mic on Lenovo 82QF and 82UG + - kernel/sched: Modify initial boot task idle setup + - sched/rt: Fix live lock between select_fallback_rq() and RT push + - Revert "SUNRPC dont update timeout value on connection reset" + - NFSv4: Fix a state manager thread deadlock regression + - ACPI: NFIT: Fix incorrect calculation of idt size + - timers: Tag (hr)timer softirq as hotplug safe + - drm/tests: Fix incorrect argument in drm_test_mm_insert_range + - cxl/mbox: Fix CEL logic for poison and security commands + - arm64: defconfig: remove CONFIG_COMMON_CLK_NPCM8XX=y + - mm/damon/vaddr-test: fix memory leak in damon_do_test_apply_three_regions() + - selftests/mm: fix awk usage in charge_reserved_hugetlb.sh and + hugetlb_reparenting_test.sh that may cause error + - mm: mempolicy: keep VMA walk if both MPOL_MF_STRICT and MPOL_MF_MOVE are + specified + - mm/slab_common: fix slab_caches list corruption after kmem_cache_destroy() + - mm: page_alloc: fix CMA and HIGHATOMIC landing on the wrong buddy list + - mm: memcontrol: fix GFP_NOFS recursion in memory.high enforcement + - cxl/port: Fix cxl_test register enumeration regression + - cxl/pci: Fix appropriate checking for _OSC while handling CXL RAS registers + - ring-buffer: Fix bytes info in per_cpu buffer stats + - ring-buffer: Update "shortest_full" in polling + - btrfs: refresh dir last index during a rewinddir(3) call + - btrfs: file_remove_privs needs an exclusive lock in direct io write + - btrfs: set last dir index to the current last index when opening dir + - btrfs: fix race between reading a directory and adding entries to it + - btrfs: properly report 0 avail for very full file systems + - media: uvcvideo: Fix OOB read + - bpf: Add override check to kprobe multi link attach + - bpf: Fix BTF_ID symbol generation collision + - bpf: Fix BTF_ID symbol generation collision in tools/ + - net: thunderbolt: Fix TCPv6 GSO checksum calculation + - thermal: sysfs: Fix trip_point_hyst_store() + - tracing/user_events: Align set_bit() address for all archs + - ata: libata-core: Fix ata_port_request_pm() locking + - ata: libata-core: Fix port and device removal + - ata: libata-core: Do not register PM operations for SAS ports + - ata: libata-sata: increase PMP SRST timeout to 10s + - i915: Limit the length of an sg list to the requested length + - drm/i915/gt: Fix reservation address in ggtt_reserve_guc_top + - power: supply: rk817: Add missing module alias + - power: supply: ab8500: Set typing and props + - fs: binfmt_elf_efpic: fix personality for ELF-FDPIC + - drm/amdkfd: Use gpu_offset for user queue's wptr + - drm/amd/display: fix the ability to use lower resolution modes on eDP + - drm/meson: fix memory leak on ->hpd_notify callback + - rbd: move rbd_dev_refresh() definition + - rbd: decouple header read-in from updating rbd_dev->header + - rbd: decouple parent info read-in from updating rbd_dev + - rbd: take header_rwsem in rbd_dev_refresh() only when updating + - memcg: drop kmem.limit_in_bytes + - mm, memcg: reconsider kmem.limit_in_bytes deprecation + - ASoC: amd: yc: Fix a non-functional mic on Lenovo 82TL + - Linux 6.5.6 + * Mantic update: v6.5.5 upstream stable release (LP: #2043416) + - iomap: Fix possible overflow condition in iomap_write_delalloc_scan + - autofs: fix memory leak of waitqueues in autofs_catatonic_mode + - btrfs: handle errors properly in update_inline_extent_backref() + - btrfs: output extra debug info if we failed to find an inline backref + - locks: fix KASAN: use-after-free in trace_event_raw_event_filelock_lock + - ACPICA: Add AML_NO_OPERAND_RESOLVE flag to Timer + - kernel/fork: beware of __put_task_struct() calling context + - rcuscale: Move rcu_scale_writer() schedule_timeout_uninterruptible() to + _idle() + - scftorture: Forgive memory-allocation failure if KASAN + - ACPI: video: Add backlight=native DMI quirk for Lenovo Ideapad Z470 + - platform/chrome: cros_ec_lpc: Remove EC panic shutdown timeout + - x86/amd_nb: Add PCI IDs for AMD Family 1Ah-based models + - perf/smmuv3: Enable HiSilicon Erratum 162001900 quirk for HIP08/09 + - s390/boot: cleanup number of page table levels setup + - kselftest/arm64: fix a memleak in zt_regs_run() + - perf/imx_ddr: speed up overflow frequency of cycle + - ACPI: video: Add backlight=native DMI quirk for Apple iMac12,1 and iMac12,2 + - hw_breakpoint: fix single-stepping when using bpf_overflow_handler + - ACPI: x86: s2idle: Catch multiple ACPI_TYPE_PACKAGE objects + - selftests/nolibc: fix up kernel parameters support + - selftests/nolibc: prevent out of bounds access in expect_vfprintf + - spi: sun6i: add quirk for dual and quad SPI modes support + - devlink: remove reload failed checks in params get/set callbacks + - crypto: lrw,xts - Replace strlcpy with strscpy + - ice: Don't tx before switchdev is fully configured + - wifi: ath9k: fix fortify warnings + - wifi: ath9k: fix printk specifier + - wifi: rtw88: delete timer and free skb queue when unloading + - wifi: mwifiex: fix fortify warning + - mt76: mt7921: don't assume adequate headroom for SDIO headers + - wifi: wil6210: fix fortify warnings + - can: sun4i_can: Add acceptance register quirk + - can: sun4i_can: Add support for the Allwinner D1 + - [Config] updateconfigs for CAN_SUN4I + - net: Use sockaddr_storage for getsockopt(SO_PEERNAME). + - wifi: ath12k: Fix a NULL pointer dereference in ath12k_mac_op_hw_scan() + - wifi: ath12k: avoid array overflow of hw mode for preferred_hw_mode + - net/ipv4: return the real errno instead of -EINVAL + - crypto: lib/mpi - avoid null pointer deref in mpi_cmp_ui() + - Bluetooth: btusb: Add device 0489:e0f5 as MT7922 device + - Bluetooth: btusb: Add a new VID/PID 0489/e0f6 for MT7922 + - Bluetooth: btusb: Add new VID/PID 0489/e102 for MT7922 + - Bluetooth: btusb: Add new VID/PID 04ca/3804 for MT7922 + - Bluetooth: Fix hci_suspend_sync crash + - Bluetooth: btusb: Add support for another MediaTek 7922 VID/PID + - netlink: convert nlk->flags to atomic flags + - tpm_tis: Resend command to recover from data transfer errors + - mmc: sdhci-esdhc-imx: improve ESDHC_FLAG_ERR010450 + - alx: fix OOB-read compiler warning + - wifi: iwlwifi: pcie: avoid a warning in case prepare card failed + - wifi: mac80211: check S1G action frame size + - netfilter: ebtables: fix fortify warnings in size_entry_mwt() + - wifi: cfg80211: reject auth/assoc to AP with our address + - wifi: cfg80211: ocb: don't leave if not joined + - wifi: mac80211: check for station first in client probe + - wifi: mac80211_hwsim: drop short frames + - Revert "wifi: mac80211_hwsim: check the return value of nla_put_u32" + - libbpf: Free btf_vmlinux when closing bpf_object + - wifi: ath12k: Fix memory leak in rx_desc and tx_desc + - wifi: ath12k: add check max message length while scanning with extraie + - Fix nomenclature for USB and PCI wireless devices + - bpf: Consider non-owning refs trusted + - bpf: Consider non-owning refs to refcounted nodes RCU protected + - drm/bridge: tc358762: Instruct DSI host to generate HSE packets + - drm/edid: Add quirk for OSVR HDK 2.0 + - drm: bridge: samsung-dsim: Drain command transfer FIFO before transfer + - arm64: dts: qcom: sm6125-pdx201: correct ramoops pmsg-size + - arm64: dts: qcom: sm6125-sprout: correct ramoops pmsg-size + - arm64: dts: qcom: sm6350: correct ramoops pmsg-size + - arm64: dts: qcom: sm8150-kumano: correct ramoops pmsg-size + - arm64: dts: qcom: sm8250-edo: correct ramoops pmsg-size + - drm/amdgpu: Increase soft IH ring size + - samples/hw_breakpoint: Fix kernel BUG 'invalid opcode: 0000' + - drm/amdgpu: Update ring scheduler info as needed + - drm/amd/display: Fix underflow issue on 175hz timing + - ASoC: SOF: topology: simplify code to prevent static analysis warnings + - ASoC: Intel: sof_sdw: Update BT offload config for soundwire config + - ALSA: hda: intel-dsp-cfg: add LunarLake support + - drm/amd/display: Use DTBCLK as refclk instead of DPREFCLK + - drm/amd/display: Blocking invalid 420 modes on HDMI TMDS for DCN31 + - drm/amd/display: Blocking invalid 420 modes on HDMI TMDS for DCN314 + - drm/amd/display: Use max memclk variable when setting max memclk + - drm/msm/adreno: Use quirk identify hw_apriv + - drm/msm/adreno: Use quirk to identify cached-coherent support + - drm/exynos: fix a possible null-pointer dereference due to data race in + exynos_drm_crtc_atomic_disable() + - io_uring: annotate the struct io_kiocb slab for appropriate user copy + - drm/mediatek: dp: Change logging to dev for mtk_dp_aux_transfer() + - bus: ti-sysc: Configure uart quirks for k3 SoC + - arm64: dts: qcom: sc8280xp-x13s: Add camera activity LED + - md: raid1: fix potential OOB in raid1_remove_disk() + - ext2: fix datatype of block number in ext2_xattr_set2() + - blk-mq: fix tags leak when shrink nr_hw_queues + - ASoC: SOF: amd: clear panic mask status when panic occurs + - x86: bring back rep movsq for user access on CPUs without ERMS + - fs/jfs: prevent double-free in dbUnmount() after failed jfs_remount() + - jfs: fix invalid free of JFS_IP(ipimap)->i_imap in diUnmount + - ext4: add two helper functions extent_logical_end() and pa_logical_end() + - ext4: avoid overlapping preallocations due to overflow + - PCI: dwc: Provide deinit callback for i.MX + - ARM: 9317/1: kexec: Make smp stop calls asynchronous + - powerpc/pseries: fix possible memory leak in ibmebus_bus_init() + - PCI: vmd: Disable bridge window for domain reset + - PCI: fu740: Set the number of MSI vectors + - media: mdp3: Fix resource leaks in of_find_device_by_node + - media: dvb-usb-v2: af9035: Fix null-ptr-deref in af9035_i2c_master_xfer + - media: dw2102: Fix null-ptr-deref in dw2102_i2c_transfer() + - media: af9005: Fix null-ptr-deref in af9005_i2c_xfer + - media: anysee: fix null-ptr-deref in anysee_master_xfer + - media: az6007: Fix null-ptr-deref in az6007_i2c_xfer() + - media: dvb-usb-v2: gl861: Fix null-ptr-deref in gl861_i2c_master_xfer + - scsi: lpfc: Abort outstanding ELS cmds when mailbox timeout error is + detected + - media: tuners: qt1010: replace BUG_ON with a regular error + - media: pci: cx23885: replace BUG with error return + - usb: cdns3: Put the cdns set active part outside the spin lock + - usb: typec: intel_pmc_mux: Add new ACPI ID for Lunar Lake IOM device + - usb: gadget: fsl_qe_udc: validate endpoint index for ch9 udc + - tools: iio: iio_generic_buffer: Fix some integer type and calculation + - scsi: target: iscsi: Fix buffer overflow in lio_target_nacl_info_show() + - serial: cpm_uart: Avoid suspicious locking + - misc: open-dice: make OPEN_DICE depend on HAS_IOMEM + - usb: dwc3: dwc3-octeon: Verify clock divider + - usb: ehci: add workaround for chipidea PORTSC.PEC bug + - usb: chipidea: add workaround for chipidea PEC bug + - media: pci: ipu3-cio2: Initialise timing struct to avoid a compiler warning + - kobject: Add sanity check for kset->kobj.ktype in kset_register() + - interconnect: Fix locking for runpm vs reclaim + - usb: typec: qcom-pmic-typec: register drm_bridge + - printk: Reduce console_unblank() usage in unsafe scenarios + - printk: Keep non-panic-CPUs out of console lock + - printk: Do not take console lock for console_flush_on_panic() + - printk: Consolidate console deferred printing + - printk: Rename abandon_console_lock_in_panic() to other_cpu_in_panic() + - ext4: fix BUG in ext4_mb_new_inode_pa() due to overflow + - btrfs: introduce struct to consolidate extent buffer write context + - btrfs: zoned: introduce block group context to btrfs_eb_write_context + - btrfs: zoned: return int from btrfs_check_meta_write_pointer + - btrfs: zoned: defer advancing meta write pointer + - btrfs: zoned: activate metadata block group on write time + - mtd: spi-nor: spansion: use CLPEF as an alternative to CLSR + - mtd: spi-nor: spansion: preserve CFR2V[7] when writing MEMLAT + - btrfs: add a helper to read the superblock metadata_uuid + - btrfs: compare the correct fsid/metadata_uuid in btrfs_validate_super + - nvmet-tcp: pass iov_len instead of sg->length to bvec_set_page() + - drm: gm12u320: Fix the timeout usage for usb_bulk_msg() + - scsi: qla2xxx: Fix NULL vs IS_ERR() bug for debugfs_create_dir() + - md: don't dereference mddev after export_rdev() + - md: fix warning for holder mismatch from export_rdev() + - efivarfs: fix statfs() on efivarfs + - PM: hibernate: Fix the exclusive get block device in test_resume mode + - selftests: tracing: Fix to unmount tracefs for recovering environment + - x86/ibt: Suppress spurious ENDBR + - x86/ibt: Avoid duplicate ENDBR in __put_user_nocheck*() + - riscv: kexec: Align the kexeced kernel entry + - x86/sched: Restore the SD_ASYM_PACKING flag in the DIE domain + - scsi: target: core: Fix target_cmd_counter leak + - scsi: lpfc: Fix the NULL vs IS_ERR() bug for debugfs_create_file() + - panic: Reenable preemption in WARN slowpath + - ata: libata-core: fetch sense data for successful commands iff CDL enabled + - x86/boot/compressed: Reserve more memory for page tables + - x86/purgatory: Remove LTO flags + - samples/hw_breakpoint: fix building without module unloading + - blk-mq: prealloc tags when increase tagset nr_hw_queues + - blk-mq: fix tags UAF when shrinking q->nr_hw_queues + - md/raid1: fix error: ISO C90 forbids mixed declarations + - Revert "SUNRPC: Fail faster on bad verifier" + - attr: block mode changes of symlinks + - ovl: fix failed copyup of fileattr on a symlink + - ovl: fix incorrect fdput() on aio completion + - io_uring/net: fix iter retargeting for selected buf + - x86/platform/uv: Use alternate source for socket to node data + - Revert "firewire: core: obsolete usage of GFP_ATOMIC at building node tree" + - drm/amd: Make fence wait in suballocator uninterruptible + - Revert "drm/amd: Disable S/G for APUs when 64GB or more host memory" + - dm: don't attempt to queue IO under RCU protection + - dm: fix a race condition in retrieve_deps + - btrfs: fix lockdep splat and potential deadlock after failure running + delayed items + - btrfs: fix a compilation error if DEBUG is defined in btree_dirty_folio + - btrfs: fix race between finishing block group creation and its item update + - btrfs: release path before inode lookup during the ino lookup ioctl + - btrfs: check for BTRFS_FS_ERROR in pending ordered assert + - tracing/synthetic: Fix order of struct trace_dynamic_info + - tracing: Have tracing_max_latency inc the trace array ref count + - tracing: Have event inject files inc the trace array ref count + - tracing/synthetic: Print out u64 values properly + - tracing: Increase trace array ref count on enable and filter files + - tracing: Have current_trace inc the trace array ref count + - tracing: Have option files inc the trace array ref count + - selinux: fix handling of empty opts in selinux_fs_context_submount() + - nfsd: fix change_info in NFSv4 RENAME replies + - tracefs: Add missing lockdown check to tracefs_create_dir() + - i2c: aspeed: Reset the i2c controller when timeout occurs + - ata: libata: disallow dev-initiated LPM transitions to unsupported states + - ata: libahci: clear pending interrupt status + - scsi: megaraid_sas: Fix deadlock on firmware crashdump + - scsi: qla2xxx: Use raw_smp_processor_id() instead of smp_processor_id() + - scsi: pm8001: Setup IRQs on resume + - Revert "comedi: add HAS_IOPORT dependencies" + - [Config] updateconfigs for COMEDI/HAS_IOPORT deps + - ext4: fix rec_len verify error + - drm/radeon: make fence wait in suballocator uninterrruptable + - drm/i915: Only check eDP HPD when AUX CH is shared + - drm/amdkfd: Insert missing TLB flush on GFX10 and later + - drm/tests: helpers: Avoid a driver uaf + - drm/amd/display: Adjust the MST resume flow + - drm/amd/display: fix the white screen issue when >= 64GB DRAM + - drm/amd/display: Add DPIA Link Encoder Assignment Fix + - drm/amd/display: Fix 2nd DPIA encoder Assignment + - Revert "memcg: drop kmem.limit_in_bytes" + - drm/amdgpu: fix amdgpu_cs_p1_user_fence + - interconnect: Teach lockdep about icc_bw_lock order + - x86/alternatives: Remove faulty optimization + - x86,static_call: Fix static-call vs return-thunk + - Linux 6.5.5 + * Could not probe Samsung P44 30S3 PM9C1a SSD correctly: nvme nvme0: Device + not ready: aborting installation, CSTS=0x0 (LP: #2041495) // Mantic update: + v6.5.5 upstream stable release (LP: #2043416) + - nvme: avoid bogus CRTO values + * Mantic update: v6.5.4 upstream stable release (LP: #2041999) + - net/ipv6: SKB symmetric hash should incorporate transport ports + - drm/virtio: Conditionally allocate virtio_gpu_fence + - scsi: ufs: core: Add advanced RPMB support where UFSHCI 4.0 does not support + EHS length in UTRD + - scsi: qla2xxx: Adjust IOCB resource on qpair create + - scsi: qla2xxx: Limit TMF to 8 per function + - scsi: qla2xxx: Fix deletion race condition + - scsi: qla2xxx: fix inconsistent TMF timeout + - scsi: qla2xxx: Fix command flush during TMF + - scsi: qla2xxx: Fix erroneous link up failure + - scsi: qla2xxx: Turn off noisy message log + - scsi: qla2xxx: Fix session hang in gnl + - scsi: qla2xxx: Fix TMF leak through + - scsi: qla2xxx: Remove unsupported ql2xenabledif option + - scsi: qla2xxx: Flush mailbox commands on chip reset + - scsi: qla2xxx: Fix smatch warn for qla_init_iocb_limit() + - scsi: qla2xxx: Error code did not return to upper layer + - scsi: qla2xxx: Fix firmware resource tracking + - null_blk: fix poll request timeout handling + - kernfs: fix missing kernfs_iattr_rwsem locking + - fbdev/ep93xx-fb: Do not assign to struct fb_info.dev + - clk: qcom: camcc-sc7180: fix async resume during probe + - drm/ast: Fix DRAM init on AST2200 + - ASoC: tegra: Fix SFC conversion for few rates + - ARM: dts: samsung: exynos4210-i9100: Fix LCD screen's physical size + - arm64: tegra: Update AHUB clock parent and rate on Tegra234 + - arm64: tegra: Update AHUB clock parent and rate + - clk: qcom: turingcc-qcs404: fix missing resume during probe + - ARM: dts: qcom: msm8974pro-castor: correct inverted X of touchscreen + - arm64: dts: qcom: msm8953-vince: drop duplicated touschreen parent interrupt + - ARM: dts: qcom: msm8974pro-castor: correct touchscreen function names + - ARM: dts: qcom: msm8974pro-castor: correct touchscreen syna,nosleep-mode + - arm64: dts: renesas: rzg2l: Fix txdv-skew-psec typos + - ARM: dts: BCM5301X: Extend RAM to full 256MB for Linksys EA6500 V2 + - send channel sequence number in SMB3 requests after reconnects + - memcg: drop kmem.limit_in_bytes + - mm: hugetlb_vmemmap: fix a race between vmemmap pmd split + - lib/test_meminit: allocate pages up to order MAX_ORDER + - Multi-gen LRU: avoid race in inc_min_seq() + - parisc: led: Fix LAN receive and transmit LEDs + - parisc: led: Reduce CPU overhead for disk & lan LED computation + - cifs: update desired access while requesting for directory lease + - pinctrl: cherryview: fix address_space_handler() argument + - dt-bindings: clock: xlnx,versal-clk: drop select:false + - clk: imx: pll14xx: dynamically configure PLL for 393216000/361267200Hz + - clk: imx: pll14xx: align pdiv with reference manual + - clk: qcom: gcc-mdm9615: use proper parent for pll0_vote clock + - soc: qcom: qmi_encdec: Restrict string length in decode + - clk: qcom: dispcc-sm8450: fix runtime PM imbalance on probe errors + - clk: qcom: dispcc-sm8550: fix runtime PM imbalance on probe errors + - clk: qcom: lpasscc-sc7280: fix missing resume during probe + - clk: qcom: q6sstop-qcs404: fix missing resume during probe + - clk: qcom: mss-sc7180: fix missing resume during probe + - NFS: Fix a potential data corruption + - NFSv4/pnfs: minor fix for cleanup path in nfs4_get_device_info + - bus: mhi: host: Skip MHI reset if device is in RDDM + - kbuild: rpm-pkg: define _arch conditionally + - kbuild: do not run depmod for 'make modules_sign' + - kbuild: dummy-tools: make MPROFILE_KERNEL checks work on BE + - tpm_crb: Fix an error handling path in crb_acpi_add() + - gfs2: Switch to wait_event in gfs2_logd + - gfs2: low-memory forced flush fixes + - mailbox: qcom-ipcc: fix incorrect num_chans counting + - kconfig: fix possible buffer overflow + - tools/mm: fix undefined reference to pthread_once + - Input: iqs7222 - configure power mode before triggering ATI + - perf trace: Really free the evsel->priv area + - pwm: atmel-tcb: Harmonize resource allocation order + - pwm: atmel-tcb: Fix resource freeing in error path and remove + - backlight: lp855x: Initialize PWM state on first brightness change + - backlight: gpio_backlight: Drop output GPIO direction check for initial + power state + - perf parse-events: Separate YYABORT and YYNOMEM cases + - perf parse-events: Move instances of YYABORT to YYNOMEM + - perf parse-events: Separate ENOMEM memory handling + - perf parse-events: Additional error reporting + - KVM: SVM: Don't defer NMI unblocking until next exit for SEV-ES guests + - Input: tca6416-keypad - always expect proper IRQ number in i2c client + - Input: tca6416-keypad - fix interrupt enable disbalance + - perf annotate bpf: Don't enclose non-debug code with an assert() + - x86/virt: Drop unnecessary check on extended CPUID level in cpu_has_svm() + - perf script: Print "cgroup" field on the same line as "comm" + - perf bpf-filter: Fix sample flag check with || + - perf dlfilter: Initialize addr_location before passing it to + thread__find_symbol_fb() + - perf dlfilter: Add al_cleanup() + - perf vendor events: Update the JSON/events descriptions for power10 platform + - perf vendor events: Drop some of the JSON/events for power10 platform + - perf vendor events: Drop STORES_PER_INST metric event for power10 platform + - perf vendor events: Move JSON/events to appropriate files for power10 + platform + - perf vendor events: Update metric event names for power10 platform + - perf top: Don't pass an ERR_PTR() directly to perf_session__delete() + - perf lock: Don't pass an ERR_PTR() directly to perf_session__delete() + - watchdog: intel-mid_wdt: add MODULE_ALIAS() to allow auto-load + - perf vendor events arm64: Remove L1D_CACHE_LMISS from AmpereOne list + - pwm: lpc32xx: Remove handling of PWM channels + - accel/ivpu: refactor deprecated strncpy + - perf header: Fix missing PMU caps + - i3c: master: svc: Describe member 'saved_regs' + - perf test stat_bpf_counters_cgrp: Fix shellcheck issue about logical + operators + - perf test stat_bpf_counters_cgrp: Enhance perf stat cgroup BPF counter test + - regulator: tps6287x: Fix n_voltages + - selftests/bpf: Fix flaky cgroup_iter_sleepable subtest + - drm/i915: mark requests for GuC virtual engines to avoid use-after-free + - blk-throttle: use calculate_io/bytes_allowed() for throtl_trim_slice() + - blk-throttle: consider 'carryover_ios/bytes' in throtl_trim_slice() + - netfilter: nf_tables: Audit log setelem reset + - netfilter: nf_tables: Audit log rule reset + - smb: propagate error code of extract_sharename() + - net/sched: fq_pie: avoid stalls in fq_pie_timer() + - sctp: annotate data-races around sk->sk_wmem_queued + - ipv4: annotate data-races around fi->fib_dead + - net: read sk->sk_family once in sk_mc_loop() + - net: fib: avoid warn splat in flow dissector + - xsk: Fix xsk_diag use-after-free error during socket cleanup + - drm/i915/gvt: Verify pfn is "valid" before dereferencing "struct page" + - drm/i915/gvt: Put the page reference obtained by KVM's gfn_to_pfn() + - drm/i915/gvt: Drop unused helper intel_vgpu_reset_gtt() + - drm/amd/display: fix mode scaling (RMX_.*) + - net/handshake: fix null-ptr-deref in handshake_nl_done_doit() + - net: use sk_forward_alloc_get() in sk_get_meminfo() + - net: annotate data-races around sk->sk_forward_alloc + - mptcp: annotate data-races around msk->rmem_fwd_alloc + - net: annotate data-races around sk->sk_tsflags + - net: annotate data-races around sk->sk_bind_phc + - ipv4: ignore dst hint for multipath routes + - ipv6: ignore dst hint for multipath routes + - selftests/bpf: Fix a CI failure caused by vsock write + - igb: disable virtualization features on 82580 + - gve: fix frag_list chaining + - veth: Fixing transmit return status for dropped packets + - net: ipv6/addrconf: avoid integer underflow in ipv6_create_tempaddr + - net: phy: micrel: Correct bit assignments for phy_device flags + - bpf, sockmap: Fix skb refcnt race after locking changes + - af_unix: Fix msg_controllen test in scm_pidfd_recv() for MSG_CMSG_COMPAT. + - af_unix: Fix data-races around user->unix_inflight. + - af_unix: Fix data-race around unix_tot_inflight. + - af_unix: Fix data-races around sk->sk_shutdown. + - af_unix: Fix data race around sk->sk_err. + - kcm: Destroy mutex in kcm_exit_net() + - octeontx2-af: Fix truncation of smq in CN10K NIX AQ enqueue mbox handler + - igc: Change IGC_MIN to allow set rx/tx value between 64 and 80 + - igbvf: Change IGBVF_MIN to allow set rx/tx value between 64 and 80 + - igb: Change IGB_MIN to allow set rx/tx value between 64 and 80 + - s390/zcrypt: don't leak memory if dev_set_name() fails + - regulator: tps6594-regulator: Fix random kernel crash + - idr: fix param name in idr_alloc_cyclic() doc + - ip_tunnels: use DEV_STATS_INC() + - net/mlx5e: Clear mirred devices array if the rule is split + - net/mlx5: Give esw_offloads_load/unload_rep() "mlx5_" prefix + - net/mlx5: Rework devlink port alloc/free into init/cleanup + - net/mlx5: Push devlink port PF/VF init/cleanup calls out of + devlink_port_register/unregister() + - mlx5/core: E-Switch, Create ACL FT for eswitch manager in switchdev mode + - net: dsa: sja1105: fix bandwidth discrepancy between tc-cbs software and + offload + - net: dsa: sja1105: fix -ENOSPC when replacing the same tc-cbs too many times + - net: dsa: sja1105: complete tc-cbs offload support on SJA1110 + - net: phylink: fix sphinx complaint about invalid literal + - bpf: Invoke __bpf_prog_exit_sleepable_recur() on recursion in + kern_sys_bpf(). + - bpf: Assign bpf_tramp_run_ctx::saved_run_ctx before recursion check. + - s390/bpf: Pass through tail call counter in trampolines + - bpf: bpf_sk_storage: Fix invalid wait context lockdep report + - bpf: bpf_sk_storage: Fix the missing uncharge in sk_omem_alloc + - netfilter: nf_tables: Unbreak audit log reset + - net: phy: Provide Module 4 KSZ9477 errata (DS80000754C) + - net: hns3: fix tx timeout issue + - net: hns3: fix byte order conversion issue in hclge_dbg_fd_tcam_read() + - net: hns3: fix debugfs concurrency issue between kfree buffer and read + - net: hns3: fix invalid mutex between tc qdisc and dcb ets command issue + - net: hns3: fix the port information display when sfp is absent + - net: hns3: remove GSO partial feature bit + - net: enetc: distinguish error from valid pointers in + enetc_fixup_clear_rss_rfs() + - sh: boards: Fix CEU buffer size passed to dma_declare_coherent_memory() + - sh: push-switch: Reorder cleanup operations to avoid use-after-free bug + - linux/export: fix reference to exported functions for parisc64 + - watchdog: advantech_ec_wdt: fix Kconfig dependencies + - drm/amd/display: Temporary Disable MST DP Colorspace Property + - ARC: atomics: Add compiler barrier to atomic operations... + - clocksource/drivers/arm_arch_timer: Disable timer before programming CVAL + - dmaengine: sh: rz-dmac: Fix destination and source data size setting + - misc: fastrpc: Fix remote heap allocation request + - misc: fastrpc: Fix incorrect DMA mapping unmap request + - jbd2: fix checkpoint cleanup performance regression + - jbd2: check 'jh->b_transaction' before removing it from checkpoint + - jbd2: correct the end of the journal recovery scan range + - ext4: add correct group descriptors and reserved GDT blocks to system zone + - ext4: fix memory leaks in ext4_fname_{setup_filename,prepare_lookup} + - ext4: drop dio overwrite only flag and associated warning + - f2fs: get out of a repeat loop when getting a locked data page + - f2fs: flush inode if atomic file is aborted + - f2fs: avoid false alarm of circular locking + - lib: test_scanf: Add explicit type cast to result initialization in + test_number_prefix() + - hwspinlock: qcom: add missing regmap config for SFPB MMIO implementation + - memcontrol: ensure memcg acquired by id is properly set up + - ata: ahci: Add Elkhart Lake AHCI controller + - ata: pata_falcon: fix IO base selection for Q40 + - ata: sata_gemini: Add missing MODULE_DESCRIPTION + - ata: pata_ftide010: Add missing MODULE_DESCRIPTION + - fuse: nlookup missing decrement in fuse_direntplus_link + - btrfs: zoned: do not zone finish data relocation block group + - btrfs: fix start transaction qgroup rsv double free + - btrfs: free qgroup rsv on io failure + - btrfs: don't start transaction when joining with TRANS_JOIN_NOSTART + - btrfs: set page extent mapped after read_folio in relocate_one_page + - btrfs: zoned: re-enable metadata over-commit for zoned mode + - btrfs: use the correct superblock to compare fsid in btrfs_validate_super + - btrfs: scrub: avoid unnecessary extent tree search preparing stripes + - btrfs: scrub: avoid unnecessary csum tree search preparing stripes + - btrfs: scrub: fix grouping of read IO + - drm/mxsfb: Disable overlay plane in mxsfb_plane_overlay_atomic_disable() + - mtd: rawnand: brcmnand: Fix crash during the panic_write + - mtd: rawnand: brcmnand: Fix potential out-of-bounds access in oob write + - mtd: spi-nor: Correct flags for Winbond w25q128 + - mtd: rawnand: brcmnand: Fix potential false time out warning + - mtd: rawnand: brcmnand: Fix ECC level field setting for v7.2 controller + - Revert "drm/amd/display: Remove v_startup workaround for dcn3+" + - drm/amd/display: enable cursor degamma for DCN3+ DRM legacy gamma + - drm/amd/display: limit the v_startup workaround to ASICs older than DCN3.1 + - drm/amd/display: prevent potential division by zero errors + - KVM: VMX: Refresh available regs and IDT vectoring info before NMI handling + - KVM: SVM: Take and hold ir_list_lock when updating vCPU's Physical ID entry + - KVM: SVM: Don't inject #UD if KVM attempts to skip SEV guest insn + - KVM: SVM: Get source vCPUs from source VM for SEV-ES intrahost migration + - KVM: nSVM: Check instead of asserting on nested TSC scaling support + - KVM: nSVM: Load L1's TSC multiplier based on L1 state, not L2 state + - KVM: SVM: Set target pCPU during IRTE update if target vCPU is running + - KVM: SVM: Skip VMSA init in sev_es_init_vmcb() if pointer is NULL + - MIPS: Only fiddle with CHECKFLAGS if `need-compiler' + - MIPS: Fix CONFIG_CPU_DADDI_WORKAROUNDS `modules_install' regression + - perf hists browser: Fix hierarchy mode header + - perf build: Update build rule for generated files + - perf test shell stat_bpf_counters: Fix test on Intel + - perf tools: Handle old data in PERF_RECORD_ATTR + - perf build: Include generated header files properly + - perf hists browser: Fix the number of entries for 'e' key + - drm/amd/display: always switch off ODM before committing more streams + - drm/amd/display: Remove wait while locked + - drm/amdkfd: Add missing gfx11 MQD manager callbacks + - drm/amdgpu: register a dirty framebuffer callback for fbcon + - bpf: fix bpf_probe_read_kernel prototype mismatch + - regulator: raa215300: Change the scope of the variables {clkin_name, + xin_name} + - regulator: raa215300: Fix resource leak in case of error + - parisc: sba_iommu: Fix build warning if procfs if disabled + - kunit: Fix wild-memory-access bug in kunit_free_suite_set() + - net: ipv4: fix one memleak in __inet_del_ifa() + - kselftest/runner.sh: Propagate SIGTERM to runner child + - selftests: Keep symlinks, when possible + - selftests/ftrace: Fix dependencies for some of the synthetic event tests + - net: microchip: vcap api: Fix possible memory leak for vcap_dup_rule() + - octeontx2-pf: Fix page pool cache index corruption. + - net/smc: use smc_lgr_list.lock to protect smc_lgr_list.list iterate in + smcr_port_add + - net: stmmac: fix handling of zero coalescing tx-usecs + - net: ethernet: mvpp2_main: fix possible OOB write in + mvpp2_ethtool_get_rxnfc() + - net: ethernet: mtk_eth_soc: fix possible NULL pointer dereference in + mtk_hwlro_get_fdir_all() + - hsr: Fix uninit-value access in fill_frame_info() + - net: ethernet: adi: adin1110: use eth_broadcast_addr() to assign broadcast + address + - net:ethernet:adi:adin1110: Fix forwarding offload + - net: dsa: sja1105: hide all multicast addresses from "bridge fdb show" + - net: dsa: sja1105: propagate exact error code from + sja1105_dynamic_config_poll_valid() + - net: dsa: sja1105: fix multicast forwarding working only for last added mdb + entry + - net: dsa: sja1105: serialize sja1105_port_mcast_flood() with other FDB + accesses + - net: dsa: sja1105: block FDB accesses that are concurrent with a switch + reset + - r8152: check budget for r8152_poll() + - kcm: Fix memory leak in error path of kcm_sendmsg() + - platform/mellanox: mlxbf-tmfifo: Drop the Rx packet if no more descriptors + - platform/mellanox: mlxbf-tmfifo: Drop jumbo frames + - platform/mellanox: mlxbf-pmc: Fix potential buffer overflows + - platform/mellanox: mlxbf-pmc: Fix reading of unprogrammed events + - platform/mellanox: NVSW_SN2201 should depend on ACPI + - [Config] updateconfigs for NVSW_SN2201 + - net: macb: fix sleep inside spinlock + - veth: Update XDP feature set when bringing up device + - ipv6: fix ip6_sock_set_addr_preferences() typo + - tcp: Factorise sk_family-independent comparison in + inet_bind2_bucket_match(_addr_any). + - tcp: Fix bind() regression for v4-mapped-v6 wildcard address. + - tcp: Fix bind() regression for v4-mapped-v6 non-wildcard address. + - selftest: tcp: Fix address length in bind_wildcard.c. + - ixgbe: fix timestamp configuration code + - igb: clean up in all error paths when enabling SR-IOV + - net: renesas: rswitch: Fix unmasking irq condition + - kcm: Fix error handling for SOCK_DGRAM in kcm_sendmsg(). + - vm: fix move_vma() memory accounting being off + - drm/amd/display: Fix a bug when searching for insert_above_mpcc + - Linux 6.5.4 + * CVE-2023-6176 + - net/tls: do not free tls_rec on async operation in bpf_exec_tx_verdict() + + -- Tim Gardner Mon, 15 Jan 2024 13:44:06 -0700 + +linux-azure (6.5.0-1011.11) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1011.11 -proposed tracker (LP: #2048535) + + * Packaging resync (LP: #1786013) + - [Packaging] remove helper scripts + + [ Ubuntu: 6.5.0-15.15 ] + + * mantic/linux: 6.5.0-15.15 -proposed tracker (LP: #2048549) + * CVE-2024-0193 + - netfilter: nf_tables: skip set commit for deleted/destroyed sets + * CVE-2023-6606 + - smb: client: fix OOB in smbCalcSize() + * CVE-2023-6817 + - netfilter: nft_set_pipapo: skip inactive elements during set walk + * CVE-2023-6932 + - ipv4: igmp: fix refcnt uaf issue when receiving igmp query packet + * CVE-2023-6931 + - perf: Fix perf_event_validate_size() + - perf: Fix perf_event_validate_size() lockdep splat + + -- Tim Gardner Thu, 11 Jan 2024 11:43:17 -0700 + +linux-azure (6.5.0-1010.10) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1010.10 -proposed tracker (LP: #2041528) + + * Packaging resync (LP: #1786013) + - [Packaging] resync update-dkms-versions helper + - debian/dkms-versions -- update from kernel-versions (main/2023.10.30) + + * Azure: Improve SQL DB latency (LP: #2040300) + - tcp: Set pingpong threshold via sysctl + + * mana: Fix some TX processing bugs (CQE Errors , TS0 Bytes, SGe0 GS0 Packet) + (LP: #2038675) + - net: mana: Fix TX CQE error handling + - net: mana: Fix the tso_bytes calculation + - net: mana: Fix oversized sge0 for GSO packets + + [ Ubuntu: 6.5.0-14.14 ] + + * mantic/linux: 6.5.0-14.14 -proposed tracker (LP: #2042660) + * Boot log print hang on screen, no login prompt on Aspeed 2600 rev 52 BMC + (LP: #2042850) + - drm/ast: Add BMC virtual connector + * arm64 atomic issues cause disk corruption (LP: #2042573) + - locking/atomic: scripts: fix fallback ifdeffery + * Packaging resync (LP: #1786013) + - [Packaging] update annotations scripts + + [ Ubuntu: 6.5.0-12.12 ] + + * mantic/linux: 6.5.0-12.12 -proposed tracker (LP: #2041536) + * Packaging resync (LP: #1786013) + - [Packaging] update annotations scripts + - [Packaging] update helper scripts + - debian/dkms-versions -- update from kernel-versions (main/2023.10.30) + * CVE-2023-5633 + - drm/vmwgfx: Keep a gem reference to user bos in surfaces + * CVE-2023-5345 + - fs/smb/client: Reset password pointer to NULL + * CVE-2023-39189 + - netfilter: nfnetlink_osf: avoid OOB read + * CVE-2023-4244 + - netfilter: nft_set_rbtree: skip sync GC for new elements in this transaction + * apparmor restricts read access of user namespace mediation sysctls to root + (LP: #2040194) + - SAUCE: apparmor: open userns related sysctl so lxc can check if restriction + are in place + * AppArmor spams kernel log with assert when auditing (LP: #2040192) + - SAUCE: apparmor: fix request field from a prompt reply that denies all + access + * apparmor notification files verification (LP: #2040250) + - SAUCE: apparmor: fix notification header size + * apparmor oops when racing to retrieve a notification (LP: #2040245) + - SAUCE: apparmor: fix oops when racing to retrieve notification + * SMC stats: Wrong bucket calculation for payload of exactly 4096 bytes + (LP: #2039575) + - net/smc: Fix pos miscalculation in statistics + * Support mipi camera on Intel Meteor Lake platform (LP: #2031412) + - SAUCE: iommu: intel-ipu: use IOMMU passthrough mode for Intel IPUs on Meteor + Lake + - SAUCE: platform/x86: int3472: Add handshake GPIO function + * CVE-2023-45898 + - ext4: fix slab-use-after-free in ext4_es_insert_extent() + * CVE-2023-31085 + - ubi: Refuse attaching if mtd's erasesize is 0 + * CVE-2023-5717 + - perf: Disallow mis-matched inherited group reads + * CVE-2023-5178 + - nvmet-tcp: Fix a possible UAF in queue intialization setup + * CVE-2023-5158 + - vringh: don't use vringh_kiov_advance() in vringh_iov_xfer() + * CVE-2023-5090 + - x86: KVM: SVM: always update the x2avic msr interception + * [SRU][J/L/M] UBUNTU: [Packaging] Make WWAN driver a loadable module + (LP: #2033406) + - [Packaging] Make WWAN driver loadable modules + * Unable to power off the system with MTL CPU (LP: #2039405) + - Revert "x86/smp: Put CPUs into INIT on shutdown if possible" + * usbip: error: failed to open /usr/share/hwdata//usb.ids (LP: #2039439) + - [Packaging] Make linux-tools-common depend on hwdata + * drop all references to is_rust_module.sh in kernels >= 6.5 (LP: #2038611) + - [Packaging] drop references to is_rust_module.sh + * disable shiftfs (LP: #2038522) + - SAUCE: ceph: enable unsafe idmapped mounts by default + - [Config] disable shiftfs + * Infinite systemd loop when power off the machine with multiple MD RAIDs + (LP: #2036184) + - md: Put the right device in md_seq_next + * [Mediatek] mt8195-demo: enable CONFIG_MTK_IOMMU as module for multimedia and + PCIE peripherals (LP: #2036587) + - [Config] Enable CONFIG_MTK_IOMMU on arm64 + * Realtek 8852CE WiFi 6E country code udpates (LP: #2037273) + - wifi: rtw89: regd: update regulatory map to R64-R43 + * Unable to use nvme drive to install Ubuntu 23.10 (LP: #2040157) + - misc: rtsx: Fix some platforms can not boot and move the l1ss judgment to + probe + * CVE-2023-42754 + - ipv4: fix null-deref in ipv4_link_failure + * linux-*: please enable dm-verity kconfigs to allow MoK/db verified root + images (LP: #2019040) + - [Config] CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG_SECONDARY_KEYRING=y + * Fix RCU warning on AMD laptops (LP: #2036377) + - power: supply: core: Use blocking_notifier_call_chain to avoid RCU complaint + * allow io_uring to be disabled in runtime (LP: #2035116) + - io_uring: add a sysctl to disable io_uring system-wide + * Fix unstable audio at low levels on Thinkpad P1G4 (LP: #2037077) + - ALSA: hda/realtek - ALC287 I2S speaker platform support + + -- Tim Gardner Mon, 20 Nov 2023 12:16:25 -0700 + +linux-azure (6.5.0-1009.9) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1009.9 -proposed tracker (LP: #2041869) + + * Packaging resync (LP: #1786013) + - [Packaging] resync git-ubuntu-log + + * Azure: Fix Azure vendor ID (LP: #2036600) + - SAUCE: (no-up) hv: Fix supply vendor ID + + [ Ubuntu: 6.5.0-13.13 ] + + * mantic/linux: 6.5.0-13.13 -proposed tracker (LP: #2042652) + * arm64 atomic issues cause disk corruption (LP: #2042573) + - locking/atomic: scripts: fix fallback ifdeffery + + [ Ubuntu: 6.5.0-11.11 ] + + * mantic/linux: 6.5.0-11.11 -proposed tracker (LP: #2041879) + * CVE-2023-31085 + - ubi: Refuse attaching if mtd's erasesize is 0 + * CVE-2023-4244 + - netfilter: nft_set_rbtree: skip sync GC for new elements in this transaction + * CVE-2023-5633 + - drm/vmwgfx: Keep a gem reference to user bos in surfaces + * CVE-2023-5345 + - fs/smb/client: Reset password pointer to NULL + * CVE-2023-5090 + - x86: KVM: SVM: always update the x2avic msr interception + * Packaging resync (LP: #1786013) + - [Packaging] update helper scripts + + -- Tim Gardner Tue, 07 Nov 2023 03:20:45 -0700 + +linux-azure (6.5.0-1008.8) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1008.8 -proposed tracker (LP: #2039196) + + [ Ubuntu: 6.5.0-10.10 ] + + * mantic/linux: 6.5.0-10.10 -proposed tracker (LP: #2039204) + * CVE-2023-4921 + - net: sched: sch_qfq: Fix UAF in qfq_dequeue() + * CVE-2023-42756 + - netfilter: ipset: Fix race between IPSET_CMD_CREATE and IPSET_CMD_SWAP + * CVE-2023-4881 + - netfilter: nftables: exthdr: fix 4-byte stack OOB write + * CVE-2023-5197 + - netfilter: nf_tables: disallow rule removal from chain binding + + -- Thadeu Lima de Souza Cascardo Sat, 21 Oct 2023 13:24:17 -0300 + +linux-azure (6.5.0-1007.7) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1007.7 -proposed tracker (LP: #2038690) + + * Azure: net: mana: Configure hwc timeout from hardware (LP: #2036627) + - net: mana: Configure hwc timeout from hardware + + [ Ubuntu: 6.5.0-9.9 ] + + * mantic/linux: 6.5.0-9.9 -proposed tracker (LP: #2038687) + * update apparmor and LSM stacking patch set (LP: #2028253) + - re-apply apparmor 4.0.0 + * Disable restricting unprivileged change_profile by default, due to LXD + latest/stable not yet compatible with this new apparmor feature + (LP: #2038567) + - SAUCE: apparmor: Make apparmor_restrict_unprivileged_unconfined opt-in + + [ Ubuntu: 6.5.0-8.8 ] + + * mantic/linux: 6.5.0-8.8 -proposed tracker (LP: #2038577) + * update apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [02/60]: rename SK_CTX() to aa_sock and make it an + inline fn + - SAUCE: apparmor3.2.0 [05/60]: Add sysctls for additional controls of unpriv + userns restrictions + - SAUCE: apparmor3.2.0 [08/60]: Stacking v38: LSM: Identify modules by more + than name + - SAUCE: apparmor3.2.0 [09/60]: Stacking v38: LSM: Add an LSM identifier for + external use + - SAUCE: apparmor3.2.0 [10/60]: Stacking v38: LSM: Identify the process + attributes for each module + - SAUCE: apparmor3.2.0 [11/60]: Stacking v38: LSM: Maintain a table of LSM + attribute data + - SAUCE: apparmor3.2.0 [12/60]: Stacking v38: proc: Use lsmids instead of lsm + names for attrs + - SAUCE: apparmor3.2.0 [13/60]: Stacking v38: integrity: disassociate + ima_filter_rule from security_audit_rule + - SAUCE: apparmor3.2.0 [14/60]: Stacking v38: LSM: Infrastructure management + of the sock security + - SAUCE: apparmor3.2.0 [15/60]: Stacking v38: LSM: Add the lsmblob data + structure. + - SAUCE: apparmor3.2.0 [16/60]: Stacking v38: LSM: provide lsm name and id + slot mappings + - SAUCE: apparmor3.2.0 [17/60]: Stacking v38: IMA: avoid label collisions with + stacked LSMs + - SAUCE: apparmor3.2.0 [18/60]: Stacking v38: LSM: Use lsmblob in + security_audit_rule_match + - SAUCE: apparmor3.2.0 [19/60]: Stacking v38: LSM: Use lsmblob in + security_kernel_act_as + - SAUCE: apparmor3.2.0 [20/60]: Stacking v38: LSM: Use lsmblob in + security_secctx_to_secid + - SAUCE: apparmor3.2.0 [21/60]: Stacking v38: LSM: Use lsmblob in + security_secid_to_secctx + - SAUCE: apparmor3.2.0 [22/60]: Stacking v38: LSM: Use lsmblob in + security_ipc_getsecid + - SAUCE: apparmor3.2.0 [23/60]: Stacking v38: LSM: Use lsmblob in + security_current_getsecid + - SAUCE: apparmor3.2.0 [24/60]: Stacking v38: LSM: Use lsmblob in + security_inode_getsecid + - SAUCE: apparmor3.2.0 [25/60]: Stacking v38: LSM: Use lsmblob in + security_cred_getsecid + - SAUCE: apparmor3.2.0 [26/60]: Stacking v38: LSM: Specify which LSM to + display + - SAUCE: apparmor3.2.0 [28/60]: Stacking v38: LSM: Ensure the correct LSM + context releaser + - SAUCE: apparmor3.2.0 [29/60]: Stacking v38: LSM: Use lsmcontext in + security_secid_to_secctx + - SAUCE: apparmor3.2.0 [30/60]: Stacking v38: LSM: Use lsmcontext in + security_inode_getsecctx + - SAUCE: apparmor3.2.0 [31/60]: Stacking v38: Use lsmcontext in + security_dentry_init_security + - SAUCE: apparmor3.2.0 [32/60]: Stacking v38: LSM: security_secid_to_secctx in + netlink netfilter + - SAUCE: apparmor3.2.0 [33/60]: Stacking v38: NET: Store LSM netlabel data in + a lsmblob + - SAUCE: apparmor3.2.0 [34/60]: Stacking v38: binder: Pass LSM identifier for + confirmation + - SAUCE: apparmor3.2.0 [35/60]: Stacking v38: LSM: security_secid_to_secctx + module selection + - SAUCE: apparmor3.2.0 [36/60]: Stacking v38: Audit: Keep multiple LSM data in + audit_names + - SAUCE: apparmor3.2.0 [37/60]: Stacking v38: Audit: Create audit_stamp + structure + - SAUCE: apparmor3.2.0 [38/60]: Stacking v38: LSM: Add a function to report + multiple LSMs + - SAUCE: apparmor3.2.0 [39/60]: Stacking v38: Audit: Allow multiple records in + an audit_buffer + - SAUCE: apparmor3.2.0 [40/60]: Stacking v38: Audit: Add record for multiple + task security contexts + - SAUCE: apparmor3.2.0 [41/60]: Stacking v38: audit: multiple subject lsm + values for netlabel + - SAUCE: apparmor3.2.0 [42/60]: Stacking v38: Audit: Add record for multiple + object contexts + - SAUCE: apparmor3.2.0 [43/60]: Stacking v38: netlabel: Use a struct lsmblob + in audit data + - SAUCE: apparmor3.2.0 [44/60]: Stacking v38: LSM: Removed scaffolding + function lsmcontext_init + - SAUCE: apparmor3.2.0 [45/60]: Stacking v38: AppArmor: Remove the exclusive + flag + - SAUCE: apparmor3.2.0 [46/60]: combine common_audit_data and + apparmor_audit_data + - SAUCE: apparmor3.2.0 [47/60]: setup slab cache for audit data + - SAUCE: apparmor3.2.0 [48/60]: rename audit_data->label to + audit_data->subj_label + - SAUCE: apparmor3.2.0 [49/60]: pass cred through to audit info. + - SAUCE: apparmor3.2.0 [50/60]: Improve debug print infrastructure + - SAUCE: apparmor3.2.0 [51/60]: add the ability for profiles to have a + learning cache + - SAUCE: apparmor3.2.0 [52/60]: enable userspace upcall for mediation + - SAUCE: apparmor3.2.0 [53/60]: cache buffers on percpu list if there is lock + contention + - SAUCE: apparmor3.2.0 [55/60]: advertise availability of exended perms + - SAUCE: apparmor3.2.0 [60/60]: [Config] enable + CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS + * LSM stacking and AppArmor for 6.2: additional fixes (LP: #2017903) // update + apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [57/60]: fix profile verification and enable it + * udev fails to make prctl() syscall with apparmor=0 (as used by maas by + default) (LP: #2016908) // update apparmor and LSM stacking patch set + (LP: #2028253) + - SAUCE: apparmor3.2.0 [27/60]: Stacking v38: Fix prctl() syscall with + apparmor=0 + * kinetic: apply new apparmor and LSM stacking patch set (LP: #1989983) // + update apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [01/60]: add/use fns to print hash string hex value + - SAUCE: apparmor3.2.0 [03/60]: patch to provide compatibility with v2.x net + rules + - SAUCE: apparmor3.2.0 [04/60]: add user namespace creation mediation + - SAUCE: apparmor3.2.0 [06/60]: af_unix mediation + - SAUCE: apparmor3.2.0 [07/60]: Add fine grained mediation of posix mqueues + + -- Andrea Righi Fri, 06 Oct 2023 21:59:35 +0200 + +linux-azure (6.5.0-1006.6) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1006.6 -proposed tracker (LP: #2037625) + + * Miscellaneous Ubuntu changes + - [Config] update gcc version in annotations + + [ Ubuntu: 6.5.0-7.7 ] + + * mantic/linux: 6.5.0-7.7 -proposed tracker (LP: #2037611) + * kexec enable to load/kdump zstd compressed zimg (LP: #2037398) + - [Packaging] Revert arm64 image format to Image.gz + * Mantic minimized/minimal cloud images do not receive IP address during + provisioning (LP: #2036968) + - [Config] Enable virtio-net as built-in to avoid race + * Miscellaneous Ubuntu changes + - SAUCE: Add mdev_set_iommu_device() kABI + - [Config] update gcc version in annotations + + [ Ubuntu: 6.5.0-6.6 ] + + * mantic/linux: 6.5.0-6.6 -proposed tracker (LP: #2035595) + * Mantic update: v6.5.3 upstream stable release (LP: #2035588) + - drm/amd/display: ensure async flips are only accepted for fast updates + - cpufreq: intel_pstate: set stale CPU frequency to minimum + - tpm: Enable hwrng only for Pluton on AMD CPUs + - Input: i8042 - add quirk for TUXEDO Gemini 17 Gen1/Clevo PD70PN + - Revert "fuse: in fuse_flush only wait if someone wants the return code" + - Revert "f2fs: clean up w/ sbi->log_sectors_per_block" + - Revert "PCI: tegra194: Enable support for 256 Byte payload" + - Revert "net: macsec: preserve ingress frame ordering" + - reiserfs: Check the return value from __getblk() + - splice: always fsnotify_access(in), fsnotify_modify(out) on success + - splice: fsnotify_access(fd)/fsnotify_modify(fd) in vmsplice + - splice: fsnotify_access(in), fsnotify_modify(out) on success in tee + - eventfd: prevent underflow for eventfd semaphores + - fs: Fix error checking for d_hash_and_lookup() + - iomap: Remove large folio handling in iomap_invalidate_folio() + - tmpfs: verify {g,u}id mount options correctly + - selftests/harness: Actually report SKIP for signal tests + - vfs, security: Fix automount superblock LSM init problem, preventing NFS sb + sharing + - ARM: ptrace: Restore syscall restart tracing + - ARM: ptrace: Restore syscall skipping for tracers + - btrfs: zoned: skip splitting and logical rewriting on pre-alloc write + - erofs: release ztailpacking pclusters properly + - locking/arch: Avoid variable shadowing in local_try_cmpxchg() + - refscale: Fix uninitalized use of wait_queue_head_t + - clocksource: Handle negative skews in "skew is too large" messages + - powercap: arm_scmi: Remove recursion while parsing zones + - OPP: Fix potential null ptr dereference in dev_pm_opp_get_required_pstate() + - OPP: Fix passing 0 to PTR_ERR in _opp_attach_genpd() + - selftests/resctrl: Add resctrl.h into build deps + - selftests/resctrl: Don't leak buffer in fill_cache() + - selftests/resctrl: Unmount resctrl FS if child fails to run benchmark + - selftests/resctrl: Close perf value read fd on errors + - sched/fair: remove util_est boosting + - arm64/ptrace: Clean up error handling path in sve_set_common() + - sched/psi: Select KERNFS as needed + - cpuidle: teo: Update idle duration estimate when choosing shallower state + - x86/decompressor: Don't rely on upper 32 bits of GPRs being preserved + - arm64/fpsimd: Only provide the length to cpufeature for xCR registers + - sched/rt: Fix sysctl_sched_rr_timeslice intial value + - perf/imx_ddr: don't enable counter0 if none of 4 counters are used + - selftests/futex: Order calls to futex_lock_pi + - irqchip/loongson-eiointc: Fix return value checking of eiointc_index + - ACPI: x86: s2idle: Post-increment variables when getting constraints + - ACPI: x86: s2idle: Fix a logic error parsing AMD constraints table + - thermal/of: Fix potential uninitialized value access + - cpufreq: amd-pstate-ut: Remove module parameter access + - cpufreq: amd-pstate-ut: Fix kernel panic when loading the driver + - tools/nolibc: arch-*.h: add missing space after ',' + - tools/nolibc: fix up startup failures for -O0 under gcc < 11.1.0 + - x86/efistub: Fix PCI ROM preservation in mixed mode + - cpufreq: powernow-k8: Use related_cpus instead of cpus in driver.exit() + - cpufreq: tegra194: add online/offline hooks + - cpufreq: tegra194: remove opp table in exit hook + - selftests/bpf: Fix bpf_nf failure upon test rerun + - libbpf: only reset sec_def handler when necessary + - bpftool: use a local copy of perf_event to fix accessing :: Bpf_cookie + - bpftool: Define a local bpf_perf_link to fix accessing its fields + - bpftool: Use a local copy of BPF_LINK_TYPE_PERF_EVENT in pid_iter.bpf.c + - bpftool: Use a local bpf_perf_event_value to fix accessing its fields + - libbpf: Fix realloc API handling in zero-sized edge cases + - bpf: Clear the probe_addr for uprobe + - bpf: Fix an error around PTR_UNTRUSTED + - bpf: Fix an error in verifying a field in a union + - crypto: qat - change value of default idle filter + - tcp: tcp_enter_quickack_mode() should be static + - hwrng: nomadik - keep clock enabled while hwrng is registered + - hwrng: pic32 - use devm_clk_get_enabled + - regmap: maple: Use alloc_flags for memory allocations + - regmap: rbtree: Use alloc_flags for memory allocations + - wifi: mt76: mt7996: fix header translation logic + - wifi: mt76: mt7915: fix background radar event being blocked + - wifi: mt76: mt7915: rework tx packets counting when WED is active + - wifi: mt76: mt7915: rework tx bytes counting when WED is active + - wifi: mt76: mt7921: fix non-PSC channel scan fail + - wifi: mt76: mt7996: fix bss wlan_idx when sending bss_info command + - wifi: mt76: mt7996: use correct phy for background radar event + - wifi: mt76: mt7996: fix WA event ring size + - udp: re-score reuseport groups when connected sockets are present + - bpf: reject unhashed sockets in bpf_sk_assign + - wifi: mt76: mt7915: fix command timeout in AP stop period + - wifi: mt76: mt7915: fix capabilities in non-AP mode + - wifi: mt76: mt7915: remove VHT160 capability on MT7915 + - wifi: mt76: testmode: add nla_policy for MT76_TM_ATTR_TX_LENGTH + - spi: tegra20-sflash: fix to check return value of platform_get_irq() in + tegra_sflash_probe() + - can: gs_usb: gs_usb_receive_bulk_callback(): count RX overflow errors also + in case of OOM + - can: tcan4x5x: Remove reserved register 0x814 from writable table + - wifi: mt76: mt7915: fix tlv length of mt7915_mcu_get_chan_mib_info + - wifi: mt76: mt7915: fix power-limits while chan_switch + - wifi: rtw89: Fix loading of compressed firmware + - wifi: mwifiex: Fix OOB and integer underflow when rx packets + - wifi: mwifiex: fix error recovery in PCIE buffer descriptor management + - wifi: ath11k: fix band selection for ppdu received in channel 177 of 5 GHz + - wifi: ath12k: fix memcpy array overflow in ath12k_peer_assoc_h_he() + - selftests/bpf: fix static assert compilation issue for test_cls_*.c + - power: supply: qcom_pmi8998_charger: fix uninitialized variable + - spi: mpc5xxx-psc: Fix unsigned expression compared with zero + - crypto: af_alg - Fix missing initialisation affecting gcm-aes-s390 + - bpf: fix bpf_dynptr_slice() to stop return an ERR_PTR. + - kbuild: rust_is_available: remove -v option + - kbuild: rust_is_available: fix version check when CC has multiple arguments + - kbuild: rust_is_available: add check for `bindgen` invocation + - kbuild: rust_is_available: fix confusion when a version appears in the path + - crypto: stm32 - Properly handle pm_runtime_get failing + - crypto: api - Use work queue in crypto_destroy_instance + - Bluetooth: ISO: Add support for connecting multiple BISes + - Bluetooth: ISO: do not emit new LE Create CIS if previous is pending + - Bluetooth: nokia: fix value check in nokia_bluetooth_serdev_probe() + - Bluetooth: ISO: Fix not checking for valid CIG/CIS IDs + - Bluetooth: hci_conn: Fix not allowing valid CIS ID + - Bluetooth: hci_conn: Fix hci_le_set_cig_params + - Bluetooth: Fix potential use-after-free when clear keys + - Bluetooth: hci_sync: Don't double print name in add/remove adv_monitor + - Bluetooth: hci_sync: Avoid use-after-free in dbg for hci_add_adv_monitor() + - Bluetooth: hci_conn: Always allocate unique handles + - Bluetooth: hci_event: drop only unbound CIS if Set CIG Parameters fails + - net: tcp: fix unexcepted socket die when snd_wnd is 0 + - net: pcs: lynx: fix lynx_pcs_link_up_sgmii() not doing anything in fixed- + link mode + - libbpf: Set close-on-exec flag on gzopen + - selftests/bpf: Fix repeat option when kfunc_call verification fails + - selftests/bpf: Clean up fmod_ret in bench_rename test script + - net: hns3: move dump regs function to a separate file + - net: hns3: Support tlv in regs data for HNS3 PF driver + - net: hns3: fix wrong rpu tln reg issue + - net-memcg: Fix scope of sockmem pressure indicators + - ice: ice_aq_check_events: fix off-by-one check when filling buffer + - crypto: caam - fix unchecked return value error + - hwrng: iproc-rng200 - Implement suspend and resume calls + - lwt: Fix return values of BPF xmit ops + - lwt: Check LWTUNNEL_XMIT_CONTINUE strictly + - usb: typec: tcpm: set initial svdm version based on pd revision + - usb: typec: bus: verify partner exists in typec_altmode_attention + - USB: core: Unite old scheme and new scheme descriptor reads + - USB: core: Change usb_get_device_descriptor() API + - USB: core: Fix race by not overwriting udev->descriptor in hub_port_init() + - scripts/gdb: fix 'lx-lsmod' show the wrong size + - nmi_backtrace: allow excluding an arbitrary CPU + - watchdog/hardlockup: avoid large stack frames in watchdog_hardlockup_check() + - fs: ocfs2: namei: check return value of ocfs2_add_entry() + - net: lan966x: Fix return value check for vcap_get_rule() + - net: annotate data-races around sk->sk_lingertime + - hwmon: (asus-ec-sensosrs) fix mutex path for X670E Hero + - wifi: mwifiex: fix memory leak in mwifiex_histogram_read() + - wifi: mwifiex: Fix missed return in oob checks failed path + - wifi: rtw89: 8852b: rfk: fine tune IQK parameters to improve performance on + 2GHz band + - selftests: memfd: error out test process when child test fails + - samples/bpf: fix bio latency check with tracepoint + - samples/bpf: fix broken map lookup probe + - wifi: ath9k: fix races between ath9k_wmi_cmd and ath9k_wmi_ctrl_rx + - wifi: ath9k: protect WMI command response buffer replacement with a lock + - bpf: Fix a bpf_kptr_xchg() issue with local kptr + - wifi: mac80211: fix puncturing bitmap handling in CSA + - wifi: nl80211/cfg80211: add forgotten nla_policy for BSS color attribute + - mac80211: make ieee80211_tx_info padding explicit + - bpf: Fix check_func_arg_reg_off bug for graph root/node + - wifi: mwifiex: avoid possible NULL skb pointer dereference + - Bluetooth: hci_conn: Consolidate code for aborting connections + - Bluetooth: ISO: Notify user space about failed bis connections + - Bluetooth: hci_sync: Fix UAF on hci_abort_conn_sync + - Bluetooth: hci_sync: Fix UAF in hci_disconnect_all_sync + - Bluetooth: hci_conn: fail SCO/ISO via hci_conn_failed if ACL gone early + - Bluetooth: btusb: Do not call kfree_skb() under spin_lock_irqsave() + - arm64: mm: use ptep_clear() instead of pte_clear() in clear_flush() + - net/mlx5: Dynamic cyclecounter shift calculation for PTP free running clock + - wifi: ath9k: use IS_ERR() with debugfs_create_dir() + - ice: avoid executing commands on other ports when driving sync + - octeontx2-pf: fix page_pool creation fail for rings > 32k + - net: arcnet: Do not call kfree_skb() under local_irq_disable() + - kunit: Fix checksum tests on big endian CPUs + - mlxsw: i2c: Fix chunk size setting in output mailbox buffer + - mlxsw: i2c: Limit single transaction buffer size + - mlxsw: core_hwmon: Adjust module label names based on MTCAP sensor counter + - crypto: qat - fix crypto capability detection for 4xxx + - hwmon: (tmp513) Fix the channel number in tmp51x_is_visible() + - octeontx2-pf: Fix PFC TX scheduler free + - octeontx2-af: CN10KB: fix PFC configuration + - cteonxt2-pf: Fix backpressure config for multiple PFC priorities to work + simultaneously + - sfc: Check firmware supports Ethernet PTP filter + - net/sched: sch_hfsc: Ensure inner classes have fsc curve + - pds_core: protect devlink callbacks from fw_down state + - pds_core: no health reporter in VF + - pds_core: no reset command for VF + - pds_core: check for work queue before use + - pds_core: pass opcode to devcmd_wait + - netrom: Deny concurrent connect(). + - drm/bridge: tc358764: Fix debug print parameter order + - ASoC: soc-compress: Fix deadlock in soc_compr_open_fe + - ASoC: cs43130: Fix numerator/denominator mixup + - drm: bridge: dw-mipi-dsi: Fix enable/disable of DSI controller + - quota: factor out dquot_write_dquot() + - quota: rename dquot_active() to inode_quota_active() + - quota: add new helper dquot_active() + - quota: fix dqput() to follow the guarantees dquot_srcu should provide + - drm/amd/display: Do not set drr on pipe commit + - drm/hyperv: Fix a compilation issue because of not including screen_info.h + - ASoC: stac9766: fix build errors with REGMAP_AC97 + - soc: qcom: ocmem: Fix NUM_PORTS & NUM_MACROS macros + - arm64: defconfig: enable Qualcomm MSM8996 Global Clock Controller as built- + in + - arm64: dts: qcom: sm8150: use proper DSI PHY compatible + - arm64: dts: qcom: sm6350: Fix ZAP region + - Revert "arm64: dts: qcom: msm8996: rename labels for HDMI nodes" + - arm64: dts: qcom: sm8250: correct dynamic power coefficients + - arm64: dts: qcom: sm8450: correct crypto unit address + - arm64: dts: qcom: msm8916-l8150: correct light sensor VDDIO supply + - arm64: dts: qcom: sm8250-edo: Add gpio line names for TLMM + - arm64: dts: qcom: sm8250-edo: Add GPIO line names for PMIC GPIOs + - arm64: dts: qcom: sm8250-edo: Rectify gpio-keys + - arm64: dts: qcom: sc8280xp-crd: Correct vreg_misc_3p3 GPIO + - arm64: dts: qcom: sc8280xp: Add missing SCM interconnect + - arm64: dts: qcom: msm8939: Drop "qcom,idle-state-spc" compatible + - arm64: dts: qcom: msm8939: Add missing 'cache-unified' to L2 + - arm64: dts: qcom: msm8996: Add missing interrupt to the USB2 controller + - arm64: dts: qcom: sdm845-tama: Set serial indices and stdout-path + - arm64: dts: qcom: sm8350: Fix CPU idle state residency times + - arm64: dts: qcom: sm8350: Add missing LMH interrupts to cpufreq + - arm64: dts: qcom: sc8180x: Fix cluster PSCI suspend param + - arm64: dts: qcom: sm8350: Use proper CPU compatibles + - arm64: dts: qcom: pm8350: fix thermal zone name + - arm64: dts: qcom: pm8350b: fix thermal zone name + - arm64: dts: qcom: pmr735b: fix thermal zone name + - arm64: dts: qcom: pmk8350: fix ADC-TM compatible string + - arm64: dts: qcom: sm8450-hdk: remove pmr735b PMIC inclusion + - arm64: dts: qcom: sm8250: Mark PCIe hosts as DMA coherent + - arm64: dts: qcom: minor whitespace cleanup around '=' + - arm64: dts: qcom: sm8250: Mark SMMUs as DMA coherent + - ARM: dts: stm32: Add missing detach mailbox for emtrion emSBC-Argon + - ARM: dts: stm32: Add missing detach mailbox for Odyssey SoM + - ARM: dts: stm32: Add missing detach mailbox for DHCOM SoM + - ARM: dts: stm32: Add missing detach mailbox for DHCOR SoM + - firmware: ti_sci: Use system_state to determine polling + - drm/amdgpu: avoid integer overflow warning in amdgpu_device_resize_fb_bar() + - ARM: dts: BCM53573: Drop nonexistent "default-off" LED trigger + - ARM: dts: BCM53573: Drop nonexistent #usb-cells + - ARM: dts: BCM53573: Add cells sizes to PCIe node + - ARM: dts: BCM53573: Use updated "spi-gpio" binding properties + - arm64: tegra: Add missing alias for NVIDIA IGX Orin + - arm64: tegra: Fix HSUART for Jetson AGX Orin + - arm64: dts: qcom: sm8250-sony-xperia: correct GPIO keys wakeup again + - arm64: dts: qcom: pm6150l: Add missing short interrupt + - arm64: dts: qcom: pm660l: Add missing short interrupt + - arm64: dts: qcom: pmi8950: Add missing OVP interrupt + - arm64: dts: qcom: pmi8994: Add missing OVP interrupt + - arm64: dts: qcom: sc8180x: Add missing 'cache-unified' to L3 + - arm64: tegra: Fix HSUART for Smaug + - drm/etnaviv: fix dumping of active MMU context + - block: cleanup queue_wc_store + - block: don't allow enabling a cache on devices that don't support it + - blk-flush: fix rq->flush.seq for post-flush requests + - x86/mm: Fix PAT bit missing from page protection modify mask + - drm/bridge: anx7625: Use common macros for DP power sequencing commands + - drm/bridge: anx7625: Use common macros for HDCP capabilities + - ARM: dts: samsung: s3c6410-mini6410: correct ethernet reg addresses (split) + - ARM: dts: samsung: s5pv210-smdkv210: correct ethernet reg addresses (split) + - drm: adv7511: Fix low refresh rate register for ADV7533/5 + - ARM: dts: BCM53573: Fix Ethernet info for Luxul devices + - arm64: dts: qcom: sdm845: Add missing RPMh power domain to GCC + - arm64: dts: qcom: sdm845: Fix the min frequency of "ice_core_clk" + - arm64: dts: qcom: sc8180x: Fix LLCC reg property + - arm64: dts: qcom: msm8996-gemini: fix touchscreen VIO supply + - arm64: dts: qcom: sc8180x-pmics: add missing qcom,spmi-gpio fallbacks + - arm64: dts: qcom: sc8180x-pmics: add missing gpio-ranges + - arm64: dts: qcom: sc8180x-pmics: align SPMI PMIC Power-on node name with + dtschema + - arm64: dts: qcom: sc8180x-pmics: align LPG node name with dtschema + - dt-bindings: arm: msm: kpss-acc: Make the optional reg truly optional + - drm/amdgpu: Update min() to min_t() in 'amdgpu_info_ioctl' + - drm/amdgpu: Use seq_puts() instead of seq_printf() + - arm64: dts: rockchip: Fix PCIe regulators on Radxa E25 + - arm64: dts: rockchip: Enable SATA on Radxa E25 + - ASoC: loongson: drop of_match_ptr for OF device id + - ASoC: fsl: fsl_qmc_audio: Fix snd_pcm_format_t values handling + - md: restore 'noio_flag' for the last mddev_resume() + - md/raid10: factor out dereference_rdev_and_rrdev() + - md/raid10: use dereference_rdev_and_rrdev() to get devices + - md/md-bitmap: remove unnecessary local variable in backlog_store() + - md/md-bitmap: hold 'reconfig_mutex' in backlog_store() + - drm/msm: Update dev core dump to not print backwards + - drm/tegra: dpaux: Fix incorrect return value of platform_get_irq + - of: unittest: fix null pointer dereferencing in + of_unittest_find_node_by_name() + - arm64: dts: qcom: sm8150: Fix the I2C7 interrupt + - drm/ast: report connection status on Display Port. + - ARM: dts: BCM53573: Fix Tenda AC9 switch CPU port + - drm/armada: Fix off-by-one error in armada_overlay_get_property() + - drm/repaper: Reduce temporary buffer size in repaper_fb_dirty() + - drm/panel: simple: Add missing connector type and pixel format for AUO + T215HVN01 + - ima: Remove deprecated IMA_TRUSTED_KEYRING Kconfig + - drm: xlnx: zynqmp_dpsub: Add missing check for dma_set_mask + - drm/msm/dpu: increase memtype count to 16 for sm8550 + - drm/msm/dpu: inline DSC_BLK and DSC_BLK_1_2 macros + - drm/msm/dpu: fix DSC 1.2 block lengths + - drm/msm/dpu1: Rename sm8150_dspp_blk to sdm845_dspp_blk + - drm/msm/dpu: Define names for unnamed sblks + - drm/msm/dpu: fix DSC 1.2 enc subblock length + - arm64: dts: qcom: sm8550-mtp: Add missing supply for L1B regulator + - soc: qcom: smem: Fix incompatible types in comparison + - drm/msm/mdp5: Don't leak some plane state + - firmware: meson_sm: fix to avoid potential NULL pointer dereference + - drm/msm/dpu: fix the irq index in dpu_encoder_phys_wb_wait_for_commit_done + - arm64: dts: ti: k3-j784s4-evm: Correct Pin mux offset for ospi + - arm64: dts: ti: k3-j721s2: correct pinmux offset for ospi + - smackfs: Prevent underflow in smk_set_cipso() + - drm/amdgpu: Sort the includes in amdgpu/amdgpu_drv.c + - drm/amdgpu: Move vram, gtt & flash defines to amdgpu_ ttm & _psp.h + - drm/amd/pm: fix variable dereferenced issue in amdgpu_device_attr_create() + - drm/msm/a2xx: Call adreno_gpu_init() earlier + - drm/msm/a6xx: Fix GMU lockdep splat + - ASoC: SOF: Intel: hda-mlink: fix off-by-one error + - ASoC: SOF: Intel: fix u16/32 confusion in LSDIID + - drm/mediatek: Fix uninitialized symbol + - audit: fix possible soft lockup in __audit_inode_child() + - block/mq-deadline: use correct way to throttling write requests + - io_uring: fix drain stalls by invalid SQE + - block: move the BIO_CLONED checks out of __bio_try_merge_page + - block: move the bi_vcnt check out of __bio_try_merge_page + - block: move the bi_size overflow check in __bio_try_merge_page + - block: move the bi_size update out of __bio_try_merge_page + - block: don't pass a bio to bio_try_merge_hw_seg + - block: make bvec_try_merge_hw_page() non-static + - bio-integrity: create multi-page bvecs in bio_integrity_add_page() + - drm/mediatek: dp: Add missing error checks in mtk_dp_parse_capabilities + - arm64: dts: ti: k3-j784s4-evm: Correct Pin mux offset for ADC + - arm64: dts: ti: k3-j784s4: Fix interrupt ranges for wkup & main gpio + - bus: ti-sysc: Fix build warning for 64-bit build + - drm/mediatek: Remove freeing not dynamic allocated memory + - drm/mediatek: Add cnt checking for coverity issue + - arm64: dts: imx8mp-debix: remove unused fec pinctrl node + - ARM: dts: qcom: ipq4019: correct SDHCI XO clock + - arm64: dts: ti: k3-am62x-sk-common: Update main-i2c1 frequency + - drm/mediatek: Fix potential memory leak if vmap() fail + - drm/mediatek: Fix void-pointer-to-enum-cast warning + - arm64: dts: qcom: apq8016-sbc: Fix ov5640 regulator supply names + - arm64: dts: qcom: apq8016-sbc: Rename ov5640 enable-gpios to powerdown-gpios + - arm64: dts: qcom: msm8998: Drop bus clock reference from MMSS SMMU + - arm64: dts: qcom: msm8998: Add missing power domain to MMSS SMMU + - ARM: dts: qcom: sdx65-mtp: Update the pmic used in sdx65 + - arm64: dts: qcom: msm8996: Fix dsi1 interrupts + - arm64: dts: qcom: sc8280xp-x13s: Unreserve NC pins + - drm/msm/a690: Switch to a660_gmu.bin + - bus: ti-sysc: Fix cast to enum warning + - block: uapi: Fix compilation errors using ioprio.h with C++ + - md/raid5-cache: fix a deadlock in r5l_exit_log() + - md/raid5-cache: fix null-ptr-deref for r5l_flush_stripe_to_raid() + - firmware: cs_dsp: Fix new control name check + - blk-cgroup: Fix NULL deref caused by blkg_policy_data being installed before + init + - md/raid0: Factor out helper for mapping and submitting a bio + - md/raid0: Fix performance regression for large sequential writes + - md: raid0: account for split bio in iostat accounting + - ASoC: SOF: amd: clear dsp to host interrupt status + - of: overlay: Call of_changeset_init() early + - of: unittest: Fix overlay type in apply/revert check + - ALSA: ac97: Fix possible error value of *rac97 + - ALSA: usb-audio: Attach legacy rawmidi after probing all UMP EPs + - ALSA: ump: Fill group names for legacy rawmidi substreams + - ALSA: ump: Don't create unused substreams for static blocks + - ALSA: ump: Fix -Wformat-truncation warnings + - ipmi:ssif: Add check for kstrdup + - ipmi:ssif: Fix a memory leak when scanning for an adapter + - clk: qcom: gpucc-sm6350: Introduce index-based clk lookup + - clk: qcom: gpucc-sm6350: Fix clock source names + - clk: qcom: gcc-sc8280xp: Add missing GDSC flags + - dt-bindings: clock: qcom,gcc-sc8280xp: Add missing GDSCs + - clk: qcom: gcc-sc8280xp: Add missing GDSCs + - clk: qcom: gcc-sm7150: Add CLK_OPS_PARENT_ENABLE to sdcc2 rcg + - clk: rockchip: rk3568: Fix PLL rate setting for 78.75MHz + - PCI: apple: Initialize pcie->nvecs before use + - PCI: qcom-ep: Switch MHI bus master clock off during L1SS + - clk: qcom: gcc-sc8280xp: fix runtime PM imbalance on probe errors + - drivers: clk: keystone: Fix parameter judgment in _of_pll_clk_init() + - iommufd: Fix locking around hwpt allocation + - PCI/DOE: Fix destroy_work_on_stack() race + - clk: qcom: dispcc-sc8280xp: Use ret registers on GDSCs + - clk: sunxi-ng: Modify mismatched function name + - clk: qcom: gcc-sc7180: Fix up gcc_sdcc2_apps_clk_src + - EDAC/igen6: Fix the issue of no error events + - ext4: correct grp validation in ext4_mb_good_group + - ext4: avoid potential data overflow in next_linear_group + - clk: qcom: gcc-sm8250: Fix gcc_sdcc2_apps_clk_src + - clk: qcom: fix some Kconfig corner cases + - kvm/vfio: Prepare for accepting vfio device fd + - kvm/vfio: ensure kvg instance stays around in kvm_vfio_group_add() + - clk: qcom: reset: Use the correct type of sleep/delay based on length + - clk: qcom: gcc-sm6350: Fix gcc_sdcc2_apps_clk_src + - PCI: microchip: Correct the DED and SEC interrupt bit offsets + - PCI: Mark NVIDIA T4 GPUs to avoid bus reset + - pinctrl: mcp23s08: check return value of devm_kasprintf() + - PCI: Add locking to RMW PCI Express Capability Register accessors + - PCI: Make link retraining use RMW accessors for changing LNKCTL + - PCI: pciehp: Use RMW accessors for changing LNKCTL + - PCI/ASPM: Use RMW accessors for changing LNKCTL + - clk: qcom: gcc-sm8450: Use floor ops for SDCC RCGs + - clk: qcom: gcc-qdu1000: Fix gcc_pcie_0_pipe_clk_src clock handling + - clk: qcom: gcc-qdu1000: Fix clkref clocks handling + - clk: imx: pllv4: Fix SPLL2 MULT range + - clk: imx: imx8ulp: update SPLL2 type + - clk: imx8mp: fix sai4 clock + - clk: imx: composite-8m: fix clock pauses when set_rate would be a no-op + - powerpc/radix: Move some functions into #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE + - vfio/type1: fix cap_migration information leak + - nvdimm: Fix memleak of pmu attr_groups in unregister_nvdimm_pmu() + - nvdimm: Fix dereference after free in register_nvdimm_pmu() + - powerpc/fadump: reset dump area size if fadump memory reserve fails + - powerpc/perf: Convert fsl_emb notifier to state machine callbacks + - pinctrl: mediatek: fix pull_type data for MT7981 + - pinctrl: mediatek: assign functions to configure pin bias on MT7986 + - drm/amdgpu: Use RMW accessors for changing LNKCTL + - drm/radeon: Use RMW accessors for changing LNKCTL + - net/mlx5: Use RMW accessors for changing LNKCTL + - wifi: ath11k: Use RMW accessors for changing LNKCTL + - wifi: ath12k: Use RMW accessors for changing LNKCTL + - wifi: ath10k: Use RMW accessors for changing LNKCTL + - NFSv4.2: Fix READ_PLUS smatch warnings + - NFSv4.2: Fix READ_PLUS size calculations + - NFSv4.2: Rework scratch handling for READ_PLUS (again) + - PCI: layerscape: Add workaround for lost link capabilities during reset + - powerpc: Don't include lppaca.h in paca.h + - powerpc/pseries: Rework lppaca_shared_proc() to avoid DEBUG_PREEMPT + - nfs/blocklayout: Use the passed in gfp flags + - powerpc/pseries: Fix hcall tracepoints with JUMP_LABEL=n + - powerpc/mpc5xxx: Add missing fwnode_handle_put() + - powerpc/iommu: Fix notifiers being shared by PCI and VIO buses + - ext4: fix unttached inode after power cut with orphan file feature enabled + - jfs: validate max amount of blocks before allocation. + - SUNRPC: Fix the recent bv_offset fix + - fs: lockd: avoid possible wrong NULL parameter + - NFSD: da_addr_body field missing in some GETDEVICEINFO replies + - clk: qcom: Fix SM_GPUCC_8450 dependencies + - NFS: Guard against READDIR loop when entry names exceed MAXNAMELEN + - NFSv4.2: fix handling of COPY ERR_OFFLOAD_NO_REQ + - pNFS: Fix assignment of xprtdata.cred + - cgroup/cpuset: Inherit parent's load balance state in v2 + - RDMA/qedr: Remove a duplicate assignment in irdma_query_ah() + - media: ov5640: fix low resolution image abnormal issue + - media: i2c: imx290: drop format param from imx290_ctrl_update + - media: ad5820: Drop unsupported ad5823 from i2c_ and of_device_id tables + - media: i2c: tvp5150: check return value of devm_kasprintf() + - media: v4l2-core: Fix a potential resource leak in v4l2_fwnode_parse_link() + - iommu/amd/iommu_v2: Fix pasid_state refcount dec hit 0 warning on pasid + unbind + - iommu: rockchip: Fix directory table address encoding + - drivers: usb: smsusb: fix error handling code in smsusb_init_device + - media: dib7000p: Fix potential division by zero + - media: dvb-usb: m920x: Fix a potential memory leak in m920x_i2c_xfer() + - media: cx24120: Add retval check for cx24120_message_send() + - RDMA/siw: Fabricate a GID on tun and loopback devices + - scsi: hisi_sas: Fix normally completed I/O analysed as failed + - dt-bindings: extcon: maxim,max77843: restrict connector properties + - media: amphion: reinit vpu if reqbufs output 0 + - media: amphion: add helper function to get id name + - media: verisilicon: Fix TRY_FMT on encoder OUTPUT + - media: mtk-jpeg: Fix use after free bug due to uncanceled work + - media: amphion: decoder support display delay for all formats + - media: rkvdec: increase max supported height for H.264 + - media: amphion: fix CHECKED_RETURN issues reported by coverity + - media: amphion: fix REVERSE_INULL issues reported by coverity + - media: amphion: fix UNINIT issues reported by coverity + - media: amphion: fix UNUSED_VALUE issue reported by coverity + - media: amphion: ensure the bitops don't cross boundaries + - media: mediatek: vcodec: fix AV1 decode fail for 36bit iova + - media: mediatek: vcodec: Return NULL if no vdec_fb is found + - media: mediatek: vcodec: fix potential double free + - media: mediatek: vcodec: fix resource leaks in vdec_msg_queue_init() + - usb: phy: mxs: fix getting wrong state with mxs_phy_is_otg_host() + - scsi: RDMA/srp: Fix residual handling + - scsi: ufs: Fix residual handling + - scsi: iscsi: Add length check for nlattr payload + - scsi: iscsi: Add strlen() check in iscsi_if_set{_host}_param() + - scsi: be2iscsi: Add length check when parsing nlattrs + - scsi: qla4xxx: Add length check when parsing nlattrs + - iio: accel: adxl313: Fix adxl313_i2c_id[] table + - serial: sprd: Assign sprd_port after initialized to avoid wrong access + - serial: sprd: Fix DMA buffer leak issue + - x86/APM: drop the duplicate APM_MINOR_DEV macro + - RDMA/rxe: Move work queue code to subroutines + - RDMA/rxe: Fix unsafe drain work queue code + - RDMA/rxe: Fix rxe_modify_srq + - RDMA/rxe: Fix incomplete state save in rxe_requester + - scsi: qedf: Do not touch __user pointer in + qedf_dbg_stop_io_on_error_cmd_read() directly + - scsi: qedf: Do not touch __user pointer in qedf_dbg_debug_cmd_read() + directly + - scsi: qedf: Do not touch __user pointer in qedf_dbg_fp_int_cmd_read() + directly + - RDMA/irdma: Replace one-element array with flexible-array member + - coresight: tmc: Explicit type conversions to prevent integer overflow + - interconnect: qcom: qcm2290: Enable sync state + - dma-buf/sync_file: Fix docs syntax + - driver core: test_async: fix an error code + - driver core: Call dma_cleanup() on the test_remove path + - kernfs: add stub helper for kernfs_generic_poll() + - extcon: cht_wc: add POWER_SUPPLY dependency + - iommu/mediatek: Fix two IOMMU share pagetable issue + - iommu/sprd: Add missing force_aperture + - iommu: Remove kernel-doc warnings + - bnxt_en: Update HW interface headers + - bnxt_en: Share the bar0 address with the RoCE driver + - RDMA/bnxt_re: Initialize Doorbell pacing feature + - RDMA/bnxt_re: Fix max_qp count for virtual functions + - RDMA/bnxt_re: Remove a redundant flag + - RDMA/hns: Fix port active speed + - RDMA/hns: Fix incorrect post-send with direct wqe of wr-list + - RDMA/hns: Fix inaccurate error label name in init instance + - RDMA/hns: Fix CQ and QP cache affinity + - IB/uverbs: Fix an potential error pointer dereference + - fsi: aspeed: Reset master errors after CFAM reset + - iommu/qcom: Disable and reset context bank before programming + - tty: serial: qcom-geni-serial: Poll primary sequencer irq status after + cancel_tx + - iommu/vt-d: Fix to flush cache of PASID directory table + - platform/x86: dell-sysman: Fix reference leak + - media: cec: core: add adap_nb_transmit_canceled() callback + - media: cec: core: add adap_unconfigured() callback + - media: go7007: Remove redundant if statement + - media: venus: hfi_venus: Only consider sys_idle_indicator on V1 + - arm64: defconfig: Drop CONFIG_VIDEO_IMX_MEDIA + - media: ipu-bridge: Fix null pointer deref on SSDB/PLD parsing warnings + - media: ipu3-cio2: rename cio2 bridge to ipu bridge and move out of ipu3 + - media: ipu-bridge: Do not use on stack memory for software_node.name field + - docs: ABI: fix spelling/grammar in SBEFIFO timeout interface + - USB: gadget: core: Add missing kerneldoc for vbus_work + - USB: gadget: f_mass_storage: Fix unused variable warning + - drivers: base: Free devm resources when unregistering a device + - HID: input: Support devices sending Eraser without Invert + - HID: nvidia-shield: Remove led_classdev_unregister in thunderstrike_create + - media: ov5640: Enable MIPI interface in ov5640_set_power_mipi() + - media: ov5640: Fix initial RESETB state and annotate timings + - media: Documentation: Fix [GS]_ROUTING documentation + - media: ov2680: Remove auto-gain and auto-exposure controls + - media: ov2680: Fix ov2680_bayer_order() + - media: ov2680: Fix vflip / hflip set functions + - media: ov2680: Remove VIDEO_V4L2_SUBDEV_API ifdef-s + - media: ov2680: Don't take the lock for try_fmt calls + - media: ov2680: Add ov2680_fill_format() helper function + - media: ov2680: Fix ov2680_set_fmt() which == V4L2_SUBDEV_FORMAT_TRY not + working + - media: ov2680: Fix regulators being left enabled on ov2680_power_on() errors + - media: i2c: rdacm21: Fix uninitialized value + - f2fs: fix spelling in ABI documentation + - f2fs: fix to avoid mmap vs set_compress_option case + - f2fs: don't reopen the main block device in f2fs_scan_devices + - f2fs: check zone type before sending async reset zone command + - f2fs: Only lfs mode is allowed with zoned block device feature + - Revert "f2fs: fix to do sanity check on extent cache correctly" + - f2fs: fix to account gc stats correctly + - f2fs: fix to account cp stats correctly + - cgroup:namespace: Remove unused cgroup_namespaces_init() + - coresight: trbe: Allocate platform data per device + - coresight: platform: acpi: Ignore the absence of graph + - coresight: Fix memory leak in acpi_buffer->pointer + - coresight: trbe: Fix TRBE potential sleep in atomic context + - Revert "f2fs: do not issue small discard commands during checkpoint" + - RDMA/irdma: Prevent zero-length STAG registration + - scsi: core: Use 32-bit hostnum in scsi_host_lookup() + - scsi: fcoe: Fix potential deadlock on &fip->ctlr_lock + - interconnect: qcom: sm8450: Enable sync_state + - interconnect: qcom: bcm-voter: Improve enable_mask handling + - interconnect: qcom: bcm-voter: Use enable_maks for keepalive voting + - dt-bindings: usb: samsung,exynos-dwc3: fix order of clocks on Exynos5433 + - dt-bindings: usb: samsung,exynos-dwc3: Fix Exynos5433 compatible + - serial: tegra: handle clk prepare error in tegra_uart_hw_init() + - Documentation: devices.txt: Remove ttyIOC* + - Documentation: devices.txt: Remove ttySIOC* + - Documentation: devices.txt: Fix minors for ttyCPM* + - amba: bus: fix refcount leak + - Revert "IB/isert: Fix incorrect release of isert connection" + - RDMA/siw: Balance the reference of cep->kref in the error path + - RDMA/siw: Correct wrong debug message + - RDMA/efa: Fix wrong resources deallocation order + - HID: logitech-dj: Fix error handling in logi_dj_recv_switch_to_dj_mode() + - nvmem: core: Return NULL when no nvmem layout is found + - riscv: Require FRAME_POINTER for some configurations + - f2fs: compress: fix to assign compress_level for lz4 correctly + - HID: uclogic: Correct devm device reference for hidinput input_dev name + - HID: multitouch: Correct devm device reference for hidinput input_dev name + - HID: nvidia-shield: Reference hid_device devm allocation of input_dev name + - platform/x86/amd/pmf: Fix a missing cleanup path + - workqueue: fix data race with the pwq->stats[] increment + - tick/rcu: Fix false positive "softirq work is pending" messages + - x86/speculation: Mark all Skylake CPUs as vulnerable to GDS + - tracing: Remove extra space at the end of hwlat_detector/mode + - tracing: Fix race issue between cpu buffer write and swap + - mm/pagewalk: fix bootstopping regression from extra pte_unmap() + - mtd: rawnand: brcmnand: Fix mtd oobsize + - dmaengine: idxd: Modify the dependence of attribute pasid_enabled + - phy/rockchip: inno-hdmi: use correct vco_div_5 macro on rk3328 + - phy/rockchip: inno-hdmi: round fractal pixclock in rk3328 recalc_rate + - phy/rockchip: inno-hdmi: do not power on rk3328 post pll on reg write + - rpmsg: glink: Add check for kstrdup + - leds: aw200xx: Fix error code in probe() + - leds: simatic-ipc-leds-gpio: Restore LEDS_CLASS dependency + - leds: pwm: Fix error code in led_pwm_create_fwnode() + - thermal/drivers/mediatek/lvts_thermal: Handle IRQ on all controllers + - thermal/drivers/mediatek/lvts_thermal: Honor sensors in immediate mode + - thermal/drivers/mediatek/lvts_thermal: Use offset threshold for IRQ + - thermal/drivers/mediatek/lvts_thermal: Disable undesired interrupts + - thermal/drivers/mediatek/lvts_thermal: Don't leave threshold zeroed + - thermal/drivers/mediatek/lvts_thermal: Manage threshold between sensors + - thermal/drivers/imx8mm: Suppress log message on probe deferral + - leds: multicolor: Use rounded division when calculating color components + - leds: Fix BUG_ON check for LED_COLOR_ID_MULTI that is always false + - leds: trigger: tty: Do not use LED_ON/OFF constants, use + led_blink_set_oneshot instead + - mtd: spi-nor: Check bus width while setting QE bit + - mtd: rawnand: fsmc: handle clk prepare error in fsmc_nand_resume() + - mfd: rk808: Make MFD_RK8XX tristate + - mfd: rz-mtu3: Link time dependencies + - um: Fix hostaudio build errors + - dmaengine: ste_dma40: Add missing IRQ check in d40_probe + - dmaengine: idxd: Simplify WQ attribute visibility checks + - dmaengine: idxd: Expose ATS disable knob only when WQ ATS is supported + - dmaengine: idxd: Allow ATS disable update only for configurable devices + - dmaengine: idxd: Fix issues with PRS disable sysfs knob + - remoteproc: stm32: fix incorrect optional pointers + - Drivers: hv: vmbus: Don't dereference ACPI root object handle + - um: virt-pci: fix missing declaration warning + - cpufreq: Fix the race condition while updating the transition_task of policy + - virtio_vdpa: build affinity masks conditionally + - virtio_ring: fix avail_wrap_counter in virtqueue_add_packed + - net: deal with integer overflows in kmalloc_reserve() + - igmp: limit igmpv3_newpack() packet size to IP_MAX_MTU + - netfilter: ipset: add the missing IP_SET_HASH_WITH_NET0 macro for + ip_set_hash_netportnet.c + - netfilter: nft_exthdr: Fix non-linear header modification + - netfilter: xt_u32: validate user space input + - netfilter: xt_sctp: validate the flag_info count + - skbuff: skb_segment, Call zero copy functions before using skbuff frags + - drbd: swap bvec_set_page len and offset + - gpio: zynq: restore zynq_gpio_irq_reqres/zynq_gpio_irq_relres callbacks + - igb: set max size RX buffer when store bad packet is enabled + - parisc: ccio-dma: Create private runway procfs root entry + - PM / devfreq: Fix leak in devfreq_dev_release() + - Multi-gen LRU: fix per-zone reclaim + - ALSA: pcm: Fix missing fixup call in compat hw_refine ioctl + - virtio_pmem: add the missing REQ_OP_WRITE for flush bio + - rcu: dump vmalloc memory info safely + - printk: ringbuffer: Fix truncating buffer size min_t cast + - scsi: core: Fix the scsi_set_resid() documentation + - mm/vmalloc: add a safer version of find_vm_area() for debug + - cpu/hotplug: Prevent self deadlock on CPU hot-unplug + - media: i2c: ccs: Check rules is non-NULL + - media: i2c: Add a camera sensor top level menu + - PCI: rockchip: Use 64-bit mask on MSI 64-bit PCI address + - ipmi_si: fix a memleak in try_smi_init() + - ARM: OMAP2+: Fix -Warray-bounds warning in _pwrdm_state_switch() + - riscv: Move create_tmp_mapping() to init sections + - riscv: Mark KASAN tmp* page tables variables as static + - XArray: Do not return sibling entries from xa_load() + - io_uring: fix false positive KASAN warnings + - io_uring: break iopolling on signal + - io_uring/sqpoll: fix io-wq affinity when IORING_SETUP_SQPOLL is used + - io_uring/net: don't overflow multishot recv + - io_uring/net: don't overflow multishot accept + - io_uring: break out of iowq iopoll on teardown + - backlight/gpio_backlight: Compare against struct fb_info.device + - backlight/bd6107: Compare against struct fb_info.device + - backlight/lv5207lp: Compare against struct fb_info.device + - drm/amd/display: register edp_backlight_control() for DCN301 + - xtensa: PMU: fix base address for the newer hardware + - LoongArch: mm: Add p?d_leaf() definitions + - powercap: intel_rapl: Fix invalid setting of Power Limit 4 + - powerpc/ftrace: Fix dropping weak symbols with older toolchains + - i3c: master: svc: fix probe failure when no i3c device exist + - io_uring: Don't set affinity on a dying sqpoll thread + - arm64: csum: Fix OoB access in IP checksum code for negative lengths + - ALSA: usb-audio: Fix potential memory leaks at error path for UMP open + - ALSA: seq: Fix snd_seq_expand_var_event() call to user-space + - ALSA: hda/cirrus: Fix broken audio on hardware with two CS42L42 codecs. + - selftests/landlock: Fix a resource leak + - media: dvb: symbol fixup for dvb_attach() + - media: venus: hfi_venus: Write to VIDC_CTRL_INIT after unmasking interrupts + - media: nxp: Fix wrong return pointer check in mxc_isi_crossbar_init() + - Revert "scsi: qla2xxx: Fix buffer overrun" + - scsi: mpt3sas: Perform additional retries if doorbell read returns 0 + - PCI: Free released resource after coalescing + - PCI: hv: Fix a crash in hv_pci_restore_msi_msg() during hibernation + - PCI/PM: Only read PCI_PM_CTRL register when available + - dt-bindings: PCI: qcom: Fix SDX65 compatible + - ntb: Drop packets when qp link is down + - ntb: Clean up tx tail index on link down + - ntb: Fix calculation ntb_transport_tx_free_entry() + - Revert "PCI: Mark NVIDIA T4 GPUs to avoid bus reset" + - block: fix pin count management when merging same-page segments + - block: don't add or resize partition on the disk with GENHD_FL_NO_PART + - procfs: block chmod on /proc/thread-self/comm + - parisc: Fix /proc/cpuinfo output for lscpu + - misc: fastrpc: Pass proper scm arguments for static process init + - drm/amd/display: Add smu write msg id fail retry process + - bpf: Fix issue in verifying allow_ptr_leaks + - dlm: fix plock lookup when using multiple lockspaces + - dccp: Fix out of bounds access in DCCP error handler + - x86/sev: Make enc_dec_hypercall() accept a size instead of npages + - r8169: fix ASPM-related issues on a number of systems with NIC version from + RTL8168h + - X.509: if signature is unsupported skip validation + - net: handle ARPHRD_PPP in dev_is_mac_header_xmit() + - fsverity: skip PKCS#7 parser when keyring is empty + - x86/MCE: Always save CS register on AMD Zen IF Poison errors + - crypto: af_alg - Decrement struct key.usage in alg_set_by_key_serial() + - platform/chrome: chromeos_acpi: print hex string for ACPI_TYPE_BUFFER + - mmc: renesas_sdhi: register irqs before registering controller + - pstore/ram: Check start of empty przs during init + - arm64: sdei: abort running SDEI handlers during crash + - regulator: dt-bindings: qcom,rpm: fix pattern for children + - iov_iter: Fix iov_iter_extract_pages() with zero-sized entries + - RISC-V: Add ptrace support for vectors + - s390/dcssblk: fix kernel crash with list_add corruption + - s390/ipl: add missing secure/has_secure file to ipl type 'unknown' + - s390/dasd: fix string length handling + - HID: logitech-hidpp: rework one more time the retries attempts + - crypto: stm32 - fix loop iterating through scatterlist for DMA + - crypto: stm32 - fix MDMAT condition + - cpufreq: brcmstb-avs-cpufreq: Fix -Warray-bounds bug + - of: property: fw_devlink: Add a devlink for panel followers + - USB: core: Fix oversight in SuperSpeed initialization + - x86/smp: Don't send INIT to non-present and non-booted CPUs + - x86/sgx: Break up long non-preemptible delays in sgx_vepc_release() + - x86/build: Fix linker fill bytes quirk/incompatibility for ld.lld + - perf/x86/uncore: Correct the number of CHAs on EMR + - media: ipu3-cio2: allow ipu_bridge to be a module again + - Bluetooth: msft: Extended monitor tracking by address filter + - Bluetooth: HCI: Introduce HCI_QUIRK_BROKEN_LE_CODED + - serial: sc16is7xx: remove obsolete out_thread label + - serial: sc16is7xx: fix regression with GPIO configuration + - mm/memfd: sysctl: fix MEMFD_NOEXEC_SCOPE_NOEXEC_ENFORCED + - selftests/memfd: sysctl: fix MEMFD_NOEXEC_SCOPE_NOEXEC_ENFORCED + - memfd: do not -EACCES old memfd_create() users with vm.memfd_noexec=2 + - memfd: replace ratcheting feature from vm.memfd_noexec with hierarchy + - memfd: improve userspace warnings for missing exec-related flags + - revert "memfd: improve userspace warnings for missing exec-related flags". + - drm/amd/display: Block optimize on consecutive FAMS enables + - Linux 6.5.3 + * Mantic update: v6.5.2 upstream stable release (LP: #2035583) + - drm/amdgpu: correct vmhub index in GMC v10/11 + - erofs: ensure that the post-EOF tails are all zeroed + - ksmbd: fix wrong DataOffset validation of create context + - ksmbd: fix slub overflow in ksmbd_decode_ntlmssp_auth_blob() + - ksmbd: replace one-element array with flex-array member in struct + smb2_ea_info + - ksmbd: reduce descriptor size if remaining bytes is less than request size + - ARM: pxa: remove use of symbol_get() + - mmc: au1xmmc: force non-modular build and remove symbol_get usage + - net: enetc: use EXPORT_SYMBOL_GPL for enetc_phc_index + - rtc: ds1685: use EXPORT_SYMBOL_GPL for ds1685_rtc_poweroff + - USB: serial: option: add Quectel EM05G variant (0x030e) + - USB: serial: option: add FOXCONN T99W368/T99W373 product + - ALSA: usb-audio: Fix init call orders for UAC1 + - usb: dwc3: meson-g12a: do post init to fix broken usb after resumption + - usb: chipidea: imx: improve logic if samsung,picophy-* parameter is 0 + - HID: wacom: remove the battery when the EKR is off + - staging: rtl8712: fix race condition + - wifi: mt76: mt7921: do not support one stream on secondary antenna only + - wifi: mt76: mt7921: fix skb leak by txs missing in AMSDU + - wifi: rtw88: usb: kill and free rx urbs on probe failure + - wifi: ath11k: Don't drop tx_status when peer cannot be found + - wifi: ath11k: Cleanup mac80211 references on failure during tx_complete + - serial: qcom-geni: fix opp vote on shutdown + - serial: sc16is7xx: fix broken port 0 uart init + - serial: sc16is7xx: fix bug when first setting GPIO direction + - firmware: stratix10-svc: Fix an NULL vs IS_ERR() bug in probe + - fsi: master-ast-cf: Add MODULE_FIRMWARE macro + - tcpm: Avoid soft reset when partner does not support get_status + - dt-bindings: sc16is7xx: Add property to change GPIO function + - tracing: Zero the pipe cpumask on alloc to avoid spurious -EBUSY + - nilfs2: fix WARNING in mark_buffer_dirty due to discarded buffer reuse + - usb: typec: tcpci: clear the fault status bit + - pinctrl: amd: Don't show `Invalid config param` errors + - Linux 6.5.2 + * Mantic update: v6.5.1 upstream stable release (LP: #2035581) + - ACPI: thermal: Drop nocrt parameter + - module: Expose module_init_layout_section() + - arm64: module: Use module_init_layout_section() to spot init sections + - ARM: module: Use module_init_layout_section() to spot init sections + - ipv6: remove hard coded limitation on ipv6_pinfo + - lockdep: fix static memory detection even more + - kallsyms: Fix kallsyms_selftest failure + - Linux 6.5.1 + * [23.10 FEAT] [SEC2352] pkey: support EP11 API ordinal 6 for secure guests + (LP: #2029390) + - s390/zcrypt_ep11misc: support API ordinal 6 with empty pin-blob + * [23.10 FEAT] [SEC2341] pkey: support generation of keys of type + PKEY_TYPE_EP11_AES (LP: #2028937) + - s390/pkey: fix/harmonize internal keyblob headers + - s390/pkey: fix PKEY_TYPE_EP11_AES handling in PKEY_GENSECK2 IOCTL + - s390/pkey: fix PKEY_TYPE_EP11_AES handling in PKEY_CLR2SECK2 IOCTL + - s390/pkey: fix PKEY_TYPE_EP11_AES handling in PKEY_KBLOB2PROTK[23] + - s390/pkey: fix PKEY_TYPE_EP11_AES handling in PKEY_VERIFYKEY2 IOCTL + - s390/pkey: fix PKEY_TYPE_EP11_AES handling for sysfs attributes + - s390/paes: fix PKEY_TYPE_EP11_AES handling for secure keyblobs + * [23.10 FEAT] KVM: Enable Secure Execution Crypto Passthrough - kernel part + (LP: #2003674) + - KVM: s390: interrupt: Fix single-stepping into interrupt handlers + - KVM: s390: interrupt: Fix single-stepping into program interrupt handlers + - KVM: s390: interrupt: Fix single-stepping kernel-emulated instructions + - KVM: s390: interrupt: Fix single-stepping userspace-emulated instructions + - KVM: s390: interrupt: Fix single-stepping keyless mode exits + - KVM: s390: selftests: Add selftest for single-stepping + - s390/vfio-ap: no need to check the 'E' and 'I' bits in APQSW after TAPQ + - s390/vfio-ap: clean up irq resources if possible + - s390/vfio-ap: wait for response code 05 to clear on queue reset + - s390/vfio-ap: allow deconfigured queue to be passed through to a guest + - s390/vfio-ap: remove upper limit on wait for queue reset to complete + - s390/vfio-ap: store entire AP queue status word with the queue object + - s390/vfio-ap: use work struct to verify queue reset + - s390/vfio-ap: handle queue state change in progress on reset + - s390/vfio-ap: check for TAPQ response codes 0x35 and 0x36 + - s390/uv: export uv_pin_shared for direct usage + - KVM: s390: export kvm_s390_pv*_is_protected functions + - s390/vfio-ap: make sure nib is shared + - KVM: s390: pv: relax WARN_ONCE condition for destroy fast + - s390/uv: UV feature check utility + - KVM: s390: Add UV feature negotiation + - KVM: s390: pv: Allow AP-instructions for pv-guests + * Make backlight module auto detect dell_uart_backlight (LP: #2008882) + - SAUCE: ACPI: video: Dell AIO UART backlight detection + * Avoid address overwrite in kernel_connect (LP: #2035163) + - net: annotate data-races around sock->ops + - net: Avoid address overwrite in kernel_connect + * Include QCA WWAN 5G Qualcomm SDX62/DW5932e support (LP: #2035306) + - bus: mhi: host: pci_generic: Add support for Dell DW5932e + * NULL pointer dereference on CS35L41 HDA AMP (LP: #2029199) + - ALSA: cs35l41: Use mbox command to enable speaker output for external boost + - ALSA: cs35l41: Poll for Power Up/Down rather than waiting a fixed delay + - ALSA: hda: cs35l41: Check mailbox status of pause command after firmware + load + - ALSA: hda: cs35l41: Ensure we correctly re-sync regmap before system + suspending. + - ALSA: hda: cs35l41: Ensure we pass up any errors during system suspend. + - ALSA: hda: cs35l41: Move Play and Pause into separate functions + - ALSA: hda: hda_component: Add pre and post playback hooks to hda_component + - ALSA: hda: cs35l41: Use pre and post playback hooks + - ALSA: hda: cs35l41: Rework System Suspend to ensure correct call separation + - ALSA: hda: cs35l41: Add device_link between HDA and cs35l41_hda + - ALSA: hda: cs35l41: Ensure amp is only unmuted during playback + * Enable ASPM for NVMe behind VMD (LP: #2034504) + - Revert "UBUNTU: SAUCE: vmd: fixup bridge ASPM by driver name instead" + - Revert "UBUNTU: SAUCE: PCI/ASPM: Enable LTR for endpoints behind VMD" + - Revert "UBUNTU: SAUCE: PCI/ASPM: Enable ASPM for links under VMD domain" + - SAUCE: PCI/ASPM: Allow ASPM override over FADT default + - SAUCE: PCI: vmd: Mark ASPM override for device behind VMD bridge + * Linux 6.2 fails to reboot with current u-boot-nezha (LP: #2021364) + - [Config] Default to performance CPUFreq governor on riscv64 + * Enable Nezha board (LP: #1975592) + - [Config] Enable CONFIG_REGULATOR_FIXED_VOLTAGE on riscv64 + - [Config] Build in D1 clock drivers on riscv64 + - [Config] Enable CONFIG_SUN6I_RTC_CCU on riscv64 + - [Config] Enable CONFIG_SUNXI_WATCHDOG on riscv64 + - [Config] Disable SUN50I_DE2_BUS on riscv64 + - [Config] Disable unneeded sunxi pinctrl drivers on riscv64 + * Enable Nezha board (LP: #1975592) // Enable StarFive VisionFive 2 board + (LP: #2013232) + - [Config] Enable CONFIG_SERIAL_8250_DW on riscv64 + * Enable StarFive VisionFive 2 board (LP: #2013232) + - [Config] Enable CONFIG_PINCTRL_STARFIVE_JH7110_SYS on riscv64 + - [Config] Enable CONFIG_STARFIVE_WATCHDOG on riscv64 + * rcu_sched detected stalls on CPUs/tasks (LP: #1967130) + - [Config] Enable virtually mapped stacks on riscv64 + * RISC-V kernel config is out of sync with other archs (LP: #1981437) + - [Config] Sync riscv64 config with other architectures + * Support for Intel Discrete Gale Peak2/BE200 (LP: #2028065) + - Bluetooth: btintel: Add support for Gale Peak + - Bluetooth: Add support for Gale Peak (8087:0036) + * Missing BT IDs for support for Intel Discrete Misty Peak2/BE202 + (LP: #2033455) + - SAUCE: Bluetooth: btusb: Add support for Intel Misty Peak - 8087:0038 + * Audio device fails to function randomly on Intel MTL platform: No CPC match + in the firmware file's manifest (LP: #2034506) + - ASoC: SOF: ipc4-topology: Add module parameter to ignore the CPC value + * Check for changes relevant for security certifications (LP: #1945989) + - [Packaging] Add a new fips-checks script + * Installation support for SMARC RZ/G2L platform (LP: #2030525) + - [Config] build Renesas RZ/G2L USBPHY control driver statically + * Add support for kernels compiled with CONFIG_EFI_ZBOOT (LP: #2002226) + - [Config]: Turn on CONFIG_EFI_ZBOOT on ARM64 + * Default module signing algo should be accelerated (LP: #2034061) + - [Config] Default module signing algo should be accelerated + * NEW SRU rustc linux kernel requirements (LP: #1993183) + - [Packaging] re-enable Rust support + * FATAL:credentials.cc(127)] Check failed: . : Permission denied (13) + (LP: #2017980) + - [Config] disable CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS + * update apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor4.0.0 [01/76]: add/use fns to print hash string hex value + - SAUCE: apparmor4.0.0 [02/76]: rename SK_CTX() to aa_sock and make it an + inline fn + - SAUCE: apparmor4.0.0 [03/76]: patch to provide compatibility with v2.x net + rules + - SAUCE: apparmor4.0.0 [04/76]: add user namespace creation mediation + - SAUCE: apparmor4.0.0 [05/76]: Add sysctls for additional controls of unpriv + userns restrictions + - SAUCE: apparmor4.0.0 [06/76]: af_unix mediation + - SAUCE: apparmor4.0.0 [07/76]: Add fine grained mediation of posix mqueues + - SAUCE: apparmor4.0.0 [08/76]: Stacking v38: LSM: Identify modules by more + than name + - SAUCE: apparmor4.0.0 [09/76]: Stacking v38: LSM: Add an LSM identifier for + external use + - SAUCE: apparmor4.0.0 [10/76]: Stacking v38: LSM: Identify the process + attributes for each module + - SAUCE: apparmor4.0.0 [11/76]: Stacking v38: LSM: Maintain a table of LSM + attribute data + - SAUCE: apparmor4.0.0 [12/76]: Stacking v38: proc: Use lsmids instead of lsm + names for attrs + - SAUCE: apparmor4.0.0 [13/76]: Stacking v38: integrity: disassociate + ima_filter_rule from security_audit_rule + - SAUCE: apparmor4.0.0 [14/76]: Stacking v38: LSM: Infrastructure management + of the sock security + - SAUCE: apparmor4.0.0 [15/76]: Stacking v38: LSM: Add the lsmblob data + structure. + - SAUCE: apparmor4.0.0 [16/76]: Stacking v38: LSM: provide lsm name and id + slot mappings + - SAUCE: apparmor4.0.0 [17/76]: Stacking v38: IMA: avoid label collisions with + stacked LSMs + - SAUCE: apparmor4.0.0 [18/76]: Stacking v38: LSM: Use lsmblob in + security_audit_rule_match + - SAUCE: apparmor4.0.0 [19/76]: Stacking v38: LSM: Use lsmblob in + security_kernel_act_as + - SAUCE: apparmor4.0.0 [20/76]: Stacking v38: LSM: Use lsmblob in + security_secctx_to_secid + - SAUCE: apparmor4.0.0 [21/76]: Stacking v38: LSM: Use lsmblob in + security_secid_to_secctx + - SAUCE: apparmor4.0.0 [22/76]: Stacking v38: LSM: Use lsmblob in + security_ipc_getsecid + - SAUCE: apparmor4.0.0 [23/76]: Stacking v38: LSM: Use lsmblob in + security_current_getsecid + - SAUCE: apparmor4.0.0 [24/70]: Stacking v38: LSM: Use lsmblob in + security_inode_getsecid + - SAUCE: apparmor4.0.0 [25/76]: Stacking v38: LSM: Use lsmblob in + security_cred_getsecid + - SAUCE: apparmor4.0.0 [26/76]: Stacking v38: LSM: Specify which LSM to + display + - SAUCE: apparmor4.0.0 [28/76]: Stacking v38: LSM: Ensure the correct LSM + context releaser + - SAUCE: apparmor4.0.0 [29/76]: Stacking v38: LSM: Use lsmcontext in + security_secid_to_secctx + - SAUCE: apparmor4.0.0 [30/76]: Stacking v38: LSM: Use lsmcontext in + security_inode_getsecctx + - SAUCE: apparmor4.0.0 [31/76]: Stacking v38: Use lsmcontext in + security_dentry_init_security + - SAUCE: apparmor4.0.0 [32/76]: Stacking v38: LSM: security_secid_to_secctx in + netlink netfilter + - SAUCE: apparmor4.0.0 [33/76]: Stacking v38: NET: Store LSM netlabel data in + a lsmblob + - SAUCE: apparmor4.0.0 [34/76]: Stacking v38: binder: Pass LSM identifier for + confirmation + - SAUCE: apparmor4.0.0 [35/76]: Stacking v38: LSM: security_secid_to_secctx + module selection + - SAUCE: apparmor4.0.0 [36/76]: Stacking v38: Audit: Keep multiple LSM data in + audit_names + - SAUCE: apparmor4.0.0 [37/76]: Stacking v38: Audit: Create audit_stamp + structure + - SAUCE: apparmor4.0.0 [38/76]: Stacking v38: LSM: Add a function to report + multiple LSMs + - SAUCE: apparmor4.0.0 [39/76]: Stacking v38: Audit: Allow multiple records in + an audit_buffer + - SAUCE: apparmor4.0.0 [40/76]: Stacking v38: Audit: Add record for multiple + task security contexts + - SAUCE: apparmor4.0.0 [41/76]: Stacking v38: audit: multiple subject lsm + values for netlabel + - SAUCE: apparmor4.0.0 [42/76]: Stacking v38: Audit: Add record for multiple + object contexts + - SAUCE: apparmor4.0.0 [43/76]: Stacking v38: netlabel: Use a struct lsmblob + in audit data + - SAUCE: apparmor4.0.0 [44/76]: Stacking v38: LSM: Removed scaffolding + function lsmcontext_init + - SAUCE: apparmor4.0.0 [45/76]: Stacking v38: AppArmor: Remove the exclusive + flag + - SAUCE: apparmor4.0.0 [46/76]: combine common_audit_data and + apparmor_audit_data + - SAUCE: apparmor4.0.0 [47/76]: setup slab cache for audit data + - SAUCE: apparmor4.0.0 [48/76]: rename audit_data->label to + audit_data->subj_label + - SAUCE: apparmor4.0.0 [49/76]: pass cred through to audit info. + - SAUCE: apparmor4.0.0 [50/76]: Improve debug print infrastructure + - SAUCE: apparmor4.0.0 [51/76]: add the ability for profiles to have a + learning cache + - SAUCE: apparmor4.0.0 [52/76]: enable userspace upcall for mediation + - SAUCE: apparmor4.0.0 [53/76]: cache buffers on percpu list if there is lock + contention + - SAUCE: apparmor4.0.0 [54/76]: advertise availability of exended perms + - SAUCE: apparmor4.0.0 [56/76]: cleanup: provide separate audit messages for + file and policy checks + - SAUCE: apparmor4.0.0 [57/76]: prompt - lock down prompt interface + - SAUCE: apparmor4.0.0 [58/76]: prompt - ref count pdb + - SAUCE: apparmor4.0.0 [59/76]: prompt - allow controlling of caching of a + prompt response + - SAUCE: apparmor4.0.0 [60/76]: prompt - add refcount to audit_node in prep or + reuse and delete + - SAUCE: apparmor4.0.0 [61/76]: prompt - refactor to moving caching to + uresponse + - SAUCE: apparmor4.0.0 [62/76]: prompt - Improve debug statements + - SAUCE: apparmor4.0.0 [63/76]: prompt - fix caching + - SAUCE: apparmor4.0.0 [64/76]: prompt - rework build to use append fn, to + simplify adding strings + - SAUCE: apparmor4.0.0 [65/76]: prompt - refcount notifications + - SAUCE: apparmor4.0.0 [66/76]: prompt - add the ability to reply with a + profile name + - SAUCE: apparmor4.0.0 [67/76]: prompt - fix notification cache when updating + - SAUCE: apparmor4.0.0 [68/76]: prompt - add tailglob on name for cache + support + - SAUCE: apparmor4.0.0 [69/76]: prompt - allow profiles to set prompts as + interruptible + - SAUCE: apparmor4.0.0 [74/76]: advertise disconnected.path is available + - SAUCE: apparmor4.0.0 [75/76]: fix invalid reference on profile->disconnected + - SAUCE: apparmor4.0.0 [76/76]: add io_uring mediation + - SAUCE: apparmor4.0.0: apparmor: Fix regression in mount mediation + * update apparmor and LSM stacking patch set (LP: #2028253) // [FFe] + apparmor-4.0.0-alpha2 for unprivileged user namespace restrictions in mantic + (LP: #2032602) + - SAUCE: apparmor4.0.0 [70/76]: prompt - add support for advanced filtering of + notifications + - SAUCE: apparmor4.0.0 [71/76]: userns - add the ability to reference a global + variable for a feature value + - SAUCE: apparmor4.0.0 [72/76]: userns - make it so special unconfined + profiles can mediate user namespaces + - SAUCE: apparmor4.0.0 [73/76]: userns - allow restricting unprivileged + change_profile + * LSM stacking and AppArmor for 6.2: additional fixes (LP: #2017903) // update + apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor4.0.0 [55/76]: fix profile verification and enable it + * udev fails to make prctl() syscall with apparmor=0 (as used by maas by + default) (LP: #2016908) // update apparmor and LSM stacking patch set + (LP: #2028253) + - SAUCE: apparmor4.0.0 [27/76]: Stacking v38: Fix prctl() syscall with + apparmor=0 + * Miscellaneous Ubuntu changes + - SAUCE: fan: relax strict length validation in vxlan policy + - [Config] update gcc version in annotations + - [Config] update annotations after apply 6.5 stable updates + * Miscellaneous upstream changes + - fs/address_space: add alignment padding for i_map and i_mmap_rwsem to + mitigate a false sharing. + - mm/mmap: move vma operations to mm_struct out of the critical section of + file mapping lock + + -- Andrea Righi Fri, 29 Sep 2023 14:57:21 +0200 + +linux-azure (6.5.0-1005.5) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1005.5 -proposed tracker (LP: #2035597) + + * Miscellaneous Ubuntu changes + - [Config] updateconfigs after Ubuntu-6.5.0-6.6 rebase + - [packaging] update rust, clang and bindgen build-deps + + -- Paolo Pisati Mon, 25 Sep 2023 15:10:17 +0200 + +linux-azure (6.5.0-1004.4) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1004.4 -proposed tracker (LP: #2034548) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/d2023.08.23) + + * Azure: net: mana: Add page pool for RX buffers (LP: #2034277) + - net: mana: Add page pool for RX buffers + + [ Ubuntu: 6.5.0-5.5 ] + + * mantic/linux: 6.5.0-5.5 -proposed tracker (LP: #2034546) + * Packaging resync (LP: #1786013) + - [Packaging] update helper scripts + - debian/dkms-versions -- update from kernel-versions (main/d2023.08.23) + + -- Andrea Righi Wed, 06 Sep 2023 16:34:24 +0200 + +linux-azure (6.5.0-1003.3) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1003.3 -proposed tracker (LP: #2034044) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/d2023.08.23) + + -- Andrea Righi Mon, 04 Sep 2023 17:27:42 +0200 + +linux-azure (6.5.0-1002.2) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1002.2 -proposed tracker (LP: #2033022) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/d2023.08.23) + + * Miscellaneous Ubuntu changes + - [Packaging] move to mantic/linux + - [Config] updateconfigs after rebase on Ubuntu-6.5.0-2.2 + + -- Paolo Pisati Wed, 30 Aug 2023 10:05:40 +0200 + +linux-azure (6.5.0-1001.1) mantic; urgency=medium + + * mantic/linux-azure: 6.5.0-1001.1 -proposed tracker (LP: #2029222) + + * Ship kernel modules Zstd compressed (LP: #2028568) + - [Packaging] azure: ZSTD compress module + + * Azure: Build-in TDX guest driver (LP: #2016995) + - [Config] Azure: Build in TDX guest driver + + * Miscellaneous Ubuntu changes + - [Packaging] azure: add libstdc++-dev to the build dependencies + - [Packaging] azure: add python3-dev to build-depends + - [Config] update annotations after rebase to v6.5 + + [ Ubuntu: 6.5.0-4.4 ] + + * mantic/linux-unstable: 6.5.0-4.4 -proposed tracker (LP: #2029086) + * Miscellaneous Ubuntu changes + - [Packaging] Add .NOTPARALLEL + - [Packaging] Remove meaningless $(header_arch) + - [Packaging] Fix File exists error in install-arch-headers + - [Packaging] clean debian/linux-* directories + - [Packaging] remove hmake + - [Packaging] install headers to debian/linux-libc-dev directly + - [Config] define CONFIG options for arm64 instead of arm64-generic + - [Config] update annotations after rebase to v6.5-rc4 + - [Packaging] temporarily disable Rust support + * Rebase to v6.5-rc4 + + [ Ubuntu: 6.5.0-3.3 ] + + * mantic/linux-unstable: 6.5.0-3.3 -proposed tracker (LP: #2028779) + * enable Rust support in the kernel (LP: #2007654) + - SAUCE: rust: support rustc-1.69.0 + - [Packaging] depend on rustc-1.69.0 + * Packaging resync (LP: #1786013) + - [Packaging] resync update-dkms-versions helper + - [Packaging] resync getabis + * Fix UBSAN in Intel EDAC driver (LP: #2028746) + - EDAC/i10nm: Skip the absent memory controllers + * Ship kernel modules Zstd compressed (LP: #2028568) + - SAUCE: Support but do not require compressed modules + - [Config] Enable support for ZSTD compressed modules + - [Packaging] ZSTD compress modules + * update apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [02/60]: rename SK_CTX() to aa_sock and make it an + inline fn + - SAUCE: apparmor3.2.0 [05/60]: Add sysctls for additional controls of unpriv + userns restrictions + - SAUCE: apparmor3.2.0 [08/60]: Stacking v38: LSM: Identify modules by more + than name + - SAUCE: apparmor3.2.0 [09/60]: Stacking v38: LSM: Add an LSM identifier for + external use + - SAUCE: apparmor3.2.0 [10/60]: Stacking v38: LSM: Identify the process + attributes for each module + - SAUCE: apparmor3.2.0 [11/60]: Stacking v38: LSM: Maintain a table of LSM + attribute data + - SAUCE: apparmor3.2.0 [12/60]: Stacking v38: proc: Use lsmids instead of lsm + names for attrs + - SAUCE: apparmor3.2.0 [13/60]: Stacking v38: integrity: disassociate + ima_filter_rule from security_audit_rule + - SAUCE: apparmor3.2.0 [14/60]: Stacking v38: LSM: Infrastructure management + of the sock security + - SAUCE: apparmor3.2.0 [15/60]: Stacking v38: LSM: Add the lsmblob data + structure. + - SAUCE: apparmor3.2.0 [16/60]: Stacking v38: LSM: provide lsm name and id + slot mappings + - SAUCE: apparmor3.2.0 [17/60]: Stacking v38: IMA: avoid label collisions with + stacked LSMs + - SAUCE: apparmor3.2.0 [18/60]: Stacking v38: LSM: Use lsmblob in + security_audit_rule_match + - SAUCE: apparmor3.2.0 [19/60]: Stacking v38: LSM: Use lsmblob in + security_kernel_act_as + - SAUCE: apparmor3.2.0 [20/60]: Stacking v38: LSM: Use lsmblob in + security_secctx_to_secid + - SAUCE: apparmor3.2.0 [21/60]: Stacking v38: LSM: Use lsmblob in + security_secid_to_secctx + - SAUCE: apparmor3.2.0 [22/60]: Stacking v38: LSM: Use lsmblob in + security_ipc_getsecid + - SAUCE: apparmor3.2.0 [23/60]: Stacking v38: LSM: Use lsmblob in + security_current_getsecid + - SAUCE: apparmor3.2.0 [24/60]: Stacking v38: LSM: Use lsmblob in + security_inode_getsecid + - SAUCE: apparmor3.2.0 [25/60]: Stacking v38: LSM: Use lsmblob in + security_cred_getsecid + - SAUCE: apparmor3.2.0 [26/60]: Stacking v38: LSM: Specify which LSM to + display + - SAUCE: apparmor3.2.0 [28/60]: Stacking v38: LSM: Ensure the correct LSM + context releaser + - SAUCE: apparmor3.2.0 [29/60]: Stacking v38: LSM: Use lsmcontext in + security_secid_to_secctx + - SAUCE: apparmor3.2.0 [30/60]: Stacking v38: LSM: Use lsmcontext in + security_inode_getsecctx + - SAUCE: apparmor3.2.0 [31/60]: Stacking v38: Use lsmcontext in + security_dentry_init_security + - SAUCE: apparmor3.2.0 [32/60]: Stacking v38: LSM: security_secid_to_secctx in + netlink netfilter + - SAUCE: apparmor3.2.0 [33/60]: Stacking v38: NET: Store LSM netlabel data in + a lsmblob + - SAUCE: apparmor3.2.0 [34/60]: Stacking v38: binder: Pass LSM identifier for + confirmation + - SAUCE: apparmor3.2.0 [35/60]: Stacking v38: LSM: security_secid_to_secctx + module selection + - SAUCE: apparmor3.2.0 [36/60]: Stacking v38: Audit: Keep multiple LSM data in + audit_names + - SAUCE: apparmor3.2.0 [37/60]: Stacking v38: Audit: Create audit_stamp + structure + - SAUCE: apparmor3.2.0 [38/60]: Stacking v38: LSM: Add a function to report + multiple LSMs + - SAUCE: apparmor3.2.0 [39/60]: Stacking v38: Audit: Allow multiple records in + an audit_buffer + - SAUCE: apparmor3.2.0 [40/60]: Stacking v38: Audit: Add record for multiple + task security contexts + - SAUCE: apparmor3.2.0 [41/60]: Stacking v38: audit: multiple subject lsm + values for netlabel + - SAUCE: apparmor3.2.0 [42/60]: Stacking v38: Audit: Add record for multiple + object contexts + - SAUCE: apparmor3.2.0 [43/60]: Stacking v38: netlabel: Use a struct lsmblob + in audit data + - SAUCE: apparmor3.2.0 [44/60]: Stacking v38: LSM: Removed scaffolding + function lsmcontext_init + - SAUCE: apparmor3.2.0 [45/60]: Stacking v38: AppArmor: Remove the exclusive + flag + - SAUCE: apparmor3.2.0 [46/60]: combine common_audit_data and + apparmor_audit_data + - SAUCE: apparmor3.2.0 [47/60]: setup slab cache for audit data + - SAUCE: apparmor3.2.0 [48/60]: rename audit_data->label to + audit_data->subj_label + - SAUCE: apparmor3.2.0 [49/60]: pass cred through to audit info. + - SAUCE: apparmor3.2.0 [50/60]: Improve debug print infrastructure + - SAUCE: apparmor3.2.0 [51/60]: add the ability for profiles to have a + learning cache + - SAUCE: apparmor3.2.0 [52/60]: enable userspace upcall for mediation + - SAUCE: apparmor3.2.0 [53/60]: cache buffers on percpu list if there is lock + contention + - SAUCE: apparmor3.2.0 [55/60]: advertise availability of exended perms + - SAUCE: apparmor3.2.0 [60/60]: [Config] enable + CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS + * LSM stacking and AppArmor for 6.2: additional fixes (LP: #2017903) // update + apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [57/60]: fix profile verification and enable it + * udev fails to make prctl() syscall with apparmor=0 (as used by maas by + default) (LP: #2016908) // update apparmor and LSM stacking patch set + (LP: #2028253) + - SAUCE: apparmor3.2.0 [27/60]: Stacking v38: Fix prctl() syscall with + apparmor=0 + * kinetic: apply new apparmor and LSM stacking patch set (LP: #1989983) // + update apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [01/60]: add/use fns to print hash string hex value + - SAUCE: apparmor3.2.0 [03/60]: patch to provide compatibility with v2.x net + rules + - SAUCE: apparmor3.2.0 [04/60]: add user namespace creation mediation + - SAUCE: apparmor3.2.0 [06/60]: af_unix mediation + - SAUCE: apparmor3.2.0 [07/60]: Add fine grained mediation of posix mqueues + * Miscellaneous Ubuntu changes + - [Packaging] Use consistent llvm/clang for rust + * Rebase to v6.5-rc3 + + [ Ubuntu: 6.5.0-2.2 ] + + * mantic/linux-unstable: 6.5.0-2.2 -proposed tracker (LP: #2027953) + * Remove non-LPAE kernel flavor (LP: #2025265) + - [Packaging] Rename armhf generic-lpae flavor to generic + * Please enable Renesas RZ platform serial installer (LP: #2022361) + - [Config] enable hihope RZ/G2M serial console + * Miscellaneous Ubuntu changes + - [Packaging] snap: Remove old configs handling + - [Packaging] checks/final-checks: Remove old configs handling + - [Packaging] checks/final-checks: check existance of Makefile first + - [Packaging] checks/final-checks: Fix shellcheck issues + - [Packaging] add libstdc++-dev to the build dependencies + - [Config] update annotations after rebase to v6.5-rc2 + * Miscellaneous upstream changes + - kbuild: rust: avoid creating temporary files + - rust: fix bindgen build error with UBSAN_BOUNDS_STRICT + * Rebase to v6.5-rc2 + + [ Ubuntu: 6.5.0-1.1 ] + + * mantic/linux-unstable: 6.5.0-1.1 -proposed tracker (LP: #2026689) + * CVE-2023-31248 + - netfilter: nf_tables: do not ignore genmask when looking up chain by id + * CVE-2023-35001 + - netfilter: nf_tables: prevent OOB access in nft_byteorder_eval + * HDMI output with More than one child device for port B in VBT error + (LP: #2025195) + - SAUCE: drm/i915/quirks: Add multiple VBT quirk for HP ZBook Power G10 + * CVE-2023-2640 // CVE-2023-32629 + - SAUCE: overlayfs: default to userxattr when mounted from non initial user + namespace + * Packaging resync (LP: #1786013) + - [Packaging] resync update-dkms-versions helper + * enable Rust support in the kernel (LP: #2007654) + - SAUCE: btf, scripts: rust: drop is_rust_module.sh + - [Packaging] add rust dependencies + * CVE-2023-2612 + - SAUCE: shiftfs: prevent lock unbalance in shiftfs_create_object() + * Miscellaneous Ubuntu changes + - SAUCE: shiftfs: support linux 6.5 + - [Config] update annotations after rebase to v6.5-rc1 + - [Config] temporarily disable Rust + * Rebase to v6.5-rc1 + + [ Ubuntu: 6.5.0-0.0 ] + + * Empty entry + + [ Ubuntu: 6.4.0-8.8 ] + + * mantic/linux-unstable: 6.4.0-8.8 -proposed tracker (LP: #2025018) + * Miscellaneous Ubuntu changes + - [Config] update toolchain version (gcc) in annotations + * Rebase to v6.4 + + [ Ubuntu: 6.4.0-7.7 ] + + * mantic/linux-unstable: 6.4.0-7.7 -proposed tracker (LP: #2024338) + * Rebase to v6.4-rc7 + + [ Ubuntu: 6.4.0-6.6 ] + + * mantic/linux-unstable: 6.4.0-6.6 -proposed tracker (LP: #2023966) + * Packaging resync (LP: #1786013) + - [Packaging] update annotations scripts + * enable multi-gen LRU by default (LP: #2023629) + - [Config] enable multi-gen LRU by default + * Fix Monitor lost after replug WD19TBS to SUT port with VGA/DVI to type-C + dongle (LP: #2021949) + - thunderbolt: Do not touch CL state configuration during discovery + - thunderbolt: Increase DisplayPort Connection Manager handshake timeout + * Neuter signing tarballs (LP: #2012776) + - [Packaging] remove the signing tarball support + * Enable Tracing Configs for OSNOISE and TIMERLAT (LP: #2018591) + - [Config] Enable OSNOISE_TRACER and TIMERLAT_TRACER configs + * Miscellaneous Ubuntu changes + - [Config] Add CONFIG_AS_HAS_NON_CONST_LEB128 on riscv64 + - [Packaging] introduce do_lib_rust and enable it only on generic amd64 + - [Config] update annotations after rebase to v6.4-rc6 + * Rebase to v6.4-rc6 + + [ Ubuntu: 6.4.0-5.5 ] + + * mantic/linux-unstable: 6.4.0-5.5 -proposed tracker (LP: #2022886) + * Miscellaneous Ubuntu changes + - [Packaging] update getabis to support linux-unstable + - UBUNTU [Config]: disable hibernation on riscv64 + * Rebase to v6.4-rc5 + + [ Ubuntu: 6.4.0-4.4 ] + + * mantic/linux-unstable: 6.4.0-4.4 -proposed tracker (LP: #2021597) + * Miscellaneous Ubuntu changes + - [Config] udpate annotations after rebase to v6.4-rc4 + + [ Ubuntu: 6.4.0-3.3 ] + + * mantic/linux-unstable: 6.4.0-3.3 -proposed tracker (LP: #2021497) + * Packaging resync (LP: #1786013) + - [Packaging] resync git-ubuntu-log + - [Packaging] resync getabis + * support python < 3.9 with annotations (LP: #2020531) + - [Packaging] kconfig/annotations.py: support older way of merging dicts + * generate linux-lib-rust only on amd64 (LP: #2020356) + - [Packaging] generate linux-lib-rust only on amd64 + * Miscellaneous Ubuntu changes + - [Packaging] annotations: never drop configs that have notes different than + the parent + - [Config] drop CONFIG_SMBFS_COMMON from annotations + - [Packaging] perf: build without libtraceevent + * Rebase to v6.4-rc4 + + [ Ubuntu: 6.4.0-2.2 ] + + * mantic/linux-unstable: 6.4.0-2.2 -proposed tracker (LP: #2020330) + * Computer with Intel Atom CPU will not boot with Kernel 6.2.0-20 + (LP: #2017444) + - [Config]: Disable CONFIG_INTEL_ATOMISP + * Fix NVME storage with RAID ON disappeared under Dell factory WINPE + environment (LP: #2011768) + - SAUCE: PCI: vmd: Reset VMD config register between soft reboots + * Miscellaneous Ubuntu changes + - [Packaging] Drop support of old config handling + - [Config] update annotations after rebase to v6.4-rc3 + * Rebase to v6.4-rc3 + + [ Ubuntu: 6.4.0-1.1 ] + + * mantic/linux-unstable: 6.4.0-1.1 -proposed tracker (LP: #2019965) + * Packaging resync (LP: #1786013) + - [Packaging] update variants + - [Packaging] update helper scripts + * Kernel 6.1 bumped the disk consumption on default images by 15% + (LP: #2015867) + - [Packaging] introduce a separate linux-lib-rust package + * Miscellaneous Ubuntu changes + - [Config] enable CONFIG_BLK_DEV_UBLK on amd64 + - [Packaging] annotations: use python3 in the shebang + - SAUCE: blk-throttle: Fix io statistics for cgroup v1 + - [Packaging] move to v6.4 and rename to linux-unstable + - [Config] update annotations after rebase to v6.4-rc1 + - [Packaging] temporarily disable perf + - [Packaging] temporarily disable bpftool + - [Config] ppc64el: reduce CONFIG_ARCH_FORCE_MAX_ORDER from 9 to 8 + - SAUCE: perf: explicitly disable libtraceevent + * Rebase to v6.4-rc2 + + [ Ubuntu: 6.4.0-0.0 ] + + * Empty entry + + [ Ubuntu: 6.3.0-2.2 ] + + * lunar/linux-unstable: 6.3.0-2.2 -proposed tracker (LP: #2017788) + * Miscellaneous Ubuntu changes + - [Packaging] move python3-dev to build-depends + + [ Ubuntu: 6.3.0-1.1 ] + + * lunar/linux-unstable: 6.3.0-1.1 -proposed tracker (LP: #2017776) + * RFC: virtio and virtio-scsi should be built in (LP: #1685291) + - [Config] Mark CONFIG_SCSI_VIRTIO built-in + * Debian autoreconstruct Fix restoration of execute permissions (LP: #2015498) + - [Debian] autoreconstruct - fix restoration of execute permissions + * [SRU][Jammy] CONFIG_PCI_MESON is not enabled (LP: #2007745) + - [Config] arm64: Enable PCI_MESON module + * vmd may fail to create sysfs entry while `pci_rescan_bus()` called in some + other drivers like wwan (LP: #2011389) + - SAUCE: PCI: vmd: guard device addition and removal + * Lunar update: v6.2.9 upstream stable release (LP: #2016877) + - [Config] ppc64: updateconfigs following v6.2.9 stable updates + * Lunar update: v6.2.8 upstream stable release (LP: #2016876) + - [Config] ppc64: updateconfigs following v6.2.8 stable updates + * Miscellaneous Ubuntu changes + - [Packaging] Move final-checks script to debian/scripts/checks + - [Packaging] checks/final-checks: Honor 'do_skip_checks' + - [Packaging] Drop wireguard DKMS + - [Packaging] Remove update-version-dkms + - [Packaging] debian/rules: Add DKMS info to 'printenv' output + - [Packaging] ignore KBUILD_VERBOSE in arch-has-odm-enabled.sh + - SAUCE: shiftfs: support linux 6.3 + - [Packaging] move to v6.3 and rename to linux-unstable + - [Config] latency-related optimizations + - [Config] update annotations after rebase to v6.3 + - [Packaging] temporarily disable dkms + * Rebase to v6.3 + + [ Ubuntu: 6.3.0-0.0 ] + + * Empty entry + + -- Andrea Righi Wed, 02 Aug 2023 17:34:28 +0200 + +linux-azure (6.5.0-1000.0) mantic; urgency=medium + + * Empty entry + + -- Andrea Righi Wed, 02 Aug 2023 17:28:39 +0200 + +linux-azure (6.2.0-1004.4) lunar; urgency=medium + + * lunar/linux-azure: 6.2.0-1004.4 -proposed tracker (LP: #2016265) + + * Kernel 6.1 bumped the disk consumption on default images by 15% + (LP: #2015867) + - [Config] azure: disable Rust support + + [ Ubuntu: 6.2.0-21.21 ] + + * lunar/linux: 6.2.0-21.21 -proposed tracker (LP: #2016249) + * efivarfs:efivarfs.sh in ubuntu_kernel_selftests crash L-6.2 ARM64 node + dazzle (rcu_preempt detected stalls) (LP: #2015741) + - efi/libstub: smbios: Use length member instead of record struct size + - arm64: efi: Use SMBIOS processor version to key off Ampere quirk + - efi/libstub: smbios: Drop unused 'recsize' parameter + * Miscellaneous Ubuntu changes + - SAUCE: selftests/bpf: ignore pointer types check with clang + - SAUCE: selftests/bpf: avoid conflicting data types in profiler.inc.h + - [Packaging] get rid of unnecessary artifacts in linux-headers + * Miscellaneous upstream changes + - Revert "UBUNTU: SAUCE: Revert "efi: random: refresh non-volatile random seed + when RNG is initialized"" + - Revert "UBUNTU: SAUCE: Revert "efi: random: fix NULL-deref when refreshing + seed"" + + -- Andrea Righi Fri, 14 Apr 2023 16:57:47 +0200 + +linux-azure (6.2.0-1003.3) lunar; urgency=medium + + * lunar/linux-azure: 6.2.0-1003.3 -proposed tracker (LP: #2015432) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + + * Azure: Add PCI pass-thru support to Hyper-V Confidential VMs (LP: #2015369) + - x86/ioremap: Add hypervisor callback for private MMIO mapping in coco VM + + * Azure: Add new MANA VF performance counters for easier troubleshooting + (LP: #2014015) + - net: mana: Add new MANA VF performance counters for easier troubleshooting + + * Azure: smb3: allow deferred close timeout to be configurable (LP: #2013349) + - keys: Do not cache key in task struct if key is requested from kernel thread + + * Azure: not enough RAM under 4GB for CVM (LP: #1967166) + - SAUCE: azure: Swiotlb: Add swiotlb_alloc_from_low_pages switch + - SAUCE: azure: x86/hyperv: Make swiotlb bounce buffer allocation not just + from low pages + + * Miscellaneous Ubuntu changes + - [Config] azure: update annotations after rebase to the latest 6.2 + + [ Ubuntu: 6.2.0-20.20 ] + + * lunar/linux: 6.2.0-20.20 -proposed tracker (LP: #2015429) + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + * FTBFS with different dkms or when makeflags are set (LP: #2015361) + - [Packaging] FTBFS with different dkms or when makeflags are set + * expoline.o is packaged unconditionally for s390x (LP: #2013209) + - [Packaging] Copy expoline.o only when produced by the build + * net:l2tp.sh failure with lunar:linux 6.2 (LP: #2013014) + - SAUCE: l2tp: generate correct module alias strings + * Miscellaneous Ubuntu changes + - [Packaging] annotations: prevent duplicate include lines + + [ Ubuntu: 6.2.0-19.19 ] + + * lunar/linux: 6.2.0-19.19 -proposed tracker (LP: #2012488) + * Neuter signing tarballs (LP: #2012776) + - [Packaging] neuter the signing tarball + * LSM stacking and AppArmor refresh for 6.2 kernel (LP: #2012136) + - Revert "UBUNTU: [Config] define CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS" + - Revert "UBUNTU: SAUCE: apparmor: add user namespace creation mediation" + - Revert "UBUNTU: SAUCE: apparmor: Add fine grained mediation of posix + mqueues" + - Revert "UBUNTU: SAUCE: Revert "apparmor: make __aa_path_perm() static"" + - Revert "UBUNTU: SAUCE: LSM: Specify which LSM to display (using struct cred + as input)" + - Revert "UBUNTU: SAUCE: apparmor: Fix build error, make sk parameter const" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in smk_netlbl_mls()" + - Revert "UBUNTU: SAUCE: LSM: change ima_read_file() to use lsmblob" + - Revert "UBUNTU: SAUCE: apparmor: rename kzfree() to kfree_sensitive()" + - Revert "UBUNTU: SAUCE: AppArmor: Remove the exclusive flag" + - Revert "UBUNTU: SAUCE: LSM: Add /proc attr entry for full LSM context" + - Revert "UBUNTU: SAUCE: Audit: Fix incorrect static inline function + declration." + - Revert "UBUNTU: SAUCE: Audit: Fix for missing NULL check" + - Revert "UBUNTU: SAUCE: Audit: Add a new record for multiple object LSM + attributes" + - Revert "UBUNTU: SAUCE: Audit: Add new record for multiple process LSM + attributes" + - Revert "UBUNTU: SAUCE: NET: Store LSM netlabel data in a lsmblob" + - Revert "UBUNTU: SAUCE: LSM: security_secid_to_secctx in netlink netfilter" + - Revert "UBUNTU: SAUCE: LSM: Use lsmcontext in security_inode_getsecctx" + - Revert "UBUNTU: SAUCE: LSM: Use lsmcontext in security_secid_to_secctx" + - Revert "UBUNTU: SAUCE: LSM: Ensure the correct LSM context releaser" + - Revert "UBUNTU: SAUCE: LSM: Specify which LSM to display" + - Revert "UBUNTU: SAUCE: IMA: Change internal interfaces to use lsmblobs" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_cred_getsecid" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_inode_getsecid" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_task_getsecid" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_ipc_getsecid" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_secid_to_secctx" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_secctx_to_secid" + - Revert "UBUNTU: SAUCE: net: Prepare UDS for security module stacking" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_kernel_act_as" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_audit_rule_match" + - Revert "UBUNTU: SAUCE: LSM: Create and manage the lsmblob data structure." + - Revert "UBUNTU: SAUCE: LSM: Infrastructure management of the sock security" + - Revert "UBUNTU: SAUCE: apparmor: LSM stacking: switch from SK_CTX() to + aa_sock()" + - Revert "UBUNTU: SAUCE: apparmor: rename aa_sock() to aa_unix_sk()" + - Revert "UBUNTU: SAUCE: apparmor: disable showing the mode as part of a secid + to secctx" + - Revert "UBUNTU: SAUCE: apparmor: fix use after free in sk_peer_label" + - Revert "UBUNTU: SAUCE: apparmor: af_unix mediation" + - Revert "UBUNTU: SAUCE: apparmor: patch to provide compatibility with v2.x + net rules" + - Revert "UBUNTU: SAUCE: apparmor: add/use fns to print hash string hex value" + - SAUCE: apparmor: rename SK_CTX() to aa_sock and make it an inline fn + - SAUCE: apparmor: Add sysctls for additional controls of unpriv userns + restrictions + - SAUCE: Stacking v38: LSM: Identify modules by more than name + - SAUCE: Stacking v38: LSM: Add an LSM identifier for external use + - SAUCE: Stacking v38: LSM: Identify the process attributes for each module + - SAUCE: Stacking v38: LSM: Maintain a table of LSM attribute data + - SAUCE: Stacking v38: proc: Use lsmids instead of lsm names for attrs + - SAUCE: Stacking v38: integrity: disassociate ima_filter_rule from + security_audit_rule + - SAUCE: Stacking v38: LSM: Infrastructure management of the sock security + - SAUCE: Stacking v38: LSM: Add the lsmblob data structure. + - SAUCE: Stacking v38: LSM: provide lsm name and id slot mappings + - SAUCE: Stacking v38: IMA: avoid label collisions with stacked LSMs + - SAUCE: Stacking v38: LSM: Use lsmblob in security_audit_rule_match + - SAUCE: Stacking v38: LSM: Use lsmblob in security_kernel_act_as + - SAUCE: Stacking v38: LSM: Use lsmblob in security_secctx_to_secid + - SAUCE: Stacking v38: LSM: Use lsmblob in security_secid_to_secctx + - SAUCE: Stacking v38: LSM: Use lsmblob in security_ipc_getsecid + - SAUCE: Stacking v38: LSM: Use lsmblob in security_current_getsecid + - SAUCE: Stacking v38: LSM: Use lsmblob in security_inode_getsecid + - SAUCE: Stacking v38: LSM: Use lsmblob in security_cred_getsecid + - SAUCE: Stacking v38: LSM: Specify which LSM to display + - SAUCE: Stacking v38: LSM: Ensure the correct LSM context releaser + - SAUCE: Stacking v38: LSM: Use lsmcontext in security_secid_to_secctx + - SAUCE: Stacking v38: LSM: Use lsmcontext in security_inode_getsecctx + - SAUCE: Stacking v38: Use lsmcontext in security_dentry_init_security + - SAUCE: Stacking v38: LSM: security_secid_to_secctx in netlink netfilter + - SAUCE: Stacking v38: NET: Store LSM netlabel data in a lsmblob + - SAUCE: Stacking v38: binder: Pass LSM identifier for confirmation + - SAUCE: Stacking v38: LSM: security_secid_to_secctx module selection + - SAUCE: Stacking v38: Audit: Keep multiple LSM data in audit_names + - SAUCE: Stacking v38: Audit: Create audit_stamp structure + - SAUCE: Stacking v38: LSM: Add a function to report multiple LSMs + - SAUCE: Stacking v38: Audit: Allow multiple records in an audit_buffer + - SAUCE: Stacking v38: Audit: Add record for multiple task security contexts + - SAUCE: Stacking v38: audit: multiple subject lsm values for netlabel + - SAUCE: Stacking v38: Audit: Add record for multiple object contexts + - SAUCE: Stacking v38: netlabel: Use a struct lsmblob in audit data + - SAUCE: Stacking v38: LSM: Removed scaffolding function lsmcontext_init + - SAUCE: Stacking v38: AppArmor: Remove the exclusive flag + - SAUCE: apparmor: combine common_audit_data and apparmor_audit_data + - SAUCE: apparmor: setup slab cache for audit data + - SAUCE: apparmor: rename audit_data->label to audit_data->subj_label + - SAUCE: apparmor: pass cred through to audit info. + - SAUCE: apparmor: Improve debug print infrastructure + - SAUCE: apparmor: add the ability for profiles to have a learning cache + - SAUCE: apparmor: enable userspace upcall for mediation + - SAUCE: apparmor: cache buffers on percpu list if there is lock contention + - SAUCE: apparmor: fix policy_compat permission remap with extended + permissions + - SAUCE: apparmor: advertise availability of exended perms + - [Config] define CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS + * kinetic: apply new apparmor and LSM stacking patch set (LP: #1989983) // LSM + stacking and AppArmor refresh for 6.2 kernel (LP: #2012136) + - SAUCE: apparmor: add/use fns to print hash string hex value + - SAUCE: apparmor: patch to provide compatibility with v2.x net rules + - SAUCE: apparmor: add user namespace creation mediation + - SAUCE: apparmor: af_unix mediation + - SAUCE: apparmor: Add fine grained mediation of posix mqueues + * devlink_port_split from ubuntu_kernel_selftests.net fails on hirsute + (KeyError: 'flavour') (LP: #1937133) + - selftests: net: devlink_port_split.py: skip test if no suitable device + available + * NFS deathlock with last Kernel 5.4.0-144.161 and 5.15.0-67.74 (LP: #2009325) + - NFS: Correct timing for assigning access cache timestamp + + [ Ubuntu: 6.2.0-18.18 ] + + * lunar/linux: 6.2.0-18.18 -proposed tracker (LP: #2011750) + * lunar/linux 6.2 fails to boot on arm64 (LP: #2011748) + - SAUCE: Revert "efi: random: fix NULL-deref when refreshing seed" + - SAUCE: Revert "efi: random: refresh non-volatile random seed when RNG is + initialized" + + [ Ubuntu: 6.2.0-17.17 ] + + * lunar/linux: 6.2.0-17.17 -proposed tracker (LP: #2011593) + * lunar/linux 6.2 fails to boot on ppc64el (LP: #2011413) + - SAUCE: Revert "powerpc: remove STACK_FRAME_OVERHEAD" + - SAUCE: Revert "powerpc/pseries: hvcall stack frame overhead" + * Speaker / Audio/Mic mute LED don't work on a HP platform (LP: #2011379) + - SAUCE: ALSA: hda/realtek: fix speaker, mute/micmute LEDs not work on a HP + platform + * Some QHD panels fail to refresh when PSR2 enabled (LP: #2009014) + - SAUCE: drm/i915/psr: Use calculated io and fast wake lines + * Lunar update: v6.2.6 upstream stable release (LP: #2011431) + - tpm: disable hwrng for fTPM on some AMD designs + - wifi: cfg80211: Partial revert "wifi: cfg80211: Fix use after free for wext" + - staging: rtl8192e: Remove function ..dm_check_ac_dc_power calling a script + - staging: rtl8192e: Remove call_usermodehelper starting RadioPower.sh + - Linux 6.2.6 + * Lunar update: v6.2.5 upstream stable release (LP: #2011430) + - net/sched: Retire tcindex classifier + - auxdisplay: hd44780: Fix potential memory leak in hd44780_remove() + - fs/jfs: fix shift exponent db_agl2size negative + - driver: soc: xilinx: fix memory leak in xlnx_add_cb_for_notify_event() + - f2fs: don't rely on F2FS_MAP_* in f2fs_iomap_begin + - f2fs: fix to avoid potential deadlock + - objtool: Fix memory leak in create_static_call_sections() + - soc: mediatek: mtk-pm-domains: Allow mt8186 ADSP default power on + - soc: qcom: socinfo: Fix soc_id order + - memory: renesas-rpc-if: Split-off private data from struct rpcif + - memory: renesas-rpc-if: Move resource acquisition to .probe() + - soc: mediatek: mtk-svs: Enable the IRQ later + - pwm: sifive: Always let the first pwm_apply_state succeed + - pwm: stm32-lp: fix the check on arr and cmp registers update + - f2fs: introduce trace_f2fs_replace_atomic_write_block + - f2fs: clear atomic_write_task in f2fs_abort_atomic_write() + - soc: mediatek: mtk-svs: restore default voltages when svs_init02() fail + - soc: mediatek: mtk-svs: reset svs when svs_resume() fail + - soc: mediatek: mtk-svs: Use pm_runtime_resume_and_get() in svs_init01() + - f2fs: fix to do sanity check on extent cache correctly + - fs: f2fs: initialize fsdata in pagecache_write() + - f2fs: allow set compression option of files without blocks + - f2fs: fix to abort atomic write only during do_exist() + - um: vector: Fix memory leak in vector_config + - ubi: ensure that VID header offset + VID header size <= alloc, size + - ubifs: Fix build errors as symbol undefined + - ubifs: Fix memory leak in ubifs_sysfs_init() + - ubifs: Rectify space budget for ubifs_symlink() if symlink is encrypted + - ubifs: Rectify space budget for ubifs_xrename() + - ubifs: Fix wrong dirty space budget for dirty inode + - ubifs: do_rename: Fix wrong space budget when target inode's nlink > 1 + - ubifs: Reserve one leb for each journal head while doing budget + - ubi: Fix use-after-free when volume resizing failed + - ubi: Fix unreferenced object reported by kmemleak in ubi_resize_volume() + - ubifs: Fix memory leak in alloc_wbufs() + - ubi: Fix possible null-ptr-deref in ubi_free_volume() + - ubifs: Re-statistic cleaned znode count if commit failed + - ubifs: dirty_cow_znode: Fix memleak in error handling path + - ubifs: ubifs_writepage: Mark page dirty after writing inode failed + - ubifs: ubifs_releasepage: Remove ubifs_assert(0) to valid this process + - ubi: fastmap: Fix missed fm_anchor PEB in wear-leveling after disabling + fastmap + - ubi: Fix UAF wear-leveling entry in eraseblk_count_seq_show() + - ubi: ubi_wl_put_peb: Fix infinite loop when wear-leveling work failed + - f2fs: fix to handle F2FS_IOC_START_ATOMIC_REPLACE in f2fs_compat_ioctl() + - f2fs: fix to avoid potential memory corruption in __update_iostat_latency() + - f2fs: fix to update age extent correctly during truncation + - f2fs: fix to update age extent in f2fs_do_zero_range() + - soc: qcom: stats: Populate all subsystem debugfs files + - f2fs: introduce IS_F2FS_IPU_* macro + - f2fs: fix to set ipu policy + - ext4: use ext4_fc_tl_mem in fast-commit replay path + - ext4: don't show commit interval if it is zero + - netfilter: nf_tables: allow to fetch set elements when table has an owner + - x86: um: vdso: Add '%rcx' and '%r11' to the syscall clobber list + - um: virtio_uml: free command if adding to virtqueue failed + - um: virtio_uml: mark device as unregistered when breaking it + - um: virtio_uml: move device breaking into workqueue + - um: virt-pci: properly remove PCI device from bus + - f2fs: synchronize atomic write aborts + - watchdog: rzg2l_wdt: Issue a reset before we put the PM clocks + - watchdog: rzg2l_wdt: Handle TYPE-B reset for RZ/V2M + - watchdog: at91sam9_wdt: use devm_request_irq to avoid missing free_irq() in + error path + - watchdog: Fix kmemleak in watchdog_cdev_register + - watchdog: pcwd_usb: Fix attempting to access uninitialized memory + - watchdog: sbsa_wdog: Make sure the timeout programming is within the limits + - netfilter: ctnetlink: fix possible refcount leak in + ctnetlink_create_conntrack() + - netfilter: conntrack: fix rmmod double-free race + - netfilter: ip6t_rpfilter: Fix regression with VRF interfaces + - netfilter: ebtables: fix table blob use-after-free + - netfilter: xt_length: use skb len to match in length_mt6 + - netfilter: ctnetlink: make event listener tracking global + - netfilter: x_tables: fix percpu counter block leak on error path when + creating new netns + - swiotlb: mark swiotlb_memblock_alloc() as __init + - ptp: vclock: use mutex to fix "sleep on atomic" bug + - drm/i915: move a Kconfig symbol to unbreak the menu presentation + - ipv6: Add lwtunnel encap size of all siblings in nexthop calculation + - drm/i915/xelpmp: Consider GSI offset when doing MCR lookups + - octeontx2-pf: Recalculate UDP checksum for ptp 1-step sync packet + - net: sunhme: Fix region request + - sctp: add a refcnt in sctp_stream_priorities to avoid a nested loop + - octeontx2-pf: Use correct struct reference in test condition + - net: fix __dev_kfree_skb_any() vs drop monitor + - 9p/xen: fix version parsing + - 9p/xen: fix connection sequence + - 9p/rdma: unmap receive dma buffer in rdma_request()/post_recv() + - spi: tegra210-quad: Fix validate combined sequence + - mlx5: fix skb leak while fifo resync and push + - mlx5: fix possible ptp queue fifo use-after-free + - net/mlx5: ECPF, wait for VF pages only after disabling host PFs + - net/mlx5e: Verify flow_source cap before using it + - net/mlx5: Geneve, Fix handling of Geneve object id as error code + - ext4: fix incorrect options show of original mount_opt and extend mount_opt2 + - nfc: fix memory leak of se_io context in nfc_genl_se_io + - net/sched: transition act_pedit to rcu and percpu stats + - net/sched: act_pedit: fix action bind logic + - net/sched: act_mpls: fix action bind logic + - net/sched: act_sample: fix action bind logic + - net: dsa: seville: ignore mscc-miim read errors from Lynx PCS + - net: dsa: felix: fix internal MDIO controller resource length + - ARM: dts: aspeed: p10bmc: Update battery node name + - ARM: dts: spear320-hmi: correct STMPE GPIO compatible + - tcp: tcp_check_req() can be called from process context + - vc_screen: modify vcs_size() handling in vcs_read() + - spi: tegra210-quad: Fix iterator outside loop + - rtc: sun6i: Always export the internal oscillator + - genirq/ipi: Fix NULL pointer deref in irq_data_get_affinity_mask() + - scsi: ipr: Work around fortify-string warning + - scsi: mpi3mr: Fix an issue found by KASAN + - scsi: mpi3mr: Use number of bits to manage bitmap sizes + - rtc: allow rtc_read_alarm without read_alarm callback + - io_uring: fix size calculation when registering buf ring + - loop: loop_set_status_from_info() check before assignment + - ASoC: adau7118: don't disable regulators on device unbind + - ASoC: apple: mca: Fix final status read on SERDES reset + - ASoC: apple: mca: Fix SERDES reset sequence + - ASoC: apple: mca: Improve handling of unavailable DMA channels + - nvme: bring back auto-removal of deleted namespaces during sequential scan + - nvme-tcp: don't access released socket during error recovery + - nvme-fabrics: show well known discovery name + - ASoC: zl38060 add gpiolib dependency + - ASoC: mediatek: mt8195: add missing initialization + - thermal: intel: quark_dts: fix error pointer dereference + - thermal: intel: BXT_PMIC: select REGMAP instead of depending on it + - cpufreq: apple-soc: Fix an IS_ERR() vs NULL check + - tracing: Add NULL checks for buffer in ring_buffer_free_read_page() + - kernel/printk/index.c: fix memory leak with using debugfs_lookup() + - firmware/efi sysfb_efi: Add quirk for Lenovo IdeaPad Duet 3 + - bootconfig: Increase max nodes of bootconfig from 1024 to 8192 for DCC + support + - mfd: arizona: Use pm_runtime_resume_and_get() to prevent refcnt leak + - IB/hfi1: Update RMT size calculation + - iommu: Remove deferred attach check from __iommu_detach_device() + - PCI/ACPI: Account for _S0W of the target bridge in acpi_pci_bridge_d3() + - media: uvcvideo: Remove format descriptions + - media: uvcvideo: Handle cameras with invalid descriptors + - media: uvcvideo: Handle errors from calls to usb_string + - media: uvcvideo: Quirk for autosuspend in Logitech B910 and C910 + - media: uvcvideo: Silence memcpy() run-time false positive warnings + - USB: fix memory leak with using debugfs_lookup() + - cacheinfo: Fix shared_cpu_map to handle shared caches at different levels + - usb: fotg210: List different variants + - dt-bindings: usb: Add device id for Genesys Logic hub controller + - staging: emxx_udc: Add checks for dma_alloc_coherent() + - tty: fix out-of-bounds access in tty_driver_lookup_tty() + - tty: serial: fsl_lpuart: disable the CTS when send break signal + - serial: sc16is7xx: setup GPIO controller later in probe + - mei: bus-fixup:upon error print return values of send and receive + - tools/iio/iio_utils:fix memory leak + - bus: mhi: ep: Fix the debug message for MHI_PKT_TYPE_RESET_CHAN_CMD cmd + - iio: accel: mma9551_core: Prevent uninitialized variable in + mma9551_read_status_word() + - iio: accel: mma9551_core: Prevent uninitialized variable in + mma9551_read_config_word() + - media: uvcvideo: Add GUID for BGRA/X 8:8:8:8 + - soundwire: bus_type: Avoid lockdep assert in sdw_drv_probe() + - PCI/portdrv: Prevent LS7A Bus Master clearing on shutdown + - PCI: loongson: Prevent LS7A MRRS increases + - staging: pi433: fix memory leak with using debugfs_lookup() + - USB: dwc3: fix memory leak with using debugfs_lookup() + - USB: chipidea: fix memory leak with using debugfs_lookup() + - USB: ULPI: fix memory leak with using debugfs_lookup() + - USB: uhci: fix memory leak with using debugfs_lookup() + - USB: sl811: fix memory leak with using debugfs_lookup() + - USB: fotg210: fix memory leak with using debugfs_lookup() + - USB: isp116x: fix memory leak with using debugfs_lookup() + - USB: isp1362: fix memory leak with using debugfs_lookup() + - USB: gadget: gr_udc: fix memory leak with using debugfs_lookup() + - USB: gadget: bcm63xx_udc: fix memory leak with using debugfs_lookup() + - USB: gadget: lpc32xx_udc: fix memory leak with using debugfs_lookup() + - USB: gadget: pxa25x_udc: fix memory leak with using debugfs_lookup() + - USB: gadget: pxa27x_udc: fix memory leak with using debugfs_lookup() + - usb: host: xhci: mvebu: Iterate over array indexes instead of using pointer + math + - USB: ene_usb6250: Allocate enough memory for full object + - usb: uvc: Enumerate valid values for color matching + - usb: gadget: uvc: Make bSourceID read/write + - PCI: Align extra resources for hotplug bridges properly + - PCI: Take other bus devices into account when distributing resources + - PCI: Distribute available resources for root buses, too + - tty: pcn_uart: fix memory leak with using debugfs_lookup() + - misc: vmw_balloon: fix memory leak with using debugfs_lookup() + - drivers: base: component: fix memory leak with using debugfs_lookup() + - drivers: base: dd: fix memory leak with using debugfs_lookup() + - kernel/fail_function: fix memory leak with using debugfs_lookup() + - PCI: loongson: Add more devices that need MRRS quirk + - PCI: Add ACS quirk for Wangxun NICs + - PCI: pciehp: Add Qualcomm quirk for Command Completed erratum + - phy: rockchip-typec: Fix unsigned comparison with less than zero + - RDMA/cma: Distinguish between sockaddr_in and sockaddr_in6 by size + - soundwire: cadence: Remove wasted space in response_buf + - soundwire: cadence: Drain the RX FIFO after an IO timeout + - eth: fealnx: bring back this old driver + - net: tls: avoid hanging tasks on the tx_lock + - x86/resctl: fix scheduler confusion with 'current' + - vDPA/ifcvf: decouple hw features manipulators from the adapter + - vDPA/ifcvf: decouple config space ops from the adapter + - vDPA/ifcvf: alloc the mgmt_dev before the adapter + - vDPA/ifcvf: decouple vq IRQ releasers from the adapter + - vDPA/ifcvf: decouple config IRQ releaser from the adapter + - vDPA/ifcvf: decouple vq irq requester from the adapter + - vDPA/ifcvf: decouple config/dev IRQ requester and vectors allocator from the + adapter + - vDPA/ifcvf: ifcvf_request_irq works on ifcvf_hw + - vDPA/ifcvf: manage ifcvf_hw in the mgmt_dev + - vDPA/ifcvf: allocate the adapter in dev_add() + - drm/display/dp_mst: Add drm_atomic_get_old_mst_topology_state() + - drm/display/dp_mst: Fix down/up message handling after sink disconnect + - drm/display/dp_mst: Fix down message handling after a packet reception error + - drm/display/dp_mst: Fix payload addition on a disconnected sink + - drm/i915/dp_mst: Add the MST topology state for modesetted CRTCs + - drm/display/dp_mst: Handle old/new payload states in drm_dp_remove_payload() + - drm/i915/dp_mst: Fix payload removal during output disabling + - drm/i915: Fix system suspend without fbdev being initialized + - media: uvcvideo: Fix race condition with usb_kill_urb + - arm64: efi: Make efi_rt_lock a raw_spinlock + - usb: gadget: uvc: fix missing mutex_unlock() if kstrtou8() fails + - Linux 6.2.5 + * Lunar update: v6.2.4 upstream stable release (LP: #2011428) + - Revert "blk-cgroup: synchronize pd_free_fn() from blkg_free_workfn() and + blkcg_deactivate_policy()" + - Revert "blk-cgroup: dropping parent refcount after pd_free_fn() is done" + - Linux 6.2.4 + * Lunar update: v6.2.3 upstream stable release (LP: #2011425) + - HID: asus: use spinlock to protect concurrent accesses + - HID: asus: use spinlock to safely schedule workers + - iommu/amd: Fix error handling for pdev_pri_ats_enable() + - iommu/amd: Skip attach device domain is same as new domain + - iommu/amd: Improve page fault error reporting + - iommu: Attach device group to old domain in error path + - powerpc/mm: Rearrange if-else block to avoid clang warning + - ata: ahci: Revert "ata: ahci: Add Tiger Lake UP{3,4} AHCI controller" + - ARM: OMAP2+: Fix memory leak in realtime_counter_init() + - arm64: dts: qcom: qcs404: use symbol names for PCIe resets + - arm64: dts: qcom: msm8996-tone: Fix USB taking 6 minutes to wake up + - arm64: dts: qcom: sm6115: Fix UFS node + - arm64: dts: qcom: sm6115: Provide xo clk to rpmcc + - arm64: dts: qcom: sm8150-kumano: Panel framebuffer is 2.5k instead of 4k + - arm64: dts: qcom: pmi8950: Correct rev_1250v channel label to mv + - arm64: dts: qcom: sm6350: Fix up the ramoops node + - arm64: dts: qcom: sdm670-google-sargo: keep pm660 ldo8 on + - arm64: dts: qcom: Re-enable resin on MSM8998 and SDM845 boards + - arm64: dts: qcom: sm8350-sagami: Configure SLG51000 PMIC on PDX215 + - arm64: dts: qcom: sm8350-sagami: Add GPIO line names for PMIC GPIOs + - arm64: dts: qcom: sm8350-sagami: Rectify GPIO keys + - arm64: dts: qcom: sm6350-lena: Flatten gpio-keys pinctrl state + - arm64: dts: qcom: sm6125: Reorder HSUSB PHY clocks to match bindings + - arm64: dts: qcom: sm6125-seine: Clean up gpio-keys (volume down) + - arm64: dts: imx8m: Align SoC unique ID node unit address + - ARM: zynq: Fix refcount leak in zynq_early_slcr_init + - fs: dlm: fix return value check in dlm_memory_init() + - arm64: dts: mediatek: mt8195: Add power domain to U3PHY1 T-PHY + - arm64: dts: mediatek: mt8183: Fix systimer 13 MHz clock description + - arm64: dts: mediatek: mt8192: Fix systimer 13 MHz clock description + - arm64: dts: mediatek: mt8195: Fix systimer 13 MHz clock description + - arm64: dts: mediatek: mt8186: Fix systimer 13 MHz clock description + - arm64: dts: qcom: sdm845-db845c: fix audio codec interrupt pin name + - arm64: dts: qcom: sdm845-xiaomi-beryllium: fix audio codec interrupt pin + name + - x86/acpi/boot: Do not register processors that cannot be onlined for x2APIC + - arm64: dts: qcom: sc7180: correct SPMI bus address cells + - arm64: dts: qcom: sc7280: correct SPMI bus address cells + - arm64: dts: qcom: sc8280xp: correct SPMI bus address cells + - arm64: dts: qcom: sm8450: correct Soundwire wakeup interrupt name + - arm64: dts: qcom: sdm845: make DP node follow the schema + - arm64: dts: qcom: msm8996-oneplus-common: drop vdda-supply from DSI PHY + - arm64: dts: qcom: sc8280xp: Vote for CX in USB controllers + - arm64: dts: meson-gxl: jethub-j80: Fix WiFi MAC address node + - arm64: dts: meson-gxl: jethub-j80: Fix Bluetooth MAC node name + - arm64: dts: meson-axg: jethub-j1xx: Fix MAC address node names + - arm64: dts: meson-gx: Fix Ethernet MAC address unit name + - arm64: dts: meson-g12a: Fix internal Ethernet PHY unit name + - arm64: dts: meson-gx: Fix the SCPI DVFS node name and unit address + - cpuidle, intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE *again* + - arm64: dts: ti: k3-am62-main: Fix clocks for McSPI + - arm64: tegra: Fix duplicate regulator on Jetson TX1 + - arm64: dts: qcom: msm8992-bullhead: Fix cont_splash_mem size + - arm64: dts: qcom: msm8992-bullhead: Disable dfps_data_mem + - arm64: dts: qcom: msm8956: use SoC-specific compat for tsens + - arm64: dts: qcom: ipq8074: correct USB3 QMP PHY-s clock output names + - arm64: dts: qcom: ipq8074: fix Gen2 PCIe QMP PHY + - arm64: dts: qcom: ipq8074: fix Gen3 PCIe QMP PHY + - arm64: dts: qcom: ipq8074: correct Gen2 PCIe ranges + - arm64: dts: qcom: ipq8074: fix Gen3 PCIe node + - arm64: dts: qcom: ipq8074: correct PCIe QMP PHY output clock names + - arm64: dts: meson: remove CPU opps below 1GHz for G12A boards + - ARM: OMAP1: call platform_device_put() in error case in + omap1_dm_timer_init() + - arm64: dts: mediatek: mt8192: Mark scp_adsp clock as broken + - ARM: bcm2835_defconfig: Enable the framebuffer + - ARM: s3c: fix s3c64xx_set_timer_source prototype + - arm64: dts: ti: k3-j7200: Fix wakeup pinmux range + - ARM: dts: exynos: correct wr-active property in Exynos3250 Rinato + - ARM: imx: Call ida_simple_remove() for ida_simple_get + - arm64: dts: amlogic: meson-gx: fix SCPI clock dvfs node name + - arm64: dts: amlogic: meson-axg: fix SCPI clock dvfs node name + - arm64: dts: amlogic: meson-gx: add missing SCPI sensors compatible + - arm64: dts: amlogic: meson-axg-jethome-jethub-j1xx: fix supply name of USB + controller node + - arm64: dts: amlogic: meson-gxl-s905d-sml5442tw: drop invalid clock-names + property + - arm64: dts: amlogic: meson-gx: add missing unit address to rng node name + - arm64: dts: amlogic: meson-gxl-s905w-jethome-jethub-j80: fix invalid rtc + node name + - arm64: dts: amlogic: meson-axg-jethome-jethub-j1xx: fix invalid rtc node + name + - arm64: dts: amlogic: meson-gxl: add missing unit address to eth-phy-mux node + name + - arm64: dts: amlogic: meson-gx-libretech-pc: fix update button name + - arm64: dts: amlogic: meson-sm1-bananapi-m5: fix adc keys node names + - arm64: dts: amlogic: meson-gxl-s905d-phicomm-n1: fix led node name + - arm64: dts: amlogic: meson-gxbb-kii-pro: fix led node name + - arm64: dts: amlogic: meson-g12b-odroid-go-ultra: fix rk818 pmic properties + - arm64: dts: amlogic: meson-sm1-odroid-hc4: fix active fan thermal trip + - locking/rwsem: Disable preemption in all down_read*() and up_read() code + paths + - arm64: tegra: Mark host1x as dma-coherent on Tegra194/234 + - arm64: dts: renesas: beacon-renesom: Fix gpio expander reference + - arm64: dts: meson: radxa-zero: allow usb otg mode + - arm64: dts: meson: bananapi-m5: switch VDDIO_C pin to OPEN_DRAIN + - ARM: dts: sun8i: nanopi-duo2: Fix regulator GPIO reference + - ublk_drv: remove nr_aborted_queues from ublk_device + - ublk_drv: don't probe partitions if the ubq daemon isn't trusted + - ARM: dts: imx7s: correct iomuxc gpr mux controller cells + - sbitmap: remove redundant check in __sbitmap_queue_get_batch + - sbitmap: correct wake_batch recalculation to avoid potential IO hung + - arm64: dts: mt8195: Fix CPU map for single-cluster SoC + - arm64: dts: mt8192: Fix CPU map for single-cluster SoC + - arm64: dts: mt8186: Fix CPU map for single-cluster SoC + - arm64: dts: mediatek: mt7622: Add missing pwm-cells to pwm node + - arm64: dts: mediatek: mt8186: Fix watchdog compatible + - arm64: dts: mediatek: mt8195: Fix watchdog compatible + - arm64: dts: mediatek: mt7986: Fix watchdog compatible + - ARM: dts: stm32: Update part number NVMEM description on stm32mp131 + - arm64: dts: qcom: sm8450-nagara: Correct firmware paths + - blk-mq: avoid sleep in blk_mq_alloc_request_hctx + - blk-mq: remove stale comment for blk_mq_sched_mark_restart_hctx + - blk-mq: wait on correct sbitmap_queue in blk_mq_mark_tag_wait + - blk-mq: Fix potential io hung for shared sbitmap per tagset + - blk-mq: correct stale comment of .get_budget + - arm64: dts: qcom: msm8996: support using GPLL0 as kryocc input + - arm64: dts: qcom: msm8996 switch from RPM_SMD_BB_CLK1 to RPM_SMD_XO_CLK_SRC + - arm64: dts: qcom: sm8350: drop incorrect cells from serial + - arm64: dts: qcom: sm8450: drop incorrect cells from serial + - arm64: dts: qcom: msm8992-lg-bullhead: Correct memory overlaps with the SMEM + and MPSS memory regions + - arm64: dts: qcom: msm8953: correct TLMM gpio-ranges + - arm64: dts: qcom: sm6115: correct TLMM gpio-ranges + - arm64: dts: qcom: msm8992-lg-bullhead: Enable regulators + - s390/dasd: Fix potential memleak in dasd_eckd_init() + - io_uring,audit: don't log IORING_OP_MADVISE + - sched/rt: pick_next_rt_entity(): check list_entry + - perf/x86/intel/ds: Fix the conversion from TSC to perf time + - x86/perf/zhaoxin: Add stepping check for ZXC + - KEYS: asymmetric: Fix ECDSA use via keyctl uapi + - block: ublk: check IO buffer based on flag need_get_data + - arm64: dts: qcom: pmk8350: Use the correct PON compatible + - erofs: relinquish volume with mutex held + - block: sync mixed merged request's failfast with 1st bio's + - block: Fix io statistics for cgroup in throttle path + - block: bio-integrity: Copy flags when bio_integrity_payload is cloned + - block: use proper return value from bio_failfast() + - wifi: mt76: mt7915: add missing of_node_put() + - wifi: mt76: mt7921s: fix slab-out-of-bounds access in sdio host + - wifi: mt76: mt7915: fix mt7915_rate_txpower_get() resource leaks + - wifi: mt76: mt7996: fix insecure data handling of mt7996_mcu_ie_countdown() + - wifi: mt76: mt7996: fix insecure data handling of + mt7996_mcu_rx_radar_detected() + - wifi: mt76: mt7996: fix integer handling issue of mt7996_rf_regval_set() + - wifi: mt76: mt7915: check return value before accessing free_block_num + - wifi: mt76: mt7996: check return value before accessing free_block_num + - wifi: mt76: mt7915: drop always true condition of __mt7915_reg_addr() + - wifi: mt76: mt7996: drop always true condition of __mt7996_reg_addr() + - wifi: mt76: mt7996: fix endianness warning in mt7996_mcu_sta_he_tlv + - wifi: mt76: mt76x0: fix oob access in mt76x0_phy_get_target_power + - wifi: mt76: mt7996: fix unintended sign extension of mt7996_hw_queue_read() + - wifi: mt76: mt7915: fix unintended sign extension of mt7915_hw_queue_read() + - wifi: mt76: fix coverity uninit_use_in_call in + mt76_connac2_reverse_frag0_hdr_trans() + - wifi: mt76: mt7921: resource leaks at mt7921_check_offload_capability() + - wifi: rsi: Fix memory leak in rsi_coex_attach() + - wifi: rtlwifi: rtl8821ae: don't call kfree_skb() under spin_lock_irqsave() + - wifi: rtlwifi: rtl8188ee: don't call kfree_skb() under spin_lock_irqsave() + - wifi: rtlwifi: rtl8723be: don't call kfree_skb() under spin_lock_irqsave() + - wifi: iwlegacy: common: don't call dev_kfree_skb() under spin_lock_irqsave() + - wifi: libertas: fix memory leak in lbs_init_adapter() + - wifi: rtl8xxxu: Fix assignment to bit field priv->pi_enabled + - wifi: rtl8xxxu: Fix assignment to bit field priv->cck_agc_report_type + - wifi: rtl8xxxu: don't call dev_kfree_skb() under spin_lock_irqsave() + - wifi: rtw89: 8852c: rfk: correct DACK setting + - wifi: rtw89: 8852c: rfk: correct DPK settings + - wifi: rtlwifi: Fix global-out-of-bounds bug in + _rtl8812ae_phy_set_txpower_limit() + - libbpf: Fix single-line struct definition output in btf_dump + - libbpf: Fix btf__align_of() by taking into account field offsets + - wifi: ipw2x00: don't call dev_kfree_skb() under spin_lock_irqsave() + - wifi: ipw2200: fix memory leak in ipw_wdev_init() + - wifi: wilc1000: fix potential memory leak in wilc_mac_xmit() + - wifi: wilc1000: add missing unregister_netdev() in wilc_netdev_ifc_init() + - wifi: brcmfmac: fix potential memory leak in brcmf_netdev_start_xmit() + - wifi: brcmfmac: unmap dma buffer in brcmf_msgbuf_alloc_pktid() + - wifi: libertas_tf: don't call kfree_skb() under spin_lock_irqsave() + - wifi: libertas: if_usb: don't call kfree_skb() under spin_lock_irqsave() + - wifi: libertas: main: don't call kfree_skb() under spin_lock_irqsave() + - wifi: libertas: cmdresp: don't call kfree_skb() under spin_lock_irqsave() + - wifi: wl3501_cs: don't call kfree_skb() under spin_lock_irqsave() + - libbpf: Fix invalid return address register in s390 + - crypto: x86/ghash - fix unaligned access in ghash_setkey() + - crypto: ux500 - update debug config after ux500 cryp driver removal + - ACPICA: Drop port I/O validation for some regions + - genirq: Fix the return type of kstat_cpu_irqs_sum() + - rcu-tasks: Improve comments explaining tasks_rcu_exit_srcu purpose + - rcu-tasks: Remove preemption disablement around srcu_read_[un]lock() calls + - rcu-tasks: Fix synchronize_rcu_tasks() VS zap_pid_ns_processes() + - lib/mpi: Fix buffer overrun when SG is too long + - crypto: ccp - Avoid page allocation failure warning for SEV_GET_ID2 + - platform/chrome: cros_ec_typec: Update port DP VDO + - ACPICA: nsrepair: handle cases without a return value correctly + - libbpf: Fix map creation flags sanitization + - bpf_doc: Fix build error with older python versions + - selftests/xsk: print correct payload for packet dump + - selftests/xsk: print correct error codes when exiting + - arm64/cpufeature: Fix field sign for DIT hwcap detection + - arm64/sysreg: Fix errors in 32 bit enumeration values + - kselftest/arm64: Fix syscall-abi for systems without 128 bit SME + - workqueue: Protects wq_unbound_cpumask with wq_pool_attach_mutex + - s390/early: fix sclp_early_sccb variable lifetime + - s390/vfio-ap: fix an error handling path in vfio_ap_mdev_probe_queue() + - x86/signal: Fix the value returned by strict_sas_size() + - thermal/drivers/tsens: Drop msm8976-specific defines + - thermal/drivers/tsens: Sort out msm8976 vs msm8956 data + - thermal/drivers/tsens: fix slope values for msm8939 + - thermal/drivers/tsens: limit num_sensors to 9 for msm8939 + - wifi: rtw89: fix potential leak in rtw89_append_probe_req_ie() + - wifi: rtw89: Add missing check for alloc_workqueue + - wifi: rtl8xxxu: Fix memory leaks with RTL8723BU, RTL8192EU + - wifi: orinoco: check return value of hermes_write_wordrec() + - wifi: rtw88: Use rtw_iterate_vifs() for rtw_vif_watch_dog_iter() + - wifi: rtw88: Use non-atomic sta iterator in rtw_ra_mask_info_update() + - thermal/drivers/imx_sc_thermal: Fix the loop condition + - wifi: ath9k: htc_hst: free skb in ath9k_htc_rx_msg() if there is no callback + function + - wifi: ath9k: hif_usb: clean up skbs if ath9k_hif_usb_rx_stream() fails + - wifi: ath9k: Fix potential stack-out-of-bounds write in + ath9k_wmi_rsp_callback() + - wifi: ath11k: Fix memory leak in ath11k_peer_rx_frag_setup + - wifi: cfg80211: Fix extended KCK key length check in + nl80211_set_rekey_data() + - ACPI: battery: Fix missing NUL-termination with large strings + - selftests/bpf: Fix build errors if CONFIG_NF_CONNTRACK=m + - crypto: ccp - Failure on re-initialization due to duplicate sysfs filename + - crypto: essiv - Handle EBUSY correctly + - crypto: seqiv - Handle EBUSY correctly + - powercap: fix possible name leak in powercap_register_zone() + - bpf: Fix state pruning for STACK_DYNPTR stack slots + - bpf: Fix missing var_off check for ARG_PTR_TO_DYNPTR + - bpf: Fix partial dynptr stack slot reads/writes + - x86/microcode: Add a parameter to microcode_check() to store CPU + capabilities + - x86/microcode: Check CPU capabilities after late microcode update correctly + - x86/microcode: Adjust late loading result reporting message + - net: ethernet: ti: am65-cpsw/cpts: Fix CPTS release action + - selftests/bpf: Fix vmtest static compilation error + - crypto: xts - Handle EBUSY correctly + - leds: led-class: Add missing put_device() to led_put() + - drm/nouveau/disp: Fix nvif_outp_acquire_dp() argument size + - s390/bpf: Add expoline to tail calls + - wifi: iwlwifi: mei: fix compilation errors in rfkill() + - kselftest/arm64: Fix enumeration of systems without 128 bit SME + - can: rcar_canfd: Fix R-Car V3U CAN mode selection + - can: rcar_canfd: Fix R-Car V3U GAFLCFG field accesses + - selftests/bpf: Initialize tc in xdp_synproxy + - crypto: ccp - Flush the SEV-ES TMR memory before giving it to firmware + - bpftool: profile online CPUs instead of possible + - wifi: mt76: mt7921: fix deadlock in mt7921_abort_roc + - wifi: mt76: mt7915: call mt7915_mcu_set_thermal_throttling() only after + init_work + - wifi: mt76: mt7915: rework mt7915_mcu_set_thermal_throttling + - wifi: mt76: mt7915: rework mt7915_thermal_temp_store() + - wifi: mt76: mt7921: fix channel switch fail in monitor mode + - wifi: mt76: mt7996: fix chainmask calculation in mt7996_set_antenna() + - wifi: mt76: mt7996: update register for CFEND_RATE + - wifi: mt76: connac: fix POWER_CTRL command name typo + - wifi: mt76: mt7921: fix invalid remain_on_channel duration + - wifi: mt76: mt7915: fix memory leak in mt7915_mcu_exit + - wifi: mt76: mt7996: fix memory leak in mt7996_mcu_exit + - wifi: mt76: dma: fix memory leak running mt76_dma_tx_cleanup + - wifi: mt76: fix switch default case in mt7996_reverse_frag0_hdr_trans + - wifi: mt76: mt7915: fix WED TxS reporting + - wifi: mt76: add memory barrier to SDIO queue kick + - wifi: mt76: mt7996: rely on mt76_connac2_mac_tx_rate_val + - net/mlx5: Enhance debug print in page allocation failure + - irqchip: Fix refcount leak in platform_irqchip_probe + - irqchip/alpine-msi: Fix refcount leak in alpine_msix_init_domains + - irqchip/irq-mvebu-gicp: Fix refcount leak in mvebu_gicp_probe + - irqchip/ti-sci: Fix refcount leak in ti_sci_intr_irq_domain_probe + - s390/mem_detect: fix detect_memory() error handling + - s390/vmem: fix empty page tables cleanup under KASAN + - s390/boot: cleanup decompressor header files + - s390/mem_detect: rely on diag260() if sclp_early_get_memsize() fails + - s390/boot: fix mem_detect extended area allocation + - net: add sock_init_data_uid() + - tun: tun_chr_open(): correctly initialize socket uid + - tap: tap_open(): correctly initialize socket uid + - rxrpc: Fix overwaking on call poking + - OPP: fix error checking in opp_migrate_dentry() + - cpufreq: davinci: Fix clk use after free + - Bluetooth: hci_conn: Refactor hci_bind_bis() since it always succeeds + - Bluetooth: L2CAP: Fix potential user-after-free + - Bluetooth: hci_qca: get wakeup status from serdev device handle + - net: ipa: generic command param fix + - s390: vfio-ap: tighten the NIB validity check + - s390/ap: fix status returned by ap_aqic() + - s390/ap: fix status returned by ap_qact() + - libbpf: Fix alen calculation in libbpf_nla_dump_errormsg() + - xen/grant-dma-iommu: Implement a dummy probe_device() callback + - rds: rds_rm_zerocopy_callback() correct order for list_add_tail() + - crypto: rsa-pkcs1pad - Use akcipher_request_complete + - m68k: /proc/hardware should depend on PROC_FS + - RISC-V: time: initialize hrtimer based broadcast clock event device + - clocksource/drivers/riscv: Patch riscv_clock_next_event() jump before first + use + - wifi: iwl3945: Add missing check for create_singlethread_workqueue + - wifi: iwl4965: Add missing check for create_singlethread_workqueue() + - wifi: brcmfmac: Rename Cypress 89459 to BCM4355 + - wifi: brcmfmac: pcie: Add IDs/properties for BCM4355 + - wifi: brcmfmac: pcie: Add IDs/properties for BCM4377 + - wifi: brcmfmac: pcie: Perform correct BCM4364 firmware selection + - wifi: mwifiex: fix loop iterator in mwifiex_update_ampdu_txwinsize() + - wifi: rtw89: fix parsing offset for MCC C2H + - selftests/bpf: Fix out-of-srctree build + - ACPI: resource: Add IRQ overrides for MAINGEAR Vector Pro 2 models + - ACPI: resource: Do IRQ override on all TongFang GMxRGxx + - crypto: octeontx2 - Fix objects shared between several modules + - crypto: crypto4xx - Call dma_unmap_page when done + - vfio/ccw: remove WARN_ON during shutdown + - wifi: mac80211: move color collision detection report in a delayed work + - wifi: mac80211: make rate u32 in sta_set_rate_info_rx() + - wifi: mac80211: fix non-MLO station association + - wifi: mac80211: Don't translate MLD addresses for multicast + - wifi: mac80211: avoid u32_encode_bits() warning + - wifi: mac80211: fix off-by-one link setting + - tools/lib/thermal: Fix thermal_sampling_exit() + - thermal/drivers/hisi: Drop second sensor hi3660 + - selftests/bpf: Fix map_kptr test. + - wifi: mac80211: pass 'sta' to ieee80211_rx_data_set_sta() + - bpf: Zeroing allocated object from slab in bpf memory allocator + - selftests/bpf: Fix xdp_do_redirect on s390x + - can: esd_usb: Move mislocated storage of SJA1000_ECC_SEG bits in case of a + bus error + - can: esd_usb: Make use of can_change_state() and relocate checking skb for + NULL + - xsk: check IFF_UP earlier in Tx path + - LoongArch, bpf: Use 4 instructions for function address in JIT + - bpf: Fix global subprog context argument resolution logic + - irqchip/irq-brcmstb-l2: Set IRQ_LEVEL for level triggered interrupts + - irqchip/irq-bcm7120-l2: Set IRQ_LEVEL for level triggered interrupts + - net/smc: fix potential panic dues to unprotected smc_llc_srv_add_link() + - net/smc: fix application data exception + - selftests/net: Interpret UDP_GRO cmsg data as an int value + - l2tp: Avoid possible recursive deadlock in l2tp_tunnel_register() + - net: bcmgenet: fix MoCA LED control + - net: lan966x: Fix possible deadlock inside PTP + - net/mlx4_en: Introduce flexible array to silence overflow warning + - net/mlx5e: Align IPsec ASO result memory to be as required by hardware + - selftest: fib_tests: Always cleanup before exit + - sefltests: netdevsim: wait for devlink instance after netns removal + - drm: Fix potential null-ptr-deref due to drmm_mode_config_init() + - drm/fourcc: Add missing big-endian XRGB1555 and RGB565 formats + - drm/bridge: ti-sn65dsi83: Fix delay after reset deassert to match spec + - drm: mxsfb: DRM_IMX_LCDIF should depend on ARCH_MXC + - drm: mxsfb: DRM_MXSFB should depend on ARCH_MXS || ARCH_MXC + - drm/bridge: megachips: Fix error handling in i2c_register_driver() + - drm/vkms: Fix memory leak in vkms_init() + - drm/vkms: Fix null-ptr-deref in vkms_release() + - drm/modes: Use strscpy() to copy command-line mode name + - drm/vc4: dpi: Fix format mapping for RGB565 + - drm/bridge: it6505: Guard bridge power in IRQ handler + - drm: tidss: Fix pixel format definition + - gpu: ipu-v3: common: Add of_node_put() for reference returned by + of_graph_get_port_by_id() + - drm/ast: Init iosys_map pointer as I/O memory for damage handling + - drm/vc4: drop all currently held locks if deadlock happens + - hwmon: (ftsteutates) Fix scaling of measurements + - drm/msm/dpu: check for null return of devm_kzalloc() in dpu_writeback_init() + - drm/msm/hdmi: Add missing check for alloc_ordered_workqueue + - pinctrl: qcom: pinctrl-msm8976: Correct function names for wcss pins + - pinctrl: stm32: Fix refcount leak in stm32_pctrl_get_irq_domain + - pinctrl: rockchip: Fix refcount leak in rockchip_pinctrl_parse_groups + - drm/vc4: hvs: Configure the HVS COB allocations + - drm/vc4: hvs: Set AXI panic modes + - drm/vc4: hvs: SCALER_DISPBKGND_AUTOHS is only valid on HVS4 + - drm/vc4: hvs: Correct interrupt masking bit assignment for HVS5 + - drm/vc4: hvs: Fix colour order for xRGB1555 on HVS5 + - drm/vc4: hdmi: Correct interlaced timings again + - drm/msm: clean event_thread->worker in case of an error + - drm/panel-edp: fix name for IVO product id 854b + - scsi: qla2xxx: Fix exchange oversubscription + - scsi: qla2xxx: Fix exchange oversubscription for management commands + - scsi: qla2xxx: edif: Fix clang warning + - ASoC: fsl_sai: initialize is_dsp_mode flag + - drm/bridge: tc358767: Set default CLRSIPO count + - drm/msm/adreno: Fix null ptr access in adreno_gpu_cleanup() + - ALSA: hda/ca0132: minor fix for allocation size + - drm/amdgpu: Use the sched from entity for amdgpu_cs trace + - drm/msm/gem: Add check for kmalloc + - drm/msm/dpu: Disallow unallocated resources to be returned + - drm/bridge: lt9611: fix sleep mode setup + - drm/bridge: lt9611: fix HPD reenablement + - drm/bridge: lt9611: fix polarity programming + - drm/bridge: lt9611: fix programming of video modes + - drm/bridge: lt9611: fix clock calculation + - drm/bridge: lt9611: pass a pointer to the of node + - regulator: tps65219: use IS_ERR() to detect an error pointer + - drm/mipi-dsi: Fix byte order of 16-bit DCS set/get brightness + - drm: exynos: dsi: Fix MIPI_DSI*_NO_* mode flags + - drm/msm/dsi: Allow 2 CTRLs on v2.5.0 + - scsi: ufs: exynos: Fix DMA alignment for PAGE_SIZE != 4096 + - drm/msm/dpu: sc7180: add missing WB2 clock control + - drm/msm: use strscpy instead of strncpy + - drm/msm/dpu: Add check for cstate + - drm/msm/dpu: Add check for pstates + - drm/msm/mdp5: Add check for kzalloc + - habanalabs: bugs fixes in timestamps buff alloc + - pinctrl: bcm2835: Remove of_node_put() in bcm2835_of_gpio_ranges_fallback() + - pinctrl: mediatek: Initialize variable pullen and pullup to zero + - pinctrl: mediatek: Initialize variable *buf to zero + - gpu: host1x: Fix mask for syncpoint increment register + - gpu: host1x: Don't skip assigning syncpoints to channels + - drm/tegra: firewall: Check for is_addr_reg existence in IMM check + - drm/i915/mtl: Add initial gt workarounds + - drm/i915/xehp: GAM registers don't need to be re-applied on engine resets + - pinctrl: renesas: rzg2l: Fix configuring the GPIO pins as interrupts + - drm/i915/xehp: Annotate a couple more workaround registers as MCR + - drm/msm/dpu: set pdpu->is_rt_pipe early in dpu_plane_sspp_atomic_update() + - drm/mediatek: dsi: Reduce the time of dsi from LP11 to sending cmd + - drm/mediatek: Use NULL instead of 0 for NULL pointer + - drm/mediatek: Drop unbalanced obj unref + - drm/mediatek: mtk_drm_crtc: Add checks for devm_kcalloc + - drm/mediatek: Clean dangling pointer on bind error path + - ASoC: soc-compress.c: fixup private_data on snd_soc_new_compress() + - dt-bindings: display: mediatek: Fix the fallback for mediatek,mt8186-disp- + ccorr + - gpio: pca9570: rename platform_data to chip_data + - gpio: vf610: connect GPIO label to dev name + - ASoC: topology: Properly access value coming from topology file + - spi: dw_bt1: fix MUX_MMIO dependencies + - ASoC: mchp-spdifrx: fix controls which rely on rsr register + - ASoC: mchp-spdifrx: fix return value in case completion times out + - ASoC: mchp-spdifrx: fix controls that works with completion mechanism + - ASoC: mchp-spdifrx: disable all interrupts in mchp_spdifrx_dai_remove() + - dm: improve shrinker debug names + - regmap: apply reg_base and reg_downshift for single register ops + - accel: fix CONFIG_DRM dependencies + - ASoC: rsnd: fixup #endif position + - ASoC: mchp-spdifrx: Fix uninitialized use of mr in mchp_spdifrx_hw_params() + - ASoC: dt-bindings: meson: fix gx-card codec node regex + - regulator: tps65219: use generic set_bypass() + - hwmon: (asus-ec-sensors) add missing mutex path + - hwmon: (ltc2945) Handle error case in ltc2945_value_store + - ALSA: hda: Fix the control element identification for multiple codecs + - drm/amdgpu: fix enum odm_combine_mode mismatch + - scsi: mpt3sas: Fix a memory leak + - scsi: aic94xx: Add missing check for dma_map_single() + - HID: multitouch: Add quirks for flipped axes + - HID: retain initial quirks set up when creating HID devices + - ASoC: qcom: q6apm-lpass-dai: unprepare stream if its already prepared + - ASoC: qcom: q6apm-dai: fix race condition while updating the position + pointer + - ASoC: qcom: q6apm-dai: Add SNDRV_PCM_INFO_BATCH flag + - ASoC: codecs: lpass: register mclk after runtime pm + - ASoC: codecs: lpass: fix incorrect mclk rate + - drm/amd/display: don't call dc_interrupt_set() for disabled crtcs + - HID: logitech-hidpp: Hard-code HID++ 1.0 fast scroll support + - spi: bcm63xx-hsspi: Fix multi-bit mode setting + - hwmon: (mlxreg-fan) Return zero speed for broken fan + - ASoC: tlv320adcx140: fix 'ti,gpio-config' DT property init + - dm: remove flush_scheduled_work() during local_exit() + - nfs4trace: fix state manager flag printing + - NFS: fix disabling of swap + - drm/i915/pvc: Implement recommended caching policy + - drm/i915/pvc: Annotate two more workaround/tuning registers as MCR + - drm/i915: Fix GEN8_MISCCPCTL + - spi: synquacer: Fix timeout handling in synquacer_spi_transfer_one() + - ASoC: soc-dapm.h: fixup warning struct snd_pcm_substream not declared + - HID: bigben: use spinlock to protect concurrent accesses + - HID: bigben_worker() remove unneeded check on report_field + - HID: bigben: use spinlock to safely schedule workers + - hid: bigben_probe(): validate report count + - ALSA: hda/hdmi: Register with vga_switcheroo on Dual GPU Macbooks + - drm/shmem-helper: Fix locking for drm_gem_shmem_get_pages_sgt() + - NFSD: enhance inter-server copy cleanup + - NFSD: fix leaked reference count of nfsd4_ssc_umount_item + - nfsd: fix race to check ls_layouts + - nfsd: clean up potential nfsd_file refcount leaks in COPY codepath + - NFSD: fix problems with cleanup on errors in nfsd4_copy + - nfsd: fix courtesy client with deny mode handling in nfs4_upgrade_open + - nfsd: don't fsync nfsd_files on last close + - NFSD: copy the whole verifier in nfsd_copy_write_verifier + - cifs: Fix lost destroy smbd connection when MR allocate failed + - cifs: Fix warning and UAF when destroy the MR list + - cifs: use tcon allocation functions even for dummy tcon + - gfs2: jdata writepage fix + - perf llvm: Fix inadvertent file creation + - leds: led-core: Fix refcount leak in of_led_get() + - leds: is31fl319x: Wrap mutex_destroy() for devm_add_action_or_rest() + - leds: simatic-ipc-leds-gpio: Make sure we have the GPIO providing driver + - tools/tracing/rtla: osnoise_hist: use total duration for average calculation + - perf inject: Use perf_data__read() for auxtrace + - perf intel-pt: Do not try to queue auxtrace data on pipe + - perf stat: Hide invalid uncore event output for aggr mode + - perf jevents: Correct bad character encoding + - perf test bpf: Skip test if kernel-debuginfo is not present + - perf tools: Fix auto-complete on aarch64 + - perf stat: Avoid merging/aggregating metric counts twice + - sparc: allow PM configs for sparc32 COMPILE_TEST + - selftests: find echo binary to use -ne options + - selftests/ftrace: Fix bash specific "==" operator + - selftests: use printf instead of echo -ne + - perf record: Fix segfault with --overwrite and --max-size + - printf: fix errname.c list + - perf tests stat_all_metrics: Change true workload to sleep workload for + system wide check + - objtool: add UACCESS exceptions for __tsan_volatile_read/write + - selftests/ftrace: Fix probepoint testcase to ignore __pfx_* symbols + - sysctl: fix proc_dobool() usability + - mfd: rk808: Re-add rk808-clkout to RK818 + - mfd: cs5535: Don't build on UML + - mfd: pcf50633-adc: Fix potential memleak in pcf50633_adc_async_read() + - dmaengine: idxd: Set traffic class values in GRPCFG on DSA 2.0 + - RDMA/erdma: Fix refcount leak in erdma_mmap + - dmaengine: HISI_DMA should depend on ARCH_HISI + - RDMA/hns: Fix refcount leak in hns_roce_mmap + - iio: light: tsl2563: Do not hardcode interrupt trigger type + - usb: gadget: fusb300_udc: free irq on the error path in fusb300_probe() + - i2c: designware: fix i2c_dw_clk_rate() return size to be u32 + - i2c: qcom-geni: change i2c_master_hub to static + - soundwire: cadence: Don't overflow the command FIFOs + - driver core: fix potential null-ptr-deref in device_add() + - kobject: Fix slab-out-of-bounds in fill_kobj_path() + - alpha/boot/tools/objstrip: fix the check for ELF header + - media: uvcvideo: Check for INACTIVE in uvc_ctrl_is_accessible() + - media: uvcvideo: Implement mask for V4L2_CTRL_TYPE_MENU + - media: uvcvideo: Refactor uvc_ctrl_mappings_uvcXX + - media: uvcvideo: Refactor power_line_frequency_controls_limited + - coresight: etm4x: Fix accesses to TRCSEQRSTEVR and TRCSEQSTR + - coresight: cti: Prevent negative values of enable count + - coresight: cti: Add PM runtime call in enable_store + - usb: typec: intel_pmc_mux: Don't leak the ACPI device reference count + - PCI/IOV: Enlarge virtfn sysfs name buffer + - PCI: switchtec: Return -EFAULT for copy_to_user() errors + - PCI: endpoint: pci-epf-vntb: Add epf_ntb_mw_bar_clear() num_mws kernel-doc + - hwtracing: hisi_ptt: Only add the supported devices to the filters list + - tty: serial: fsl_lpuart: disable Rx/Tx DMA in lpuart32_shutdown() + - tty: serial: fsl_lpuart: clear LPUART Status Register in lpuart32_shutdown() + - serial: tegra: Add missing clk_disable_unprepare() in tegra_uart_hw_init() + - Revert "char: pcmcia: cm4000_cs: Replace mdelay with usleep_range in + set_protocol" + - eeprom: idt_89hpesx: Fix error handling in idt_init() + - applicom: Fix PCI device refcount leak in applicom_init() + - firmware: stratix10-svc: add missing gen_pool_destroy() in + stratix10_svc_drv_probe() + - firmware: stratix10-svc: fix error handle while alloc/add device failed + - VMCI: check context->notify_page after call to get_user_pages_fast() to + avoid GPF + - mei: pxp: Use correct macros to initialize uuid_le + - misc/mei/hdcp: Use correct macros to initialize uuid_le + - misc: fastrpc: Fix an error handling path in fastrpc_rpmsg_probe() + - iommu/exynos: Fix error handling in exynos_iommu_init() + - driver core: fix resource leak in device_add() + - driver core: location: Free struct acpi_pld_info *pld before return false + - drivers: base: transport_class: fix possible memory leak + - drivers: base: transport_class: fix resource leak when + transport_add_device() fails + - firmware: dmi-sysfs: Fix null-ptr-deref in dmi_sysfs_register_handle + - selftests: iommu: Fix test_cmd_destroy_access() call in user_copy + - iommufd: Add three missing structures in ucmd_buffer + - fotg210-udc: Add missing completion handler + - dmaengine: dw-edma: Fix missing src/dst address of interleaved xfers + - fpga: microchip-spi: move SPI I/O buffers out of stack + - fpga: microchip-spi: rewrite status polling in a time measurable way + - usb: early: xhci-dbc: Fix a potential out-of-bound memory access + - tty: serial: fsl_lpuart: Fix the wrong RXWATER setting for rx dma case + - RDMA/cxgb4: add null-ptr-check after ip_dev_find() + - usb: musb: mediatek: don't unregister something that wasn't registered + - usb: gadget: configfs: Restrict symlink creation is UDC already binded + - phy: mediatek: remove temporary variable @mask_ + - PCI: mt7621: Delay phy ports initialization + - iommu/vt-d: Set No Execute Enable bit in PASID table entry + - power: supply: remove faulty cooling logic + - RDMA/siw: Fix user page pinning accounting + - RDMA/cxgb4: Fix potential null-ptr-deref in pass_establish() + - usb: max-3421: Fix setting of I/O pins + - RDMA/irdma: Cap MSIX used to online CPUs + 1 + - serial: fsl_lpuart: fix RS485 RTS polariy inverse issue + - tty: serial: imx: disable Ageing Timer interrupt request irq + - driver core: fw_devlink: Add DL_FLAG_CYCLE support to device links + - driver core: fw_devlink: Don't purge child fwnode's consumer links + - driver core: fw_devlink: Allow marking a fwnode link as being part of a + cycle + - driver core: fw_devlink: Consolidate device link flag computation + - driver core: fw_devlink: Improve check for fwnode with no device/driver + - driver core: fw_devlink: Make cycle detection more robust + - mtd: mtdpart: Don't create platform device that'll never probe + - usb: host: fsl-mph-dr-of: reuse device_set_of_node_from_dev + - dmaengine: dw-edma: Fix readq_ch() return value truncation + - PCI: Fix dropping valid root bus resources with .end = zero + - phy: rockchip-typec: fix tcphy_get_mode error case + - PCI: qcom: Fix host-init error handling + - iw_cxgb4: Fix potential NULL dereference in c4iw_fill_res_cm_id_entry() + - iommu: Fix error unwind in iommu_group_alloc() + - iommu/amd: Do not identity map v2 capable device when snp is enabled + - dmaengine: sf-pdma: pdma_desc memory leak fix + - dmaengine: dw-axi-dmac: Do not dereference NULL structure + - dmaengine: ptdma: check for null desc before calling pt_cmd_callback + - iommu/vt-d: Fix error handling in sva enable/disable paths + - iommu/vt-d: Allow to use flush-queue when first level is default + - RDMA/rxe: Cleanup mr_check_range + - RDMA/rxe: Move rxe_map_mr_sg to rxe_mr.c + - RDMA-rxe: Isolate mr code from atomic_reply() + - RDMA-rxe: Isolate mr code from atomic_write_reply() + - RDMA/rxe: Cleanup page variables in rxe_mr.c + - RDMA/rxe: Replace rxe_map and rxe_phys_buf by xarray + - Subject: RDMA/rxe: Handle zero length rdma + - RDMA/mana_ib: Fix a bug when the PF indicates more entries for registering + memory on first packet + - RDMA/rxe: Fix missing memory barriers in rxe_queue.h + - IB/hfi1: Fix math bugs in hfi1_can_pin_pages() + - IB/hfi1: Fix sdma.h tx->num_descs off-by-one errors + - Revert "remoteproc: qcom_q6v5_mss: map/unmap metadata region before/after + use" + - remoteproc: qcom_q6v5_mss: Use a carveout to authenticate modem headers + - media: ti: cal: fix possible memory leak in cal_ctx_create() + - media: platform: ti: Add missing check for devm_regulator_get + - media: imx: imx7-media-csi: fix missing clk_disable_unprepare() in + imx7_csi_init() + - powerpc: Remove linker flag from KBUILD_AFLAGS + - s390/vdso: Drop '-shared' from KBUILD_CFLAGS_64 + - builddeb: clean generated package content + - media: max9286: Fix memleak in max9286_v4l2_register() + - media: ov2740: Fix memleak in ov2740_init_controls() + - media: ov5675: Fix memleak in ov5675_init_controls() + - media: i2c: tc358746: fix missing return assignment + - media: i2c: tc358746: fix ignoring read error in g_register callback + - media: i2c: tc358746: fix possible endianness issue + - media: ov5640: Fix soft reset sequence and timings + - media: ov5640: Handle delays when no reset_gpio set + - media: mc: Get media_device directly from pad + - media: i2c: ov772x: Fix memleak in ov772x_probe() + - media: i2c: imx219: Split common registers from mode tables + - media: i2c: imx219: Fix binning for RAW8 capture + - media: platform: mtk-mdp3: Fix return value check in mdp_probe() + - media: camss: csiphy-3ph: avoid undefined behavior + - media: platform: mtk-mdp3: fix Kconfig dependencies + - media: v4l2-jpeg: correct the skip count in jpeg_parse_app14_data + - media: v4l2-jpeg: ignore the unknown APP14 marker + - media: hantro: Fix JPEG encoder ENUM_FRMSIZE on RK3399 + - media: imx-jpeg: Apply clk_bulk api instead of operating specific clk + - media: amphion: correct the unspecified color space + - media: drivers/media/v4l2-core/v4l2-h264 : add detection of null pointers + - media: rc: Fix use-after-free bugs caused by ene_tx_irqsim() + - media: atomisp: fix videobuf2 Kconfig depenendency + - media: atomisp: Only set default_run_mode on first open of a stream/asd + - media: i2c: ov7670: 0 instead of -EINVAL was returned + - media: usb: siano: Fix use after free bugs caused by do_submit_urb + - media: saa7134: Use video_unregister_device for radio_dev + - rpmsg: glink: Avoid infinite loop on intent for missing channel + - rpmsg: glink: Release driver_override + - ARM: OMAP2+: omap4-common: Fix refcount leak bug + - arm64: dts: qcom: msm8996: Add additional A2NoC clocks + - udf: Define EFSCORRUPTED error code + - context_tracking: Fix noinstr vs KASAN + - exit: Detect and fix irq disabled state in oops + - ARM: dts: exynos: Use Exynos5420 compatible for the MIPI video phy + - fs: Use CHECK_DATA_CORRUPTION() when kernel bugs are detected + - blk-iocost: fix divide by 0 error in calc_lcoefs() + - blk-cgroup: dropping parent refcount after pd_free_fn() is done + - blk-cgroup: synchronize pd_free_fn() from blkg_free_workfn() and + blkcg_deactivate_policy() + - trace/blktrace: fix memory leak with using debugfs_lookup() + - btrfs: scrub: improve tree block error reporting + - arm64: zynqmp: Enable hs termination flag for USB dwc3 controller + - cpuidle, intel_idle: Fix CPUIDLE_FLAG_INIT_XSTATE + - x86/fpu: Don't set TIF_NEED_FPU_LOAD for PF_IO_WORKER threads + - cpuidle: drivers: firmware: psci: Dont instrument suspend code + - cpuidle: lib/bug: Disable rcu_is_watching() during WARN/BUG + - perf/x86/intel/uncore: Add Meteor Lake support + - wifi: ath9k: Fix use-after-free in ath9k_hif_usb_disconnect() + - wifi: ath11k: fix monitor mode bringup crash + - wifi: brcmfmac: Fix potential stack-out-of-bounds in brcmf_c_preinit_dcmds() + - rcu: Make RCU_LOCKDEP_WARN() avoid early lockdep checks + - rcu: Suppress smp_processor_id() complaint in + synchronize_rcu_expedited_wait() + - srcu: Delegate work to the boot cpu if using SRCU_SIZE_SMALL + - rcu-tasks: Make rude RCU-Tasks work well with CPU hotplug + - rcu-tasks: Handle queue-shrink/callback-enqueue race condition + - wifi: ath11k: debugfs: fix to work with multiple PCI devices + - thermal: intel: Fix unsigned comparison with less than zero + - timers: Prevent union confusion from unexpected restart_syscall() + - x86/bugs: Reset speculation control settings on init + - bpftool: Always disable stack protection for BPF objects + - wifi: brcmfmac: ensure CLM version is null-terminated to prevent stack-out- + of-bounds + - wifi: rtw89: fix assignation of TX BD RAM table + - wifi: mt7601u: fix an integer underflow + - inet: fix fast path in __inet_hash_connect() + - ice: restrict PTP HW clock freq adjustments to 100, 000, 000 PPB + - ice: add missing checks for PF vsi type + - Compiler attributes: GCC cold function alignment workarounds + - ACPI: Don't build ACPICA with '-Os' + - bpf, docs: Fix modulo zero, division by zero, overflow, and underflow + - thermal: intel: intel_pch: Add support for Wellsburg PCH + - clocksource: Suspend the watchdog temporarily when high read latency + detected + - crypto: hisilicon: Wipe entire pool on error + - net: bcmgenet: Add a check for oversized packets + - m68k: Check syscall_trace_enter() return code + - s390/mm,ptdump: avoid Kasan vs Memcpy Real markers swapping + - netfilter: nf_tables: NULL pointer dereference in nf_tables_updobj() + - can: isotp: check CAN address family in isotp_bind() + - gcc-plugins: drop -std=gnu++11 to fix GCC 13 build + - tools/power/x86/intel-speed-select: Add Emerald Rapid quirk + - platform/x86: dell-ddv: Add support for interface version 3 + - wifi: mt76: dma: free rx_head in mt76_dma_rx_cleanup + - ACPI: video: Fix Lenovo Ideapad Z570 DMI match + - net/mlx5: fw_tracer: Fix debug print + - coda: Avoid partial allocation of sig_inputArgs + - uaccess: Add minimum bounds check on kernel buffer size + - s390/idle: mark arch_cpu_idle() noinstr + - time/debug: Fix memory leak with using debugfs_lookup() + - PM: domains: fix memory leak with using debugfs_lookup() + - PM: EM: fix memory leak with using debugfs_lookup() + - Bluetooth: Fix issue with Actions Semi ATS2851 based devices + - Bluetooth: btusb: Add new PID/VID 0489:e0f2 for MT7921 + - Bluetooth: btusb: Add VID:PID 13d3:3529 for Realtek RTL8821CE + - wifi: rtw89: debug: avoid invalid access on RTW89_DBG_SEL_MAC_30 + - hv_netvsc: Check status in SEND_RNDIS_PKT completion message + - s390/kfence: fix page fault reporting + - devlink: Fix TP_STRUCT_entry in trace of devlink health report + - scm: add user copy checks to put_cmsg() + - drm: panel-orientation-quirks: Add quirk for Lenovo Yoga Tab 3 X90F + - drm: panel-orientation-quirks: Add quirk for DynaBook K50 + - drm/amd/display: Reduce expected sdp bandwidth for dcn321 + - drm/amd/display: Revert Reduce delay when sink device not able to ACK 00340h + write + - drm/amd/display: Fix potential null-deref in dm_resume + - drm/omap: dsi: Fix excessive stack usage + - HID: Add Mapping for System Microphone Mute + - drm/tiny: ili9486: Do not assume 8-bit only SPI controllers + - drm/amd/display: Defer DIG FIFO disable after VID stream enable + - drm/radeon: free iio for atombios when driver shutdown + - drm/amd: Avoid BUG() for case of SRIOV missing IP version + - drm/amdkfd: Page aligned memory reserve size + - scsi: lpfc: Fix use-after-free KFENCE violation during sysfs firmware write + - Revert "fbcon: don't lose the console font across generic->chip driver + switch" + - drm/amd: Avoid ASSERT for some message failures + - drm: amd: display: Fix memory leakage + - drm/amd/display: fix mapping to non-allocated address + - HID: uclogic: Add frame type quirk + - HID: uclogic: Add battery quirk + - HID: uclogic: Add support for XP-PEN Deco Pro SW + - HID: uclogic: Add support for XP-PEN Deco Pro MW + - drm/msm/dsi: Add missing check for alloc_ordered_workqueue + - drm: rcar-du: Add quirk for H3 ES1.x pclk workaround + - drm: rcar-du: Fix setting a reserved bit in DPLLCR + - drm/drm_print: correct format problem + - drm/amd/display: Set hvm_enabled flag for S/G mode + - drm/client: Test for connectors before sending hotplug event + - habanalabs: extend fatal messages to contain PCI info + - habanalabs: fix bug in timestamps registration code + - docs/scripts/gdb: add necessary make scripts_gdb step + - drm/msm/dpu: Add DSC hardware blocks to register snapshot + - ASoC: soc-compress: Reposition and add pcm_mutex + - ASoC: kirkwood: Iterate over array indexes instead of using pointer math + - regulator: max77802: Bounds check regulator id against opmode + - regulator: s5m8767: Bounds check id indexing into arrays + - Revert "drm/amdgpu: TA unload messages are not actually sent to psp when + amdgpu is uninstalled" + - drm/amd/display: fix FCLK pstate change underflow + - gfs2: Improve gfs2_make_fs_rw error handling + - hwmon: (coretemp) Simplify platform device handling + - hwmon: (nct6775) Directly call ASUS ACPI WMI method + - hwmon: (nct6775) B650/B660/X670 ASUS boards support + - pinctrl: at91: use devm_kasprintf() to avoid potential leaks + - drm/amd/display: Do not commit pipe when updating DRR + - scsi: snic: Fix memory leak with using debugfs_lookup() + - scsi: ufs: core: Fix device management cmd timeout flow + - HID: logitech-hidpp: Don't restart communication if not necessary + - drm/amd/display: Enable P-state validation checks for DCN314 + - drm: panel-orientation-quirks: Add quirk for Lenovo IdeaPad Duet 3 10IGL5 + - drm/amd/display: Disable HUBP/DPP PG on DCN314 for now + - drm/amd/display: disable SubVP + DRR to prevent underflow + - dm thin: add cond_resched() to various workqueue loops + - dm cache: add cond_resched() to various workqueue loops + - nfsd: zero out pointers after putting nfsd_files on COPY setup error + - nfsd: don't hand out delegation on setuid files being opened for write + - cifs: prevent data race in smb2_reconnect() + - drm/i915/mtl: Correct implementation of Wa_18018781329 + - drm/shmem-helper: Revert accidental non-GPL export + - driver core: fw_devlink: Avoid spurious error message + - wifi: rtl8xxxu: fixing transmisison failure for rtl8192eu + - firmware: coreboot: framebuffer: Ignore reserved pixel color bits + - block: don't allow multiple bios for IOCB_NOWAIT issue + - block: clear bio->bi_bdev when putting a bio back in the cache + - block: be a bit more careful in checking for NULL bdev while polling + - rtc: pm8xxx: fix set-alarm race + - ipmi: ipmb: Fix the MODULE_PARM_DESC associated to 'retry_time_ms' + - ipmi:ssif: resend_msg() cannot fail + - ipmi_ssif: Rename idle state and check + - ipmi:ssif: Add a timer between request retries + - io_uring: Replace 0-length array with flexible array + - io_uring: use user visible tail in io_uring_poll() + - io_uring: handle TIF_NOTIFY_RESUME when checking for task_work + - io_uring: add a conditional reschedule to the IOPOLL cancelation loop + - io_uring: add reschedule point to handle_tw_list() + - io_uring/rsrc: disallow multi-source reg buffers + - io_uring: remove MSG_NOSIGNAL from recvmsg + - io_uring/poll: allow some retries for poll triggering spuriously + - io_uring: fix fget leak when fs don't support nowait buffered read + - s390/extmem: return correct segment type in __segment_load() + - s390: discard .interp section + - s390/kprobes: fix irq mask clobbering on kprobe reenter from post_handler + - s390/kprobes: fix current_kprobe never cleared after kprobes reenter + - KVM: s390: disable migration mode when dirty tracking is disabled + - cifs: improve checking of DFS links over STATUS_OBJECT_NAME_INVALID + - cifs: Fix uninitialized memory read in smb3_qfs_tcon() + - cifs: Fix uninitialized memory reads for oparms.mode + - cifs: fix mount on old smb servers + - cifs: introduce cifs_io_parms in smb2_async_writev() + - cifs: split out smb3_use_rdma_offload() helper + - cifs: don't try to use rdma offload on encrypted connections + - cifs: Check the lease context if we actually got a lease + - cifs: return a single-use cfid if we did not get a lease + - scsi: mpi3mr: Fix missing mrioc->evtack_cmds initialization + - scsi: mpi3mr: Fix issues in mpi3mr_get_all_tgt_info() + - scsi: mpi3mr: Remove unnecessary memcpy() to alltgt_info->dmi + - btrfs: hold block group refcount during async discard + - btrfs: sysfs: update fs features directory asynchronously + - locking/rwsem: Prevent non-first waiter from spinning in down_write() + slowpath + - ksmbd: fix wrong data area length for smb2 lock request + - ksmbd: do not allow the actual frame length to be smaller than the rfc1002 + length + - ksmbd: fix possible memory leak in smb2_lock() + - torture: Fix hang during kthread shutdown phase + - ARM: dts: exynos: correct HDMI phy compatible in Exynos4 + - io_uring: mark task TASK_RUNNING before handling resume/task work + - hfs: fix missing hfs_bnode_get() in __hfs_bnode_create + - fs: hfsplus: fix UAF issue in hfsplus_put_super + - exfat: fix reporting fs error when reading dir beyond EOF + - exfat: fix unexpected EOF while reading dir + - exfat: redefine DIR_DELETED as the bad cluster number + - exfat: fix inode->i_blocks for non-512 byte sector size device + - fs: dlm: start midcomms before scand + - fs: dlm: fix use after free in midcomms commit + - fs: dlm: be sure to call dlm_send_queue_flush() + - fs: dlm: fix race setting stop tx flag + - fs: dlm: don't set stop rx flag after node reset + - fs: dlm: move sending fin message into state change handling + - fs: dlm: send FIN ack back in right cases + - f2fs: fix information leak in f2fs_move_inline_dirents() + - f2fs: retry to update the inode page given data corruption + - f2fs: fix cgroup writeback accounting with fs-layer encryption + - f2fs: fix kernel crash due to null io->bio + - f2fs: Revert "f2fs: truncate blocks in batch in __complete_revoke_list()" + - ocfs2: fix defrag path triggering jbd2 ASSERT + - ocfs2: fix non-auto defrag path not working issue + - fs/cramfs/inode.c: initialize file_ra_state + - selftests/landlock: Skip overlayfs tests when not supported + - selftests/landlock: Test ptrace as much as possible with Yama + - udf: Truncate added extents on failed expansion + - udf: Do not bother merging very long extents + - udf: Do not update file length for failed writes to inline files + - udf: Preserve link count of system files + - udf: Detect system inodes linked into directory hierarchy + - udf: Fix file corruption when appending just after end of preallocated + extent + - md: don't update recovery_cp when curr_resync is ACTIVE + - KVM: Destroy target device if coalesced MMIO unregistration fails + - KVM: VMX: Fix crash due to uninitialized current_vmcs + - KVM: Register /dev/kvm as the _very_ last thing during initialization + - KVM: x86: Purge "highest ISR" cache when updating APICv state + - KVM: x86: Blindly get current x2APIC reg value on "nodecode write" traps + - KVM: x86: Don't inhibit APICv/AVIC on xAPIC ID "change" if APIC is disabled + - KVM: x86: Don't inhibit APICv/AVIC if xAPIC ID mismatch is due to 32-bit ID + - KVM: SVM: Flush the "current" TLB when activating AVIC + - KVM: SVM: Process ICR on AVIC IPI delivery failure due to invalid target + - KVM: SVM: Don't put/load AVIC when setting virtual APIC mode + - KVM: x86: Inject #GP if WRMSR sets reserved bits in APIC Self-IPI + - KVM: x86: Inject #GP on x2APIC WRMSR that sets reserved bits 63:32 + - KVM: SVM: Fix potential overflow in SEV's send|receive_update_data() + - KVM: SVM: hyper-v: placate modpost section mismatch error + - selftests: x86: Fix incorrect kernel headers search path + - x86/virt: Force GIF=1 prior to disabling SVM (for reboot flows) + - x86/crash: Disable virt in core NMI crash handler to avoid double shootdown + - x86/reboot: Disable virtualization in an emergency if SVM is supported + - x86/reboot: Disable SVM, not just VMX, when stopping CPUs + - x86/kprobes: Fix __recover_optprobed_insn check optimizing logic + - x86/kprobes: Fix arch_check_optimized_kprobe check within optimized_kprobe + range + - x86/microcode/amd: Remove load_microcode_amd()'s bsp parameter + - x86/microcode/AMD: Add a @cpu parameter to the reloading functions + - x86/microcode/AMD: Fix mixed steppings support + - x86/speculation: Allow enabling STIBP with legacy IBRS + - Documentation/hw-vuln: Document the interaction between IBRS and STIBP + - virt/sev-guest: Return -EIO if certificate buffer is not large enough + - brd: mark as nowait compatible + - brd: return 0/-error from brd_insert_page() + - brd: check for REQ_NOWAIT and set correct page allocation mask + - ima: fix error handling logic when file measurement failed + - ima: Align ima_file_mmap() parameters with mmap_file LSM hook + - selftests/powerpc: Fix incorrect kernel headers search path + - selftests/ftrace: Fix eprobe syntax test case to check filter support + - selftests: sched: Fix incorrect kernel headers search path + - selftests: core: Fix incorrect kernel headers search path + - selftests: pid_namespace: Fix incorrect kernel headers search path + - selftests: arm64: Fix incorrect kernel headers search path + - selftests: clone3: Fix incorrect kernel headers search path + - selftests: pidfd: Fix incorrect kernel headers search path + - selftests: membarrier: Fix incorrect kernel headers search path + - selftests: kcmp: Fix incorrect kernel headers search path + - selftests: media_tests: Fix incorrect kernel headers search path + - selftests: gpio: Fix incorrect kernel headers search path + - selftests: filesystems: Fix incorrect kernel headers search path + - selftests: user_events: Fix incorrect kernel headers search path + - selftests: ptp: Fix incorrect kernel headers search path + - selftests: sync: Fix incorrect kernel headers search path + - selftests: rseq: Fix incorrect kernel headers search path + - selftests: move_mount_set_group: Fix incorrect kernel headers search path + - selftests: mount_setattr: Fix incorrect kernel headers search path + - selftests: perf_events: Fix incorrect kernel headers search path + - selftests: ipc: Fix incorrect kernel headers search path + - selftests: futex: Fix incorrect kernel headers search path + - selftests: drivers: Fix incorrect kernel headers search path + - selftests: dmabuf-heaps: Fix incorrect kernel headers search path + - selftests: vm: Fix incorrect kernel headers search path + - selftests: seccomp: Fix incorrect kernel headers search path + - irqdomain: Fix association race + - irqdomain: Fix disassociation race + - irqdomain: Look for existing mapping only once + - irqdomain: Drop bogus fwspec-mapping error handling + - irqdomain: Refactor __irq_domain_alloc_irqs() + - irqdomain: Fix mapping-creation race + - irqdomain: Fix domain registration race + - crypto: qat - fix out-of-bounds read + - mm/damon/paddr: fix missing folio_put() + - ALSA: ice1712: Do not left ice->gpio_mutex locked in aureon_add_controls() + - ALSA: hda/realtek: Add quirk for HP EliteDesk 800 G6 Tower PC + - jbd2: fix data missing when reusing bh which is ready to be checkpointed + - ext4: optimize ea_inode block expansion + - ext4: refuse to create ea block when umounted + - cxl/pmem: Fix nvdimm registration races + - Input: exc3000 - properly stop timer on shutdown + - mtd: spi-nor: sfdp: Fix index value for SCCR dwords + - mtd: spi-nor: spansion: Consider reserved bits in CFR5 register + - dm: send just one event on resize, not two + - dm: add cond_resched() to dm_wq_work() + - dm: add cond_resched() to dm_wq_requeue_work() + - wifi: rtw88: use RTW_FLAG_POWERON flag to prevent to power on/off twice + - wifi: rtl8xxxu: Use a longer retry limit of 48 + - wifi: ath11k: allow system suspend to survive ath11k + - wifi: cfg80211: Fix use after free for wext + - wifi: cfg80211: Set SSID if it is not already set + - cpuidle: add ARCH_SUSPEND_POSSIBLE dependencies + - qede: fix interrupt coalescing configuration + - thermal: intel: powerclamp: Fix cur_state for multi package system + - dm flakey: fix logic when corrupting a bio + - dm cache: free background tracker's queued work in btracker_destroy + - dm flakey: don't corrupt the zero page + - dm flakey: fix a bug with 32-bit highmem systems + - hwmon: (peci/cputemp) Fix off-by-one in coretemp_label allocation + - hwmon: (nct6775) Fix incorrect parenthesization in nct6775_write_fan_div() + - spi: intel: Check number of chip selects after reading the descriptor + - ARM: dts: qcom: sdx65: Add Qcom SMMU-500 as the fallback for IOMMU node + - ARM: dts: qcom: sdx55: Add Qcom SMMU-500 as the fallback for IOMMU node + - ARM: dts: exynos: correct TMU phandle in Exynos4210 + - ARM: dts: exynos: correct TMU phandle in Exynos4 + - ARM: dts: exynos: correct TMU phandle in Odroid XU3 family + - ARM: dts: exynos: correct TMU phandle in Exynos5250 + - ARM: dts: exynos: correct TMU phandle in Odroid XU + - ARM: dts: exynos: correct TMU phandle in Odroid HC1 + - arm64: acpi: Fix possible memory leak of ffh_ctxt + - arm64: mm: hugetlb: Disable HUGETLB_PAGE_OPTIMIZE_VMEMMAP + - arm64: Reset KASAN tag in copy_highpage with HW tags only + - fuse: add inode/permission checks to fileattr_get/fileattr_set + - rbd: avoid use-after-free in do_rbd_add() when rbd_dev_create() fails + - ceph: update the time stamps and try to drop the suid/sgid + - regulator: core: Use ktime_get_boottime() to determine how long a regulator + was off + - panic: fix the panic_print NMI backtrace setting + - mm/hwpoison: convert TTU_IGNORE_HWPOISON to TTU_HWPOISON + - genirq/msi, platform-msi: Ensure that MSI descriptors are unreferenced + - genirq/msi: Take the per-device MSI lock before validating the control + structure + - spi: spi-sn-f-ospi: fix duplicate flag while assigning to mode_bits + - alpha: fix FEN fault handling + - dax/kmem: Fix leak of memory-hotplug resources + - mips: fix syscall_get_nr + - media: ipu3-cio2: Fix PM runtime usage_count in driver unbind + - remoteproc/mtk_scp: Move clk ops outside send_lock + - vfio: Fix NULL pointer dereference caused by uninitialized group->iommufd + - docs: gdbmacros: print newest record + - mm: memcontrol: deprecate charge moving + - mm/thp: check and bail out if page in deferred queue already + - ktest.pl: Give back console on Ctrt^C on monitor + - kprobes: Fix to handle forcibly unoptimized kprobes on freeing_list + - ktest.pl: Fix missing "end_monitor" when machine check fails + - ktest.pl: Add RUN_TIMEOUT option with default unlimited + - memory tier: release the new_memtier in find_create_memory_tier() + - ring-buffer: Handle race between rb_move_tail and rb_check_pages + - tools/bootconfig: fix single & used for logical condition + - tracing/eprobe: Fix to add filter on eprobe description in README file + - iommu/amd: Add a length limitation for the ivrs_acpihid command-line + parameter + - scsi: aacraid: Allocate cmd_priv with scsicmd + - scsi: qla2xxx: Fix link failure in NPIV environment + - scsi: qla2xxx: Check if port is online before sending ELS + - scsi: qla2xxx: Fix DMA-API call trace on NVMe LS requests + - scsi: qla2xxx: Remove unintended flag clearing + - scsi: qla2xxx: Fix erroneous link down + - scsi: qla2xxx: Remove increment of interface err cnt + - scsi: ses: Don't attach if enclosure has no components + - scsi: ses: Fix slab-out-of-bounds in ses_enclosure_data_process() + - scsi: ses: Fix possible addl_desc_ptr out-of-bounds accesses + - scsi: ses: Fix possible desc_ptr out-of-bounds accesses + - scsi: ses: Fix slab-out-of-bounds in ses_intf_remove() + - RISC-V: add a spin_shadow_stack declaration + - riscv: Avoid enabling interrupts in die() + - riscv: mm: fix regression due to update_mmu_cache change + - riscv: jump_label: Fixup unaligned arch_static_branch function + - riscv: ftrace: Fixup panic by disabling preemption + - riscv, mm: Perform BPF exhandler fixup on page fault + - riscv: ftrace: Remove wasted nops for !RISCV_ISA_C + - riscv: ftrace: Reduce the detour code size to half + - MIPS: DTS: CI20: fix otg power gpio + - PCI/PM: Observe reset delay irrespective of bridge_d3 + - PCI: Unify delay handling for reset and resume + - PCI: hotplug: Allow marking devices as disconnected during bind/unbind + - PCI: Avoid FLR for AMD FCH AHCI adapters + - PCI/DPC: Await readiness of secondary bus after reset + - bus: mhi: ep: Only send -ENOTCONN status if client driver is available + - bus: mhi: ep: Move chan->lock to the start of processing queued ch ring + - bus: mhi: ep: Save channel state locally during suspend and resume + - iommufd: Make sure to zero vfio_iommu_type1_info before copying to user + - iommufd: Do not add the same hwpt to the ioas->hwpt_list twice + - iommu/vt-d: Avoid superfluous IOTLB tracking in lazy mode + - iommu/vt-d: Fix PASID directory pointer coherency + - vfio/type1: exclude mdevs from VFIO_UPDATE_VADDR + - vfio/type1: prevent underflow of locked_vm via exec() + - vfio/type1: track locked_vm per dma + - vfio/type1: restore locked_vm + - drm/amd: Fix initialization for nbio 7.5.1 + - drm/i915/quirks: Add inverted backlight quirk for HP 14-r206nv + - drm/radeon: Fix eDP for single-display iMac11,2 + - drm/i915: Don't use stolen memory for ring buffers with LLC + - drm/i915: Don't use BAR mappings for ring buffers with LLC + - drm/gud: Fix UBSAN warning + - drm/edid: fix AVI infoframe aspect ratio handling + - drm/edid: fix parsing of 3D modes from HDMI VSDB + - qede: avoid uninitialized entries in coal_entry array + - brd: use radix_tree_maybe_preload instead of radix_tree_preload + - net: avoid double iput when sock_alloc_file fails + - Linux 6.2.3 + * Miscellaneous Ubuntu changes + - [Config] update annotations after applying 6.2.3 stable patches + - [Config] update annotations after applying 6.2.6 stable patches + + -- Andrea Righi Thu, 06 Apr 2023 10:44:29 +0200 + +linux-azure (6.2.0-1002.2) lunar; urgency=medium + + * lunar/linux-azure: 6.2.0-1002.2 -proposed tracker (LP: #2011602) + + * Miscellaneous upstream changes + - Revert "UBUNTU: SAUCE: azure: x86/hyperv: Make swiotlb bounce buffer + allocation not just from low pages" + + -- Paolo Pisati Tue, 14 Mar 2023 17:30:00 +0100 + +linux-azure (6.2.0-1001.1) lunar; urgency=medium + + * lunar/linux-azure: 6.2.0-1001.1 -proposed tracker (LP: #2011577) + + * Azure: Performance improvement for TDX (LP: #2004090) + - SAUCE: clocksource: hyper-v: Use Invariant-TSC even if hv_read_tsc_page is + hidden + + * Azure: Fix TDX backport (LP: #2004087) + - SAUCE: TDX: Fixed botched backport + + * Azure: TDX enabled hyper-visors cause segfault (LP: #2003714) + - SAUCE: TDX: Work around the segfault issue in glibc 2.35 in Ubuntu 22.04. + + * Kinetic linux-azure - Enable TDX guest driver w/MSFT Hyper-v (LP: #2002658) + - SAUCE: tdx: enable DEBUG: tools/testing/selftests/tdx/tdx_guest_test.c + - SAUCE: tdx: swiotlb: check set_memory_decrypted()'s return value + - SAUCE: tdx: x86/sev: mem_encrypt_free_decrypted_mem(): encrypt the pages for + AMD SME only + - SAUCE: tdx: x86/hyperv: Do not run swiotlb_update_mem_attributes() in + hyperv_init() + - SAUCE: tdx: x86/tdx: Retry TDVMCALL_MAP_GPA() when needed + - SAUCE: tdx: x86/tdx: Support vmalloc() for tdx_enc_status_changed() + - SAUCE: tdx: x86/hyperv: Add hv_isolation_type_tdx() to detect TDX guests + - SAUCE: tdx: x86/tdx: Expand __tdx_hypercall() to handle more arguments + - SAUCE: tdx: x86/hyperv: Support hypercalls for TDX guests + - SAUCE: tdx: Drivers: hv: vmbus: Support TDX guests + - SAUCE: tdx: x86/hyperv: Fix serial console interrupts for TDX guests + - SAUCE: tdx: Drivers: hv: vmbus:: Fix the ARM64 build caused by recent TDX + patches + + * remove circular dep between linux-image and modules (LP: #1989334) + - [Packaging] remove circular dep between modules and image + + * enable Rust support in the kernel (LP: #2007654) + - [Packaging] azure: add rust dependencies + + * Packaging resync (LP: #1786013) + - [Packaging] update update.conf + + * Miscellaneous Ubuntu changes + - [Config] updateconfigs following 6.2 rebase + - move to 6.2 series + - [packaging] manually remove ipu6 and ivsc DKMS entries + - [Packaging] add python3 as a build dependency + + * Miscellaneous upstream changes + - Revert "x86/hyper-v: Add hyperv Isolation VM check in the cc_platform_has()" + + -- Paolo Pisati Tue, 14 Mar 2023 16:03:17 +0100 + +linux-azure (6.1.0-1001.1) lunar; urgency=medium + + * lunar/linux-azure: 6.1.0-1001.1 -proposed tracker (LP: #1998336) + + * Packaging resync (LP: #1786013) + - [Packaging] update update.conf + + * Jammy/linux-azure: CONFIG_BLK_DEV_FD=n (LP: #1972017) + - [Config] azure: CONFIG_BLK_DEV_FD=n + + * Miscellaneous Ubuntu changes + - [Packaging] switch to lunar and linux 6.1.0 + - [Config] updateconfigs following unstable rebase + - [Config] migrateconfigs to annotations + + -- Andrea Righi Wed, 30 Nov 2022 15:35:16 +0100 + +linux-azure (6.1.0-1000.0) lunar; urgency=medium + + * Dummy entry + + -- Andrea Righi Wed, 30 Nov 2022 14:27:11 +0100 + +linux-azure (5.19.0-1008.8) kinetic; urgency=medium + + * kinetic/linux-azure: 5.19.0-1008.8 -proposed tracker (LP: #1992743) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + + * Miscellaneous Ubuntu changes + - [Config] updateconfigs following Ubuntu-5.19.0-21.21 rebase + + -- Paolo Pisati Thu, 13 Oct 2022 11:47:13 +0200 + +linux-azure (5.19.0-1007.7) kinetic; urgency=medium + + * kinetic/linux-azure: 5.19.0-1007.7 -proposed tracker (LP: #1991264) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + + * Miscellaneous Ubuntu changes + - [Config] do_enforce_all=true + - [Config] updateconfigs following Ubuntu-5.19.0-19.19 rebase + + -- Paolo Pisati Mon, 03 Oct 2022 10:02:55 +0200 + +linux-azure (5.19.0-1006.6) kinetic; urgency=medium + + * kinetic/linux-azure: 5.19.0-1006.6 -proposed tracker (LP: #1990493) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + + * Miscellaneous Ubuntu changes + - [Packaging] fix changelog entry + - [Config] updateconfigs following Ubuntu-5.19.0-18.18 rebase + + -- Paolo Pisati Thu, 22 Sep 2022 18:44:00 +0200 + +linux-azure (5.19.0-1005.5) kinetic; urgency=medium + + * kinetic/linux-azure: 5.19.0-1005.5 -proposed tracker (LP: #1988717) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + + * azure: Replace hyperv_fb with hyperv_drm (LP: #1986713) + - [Packaging] azure: Include hyperv_drm, exclude hyperv_fb from linux-modules + + * azure-5.15: Remove circular dependency on linux-modules and linux-image + (LP: #1987294) + - [Packaging] azure-5.15: Remove circular package dependencies + + * Miscellaneous Ubuntu changes + - [Config] updateconfigs following Ubuntu-5.19.0-16.16 rebase + + * Miscellaneous upstream changes + - skip ABI and modules checks + + -- Paolo Pisati Tue, 06 Sep 2022 13:41:31 +0200 + +linux-azure (5.19.0-1004.4) kinetic; urgency=medium + + * kinetic/linux-azure: 5.19.0-1004.4 -proposed tracker (LP: #1983442) + + * Miscellaneous Ubuntu changes + - [Config] updateconfigs following Ubuntu-5.19.0-15.15 rebase + + -- Paolo Pisati Wed, 03 Aug 2022 14:59:40 +0200 + +linux-azure (5.19.0-1003.3) kinetic; urgency=medium + + * kinetic/linux-azure: 5.19.0-1003.3 -proposed tracker (LP: #1983078) + + -- Paolo Pisati Fri, 29 Jul 2022 10:02:46 +0200 + +linux-azure (5.19.0-1002.2) kinetic; urgency=medium + + * kinetic/linux-azure: 5.19.0-1002.2 -proposed tracker (LP: #1982805) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + + * [22.10] ARM64 test failures (LP: #1980981) + - [Config] azure: arm64 CONFIG_HIBERNATION=y + + * Azure: Add the Linux MANA PF driver (LP: #1980766) + - net: mana: Add the Linux MANA PF driver + + * Miscellaneous Ubuntu changes + - [Config] updateconfigs following Ubuntu-5.19.0-12.12 rebase + + -- Paolo Pisati Tue, 26 Jul 2022 18:00:13 +0200 + +linux-azure (5.19.0-1001.1) kinetic; urgency=medium + + * kinetic/linux-azure: 5.19.0-1001.1 -proposed tracker (LP: #1980066) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + + * Azure: not enough RAM under 4GB for CVM (LP: #1967166) + - SAUCE: azure: Swiotlb: Add swiotlb_alloc_from_low_pages switch + - SAUCE: azure: x86/hyperv: Make swiotlb bounce buffer allocation not just + from low pages + + * Miscellaneous Ubuntu changes + - [Packaging] switch to kinetic 5.19.0 + - [Config] updateconfigs and annotations following 5.19.0-7.7 rebase + + -- Paolo Pisati Thu, 30 Jun 2022 13:37:49 +0200 + +linux-azure (5.19.0-1000.0) kinetic; urgency=medium + + * Dummy entry + + -- Paolo Pisati Thu, 30 Jun 2022 13:18:21 +0200 + +linux-azure (5.18.0-1001.1) kinetic; urgency=medium + + * kinetic/linux-azure: 5.18.0-1001.1 -proposed tracker (LP: #1975964) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/2022.05.30) + + * Miscellaneous Ubuntu changes + - [Packaging] move to kinetic 5.18 + - [Config] updateocnfigs and annotations following 5.18.0-6.6 rebase + - SAUCE: fscache: fixup missing return value + - [Config] FTBFS: disable HYPERV_AZURE_BLOB + + -- Paolo Pisati Wed, 08 Jun 2022 14:54:20 +0200 + +linux-azure (5.18.0-1000.0) kinetic; urgency=medium + + * Dummy entry + + -- Paolo Pisati Wed, 08 Jun 2022 11:37:31 +0200 + +linux-azure (5.15.0-1003.4) jammy; urgency=medium + + * jammy/linux-azure: 5.15.0-1003.4 -proposed tracker (LP: #1966481) + + * Azure: not enough RAM under 4GB for CVM (LP: #1967166) + - SAUCE: azure: Swiotlb: Add swiotlb_alloc_from_low_pages switch + - SAUCE: azure: x86/hyperv: Make swiotlb bounce buffer allocation not just + from low pages + + * linux-azure: arm64 network performance improvement (LP: #1966098) + - SAUCE: azure: ACPI: scan: Export acpi_get_dma_attr() + - SAUCE: azure: dma-mapping: Add wrapper function to set dma_coherent + - SAUCE: azure: Drivers: hv: vmbus: Propagate VMbus coherence to each VMbus + device + - SAUCE: azure: PCI: hv: Propagate coherence from VMbus device to PCI device + + [ Ubuntu: 5.15.0-25.25 ] + + * jammy/linux: 5.15.0-25.25 -proposed tracker (LP: #1967146) + * Miscellaneous Ubuntu changes + - SAUCE: Revert "scsi: core: Reallocate device's budget map on queue depth + change" + + [ Ubuntu: 5.15.0-24.24 ] + + * jammy/linux: 5.15.0-24.24 -proposed tracker (LP: #1966305) + * Update OS policy capability handshake (LP: #1966089) + - thermal: int340x: Update OS policy capability handshake + * Jammy update: v5.15.30 upstream stable release (LP: #1966057) + - Revert "xfrm: state and policy should fail if XFRMA_IF_ID 0" + - arm64: dts: rockchip: fix rk3399-puma-haikou USB OTG mode + - xfrm: Check if_id in xfrm_migrate + - xfrm: Fix xfrm migrate issues when address family changes + - arm64: dts: rockchip: fix rk3399-puma eMMC HS400 signal integrity + - arm64: dts: rockchip: align pl330 node name with dtschema + - arm64: dts: rockchip: reorder rk3399 hdmi clocks + - arm64: dts: agilex: use the compatible "intel,socfpga-agilex-hsotg" + - ARM: dts: rockchip: reorder rk322x hmdi clocks + - ARM: dts: rockchip: fix a typo on rk3288 crypto-controller + - mac80211: refuse aggregations sessions before authorized + - MIPS: smp: fill in sibling and core maps earlier + - ARM: 9178/1: fix unmet dependency on BITREVERSE for HAVE_ARCH_BITREVERSE + - Bluetooth: hci_core: Fix leaking sent_cmd skb + - can: rcar_canfd: rcar_canfd_channel_probe(): register the CAN device when + fully ready + - atm: firestream: check the return value of ioremap() in fs_init() + - iwlwifi: don't advertise TWT support + - drm/vrr: Set VRR capable prop only if it is attached to connector + - nl80211: Update bss channel on channel switch for P2P_CLIENT + - tcp: make tcp_read_sock() more robust + - sfc: extend the locking on mcdi->seqno + - bnx2: Fix an error message + - kselftest/vm: fix tests build with old libc + - x86/module: Fix the paravirt vs alternative order + - ice: Fix race condition during interface enslave + - Linux 5.15.30 + * Jammy update: v5.15.29 upstream stable release (LP: #1966056) + - arm64: dts: qcom: sm8350: Describe GCC dependency clocks + - arm64: dts: qcom: sm8350: Correct UFS symbol clocks + - HID: elo: Revert USB reference counting + - HID: hid-thrustmaster: fix OOB read in thrustmaster_interrupts + - ARM: boot: dts: bcm2711: Fix HVS register range + - clk: qcom: gdsc: Add support to update GDSC transition delay + - clk: qcom: dispcc: Update the transition delay for MDSS GDSC + - HID: vivaldi: fix sysfs attributes leak + - arm64: dts: armada-3720-turris-mox: Add missing ethernet0 alias + - tipc: fix kernel panic when enabling bearer + - vdpa/mlx5: add validation for VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET command + - vduse: Fix returning wrong type in vduse_domain_alloc_iova() + - net: phy: meson-gxl: fix interrupt handling in forced mode + - mISDN: Fix memory leak in dsp_pipeline_build() + - vhost: fix hung thread due to erroneous iotlb entries + - virtio-blk: Don't use MAX_DISCARD_SEGMENTS if max_discard_seg is zero + - vdpa: fix use-after-free on vp_vdpa_remove + - isdn: hfcpci: check the return value of dma_set_mask() in setup_hw() + - net: qlogic: check the return value of dma_alloc_coherent() in + qed_vf_hw_prepare() + - esp: Fix possible buffer overflow in ESP transformation + - esp: Fix BEET mode inter address family tunneling on GSO + - qed: return status of qed_iov_get_link + - smsc95xx: Ignore -ENODEV errors when device is unplugged + - gpiolib: acpi: Convert ACPI value of debounce to microseconds + - drm/sun4i: mixer: Fix P010 and P210 format numbers + - net: dsa: mt7530: fix incorrect test in mt753x_phylink_validate() + - ARM: dts: aspeed: Fix AST2600 quad spi group + - iavf: Fix handling of vlan strip virtual channel messages + - i40e: stop disabling VFs due to PF error responses + - ice: stop disabling VFs due to PF error responses + - ice: Fix error with handling of bonding MTU + - ice: Don't use GFP_KERNEL in atomic context + - ice: Fix curr_link_speed advertised speed + - ethernet: Fix error handling in xemaclite_of_probe + - tipc: fix incorrect order of state message data sanity check + - net: ethernet: ti: cpts: Handle error for clk_enable + - net: ethernet: lpc_eth: Handle error for clk_enable + - net: marvell: prestera: Add missing of_node_put() in + prestera_switch_set_base_mac_addr + - ax25: Fix NULL pointer dereference in ax25_kill_by_device + - net/mlx5: Fix size field in bufferx_reg struct + - net/mlx5: Fix a race on command flush flow + - net/mlx5e: Lag, Only handle events from highest priority multipath entry + - NFC: port100: fix use-after-free in port100_send_complete + - selftests: pmtu.sh: Kill tcpdump processes launched by subshell. + - selftests: pmtu.sh: Kill nettest processes launched in subshell. + - gpio: ts4900: Do not set DAT and OE together + - gianfar: ethtool: Fix refcount leak in gfar_get_ts_info + - net: phy: DP83822: clear MISR2 register to disable interrupts + - sctp: fix kernel-infoleak for SCTP sockets + - net: bcmgenet: Don't claim WOL when its not available + - net: phy: meson-gxl: improve link-up behavior + - selftests/bpf: Add test for bpf_timer overwriting crash + - swiotlb: fix info leak with DMA_FROM_DEVICE + - usb: dwc3: pci: add support for the Intel Raptor Lake-S + - pinctrl: tigerlake: Revert "Add Alder Lake-M ACPI ID" + - KVM: Fix lockdep false negative during host resume + - kvm: x86: Disable KVM_HC_CLOCK_PAIRING if tsc is in always catchup mode + - spi: rockchip: Fix error in getting num-cs property + - spi: rockchip: terminate dma transmission when slave abort + - drm/vc4: hdmi: Unregister codec device on unbind + - x86/kvm: Don't use pv tlb/ipi/sched_yield if on 1 vCPU + - net-sysfs: add check for netdevice being present to speed_show + - hwmon: (pmbus) Clear pmbus fault/warning bits after read + - PCI: Mark all AMD Navi10 and Navi14 GPU ATS as broken + - gpio: Return EPROBE_DEFER if gc->to_irq is NULL + - drm/amdgpu: bypass tiling flag check in virtual display case (v2) + - Revert "xen-netback: remove 'hotplug-status' once it has served its purpose" + - Revert "xen-netback: Check for hotplug-status existence before watching" + - ipv6: prevent a possible race condition with lifetimes + - tracing: Ensure trace buffer is at least 4096 bytes large + - tracing/osnoise: Make osnoise_main to sleep for microseconds + - selftest/vm: fix map_fixed_noreplace test failure + - selftests/memfd: clean up mapping in mfd_fail_write + - ARM: Spectre-BHB: provide empty stub for non-config + - fuse: fix fileattr op failure + - fuse: fix pipe buffer lifetime for direct_io + - staging: rtl8723bs: Fix access-point mode deadlock + - staging: gdm724x: fix use after free in gdm_lte_rx() + - net: macb: Fix lost RX packet wakeup race in NAPI receive + - riscv: alternative only works on !XIP_KERNEL + - mmc: meson: Fix usage of meson_mmc_post_req() + - riscv: Fix auipc+jalr relocation range checks + - tracing/osnoise: Force quiescent states while tracing + - arm64: dts: marvell: armada-37xx: Remap IO space to bus address 0x0 + - arm64: Ensure execute-only permissions are not allowed without EPAN + - arm64: kasan: fix include error in MTE functions + - swiotlb: rework "fix info leak with DMA_FROM_DEVICE" + - KVM: x86/mmu: kvm_faultin_pfn has to return false if pfh is returned + - virtio: unexport virtio_finalize_features + - virtio: acknowledge all features before access + - net/mlx5: Fix offloading with ESWITCH_IPV4_TTL_MODIFY_ENABLE + - ARM: fix Thumb2 regression with Spectre BHB + - watch_queue: Fix filter limit check + - watch_queue, pipe: Free watchqueue state after clearing pipe ring + - watch_queue: Fix to release page in ->release() + - watch_queue: Fix to always request a pow-of-2 pipe ring size + - watch_queue: Fix the alloc bitmap size to reflect notes allocated + - watch_queue: Free the alloc bitmap when the watch_queue is torn down + - watch_queue: Fix lack of barrier/sync/lock between post and read + - watch_queue: Make comment about setting ->defunct more accurate + - x86/boot: Fix memremap of setup_indirect structures + - x86/boot: Add setup_indirect support in early_memremap_is_setup_data() + - x86/sgx: Free backing memory after faulting the enclave page + - x86/traps: Mark do_int3() NOKPROBE_SYMBOL + - drm/panel: Select DRM_DP_HELPER for DRM_PANEL_EDP + - btrfs: make send work with concurrent block group relocation + - drm/i915: Workaround broken BIOS DBUF configuration on TGL/RKL + - riscv: dts: k210: fix broken IRQs on hart1 + - block: drop unused includes in + - Revert "net: dsa: mv88e6xxx: flush switchdev FDB workqueue before removing + VLAN" + - vhost: allow batching hint without size + - Linux 5.15.29 + * Jammy update: v5.15.28 upstream stable release (LP: #1966055) + - slip: fix macro redefine warning + - ARM: fix co-processor register typo + - ARM: Do not use NOCROSSREFS directive with ld.lld + - arm64: Do not include __READ_ONCE() block in assembly files + - ARM: fix build warning in proc-v7-bugs.c + - xen/xenbus: don't let xenbus_grant_ring() remove grants in error case + - xen/grant-table: add gnttab_try_end_foreign_access() + - xen/blkfront: don't use gnttab_query_foreign_access() for mapped status + - xen/netfront: don't use gnttab_query_foreign_access() for mapped status + - xen/scsifront: don't use gnttab_query_foreign_access() for mapped status + - xen/gntalloc: don't use gnttab_query_foreign_access() + - xen: remove gnttab_query_foreign_access() + - xen/9p: use alloc/free_pages_exact() + - xen/pvcalls: use alloc/free_pages_exact() + - xen/gnttab: fix gnttab_end_foreign_access() without page specified + - xen/netfront: react properly to failing gnttab_end_foreign_access_ref() + - Revert "ACPI: PM: s2idle: Cancel wakeup before dispatching EC GPE" + - Linux 5.15.28 + * zfcpdump-kernel update to v5.15 (LP: #1965766) + - SAUCE: Audit: Fix incorrect static inline function declration. + * [22.04 FEAT] SMC-R v2 Support (LP: #1929035) + - net/smc: save stack space and allocate smc_init_info + - net/smc: prepare for SMC-Rv2 connection + - net/smc: add SMC-Rv2 connection establishment + - net/smc: add listen processing for SMC-Rv2 + - net/smc: add v2 format of CLC decline message + - net/smc: retrieve v2 gid from IB device + - net/smc: add v2 support to the work request layer + - net/smc: extend LLC layer for SMC-Rv2 + - net/smc: add netlink support for SMC-Rv2 + - net/smc: stop links when their GID is removed + - net/smc: fix kernel panic caused by race of smc_sock + - net/smc: Fix hung_task when removing SMC-R devices + * [22.04 FEAT] Transparent PCI device recovery (LP: #1959532) + - s390/pci: tolerate inconsistent handle in recover + - s390/pci: add simpler s390dbf traces for events + - s390/pci: refresh function handle in iomap + - s390/pci: implement reset_slot for hotplug slot + - PCI: Export pci_dev_lock() + - s390/pci: implement minimal PCI error recovery + * Mute/mic LEDs no function on some HP platfroms (LP: #1965080) + - ALSA: hda/realtek: fix right sounds and mute/micmute LEDs for HP machines + * [22.04 FEAT] smc: Add User-defined EID (Enterprise ID) Support - kernel + (LP: #1929060) + - net/smc: add support for user defined EIDs + - net/smc: keep static copy of system EID + - net/smc: add generic netlink support for system EID + * Rotate to 2021v1 signing key (LP: #1964990) + - [Packaging] Rotate to 2021v1 signing key + * [22.04 FEAT] zcrypt DD: Exploitation Support of new IBM Z Crypto Hardware + (kernel part) (LP: #1959547) + - s390/zcrypt: rework of debug feature messages + - s390/ap/zcrypt: debug feature improvements + - s390/zcrypt: CEX8S exploitation support + - s390/zcrypt: handle checkstopped cards with new state + - s390/zcrypt: Support CPRB minor version T7 + - s390/zcrypt: change reply buffer size offering + - s390/zcrypt: Provide target domain for EP11 cprbs to scheduling function + - s390/airq: use DMA memory for summary indicators + * [22.04 FEAT] [VS2103] Set KVM_CAP_S390_MEM_OP_EXTENSION capability to 211 + (LP: #1963901) + - SAUCE: Set KVM_CAP_S390_MEM_OP_EXTENSION capability to 211 + * dependency on crda obsolete according to Debian (LP: #1958918) + - [Packaging] switch dependency from crda to wireless-regdb + * Cirrus audio support [1028:0BB5] & [1028:0BB6] (LP: #1964748) + - ALSA: hda/cs8409: Add new Warlock SKUs to patch_cs8409 + * Miscellaneous Ubuntu changes + - [Packaging] mark dkms-build-configure--zfs executable + - [Packaging] Fix bashism in dkms-build script + - [Packaging] Always catch errors in dkms-build scripts + - [Config] toolchain version update + * Miscellaneous upstream changes + - Ubuntu: remove leftover reference to ubuntu/hio driver + - Reverting commits 61005756c824 and cdb0f8e66513 due to a conflict with + LP#1929035. Re-pick them afterwards, which will establish the upstream + commit content and order again. + - Revert "UBUNTU: [Packaging] Rotate to 2021v1 signing key" + + -- Paolo Pisati Thu, 31 Mar 2022 12:00:32 +0200 + +linux-azure (5.15.0-1002.3) jammy; urgency=medium + + * jammy/linux-azure: 5.15.0-1002.3 -proposed tracker (LP: #1965771) + + * Packaging resync (LP: #1786013) + - [Packaging] switch dependency from crda to wireless-regdb + + * linux-azure: Update HV support to 5.17 (LP: #1961329) + - x86/sev: Expose sev_es_ghcb_hv_call() for use by HyperV + - x86/hyperv: Initialize GHCB page in Isolation VM + - x86/hyperv: Initialize shared memory boundary in the Isolation VM. + - x86/hyperv: Add new hvcall guest address host visibility support + - Drivers: hv: vmbus: Mark vmbus ring buffer visible to host in Isolation VM + - x86/hyperv: Add Write/Read MSR registers via ghcb page + - x86/hyperv: Add ghcb hvcall support for SNP VM + - Drivers: hv: vmbus: Add SNP support for VMbus channel initiate message + - Drivers: hv: vmbus: Initialize VMbus ring buffer for Isolation VM + - swiotlb: Add swiotlb bounce buffer remap function for HV IVM + - x86/hyper-v: Add hyperv Isolation VM check in the cc_platform_has() + - hyper-v: Enable swiotlb bounce buffer for Isolation VM + - scsi: storvsc: Add Isolation VM support for storvsc driver + - net: netvsc: Add Isolation VM support for netvsc driver + - swiotlb: Add CONFIG_HAS_IOMEM check around swiotlb_mem_remap() + - Drivers: hv: vmbus: Initialize request offers message for Isolation VM + - scsi: storvsc: Fix storvsc_queuecommand() memory leak + - Netvsc: Call hv_unmap_memory() in the netvsc_device_remove() + - x86/sev: Replace occurrences of sev_active() with cc_platform_has() + - x86/kvm: Don't waste memory if kvmclock is disabled + - x86/kvmclock: Fix Hyper-V Isolated VM's boot issue when vCPUs > 64 + + * linux-azure: Case VM fails to initialize CX4 VF due to mem fragmentation + (LP: #1961632) + - net/mlx5: Reduce flow counters bulk query buffer size for SFs + - net/mlx5: Fix flow counters SF bulk query len + - net/mlx5: Dynamically resize flow counters query buffer + + * linux-azure: net: mana: Add handling of CQE_RX_TRUNCATED (LP: #1960322) + - net: mana: Add handling of CQE_RX_TRUNCATED + - net: mana: Remove unnecessary check of cqe_type in mana_process_rx_cqe() + + * jammy/linux-azure: CIFS 5.15 backport (LP: #1960671) + - cifs: add mount parameter tcpnodelay + - cifs: Create a new shared file holding smb2 pdu definitions + - cifs: move NEGOTIATE_PROTOCOL definitions out into the common area + - cifs: Move more definitions into the shared area + - cifs: Move SMB2_Create definitions to the shared area + - smb3: add dynamic trace points for socket connection + - cifs: send workstation name during ntlmssp session setup + - cifs: fix print of hdr_flags in dfscache_proc_show() + - cifs: introduce new helper for cifs_reconnect() + - cifs: convert list_for_each to entry variant + - cifs: split out dfs code from cifs_reconnect() + - cifs: for compound requests, use open handle if possible + - cifs: support nested dfs links over reconnect + - smb3: remove trivial dfs compile warning + - smb3: add additional null check in SMB2_ioctl + - smb3: add additional null check in SMB2_open + - smb3: add additional null check in SMB2_tcon + - cifs: release lock earlier in dequeue_mid error case + - smb3: add additional null check in SMB311_posix_mkdir + - cifs: fix potential use-after-free bugs + - smb3: do not setup the fscache_super_cookie until fsinfo initialized + - cifs: do not negotiate session if session already exists + - cifs: connect individual channel servers to primary channel server + - cifs: do not duplicate fscache cookie for secondary channels + - cifs: move debug print out of spinlock + - cifs: protect srv_count with cifs_tcp_ses_lock + - cifs: introduce cifs_ses_mark_for_reconnect() helper + - cifs: populate server_hostname for extra channels + - smb2: clarify rc initialization in smb2_reconnect + - cifs: update internal version number + - cifs: fix missed refcounting of ipc tcon + - cifs: wait for tcon resource_id before getting fscache super + - cifs: add server conn_id to fscache client cookie + - cifs: avoid use of dstaddr as key for fscache client cookie + - cifs: fix ntlmssp auth when there is no key exchange + - cifs: ignore resource_id while getting fscache super cookie + - cifs: remove redundant assignment to pointer p + - cifs: track individual channel status using chans_need_reconnect + - cifs: use the chans_need_reconnect bitmap for reconnect status + - cifs: adjust DebugData to use chans_need_reconnect for conn status + - cifs: add WARN_ON for when chan_count goes below minimum + - cifs: reconnect only the connection and not smb session where possible + - cifs: take cifs_tcp_ses_lock for status checks + - cifs: fix hang on cifs_get_next_mid() + - cifs: maintain a state machine for tcp/smb/tcon sessions + - cifs: avoid race during socket reconnect between send and recv + - cifs: Fix smb311_update_preauth_hash() kernel-doc comment + - cifs: move superblock magic defitions to magic.h + - cifs: fix FILE_BOTH_DIRECTORY_INFO definition + - cifs: free ntlmsspblob allocated in negotiate + - cifs: clean up an inconsistent indenting + - cifs: alloc_path_with_tree_prefix: do not append sep. if the path is empty + - cifs: quirk for STATUS_OBJECT_NAME_INVALID returned for non-ASCII dfs refs + - cifs: serialize all mount attempts + - smb3: add new defines from protocol specification + - cifs: check reconnects for channels of active tcons too + - cifs: fix the connection state transitions with multichannel + - cifs: protect all accesses to chan_* with chan_lock + - cifs: remove unused variable ses_selected + - cifs: fix the cifs_reconnect path for DFS + - cifs: remove repeated state change in dfs tree connect + - cifs: make status checks in version independent callers + - cifs: update tcpStatus during negotiate and sess setup + - cifs: cifs_ses_mark_for_reconnect should also update reconnect bits + - smb3: send NTLMSSP version information + - cifs: update internal module number + - Fix a warning about a malformed kernel doc comment in cifs + - cifs: unlock chan_lock before calling cifs_put_tcp_session + - cifs: fix workstation_name for multiuser mounts + + * linux-azure: Add Azure Blob driver to Ubuntu 18.04 image (LP: #1960539) + - [Config] azure: CONFIG_HYPERV_AZURE_BLOB=m + - SAUCE: azure: Drivers: hv: add Azure Blob driver + + * Miscellaneous Ubuntu changes + - [Config] azure: Sync config with master + + [ Ubuntu: 5.15.0-23.23 ] + + * jammy/linux: 5.15.0-23.23 -proposed tracker (LP: #1964573) + * Packaging resync (LP: #1786013) + - [Packaging] resync dkms-build{,--nvidia-N} from LRMv5 + - debian/dkms-versions -- update from kernel-versions (main/master) + * [22.04 FEAT] KVM: Enable GISA support for Secure Execution guests + (LP: #1959977) + - KVM: s390: pv: make use of ultravisor AIV support + * intel_iommu breaks Intel IPU6 camera: isys port open ready failed -16 + (LP: #1958004) + - SAUCE: iommu: intel-ipu: use IOMMU passthrough mode for Intel IPUs + * CVE-2022-23960 + - ARM: report Spectre v2 status through sysfs + - ARM: early traps initialisation + - ARM: use LOADADDR() to get load address of sections + - ARM: Spectre-BHB workaround + - ARM: include unprivileged BPF status in Spectre V2 reporting + - arm64: Add Neoverse-N2, Cortex-A710 CPU part definition + - arm64: Add HWCAP for self-synchronising virtual counter + - arm64: Add Cortex-X2 CPU part definition + - arm64: add ID_AA64ISAR2_EL1 sys register + - arm64: cpufeature: add HWCAP for FEAT_AFP + - arm64: cpufeature: add HWCAP for FEAT_RPRES + - arm64: entry.S: Add ventry overflow sanity checks + - arm64: spectre: Rename spectre_v4_patch_fw_mitigation_conduit + - KVM: arm64: Allow indirect vectors to be used without SPECTRE_V3A + - arm64: entry: Make the trampoline cleanup optional + - arm64: entry: Free up another register on kpti's tramp_exit path + - arm64: entry: Move the trampoline data page before the text page + - arm64: entry: Allow tramp_alias to access symbols after the 4K boundary + - arm64: entry: Don't assume tramp_vectors is the start of the vectors + - arm64: entry: Move trampoline macros out of ifdef'd section + - arm64: entry: Make the kpti trampoline's kpti sequence optional + - arm64: entry: Allow the trampoline text to occupy multiple pages + - arm64: entry: Add non-kpti __bp_harden_el1_vectors for mitigations + - arm64: entry: Add vectors that have the bhb mitigation sequences + - arm64: entry: Add macro for reading symbol addresses from the trampoline + - arm64: Add percpu vectors for EL1 + - arm64: proton-pack: Report Spectre-BHB vulnerabilities as part of Spectre-v2 + - arm64: Mitigate spectre style branch history side channels + - KVM: arm64: Allow SMCCC_ARCH_WORKAROUND_3 to be discovered and migrated + - arm64: Use the clearbhb instruction in mitigations + - arm64: proton-pack: Include unprivileged eBPF status in Spectre v2 + mitigation reporting + - ARM: fix build error when BPF_SYSCALL is disabled + * CVE-2021-26401 + - x86/speculation: Use generic retpoline by default on AMD + - x86/speculation: Update link to AMD speculation whitepaper + - x86/speculation: Warn about Spectre v2 LFENCE mitigation + - x86/speculation: Warn about eIBRS + LFENCE + Unprivileged eBPF + SMT + * CVE-2022-0001 + - x86,bugs: Unconditionally allow spectre_v2=retpoline,amd + - x86/speculation: Rename RETPOLINE_AMD to RETPOLINE_LFENCE + - x86/speculation: Add eIBRS + Retpoline options + - Documentation/hw-vuln: Update spectre doc + - x86/speculation: Include unprivileged eBPF status in Spectre v2 mitigation + reporting + * Jammy update: v5.15.27 upstream stable release (LP: #1964361) + - mac80211_hwsim: report NOACK frames in tx_status + - mac80211_hwsim: initialize ieee80211_tx_info at hw_scan_work + - i2c: bcm2835: Avoid clock stretching timeouts + - ASoC: rt5668: do not block workqueue if card is unbound + - ASoC: rt5682: do not block workqueue if card is unbound + - regulator: core: fix false positive in regulator_late_cleanup() + - Input: clear BTN_RIGHT/MIDDLE on buttonpads + - btrfs: get rid of warning on transaction commit when using flushoncommit + - KVM: arm64: vgic: Read HW interrupt pending state from the HW + - block: loop:use kstatfs.f_bsize of backing file to set discard granularity + - tipc: fix a bit overflow in tipc_crypto_key_rcv() + - cifs: do not use uninitialized data in the owner/group sid + - cifs: fix double free race when mount fails in cifs_get_root() + - cifs: modefromsids must add an ACE for authenticated users + - selftests/seccomp: Fix seccomp failure by adding missing headers + - drm/amd/pm: correct UMD pstate clocks for Dimgrey Cavefish and Beige Goby + - dmaengine: shdma: Fix runtime PM imbalance on error + - i2c: cadence: allow COMPILE_TEST + - i2c: imx: allow COMPILE_TEST + - i2c: qup: allow COMPILE_TEST + - net: usb: cdc_mbim: avoid altsetting toggling for Telit FN990 + - block-map: add __GFP_ZERO flag for alloc_page in function bio_copy_kern + - usb: gadget: don't release an existing dev->buf + - usb: gadget: clear related members when goto fail + - exfat: reuse exfat_inode_info variable instead of calling EXFAT_I() + - exfat: fix i_blocks for files truncated over 4 GiB + - tracing: Add test for user space strings when filtering on string pointers + - arm64: Mark start_backtrace() notrace and NOKPROBE_SYMBOL + - serial: stm32: prevent TDR register overwrite when sending x_char + - ext4: drop ineligible txn start stop APIs + - ext4: simplify updating of fast commit stats + - ext4: fast commit may not fallback for ineligible commit + - ext4: fast commit may miss file actions + - sched/fair: Fix fault in reweight_entity + - ata: pata_hpt37x: fix PCI clock detection + - drm/amdgpu: check vm ready by amdgpu_vm->evicting flag + - tracing: Add ustring operation to filtering string pointers + - ipv6: fix skb drops in igmp6_event_query() and igmp6_event_report() + - NFSD: Have legacy NFSD WRITE decoders use xdr_stream_subsegment() + - NFSD: Fix zero-length NFSv3 WRITEs + - io_uring: fix no lock protection for ctx->cq_extra + - tools/resolve_btf_ids: Close ELF file on error + - mtd: spi-nor: Fix mtd size for s3an flashes + - MIPS: fix local_{add,sub}_return on MIPS64 + - signal: In get_signal test for signal_group_exit every time through the loop + - PCI: mediatek-gen3: Disable DVFSRC voltage request + - PCI: rcar: Check if device is runtime suspended instead of + __clk_is_enabled() + - PCI: dwc: Do not remap invalid res + - PCI: aardvark: Fix checking for MEM resource type + - KVM: VMX: Don't unblock vCPU w/ Posted IRQ if IRQs are disabled in guest + - KVM: s390: Ensure kvm_arch_no_poll() is read once when blocking vCPU + - KVM: VMX: Read Posted Interrupt "control" exactly once per loop iteration + - KVM: X86: Ensure that dirty PDPTRs are loaded + - KVM: x86: Handle 32-bit wrap of EIP for EMULTYPE_SKIP with flat code seg + - KVM: x86: Exit to userspace if emulation prepared a completion callback + - i3c: fix incorrect address slot lookup on 64-bit + - i3c/master/mipi-i3c-hci: Fix a potentially infinite loop in + 'hci_dat_v1_get_index()' + - tracing: Do not let synth_events block other dyn_event systems during create + - Input: ti_am335x_tsc - set ADCREFM for X configuration + - Input: ti_am335x_tsc - fix STEPCONFIG setup for Z2 + - PCI: mvebu: Check for errors from pci_bridge_emul_init() call + - PCI: mvebu: Do not modify PCI IO type bits in conf_write + - PCI: mvebu: Fix support for bus mastering and PCI_COMMAND on emulated bridge + - PCI: mvebu: Fix configuring secondary bus of PCIe Root Port via emulated + bridge + - PCI: mvebu: Setup PCIe controller to Root Complex mode + - PCI: mvebu: Fix support for PCI_BRIDGE_CTL_BUS_RESET on emulated bridge + - PCI: mvebu: Fix support for PCI_EXP_DEVCTL on emulated bridge + - PCI: mvebu: Fix support for PCI_EXP_RTSTA on emulated bridge + - PCI: mvebu: Fix support for DEVCAP2, DEVCTL2 and LNKCTL2 registers on + emulated bridge + - NFSD: Fix verifier returned in stable WRITEs + - Revert "nfsd: skip some unnecessary stats in the v4 case" + - nfsd: fix crash on COPY_NOTIFY with special stateid + - x86/hyperv: Properly deal with empty cpumasks in hyperv_flush_tlb_multi() + - drm/i915: don't call free_mmap_offset when purging + - SUNRPC: Fix sockaddr handling in the svc_xprt_create_error trace point + - SUNRPC: Fix sockaddr handling in svcsock_accept_class trace points + - drm/sun4i: dw-hdmi: Fix missing put_device() call in sun8i_hdmi_phy_get + - drm/atomic: Check new_crtc_state->active to determine if CRTC needs disable + in self refresh mode + - ntb_hw_switchtec: Fix pff ioread to read into mmio_part_cfg_all + - ntb_hw_switchtec: Fix bug with more than 32 partitions + - drm/amdkfd: Check for null pointer after calling kmemdup + - drm/amdgpu: use spin_lock_irqsave to avoid deadlock by local interrupt + - i3c: master: dw: check return of dw_i3c_master_get_free_pos() + - dma-buf: cma_heap: Fix mutex locking section + - tracing/uprobes: Check the return value of kstrdup() for tu->filename + - tracing/probes: check the return value of kstrndup() for pbuf + - mm: defer kmemleak object creation of module_alloc() + - kasan: fix quarantine conflicting with init_on_free + - selftests/vm: make charge_reserved_hugetlb.sh work with existing cgroup + setting + - hugetlbfs: fix off-by-one error in hugetlb_vmdelete_list() + - drm/amdgpu/display: Only set vblank_disable_immediate when PSR is not + enabled + - drm/amdgpu: filter out radeon PCI device IDs + - drm/amdgpu: filter out radeon secondary ids as well + - drm/amd/display: Use adjusted DCN301 watermarks + - drm/amd/display: move FPU associated DSC code to DML folder + - ethtool: Fix link extended state for big endian + - octeontx2-af: Optimize KPU1 processing for variable-length headers + - octeontx2-af: Reset PTP config in FLR handler + - octeontx2-af: cn10k: RPM hardware timestamp configuration + - octeontx2-af: cn10k: Use appropriate register for LMAC enable + - octeontx2-af: Adjust LA pointer for cpt parse header + - octeontx2-af: Add KPU changes to parse NGIO as separate layer + - net/mlx5e: IPsec: Refactor checksum code in tx data path + - net/mlx5e: IPsec: Fix crypto offload for non TCP/UDP encapsulated traffic + - bpf: Use u64_stats_t in struct bpf_prog_stats + - bpf: Fix possible race in inc_misses_counter + - drm/amd/display: Update watermark values for DCN301 + - drm: mxsfb: Set fallback bus format when the bridge doesn't provide one + - drm: mxsfb: Fix NULL pointer dereference + - riscv/mm: Add XIP_FIXUP for phys_ram_base + - drm/i915/display: split out dpt out of intel_display.c + - drm/i915/display: Move DRRS code its own file + - drm/i915: Disable DRRS on IVB/HSW port != A + - gve: Recording rx queue before sending to napi + - net: dsa: ocelot: seville: utilize of_mdiobus_register + - net: dsa: seville: register the mdiobus under devres + - ibmvnic: don't release napi in __ibmvnic_open() + - of: net: move of_net under net/ + - net: ethernet: litex: Add the dependency on HAS_IOMEM + - drm/mediatek: mtk_dsi: Reset the dsi0 hardware + - cifs: protect session channel fields with chan_lock + - cifs: fix confusing unneeded warning message on smb2.1 and earlier + - drm/amd/display: Fix stream->link_enc unassigned during stream removal + - bnxt_en: Fix occasional ethtool -t loopback test failures + - drm/amd/display: For vblank_disable_immediate, check PSR is really used + - PCI: mvebu: Fix device enumeration regression + - net: of: fix stub of_net helpers for CONFIG_NET=n + - ALSA: intel_hdmi: Fix reference to PCM buffer address + - ucounts: Fix systemd LimitNPROC with private users regression + - riscv/efi_stub: Fix get_boot_hartid_from_fdt() return value + - riscv: Fix config KASAN && SPARSEMEM && !SPARSE_VMEMMAP + - riscv: Fix config KASAN && DEBUG_VIRTUAL + - iwlwifi: mvm: check debugfs_dir ptr before use + - ASoC: ops: Shift tested values in snd_soc_put_volsw() by +min + - iommu/vt-d: Fix double list_add when enabling VMD in scalable mode + - iommu/amd: Recover from event log overflow + - drm/i915: s/JSP2/ICP2/ PCH + - drm/amd/display: Reduce dmesg error to a debug print + - xen/netfront: destroy queues before real_num_tx_queues is zeroed + - thermal: core: Fix TZ_GET_TRIP NULL pointer dereference + - mac80211: fix EAPoL rekey fail in 802.3 rx path + - blktrace: fix use after free for struct blk_trace + - ntb: intel: fix port config status offset for SPR + - mm: Consider __GFP_NOWARN flag for oversized kvmalloc() calls + - xfrm: fix MTU regression + - netfilter: fix use-after-free in __nf_register_net_hook() + - bpf, sockmap: Do not ignore orig_len parameter + - xfrm: fix the if_id check in changelink + - xfrm: enforce validity of offload input flags + - e1000e: Correct NVM checksum verification flow + - net: fix up skbs delta_truesize in UDP GRO frag_list + - netfilter: nf_queue: don't assume sk is full socket + - netfilter: nf_queue: fix possible use-after-free + - netfilter: nf_queue: handle socket prefetch + - batman-adv: Request iflink once in batadv-on-batadv check + - batman-adv: Request iflink once in batadv_get_real_netdevice + - batman-adv: Don't expect inter-netns unique iflink indices + - net: ipv6: ensure we call ipv6_mc_down() at most once + - net: dcb: flush lingering app table entries for unregistered devices + - net: ipa: add an interconnect dependency + - net/smc: fix connection leak + - net/smc: fix unexpected SMC_CLC_DECL_ERR_REGRMB error generated by client + - net/smc: fix unexpected SMC_CLC_DECL_ERR_REGRMB error cause by server + - btrfs: fix ENOSPC failure when attempting direct IO write into NOCOW range + - mac80211: fix forwarded mesh frames AC & queue selection + - net: stmmac: fix return value of __setup handler + - mac80211: treat some SAE auth steps as final + - iavf: Fix missing check for running netdev + - net: sxgbe: fix return value of __setup handler + - ibmvnic: register netdev after init of adapter + - net: arcnet: com20020: Fix null-ptr-deref in com20020pci_probe() + - ixgbe: xsk: change !netif_carrier_ok() handling in ixgbe_xmit_zc() + - iavf: Fix deadlock in iavf_reset_task + - efivars: Respect "block" flag in efivar_entry_set_safe() + - auxdisplay: lcd2s: Fix lcd2s_redefine_char() feature + - firmware: arm_scmi: Remove space in MODULE_ALIAS name + - ASoC: cs4265: Fix the duplicated control name + - auxdisplay: lcd2s: Fix memory leak in ->remove() + - auxdisplay: lcd2s: Use proper API to free the instance of charlcd object + - can: gs_usb: change active_channels's type from atomic_t to u8 + - iommu/tegra-smmu: Fix missing put_device() call in tegra_smmu_find + - arm64: dts: rockchip: Switch RK3399-Gru DP to SPDIF output + - igc: igc_read_phy_reg_gpy: drop premature return + - ARM: Fix kgdb breakpoint for Thumb2 + - mips: setup: fix setnocoherentio() boolean setting + - ARM: 9182/1: mmu: fix returns from early_param() and __setup() functions + - mptcp: Correctly set DATA_FIN timeout when number of retransmits is large + - selftests: mlxsw: tc_police_scale: Make test more robust + - pinctrl: sunxi: Use unique lockdep classes for IRQs + - igc: igc_write_phy_reg_gpy: drop premature return + - ibmvnic: free reset-work-item when flushing + - memfd: fix F_SEAL_WRITE after shmem huge page allocated + - s390/extable: fix exception table sorting + - sched: Fix yet more sched_fork() races + - arm64: dts: juno: Remove GICv2m dma-range + - iommu/amd: Fix I/O page table memory leak + - MIPS: ralink: mt7621: do memory detection on KSEG1 + - ARM: dts: switch timer config to common devkit8000 devicetree + - ARM: dts: Use 32KiHz oscillator on devkit8000 + - soc: fsl: guts: Revert commit 3c0d64e867ed + - soc: fsl: guts: Add a missing memory allocation failure check + - soc: fsl: qe: Check of ioremap return value + - netfilter: nf_tables: prefer kfree_rcu(ptr, rcu) variant + - ARM: tegra: Move panels to AUX bus + - can: etas_es58x: change opened_channel_cnt's type from atomic_t to u8 + - net: stmmac: enhance XDP ZC driver level switching performance + - net: stmmac: only enable DMA interrupts when ready + - ibmvnic: initialize rc before completing wait + - ibmvnic: define flush_reset_queue helper + - ibmvnic: complete init_done on transport events + - net: chelsio: cxgb3: check the return value of pci_find_capability() + - net: sparx5: Fix add vlan when invalid operation + - iavf: Refactor iavf state machine tracking + - iavf: Add __IAVF_INIT_FAILED state + - iavf: Combine init and watchdog state machines + - iavf: Add trace while removing device + - iavf: Rework mutexes for better synchronisation + - iavf: Add helper function to go from pci_dev to adapter + - iavf: Fix kernel BUG in free_msi_irqs + - iavf: Add waiting so the port is initialized in remove + - iavf: Fix init state closure on remove + - iavf: Fix locking for VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS + - iavf: Fix race in init state + - iavf: Fix __IAVF_RESETTING state usage + - drm/i915/guc/slpc: Correct the param count for unset param + - drm/bridge: ti-sn65dsi86: Properly undo autosuspend + - e1000e: Fix possible HW unit hang after an s0ix exit + - MIPS: ralink: mt7621: use bitwise NOT instead of logical + - nl80211: Handle nla_memdup failures in handle_nan_filter + - drm/amdgpu: fix suspend/resume hang regression + - net: dcb: disable softirqs in dcbnl_flush_dev() + - selftests: mlxsw: resource_scale: Fix return value + - net: stmmac: perserve TX and RX coalesce value during XDP setup + - iavf: do not override the adapter state in the watchdog task (again) + - iavf: missing unlocks in iavf_watchdog_task() + - MAINTAINERS: adjust file entry for of_net.c after movement + - Input: elan_i2c - move regulator_[en|dis]able() out of + elan_[en|dis]able_power() + - Input: elan_i2c - fix regulator enable count imbalance after suspend/resume + - Input: samsung-keypad - properly state IOMEM dependency + - HID: add mapping for KEY_DICTATE + - HID: add mapping for KEY_ALL_APPLICATIONS + - tracing/histogram: Fix sorting on old "cpu" value + - tracing: Fix return value of __setup handlers + - btrfs: fix lost prealloc extents beyond eof after full fsync + - btrfs: fix relocation crash due to premature return from + btrfs_commit_transaction() + - btrfs: do not WARN_ON() if we have PageError set + - btrfs: qgroup: fix deadlock between rescan worker and remove qgroup + - btrfs: add missing run of delayed items after unlink during log replay + - btrfs: do not start relocation until in progress drops are done + - Revert "xfrm: xfrm_state_mtu should return at least 1280 for ipv6" + - proc: fix documentation and description of pagemap + - KVM: x86/mmu: Passing up the error state of mmu_alloc_shadow_roots() + - hamradio: fix macro redefine warning + - Linux 5.15.27 + - [Config] updateconfigs + * devices on thunderbolt dock are not recognized on adl-p platform + (LP: #1955016) + - thunderbolt: Tear down existing tunnels when resuming from hibernate + - thunderbolt: Runtime resume USB4 port when retimers are scanned + - thunderbolt: Do not allow subtracting more NFC credits than configured + - thunderbolt: Do not program path HopIDs for USB4 routers + - thunderbolt: Add debug logging of DisplayPort resource allocation + * MT7921[14c3:7961] ASPM is disabled and it affects power consumption + (LP: #1955882) + - mt76: mt7921: enable aspm by default + * Add proper runtime PM support to Realtek PCIe cardreader (LP: #1963615) + - mmc: rtsx: Use pm_runtime_{get, put}() to handle runtime PM + - misc: rtsx: Rework runtime power management flow + - misc: rtsx: Cleanup power management ops + - misc: rtsx: Quiesce rts5249 on system suspend + - mmc: rtsx: Let MMC core handle runtime PM + - misc: rtsx: conditionally build rtsx_pm_power_saving() + - misc: rtsx: rts522a rts5228 rts5261 support Runtime PM + - mmc: rtsx: Fix build errors/warnings for unused variable + - mmc: rtsx: add 74 Clocks in power on flow + * [22.04 FEAT] In-kernel crypto: SIMD implementation of chacha20 + (LP: #1853152) + - s390/crypto: add SIMD implementation for ChaCha20 + - s390/crypto: fix compile error for ChaCha20 module + * Add ConnectX7 support and bug fixes to Jammy (LP: #1962185) + - IB/mlx5: Expose NDR speed through MAD + * INVALID or PRIVATE BUG (LP: #1959890) + - [Config] Deactivate CONFIG_QETH_OSX kernel config option + * Move virtual graphics drivers from linux-modules-extra to linux-modules + (LP: #1960633) + - [Packaging] Move VM DRM drivers into modules + * Not able to enter s2idle state on AMD platforms (LP: #1961121) + - HID: amd_sfh: Handle amd_sfh work buffer in PM ops + - HID: amd_sfh: Disable the interrupt for all command + - HID: amd_sfh: Add functionality to clear interrupts + - HID: amd_sfh: Add interrupt handler to process interrupts + * INVALID or PRIVATE BUG (LP: #1960580) + - s390/kexec_file: move kernel image size check + - s390: support command lines longer than 896 bytes + * [UBUNTU 20.04] kernel: Add support for CPU-MF counter second version 7 + (LP: #1960182) + - s390/cpumf: Support for CPU Measurement Facility CSVN 7 + - s390/cpumf: Support for CPU Measurement Sampling Facility LS bit + * [SRU]PCI: vmd: Do not disable MSI-X remapping if interrupt remapping is + enabled by IOMMU (LP: #1937295) + - PCI: vmd: Do not disable MSI-X remapping if interrupt remapping is enabled + by IOMMU + * Jammy update: v5.15.26 upstream stable release (LP: #1963891) + - mm/filemap: Fix handling of THPs in generic_file_buffered_read() + - cgroup/cpuset: Fix a race between cpuset_attach() and cpu hotplug + - cgroup-v1: Correct privileges check in release_agent writes + - x86/ptrace: Fix xfpregs_set()'s incorrect xmm clearing + - btrfs: tree-checker: check item_size for inode_item + - btrfs: tree-checker: check item_size for dev_item + - clk: jz4725b: fix mmc0 clock gating + - io_uring: don't convert to jiffies for waiting on timeouts + - io_uring: disallow modification of rsrc_data during quiesce + - selinux: fix misuse of mutex_is_locked() + - vhost/vsock: don't check owner in vhost_vsock_stop() while releasing + - parisc/unaligned: Fix fldd and fstd unaligned handlers on 32-bit kernel + - parisc/unaligned: Fix ldw() and stw() unalignment handlers + - KVM: x86/mmu: make apf token non-zero to fix bug + - drm/amd/display: Protect update_bw_bounding_box FPU code. + - drm/amd/pm: fix some OEM SKU specific stability issues + - drm/amd: Check if ASPM is enabled from PCIe subsystem + - drm/amdgpu: disable MMHUB PG for Picasso + - drm/amdgpu: do not enable asic reset for raven2 + - drm/i915: Widen the QGV point mask + - drm/i915: Correctly populate use_sagv_wm for all pipes + - drm/i915: Fix bw atomic check when switching between SAGV vs. no SAGV + - sr9700: sanity check for packet length + - USB: zaurus: support another broken Zaurus + - CDC-NCM: avoid overflow in sanity checking + - netfilter: xt_socket: fix a typo in socket_mt_destroy() + - netfilter: xt_socket: missing ifdef CONFIG_IP6_NF_IPTABLES dependency + - tee: export teedev_open() and teedev_close_context() + - optee: use driver internal tee_context for some rpc + - ping: remove pr_err from ping_lookup + - Revert "i40e: Fix reset bw limit when DCB enabled with 1 TC" + - gpu: host1x: Always return syncpoint value when waiting + - perf evlist: Fix failed to use cpu list for uncore events + - perf data: Fix double free in perf_session__delete() + - mptcp: fix race in incoming ADD_ADDR option processing + - mptcp: add mibs counter for ignored incoming options + - selftests: mptcp: fix diag instability + - selftests: mptcp: be more conservative with cookie MPJ limits + - bnx2x: fix driver load from initrd + - bnxt_en: Fix active FEC reporting to ethtool + - bnxt_en: Fix offline ethtool selftest with RDMA enabled + - bnxt_en: Fix incorrect multicast rx mask setting when not requested + - hwmon: Handle failure to register sensor with thermal zone correctly + - net/mlx5: Fix tc max supported prio for nic mode + - ice: check the return of ice_ptp_gettimex64 + - ice: initialize local variable 'tlv' + - net/mlx5: Update the list of the PCI supported devices + - bpf: Fix crash due to incorrect copy_map_value + - bpf: Do not try bpf_msg_push_data with len 0 + - selftests: bpf: Check bpf_msg_push_data return value + - bpf: Fix a bpf_timer initialization issue + - bpf: Add schedule points in batch ops + - io_uring: add a schedule point in io_add_buffers() + - net: __pskb_pull_tail() & pskb_carve_frag_list() drop_monitor friends + - nvme: also mark passthrough-only namespaces ready in nvme_update_ns_info + - tipc: Fix end of loop tests for list_for_each_entry() + - gso: do not skip outer ip header in case of ipip and net_failover + - net: mv643xx_eth: process retval from of_get_mac_address + - openvswitch: Fix setting ipv6 fields causing hw csum failure + - drm/edid: Always set RGB444 + - net/mlx5e: Fix wrong return value on ioctl EEPROM query failure + - drm/vc4: crtc: Fix runtime_pm reference counting + - drm/i915/dg2: Print PHY name properly on calibration error + - net/sched: act_ct: Fix flow table lookup after ct clear or switching zones + - net: ll_temac: check the return value of devm_kmalloc() + - net: Force inlining of checksum functions in net/checksum.h + - netfilter: nf_tables: unregister flowtable hooks on netns exit + - nfp: flower: Fix a potential leak in nfp_tunnel_add_shared_mac() + - net: mdio-ipq4019: add delay after clock enable + - netfilter: nf_tables: fix memory leak during stateful obj update + - net/smc: Use a mutex for locking "struct smc_pnettable" + - surface: surface3_power: Fix battery readings on batteries without a serial + number + - udp_tunnel: Fix end of loop test in udp_tunnel_nic_unregister() + - net/mlx5: DR, Cache STE shadow memory + - ibmvnic: schedule failover only if vioctl fails + - net/mlx5: DR, Don't allow match on IP w/o matching on full + ethertype/ip_version + - net/mlx5: Fix possible deadlock on rule deletion + - net/mlx5: Fix wrong limitation of metadata match on ecpf + - net/mlx5: DR, Fix the threshold that defines when pool sync is initiated + - net/mlx5e: MPLSoUDP decap, fix check for unsupported matches + - net/mlx5e: kTLS, Use CHECKSUM_UNNECESSARY for device-offloaded packets + - net/mlx5: Update log_max_qp value to be 17 at most + - spi: spi-zynq-qspi: Fix a NULL pointer dereference in + zynq_qspi_exec_mem_op() + - gpio: rockchip: Reset int_bothedge when changing trigger + - regmap-irq: Update interrupt clear register for proper reset + - net-timestamp: convert sk->sk_tskey to atomic_t + - RDMA/rtrs-clt: Fix possible double free in error case + - RDMA/rtrs-clt: Move free_permit from free_clt to rtrs_clt_close + - bnxt_en: Increase firmware message response DMA wait time + - configfs: fix a race in configfs_{,un}register_subsystem() + - RDMA/ib_srp: Fix a deadlock + - tracing: Dump stacktrace trigger to the corresponding instance + - tracing: Have traceon and traceoff trigger honor the instance + - iio:imu:adis16480: fix buffering for devices with no burst mode + - iio: adc: men_z188_adc: Fix a resource leak in an error handling path + - iio: adc: tsc2046: fix memory corruption by preventing array overflow + - iio: adc: ad7124: fix mask used for setting AIN_BUFP & AIN_BUFM bits + - iio: accel: fxls8962af: add padding to regmap for SPI + - iio: imu: st_lsm6dsx: wait for settling time in st_lsm6dsx_read_oneshot + - iio: Fix error handling for PM + - sc16is7xx: Fix for incorrect data being transmitted + - ata: pata_hpt37x: disable primary channel on HPT371 + - Revert "USB: serial: ch341: add new Product ID for CH341A" + - usb: gadget: rndis: add spinlock for rndis response list + - USB: gadget: validate endpoint index for xilinx udc + - tracefs: Set the group ownership in apply_options() not parse_options() + - USB: serial: option: add support for DW5829e + - USB: serial: option: add Telit LE910R1 compositions + - usb: dwc2: drd: fix soft connect when gadget is unconfigured + - usb: dwc3: pci: Add "snps,dis_u2_susphy_quirk" for Intel Bay Trail + - usb: dwc3: pci: Fix Bay Trail phy GPIO mappings + - usb: dwc3: gadget: Let the interrupt handler disable bottom halves. + - xhci: re-initialize the HC during resume if HCE was set + - xhci: Prevent futile URB re-submissions due to incorrect return value. + - nvmem: core: Fix a conflict between MTD and NVMEM on wp-gpios property + - mtd: core: Fix a conflict between MTD and NVMEM on wp-gpios property + - driver core: Free DMA range map when device is released + - btrfs: prevent copying too big compressed lzo segment + - RDMA/cma: Do not change route.addr.src_addr outside state checks + - thermal: int340x: fix memory leak in int3400_notify() + - staging: fbtft: fb_st7789v: reset display before initialization + - tps6598x: clear int mask on probe failure + - IB/qib: Fix duplicate sysfs directory name + - riscv: fix nommu_k210_sdcard_defconfig + - riscv: fix oops caused by irqsoff latency tracer + - tty: n_gsm: fix encoding of control signal octet bit DV + - tty: n_gsm: fix proper link termination after failed open + - tty: n_gsm: fix NULL pointer access due to DLCI release + - tty: n_gsm: fix wrong tty control line for flow control + - tty: n_gsm: fix wrong modem processing in convergence layer type 2 + - tty: n_gsm: fix deadlock in gsmtty_open() + - pinctrl: fix loop in k210_pinconf_get_drive() + - pinctrl: k210: Fix bias-pull-up + - gpio: tegra186: Fix chip_data type confusion + - memblock: use kfree() to release kmalloced memblock regions + - ice: Fix race conditions between virtchnl handling and VF ndo ops + - ice: fix concurrent reset and removal of VFs + - Linux 5.15.26 + * Jammy update: v5.15.25 upstream stable release (LP: #1963890) + - drm/nouveau/pmu/gm200-: use alternate falcon reset sequence + - fs/proc: task_mmu.c: don't read mapcount for migration entry + - btrfs: zoned: cache reported zone during mount + - HID:Add support for UGTABLET WP5540 + - Revert "svm: Add warning message for AVIC IPI invalid target" + - parisc: Show error if wrong 32/64-bit compiler is being used + - serial: parisc: GSC: fix build when IOSAPIC is not set + - parisc: Drop __init from map_pages declaration + - parisc: Fix data TLB miss in sba_unmap_sg + - parisc: Fix sglist access in ccio-dma.c + - mmc: block: fix read single on recovery logic + - mm: don't try to NUMA-migrate COW pages that have other uses + - HID: amd_sfh: Add illuminance mask to limit ALS max value + - HID: i2c-hid: goodix: Fix a lockdep splat + - HID: amd_sfh: Increase sensor command timeout + - HID: amd_sfh: Correct the structure field name + - PCI: hv: Fix NUMA node assignment when kernel boots with custom NUMA + topology + - parisc: Add ioread64_lo_hi() and iowrite64_lo_hi() + - btrfs: send: in case of IO error log it + - platform/x86: touchscreen_dmi: Add info for the RWC NANOTE P8 AY07J 2-in-1 + - platform/x86: ISST: Fix possible circular locking dependency detected + - kunit: tool: Import missing importlib.abc + - selftests: rtc: Increase test timeout so that all tests run + - kselftest: signal all child processes + - net: ieee802154: at86rf230: Stop leaking skb's + - selftests/zram: Skip max_comp_streams interface on newer kernel + - selftests/zram01.sh: Fix compression ratio calculation + - selftests/zram: Adapt the situation that /dev/zram0 is being used + - selftests: openat2: Print also errno in failure messages + - selftests: openat2: Add missing dependency in Makefile + - selftests: openat2: Skip testcases that fail with EOPNOTSUPP + - selftests: skip mincore.check_file_mmap when fs lacks needed support + - ax25: improve the incomplete fix to avoid UAF and NPD bugs + - pinctrl: bcm63xx: fix unmet dependency on REGMAP for GPIO_REGMAP + - vfs: make freeze_super abort when sync_filesystem returns error + - quota: make dquot_quota_sync return errors from ->sync_fs + - scsi: pm80xx: Fix double completion for SATA devices + - kselftest: Fix vdso_test_abi return status + - scsi: core: Reallocate device's budget map on queue depth change + - scsi: pm8001: Fix use-after-free for aborted TMF sas_task + - scsi: pm8001: Fix use-after-free for aborted SSP/STP sas_task + - drm/amd: Warn users about potential s0ix problems + - nvme: fix a possible use-after-free in controller reset during load + - nvme-tcp: fix possible use-after-free in transport error_recovery work + - nvme-rdma: fix possible use-after-free in transport error_recovery work + - net: sparx5: do not refer to skb after passing it on + - drm/amd: add support to check whether the system is set to s3 + - drm/amd: Only run s3 or s0ix if system is configured properly + - drm/amdgpu: fix logic inversion in check + - x86/Xen: streamline (and fix) PV CPU enumeration + - Revert "module, async: async_synchronize_full() on module init iff async is + used" + - gcc-plugins/stackleak: Use noinstr in favor of notrace + - random: wake up /dev/random writers after zap + - KVM: x86/xen: Fix runstate updates to be atomic when preempting vCPU + - KVM: x86: nSVM/nVMX: set nested_run_pending on VM entry which is a result of + RSM + - KVM: x86: SVM: don't passthrough SMAP/SMEP/PKE bits in !NPT && !gCR0.PG case + - KVM: x86: nSVM: fix potential NULL derefernce on nested migration + - KVM: x86: nSVM: mark vmcb01 as dirty when restoring SMM saved state + - iwlwifi: fix use-after-free + - drm/radeon: Fix backlight control on iMac 12,1 + - drm/atomic: Don't pollute crtc_state->mode_blob with error pointers + - drm/amd/pm: correct the sequence of sending gpu reset msg + - drm/amdgpu: skipping SDMA hw_init and hw_fini for S0ix. + - drm/i915/opregion: check port number bounds for SWSCI display power state + - drm/i915: Fix dbuf slice config lookup + - drm/i915: Fix mbus join config lookup + - vsock: remove vsock from connected table when connect is interrupted by a + signal + - drm/cma-helper: Set VM_DONTEXPAND for mmap + - drm/i915/gvt: Make DRM_I915_GVT depend on X86 + - drm/i915/ttm: tweak priority hint selection + - iwlwifi: pcie: fix locking when "HW not ready" + - iwlwifi: pcie: gen2: fix locking when "HW not ready" + - iwlwifi: mvm: don't send SAR GEO command for 3160 devices + - selftests: netfilter: fix exit value for nft_concat_range + - netfilter: nft_synproxy: unregister hooks on init error path + - selftests: netfilter: disable rp_filter on router + - ipv4: fix data races in fib_alias_hw_flags_set + - ipv6: fix data-race in fib6_info_hw_flags_set / fib6_purge_rt + - ipv6: mcast: use rcu-safe version of ipv6_get_lladdr() + - ipv6: per-netns exclusive flowlabel checks + - Revert "net: ethernet: bgmac: Use devm_platform_ioremap_resource_byname" + - mac80211: mlme: check for null after calling kmemdup + - brcmfmac: firmware: Fix crash in brcm_alt_fw_path + - cfg80211: fix race in netlink owner interface destruction + - net: dsa: lan9303: fix reset on probe + - net: dsa: mv88e6xxx: flush switchdev FDB workqueue before removing VLAN + - net: dsa: lantiq_gswip: fix use after free in gswip_remove() + - net: dsa: lan9303: handle hwaccel VLAN tags + - net: dsa: lan9303: add VLAN IDs to master device + - net: ieee802154: ca8210: Fix lifs/sifs periods + - ping: fix the dif and sdif check in ping_lookup + - bonding: force carrier update when releasing slave + - drop_monitor: fix data-race in dropmon_net_event / trace_napi_poll_hit + - net_sched: add __rcu annotation to netdev->qdisc + - bonding: fix data-races around agg_select_timer + - libsubcmd: Fix use-after-free for realloc(..., 0) + - net/smc: Avoid overwriting the copies of clcsock callback functions + - net: phy: mediatek: remove PHY mode check on MT7531 + - atl1c: fix tx timeout after link flap on Mikrotik 10/25G NIC + - tipc: fix wrong publisher node address in link publications + - dpaa2-switch: fix default return of dpaa2_switch_flower_parse_mirror_key + - dpaa2-eth: Initialize mutex used in one step timestamping path + - net: bridge: multicast: notify switchdev driver whenever MC processing gets + disabled + - perf bpf: Defer freeing string after possible strlen() on it + - selftests/exec: Add non-regular to TEST_GEN_PROGS + - arm64: Correct wrong label in macro __init_el2_gicv3 + - ALSA: usb-audio: revert to IMPLICIT_FB_FIXED_DEV for M-Audio FastTrack Ultra + - ALSA: hda/realtek: Add quirk for Legion Y9000X 2019 + - ALSA: hda/realtek: Fix deadlock by COEF mutex + - ALSA: hda: Fix regression on forced probe mask option + - ALSA: hda: Fix missing codec probe on Shenker Dock 15 + - ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw() + - ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw_range() + - ASoC: ops: Fix stereo change notifications in snd_soc_put_volsw_sx() + - ASoC: ops: Fix stereo change notifications in snd_soc_put_xr_sx() + - cifs: fix set of group SID via NTSD xattrs + - powerpc/603: Fix boot failure with DEBUG_PAGEALLOC and KFENCE + - powerpc/lib/sstep: fix 'ptesync' build error + - mtd: rawnand: gpmi: don't leak PM reference in error path + - smb3: fix snapshot mount option + - tipc: fix wrong notification node addresses + - scsi: ufs: Remove dead code + - scsi: ufs: Fix a deadlock in the error handler + - ASoC: tas2770: Insert post reset delay + - ASoC: qcom: Actually clear DMA interrupt register for HDMI + - block/wbt: fix negative inflight counter when remove scsi device + - NFS: Remove an incorrect revalidation in nfs4_update_changeattr_locked() + - NFS: LOOKUP_DIRECTORY is also ok with symlinks + - NFS: Do not report writeback errors in nfs_getattr() + - tty: n_tty: do not look ahead for EOL character past the end of the buffer + - block: fix surprise removal for drivers calling blk_set_queue_dying + - mtd: rawnand: qcom: Fix clock sequencing in qcom_nandc_probe() + - mtd: parsers: qcom: Fix kernel panic on skipped partition + - mtd: parsers: qcom: Fix missing free for pparts in cleanup + - mtd: phram: Prevent divide by zero bug in phram_setup() + - mtd: rawnand: brcmnand: Fixed incorrect sub-page ECC status + - HID: elo: fix memory leak in elo_probe + - mtd: rawnand: ingenic: Fix missing put_device in ingenic_ecc_get + - Drivers: hv: vmbus: Fix memory leak in vmbus_add_channel_kobj + - KVM: x86/pmu: Refactoring find_arch_event() to pmc_perf_hw_id() + - KVM: x86/pmu: Don't truncate the PerfEvtSeln MSR when creating a perf event + - KVM: x86/pmu: Use AMD64_RAW_EVENT_MASK for PERF_TYPE_RAW + - ARM: OMAP2+: hwmod: Add of_node_put() before break + - ARM: OMAP2+: adjust the location of put_device() call in omapdss_init_of + - phy: usb: Leave some clocks running during suspend + - staging: vc04_services: Fix RCU dereference check + - phy: phy-mtk-tphy: Fix duplicated argument in phy-mtk-tphy + - irqchip/sifive-plic: Add missing thead,c900-plic match string + - x86/bug: Merge annotate_reachable() into _BUG_FLAGS() asm + - netfilter: conntrack: don't refresh sctp entries in closed state + - ksmbd: fix same UniqueId for dot and dotdot entries + - ksmbd: don't align last entry offset in smb2 query directory + - arm64: dts: meson-gx: add ATF BL32 reserved-memory region + - arm64: dts: meson-g12: add ATF BL32 reserved-memory region + - arm64: dts: meson-g12: drop BL32 region from SEI510/SEI610 + - pidfd: fix test failure due to stack overflow on some arches + - selftests: fixup build warnings in pidfd / clone3 tests + - mm: io_uring: allow oom-killer from io_uring_setup + - kconfig: let 'shell' return enough output for deep path names + - ata: libata-core: Disable TRIM on M88V29 + - soc: aspeed: lpc-ctrl: Block error printing on probe defer cases + - xprtrdma: fix pointer derefs in error cases of rpcrdma_ep_create + - drm/rockchip: dw_hdmi: Do not leave clock enabled in error case + - tracing: Fix tp_printk option related with tp_printk_stop_on_boot + - display/amd: decrease message verbosity about watermarks table failure + - drm/amd/display: Cap pflip irqs per max otg number + - drm/amd/display: fix yellow carp wm clamping + - net: usb: qmi_wwan: Add support for Dell DW5829e + - net: macb: Align the dma and coherent dma masks + - kconfig: fix failing to generate auto.conf + - scsi: lpfc: Fix pt2pt NVMe PRLI reject LOGO loop + - EDAC: Fix calculation of returned address and next offset in + edac_align_ptr() + - ucounts: Handle wrapping in is_ucounts_overlimit + - ucounts: In set_cred_ucounts assume new->ucounts is non-NULL + - ucounts: Base set_cred_ucounts changes on the real user + - ucounts: Enforce RLIMIT_NPROC not RLIMIT_NPROC+1 + - lib/iov_iter: initialize "flags" in new pipe_buffer + - rlimit: Fix RLIMIT_NPROC enforcement failure caused by capability calls in + set_user + - ucounts: Move RLIMIT_NPROC handling after set_user + - net: sched: limit TC_ACT_REPEAT loops + - dmaengine: sh: rcar-dmac: Check for error num after setting mask + - dmaengine: stm32-dmamux: Fix PM disable depth imbalance in + stm32_dmamux_probe + - dmaengine: sh: rcar-dmac: Check for error num after dma_set_max_seg_size + - tests: fix idmapped mount_setattr test + - i2c: qcom-cci: don't delete an unregistered adapter + - i2c: qcom-cci: don't put a device tree node before i2c_add_adapter() + - dmaengine: ptdma: Fix the error handling path in pt_core_init() + - copy_process(): Move fd_install() out of sighand->siglock critical section + - scsi: qedi: Fix ABBA deadlock in qedi_process_tmf_resp() and + qedi_process_cmd_cleanup_resp() + - ice: enable parsing IPSEC SPI headers for RSS + - i2c: brcmstb: fix support for DSL and CM variants + - lockdep: Correct lock_classes index mapping + - Linux 5.15.25 + * Jammy update: v5.15.24 upstream stable release (LP: #1963889) + - integrity: check the return value of audit_log_start() + - ima: fix reference leak in asymmetric_verify() + - ima: Remove ima_policy file before directory + - ima: Allow template selection with ima_template[_fmt]= after ima_hash= + - ima: Do not print policy rule with inactive LSM labels + - mmc: sdhci-of-esdhc: Check for error num after setting mask + - mmc: core: Wait for command setting 'Power Off Notification' bit to complete + - can: isotp: fix potential CAN frame reception race in isotp_rcv() + - can: isotp: fix error path in isotp_sendmsg() to unlock wait queue + - net: phy: marvell: Fix RGMII Tx/Rx delays setting in 88e1121-compatible PHYs + - net: phy: marvell: Fix MDI-x polarity setting in 88e1118-compatible PHYs + - NFS: Fix initialisation of nfs_client cl_flags field + - NFSD: Fix NFSv3 SETATTR/CREATE's handling of large file sizes + - NFSD: Fix ia_size underflow + - NFSD: Clamp WRITE offsets + - NFSD: Fix offset type in I/O trace points + - NFSD: Fix the behavior of READ near OFFSET_MAX + - thermal/drivers/int340x: Improve the tcc offset saving for suspend/resume + - thermal/drivers/int340x: processor_thermal: Suppot 64 bit RFIM responses + - thermal: int340x: Limit Kconfig to 64-bit + - thermal/drivers/int340x: Fix RFIM mailbox write commands + - tracing: Propagate is_signed to expression + - NFS: change nfs_access_get_cached to only report the mask + - NFSv4 only print the label when its queried + - nfs: nfs4clinet: check the return value of kstrdup() + - NFSv4.1: Fix uninitialised variable in devicenotify + - NFSv4 remove zero number of fs_locations entries error check + - NFSv4 store server support for fs_location attribute + - NFSv4.1 query for fs_location attr on a new file system + - NFSv4 expose nfs_parse_server_name function + - NFSv4 handle port presence in fs_location server string + - SUNRPC allow for unspecified transport time in rpc_clnt_add_xprt + - net/sunrpc: fix reference count leaks in rpc_sysfs_xprt_state_change + - sunrpc: Fix potential race conditions in rpc_sysfs_xprt_state_change() + - irqchip/realtek-rtl: Service all pending interrupts + - perf/x86/rapl: fix AMD event handling + - x86/perf: Avoid warning for Arch LBR without XSAVE + - sched: Avoid double preemption in __cond_resched_*lock*() + - drm/vc4: Fix deadlock on DSI device attach error + - drm: panel-orientation-quirks: Add quirk for the 1Netbook OneXPlayer + - net: sched: Clarify error message when qdisc kind is unknown + - powerpc/fixmap: Fix VM debug warning on unmap + - scsi: target: iscsi: Make sure the np under each tpg is unique + - scsi: ufs: ufshcd-pltfrm: Check the return value of devm_kstrdup() + - scsi: qedf: Add stag_work to all the vports + - scsi: qedf: Fix refcount issue when LOGO is received during TMF + - scsi: qedf: Change context reset messages to ratelimited + - scsi: pm8001: Fix bogus FW crash for maxcpus=1 + - scsi: ufs: Use generic error code in ufshcd_set_dev_pwr_mode() + - scsi: ufs: Treat link loss as fatal error + - scsi: myrs: Fix crash in error case + - net: stmmac: reduce unnecessary wakeups from eee sw timer + - PM: hibernate: Remove register_nosave_region_late() + - drm/amd/display: Correct MPC split policy for DCN301 + - usb: dwc2: gadget: don't try to disable ep0 in dwc2_hsotg_suspend + - perf: Always wake the parent event + - nvme-pci: add the IGNORE_DEV_SUBNQN quirk for Intel P4500/P4600 SSDs + - MIPS: Fix build error due to PTR used in more places + - net: stmmac: dwmac-sun8i: use return val of readl_poll_timeout() + - KVM: eventfd: Fix false positive RCU usage warning + - KVM: nVMX: eVMCS: Filter out VM_EXIT_SAVE_VMX_PREEMPTION_TIMER + - KVM: nVMX: Also filter MSR_IA32_VMX_TRUE_PINBASED_CTLS when eVMCS + - KVM: SVM: Don't kill SEV guest if SMAP erratum triggers in usermode + - KVM: VMX: Set vmcs.PENDING_DBG.BS on #DB in STI/MOVSS blocking shadow + - KVM: x86: Report deprecated x87 features in supported CPUID + - riscv: fix build with binutils 2.38 + - riscv: cpu-hotplug: clear cpu from numa map when teardown + - riscv: eliminate unreliable __builtin_frame_address(1) + - gfs2: Fix gfs2_release for non-writers regression + - ARM: dts: imx23-evk: Remove MX23_PAD_SSP1_DETECT from hog group + - ARM: dts: Fix boot regression on Skomer + - ARM: socfpga: fix missing RESET_CONTROLLER + - nvme-tcp: fix bogus request completion when failing to send AER + - ACPI/IORT: Check node revision for PMCG resources + - PM: s2idle: ACPI: Fix wakeup interrupts handling + - drm/amdgpu/display: change pipe policy for DCN 2.0 + - drm/rockchip: vop: Correct RK3399 VOP register fields + - drm/i915: Allow !join_mbus cases for adlp+ dbuf configuration + - drm/i915: Populate pipe dbuf slices more accurately during readout + - ARM: dts: Fix timer regression for beagleboard revision c + - ARM: dts: meson: Fix the UART compatible strings + - ARM: dts: meson8: Fix the UART device-tree schema validation + - ARM: dts: meson8b: Fix the UART device-tree schema validation + - phy: broadcom: Kconfig: Fix PHY_BRCM_USB config option + - staging: fbtft: Fix error path in fbtft_driver_module_init() + - ARM: dts: imx6qdl-udoo: Properly describe the SD card detect + - phy: xilinx: zynqmp: Fix bus width setting for SGMII + - phy: stm32: fix a refcount leak in stm32_usbphyc_pll_enable() + - ARM: dts: imx7ulp: Fix 'assigned-clocks-parents' typo + - arm64: dts: imx8mq: fix mipi_csi bidirectional port numbers + - usb: f_fs: Fix use-after-free for epfile + - phy: dphy: Correct clk_pre parameter + - gpio: aggregator: Fix calling into sleeping GPIO controllers + - NFS: Don't overfill uncached readdir pages + - NFS: Don't skip directory entries when doing uncached readdir + - drm/vc4: hdmi: Allow DBLCLK modes even if horz timing is odd. + - misc: fastrpc: avoid double fput() on failed usercopy + - net: sparx5: Fix get_stat64 crash in tcpdump + - netfilter: ctnetlink: disable helper autoassign + - arm64: dts: meson-g12b-odroid-n2: fix typo 'dio2133' + - arm64: dts: meson-sm1-odroid: use correct enable-gpio pin for tf-io + regulator + - arm64: dts: meson-sm1-bananapi-m5: fix wrong GPIO domain for GPIOE_2 + - arm64: dts: meson-sm1-odroid: fix boot loop after reboot + - ixgbevf: Require large buffers for build_skb on 82599VF + - drm/panel: simple: Assign data from panel_dpi_probe() correctly + - ACPI: PM: s2idle: Cancel wakeup before dispatching EC GPE + - gpiolib: Never return internal error codes to user space + - gpio: sifive: use the correct register to read output values + - fbcon: Avoid 'cap' set but not used warning + - bonding: pair enable_port with slave_arr_updates + - net: dsa: mv88e6xxx: don't use devres for mdiobus + - net: dsa: ar9331: register the mdiobus under devres + - net: dsa: bcm_sf2: don't use devres for mdiobus + - net: dsa: felix: don't use devres for mdiobus + - net: dsa: mt7530: fix kernel bug in mdiobus_free() when unbinding + - net: dsa: lantiq_gswip: don't use devres for mdiobus + - ipmr,ip6mr: acquire RTNL before calling ip[6]mr_free_table() on failure path + - nfp: flower: fix ida_idx not being released + - net: do not keep the dst cache when uncloning an skb dst and its metadata + - net: fix a memleak when uncloning an skb dst and its metadata + - veth: fix races around rq->rx_notify_masked + - net: mdio: aspeed: Add missing MODULE_DEVICE_TABLE + - tipc: rate limit warning for received illegal binding update + - net: amd-xgbe: disable interrupts during pci removal + - drm/amd/pm: fix hwmon node of power1_label create issue + - mptcp: netlink: process IPv6 addrs in creating listening sockets + - dpaa2-eth: unregister the netdev before disconnecting from the PHY + - ice: fix an error code in ice_cfg_phy_fec() + - ice: fix IPIP and SIT TSO offload + - ice: Fix KASAN error in LAG NETDEV_UNREGISTER handler + - ice: Avoid RTNL lock when re-creating auxiliary device + - net: mscc: ocelot: fix mutex lock error during ethtool stats read + - net: dsa: mv88e6xxx: fix use-after-free in mv88e6xxx_mdios_unregister + - vt_ioctl: fix array_index_nospec in vt_setactivate + - vt_ioctl: add array_index_nospec to VT_ACTIVATE + - n_tty: wake up poll(POLLRDNORM) on receiving data + - eeprom: ee1004: limit i2c reads to I2C_SMBUS_BLOCK_MAX + - usb: dwc2: drd: fix soft connect when gadget is unconfigured + - Revert "usb: dwc2: drd: fix soft connect when gadget is unconfigured" + - net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup + - usb: ulpi: Move of_node_put to ulpi_dev_release + - usb: ulpi: Call of_node_put correctly + - usb: dwc3: gadget: Prevent core from processing stale TRBs + - usb: gadget: udc: renesas_usb3: Fix host to USB_ROLE_NONE transition + - USB: gadget: validate interface OS descriptor requests + - usb: gadget: rndis: check size of RNDIS_MSG_SET command + - usb: gadget: f_uac2: Define specific wTerminalType + - usb: raw-gadget: fix handling of dual-direction-capable endpoints + - USB: serial: ftdi_sio: add support for Brainboxes US-159/235/320 + - USB: serial: option: add ZTE MF286D modem + - USB: serial: ch341: add support for GW Instek USB2.0-Serial devices + - USB: serial: cp210x: add NCR Retail IO box id + - USB: serial: cp210x: add CPI Bulk Coin Recycler id + - speakup-dectlk: Restore pitch setting + - phy: ti: Fix missing sentinel for clk_div_table + - iio: buffer: Fix file related error handling in IIO_BUFFER_GET_FD_IOCTL + - mm: memcg: synchronize objcg lists with a dedicated spinlock + - seccomp: Invalidate seccomp mode to catch death failures + - signal: HANDLER_EXIT should clear SIGNAL_UNKILLABLE + - s390/cio: verify the driver availability for path_event call + - bus: mhi: pci_generic: Add mru_default for Foxconn SDX55 + - bus: mhi: pci_generic: Add mru_default for Cinterion MV31-W + - hwmon: (dell-smm) Speed up setting of fan speed + - x86/sgx: Silence softlockup detection when releasing large enclaves + - Makefile.extrawarn: Move -Wunaligned-access to W=1 + - scsi: lpfc: Remove NVMe support if kernel has NVME_FC disabled + - scsi: lpfc: Reduce log messages seen after firmware download + - MIPS: octeon: Fix missed PTR->PTR_WD conversion + - arm64: dts: imx8mq: fix lcdif port node + - perf: Fix list corruption in perf_cgroup_switch() + - iommu: Fix potential use-after-free during probe + - Linux 5.15.24 + * Jammy update: v5.15.23 upstream stable release (LP: #1963888) + - moxart: fix potential use-after-free on remove path + - arm64: Add Cortex-A510 CPU part definition + - ksmbd: fix SMB 3.11 posix extension mount failure + - crypto: api - Move cryptomgr soft dependency into algapi + - Linux 5.15.23 + * [22.04 FEAT] KVM: Enable storage key checking for intercepted instruction + handled by userspace (LP: #1933179) + - KVM: s390: gaccess: Refactor gpa and length calculation + - KVM: s390: gaccess: Refactor access address range check + - KVM: s390: gaccess: Cleanup access to guest pages + - s390/uaccess: introduce bit field for OAC specifier + - s390/uaccess: fix compile error + - s390/uaccess: Add copy_from/to_user_key functions + - KVM: s390: Honor storage keys when accessing guest memory + - KVM: s390: handle_tprot: Honor storage keys + - KVM: s390: selftests: Test TEST PROTECTION emulation + - KVM: s390: Add optional storage key checking to MEMOP IOCTL + - KVM: s390: Add vm IOCTL for key checked guest absolute memory access + - KVM: s390: Rename existing vcpu memop functions + - KVM: s390: Add capability for storage key extension of MEM_OP IOCTL + - KVM: s390: Update api documentation for memop ioctl + - KVM: s390: Clarify key argument for MEM_OP in api docs + - KVM: s390: Add missing vm MEM_OP size check + * CVE-2022-25636 + - netfilter: nf_tables_offload: incorrect flow offload action array size + * ubuntu_kernel_selftests / ftrace:ftracetest do_softirq failure on Jammy + realtime (LP: #1959610) + - selftests/ftrace: Do not trace do_softirq because of PREEMPT_RT + * CVE-2022-0435 + - tipc: improve size validations for received domain records + * CVE-2022-0516 + - KVM: s390: Return error on SIDA memop on normal guest + * EDAC update for AMD Genoa support in 22.04 (LP: #1960362) + - EDAC: Add RDDR5 and LRDDR5 memory types + - EDAC/amd64: Add support for AMD Family 19h Models 10h-1Fh and A0h-AFh + * hwmon: k10temp updates for AMD Genoa in 22.04 (LP: #1960361) + - x86/amd_nb: Add AMD Family 19h Models (10h-1Fh) and (A0h-AFh) PCI IDs + - hwmon: (k10temp) Remove unused definitions + - hwmon: (k10temp) Support up to 12 CCDs on AMD Family of processors + - hwmon: (k10temp) Add support for AMD Family 19h Models 10h-1Fh and A0h-AFh + * [SRU][I/J/OEM-5.13/OEM-5.14] Add basic support of MT7922 (LP: #1958151) + - mt76: mt7921: Add mt7922 support + - mt76: mt7921: add support for PCIe ID 0x0608/0x0616 + - mt76: mt7921: introduce 160 MHz channel bandwidth support + * Use EC GPE for s2idle wakeup on AMD platforms (LP: #1960771) + - ACPI: PM: Revert "Only mark EC GPE for wakeup on Intel systems" + * Update Broadcom Emulex FC HBA lpfc driver to 14.0.0.4 for Ubuntu 22.04 + (LP: #1956982) + - scsi: lpfc: Change return code on I/Os received during link bounce + - scsi: lpfc: Fix NPIV port deletion crash + - scsi: lpfc: Adjust CMF total bytes and rxmonitor + - scsi: lpfc: Cap CMF read bytes to MBPI + - scsi: lpfc: Add additional debugfs support for CMF + - scsi: lpfc: Update lpfc version to 14.0.0.4 + * Forward-port drm/i915 commits from oem-5.14 for Alder Lake S & P + (LP: #1960298) + - drm/i915/dmc: Update to DMC v2.12 + - drm/i915/adlp/tc: Fix PHY connected check for Thunderbolt mode + - drm/i915/tc: Remove waiting for PHY complete during releasing ownership + - drm/i915/tc: Check for DP-alt, legacy sinks before taking PHY ownership + - drm/i915/tc: Add/use helpers to retrieve TypeC port properties + - drm/i915/tc: Don't keep legacy TypeC ports in connected state w/o a sink + - drm/i915/tc: Add a mode for the TypeC PHY's disconnected state + - drm/i915/tc: Refactor TC-cold block/unblock helpers + - drm/i915/tc: Avoid using legacy AUX PW in TBT mode + - drm/i915/icl/tc: Remove the ICL special casing during TC-cold blocking + - drm/i915/tc: Fix TypeC PHY connect/disconnect logic on ADL-P + - drm/i915/tc: Drop extra TC cold blocking from intel_tc_port_connected() + - drm/i915/tc: Fix system hang on ADL-P during TypeC PHY disconnect + - drm/i915/display/adlp: Disable underrun recovery + - drm/i915/adl_s: Remove require_force_probe protection + - drm/i915/adlp: Remove require_force_probe protection + * INVALID or PRIVATE BUG (LP: #1959735) + - KVM: s390: Simplify SIGP Set Arch handling + - KVM: s390: Add a routine for setting userspace CPU state + * Include the QCA WCN 6856 v2.1 support (LP: #1954938) + - SAUCE: ath11k: shrink TCSR read mask for WCN6855 hw2.1 + * Jammy update: v5.15.22 upstream stable release (LP: #1960516) + - drm/i915: Disable DSB usage for now + - selinux: fix double free of cond_list on error paths + - audit: improve audit queue handling when "audit=1" on cmdline + - ipc/sem: do not sleep with a spin lock held + - spi: stm32-qspi: Update spi registering + - ASoC: hdmi-codec: Fix OOB memory accesses + - ASoC: ops: Reject out of bounds values in snd_soc_put_volsw() + - ASoC: ops: Reject out of bounds values in snd_soc_put_volsw_sx() + - ASoC: ops: Reject out of bounds values in snd_soc_put_xr_sx() + - ALSA: usb-audio: Correct quirk for VF0770 + - ALSA: hda: Fix UAF of leds class devs at unbinding + - ALSA: hda: realtek: Fix race at concurrent COEF updates + - ALSA: hda/realtek: Add quirk for ASUS GU603 + - ALSA: hda/realtek: Add missing fixup-model entry for Gigabyte X570 ALC1220 + quirks + - ALSA: hda/realtek: Fix silent output on Gigabyte X570S Aorus Master (newer + chipset) + - ALSA: hda/realtek: Fix silent output on Gigabyte X570 Aorus Xtreme after + reboot from Windows + - btrfs: don't start transaction for scrub if the fs is mounted read-only + - btrfs: fix deadlock between quota disable and qgroup rescan worker + - btrfs: fix use-after-free after failure to create a snapshot + - Revert "fs/9p: search open fids first" + - drm/nouveau: fix off by one in BIOS boundary checking + - drm/i915/adlp: Fix TypeC PHY-ready status readout + - drm/amd/pm: correct the MGpuFanBoost support for Beige Goby + - drm/amd/display: watermark latencies is not enough on DCN31 + - drm/amd/display: Force link_rate as LINK_RATE_RBR2 for 2018 15" Apple Retina + panels + - nvme-fabrics: fix state check in nvmf_ctlr_matches_baseopts() + - mm/debug_vm_pgtable: remove pte entry from the page table + - mm/pgtable: define pte_index so that preprocessor could recognize it + - mm/kmemleak: avoid scanning potential huge holes + - block: bio-integrity: Advance seed correctly for larger interval sizes + - dma-buf: heaps: Fix potential spectre v1 gadget + - IB/hfi1: Fix AIP early init panic + - Revert "fbcon: Disable accelerated scrolling" + - fbcon: Add option to enable legacy hardware acceleration + - mptcp: fix msk traversal in mptcp_nl_cmd_set_flags() + - Revert "ASoC: mediatek: Check for error clk pointer" + - KVM: arm64: Avoid consuming a stale esr value when SError occur + - KVM: arm64: Stop handle_exit() from handling HVC twice when an SError occurs + - RDMA/cma: Use correct address when leaving multicast group + - RDMA/ucma: Protect mc during concurrent multicast leaves + - RDMA/siw: Fix refcounting leak in siw_create_qp() + - IB/rdmavt: Validate remote_addr during loopback atomic tests + - RDMA/siw: Fix broken RDMA Read Fence/Resume logic. + - RDMA/mlx4: Don't continue event handler after memory allocation failure + - ALSA: usb-audio: initialize variables that could ignore errors + - ALSA: hda: Fix signedness of sscanf() arguments + - ALSA: hda: Skip codec shutdown in case the codec is not registered + - iommu/vt-d: Fix potential memory leak in intel_setup_irq_remapping() + - iommu/amd: Fix loop timeout issue in iommu_ga_log_enable() + - spi: bcm-qspi: check for valid cs before applying chip select + - spi: mediatek: Avoid NULL pointer crash in interrupt + - spi: meson-spicc: add IRQ check in meson_spicc_probe + - spi: uniphier: fix reference count leak in uniphier_spi_probe() + - IB/hfi1: Fix tstats alloc and dealloc + - IB/cm: Release previously acquired reference counter in the cm_id_priv + - net: ieee802154: hwsim: Ensure proper channel selection at probe time + - net: ieee802154: mcr20a: Fix lifs/sifs periods + - net: ieee802154: ca8210: Stop leaking skb's + - netfilter: nft_reject_bridge: Fix for missing reply from prerouting + - net: ieee802154: Return meaningful error codes from the netlink helpers + - net/smc: Forward wakeup to smc socket waitqueue after fallback + - net: stmmac: dwmac-visconti: No change to ETHER_CLOCK_SEL for unexpected + speed request. + - net: stmmac: properly handle with runtime pm in stmmac_dvr_remove() + - net: macsec: Fix offload support for NETDEV_UNREGISTER event + - net: macsec: Verify that send_sci is on when setting Tx sci explicitly + - net: stmmac: dump gmac4 DMA registers correctly + - net: stmmac: ensure PTP time register reads are consistent + - drm/kmb: Fix for build errors with Warray-bounds + - drm/i915/overlay: Prevent divide by zero bugs in scaling + - drm/amd: avoid suspend on dGPUs w/ s2idle support when runtime PM enabled + - ASoC: fsl: Add missing error handling in pcm030_fabric_probe + - ASoC: xilinx: xlnx_formatter_pcm: Make buffer bytes multiple of period bytes + - ASoC: simple-card: fix probe failure on platform component + - ASoC: cpcap: Check for NULL pointer after calling of_get_child_by_name + - ASoC: max9759: fix underflow in speaker_gain_control_put() + - ASoC: codecs: wcd938x: fix incorrect used of portid + - ASoC: codecs: lpass-rx-macro: fix sidetone register offsets + - ASoC: codecs: wcd938x: fix return value of mixer put function + - pinctrl: sunxi: Fix H616 I2S3 pin data + - pinctrl: intel: Fix a glitch when updating IRQ flags on a preconfigured line + - pinctrl: intel: fix unexpected interrupt + - pinctrl: bcm2835: Fix a few error paths + - scsi: bnx2fc: Make bnx2fc_recv_frame() mp safe + - nfsd: nfsd4_setclientid_confirm mistakenly expires confirmed client. + - gve: fix the wrong AdminQ buffer queue index check + - bpf: Use VM_MAP instead of VM_ALLOC for ringbuf + - selftests/exec: Remove pipe from TEST_GEN_FILES + - selftests: futex: Use variable MAKE instead of make + - tools/resolve_btfids: Do not print any commands when building silently + - e1000e: Separate ADP board type from TGP + - rtc: cmos: Evaluate century appropriate + - kvm: add guest_state_{enter,exit}_irqoff() + - kvm/arm64: rework guest entry logic + - perf: Copy perf_event_attr::sig_data on modification + - perf stat: Fix display of grouped aliased events + - perf/x86/intel/pt: Fix crash with stop filters in single-range mode + - x86/perf: Default set FREEZE_ON_SMI for all + - EDAC/altera: Fix deferred probing + - EDAC/xgene: Fix deferred probing + - ext4: prevent used blocks from being allocated during fast commit replay + - ext4: modify the logic of ext4_mb_new_blocks_simple + - ext4: fix error handling in ext4_restore_inline_data() + - ext4: fix error handling in ext4_fc_record_modified_inode() + - ext4: fix incorrect type issue during replay_del_range + - net: dsa: mt7530: make NET_DSA_MT7530 select MEDIATEK_GE_PHY + - cgroup/cpuset: Fix "suspicious RCU usage" lockdep warning + - tools include UAPI: Sync sound/asound.h copy with the kernel sources + - gpio: idt3243x: Fix an ignored error return from platform_get_irq() + - gpio: mpc8xxx: Fix an ignored error return from platform_get_irq() + - selftests: nft_concat_range: add test for reload with no element add/del + - selftests: netfilter: check stateless nat udp checksum fixup + - Linux 5.15.22 + - [Config] disable FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION + * Jammy update: v5.15.21 upstream stable release (LP: #1960515) + - Revert "drm/vc4: hdmi: Make sure the device is powered with CEC" + - Revert "drm/vc4: hdmi: Make sure the device is powered with CEC" again + - Linux 5.15.21 + * Jammy update: v5.15.20 upstream stable release (LP: #1960509) + - Revert "UBUNTU: SAUCE: Revert "e1000e: Add handshake with the CSME to + support S0ix"" + - Revert "UBUNTU: SAUCE: Revert "e1000e: Add polling mechanism to indicate + CSME DPG exit"" + - Revert "UBUNTU: SAUCE: Revert "e1000e: Additional PHY power saving in S0ix"" + - PCI: pciehp: Fix infinite loop in IRQ handler upon power fault + - selftests: mptcp: fix ipv6 routing setup + - net: ipa: use a bitmap for endpoint replenish_enabled + - net: ipa: prevent concurrent replenish + - drm/vc4: hdmi: Make sure the device is powered with CEC + - cgroup-v1: Require capabilities to set release_agent + - Revert "mm/gup: small refactoring: simplify try_grab_page()" + - ovl: don't fail copy up if no fileattr support on upper + - lockd: fix server crash on reboot of client holding lock + - lockd: fix failure to cleanup client locks + - net/mlx5e: IPsec: Fix tunnel mode crypto offload for non TCP/UDP traffic + - net/mlx5: Bridge, take rtnl lock in init error handler + - net/mlx5: Bridge, ensure dev_name is null-terminated + - net/mlx5e: Fix handling of wrong devices during bond netevent + - net/mlx5: Use del_timer_sync in fw reset flow of halting poll + - net/mlx5e: Fix module EEPROM query + - net/mlx5: Fix offloading with ESWITCH_IPV4_TTL_MODIFY_ENABLE + - net/mlx5e: Don't treat small ceil values as unlimited in HTB offload + - net/mlx5: Bridge, Fix devlink deadlock on net namespace deletion + - net/mlx5: E-Switch, Fix uninitialized variable modact + - ipheth: fix EOVERFLOW in ipheth_rcvbulk_callback + - i40e: Fix reset bw limit when DCB enabled with 1 TC + - i40e: Fix reset path while removing the driver + - net: amd-xgbe: ensure to reset the tx_timer_active flag + - net: amd-xgbe: Fix skb data length underflow + - fanotify: Fix stale file descriptor in copy_event_to_user() + - net: sched: fix use-after-free in tc_new_tfilter() + - rtnetlink: make sure to refresh master_dev/m_ops in __rtnl_newlink() + - cpuset: Fix the bug that subpart_cpus updated wrongly in update_cpumask() + - e1000e: Handshake with CSME starts from ADL platforms + - af_packet: fix data-race in packet_setsockopt / packet_setsockopt + - tcp: add missing tcp_skb_can_collapse() test in tcp_shift_skb_data() + - ovl: fix NULL pointer dereference in copy up warning + - Linux 5.15.20 + * Miscellaneous Ubuntu changes + - [Packaging] use default zstd compression + - [Packaging] do not use compression for image packages + - [Packaging] use xz compression for ddebs + - [Config] upgrade debug symbols from DWARF4 to DWARF5 + - SAUCE: Makefile: Remove inclusion of lbm header files + - SAUCE: Makefile: Fix compiler warnings + - SAUCE: AUFS + - SAUCE: aufs: switch to 64-bit ino_t for s390x + - [Config] set AUFS as disabled + - SAUCE: mt76: mt7921e: fix possible probe failure after reboot + - Remove ubuntu/hio driver + - SAUCE: ima_policy: fix test for empty rule set + - SAUCE: sfc: The size of the RX recycle ring should be more flexible + - [Config] MITIGATE_SPECTRE_BRANCH_HISTORY=y && HARDEN_BRANCH_HISTORY=y + * Miscellaneous upstream changes + - kbuild: Unify options for BTF generation for vmlinux and modules + - MAINTAINERS: Add scripts/pahole-flags.sh to BPF section + - kbuild: Add CONFIG_PAHOLE_VERSION + - scripts/pahole-flags.sh: Use pahole-version.sh + - lib/Kconfig.debug: Use CONFIG_PAHOLE_VERSION + - lib/Kconfig.debug: Allow BTF + DWARF5 with pahole 1.21+ + - x86/sched: Decrease further the priorities of SMT siblings + - sched/topology: Introduce sched_group::flags + - sched/fair: Optimize checking for group_asym_packing + - sched/fair: Provide update_sg_lb_stats() with sched domain statistics + - sched/fair: Carve out logic to mark a group for asymmetric packing + - sched/fair: Consider SMT in ASYM_PACKING load balance + - Revert "UBUNTU: [Config] x86-64: SYSFB_SIMPLEFB=y" + + [ Ubuntu: 5.15.0-22.22 ] + + * jammy/linux: 5.15.0-22.22 -proposed tracker (LP: #1960290) + + -- Tim Gardner Mon, 21 Mar 2022 11:57:03 -0600 + +linux-azure (5.15.0-1001.2) jammy; urgency=medium + + * jammy/linux-azure: 5.15.0-1001.2 -proposed tracker (LP: #1960267) + + * Add sunrpc module parameters for NFSv3 nconnect (LP: #1958990) + - SAUCE: Add sunrpc module parameters for NFSv3 nconnect + + * MANA updates (LP: #1959012) + - net: mana: Add RX fencing + - net: mana: Fix memory leak in mana_hwc_create_wq + + * Miscellaneous Ubuntu changes + - [Config] azure: CONFIG_FB_EFI=y for arm64 + - [Packaging] azure: Update dependency of pahole / dwarves + + [ Ubuntu: 5.15.0-21.21 ] + + * jammy/linux: 5.15.0-21.21 -proposed tracker (LP: #1960211) + * Miscellaneous Ubuntu changes + - [packaging] unhook lowlatency flavours from the build + + [ Ubuntu: 5.15.0-20.20 ] + + * jammy/linux: 5.15.0-20.20 -proposed tracker (LP: #1959881) + * Jammy update: v5.15.19 upstream stable release (LP: #1959879) + - can: m_can: m_can_fifo_{read,write}: don't read or write from/to FIFO if + length is 0 + - net: sfp: ignore disabled SFP node + - net: stmmac: configure PTP clock source prior to PTP initialization + - net: stmmac: skip only stmmac_ptp_register when resume from suspend + - ARM: 9179/1: uaccess: avoid alignment faults in + copy_[from|to]_kernel_nofault + - ARM: 9180/1: Thumb2: align ALT_UP() sections in modules sufficiently + - KVM: arm64: Use shadow SPSR_EL1 when injecting exceptions on !VHE + - s390/hypfs: include z/VM guests with access control group set + - s390/nmi: handle guarded storage validity failures for KVM guests + - s390/nmi: handle vector validity failures for KVM guests + - bpf: Guard against accessing NULL pt_regs in bpf_get_task_stack() + - powerpc32/bpf: Fix codegen for bpf-to-bpf calls + - powerpc/bpf: Update ldimm64 instructions during extra pass + - scsi: zfcp: Fix failed recovery on gone remote port with non-NPIV FCP + devices + - udf: Restore i_lenAlloc when inode expansion fails + - udf: Fix NULL ptr deref when converting from inline format + - efi: runtime: avoid EFIv2 runtime services on Apple x86 machines + - PM: wakeup: simplify the output logic of pm_show_wakelocks() + - tracing/histogram: Fix a potential memory leak for kstrdup() + - tracing: Don't inc err_log entry count if entry allocation fails + - ceph: properly put ceph_string reference after async create attempt + - ceph: set pool_ns in new inode layout for async creates + - fsnotify: fix fsnotify hooks in pseudo filesystems + - Revert "KVM: SVM: avoid infinite loop on NPF from bad address" + - psi: Fix uaf issue when psi trigger is destroyed while being polled + - powerpc/audit: Fix syscall_get_arch() + - perf/x86/intel/uncore: Fix CAS_COUNT_WRITE issue for ICX + - perf/x86/intel: Add a quirk for the calculation of the number of counters on + Alder Lake + - drm/etnaviv: relax submit size limits + - drm/atomic: Add the crtc to affected crtc only if uapi.enable = true + - drm/amd/display: Fix FP start/end for dcn30_internal_validate_bw. + - KVM: LAPIC: Also cancel preemption timer during SET_LAPIC + - KVM: SVM: Never reject emulation due to SMAP errata for !SEV guests + - KVM: SVM: Don't intercept #GP for SEV guests + - KVM: x86: nSVM: skip eax alignment check for non-SVM instructions + - KVM: x86: Forcibly leave nested virt when SMM state is toggled + - KVM: x86: Keep MSR_IA32_XSS unchanged for INIT + - KVM: x86: Update vCPU's runtime CPUID on write to MSR_IA32_XSS + - KVM: x86: Sync the states size with the XCR0/IA32_XSS at, any time + - KVM: PPC: Book3S HV Nested: Fix nested HFSCR being clobbered with multiple + vCPUs + - dm: revert partial fix for redundant bio-based IO accounting + - block: add bio_start_io_acct_time() to control start_time + - dm: properly fix redundant bio-based IO accounting + - serial: pl011: Fix incorrect rs485 RTS polarity on set_mctrl + - serial: 8250: of: Fix mapped region size when using reg-offset property + - serial: stm32: fix software flow control transfer + - tty: n_gsm: fix SW flow control encoding/handling + - tty: Partially revert the removal of the Cyclades public API + - tty: Add support for Brainboxes UC cards. + - kbuild: remove include/linux/cyclades.h from header file check + - usb-storage: Add unusual-devs entry for VL817 USB-SATA bridge + - usb: xhci-plat: fix crash when suspend if remote wake enable + - usb: common: ulpi: Fix crash in ulpi_match() + - usb: gadget: f_sourcesink: Fix isoc transfer for USB_SPEED_SUPER_PLUS + - usb: cdnsp: Fix segmentation fault in cdns_lost_power function + - usb: dwc3: xilinx: Skip resets and USB3 register settings for USB2.0 mode + - usb: dwc3: xilinx: Fix error handling when getting USB3 PHY + - USB: core: Fix hang in usb_kill_urb by adding memory barriers + - usb: typec: tcpci: don't touch CC line if it's Vconn source + - usb: typec: tcpm: Do not disconnect while receiving VBUS off + - usb: typec: tcpm: Do not disconnect when receiving VSAFE0V + - ucsi_ccg: Check DEV_INT bit only when starting CCG4 + - mm, kasan: use compare-exchange operation to set KASAN page tag + - jbd2: export jbd2_journal_[grab|put]_journal_head + - ocfs2: fix a deadlock when commit trans + - sched/membarrier: Fix membarrier-rseq fence command missing from query + bitmask + - PCI/sysfs: Find shadow ROM before static attribute initialization + - x86/MCE/AMD: Allow thresholding interface updates after init + - x86/cpu: Add Xeon Icelake-D to list of CPUs that support PPIN + - powerpc/32s: Allocate one 256k IBAT instead of two consecutives 128k IBATs + - powerpc/32s: Fix kasan_init_region() for KASAN + - powerpc/32: Fix boot failure with GCC latent entropy plugin + - i40e: Increase delay to 1 s after global EMP reset + - i40e: Fix issue when maximum queues is exceeded + - i40e: Fix queues reservation for XDP + - i40e: Fix for failed to init adminq while VF reset + - i40e: fix unsigned stat widths + - usb: roles: fix include/linux/usb/role.h compile issue + - rpmsg: char: Fix race between the release of rpmsg_ctrldev and cdev + - rpmsg: char: Fix race between the release of rpmsg_eptdev and cdev + - scsi: elx: efct: Don't use GFP_KERNEL under spin lock + - scsi: bnx2fc: Flush destroy_work queue before calling bnx2fc_interface_put() + - ipv6_tunnel: Rate limit warning messages + - ARM: 9170/1: fix panic when kasan and kprobe are enabled + - net: fix information leakage in /proc/net/ptype + - hwmon: (lm90) Mark alert as broken for MAX6646/6647/6649 + - hwmon: (lm90) Mark alert as broken for MAX6680 + - ping: fix the sk_bound_dev_if match in ping_lookup + - ipv4: avoid using shared IP generator for connected sockets + - hwmon: (lm90) Reduce maximum conversion rate for G781 + - NFSv4: Handle case where the lookup of a directory fails + - NFSv4: nfs_atomic_open() can race when looking up a non-regular file + - net-procfs: show net devices bound packet types + - drm/msm: Fix wrong size calculation + - drm/msm/dsi: Fix missing put_device() call in dsi_get_phy + - drm/msm/dsi: invalid parameter check in msm_dsi_phy_enable + - ipv6: annotate accesses to fn->fn_sernum + - NFS: Ensure the server has an up to date ctime before hardlinking + - NFS: Ensure the server has an up to date ctime before renaming + - KVM: arm64: pkvm: Use the mm_ops indirection for cache maintenance + - SUNRPC: Use BIT() macro in rpc_show_xprt_state() + - SUNRPC: Don't dereference xprt->snd_task if it's a cookie + - powerpc64/bpf: Limit 'ldbrx' to processors compliant with ISA v2.06 + - netfilter: conntrack: don't increment invalid counter on NF_REPEAT + - powerpc/64s: Mask SRR0 before checking against the masked NIP + - perf: Fix perf_event_read_local() time + - sched/pelt: Relax the sync of util_sum with util_avg + - net: phy: broadcom: hook up soft_reset for BCM54616S + - net: stmmac: dwmac-visconti: Fix bit definitions for ETHER_CLK_SEL + - net: stmmac: dwmac-visconti: Fix clock configuration for RMII mode + - phylib: fix potential use-after-free + - octeontx2-af: Do not fixup all VF action entries + - octeontx2-af: Fix LBK backpressure id count + - octeontx2-af: Retry until RVU block reset complete + - octeontx2-pf: cn10k: Ensure valid pointers are freed to aura + - octeontx2-af: verify CQ context updates + - octeontx2-af: Increase link credit restore polling timeout + - octeontx2-af: cn10k: Do not enable RPM loopback for LPC interfaces + - octeontx2-pf: Forward error codes to VF + - rxrpc: Adjust retransmission backoff + - efi/libstub: arm64: Fix image check alignment at entry + - io_uring: fix bug in slow unregistering of nodes + - Drivers: hv: balloon: account for vmbus packet header in max_pkt_size + - hwmon: (lm90) Re-enable interrupts after alert clears + - hwmon: (lm90) Mark alert as broken for MAX6654 + - hwmon: (lm90) Fix sysfs and udev notifications + - hwmon: (adt7470) Prevent divide by zero in adt7470_fan_write() + - powerpc/perf: Fix power_pmu_disable to call clear_pmi_irq_pending only if + PMI is pending + - ipv4: fix ip option filtering for locally generated fragments + - ibmvnic: Allow extra failures before disabling + - ibmvnic: init ->running_cap_crqs early + - ibmvnic: don't spin in tasklet + - net/smc: Transitional solution for clcsock race issue + - video: hyperv_fb: Fix validation of screen resolution + - can: tcan4x5x: regmap: fix max register value + - drm/msm/hdmi: Fix missing put_device() call in msm_hdmi_get_phy + - drm/msm/dpu: invalid parameter check in dpu_setup_dspp_pcc + - drm/msm/a6xx: Add missing suspend_count increment + - yam: fix a memory leak in yam_siocdevprivate() + - net: cpsw: Properly initialise struct page_pool_params + - net: hns3: handle empty unknown interrupt for VF + - sch_htb: Fail on unsupported parameters when offload is requested + - Revert "drm/ast: Support 1600x900 with 108MHz PCLK" + - KVM: selftests: Don't skip L2's VMCALL in SMM test for SVM guest + - ceph: put the requests/sessions when it fails to alloc memory + - gve: Fix GFP flags when allocing pages + - Revert "ipv6: Honor all IPv6 PIO Valid Lifetime values" + - net: bridge: vlan: fix single net device option dumping + - ipv4: raw: lock the socket in raw_bind() + - ipv4: tcp: send zero IPID in SYNACK messages + - ipv4: remove sparse error in ip_neigh_gw4() + - net: bridge: vlan: fix memory leak in __allowed_ingress + - Bluetooth: refactor malicious adv data check + - irqchip/realtek-rtl: Map control data to virq + - irqchip/realtek-rtl: Fix off-by-one in routing + - dt-bindings: can: tcan4x5x: fix mram-cfg RX FIFO config + - perf/core: Fix cgroup event list management + - psi: fix "no previous prototype" warnings when CONFIG_CGROUPS=n + - psi: fix "defined but not used" warnings when CONFIG_PROC_FS=n + - usb: dwc3: xilinx: fix uninitialized return value + - usr/include/Makefile: add linux/nfc.h to the compile-test coverage + - fsnotify: invalidate dcache before IN_DELETE event + - block: Fix wrong offset in bio_truncate() + - mtd: rawnand: mpc5121: Remove unused variable in ads5121_select_chip() + - Linux 5.15.19 + * Jammy update: v5.15.18 upstream stable release (LP: #1959878) + - drm/i915: Flush TLBs before releasing backing store + - drm/amd/display: reset dcn31 SMU mailbox on failures + - io_uring: fix not released cached task refs + - bnx2x: Utilize firmware 7.13.21.0 + - bnx2x: Invalidate fastpath HSI version for VFs + - memcg: flush stats only if updated + - memcg: unify memcg stat flushing + - memcg: better bounds on the memcg stats updates + - rcu: Tighten rcu_advance_cbs_nowake() checks + - select: Fix indefinitely sleeping task in poll_schedule_timeout() + - drm/amdgpu: Use correct VIEWPORT_DIMENSION for DCN2 + - arm64/bpf: Remove 128MB limit for BPF JIT programs + - Linux 5.15.18 + * CVE-2022-22942 + - SAUCE: drm/vmwgfx: Fix stale file descriptors on failed usercopy + * CVE-2022-24122 + - ucount: Make get_ucount a safe get_user replacement + * CVE-2022-23222 + - bpf, selftests: Add verifier test for mem_or_null register with offset. + * Miscellaneous Ubuntu changes + - [Config] toolchain version update + * Miscellaneous upstream changes + - s390/module: fix loading modules with a lot of relocations + + [ Ubuntu: 5.15.0-19.19 ] + + * jammy/linux: 5.15.0-19.19 -proposed tracker (LP: #1959418) + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + * Jammy update: v5.15.17 upstream stable release (LP: #1959376) + - KVM: x86/mmu: Fix write-protection of PTs mapped by the TDP MMU + - KVM: VMX: switch blocked_vcpu_on_cpu_lock to raw spinlock + - HID: Ignore battery for Elan touchscreen on HP Envy X360 15t-dr100 + - HID: uhid: Fix worker destroying device without any protection + - HID: wacom: Reset expected and received contact counts at the same time + - HID: wacom: Ignore the confidence flag when a touch is removed + - HID: wacom: Avoid using stale array indicies to read contact count + - ALSA: core: Fix SSID quirk lookup for subvendor=0 + - f2fs: fix to do sanity check on inode type during garbage collection + - f2fs: fix to do sanity check in is_alive() + - f2fs: avoid EINVAL by SBI_NEED_FSCK when pinning a file + - nfc: llcp: fix NULL error pointer dereference on sendmsg() after failed + bind() + - mtd: rawnand: gpmi: Add ERR007117 protection for nfc_apply_timings + - mtd: rawnand: gpmi: Remove explicit default gpmi clock setting for i.MX6 + - mtd: Fixed breaking list in __mtd_del_partition. + - mtd: rawnand: davinci: Don't calculate ECC when reading page + - mtd: rawnand: davinci: Avoid duplicated page read + - mtd: rawnand: davinci: Rewrite function description + - mtd: rawnand: Export nand_read_page_hwecc_oob_first() + - mtd: rawnand: ingenic: JZ4740 needs 'oob_first' read page function + - riscv: Get rid of MAXPHYSMEM configs + - RISC-V: Use common riscv_cpuid_to_hartid_mask() for both SMP=y and SMP=n + - riscv: try to allocate crashkern region from 32bit addressible memory + - riscv: Don't use va_pa_offset on kdump + - riscv: use hart id instead of cpu id on machine_kexec + - riscv: mm: fix wrong phys_ram_base value for RV64 + - x86/gpu: Reserve stolen memory for first integrated Intel GPU + - tools/nolibc: x86-64: Fix startup code bug + - crypto: x86/aesni - don't require alignment of data + - tools/nolibc: i386: fix initial stack alignment + - tools/nolibc: fix incorrect truncation of exit code + - rtc: cmos: take rtc_lock while reading from CMOS + - net: phy: marvell: add Marvell specific PHY loopback + - ksmbd: uninitialized variable in create_socket() + - ksmbd: fix guest connection failure with nautilus + - ksmbd: add support for smb2 max credit parameter + - ksmbd: move credit charge deduction under processing request + - ksmbd: limits exceeding the maximum allowable outstanding requests + - ksmbd: add reserved room in ipc request/response + - media: cec: fix a deadlock situation + - media: ov8865: Disable only enabled regulators on error path + - media: v4l2-ioctl.c: readbuffers depends on V4L2_CAP_READWRITE + - media: flexcop-usb: fix control-message timeouts + - media: mceusb: fix control-message timeouts + - media: em28xx: fix control-message timeouts + - media: cpia2: fix control-message timeouts + - media: s2255: fix control-message timeouts + - media: dib0700: fix undefined behavior in tuner shutdown + - media: redrat3: fix control-message timeouts + - media: pvrusb2: fix control-message timeouts + - media: stk1160: fix control-message timeouts + - media: cec-pin: fix interrupt en/disable handling + - can: softing_cs: softingcs_probe(): fix memleak on registration failure + - mei: hbm: fix client dma reply status + - iio: adc: ti-adc081c: Partial revert of removal of ACPI IDs + - iio: trigger: Fix a scheduling whilst atomic issue seen on tsc2046 + - lkdtm: Fix content of section containing lkdtm_rodata_do_nothing() + - bus: mhi: pci_generic: Graceful shutdown on freeze + - bus: mhi: core: Fix reading wake_capable channel configuration + - bus: mhi: core: Fix race while handling SYS_ERR at power up + - cxl/pmem: Fix reference counting for delayed work + - arm64: errata: Fix exec handling in erratum 1418040 workaround + - ARM: dts: at91: update alternate function of signal PD20 + - iommu/io-pgtable-arm-v7s: Add error handle for page table allocation failure + - gpu: host1x: Add back arm_iommu_detach_device() + - drm/tegra: Add back arm_iommu_detach_device() + - virtio/virtio_mem: handle a possible NULL as a memcpy parameter + - dma_fence_array: Fix PENDING_ERROR leak in dma_fence_array_signaled() + - PCI: Add function 1 DMA alias quirk for Marvell 88SE9125 SATA controller + - mm_zone: add function to check if managed dma zone exists + - dma/pool: create dma atomic pool only if dma zone has managed pages + - mm/page_alloc.c: do not warn allocation failure on zone DMA if no managed + pages + - shmem: fix a race between shmem_unused_huge_shrink and shmem_evict_inode + - drm/ttm: Put BO in its memory manager's lru list + - Bluetooth: L2CAP: Fix not initializing sk_peer_pid + - drm/bridge: display-connector: fix an uninitialized pointer in probe() + - drm: fix null-ptr-deref in drm_dev_init_release() + - drm/panel: kingdisplay-kd097d04: Delete panel on attach() failure + - drm/panel: innolux-p079zca: Delete panel on attach() failure + - drm/rockchip: dsi: Fix unbalanced clock on probe error + - drm/rockchip: dsi: Hold pm-runtime across bind/unbind + - drm/rockchip: dsi: Disable PLL clock on bind error + - drm/rockchip: dsi: Reconfigure hardware on resume() + - Bluetooth: virtio_bt: fix memory leak in virtbt_rx_handle() + - Bluetooth: cmtp: fix possible panic when cmtp_init_sockets() fails + - clk: bcm-2835: Pick the closest clock rate + - clk: bcm-2835: Remove rounding up the dividers + - drm/vc4: hdmi: Set a default HSM rate + - drm/vc4: hdmi: Move the HSM clock enable to runtime_pm + - drm/vc4: hdmi: Make sure the controller is powered in detect + - drm/vc4: hdmi: Make sure the controller is powered up during bind + - drm/vc4: hdmi: Rework the pre_crtc_configure error handling + - drm/vc4: crtc: Make sure the HDMI controller is powered when disabling + - wcn36xx: ensure pairing of init_scan/finish_scan and start_scan/end_scan + - wcn36xx: Indicate beacon not connection loss on MISSED_BEACON_IND + - drm/vc4: hdmi: Enable the scrambler on reconnection + - libbpf: Free up resources used by inner map definition + - wcn36xx: Fix DMA channel enable/disable cycle + - wcn36xx: Release DMA channel descriptor allocations + - wcn36xx: Put DXE block into reset before freeing memory + - wcn36xx: populate band before determining rate on RX + - wcn36xx: fix RX BD rate mapping for 5GHz legacy rates + - ath11k: Send PPDU_STATS_CFG with proper pdev mask to firmware + - bpftool: Fix memory leak in prog_dump() + - mtd: hyperbus: rpc-if: Check return value of rpcif_sw_init() + - media: videobuf2: Fix the size printk format + - media: atomisp: add missing media_device_cleanup() in + atomisp_unregister_entities() + - media: atomisp: fix punit_ddr_dvfs_enable() argument for mrfld_power up case + - media: atomisp: fix inverted logic in buffers_needed() + - media: atomisp: do not use err var when checking port validity for ISP2400 + - media: atomisp: fix inverted error check for + ia_css_mipi_is_source_port_valid() + - media: atomisp: fix ifdefs in sh_css.c + - media: atomisp: add NULL check for asd obtained from atomisp_video_pipe + - media: atomisp: fix enum formats logic + - media: atomisp: fix uninitialized bug in gmin_get_pmic_id_and_addr() + - media: aspeed: fix mode-detect always time out at 2nd run + - media: em28xx: fix memory leak in em28xx_init_dev + - media: aspeed: Update signal status immediately to ensure sane hw state + - arm64: dts: amlogic: meson-g12: Fix GPU operating point table node name + - arm64: dts: amlogic: Fix SPI NOR flash node name for ODROID N2/N2+ + - arm64: dts: meson-gxbb-wetek: fix HDMI in early boot + - arm64: dts: meson-gxbb-wetek: fix missing GPIO binding + - fs: dlm: don't call kernel_getpeername() in error_report() + - memory: renesas-rpc-if: Return error in case devm_ioremap_resource() fails + - Bluetooth: stop proccessing malicious adv data + - ath11k: Fix ETSI regd with weather radar overlap + - ath11k: clear the keys properly via DISABLE_KEY + - ath11k: reset RSN/WPA present state for open BSS + - spi: hisi-kunpeng: Fix the debugfs directory name incorrect + - tee: fix put order in teedev_close_context() + - fs: dlm: fix build with CONFIG_IPV6 disabled + - drm/dp: Don't read back backlight mode in drm_edp_backlight_enable() + - drm/vboxvideo: fix a NULL vs IS_ERR() check + - arm64: dts: renesas: cat875: Add rx/tx delays + - media: dmxdev: fix UAF when dvb_register_device() fails + - crypto: atmel-aes - Reestablish the correct tfm context at dequeue + - crypto: qce - fix uaf on qce_aead_register_one + - crypto: qce - fix uaf on qce_ahash_register_one + - crypto: qce - fix uaf on qce_skcipher_register_one + - arm64: dts: qcom: sc7280: Fix incorrect clock name + - mtd: hyperbus: rpc-if: fix bug in rpcif_hb_remove + - cpufreq: qcom-cpufreq-hw: Update offline CPUs per-cpu thermal pressure + - cpufreq: qcom-hw: Fix probable nested interrupt handling + - ARM: dts: stm32: fix dtbs_check warning on ili9341 dts binding on stm32f429 + disco + - libbpf: Fix potential misaligned memory access in btf_ext__new() + - libbpf: Fix glob_syms memory leak in bpf_linker + - libbpf: Fix using invalidated memory in bpf_linker + - crypto: qat - remove unnecessary collision prevention step in PFVF + - crypto: qat - make pfvf send message direction agnostic + - crypto: qat - fix undetected PFVF timeout in ACK loop + - ath11k: Use host CE parameters for CE interrupts configuration + - arm64: dts: ti: k3-j721e: correct cache-sets info + - tty: serial: atmel: Check return code of dmaengine_submit() + - tty: serial: atmel: Call dma_async_issue_pending() + - mfd: atmel-flexcom: Remove #ifdef CONFIG_PM_SLEEP + - mfd: atmel-flexcom: Use .resume_noirq + - bfq: Do not let waker requests skip proper accounting + - libbpf: Silence uninitialized warning/error in btf_dump_dump_type_data + - media: i2c: imx274: fix s_frame_interval runtime resume not requested + - media: i2c: Re-order runtime pm initialisation + - media: i2c: ov8865: Fix lockdep error + - media: rcar-csi2: Correct the selection of hsfreqrange + - media: imx-pxp: Initialize the spinlock prior to using it + - media: si470x-i2c: fix possible memory leak in si470x_i2c_probe() + - media: mtk-vcodec: call v4l2_m2m_ctx_release first when file is released + - media: hantro: Hook up RK3399 JPEG encoder output + - media: coda: fix CODA960 JPEG encoder buffer overflow + - media: venus: correct low power frequency calculation for encoder + - media: venus: core: Fix a potential NULL pointer dereference in an error + handling path + - media: venus: core: Fix a resource leak in the error handling path of + 'venus_probe()' + - net: stmmac: Add platform level debug register dump feature + - thermal/drivers/imx: Implement runtime PM support + - igc: AF_XDP zero-copy metadata adjust breaks SKBs on XDP_PASS + - netfilter: bridge: add support for pppoe filtering + - powerpc: Avoid discarding flags in system_call_exception() + - arm64: dts: qcom: msm8916: fix MMC controller aliases + - drm/vmwgfx: Remove the deprecated lower mem limit + - drm/vmwgfx: Fail to initialize on broken configs + - cgroup: Trace event cgroup id fields should be u64 + - ACPI: EC: Rework flushing of EC work while suspended to idle + - thermal/drivers/imx8mm: Enable ADC when enabling monitor + - drm/amdgpu: Fix a NULL pointer dereference in + amdgpu_connector_lcd_native_mode() + - drm/radeon/radeon_kms: Fix a NULL pointer dereference in + radeon_driver_open_kms() + - libbpf: Clean gen_loader's attach kind. + - crypto: caam - save caam memory to support crypto engine retry mechanism. + - arm64: dts: ti: k3-am642: Fix the L2 cache sets + - arm64: dts: ti: k3-j7200: Fix the L2 cache sets + - arm64: dts: ti: k3-j721e: Fix the L2 cache sets + - arm64: dts: ti: k3-j7200: Correct the d-cache-sets info + - tty: serial: uartlite: allow 64 bit address + - serial: amba-pl011: do not request memory region twice + - mtd: core: provide unique name for nvmem device + - floppy: Fix hang in watchdog when disk is ejected + - staging: rtl8192e: return error code from rtllib_softmac_init() + - staging: rtl8192e: rtllib_module: fix error handle case in alloc_rtllib() + - Bluetooth: btmtksdio: fix resume failure + - bpf: Fix the test_task_vma selftest to support output shorter than 1 kB + - sched/fair: Fix detection of per-CPU kthreads waking a task + - sched/fair: Fix per-CPU kthread and wakee stacking for asym CPU capacity + - bpf: Adjust BTF log size limit. + - bpf: Disallow BPF_LOG_KERNEL log level for bpf(BPF_BTF_LOAD) + - bpf: Remove config check to enable bpf support for branch records + - arm64: clear_page() shouldn't use DC ZVA when DCZID_EL0.DZP == 1 + - arm64: mte: DC {GVA,GZVA} shouldn't be used when DCZID_EL0.DZP == 1 + - samples/bpf: Install libbpf headers when building + - samples/bpf: Clean up samples/bpf build failes + - samples: bpf: Fix xdp_sample_user.o linking with Clang + - samples: bpf: Fix 'unknown warning group' build warning on Clang + - media: dib8000: Fix a memleak in dib8000_init() + - media: saa7146: mxb: Fix a NULL pointer dereference in mxb_attach() + - media: si2157: Fix "warm" tuner state detection + - wireless: iwlwifi: Fix a double free in iwl_txq_dyn_alloc_dma + - sched/rt: Try to restart rt period timer when rt runtime exceeded + - ath10k: Fix the MTU size on QCA9377 SDIO + - Bluetooth: refactor set_exp_feature with a feature table + - Bluetooth: MGMT: Use hci_dev_test_and_{set,clear}_flag + - drm/amd/display: Fix bug in debugfs crc_win_update entry + - drm/msm/gpu: Don't allow zero fence_id + - drm/msm/dp: displayPort driver need algorithm rational + - rcu/exp: Mark current CPU as exp-QS in IPI loop second pass + - wcn36xx: Fix max channels retrieval + - drm/msm/dsi: fix initialization in the bonded DSI case + - mwifiex: Fix possible ABBA deadlock + - xfrm: fix a small bug in xfrm_sa_len() + - x86/uaccess: Move variable into switch case statement + - selftests: clone3: clone3: add case CLONE3_ARGS_NO_TEST + - selftests: harness: avoid false negatives if test has no ASSERTs + - crypto: stm32/cryp - fix CTR counter carry + - crypto: stm32/cryp - fix xts and race condition in crypto_engine requests + - crypto: stm32/cryp - check early input data + - crypto: stm32/cryp - fix double pm exit + - crypto: stm32/cryp - fix lrw chaining mode + - crypto: stm32/cryp - fix bugs and crash in tests + - crypto: stm32 - Revert broken pm_runtime_resume_and_get changes + - crypto: hisilicon/qm - fix incorrect return value of hisi_qm_resume() + - ath11k: Fix deleting uninitialized kernel timer during fragment cache flush + - spi: Fix incorrect cs_setup delay handling + - ARM: dts: gemini: NAS4220-B: fis-index-block with 128 KiB sectors + - perf/arm-cmn: Fix CPU hotplug unregistration + - media: dw2102: Fix use after free + - media: msi001: fix possible null-ptr-deref in msi001_probe() + - media: coda/imx-vdoa: Handle dma_set_coherent_mask error codes + - ath11k: Fix a NULL pointer dereference in ath11k_mac_op_hw_scan() + - net: dsa: hellcreek: Fix insertion of static FDB entries + - net: dsa: hellcreek: Add STP forwarding rule + - net: dsa: hellcreek: Allow PTP P2P measurements on blocked ports + - net: dsa: hellcreek: Add missing PTP via UDP rules + - arm64: dts: qcom: c630: Fix soundcard setup + - arm64: dts: qcom: ipq6018: Fix gpio-ranges property + - drm/msm/dpu: fix safe status debugfs file + - drm/bridge: ti-sn65dsi86: Set max register for regmap + - gpu: host1x: select CONFIG_DMA_SHARED_BUFFER + - drm/tegra: gr2d: Explicitly control module reset + - drm/tegra: vic: Fix DMA API misuse + - media: hantro: Fix probe func error path + - xfrm: interface with if_id 0 should return error + - xfrm: state and policy should fail if XFRMA_IF_ID 0 + - ARM: 9159/1: decompressor: Avoid UNPREDICTABLE NOP encoding + - usb: ftdi-elan: fix memory leak on device disconnect + - arm64: dts: marvell: cn9130: add GPIO and SPI aliases + - arm64: dts: marvell: cn9130: enable CP0 GPIO controllers + - ARM: dts: armada-38x: Add generic compatible to UART nodes + - mt76: mt7921: drop offload_flags overwritten + - wilc1000: fix double free error in probe() + - rtw88: add quirk to disable pci caps on HP 250 G7 Notebook PC + - iwlwifi: mvm: fix 32-bit build in FTM + - iwlwifi: mvm: test roc running status bits before removing the sta + - iwlwifi: mvm: perform 6GHz passive scan after suspend + - iwlwifi: mvm: set protected flag only for NDP ranging + - mmc: meson-mx-sdhc: add IRQ check + - mmc: meson-mx-sdio: add IRQ check + - block: fix error unwinding in device_add_disk + - selinux: fix potential memleak in selinux_add_opt() + - um: fix ndelay/udelay defines + - um: rename set_signals() to um_set_signals() + - um: virt-pci: Fix 32-bit compile + - lib/logic_iomem: Fix 32-bit build + - lib/logic_iomem: Fix operation on 32-bit + - um: virtio_uml: Fix time-travel external time propagation + - Bluetooth: L2CAP: Fix using wrong mode + - bpftool: Enable line buffering for stdout + - backlight: qcom-wled: Validate enabled string indices in DT + - backlight: qcom-wled: Pass number of elements to read to read_u32_array + - backlight: qcom-wled: Fix off-by-one maximum with default num_strings + - backlight: qcom-wled: Override default length with qcom,enabled-strings + - backlight: qcom-wled: Use cpu_to_le16 macro to perform conversion + - backlight: qcom-wled: Respect enabled-strings in set_brightness + - software node: fix wrong node passed to find nargs_prop + - Bluetooth: hci_qca: Stop IBS timer during BT OFF + - x86/boot/compressed: Move CLANG_FLAGS to beginning of KBUILD_CFLAGS + - crypto: octeontx2 - prevent underflow in get_cores_bmap() + - regulator: qcom-labibb: OCP interrupts are not a failure while disabled + - hwmon: (mr75203) fix wrong power-up delay value + - x86/mce/inject: Avoid out-of-bounds write when setting flags + - io_uring: remove double poll on poll update + - serial: 8250_bcm7271: Propagate error codes from brcmuart_probe() + - ACPI: scan: Create platform device for BCM4752 and LNV4752 ACPI nodes + - pcmcia: rsrc_nonstatic: Fix a NULL pointer dereference in + __nonstatic_find_io_region() + - pcmcia: rsrc_nonstatic: Fix a NULL pointer dereference in + nonstatic_find_mem_region() + - power: reset: mt6397: Check for null res pointer + - net/xfrm: IPsec tunnel mode fix inner_ipproto setting in sec_path + - net: ethernet: mtk_eth_soc: fix return values and refactor MDIO ops + - net: dsa: fix incorrect function pointer check for MRP ring roles + - netfilter: ipt_CLUSTERIP: fix refcount leak in clusterip_tg_check() + - bpf, sockmap: Fix return codes from tcp_bpf_recvmsg_parser() + - bpf, sockmap: Fix double bpf_prog_put on error case in map_link + - bpf: Don't promote bogus looking registers after null check. + - bpf: Fix verifier support for validation of async callbacks + - bpf: Fix SO_RCVBUF/SO_SNDBUF handling in _bpf_setsockopt(). + - netfilter: nft_payload: do not update layer 4 checksum when mangling + fragments + - netfilter: nft_set_pipapo: allocate pcpu scratch maps on clone + - net: fix SOF_TIMESTAMPING_BIND_PHC to work with multiple sockets + - ppp: ensure minimum packet size in ppp_write() + - rocker: fix a sleeping in atomic bug + - staging: greybus: audio: Check null pointer + - fsl/fman: Check for null pointer after calling devm_ioremap + - Bluetooth: hci_bcm: Check for error irq + - Bluetooth: hci_qca: Fix NULL vs IS_ERR_OR_NULL check in qca_serdev_probe + - net/smc: Reset conn->lgr when link group registration fails + - usb: dwc3: qcom: Fix NULL vs IS_ERR checking in dwc3_qcom_probe + - usb: dwc2: do not gate off the hardware if it does not support clock gating + - usb: dwc2: gadget: initialize max_speed from params + - usb: gadget: u_audio: Subdevice 0 for capture ctls + - HID: hid-uclogic-params: Invalid parameter check in uclogic_params_init + - HID: hid-uclogic-params: Invalid parameter check in + uclogic_params_get_str_desc + - HID: hid-uclogic-params: Invalid parameter check in + uclogic_params_huion_init + - HID: hid-uclogic-params: Invalid parameter check in + uclogic_params_frame_init_v1_buttonpad + - debugfs: lockdown: Allow reading debugfs files that are not world readable + - drivers/firmware: Add missing platform_device_put() in sysfb_create_simplefb + - serial: liteuart: fix MODULE_ALIAS + - serial: stm32: move tx dma terminate DMA to shutdown + - x86, sched: Fix undefined reference to init_freq_invariance_cppc() build + error + - net/mlx5e: Fix page DMA map/unmap attributes + - net/mlx5e: Fix wrong usage of fib_info_nh when routes with nexthop objects + are used + - net/mlx5e: Don't block routes with nexthop objects in SW + - Revert "net/mlx5e: Block offload of outer header csum for UDP tunnels" + - Revert "net/mlx5e: Block offload of outer header csum for GRE tunnel" + - net/mlx5e: Fix matching on modified inner ip_ecn bits + - net/mlx5: Fix access to sf_dev_table on allocation failure + - net/mlx5e: Sync VXLAN udp ports during uplink representor profile change + - net/mlx5: Set command entry semaphore up once got index free + - lib/mpi: Add the return value check of kcalloc() + - Bluetooth: L2CAP: uninitialized variables in l2cap_sock_setsockopt() + - mptcp: fix per socket endpoint accounting + - mptcp: fix opt size when sending DSS + MP_FAIL + - mptcp: fix a DSS option writing error + - spi: spi-meson-spifc: Add missing pm_runtime_disable() in meson_spifc_probe + - octeontx2-af: Increment ptp refcount before use + - ax25: uninitialized variable in ax25_setsockopt() + - netrom: fix api breakage in nr_setsockopt() + - regmap: Call regmap_debugfs_exit() prior to _init() + - net: mscc: ocelot: fix incorrect balancing with down LAG ports + - can: mcp251xfd: add missing newline to printed strings + - tpm: add request_locality before write TPM_INT_ENABLE + - tpm_tis: Fix an error handling path in 'tpm_tis_core_init()' + - can: softing: softing_startstop(): fix set but not used variable warning + - can: xilinx_can: xcan_probe(): check for error irq + - can: rcar_canfd: rcar_canfd_channel_probe(): make sure we free CAN network + device + - pcmcia: fix setting of kthread task states + - net/sched: flow_dissector: Fix matching on zone id for invalid conns + - net: openvswitch: Fix matching zone id for invalid conns arriving from tc + - net: openvswitch: Fix ct_state nat flags for conns arriving from tc + - iwlwifi: mvm: Use div_s64 instead of do_div in iwl_mvm_ftm_rtt_smoothing() + - bnxt_en: Refactor coredump functions + - bnxt_en: move coredump functions into dedicated file + - bnxt_en: use firmware provided max timeout for messages + - net: mcs7830: handle usb read errors properly + - ext4: avoid trim error on fs with small groups + - ASoC: Intel: sof_sdw: fix jack detection on HP Spectre x360 convertible + - ALSA: jack: Add missing rwsem around snd_ctl_remove() calls + - ALSA: PCM: Add missing rwsem around snd_ctl_remove() calls + - ALSA: hda: Add missing rwsem around snd_ctl_remove() calls + - ALSA: hda: Fix potential deadlock at codec unbinding + - RDMA/bnxt_re: Scan the whole bitmap when checking if "disabling RCFW with + pending cmd-bit" + - RDMA/hns: Validate the pkey index + - scsi: pm80xx: Update WARN_ON check in pm8001_mpi_build_cmd() + - clk: renesas: rzg2l: Check return value of pm_genpd_init() + - clk: renesas: rzg2l: propagate return value of_genpd_add_provider_simple() + - clk: imx8mn: Fix imx8mn_clko1_sels + - powerpc/prom_init: Fix improper check of prom_getprop() + - ASoC: uniphier: drop selecting non-existing SND_SOC_UNIPHIER_AIO_DMA + - ASoC: codecs: wcd938x: add SND_SOC_WCD938_SDW to codec list instead + - RDMA/rtrs-clt: Fix the initial value of min_latency + - ALSA: hda: Make proper use of timecounter + - dt-bindings: thermal: Fix definition of cooling-maps contribution property + - powerpc/perf: Fix PMU callbacks to clear pending PMI before resetting an + overflown PMC + - powerpc/modules: Don't WARN on first module allocation attempt + - powerpc/32s: Fix shift-out-of-bounds in KASAN init + - clocksource: Avoid accidental unstable marking of clocksources + - ALSA: oss: fix compile error when OSS_DEBUG is enabled + - ALSA: usb-audio: Drop superfluous '0' in Presonus Studio 1810c's ID + - misc: at25: Make driver OF independent again + - char/mwave: Adjust io port register size + - binder: fix handling of error during copy + - binder: avoid potential data leakage when copying txn + - openrisc: Add clone3 ABI wrapper + - iommu: Extend mutex lock scope in iommu_probe_device() + - iommu/io-pgtable-arm: Fix table descriptor paddr formatting + - scsi: core: Fix scsi_device_max_queue_depth() + - scsi: ufs: Fix race conditions related to driver data + - RDMA/qedr: Fix reporting max_{send/recv}_wr attrs + - PCI/MSI: Fix pci_irq_vector()/pci_irq_get_affinity() + - powerpc/powermac: Add additional missing lockdep_register_key() + - iommu/arm-smmu-qcom: Fix TTBR0 read + - RDMA/core: Let ib_find_gid() continue search even after empty entry + - RDMA/cma: Let cma_resolve_ib_dev() continue search even after empty entry + - ASoC: rt5663: Handle device_property_read_u32_array error codes + - of: unittest: fix warning on PowerPC frame size warning + - of: unittest: 64 bit dma address test requires arch support + - clk: stm32: Fix ltdc's clock turn off by clk_disable_unused() after system + enter shell + - mips: add SYS_HAS_CPU_MIPS64_R5 config for MIPS Release 5 support + - mips: fix Kconfig reference to PHYS_ADDR_T_64BIT + - dmaengine: pxa/mmp: stop referencing config->slave_id + - iommu/amd: Restore GA log/tail pointer on host resume + - iommu/amd: X2apic mode: re-enable after resume + - iommu/amd: X2apic mode: setup the INTX registers on mask/unmask + - iommu/amd: X2apic mode: mask/unmask interrupts on suspend/resume + - iommu/amd: Remove useless irq affinity notifier + - ASoC: Intel: catpt: Test dmaengine_submit() result before moving on + - iommu/iova: Fix race between FQ timeout and teardown + - ASoC: mediatek: mt8195: correct default value + - of: fdt: Aggregate the processing of "linux,usable-memory-range" + - efi: apply memblock cap after memblock_add() + - scsi: block: pm: Always set request queue runtime active in + blk_post_runtime_resume() + - phy: uniphier-usb3ss: fix unintended writing zeros to PHY register + - ASoC: mediatek: Check for error clk pointer + - powerpc/64s: Mask NIP before checking against SRR0 + - powerpc/64s: Use EMIT_WARN_ENTRY for SRR debug warnings + - phy: cadence: Sierra: Fix to get correct parent for mux clocks + - ASoC: samsung: idma: Check of ioremap return value + - misc: lattice-ecp3-config: Fix task hung when firmware load failed + - ASoC: mediatek: mt8195: correct pcmif BE dai control flow + - arm64: tegra: Remove non existent Tegra194 reset + - mips: lantiq: add support for clk_set_parent() + - mips: bcm63xx: add support for clk_set_parent() + - powerpc/xive: Add missing null check after calling kmalloc + - ASoC: fsl_mqs: fix MODULE_ALIAS + - ALSA: hda/cs8409: Increase delay during jack detection + - ALSA: hda/cs8409: Fix Jack detection after resume + - RDMA/cxgb4: Set queue pair state when being queried + - clk: qcom: gcc-sc7280: Mark gcc_cfg_noc_lpass_clk always enabled + - ASoC: imx-card: Need special setting for ak4497 on i.MX8MQ + - ASoC: imx-card: Fix mclk calculation issue for akcodec + - ASoC: imx-card: improve the sound quality for low rate + - ASoC: fsl_asrc: refine the check of available clock divider + - clk: bm1880: remove kfrees on static allocations + - of: base: Fix phandle argument length mismatch error message + - of/fdt: Don't worry about non-memory region overlap for no-map + - MIPS: boot/compressed/: add __ashldi3 to target for ZSTD compression + - MIPS: compressed: Fix build with ZSTD compression + - mailbox: fix gce_num of mt8192 driver data + - ARM: dts: omap3-n900: Fix lp5523 for multi color + - leds: lp55xx: initialise output direction from dts + - Bluetooth: Fix debugfs entry leak in hci_register_dev() + - Bluetooth: Fix memory leak of hci device + - drm/panel: Delete panel on mipi_dsi_attach() failure + - Bluetooth: Fix removing adv when processing cmd complete + - fs: dlm: filter user dlm messages for kernel locks + - drm/lima: fix warning when CONFIG_DEBUG_SG=y & CONFIG_DMA_API_DEBUG=y + - selftests/bpf: Fix memory leaks in btf_type_c_dump() helper + - selftests/bpf: Destroy XDP link correctly + - selftests/bpf: Fix bpf_object leak in skb_ctx selftest + - ar5523: Fix null-ptr-deref with unexpected WDCMSG_TARGET_START reply + - drm/bridge: dw-hdmi: handle ELD when DRM_BRIDGE_ATTACH_NO_CONNECTOR + - drm/nouveau/pmu/gm200-: avoid touching PMU outside of DEVINIT/PREOS/ACR + - media: atomisp: fix try_fmt logic + - media: atomisp: set per-device's default mode + - media: atomisp-ov2680: Fix ov2680_set_fmt() clobbering the exposure + - media: atomisp: check before deference asd variable + - ARM: shmobile: rcar-gen2: Add missing of_node_put() + - batman-adv: allow netlink usage in unprivileged containers + - media: atomisp: handle errors at sh_css_create_isp_params() + - ath11k: Fix crash caused by uninitialized TX ring + - usb: dwc3: meson-g12a: fix shared reset control use + - USB: ehci_brcm_hub_control: Improve port index sanitizing + - usb: gadget: f_fs: Use stream_open() for endpoint files + - psi: Fix PSI_MEM_FULL state when tasks are in memstall and doing reclaim + - drm: panel-orientation-quirks: Add quirk for the Lenovo Yoga Book X91F/L + - HID: magicmouse: Report battery level over USB + - HID: apple: Do not reset quirks when the Fn key is not found + - media: b2c2: Add missing check in flexcop_pci_isr: + - libbpf: Accommodate DWARF/compiler bug with duplicated structs + - ethernet: renesas: Use div64_ul instead of do_div + - EDAC/synopsys: Use the quirk for version instead of ddr version + - arm64: dts: qcom: sm8350: Shorten camera-thermal-bottom name + - soc: imx: gpcv2: Synchronously suspend MIX domains + - ARM: imx: rename DEBUG_IMX21_IMX27_UART to DEBUG_IMX27_UART + - drm/amd/display: check top_pipe_to_program pointer + - drm/amdgpu/display: set vblank_disable_immediate for DC + - soc: ti: pruss: fix referenced node in error message + - mlxsw: pci: Add shutdown method in PCI driver + - drm/amd/display: add else to avoid double destroy clk_mgr + - drm/bridge: megachips: Ensure both bridges are probed before registration + - mxser: keep only !tty test in ISR + - tty: serial: imx: disable UCR4_OREN in .stop_rx() instead of .shutdown() + - gpiolib: acpi: Do not set the IRQ type if the IRQ is already in use + - HSI: core: Fix return freed object in hsi_new_client + - crypto: jitter - consider 32 LSB for APT + - mwifiex: Fix skb_over_panic in mwifiex_usb_recv() + - rsi: Fix use-after-free in rsi_rx_done_handler() + - rsi: Fix out-of-bounds read in rsi_read_pkt() + - ath11k: Avoid NULL ptr access during mgmt tx cleanup + - media: venus: avoid calling core_clk_setrate() concurrently during + concurrent video sessions + - regulator: da9121: Prevent current limit change when enabled + - drm/vmwgfx: Release ttm memory if probe fails + - drm/vmwgfx: Introduce a new placement for MOB page tables + - ACPI / x86: Drop PWM2 device on Lenovo Yoga Book from always present table + - ACPI: Change acpi_device_always_present() into acpi_device_override_status() + - ACPI / x86: Allow specifying acpi_device_override_status() quirks by path + - ACPI / x86: Add not-present quirk for the PCI0.SDHB.BRC1 device on the GPD + win + - arm64: dts: ti: j7200-main: Fix 'dtbs_check' serdes_ln_ctrl node + - arm64: dts: ti: j721e-main: Fix 'dtbs_check' in serdes_ln_ctrl node + - usb: uhci: add aspeed ast2600 uhci support + - floppy: Add max size check for user space request + - x86/mm: Flush global TLB when switching to trampoline page-table + - drm: rcar-du: Fix CRTC timings when CMM is used + - media: uvcvideo: Increase UVC_CTRL_CONTROL_TIMEOUT to 5 seconds. + - media: rcar-vin: Update format alignment constraints + - media: saa7146: hexium_orion: Fix a NULL pointer dereference in + hexium_attach() + - media: atomisp: fix "variable dereferenced before check 'asd'" + - media: m920x: don't use stack on USB reads + - thunderbolt: Runtime PM activate both ends of the device link + - arm64: dts: renesas: Fix thermal bindings + - iwlwifi: mvm: synchronize with FW after multicast commands + - iwlwifi: mvm: avoid clearing a just saved session protection id + - rcutorture: Avoid soft lockup during cpu stall + - ath11k: avoid deadlock by change ieee80211_queue_work for regd_update_work + - ath10k: Fix tx hanging + - net-sysfs: update the queue counts in the unregistration path + - net: phy: prefer 1000baseT over 1000baseKX + - gpio: aspeed: Convert aspeed_gpio.lock to raw_spinlock + - gpio: aspeed-sgpio: Convert aspeed_sgpio.lock to raw_spinlock + - selftests/ftrace: make kprobe profile testcase description unique + - ath11k: Avoid false DEADLOCK warning reported by lockdep + - ARM: dts: qcom: sdx55: fix IPA interconnect definitions + - x86/mce: Allow instrumentation during task work queueing + - x86/mce: Mark mce_panic() noinstr + - x86/mce: Mark mce_end() noinstr + - x86/mce: Mark mce_read_aux() noinstr + - net: bonding: debug: avoid printing debug logs when bond is not notifying + peers + - kunit: Don't crash if no parameters are generated + - bpf: Do not WARN in bpf_warn_invalid_xdp_action() + - drm/amdkfd: Fix error handling in svm_range_add + - HID: quirks: Allow inverting the absolute X/Y values + - HID: i2c-hid-of: Expose the touchscreen-inverted properties + - media: igorplugusb: receiver overflow should be reported + - media: rockchip: rkisp1: use device name for debugfs subdir name + - media: saa7146: hexium_gemini: Fix a NULL pointer dereference in + hexium_attach() + - mmc: tmio: reinit card irqs in reset routine + - mmc: core: Fixup storing of OCR for MMC_QUIRK_NONSTD_SDIO + - drm/amd/amdgpu: fix psp tmr bo pin count leak in SRIOV + - drm/amd/amdgpu: fix gmc bo pin count leak in SRIOV + - audit: ensure userspace is penalized the same as the kernel when under + pressure + - arm64: dts: ls1028a-qds: move rtc node to the correct i2c bus + - arm64: tegra: Adjust length of CCPLEX cluster MMIO region + - crypto: ccp - Move SEV_INIT retry for corrupted data + - crypto: hisilicon/hpre - fix memory leak in hpre_curve25519_src_init() + - PM: runtime: Add safety net to supplier device release + - cpufreq: Fix initialization of min and max frequency QoS requests + - mt76: mt7615: fix possible deadlock while mt7615_register_ext_phy() + - mt76: do not pass the received frame with decryption error + - mt76: mt7615: improve wmm index allocation + - ath9k_htc: fix NULL pointer dereference at ath9k_htc_rxep() + - ath9k_htc: fix NULL pointer dereference at ath9k_htc_tx_get_packet() + - ath9k: Fix out-of-bound memcpy in ath9k_hif_usb_rx_stream + - rtw88: 8822c: update rx settings to prevent potential hw deadlock + - PM: AVS: qcom-cpr: Use div64_ul instead of do_div + - iwlwifi: fix leaks/bad data after failed firmware load + - iwlwifi: remove module loading failure message + - iwlwifi: mvm: Fix calculation of frame length + - iwlwifi: mvm: fix AUX ROC removal + - iwlwifi: pcie: make sure prph_info is set when treating wakeup IRQ + - mmc: sdhci-pci-gli: GL9755: Support for CD/WP inversion on OF platforms + - block: check minor range in device_add_disk() + - um: registers: Rename function names to avoid conflicts and build problems + - ath11k: Fix napi related hang + - Bluetooth: btintel: Add missing quirks and msft ext for legacy bootloader + - Bluetooth: vhci: Set HCI_QUIRK_VALID_LE_STATES + - xfrm: rate limit SA mapping change message to user space + - drm/etnaviv: consider completed fence seqno in hang check + - jffs2: GC deadlock reading a page that is used in jffs2_write_begin() + - ACPICA: actypes.h: Expand the ACPI_ACCESS_ definitions + - ACPICA: Utilities: Avoid deleting the same object twice in a row + - ACPICA: Executer: Fix the REFCLASS_REFOF case in acpi_ex_opcode_1A_0T_1R() + - ACPICA: Fix wrong interpretation of PCC address + - ACPICA: Hardware: Do not flush CPU cache when entering S4 and S5 + - mmc: mtk-sd: Use readl_poll_timeout instead of open-coded polling + - drm/amdgpu: fixup bad vram size on gmc v8 + - amdgpu/pm: Make sysfs pm attributes as read-only for VFs + - ACPI: battery: Add the ThinkPad "Not Charging" quirk + - ACPI: CPPC: Check present CPUs for determining _CPC is valid + - btrfs: remove BUG_ON() in find_parent_nodes() + - btrfs: remove BUG_ON(!eie) in find_parent_nodes + - net: mdio: Demote probed message to debug print + - mac80211: allow non-standard VHT MCS-10/11 + - dm btree: add a defensive bounds check to insert_at() + - dm space map common: add bounds check to sm_ll_lookup_bitmap() + - bpf/selftests: Fix namespace mount setup in tc_redirect + - mlxsw: pci: Avoid flow control for EMAD packets + - net: phy: marvell: configure RGMII delays for 88E1118 + - net: gemini: allow any RGMII interface mode + - regulator: qcom_smd: Align probe function with rpmh-regulator + - serial: pl010: Drop CR register reset on set_termios + - serial: pl011: Drop CR register reset on set_termios + - serial: core: Keep mctrl register state and cached copy in sync + - random: do not throw away excess input to crng_fast_load + - net/mlx5: Update log_max_qp value to FW max capability + - net/mlx5e: Unblock setting vid 0 for VF in case PF isn't eswitch manager + - parisc: Avoid calling faulthandler_disabled() twice + - can: flexcan: allow to change quirks at runtime + - can: flexcan: rename RX modes + - can: flexcan: add more quirks to describe RX path capabilities + - x86/kbuild: Enable CONFIG_KALLSYMS_ALL=y in the defconfigs + - powerpc/6xx: add missing of_node_put + - powerpc/powernv: add missing of_node_put + - powerpc/cell: add missing of_node_put + - powerpc/btext: add missing of_node_put + - powerpc/watchdog: Fix missed watchdog reset due to memory ordering race + - ASoC: imx-hdmi: add put_device() after of_find_device_by_node() + - i2c: i801: Don't silently correct invalid transfer size + - powerpc/smp: Move setup_profiling_timer() under CONFIG_PROFILING + - i2c: mpc: Correct I2C reset procedure + - clk: meson: gxbb: Fix the SDM_EN bit for MPLL0 on GXBB + - powerpc/powermac: Add missing lockdep_register_key() + - KVM: PPC: Book3S: Suppress warnings when allocating too big memory slots + - KVM: PPC: Book3S: Suppress failed alloc warning in H_COPY_TOFROM_GUEST + - w1: Misuse of get_user()/put_user() reported by sparse + - nvmem: core: set size for sysfs bin file + - dm: fix alloc_dax error handling in alloc_dev + - interconnect: qcom: rpm: Prevent integer overflow in rate + - scsi: ufs: Fix a kernel crash during shutdown + - scsi: lpfc: Fix leaked lpfc_dmabuf mbox allocations with NPIV + - scsi: lpfc: Trigger SLI4 firmware dump before doing driver cleanup + - ALSA: seq: Set upper limit of processed events + - MIPS: Loongson64: Use three arguments for slti + - powerpc/40x: Map 32Mbytes of memory at startup + - selftests/powerpc/spectre_v2: Return skip code when miss_percent is high + - powerpc: handle kdump appropriately with crash_kexec_post_notifiers option + - powerpc/fadump: Fix inaccurate CPU state info in vmcore generated with panic + - udf: Fix error handling in udf_new_inode() + - MIPS: OCTEON: add put_device() after of_find_device_by_node() + - irqchip/gic-v4: Disable redistributors' view of the VPE table at boot time + - i2c: designware-pci: Fix to change data types of hcnt and lcnt parameters + - selftests/powerpc: Add a test of sigreturning to the kernel + - MIPS: Octeon: Fix build errors using clang + - scsi: sr: Don't use GFP_DMA + - scsi: mpi3mr: Fixes around reply request queues + - ASoC: mediatek: mt8192-mt6359: fix device_node leak + - phy: phy-mtk-tphy: add support efuse setting + - ASoC: mediatek: mt8173: fix device_node leak + - ASoC: mediatek: mt8183: fix device_node leak + - habanalabs: skip read fw errors if dynamic descriptor invalid + - phy: mediatek: Fix missing check in mtk_mipi_tx_probe + - mailbox: change mailbox-mpfs compatible string + - seg6: export get_srh() for ICMP handling + - icmp: ICMPV6: Examine invoking packet for Segment Route Headers. + - udp6: Use Segment Routing Header for dest address if present + - rpmsg: core: Clean up resources on announce_create failure. + - ifcvf/vDPA: fix misuse virtio-net device config size for blk dev + - crypto: omap-aes - Fix broken pm_runtime_and_get() usage + - crypto: stm32/crc32 - Fix kernel BUG triggered in probe() + - crypto: caam - replace this_cpu_ptr with raw_cpu_ptr + - ubifs: Error path in ubifs_remount_rw() seems to wrongly free write buffers + - tpm: fix potential NULL pointer access in tpm_del_char_device + - tpm: fix NPE on probe for missing device + - mfd: tps65910: Set PWR_OFF bit during driver probe + - spi: uniphier: Fix a bug that doesn't point to private data correctly + - xen/gntdev: fix unmap notification order + - md: Move alloc/free acct bioset in to personality + - HID: magicmouse: Fix an error handling path in magicmouse_probe() + - fuse: Pass correct lend value to filemap_write_and_wait_range() + - serial: Fix incorrect rs485 polarity on uart open + - cputime, cpuacct: Include guest time in user time in cpuacct.stat + - sched/cpuacct: Fix user/system in shown cpuacct.usage* + - tracing/kprobes: 'nmissed' not showed correctly for kretprobe + - tracing: Have syscall trace events use trace_event_buffer_lock_reserve() + - remoteproc: imx_rproc: Fix a resource leak in the remove function + - iwlwifi: mvm: Increase the scan timeout guard to 30 seconds + - s390/mm: fix 2KB pgtable release race + - device property: Fix fwnode_graph_devcon_match() fwnode leak + - drm/tegra: submit: Add missing pm_runtime_mark_last_busy() + - drm/etnaviv: limit submit sizes + - drm/amd/display: Fix the uninitialized variable in enable_stream_features() + - drm/nouveau/kms/nv04: use vzalloc for nv04_display + - drm/bridge: analogix_dp: Make PSR-exit block less + - parisc: Fix lpa and lpa_user defines + - powerpc/64s/radix: Fix huge vmap false positive + - scsi: lpfc: Fix lpfc_force_rscn ndlp kref imbalance + - drm/amdgpu: don't do resets on APUs which don't support it + - drm/i915/display/ehl: Update voltage swing table + - PCI: xgene: Fix IB window setup + - PCI: pciehp: Use down_read/write_nested(reset_lock) to fix lockdep errors + - PCI: pci-bridge-emul: Make expansion ROM Base Address register read-only + - PCI: pci-bridge-emul: Properly mark reserved PCIe bits in PCI config space + - PCI: pci-bridge-emul: Fix definitions of reserved bits + - PCI: pci-bridge-emul: Correctly set PCIe capabilities + - PCI: pci-bridge-emul: Set PCI_STATUS_CAP_LIST for PCIe device + - xfrm: fix policy lookup for ipv6 gre packets + - xfrm: fix dflt policy check when there is no policy configured + - btrfs: fix deadlock between quota enable and other quota operations + - btrfs: check the root node for uptodate before returning it + - btrfs: respect the max size in the header when activating swap file + - ext4: make sure to reset inode lockdep class when quota enabling fails + - ext4: make sure quota gets properly shutdown on error + - ext4: fix a possible ABBA deadlock due to busy PA + - ext4: initialize err_blk before calling __ext4_get_inode_loc + - ext4: fix fast commit may miss tracking range for FALLOC_FL_ZERO_RANGE + - ext4: set csum seed in tmp inode while migrating to extents + - ext4: Fix BUG_ON in ext4_bread when write quota data + - ext4: use ext4_ext_remove_space() for fast commit replay delete range + - ext4: fast commit may miss tracking unwritten range during ftruncate + - ext4: destroy ext4_fc_dentry_cachep kmemcache on module removal + - ext4: fix null-ptr-deref in '__ext4_journal_ensure_credits' + - ext4: fix an use-after-free issue about data=journal writeback mode + - ext4: don't use the orphan list when migrating an inode + - tracing/osnoise: Properly unhook events if start_per_cpu_kthreads() fails + - ath11k: qmi: avoid error messages when dma allocation fails + - drm/radeon: fix error handling in radeon_driver_open_kms + - of: base: Improve argument length mismatch error + - firmware: Update Kconfig help text for Google firmware + - can: mcp251xfd: mcp251xfd_tef_obj_read(): fix typo in error message + - media: rcar-csi2: Optimize the selection PHTW register + - drm/vc4: hdmi: Make sure the device is powered with CEC + - media: correct MEDIA_TEST_SUPPORT help text + - Documentation: coresight: Fix documentation issue + - Documentation: dmaengine: Correctly describe dmatest with channel unset + - Documentation: ACPI: Fix data node reference documentation + - Documentation, arch: Remove leftovers from raw device + - Documentation, arch: Remove leftovers from CIFS_WEAK_PW_HASH + - Documentation: refer to config RANDOMIZE_BASE for kernel address-space + randomization + - Documentation: fix firewire.rst ABI file path error + - net: usb: Correct reset handling of smsc95xx + - Bluetooth: hci_sync: Fix not setting adv set duration + - scsi: core: Show SCMD_LAST in text form + - scsi: ufs: ufs-mediatek: Fix error checking in ufs_mtk_init_va09_pwr_ctrl() + - RDMA/cma: Remove open coding of overflow checking for private_data_len + - dmaengine: uniphier-xdmac: Fix type of address variables + - dmaengine: idxd: fix wq settings post wq disable + - RDMA/hns: Modify the mapping attribute of doorbell to device + - RDMA/rxe: Fix a typo in opcode name + - dmaengine: stm32-mdma: fix STM32_MDMA_CTBR_TSEL_MASK + - Revert "net/mlx5: Add retry mechanism to the command entry index allocation" + - powerpc/cell: Fix clang -Wimplicit-fallthrough warning + - powerpc/fsl/dts: Enable WA for erratum A-009885 on fman3l MDIO buses + - block: fix async_depth sysfs interface for mq-deadline + - block: Fix fsync always failed if once failed + - drm/vc4: crtc: Drop feed_txp from state + - drm/vc4: Fix non-blocking commit getting stuck forever + - drm/vc4: crtc: Copy assigned channel to the CRTC + - bpftool: Remove inclusion of utilities.mak from Makefiles + - bpftool: Fix indent in option lists in the documentation + - xdp: check prog type before updating BPF link + - bpf: Fix mount source show for bpffs + - bpf: Mark PTR_TO_FUNC register initially with zero offset + - perf evsel: Override attr->sample_period for non-libpfm4 events + - ipv4: update fib_info_cnt under spinlock protection + - ipv4: avoid quadratic behavior in netns dismantle + - mlx5: Don't accidentally set RTO_ONLINK before mlx5e_route_lookup_ipv4_get() + - net/fsl: xgmac_mdio: Add workaround for erratum A-009885 + - net/fsl: xgmac_mdio: Fix incorrect iounmap when removing module + - parisc: pdc_stable: Fix memory leak in pdcs_register_pathentries + - riscv: dts: microchip: mpfs: Drop empty chosen node + - drm/vmwgfx: Remove explicit transparent hugepages support + - drm/vmwgfx: Remove unused compile options + - f2fs: fix remove page failed in invalidate compress pages + - f2fs: fix to avoid panic in is_alive() if metadata is inconsistent + - f2fs: compress: fix potential deadlock of compress file + - f2fs: fix to reserve space for IO align feature + - f2fs: fix to check available space of CP area correctly in + update_ckpt_flags() + - crypto: octeontx2 - uninitialized variable in kvf_limits_store() + - af_unix: annote lockless accesses to unix_tot_inflight & gc_in_progress + - clk: Emit a stern warning with writable debugfs enabled + - clk: si5341: Fix clock HW provider cleanup + - pinctrl/rockchip: fix gpio device creation + - gpio: mpc8xxx: Fix IRQ check in mpc8xxx_probe + - gpio: idt3243x: Fix IRQ check in idt_gpio_probe + - net/smc: Fix hung_task when removing SMC-R devices + - net: axienet: increase reset timeout + - net: axienet: Wait for PhyRstCmplt after core reset + - net: axienet: reset core on initialization prior to MDIO access + - net: axienet: add missing memory barriers + - net: axienet: limit minimum TX ring size + - net: axienet: Fix TX ring slot available check + - net: axienet: fix number of TX ring slots for available check + - net: axienet: fix for TX busy handling + - net: axienet: increase default TX ring size to 128 + - bitops: protect find_first_{,zero}_bit properly + - um: gitignore: Add kernel/capflags.c + - HID: vivaldi: fix handling devices not using numbered reports + - rtc: pxa: fix null pointer dereference + - vdpa/mlx5: Fix wrong configuration of virtio_version_1_0 + - virtio_ring: mark ring unused on error + - taskstats: Cleanup the use of task->exit_code + - inet: frags: annotate races around fqdir->dead and fqdir->high_thresh + - netns: add schedule point in ops_exit_list() + - iwlwifi: fix Bz NMI behaviour + - xfrm: Don't accidentally set RTO_ONLINK in decode_session4() + - vdpa/mlx5: Restore cur_num_vqs in case of failure in change_num_qps() + - gre: Don't accidentally set RTO_ONLINK in gre_fill_metadata_dst() + - libcxgb: Don't accidentally set RTO_ONLINK in cxgb_find_route() + - perf script: Fix hex dump character output + - dmaengine: at_xdmac: Don't start transactions at tx_submit level + - dmaengine: at_xdmac: Start transfer for cyclic channels in issue_pending + - dmaengine: at_xdmac: Print debug message after realeasing the lock + - dmaengine: at_xdmac: Fix concurrency over xfers_list + - dmaengine: at_xdmac: Fix lld view setting + - dmaengine: at_xdmac: Fix at_xdmac_lld struct definition + - perf tools: Drop requirement for libstdc++.so for libopencsd check + - perf probe: Fix ppc64 'perf probe add events failed' case + - devlink: Remove misleading internal_flags from health reporter dump + - arm64: dts: qcom: msm8996: drop not documented adreno properties + - net: fix sock_timestamping_bind_phc() to release device + - net: bonding: fix bond_xmit_broadcast return value error bug + - net: ipa: fix atomic update in ipa_endpoint_replenish() + - net_sched: restore "mpu xxx" handling + - net: mscc: ocelot: don't let phylink re-enable TX PAUSE on the NPI port + - bcmgenet: add WOL IRQ check + - net: wwan: Fix MRU mismatch issue which may lead to data connection lost + - net: ethernet: mtk_eth_soc: fix error checking in mtk_mac_config() + - net: ocelot: Fix the call to switchdev_bridge_port_offload + - net: sfp: fix high power modules without diagnostic monitoring + - net: cpsw: avoid alignment faults by taking NET_IP_ALIGN into account + - net: phy: micrel: use kszphy_suspend()/kszphy_resume for irq aware devices + - net: mscc: ocelot: fix using match before it is set + - dt-bindings: display: meson-dw-hdmi: add missing sound-name-prefix property + - dt-bindings: display: meson-vpu: Add missing amlogic,canvas property + - dt-bindings: watchdog: Require samsung,syscon-phandle for Exynos7 + - sch_api: Don't skip qdisc attach on ingress + - scripts/dtc: dtx_diff: remove broken example from help text + - lib82596: Fix IRQ check in sni_82596_probe + - mm/hmm.c: allow VM_MIXEDMAP to work with hmm_range_fault + - bonding: Fix extraction of ports from the packet headers + - lib/test_meminit: destroy cache in kmem_cache_alloc_bulk() test + - scripts: sphinx-pre-install: add required ctex dependency + - scripts: sphinx-pre-install: Fix ctex support on Debian + - Linux 5.15.17 + * rtw88_8821ce causes freeze (LP: #1927808) // Jammy update: v5.15.17 upstream + stable release (LP: #1959376) + - rtw88: Disable PCIe ASPM while doing NAPI poll on 8821CE + * Jammy update: v5.15.16 upstream stable release (LP: #1958977) + - devtmpfs regression fix: reconfigure on each mount + - orangefs: Fix the size of a memory allocation in orangefs_bufmap_alloc() + - remoteproc: qcom: pil_info: Don't memcpy_toio more than is provided + - perf: Protect perf_guest_cbs with RCU + - KVM: x86: Register perf callbacks after calling vendor's hardware_setup() + - KVM: x86: Register Processor Trace interrupt hook iff PT enabled in guest + - KVM: x86: don't print when fail to read/write pv eoi memory + - KVM: s390: Clarify SIGP orders versus STOP/RESTART + - remoteproc: qcom: pas: Add missing power-domain "mxc" for CDSP + - 9p: only copy valid iattrs in 9P2000.L setattr implementation + - video: vga16fb: Only probe for EGA and VGA 16 color graphic cards + - media: uvcvideo: fix division by zero at stream start + - rtlwifi: rtl8192cu: Fix WARNING when calling local_irq_restore() with + interrupts enabled + - firmware: qemu_fw_cfg: fix sysfs information leak + - firmware: qemu_fw_cfg: fix NULL-pointer deref on duplicate entries + - firmware: qemu_fw_cfg: fix kobject leak in probe error path + - perf annotate: Avoid TUI crash when navigating in the annotation of + recursive functions + - KVM: x86: remove PMU FIXED_CTR3 from msrs_to_save_all + - ALSA: hda/realtek: Add speaker fixup for some Yoga 15ITL5 devices + - ALSA: hda/realtek - Fix silent output on Gigabyte X570 Aorus Master after + reboot from Windows + - ALSA: hda: ALC287: Add Lenovo IdeaPad Slim 9i 14ITL5 speaker quirk + - ALSA: hda/tegra: Fix Tegra194 HDA reset failure + - ALSA: hda/realtek: Add quirk for Legion Y9000X 2020 + - ALSA: hda/realtek: Re-order quirk entries for Lenovo + - mtd: fixup CFI on ixp4xx + - Linux 5.15.16 + * UBSAN: array-index-out-of-bounds in dcn31_resources on AMD yellow carp + platform (LP: #1958229) + - drm/amd/display: Fix out of bounds access on DNC31 stream encoder regs + * Jammy update: v5.15.15 upstream stable release (LP: #1958418) + - s390/kexec: handle R_390_PLT32DBL rela in arch_kexec_apply_relocations_add() + - workqueue: Fix unbind_workers() VS wq_worker_running() race + - staging: r8188eu: switch the led off during deinit + - bpf: Fix out of bounds access from invalid *_or_null type verification + - Bluetooth: btusb: Add protocol for MediaTek bluetooth devices(MT7922) + - Bluetooth: btusb: Add the new support ID for Realtek RTL8852A + - Bluetooth: btusb: Add support for IMC Networks Mediatek Chip(MT7921) + - Bbluetooth: btusb: Add another Bluetooth part for Realtek 8852AE + - Bluetooth: btusb: fix memory leak in btusb_mtk_submit_wmt_recv_urb() + - Bluetooth: btusb: enable Mediatek to support AOSP extension + - Bluetooth: btusb: Add one more Bluetooth part for the Realtek RTL8852AE + - fget: clarify and improve __fget_files() implementation + - Bluetooth: btusb: Add two more Bluetooth parts for WCN6855 + - Bluetooth: btusb: Add support for Foxconn MT7922A + - Bluetooth: btintel: Fix broken LED quirk for legacy ROM devices + - Bluetooth: btusb: Add support for Foxconn QCA 0xe0d0 + - Bluetooth: bfusb: fix division by zero in send path + - ARM: dts: exynos: Fix BCM4330 Bluetooth reset polarity in I9100 + - USB: core: Fix bug in resuming hub's handling of wakeup requests + - USB: Fix "slab-out-of-bounds Write" bug in usb_hcd_poll_rh_status + - ath11k: Fix buffer overflow when scanning with extraie + - mmc: sdhci-pci: Add PCI ID for Intel ADL + - Bluetooth: add quirk disabling LE Read Transmit Power + - Bluetooth: btbcm: disable read tx power for some Macs with the T2 Security + chip + - Bluetooth: btbcm: disable read tx power for MacBook Air 8,1 and 8,2 + - veth: Do not record rx queue hint in veth_xmit + - mfd: intel-lpss: Fix too early PM enablement in the ACPI ->probe() + - can: gs_usb: fix use of uninitialized variable, detach device on reception + of invalid USB data + - can: isotp: convert struct tpcon::{idx,len} to unsigned int + - can: gs_usb: gs_can_start_xmit(): zero-initialize hf->{flags,reserved} + - random: fix data race on crng_node_pool + - random: fix data race on crng init time + - random: fix crash on multiple early calls to add_bootloader_randomness() + - platform/x86/intel: hid: add quirk to support Surface Go 3 + - media: Revert "media: uvcvideo: Set unique vdev name based in type" + - staging: wlan-ng: Avoid bitwise vs logical OR warning in + hfa384x_usb_throttlefn() + - drm/i915: Avoid bitwise vs logical OR warning in snb_wm_latency_quirk() + - staging: greybus: fix stack size warning with UBSAN + - Linux 5.15.15 + * UBSAN warning on unplugging USB4 DP alt mode from AMD Yellow Carp graphics + card (LP: #1956497) + - drm/amd/display: explicitly set is_dsc_supported to false before use + * Support USB4 DP alt mode for AMD Yellow Carp graphics card (LP: #1953008) + - drm/amd/display: Enable PSR by default on newer DCN + - SAUCE: drm/amd/display: Fixup previous PSR policy commit + - drm/amd/display: Fix USB4 hot plug crash issue + - drm/amd/display: Creating a fw boot options bit for an upcoming feature + - drm/amd/display: Enable dpia in dmub only for DCN31 B0 + - drm/amd/display: MST support for DPIA + - drm/amd/display: Set phy_mux_sel bit in dmub scratch register + - drm/amd/display: Don't lock connection_mutex for DMUB HPD + - drm/amd/display: Add callbacks for DMUB HPD IRQ notifications + * Jammy update: v5.15.14 upstream stable release (LP: #1957882) + - fscache_cookie_enabled: check cookie is valid before accessing it + - selftests: x86: fix [-Wstringop-overread] warn in test_process_vm_readv() + - tracing: Fix check for trace_percpu_buffer validity in get_trace_buf() + - tracing: Tag trace_percpu_buffer as a percpu pointer + - Revert "RDMA/mlx5: Fix releasing unallocated memory in dereg MR flow" + - ieee802154: atusb: fix uninit value in atusb_set_extended_addr + - i40e: Fix to not show opcode msg on unsuccessful VF MAC change + - iavf: Fix limit of total number of queues to active queues of VF + - RDMA/core: Don't infoleak GRH fields + - Revert "net: usb: r8152: Add MAC passthrough support for more Lenovo Docks" + - netrom: fix copying in user data in nr_setsockopt + - RDMA/uverbs: Check for null return of kmalloc_array + - mac80211: initialize variable have_higher_than_11mbit + - mac80211: mesh: embedd mesh_paths and mpp_paths into ieee80211_if_mesh + - sfc: The RX page_ring is optional + - i40e: fix use-after-free in i40e_sync_filters_subtask() + - i40e: Fix for displaying message regarding NVM version + - i40e: Fix incorrect netdev's real number of RX/TX queues + - ftrace/samples: Add missing prototypes direct functions + - ipv4: Check attribute length for RTA_GATEWAY in multipath route + - ipv4: Check attribute length for RTA_FLOW in multipath route + - ipv6: Check attribute length for RTA_GATEWAY in multipath route + - ipv6: Check attribute length for RTA_GATEWAY when deleting multipath route + - lwtunnel: Validate RTA_ENCAP_TYPE attribute length + - selftests: net: udpgro_fwd.sh: explicitly checking the available ping + feature + - sctp: hold endpoint before calling cb in sctp_transport_lookup_process + - batman-adv: mcast: don't send link-local multicast to mcast routers + - sch_qfq: prevent shift-out-of-bounds in qfq_init_qdisc + - net: ena: Fix undefined state when tx request id is out of bounds + - net: ena: Fix wrong rx request id by resetting device + - net: ena: Fix error handling when calculating max IO queues number + - md/raid1: fix missing bitmap update w/o WriteMostly devices + - EDAC/i10nm: Release mdev/mbase when failing to detect HBM + - KVM: x86: Check for rmaps allocation + - cgroup: Use open-time credentials for process migraton perm checks + - cgroup: Allocate cgroup_file_ctx for kernfs_open_file->priv + - cgroup: Use open-time cgroup namespace for process migration perm checks + - Revert "i2c: core: support bus regulator controlling in adapter" + - i2c: mpc: Avoid out of bounds memory access + - power: supply: core: Break capacity loop + - power: reset: ltc2952: Fix use of floating point literals + - reset: renesas: Fix Runtime PM usage + - rndis_host: support Hytera digital radios + - gpio: gpio-aspeed-sgpio: Fix wrong hwirq base in irq handler + - net ticp:fix a kernel-infoleak in __tipc_sendmsg() + - phonet: refcount leak in pep_sock_accep + - fbdev: fbmem: add a helper to determine if an aperture is used by a fw fb + - drm/amdgpu: disable runpm if we are the primary adapter + - power: bq25890: Enable continuous conversion for ADC at charging + - ipv6: Continue processing multipath route even if gateway attribute is + invalid + - ipv6: Do cleanup if attribute validation fails in multipath route + - auxdisplay: charlcd: checking for pointer reference before dereferencing + - drm/amdgpu: fix dropped backing store handling in amdgpu_dma_buf_move_notify + - drm/amd/pm: Fix xgmi link control on aldebaran + - usb: mtu3: fix interval value for intr and isoc + - scsi: libiscsi: Fix UAF in iscsi_conn_get_param()/iscsi_conn_teardown() + - ip6_vti: initialize __ip6_tnl_parm struct in vti6_siocdevprivate + - net: udp: fix alignment problem in udp4_seq_show() + - atlantic: Fix buff_ring OOB in aq_ring_rx_clean + - drm/amd/pm: skip setting gfx cgpg in the s0ix suspend-resume + - mISDN: change function names to avoid conflicts + - drm/amd/display: fix B0 TMDS deepcolor no dislay issue + - drm/amd/display: Added power down for DCN10 + - ipv6: raw: check passed optlen before reading + - userfaultfd/selftests: fix hugetlb area allocations + - ARM: dts: gpio-ranges property is now required + - Input: zinitix - make sure the IRQ is allocated before it gets enabled + - Revert "drm/amdgpu: stop scheduler when calling hw_fini (v2)" + - drm/amd/pm: keep the BACO feature enabled for suspend + - Linux 5.15.14 + * alsa/sdw: add sdw audio machine driver for several ADL machines + (LP: #1951563) + - ASoC: Intel: sof_sdw: Add support for SKU 0AF3 product + - ASoC: Intel: soc-acpi: add SKU 0AF3 SoundWire configuration + - ASoC: Intel: sof_sdw: Add support for SKU 0B00 and 0B01 products + - ASoC: Intel: sof_sdw: Add support for SKU 0B11 product + - ASoC: Intel: sof_sdw: Add support for SKU 0B13 product + - ASoC: Intel: soc-acpi: add SKU 0B13 SoundWire configuration + - ASoC: Intel: sof_sdw: Add support for SKU 0B29 product + - ASoC: Intel: soc-acpi: add SKU 0B29 SoundWire configuration + - ASoC: Intel: sof_sdw: Add support for SKU 0B12 product + - ASoC: intel: sof_sdw: return the original error number + - ASoC: intel: sof_sdw: rename be_index/link_id to link_index + - ASoC: intel: sof_sdw: Use a fixed DAI link id for AMP + - ASoC: intel: sof_sdw: move DMIC link id overwrite to create_sdw_dailink + - ASoC: intel: sof_sdw: remove SOF_RT715_DAI_ID_FIX quirk + - ASoC: intel: sof_sdw: remove sof_sdw_mic_codec_mockup_init + - ASoC: intel: sof_sdw: remove get_next_be_id + - ASoC: intel: sof_sdw: add link adr order check + * Add basic Wifi support for Qualcomm WCN6856 (LP: #1955613) + - ath11k: change to use dynamic memory for channel list of scan + - ath11k: add string type to search board data in board-2.bin for WCN6855 + * Enable audio mute LED and mic mute LED on a new HP laptop (LP: #1956454) + - ALSA: hda/realtek: Use ALC285_FIXUP_HP_GPIO_LED on another HP laptop + * Add missing BT ID for Qualcomm WCN6856 (LP: #1956407) + - Bluetooth: btusb: Add one more Bluetooth part for WCN6855 + * Add Bluetooth support for Qualcomm WCN6856 (LP: #1955689) + - Bluetooth: btusb: Add support using different nvm for variant WCN6855 + controller + - Bluetooth: btusb: re-definition for board_id in struct qca_version + - Bluetooth: btusb: Add the new support IDs for WCN6855 + * Improve performance and idle power consumption (LP: #1941893) + - x86: ACPI: cstate: Optimize C3 entry on AMD CPUs + * [Yellow Carp] USB4 interdomain communication problems (LP: #1945361) + - thunderbolt: Enable retry logic for intra-domain control packets + * 1951111: + - scsi: lpfc: Fix mailbox command failure during driver initialization + * [Jammy] Update Broadcom Emulex FC HBA lpfc driver to 14.0.0.3 for Ubuntu + 22.04 (LP: #1951111) + - scsi: lpfc: Fix premature rpi release for unsolicited TPLS and LS_RJT + - scsi: lpfc: Fix hang on unload due to stuck fport node + - scsi: lpfc: Fix rediscovery of tape device after LIP + - scsi: lpfc: Don't remove ndlp on PRLI errors in P2P mode + - scsi: lpfc: Fix EEH support for NVMe I/O + - scsi: lpfc: Adjust bytes received vales during cmf timer interval + - scsi: lpfc: Fix I/O block after enabling managed congestion mode + - scsi: lpfc: Zero CGN stats only during initial driver load and stat reset + - scsi: lpfc: Improve PBDE checks during SGL processing + - scsi: lpfc: Update lpfc version to 14.0.0.2 + * smartpqi: Update 20.04.4 to latest kernel.org patch level (LP: #1953689) + - scsi: smartpqi: Update device removal management + - scsi: smartpqi: Capture controller reason codes + - scsi: smartpqi: Update LUN reset handler + - scsi: smartpqi: Add TEST UNIT READY check for SANITIZE operation + - scsi: smartpqi: Avoid failing I/Os for offline devices + - scsi: smartpqi: Add extended report physical LUNs + - scsi: smartpqi: Fix boot failure during LUN rebuild + - scsi: smartpqi: Fix duplicate device nodes for tape changers + - scsi: smartpqi: Add 3252-8i PCI id + - scsi: smartpqi: Update version to 2.1.12-055 + * Let VMD follow host bridge PCIe settings (LP: #1954611) + - PCI: vmd: Honor ACPI _OSC on PCIe features + * Fix spurious wakeup caused by Intel 7560 WWAN (LP: #1956443) + - net: wwan: iosm: Keep device at D0 for s2idle case + * [uacc-0623] hisi_sec2 fail to alloc uacce (LP: #1933301) + - crypto: hisilicon/qm - modify the uacce mode check + * Jammy update: v5.15.13 upstream stable release (LP: #1956926) + - Input: i8042 - add deferred probe support + - Input: i8042 - enable deferred probe quirk for ASUS UM325UA + - tomoyo: Check exceeded quota early in tomoyo_domain_quota_is_ok(). + - tomoyo: use hwight16() in tomoyo_domain_quota_is_ok() + - net/sched: Extend qdisc control block with tc control block + - parisc: Clear stale IIR value on instruction access rights trap + - platform/mellanox: mlxbf-pmc: Fix an IS_ERR() vs NULL bug in + mlxbf_pmc_map_counters + - platform/x86: apple-gmux: use resource_size() with res + - memblock: fix memblock_phys_alloc() section mismatch error + - recordmcount.pl: fix typo in s390 mcount regex + - powerpc/ptdump: Fix DEBUG_WX since generic ptdump conversion + - efi: Move efifb_setup_from_dmi() prototype from arch headers + - selinux: initialize proto variable in selinux_ip_postroute_compat() + - scsi: lpfc: Terminate string in lpfc_debugfs_nvmeio_trc_write() + - net/mlx5: DR, Fix NULL vs IS_ERR checking in dr_domain_init_resources + - net/mlx5: Fix error print in case of IRQ request failed + - net/mlx5: Fix SF health recovery flow + - net/mlx5: Fix tc max supported prio for nic mode + - net/mlx5e: Wrap the tx reporter dump callback to extract the sq + - net/mlx5e: Fix interoperability between XSK and ICOSQ recovery flow + - net/mlx5e: Fix ICOSQ recovery flow for XSK + - net/mlx5e: Use tc sample stubs instead of ifdefs in source file + - net/mlx5e: Delete forward rule for ct or sample action + - udp: using datalen to cap ipv6 udp max gso segments + - selftests: Calculate udpgso segment count without header adjustment + - sctp: use call_rcu to free endpoint + - net/smc: fix using of uninitialized completions + - net: usb: pegasus: Do not drop long Ethernet frames + - net: ag71xx: Fix a potential double free in error handling paths + - net: lantiq_xrx200: fix statistics of received bytes + - NFC: st21nfca: Fix memory leak in device probe and remove + - net/smc: don't send CDC/LLC message if link not ready + - net/smc: fix kernel panic caused by race of smc_sock + - igc: Do not enable crosstimestamping for i225-V models + - igc: Fix TX timestamp support for non-MSI-X platforms + - drm/amd/display: Send s0i2_rdy in stream_count == 0 optimization + - drm/amd/display: Set optimize_pwr_state for DCN31 + - ionic: Initialize the 'lif->dbid_inuse' bitmap + - net/mlx5e: Fix wrong features assignment in case of error + - net: bridge: mcast: add and enforce query interval minimum + - net: bridge: mcast: add and enforce startup query interval minimum + - selftests/net: udpgso_bench_tx: fix dst ip argument + - selftests: net: Fix a typo in udpgro_fwd.sh + - net: bridge: mcast: fix br_multicast_ctx_vlan_global_disabled helper + - net/ncsi: check for error return from call to nla_put_u32 + - selftests: net: using ping6 for IPv6 in udpgro_fwd.sh + - fsl/fman: Fix missing put_device() call in fman_port_probe + - i2c: validate user data in compat ioctl + - nfc: uapi: use kernel size_t to fix user-space builds + - uapi: fix linux/nfc.h userspace compilation errors + - drm/nouveau: wait for the exclusive fence after the shared ones v2 + - drm/amdgpu: When the VCN(1.0) block is suspended, powergating is explicitly + enabled + - drm/amdgpu: add support for IP discovery gc_info table v2 + - drm/amd/display: Changed pipe split policy to allow for multi-display pipe + split + - xhci: Fresco FL1100 controller should not have BROKEN_MSI quirk set. + - usb: gadget: f_fs: Clear ffs_eventfd in ffs_data_clear. + - usb: mtu3: add memory barrier before set GPD's HWO + - usb: mtu3: fix list_head check warning + - usb: mtu3: set interval of FS intr and isoc endpoint + - nitro_enclaves: Use get_user_pages_unlocked() call to handle mmap assert + - binder: fix async_free_space accounting for empty parcels + - scsi: vmw_pvscsi: Set residual data length conditionally + - Input: appletouch - initialize work before device registration + - Input: spaceball - fix parsing of movement data packets + - mm/damon/dbgfs: fix 'struct pid' leaks in 'dbgfs_target_ids_write()' + - net: fix use-after-free in tw_timer_handler + - fs/mount_setattr: always cleanup mount_kattr + - perf intel-pt: Fix parsing of VM time correlation arguments + - perf script: Fix CPU filtering of a script's switch events + - perf scripts python: intel-pt-events.py: Fix printing of switch events + - Linux 5.15.13 + * Miscellaneous Ubuntu changes + - [Packaging] getabis: Add fwinfo.builtin to the ABI + - [Packaging] Add list of built-in firmwares to the ABI + - [Config] x86-64: SYSFB_SIMPLEFB=y + - [packaging] arm64: introduce the lowlatency and lowlatency-64k flavours + - [packaging] arm64: updateconfigs + - [Config] annotations: remove duplicates when arm64-generic == + arm64-generic-64k option + - [Config] annotations: introduce arm64-lowlatency and arm64-lowlatency-64k + kconfig options checks + - [Packaging] Update dependency of pahole / dwarves + - [Config] toolchain version update + * Miscellaneous upstream changes + - scsi: lpfc: Revert LOG_TRACE_EVENT back to LOG_INIT prior to + driver_resource_setup() + - scsi: lpfc: Correct sysfs reporting of loop support after SFP status change + - scsi: lpfc: Allow PLOGI retry if previous PLOGI was aborted + - scsi: lpfc: Update lpfc version to 14.0.0.3 + - Revert "rtw88: Disable PCIe ASPM while doing NAPI poll on 8821CE" + + -- Tim Gardner Mon, 07 Feb 2022 12:45:08 -0700 + +linux-azure (5.15.0-1000.1) jammy; urgency=medium + + * jammy/linux-azure: 5.15.0-1000.1 -proposed tracker (LP: #1959703) + + * Packaging resync (LP: #1786013) + - [Packaging] update Ubuntu.md + - [Packaging] update update.conf + - debian/dkms-versions -- update from kernel-versions (main/master) + + * Miscellaneous Ubuntu changes + - [Packaging] azure: Enable arm64 and signed kernels + - [Config] azure: Note CC, AS, and LD version updates + - [Config] azure: CONFIG_BPF_LSM=y + + [ Ubuntu: 5.15.0-18.18 ] + + * jammy/linux: 5.15.0-18.18 -proposed tracker (LP: #1958638) + * CVE-2021-4155 + - xfs: map unwritten blocks in XFS_IOC_{ALLOC, FREE}SP just like fallocate + * CVE-2022-0185 + - SAUCE: vfs: test that one given mount param is not larger than PAGE_SIZE + * [UBUNTU 20.04] KVM hardware diagnose data improvements for guest kernel - + kernel part (LP: #1953334) + - KVM: s390: add debug statement for diag 318 CPNC data + * OOB write on BPF_RINGBUF (LP: #1956585) + - SAUCE: bpf: prevent helper argument PTR_TO_ALLOC_MEM to have offset other + than 0 + * Miscellaneous Ubuntu changes + - [Config] re-enable shiftfs + - [SAUCE] shiftfs: support kernel 5.15 + - [Config] update toolchain versions + * Miscellaneous upstream changes + - vfs: fs_context: fix up param length parsing in legacy_parse_param + + -- Tim Gardner Tue, 01 Feb 2022 11:19:24 -0700 + +linux-azure (5.15.0-0.0) jammy; urgency=medium + + * Dummy entry + + -- Tim Gardner Fri, 28 Jan 2022 15:12:58 -0700 --- linux-azure-6.5.0.orig/debian.azure/config/annotations +++ linux-azure-6.5.0/debian.azure/config/annotations @@ -0,0 +1,5351 @@ +# Menu: HEADER +# FORMAT: 4 +# ARCH: amd64 arm64 +# FLAVOUR: amd64-azure arm64-azure + +include "../../debian.master/config/annotations" + +CONFIG_ACCESSIBILITY policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_ACCESSIBILITY note<'LP: #1967702'> + +CONFIG_ACPI_HOTPLUG_MEMORY policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_ACPI_HOTPLUG_MEMORY note<'LP:#1671203'> + +CONFIG_ACPI_NFIT policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_ACPI_NFIT note<'LP:#1715755'> + +CONFIG_ATARI_PARTITION policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_ATARI_PARTITION note<'LP:1908264'> + +CONFIG_BLK_DEV_FD policy<{'amd64': 'n'}> +CONFIG_BLK_DEV_FD note<'LP: #1972017'> + +CONFIG_BLK_DEV_NVME policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_BLK_DEV_NVME note<'LP:#1908571'> + +CONFIG_BLK_DEV_PMEM policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_BLK_DEV_PMEM note<'LP:#1711230'> + +CONFIG_BT_HS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HS note<'https://www.intel.com/content/www/us/en/security-center/advisory/intel-sa-00435.html'> + +CONFIG_CHROME_PLATFORMS policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_CHROME_PLATFORMS note<'kernel reduction'> + +CONFIG_CONTEXT_TRACKING_FORCE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CONTEXT_TRACKING_FORCE note<'Likely VIRT_CPU_ACCOUNTING_GEN should be disabled'> + +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE policy<{'amd64': 'y', 'arm64': 'n'}> +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE note<'for bootspeed'> + +CONFIG_DEV_DAX policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_DEV_DAX note<'LP:#1711230'> + +CONFIG_DRM_MGAG200 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DRM_MGAG200 note<'LP: #1693337'> + +CONFIG_DRM_NOUVEAU policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_DRM_NOUVEAU note<'LP:#1752999'> + +CONFIG_DVB_DUMMY_FE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DUMMY_FE note<'expert use only'> + +CONFIG_EDAC_DECODE_MCE policy<{'amd64': 'y'}> +CONFIG_EDAC_DECODE_MCE note<'LP:#1793386'> + +CONFIG_FUJITSU_ES policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_FUJITSU_ES note<'modules reduction'> + +CONFIG_GPIO_CDEV_V1 policy<{'amd64': 'y', 'arm64': 'n'}> +CONFIG_GPIO_CDEV_V1 note<'LP: #1953613'> + +CONFIG_GPIO_TWL4030 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GPIO_TWL4030 note<'Unnecessary for Azure'> + +CONFIG_HIBERNATION policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_HIBERNATION note<'LP: #1980981'> + +CONFIG_HSA_AMD_P2P policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HSA_AMD_P2P note<'LP: #1987394'> + +CONFIG_HYPERV policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_HYPERV note<'LP:#1690136'> + +CONFIG_HYPERV_STORAGE policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_HYPERV_STORAGE note<'LP:#1690136'> + +CONFIG_I2C_CHARDEV policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_I2C_CHARDEV note<'LP: #1417032'> + +CONFIG_I2C_PIIX4 policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_I2C_PIIX4 note<'LP:#1752999'> + +CONFIG_IIO_SIMPLE_DUMMY_BUFFER policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_IIO_SIMPLE_DUMMY_BUFFER note<'dummy driver'> + +CONFIG_IIO_SIMPLE_DUMMY_EVENTS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_IIO_SIMPLE_DUMMY_EVENTS note<'dummy driver'> + +CONFIG_INFINIBAND_IPOIB_DEBUG policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_INFINIBAND_IPOIB_DEBUG note<'LP:#1798185'> + +CONFIG_INPUT_LEDS policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_INPUT_LEDS note<'modules reduction'> + +CONFIG_INTEL_IOMMU_DEFAULT_ON policy<{'amd64': 'y'}> +CONFIG_INTEL_IOMMU_DEFAULT_ON note<'the IOMMU can trigger boot failures'> + +CONFIG_IWLMEI policy<{'amd64': '-'}> +CONFIG_IWLMEI note<'LP: #1987312'> + +CONFIG_KERNEL_ZSTD policy<{'amd64': 'y', 'arm64': 'n'}> +CONFIG_KERNEL_ZSTD note<'LP: #1931725'> + +CONFIG_MICROSOFT_MANA policy<{'amd64': 'y'}> +CONFIG_MICROSOFT_MANA note<'LP:1949357'> + +CONFIG_MMC_BLOCK policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MMC_BLOCK note<'boot essential on armhf/arm64'> + +CONFIG_MMC_SDHCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_SDHCI note<'installation essential on omap/highbank'> + +CONFIG_MMC_SDHCI_PLTFM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_SDHCI_PLTFM note<'boot essential on highbank'> + +CONFIG_MTD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MTD note<'boot essential on arm'> + +CONFIG_MTD_BLOCK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_BLOCK note<'boot essential on arm'> + +CONFIG_MTD_DOCG3 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_DOCG3 note<'Unnecessary for Azure'> + +CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE note<'can be enabled at runtime'> + +CONFIG_MTD_ONENAND_VERIFY_WRITE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_ONENAND_VERIFY_WRITE note<'writes here are not checked in full without'> + +CONFIG_MTD_RAW_NAND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_RAW_NAND note<'boot essential on arm'> + +CONFIG_NETWORK_PHY_TIMESTAMPING policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NETWORK_PHY_TIMESTAMPING note<'Unnecessary for Azure'> + +CONFIG_NOP_USB_XCEIV policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NOP_USB_XCEIV note<'boot essential on omap/highbank'> + +CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT note<'Selects CONFIG_DRM_LEGACY which is not wanted'> + +CONFIG_NO_HZ_FULL policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_NO_HZ_FULL note<'Azure reports 10% of performance increase on NVMe'> + +CONFIG_NO_HZ_IDLE policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_NO_HZ_IDLE note<'Azure reports 10% of performance increase on NVMe'> + +CONFIG_OVERLAY_FS_REDIRECT_DIR policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_OVERLAY_FS_REDIRECT_DIR note<'LP:#1711230'> + +CONFIG_PCI_HYPERV policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_PCI_HYPERV note<'LP:#1908571'> + +CONFIG_PCI_MESON policy<{'amd64': 'y', 'arm64': 'n'}> +CONFIG_PCI_MESON note<'LP: #2007745'> + +CONFIG_POWERCAP policy<{'amd64': 'y', 'arm64': 'n'}> +CONFIG_POWERCAP note<'kernel reduction'> + +CONFIG_REGULATOR_TWL4030 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_TWL4030 note<'Unnecessary for Azure'> + +CONFIG_RUST policy<{'amd64': 'n'}> +CONFIG_RUST note<'required to enable Rust support, LP: #1993183'> + +CONFIG_SAMPLE_TRACE_PRINTK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SAMPLE_TRACE_PRINTK note<'Unnecessary for Azure'> + +CONFIG_SATA_ACARD_AHCI policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_ACARD_AHCI note<'modules reduction'> + +CONFIG_SATA_INIC162X policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_INIC162X note<'modules reduction'> + +CONFIG_SATA_MV policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_MV note<'modules reduction'> + +CONFIG_SATA_NV policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_NV note<'modules reduction'> + +CONFIG_SATA_PROMISE policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_PROMISE note<'modules reduction'> + +CONFIG_SATA_QSTOR policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_QSTOR note<'modules reduction'> + +CONFIG_SATA_SIL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SATA_SIL note<'modules reduction'> + +CONFIG_SATA_SIL24 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SATA_SIL24 note<'modules reduction'> + +CONFIG_SATA_SIS policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_SIS note<'modules reduction'> + +CONFIG_SATA_SVW policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_SVW note<'modules reduction'> + +CONFIG_SATA_SX4 policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_SX4 note<'modules reduction'> + +CONFIG_SATA_ULI policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_ULI note<'modules reduction'> + +CONFIG_SATA_VIA policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_VIA note<'modules reduction'> + +CONFIG_SATA_VITESSE policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_VITESSE note<'modules reduction'> + +CONFIG_SATA_ZPODD policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SATA_ZPODD note<'modules reduction'> + +CONFIG_SERIAL_DEV_BUS policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_SERIAL_DEV_BUS note<'LP: #1739939'> + +CONFIG_SERIAL_DEV_CTRL_TTYPORT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SERIAL_DEV_CTRL_TTYPORT note<'LP: #1739939'> + +CONFIG_SND policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND note<'not autoloadable on omap'> + +CONFIG_SND_HDA_POWER_SAVE_DEFAULT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_POWER_SAVE_DEFAULT note<'LP: #1804265'> + +CONFIG_SND_HDA_RECONFIG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_RECONFIG note<'allows fixes to be tested live'> + +CONFIG_SND_PCM_OSS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_PCM_OSS note<'deprecated in favour of pulseaudio emulation'> + +CONFIG_SND_SOC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC note<'not autoloadable on omap'> + +CONFIG_SND_SOC_AMD_RENOIR policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_RENOIR note<'Unnecessary for Azure'> + +CONFIG_SND_SOC_AMD_RENOIR_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_RENOIR_MACH note<'Unnecessary for Azure'> + +CONFIG_SND_SOC_INTEL_CFL policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_CFL note<'Not selectable for Azure'> + +CONFIG_SND_SOC_INTEL_CML_H policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_CML_H note<'Not selectable for Azure'> + +CONFIG_SND_SOC_INTEL_CML_LP policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_CML_LP note<'Not selectable for Azure'> + +CONFIG_SND_SOC_INTEL_CNL policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_CNL note<'Not selectable for Azure'> + +CONFIG_SND_SOC_INTEL_SKYLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SKYLAKE note<'Not selectable for Azure'> + +CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC note<'Not selectable for Azure'> + +CONFIG_SND_SOC_INTEL_SOUNDWIRE_SOF_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOUNDWIRE_SOF_MACH note<'LP:1921632'> + +CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES note<'LP:1921632'> + +CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1 note<'Unnecessary for Azure'> + +CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC note<'Unnecessary for Azure'> + +CONFIG_SND_SOC_SOF_HDA_COMMON_HDMI_CODEC policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_HDA_COMMON_HDMI_CODEC note<'Not selectable for Azure'> + +CONFIG_SND_SOC_SOF_HDA_LINK policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_HDA_LINK note<'Unnecessary for Azure'> + +CONFIG_SND_SOC_SOF_NOCODEC_SUPPORT policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_NOCODEC_SUPPORT note<'Unnecessary for Azure'> + +CONFIG_SOUND policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_SOUND note<'modules reduction'> + +CONFIG_SOUND_OSS_CORE_PRECLAIM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SOUND_OSS_CORE_PRECLAIM note<'Unnecessary for Azure'> + +CONFIG_SPI_INTEL_SPI_PCI policy<{'amd64': '-'}> +CONFIG_SPI_INTEL_SPI_PCI note<'Unnecessary for Azure'> + +CONFIG_SPI_INTEL_SPI_PLATFORM policy<{'amd64': '-'}> +CONFIG_SPI_INTEL_SPI_PLATFORM note<'Unnecessary for Azure'> + +CONFIG_TCG_TIS_I2C_ATMEL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TCG_TIS_I2C_ATMEL note<'LP: #1643652'> + +CONFIG_TCG_TIS_I2C_INFINEON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TCG_TIS_I2C_INFINEON note<'LP: #1643652'> + +CONFIG_TCG_TIS_I2C_NUVOTON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TCG_TIS_I2C_NUVOTON note<'LP: #1643652'> + +CONFIG_TDX_GUEST_DRIVER policy<{'amd64': 'y'}> +CONFIG_TDX_GUEST_DRIVER note<'LP: #2016995'> + +CONFIG_TEST_BLACKHOLE_DEV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TEST_BLACKHOLE_DEV note<'Used by net selftests'> + +CONFIG_TEST_LOCKUP policy<{'amd64': 'm', 'arm64': 'm'}> +CONFIG_TEST_LOCKUP note<'LP: #2052723'> + +CONFIG_TOUCHSCREEN_ELAN policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TOUCHSCREEN_ELAN note<'kernel reduction'> + +CONFIG_USB_EHCI_HCD policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_USB_EHCI_HCD note<'kernel reduction'> + +CONFIG_USB_EHCI_HCD_PLATFORM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_EHCI_HCD_PLATFORM note<'kernel reduction'> + +CONFIG_USB_HCD_BCMA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_HCD_BCMA note<'USB_{O,E}HCI_HCD_PLATFORM must be off on omap'> + +CONFIG_USB_HCD_SSB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_HCD_SSB note<'USB_{O,E}HCI_HCD_PLATFORM must be off on omap'> + +CONFIG_USB_M66592 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_M66592 note<'gadget device'> + +CONFIG_USB_MUSB_HDRC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_MUSB_HDRC note<'not autoloadable on omap'> + +CONFIG_USB_OHCI_HCD policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_USB_OHCI_HCD note<'Not selectable for Azure'> + +CONFIG_USB_SERIAL_DEBUG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_DEBUG note<'not actually debug'> + +CONFIG_USB_UHCI_HCD policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_USB_UHCI_HCD note<'kernel reduction'> + +CONFIG_USB_XHCI_PCI policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_USB_XHCI_PCI note<'Enable xHCI for PCI passthrough'> + +CONFIG_VBOXGUEST policy<{'amd64': 'n'}> +CONFIG_VBOXGUEST note<'LP:#1796647'> + +CONFIG_XEN_512GB policy<{'amd64': '-'}> +CONFIG_XEN_512GB note<'Q: is this related to the utlemming questions on memory size?'> + +CONFIG_XEN_ACPI_PROCESSOR policy<{'amd64': '-'}> +CONFIG_XEN_ACPI_PROCESSOR note<'LP:#1671203'> + +CONFIG_XEN_BLKDEV_FRONTEND policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_BLKDEV_FRONTEND note<'not autoloadable -- XEN paravirt support'> + +CONFIG_XEN_NETDEV_FRONTEND policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_NETDEV_FRONTEND note<'not autoloadable -- XEN paravirt support'> + + +# ---- Annotations without notes ---- + +CONFIG_6PACK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_A11Y_BRAILLE_CONSOLE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ABP060MG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AC97_BUS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_ACENIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ACENIC_OMIT_TIGON_I policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ACPI_AC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_ACPI_ALS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ACPI_APEI_EINJ policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ACPI_APEI_GHES policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_ACPI_BATTERY policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_ACPI_BGRT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_ACPI_CONFIGFS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ACPI_DOCK policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_ACPI_FAN policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_ACPI_I2C_OPREGION policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ACPI_PCI_SLOT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_ACPI_TABLE_UPGRADE policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_ACPI_TAD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ACPI_THERMAL policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_ACPI_TOSHIBA policy<{'amd64': '-'}> +CONFIG_AD2S1200 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD2S1210 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD2S90 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD3552R policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD4130 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5064 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5110 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD525X_DPOT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_AD525X_DPOT_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD525X_DPOT_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5272 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5360 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5380 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5421 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5446 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5449 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5504 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5592R policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5592R_BASE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5593R policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5624R_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5686 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5686_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5696_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5755 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5758 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5761 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5764 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5766 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5770R policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5791 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD5933 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7091R5 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7124 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7150 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7192 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7266 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7280 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7291 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7292 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7293 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7298 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7303 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD74115 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD74413R policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7476 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7606 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7606_IFACE_PARALLEL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7606_IFACE_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7746 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7766 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7768_1 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7780 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7791 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7793 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7816 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7887 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7923 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD7949 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD799X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD8366 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD8801 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD9523 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD9832 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD9834 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADA4250 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADAPTEC_STARFIRE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADE7854 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_ADE7854_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_ADE7854_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_ADF4350 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADF4371 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADF4377 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16080 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16130 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16136 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16201 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16203 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16209 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16240 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16260 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16400 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16460 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16475 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADIS16480 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADJD_S311 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADM8211 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADMV1013 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADMV1014 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADMV4420 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADMV8818 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADRF6780 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADT7316 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADT7316_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADT7316_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADUX1020 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL313 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL313_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL313_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL355 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL355_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL355_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL367 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL367_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL367_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL372 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL372_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXL372_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXRS290 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ADXRS450 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AD_SIGMA_DELTA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AFE4403 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AFE4404 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AHCI_BRCM policy<{'arm64': 'm'}> +CONFIG_AIRO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AIRO_CS policy<{'amd64': '-'}> +CONFIG_AK09911 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AK8974 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AK8975 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AL3010 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AL3320A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ALTERA_FREEZE_BRIDGE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ALTERA_MBOX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ALTERA_PR_IP_CORE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ALTERA_STAPL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ALTERA_TSE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ALX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AM2315 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AMD8111_ETH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AMD_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_AMD_XGBE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AMD_XGBE_DCB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_AMD_XGBE_HAVE_ECC policy<{'amd64': '-'}> +CONFIG_ANDROID_BINDER_DEVICES policy<{'amd64': '"binder,hwbinder,vndbinder"', 'arm64': '""'}> +CONFIG_APDS9300 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_APDS9960 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_APPLE_M1_CPU_PMU policy<{'arm64': 'n'}> +CONFIG_AQUANTIA_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_AR5523 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ARCH_BCM policy<{'arm64': 'y'}> +CONFIG_ARCH_BCM2835 policy<{'arm64': 'y'}> +CONFIG_ARCH_BCMBCA policy<{'arm64': 'y'}> +CONFIG_ARCH_BCM_IPROC policy<{'arm64': 'y'}> +CONFIG_ARCH_BRCMSTB policy<{'arm64': 'y'}> +CONFIG_ARCH_HIBERNATION_HEADER policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_ARCH_INLINE_READ_LOCK policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_READ_LOCK_BH policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_READ_LOCK_IRQ policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_READ_LOCK_IRQSAVE policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_READ_UNLOCK policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_READ_UNLOCK_BH policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_READ_UNLOCK_IRQ policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_READ_UNLOCK_IRQRESTORE policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_SPIN_LOCK policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_SPIN_LOCK_BH policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_SPIN_LOCK_IRQ policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_SPIN_LOCK_IRQSAVE policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_SPIN_TRYLOCK policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_SPIN_TRYLOCK_BH policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_SPIN_UNLOCK policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_SPIN_UNLOCK_BH policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQ policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_WRITE_LOCK policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_WRITE_LOCK_BH policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_WRITE_LOCK_IRQ policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_WRITE_LOCK_IRQSAVE policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_WRITE_UNLOCK policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_WRITE_UNLOCK_BH policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQ policy<{'arm64': 'y'}> +CONFIG_ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE policy<{'arm64': 'y'}> +CONFIG_ARCH_NR_GPIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_ARM_BRCMSTB_AVS_CPUFREQ policy<{'arm64': 'm'}> +CONFIG_ARM_RASPBERRYPI_CPUFREQ policy<{'arm64': 'm'}> +CONFIG_ARM_SCMI_POWERCAP policy<{'arm64': '-'}> +CONFIG_ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE policy<{'arm64': 'n'}> +CONFIG_ARM_SCMI_TRANSPORT_VIRTIO_ATOMIC_ENABLE policy<{'arm64': 'n'}> +CONFIG_ARM_SMMU_QCOM_DEBUG policy<{'arm64': 'n'}> +CONFIG_AS3935 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AS73211 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ASUS_NB_WMI policy<{'amd64': '-'}> +CONFIG_ASUS_TF103C_DOCK policy<{'amd64': 'n'}> +CONFIG_ASUS_WMI policy<{'amd64': '-'}> +CONFIG_ASYNC_RAID6_TEST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_AT76C50X_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AT803X_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ATA_OVER_ETH policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ATH10K policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH10K_CE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH10K_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ATH10K_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH10K_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH10K_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH10K_SPECTRAL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH10K_TRACING policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH10K_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH11K policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH11K_AHB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH11K_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ATH11K_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH11K_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH11K_SPECTRAL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH11K_TRACING policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH12K policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH12K_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ATH12K_TRACING policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH5K policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH5K_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ATH5K_PCI policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH5K_TRACER policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ATH6KL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH6KL_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ATH6KL_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH6KL_TRACING policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ATH6KL_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH9K policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH9K_AHB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_BTCOEX_SUPPORT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_CHANNEL_CONTEXT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH9K_COMMON_DEBUG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_COMMON_SPECTRAL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_DYNACK policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ATH9K_HTC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH9K_HTC_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_HW policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH9K_HWRNG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_PCI policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_PCI_NO_EEPROM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH9K_PCOEM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_RFKILL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_STATION_STATISTICS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH9K_WOW policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ATH_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATH_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ATL1 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATL1C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATL1E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATL2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATLAS_EZO_SENSOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATLAS_PH_SENSOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATMEL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ATOMIC64_SELFTEST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_AXP20X_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AXP20X_POWER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AXP288_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_AXP288_FUEL_GAUGE policy<{'amd64': '-'}> +CONFIG_B43 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_B43LEGACY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_B43LEGACY_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_B43LEGACY_DMA policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43LEGACY_DMA_AND_PIO_MODE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43LEGACY_DMA_MODE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_B43LEGACY_HWRNG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43LEGACY_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43LEGACY_PCICORE_AUTOSELECT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43LEGACY_PCI_AUTOSELECT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43LEGACY_PIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43LEGACY_PIO_MODE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_B43_BCMA policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_BCMA_PIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_BUSES_BCMA policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_B43_BUSES_BCMA_AND_SSB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_BUSES_SSB policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_B43_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_B43_HWRNG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_PCICORE_AUTOSELECT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_PCI_AUTOSELECT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_PHY_G policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_PHY_HT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_PHY_LP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_PHY_N policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_PIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_B43_SDIO policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_B43_SSB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BACKLIGHT_88PM860X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BACKLIGHT_AAT2870 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BACKLIGHT_ADP5520 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BACKLIGHT_ADP8860 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKLIGHT_ADP8870 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKLIGHT_AS3711 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BACKLIGHT_BD6107 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKLIGHT_CARILLO_RANCH policy<{'amd64': '-'}> +CONFIG_BACKLIGHT_DA903X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BACKLIGHT_DA9052 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKLIGHT_GPIO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKLIGHT_KTD253 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKLIGHT_LM3533 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BACKLIGHT_LM3639 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKLIGHT_LP8788 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BACKLIGHT_LV5207LP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKLIGHT_MAX8925 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BACKLIGHT_PANDORA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BACKLIGHT_PCF50633 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKLIGHT_RAVE_SP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BACKLIGHT_SKY81452 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKLIGHT_WM831X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BACKTRACE_SELF_TEST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_BARCO_P50_GPIO policy<{'amd64': 'n'}> +CONFIG_BATTERY_88PM860X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_AXP20X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_BQ27XXX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_BATTERY_BQ27XXX_HDQ policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_BQ27XXX_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_DA9030 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_DA9052 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BATTERY_DA9150 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_DS2760 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_DS2780 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BATTERY_DS2781 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BATTERY_DS2782 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BATTERY_GAUGE_LTC2941 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BATTERY_MAX17040 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BATTERY_MAX17042 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BATTERY_MAX1721X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_RT5033 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BATTERY_RX51 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_SAMSUNG_SDI policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_BATTERY_SBS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BATTERY_SURFACE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_TWL4030_MADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BATTERY_UG3105 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BAYCOM_PAR policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BAYCOM_SER_FDX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BAYCOM_SER_HDX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BCH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BCM2711_THERMAL policy<{'arm64': 'm'}> +CONFIG_BCM2835_MBOX policy<{'arm64': 'y'}> +CONFIG_BCM2835_POWER policy<{'arm64': 'y'}> +CONFIG_BCM2835_THERMAL policy<{'arm64': 'm'}> +CONFIG_BCM2835_VCHIQ policy<{'arm64': 'm'}> +CONFIG_BCM2835_VCHIQ_MMAL policy<{'arm64': 'm'}> +CONFIG_BCM2835_WDT policy<{'arm64': 'm'}> +CONFIG_BCM4908_ENET policy<{'arm64': 'm'}> +CONFIG_BCM7038_L1_IRQ policy<{'arm64': 'y'}> +CONFIG_BCM7038_WDT policy<{'arm64': 'm'}> +CONFIG_BCM7120_L2_IRQ policy<{'arm64': 'm'}> +CONFIG_BCM87XX_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BCMA_BLOCKIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BCM_FLEXRM_MBOX policy<{'arm64': 'm'}> +CONFIG_BCM_IPROC_ADC policy<{'arm64': 'm'}> +CONFIG_BCM_KONA_USB2_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BCM_NET_PHYPTP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BCM_NS_THERMAL policy<{'arm64': 'm'}> +CONFIG_BCM_PDC_MBOX policy<{'arm64': 'm'}> +CONFIG_BCM_PMB policy<{'arm64': 'y'}> +CONFIG_BCM_SR_THERMAL policy<{'arm64': 'm'}> +CONFIG_BCM_VIDEOCORE policy<{'arm64': 'm'}> +CONFIG_BCM_VK_TTY policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_BGMAC policy<{'arm64': 'y'}> +CONFIG_BGMAC_PLATFORM policy<{'arm64': 'y'}> +CONFIG_BH1750 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BH1780 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BINDGEN_VERSION_TEXT policy<{'amd64': '-'}> +CONFIG_BLK_DEV_3W_XXXX_RAID policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BLK_DEV_FD_RAWCMD policy<{'amd64': '-'}> +CONFIG_BLK_DEV_NULL_BLK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BLK_DEV_PCIESSD_MTIP32XX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BLK_DEV_SX8 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_BMA220 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMA400 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMA400_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMA400_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMC150_ACCEL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMC150_ACCEL_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMC150_ACCEL_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMC150_MAGN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMC150_MAGN_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMC150_MAGN_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BME680 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BME680_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BME680_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMG160 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMG160_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMG160_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMI088_ACCEL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMI088_ACCEL_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMI160 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMI160_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMI160_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMP280 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMP280_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BMP280_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BNA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BOSCH_BNO055 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BOSCH_BNO055_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BOSCH_BNO055_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BPQETHER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BRCMDBG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_BRCMFMAC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BRCMFMAC_PCIE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BRCMFMAC_PROTO_BCDC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BRCMFMAC_PROTO_MSGBUF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BRCMFMAC_SDIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BRCMFMAC_USB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BRCMSMAC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BRCMSMAC_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BRCMSTB_DPFE policy<{'arm64': 'y'}> +CONFIG_BRCMSTB_L2_IRQ policy<{'arm64': 'y'}> +CONFIG_BRCMSTB_MEMC policy<{'arm64': 'm'}> +CONFIG_BRCMSTB_PM policy<{'arm64': '-'}> +CONFIG_BRCMSTB_THERMAL policy<{'arm64': 'm'}> +CONFIG_BRCMUTIL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BRCM_TRACING policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BRCM_USB_PINMAP policy<{'arm64': 'm'}> +CONFIG_BROADCOM_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_BT_6LOWPAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_AOSPEXT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_ATH3K policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_BCM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_BNEP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_BNEP_MC_FILTER policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_BNEP_PROTO_FILTER policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_BREDR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_CMTP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIBCM203X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_HCIBCM4377 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_HCIBFUSB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_HCIBLUECARD policy<{'amd64': '-'}> +CONFIG_BT_HCIBPA10X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_HCIBT3C policy<{'amd64': '-'}> +CONFIG_BT_HCIBTSDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_HCIBTUSB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_HCIBTUSB_AUTOSUSPEND policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIBTUSB_BCM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIBTUSB_MTK policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIBTUSB_POLL_SYNC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIBTUSB_RTL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIDTL1 policy<{'amd64': '-'}> +CONFIG_BT_HCIRSI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_HCIUART policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_HCIUART_3WIRE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_AG6XX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_ATH3K policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_BCM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_BCSP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_H4 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_INTEL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_LL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_MRVL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_NOKIA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_HCIUART_QCA policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_RTL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIUART_SERDEV policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_HCIVHCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_HIDP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_INTEL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_LE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_LE_L2CAP_ECRED policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_MRVL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_MRVL_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_MSFTEXT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_MTK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_MTKSDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_MTKUART policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_NXPUART policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_QCA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_RFCOMM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_RFCOMM_TTY policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_BT_RTL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BT_SELFTEST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_BT_VIRTIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_BUILD_BIN2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_BYTCRC_PMIC_OPREGION policy<{'amd64': '-'}> +CONFIG_C2PORT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_C2PORT_DURAMAR_2150 policy<{'amd64': '-'}> +CONFIG_CACHEFILES_ERROR_INJECTION policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_CACHEFILES_ONDEMAND policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_CAIF_TTY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_8DEV_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_CC770 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_CC770_ISA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CAN_CC770_PLATFORM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CAN_EMS_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_ESD_USB2 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CAN_GS_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_IFI_CANFD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_ISOTP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_KVASER_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_MCBA_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_MCP251X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_MCP251XFD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_MCP251XFD_SANITY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_CAN_M_CAN policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_M_CAN_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CAN_M_CAN_PLATFORM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CAN_M_CAN_TCAN4X5X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CAN_PEAK_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_SOFTING policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAN_SOFTING_CS policy<{'amd64': '-'}> +CONFIG_CAN_UCAN policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CAPI_TRACE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_CARL9170 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CARL9170_DEBUGFS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_CARL9170_HWRNG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_CARL9170_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_CARL9170_WPC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_CARMINE_DRAM_CUSTOM policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_CASSINI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CAVIUM_PTP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CB710_CORE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CB710_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_CB710_DEBUG_ASSUMPTIONS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_CC10001_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CCS811 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CEC_CH7322 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CEC_CROS_EC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CEC_GPIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CEC_PIN policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CEC_PIN_ERROR_INJ policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CFG80211_WEXT_EXPORT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_CHARGER_88PM860X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_AXP20X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_BQ2415X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_BQ24257 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_BQ24735 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_BQ2515X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_BQ256XX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_BQ25890 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_BQ25980 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_CROS_PCHG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CHARGER_CROS_USBPD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CHARGER_DA9150 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_GPIO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_LP8727 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_LP8788 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_MANAGER policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_CHARGER_MAX14577 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_MAX77693 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_MAX77976 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_MAX8903 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_MAX8997 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_MAX8998 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_MP2629 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_MT6370 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_PCF50633 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_RT9455 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_SBS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_SMB347 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CHARGER_SURFACE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_TPS65090 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_TWL4030 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHARGER_WILCO policy<{'amd64': '-'}> +CONFIG_CHELSIO_LIB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CHELSIO_T4_FCOE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_CHROMEOS_ACPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CHROMEOS_LAPTOP policy<{'amd64': '-'}> +CONFIG_CHROMEOS_PRIVACY_SCREEN policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CHROMEOS_PSTORE policy<{'amd64': '-'}> +CONFIG_CHROMEOS_TBMC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CHTCRC_PMIC_OPREGION policy<{'amd64': '-'}> +CONFIG_CHT_DC_TI_PMIC_OPREGION policy<{'amd64': '-'}> +CONFIG_CHT_WC_PMIC_OPREGION policy<{'amd64': '-'}> +CONFIG_CICADA_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CIO2_BRIDGE policy<{'amd64': '-'}> +CONFIG_CIO_DAC policy<{'amd64': '-'}> +CONFIG_CLK_BCM2711_DVP policy<{'arm64': 'm'}> +CONFIG_CLK_BCM2835 policy<{'arm64': 'y'}> +CONFIG_CLK_BCM_63XX policy<{'arm64': 'y'}> +CONFIG_CLK_BCM_NS2 policy<{'arm64': 'y'}> +CONFIG_CLK_BCM_SR policy<{'arm64': 'y'}> +CONFIG_CLK_RASPBERRYPI policy<{'arm64': 'm'}> +CONFIG_CLK_TWL6040 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CM32181 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CM3232 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CM3323 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CM3605 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CM36651 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_COMEDI_8254 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_8255 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_8255_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_8255_SA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_APCI_1032 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_APCI_1500 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_APCI_1516 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_APCI_1564 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_APCI_16XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_APCI_2032 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_APCI_2200 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_APCI_3120 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_APCI_3501 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_APCI_3XXX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADDI_WATCHDOG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADL_PCI6208 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADL_PCI7X3X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADL_PCI8164 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADL_PCI9111 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_ADL_PCI9118 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_ADQ12B policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_ADV_PCI1710 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_ADV_PCI1720 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADV_PCI1723 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADV_PCI1724 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADV_PCI1760 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ADV_PCI_DIO policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_AIO_AIO12_8 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_AIO_IIRO_16 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_AMPLC_DIO200 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_AMPLC_DIO200_ISA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_AMPLC_DIO200_PCI policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_AMPLC_PC236 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_AMPLC_PC236_ISA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_AMPLC_PC236_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_AMPLC_PC263_ISA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_AMPLC_PC263_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_AMPLC_PCI224 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_AMPLC_PCI230 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_BOND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_C6XDIGIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_CB_DAS16_CS policy<{'amd64': '-'}> +CONFIG_COMEDI_CB_PCIDAS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_CB_PCIDAS64 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_CB_PCIDDA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_CB_PCIMDAS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_CB_PCIMDDA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_CONTEC_PCI_DIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_DAC02 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DAQBOARD2000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_DAS08 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DAS08_CS policy<{'amd64': '-'}> +CONFIG_COMEDI_DAS08_ISA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DAS08_PCI policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_DAS16 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DAS16M1 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DAS1800 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DAS6402 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DAS800 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_DEFAULT_BUF_MAXSIZE_KB policy<{'amd64': '-', 'arm64': '20480'}> +CONFIG_COMEDI_DEFAULT_BUF_SIZE_KB policy<{'amd64': '-', 'arm64': '2048'}> +CONFIG_COMEDI_DMM32AT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DT2801 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DT2811 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DT2814 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DT2815 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DT2817 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DT282X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_DT3000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_DT9812 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_DYNA_PCI10XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_FL512 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_GSC_HPDI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ICP_MULTI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_II_PCI20KC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_ISADMA policy<{'amd64': '-'}> +CONFIG_COMEDI_ISA_DRIVERS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_JR3_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_KCOMEDILIB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_KE_COUNTER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_ME4000 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_ME_DAQ policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_MF6X4 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_MISC_DRIVERS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_COMEDI_MITE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_MPC624 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_MULTIQ3 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_NI_6527 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_NI_65XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_NI_660X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_NI_670X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_NI_ATMIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_NI_ATMIO16D policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_NI_AT_A2150 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_NI_AT_AO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_NI_DAQ_700_CS policy<{'amd64': '-'}> +CONFIG_COMEDI_NI_DAQ_DIO24_CS policy<{'amd64': '-'}> +CONFIG_COMEDI_NI_LABPC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_NI_LABPC_CS policy<{'amd64': '-'}> +CONFIG_COMEDI_NI_LABPC_ISA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_NI_LABPC_ISADMA policy<{'amd64': '-'}> +CONFIG_COMEDI_NI_LABPC_PCI policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_NI_MIO_CS policy<{'amd64': '-'}> +CONFIG_COMEDI_NI_PCIDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_NI_PCIMIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_NI_ROUTING policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_NI_TIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_NI_TIOCMD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_NI_USB6501 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_PARPORT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_PCI_DRIVERS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_PCL711 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCL724 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCL726 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCL730 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCL812 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCL816 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCL818 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCM3724 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCMAD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCMCIA_DRIVERS policy<{'amd64': '-'}> +CONFIG_COMEDI_PCMDA12 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCMMIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_PCMUIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_QUATECH_DAQP_CS policy<{'amd64': '-'}> +CONFIG_COMEDI_RTD520 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_COMEDI_RTI800 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_RTI802 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_S526 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_COMEDI_S626 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_TEST policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_TESTS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_TESTS_EXAMPLE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_TESTS_NI_ROUTES policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_USBDUX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_USBDUXFAST policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_USBDUXSIGMA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_USB_DRIVERS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMEDI_VMK80XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMMON_CLK_CDCE706 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_COMMON_CLK_CS2000_CP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_COMMON_CLK_IPROC policy<{'arm64': 'y'}> +CONFIG_COMMON_CLK_PALMAS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_COMMON_CLK_SI5351 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_COMMON_CLK_WM831X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CONSTRUCTORS policy<{'amd64': '-'}> +CONFIG_CONTEXT_TRACKING_USER policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_CONTEXT_TRACKING_USER_FORCE policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_CPU_IDLE_THERMAL policy<{'arm64': '-'}> +CONFIG_CRAMFS_MTD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_CROS_EC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_CHARDEV policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_DEBUGFS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_ISHTP policy<{'amd64': '-'}> +CONFIG_CROS_EC_LIGHTBAR policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_LPC policy<{'amd64': '-'}> +CONFIG_CROS_EC_MKBP_PROXIMITY policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_PROTO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_RPMSG policy<{'arm64': '-'}> +CONFIG_CROS_EC_SENSORHUB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_SYSFS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_TYPEC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_UART policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_EC_VBC policy<{'arm64': '-'}> +CONFIG_CROS_HPS_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_KBD_LED_BACKLIGHT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_TYPEC_SWITCH policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_USBPD_LOGGER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CROS_USBPD_NOTIFY policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CRYPTO_AES_TI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_CRYPTO_DEV_BCM_SPU policy<{'arm64': 'm'}> +CONFIG_CRYPTO_GF128MUL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_CW1200 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CW1200_WLAN_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CW1200_WLAN_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CXD2880_SPI_DRV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_CYPRESS_FIRMWARE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DA280 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DA311 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DA9055_WATCHDOG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DA9062_WATCHDOG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DA9150_GPADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DAVICOM_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DE2104X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DE2104X_DSL policy<{'amd64': '-', 'arm64': '0'}> +CONFIG_DEBUG_PREEMPT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_DEV_COREDUMP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_DHT11 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DLHL60D policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DLN2_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DM9051 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DM9102 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DMARD06 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DMARD09 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DMARD10 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DMA_BCM2835 policy<{'arm64': 'y'}> +CONFIG_DMI_SYSFS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DP83640_PHY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DP83848_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DP83867_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DPOT_DAC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DPS310 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DRAGONRISE_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_DRM_AMD_DC_SI policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_DRM_ANALOGIX_ANX78XX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DRM_ANALOGIX_DP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DRM_BOCHS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DRM_CIRRUS_QEMU policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DRM_CROS_EC_ANX7688 policy<{'arm64': '-'}> +CONFIG_DRM_DW_HDMI_AHB_AUDIO policy<{'arm64': '-'}> +CONFIG_DRM_DW_HDMI_GP_AUDIO policy<{'arm64': '-'}> +CONFIG_DRM_DW_HDMI_I2S_AUDIO policy<{'arm64': 'n'}> +CONFIG_DRM_GM12U320 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DRM_I2C_ADV7511_AUDIO policy<{'arm64': '-'}> +CONFIG_DRM_I2C_CH7006 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DRM_I2C_NXP_TDA998X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DRM_I2C_SIL164 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DRM_NOMODESET policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_DRM_NOUVEAU_BACKLIGHT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_DRM_NOUVEAU_SVM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_DRM_PRIVACY_SCREEN policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_DRM_UDL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DRM_USE_DYNAMIC_DEBUG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_DRM_V3D policy<{'arm64': 'm'}> +CONFIG_DRM_VC4 policy<{'arm64': '-'}> +CONFIG_DRM_VC4_HDMI_CEC policy<{'arm64': '-'}> +CONFIG_DRM_VGEM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_DRM_XEN policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_DRM_XEN_FRONTEND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DS1803 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DS4424 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DTPM policy<{'arm64': '-'}> +CONFIG_DTPM_CPU policy<{'arm64': '-'}> +CONFIG_DTPM_DEVFREQ policy<{'arm64': '-'}> +CONFIG_DVB_A8293 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_AF9013 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_AF9033 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_AS102 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_AS102_FE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_ASCOT2E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_ATBM8830 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_AU8522 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_AU8522_DTV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_AU8522_V4L policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_AV7110 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_AV7110_IR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_DVB_AV7110_OSD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_DVB_B2C2_FLEXCOP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_B2C2_FLEXCOP_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_DVB_B2C2_FLEXCOP_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_DVB_BCM3510 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_BT8XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_BUDGET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_BUDGET_AV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_BUDGET_CI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_BUDGET_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_BUDGET_PATCH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CX22700 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CX22702 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CX24110 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CX24116 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CX24117 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CX24120 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CX24123 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CXD2099 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CXD2820R policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CXD2841ER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_CXD2880 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DDBRIDGE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DDBRIDGE_MSIENABLE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_DVB_DEMUX_SECTION_LOSS_LOG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_DVB_DIB3000MB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DIB3000MC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DIB7000M policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DIB7000P policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DIB8000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DIB9000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DM1105 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DRX39XYJ policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DRXD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DRXK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DS3000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_DYNAMIC_MINORS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_DVB_EC100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_FIREDTV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_FIREDTV_INPUT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_DVB_GP8PSK_FE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_HELENE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_HOPPER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_HORUS3A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_ISL6405 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_ISL6421 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_ISL6423 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_IX2505V policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_L64781 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_LG2160 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_LGDT3305 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_LGDT3306A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_LGDT330X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_LGS8GL5 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_LGS8GXX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_LNBH25 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_LNBH29 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_LNBP21 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_LNBP22 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_M88DS3103 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_M88RS2000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_MANTIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_MAX_ADAPTERS policy<{'amd64': '-', 'arm64': '8'}> +CONFIG_DVB_MB86A16 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_MB86A20S policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_MMAP policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_DVB_MN88443X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_MN88472 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_MN88473 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_MT312 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_MT352 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_MXL5XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_MXL692 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_NET policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_DVB_NETUP_UNIDVB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_NGENE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_NXT200X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_NXT6000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_OR51132 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_OR51211 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_PLATFORM_DRIVERS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_DVB_PLL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_PLUTO2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_PT1 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_PT3 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_RTL2830 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_RTL2832 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_RTL2832_SDR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_S5H1409 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_S5H1411 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_S5H1420 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_S5H1432 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_S921 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_SI2165 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_SI2168 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_SI21XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_SMIPCIE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_SP2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_SP8870 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_SP887X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STB0899 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STB6000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STB6100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STV0288 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STV0297 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STV0299 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STV0367 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STV0900 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STV090x policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STV0910 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STV6110 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STV6110x policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_STV6111 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TC90522 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA10021 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA10023 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA10048 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA1004X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA10071 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA10086 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA18271C2DD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA665x policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA8083 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA8261 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TDA826X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TEST_DRIVERS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_DVB_TS2020 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TTUSB_BUDGET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TTUSB_DEC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TUA6100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TUNER_CX24113 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TUNER_DIB0070 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TUNER_DIB0090 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_TUNER_ITD1000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_ULE_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_DVB_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_A800 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_AF9005 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_AF9005_REMOTE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_AF9015 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_AF9035 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_ANYSEE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_AU6610 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_AZ6007 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_AZ6027 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_CE6230 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_CINERGY_T2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_CXUSB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_CXUSB_ANALOG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_DVB_USB_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_DVB_USB_DIB0700 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_DIB3000MC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_DIBUSB_MB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_DIBUSB_MB_FAULTY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_DVB_USB_DIBUSB_MC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_DIGITV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_DTT200U policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_DTV5100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_DVBSKY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_DW2102 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_EC168 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_GL861 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_GP8PSK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_LME2510 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_M920X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_MXL111SF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_NOVA_T_USB2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_OPERA1 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_PCTV452E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_RTL28XXU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_TECHNISAT_USB2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_TTUSB2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_UMT_010 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_V2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_VP702X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_VP7045 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_USB_ZD1301 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_VES1820 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_VES1X93 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_ZD1301_DEMOD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_ZL10036 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_ZL10039 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DVB_ZL10353 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DWMAC_GENERIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_DWMAC_INTEL policy<{'amd64': '-'}> +CONFIG_DWMAC_LOONGSON policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_DW_DMAC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ECHO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_EDAC_GHES policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_EEEPC_WMI policy<{'amd64': '-'}> +CONFIG_EEPROM_93XX46 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_EEPROM_AT25 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_EEPROM_IDT_89HPESX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_EEPROM_LEGACY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_EEPROM_MAX6875 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_EFI_EMBEDDED_FIRMWARE policy<{'amd64': '-'}> +CONFIG_EL3 policy<{'amd64': '-'}> +CONFIG_ENA_ETHERNET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ENC28J60 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ENC28J60_WRITEVERIFY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ENCX24J600 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ENVELOPE_DETECTOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_EPIC100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_EROFS_FS_ONDEMAND policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_EROFS_FS_PCPU_KTHREAD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_EROFS_FS_PCPU_KTHREAD_HIPRI policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_EROFS_FS_ZIP policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_EROFS_FS_ZIP_LZMA policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_EXTCON_ADC_JACK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_EXTCON_INTEL_CHT_WC policy<{'amd64': '-'}> +CONFIG_EXTCON_MAX77843 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_EXTCON_MAX8997 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_EXTCON_PALMAS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_EXTCON_USBC_CROS_EC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_EXTCON_USBC_TUSB320 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FB_3DFX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_3DFX_ACCEL policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FB_3DFX_I2C policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FB_ARK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_ASILIANT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_FB_ATY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_ATY128 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_ATY128_BACKLIGHT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_ATY_BACKLIGHT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_ATY_CT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_ATY_GENERIC_LCD policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FB_ATY_GX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_CARMINE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_CARMINE_DRAM_EVAL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_CIRRUS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_CYBER2000 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_CYBER2000_DDC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_I740 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_IMSTT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_FB_KYRO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_MATROX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_MATROX_G policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_MATROX_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FB_MATROX_MAVEN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FB_MATROX_MILLENIUM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_MATROX_MYSTIQUE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_MB862XX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_MB862XX_I2C policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_MB862XX_PCI_GDC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_METRONOME policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_NEOMAGIC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_NVIDIA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_NVIDIA_BACKLIGHT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_NVIDIA_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FB_NVIDIA_I2C policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_OPENCORES policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_PM2 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_PM2_FIFO_DISCONNECT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_PM3 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_RADEON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_RADEON_BACKLIGHT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_RADEON_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FB_RADEON_I2C policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_RIVA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_RIVA_BACKLIGHT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_RIVA_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FB_RIVA_I2C policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_S1D13XXX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_S3 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_S3_DDC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_SAVAGE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_SAVAGE_ACCEL policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FB_SAVAGE_I2C policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_SIS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_SIS_300 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_SIS_315 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FB_SM712 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_SMSCUFX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_SVGALIB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FB_TRIDENT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_UDL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_UVESA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_VOODOO1 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FB_VT8623 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FCOE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FCOE_FNIC policy<{'amd64': '-'}> +CONFIG_FIND_BIT_BENCHMARK policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FIREWIRE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FIREWIRE_NET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FIREWIRE_OHCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FIREWIRE_SBP2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FIREWIRE_SERIAL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_FONTS policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_FONT_10x18 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FONT_6x10 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FONT_6x11 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FONT_6x8 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FONT_7x14 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FONT_ACORN_8x8 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FONT_MINI_4x6 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FONT_PEARL_8x8 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FONT_SUN12x22 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FONT_SUN8x16 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FONT_TER16x32 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_FORCEDETH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FORCE_MAX_ZONEORDER policy<{'arm64': '-'}> +CONFIG_FPGA_BRIDGE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FPGA_DFL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FPGA_DFL_AFU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FPGA_DFL_EMIF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FPGA_DFL_FME policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FPGA_DFL_FME_BRIDGE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FPGA_DFL_FME_MGR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FPGA_DFL_FME_REGION policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FPGA_DFL_NIOS_INTEL_PAC_N3000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FPGA_DFL_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FPGA_M10_BMC_SEC_UPDATE policy<{'amd64': 'm', 'arm64': 'm'}> +CONFIG_FPGA_MGR_ALTERA_CVP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FPGA_MGR_ALTERA_PS_SPI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FPGA_MGR_MACHXO2_SPI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FPGA_REGION policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FPROBE policy<{'amd64': 'n'}> +CONFIG_FPROBE_EVENTS policy<{'amd64': '-'}> +CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_FTL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FUN_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FUN_ETH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FUSION_LAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FWTTY_MAX_CARD_PORTS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_FWTTY_MAX_TOTAL_PORTS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_FW_CFG_SYSFS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_FW_CFG_SYSFS_CMDLINE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_FW_CS_DSP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_FXAS21002C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FXAS21002C_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FXAS21002C_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FXLS8962AF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FXLS8962AF_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FXLS8962AF_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FXOS8700 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FXOS8700_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_FXOS8700_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GADGET_UAC1 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_GADGET_UAC1_LEGACY policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_GAMEPORT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_GAMEPORT_EMU10K1 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GAMEPORT_FM801 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GAMEPORT_L4 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GAMEPORT_NS558 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS policy<{'arm64': '-'}> +CONFIG_GENERIC_ADC_BATTERY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GENERIC_ADC_THERMAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GENERIC_MSI_IRQ_DOMAIN policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_GNSS_MTK_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GNSS_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GNSS_SIRF_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GNSS_UBX_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GP2AP002 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GP2AP020A00F policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GPIO_AAEON policy<{'amd64': '-'}> +CONFIG_GPIO_ADP5520 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GPIO_BCM_XGS_IPROC policy<{'arm64': 'm'}> +CONFIG_GPIO_BRCMSTB policy<{'arm64': 'm'}> +CONFIG_GPIO_BT8XX policy<{'amd64': 'n'}> +CONFIG_GPIO_CRYSTAL_COVE policy<{'amd64': '-'}> +CONFIG_GPIO_DA9055 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GPIO_DLN2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GPIO_GENERIC policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_GPIO_GENERIC_PLATFORM policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_GPIO_KEMPLD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GPIO_MOCKUP policy<{'amd64': 'm', 'arm64': 'n'}> +CONFIG_GPIO_PALMAS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_GPIO_PCA9570 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_GPIO_RASPBERRYPI_EXP policy<{'arm64': 'm'}> +CONFIG_GPIO_RC5T583 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_GPIO_TPS6586X policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_GPIO_TPS65910 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_GPIO_TWL6040 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GPIO_UCB1400 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_GPIO_VIPERBOARD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GPIO_WM8350 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREENASIA_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_GREYBUS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_GREYBUS_AUDIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_GREYBUS_AUDIO_APB_CODEC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_GREYBUS_BOOTROM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_BRIDGED_PHY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_ES2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_FIRMWARE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_GPIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_HID policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_LIGHT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_LOG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_LOOPBACK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_POWER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_PWM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_RAW policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_UART policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_GREYBUS_VIBRATOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HAPPYMEAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HDC100X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HDC2010 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HDMI_LPE_AUDIO policy<{'amd64': '-'}> +CONFIG_HERMES policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HERMES_CACHE_FW_ON_INIT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HERMES_PRISM policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_HI8435 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HIBERNATE_CALLBACKS policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_HIBERNATION_SNAPSHOT_DEV policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_HID_A4TECH policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_ACCUTOUCH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_ACRUX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_ACRUX_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HID_ALPS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_APPLE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_APPLEIR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_ASUS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_AUREAL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_BATTERY_STRENGTH policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_HID_BELKIN policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_BETOP_FF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_BIGBEN_FF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_CHERRY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_CHICONY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_CMEDIA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_CORSAIR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_CP2112 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_CREATIVE_SB0540 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_CYPRESS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_DRAGONRISE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_ELAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_ELECOM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_ELO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_EMS_FF policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_EZKEY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_FT260 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_GEMBIRD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_GFRM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_GOOGLE_HAMMER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_HID_GREENASIA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_GT683R policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_GYRATION policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_HOLTEK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_ICADE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_KENSINGTON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_KEYTOUCH policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_KYE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_LCPOWER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_LENOVO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_LETSKETCH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_LOGITECH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_LOGITECH_DJ policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_LOGITECH_HIDPP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_MAGICMOUSE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_MCP2221 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_MEGAWORLD_FF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_MICROSOFT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_MONTEREY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_MULTITOUCH policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_NINTENDO policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_HID_NTRIG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_NVIDIA_SHIELD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_ORTEK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_PANTHERLORD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_PENMOUNT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_PETALYNX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_PICOLCD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_PICOLCD_BACKLIGHT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HID_PICOLCD_CIR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HID_PICOLCD_FB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HID_PICOLCD_LCD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HID_PICOLCD_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HID_PID policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_HID_PLANTRONICS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_PLAYSTATION policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_PRIMAX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_PRODIKEYS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_HID_RAZER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_RETRODE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_RMI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_ROCCAT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SAITEK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_SAMSUNG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_ACCEL_3D policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_ALS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_CUSTOM_INTEL_HINGE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_DEVICE_ROTATION policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_GYRO_3D policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_HUMIDITY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_IIO_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_IIO_TRIGGER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_INCLINOMETER_3D policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_MAGNETOMETER_3D policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_PRESS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_PROX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SENSOR_TEMP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SIGMAMICRO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SMARTJOYPLUS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_SONY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_SPEEDLINK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_STEELSERIES policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_SUNPLUS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_THRUSTMASTER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_TIVO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_TOPSEED policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_TWINHAN policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_U2FZERO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_UCLOGIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_VIVALDI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_VIVALDI_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_WACOM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HID_WALTOP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_XIAOMI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_XINMO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_ZEROPLUS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HID_ZYDACRON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HISI_PMU policy<{'arm64': 'y'}> +CONFIG_HISI_PTT policy<{'arm64': 'n'}> +CONFIG_HMC425 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HOLTEK_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HOSTAP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HOSTAP_CS policy<{'amd64': '-'}> +CONFIG_HOSTAP_FIRMWARE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HOSTAP_FIRMWARE_NVRAM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HOSTAP_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HOSTAP_PLX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HP03 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HP206C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HP_ILO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HSA_AMD policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_HSA_AMD_SVM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HSI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_HSI_BOARDINFO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HSI_CHAR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HTC_I2CPLD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_HTS221 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HTS221_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HTS221_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HTU21 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HUAWEI_WMI policy<{'amd64': '-'}> +CONFIG_HVC_IRQ policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HVC_XEN policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HVC_XEN_FRONTEND policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_HW_RANDOM_BCM2835 policy<{'arm64': 'm'}> +CONFIG_HW_RANDOM_IPROC_RNG200 policy<{'arm64': 'm'}> +CONFIG_HX711 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_HYPERV_AZURE_BLOB policy<{'amd64': 'n'}> +CONFIG_HYPERV_BALLOON policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_HYPERV_UTILS policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_I2C policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_I2C_BCM2835 policy<{'arm64': 'm'}> +CONFIG_I2C_BCM_IPROC policy<{'arm64': 'm'}> +CONFIG_I2C_BRCMSTB policy<{'arm64': 'm'}> +CONFIG_I2C_CHT_WC policy<{'amd64': '-'}> +CONFIG_I2C_CROS_EC_TUNNEL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_I2C_DESIGNWARE_AMDPSP policy<{'amd64': 'y'}> +CONFIG_I2C_DESIGNWARE_CORE policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_I2C_DESIGNWARE_PLATFORM policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_I2C_DIOLAN_U2C policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_I2C_DLN2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_I2C_KEMPLD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_I2C_MUX_GPIO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_I2C_MUX_MLXCPLD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_I2C_MUX_PCA9541 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_I2C_MUX_PCA954x policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_I2C_MUX_REG policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_I2C_ROBOTFUZZ_OSIF policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_I2C_SI470X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_I2C_SI4713 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_I2C_TINY_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_I2C_VIPERBOARD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_I8K policy<{'amd64': 'n'}> +CONFIG_IAQCORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ICP10100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ICPLUS_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IDLE_INJECT policy<{'amd64': 'y', 'arm64': '-'}> +CONFIG_IEEE802154_ADF7242 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IEEE802154_AT86RF230 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IEEE802154_ATUSB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IEEE802154_CC2520 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IEEE802154_FAKELB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IEEE802154_MRF24J40 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IIO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IIO_ADIS_LIB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ADIS_LIB_BUFFER policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IIO_BUFFER policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IIO_BUFFER_CB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_BUFFER_DMA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_BUFFER_DMAENGINE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_BUFFER_HW_CONSUMER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_CONFIGFS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_CONSUMERS_PER_TRIGGER policy<{'amd64': '-', 'arm64': '2'}> +CONFIG_IIO_CROS_EC_ACCEL_LEGACY policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_IIO_CROS_EC_BARO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_IIO_CROS_EC_LIGHT_PROX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_IIO_CROS_EC_SENSORS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_IIO_CROS_EC_SENSORS_CORE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_IIO_CROS_EC_SENSORS_LID_ANGLE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_IIO_GTS_HELPER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_HRTIMER_TRIGGER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_INTERRUPT_TRIGGER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_KFIFO_BUF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_KX022A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_KX022A_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_KX022A_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_MS_SENSORS_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_MUX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_RESCALE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_SIMPLE_DUMMY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_SSP_SENSORHUB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_SSP_SENSORS_COMMONS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_ACCEL_3AXIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_ACCEL_I2C_3AXIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_ACCEL_SPI_3AXIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_GYRO_3AXIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_GYRO_I2C_3AXIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_GYRO_SPI_3AXIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_LSM6DSX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_LSM6DSX_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_LSM6DSX_I3C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_LSM6DSX_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_LSM9DS0 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_LSM9DS0_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_LSM9DS0_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_MAGN_3AXIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_MAGN_I2C_3AXIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_MAGN_SPI_3AXIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_PRESS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_PRESS_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_PRESS_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_SENSORS_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_SENSORS_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_ST_SENSORS_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_SW_DEVICE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_SW_TRIGGER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_SYSFS_TRIGGER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_TIGHTLOOP_TRIGGER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_TRIGGER policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IIO_TRIGGERED_BUFFER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IIO_TRIGGERED_EVENT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INA2XX_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INFINIBAND_BNXT_RE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INFINIBAND_CXGB4 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INFINIBAND_IPOIB_CM policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_INFINIBAND_IPOIB_DEBUG_DATA policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_INFINIBAND_OCRDMA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INFINIBAND_QEDR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INFINIBAND_SRPT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INFINIBAND_VMWARE_PVRDMA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INFTL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INLINE_READ_LOCK policy<{'arm64': 'y'}> +CONFIG_INLINE_READ_LOCK_BH policy<{'arm64': 'y'}> +CONFIG_INLINE_READ_LOCK_IRQ policy<{'arm64': 'y'}> +CONFIG_INLINE_READ_LOCK_IRQSAVE policy<{'arm64': 'y'}> +CONFIG_INLINE_READ_UNLOCK policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_INLINE_READ_UNLOCK_BH policy<{'arm64': 'y'}> +CONFIG_INLINE_READ_UNLOCK_IRQ policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_INLINE_READ_UNLOCK_IRQRESTORE policy<{'arm64': 'y'}> +CONFIG_INLINE_SPIN_LOCK policy<{'arm64': 'y'}> +CONFIG_INLINE_SPIN_LOCK_BH policy<{'arm64': 'y'}> +CONFIG_INLINE_SPIN_LOCK_IRQ policy<{'arm64': 'y'}> +CONFIG_INLINE_SPIN_LOCK_IRQSAVE policy<{'arm64': 'y'}> +CONFIG_INLINE_SPIN_TRYLOCK policy<{'arm64': 'y'}> +CONFIG_INLINE_SPIN_TRYLOCK_BH policy<{'arm64': 'y'}> +CONFIG_INLINE_SPIN_UNLOCK_BH policy<{'arm64': 'y'}> +CONFIG_INLINE_SPIN_UNLOCK_IRQ policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE policy<{'arm64': 'y'}> +CONFIG_INLINE_WRITE_LOCK policy<{'arm64': 'y'}> +CONFIG_INLINE_WRITE_LOCK_BH policy<{'arm64': 'y'}> +CONFIG_INLINE_WRITE_LOCK_IRQ policy<{'arm64': 'y'}> +CONFIG_INLINE_WRITE_LOCK_IRQSAVE policy<{'arm64': 'y'}> +CONFIG_INLINE_WRITE_UNLOCK policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_INLINE_WRITE_UNLOCK_BH policy<{'arm64': 'y'}> +CONFIG_INLINE_WRITE_UNLOCK_IRQ policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE policy<{'arm64': 'y'}> +CONFIG_INPUT_88PM80X_ONKEY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_88PM860X_ONKEY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_AD714X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_AD714X_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_AD714X_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_ADXL34X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_ADXL34X_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_ADXL34X_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_ARIZONA_HAPTICS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_INPUT_ATI_REMOTE2 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_AXP20X_PEK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_BMA150 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_CM109 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_CMA3000 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_CMA3000_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_DA7280_HAPTICS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_DA9052_ONKEY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_DA9055_ONKEY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_DA9063_ONKEY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_DRV260X_HAPTICS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_DRV2665_HAPTICS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_DRV2667_HAPTICS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_E3X0_BUTTON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_GPIO_BEEPER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_GPIO_DECODER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_GPIO_ROTARY_ENCODER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_IMS_PCU policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_JOYSTICK policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_INPUT_KEYSPAN_REMOTE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_KXTJ9 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_MAX8925_ONKEY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_MAX8997_HAPTIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_MC13783_PWRBUTTON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_MMA8450 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_MOUSE policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_INPUT_PALMAS_PWRBUTTON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_PCAP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_PCF50633_PMU policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_PCF8574 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_POWERMATE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_RAVE_SP_PWRBUTTON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_REGULATOR_HAPTIC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_RETU_PWRBUTTON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_SOC_BUTTON_ARRAY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_TOUCHSCREEN policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_INPUT_TWL4030_PWRBUTTON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_TWL4030_VIBRA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_TWL6040_VIBRA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_WM831X_ON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INPUT_XEN_KBDDEV_FRONTEND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INPUT_YEALINK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INTEL_BYTCRC_PWRSRC policy<{'amd64': '-'}> +CONFIG_INTEL_CHTDC_TI_PWRBTN policy<{'amd64': '-'}> +CONFIG_INTEL_CHTWC_INT33FE policy<{'amd64': '-'}> +CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON policy<{'amd64': 'y'}> +CONFIG_INTEL_ISHTP_ECLITE policy<{'amd64': 'n'}> +CONFIG_INTEL_MENLOW policy<{'amd64': '-'}> +CONFIG_INTEL_MRFLD_ADC policy<{'amd64': '-'}> +CONFIG_INTEL_SOC_PMIC policy<{'amd64': '-'}> +CONFIG_INTEL_SOC_PMIC_CHTDC_TI policy<{'amd64': '-'}> +CONFIG_INTEL_SOC_PMIC_CHTWC policy<{'amd64': '-'}> +CONFIG_INTEL_TH policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INTEL_TH_ACPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INTEL_TH_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_INTEL_TH_GTH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INTEL_TH_MSU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INTEL_TH_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INTEL_TH_PTI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INTEL_TH_STH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INTEL_XWAY_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_INTERVAL_TREE_TEST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_INV_ICM42600 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INV_ICM42600_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INV_ICM42600_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INV_MPU6050_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INV_MPU6050_IIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_INV_MPU6050_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IPU_BRIDGE policy<{'amd64': '-'}> +CONFIG_IPW2100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IPW2100_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_IPW2100_MONITOR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IPW2200 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IPW2200_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_IPW2200_MONITOR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IPW2200_PROMISCUOUS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IPW2200_QOS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IPW2200_RADIOTAP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IP_MROUTE_MULTIPLE_TABLES policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_IQS620AT_TEMP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IQS621_ALS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IQS624_POS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IR_IGORPLUGUSB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IR_IGUANA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IR_IMON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IR_IMON_RAW policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IR_MCEUSB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IR_REDRAT3 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IR_STREAMZAP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IR_TOY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_IR_TTUSBIR policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ISCSI_TARGET_CXGB4 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ISDN policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_ISDN_CAPI policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ISDN_CAPI_MIDDLEWARE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ISL29125 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ISL29501 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ITG3200 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IWL3945 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IWL4965 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IWLDVM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IWLEGACY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IWLEGACY_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_IWLEGACY_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IWLMVM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IWLWIFI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_IWLWIFI_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_IWLWIFI_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IWLWIFI_DEVICE_TRACING policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IWLWIFI_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_IWLWIFI_OPMODE_MODULAR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JFFS2_CMODE_FAVOURLZO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JFFS2_CMODE_NONE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_JFFS2_CMODE_PRIORITY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_JFFS2_CMODE_SIZE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_JFFS2_COMPRESSION_OPTIONS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JFFS2_FS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JFFS2_FS_DEBUG policy<{'amd64': '-', 'arm64': '0'}> +CONFIG_JFFS2_FS_POSIX_ACL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JFFS2_FS_SECURITY policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JFFS2_FS_WBUF_VERIFY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_JFFS2_FS_WRITEBUFFER policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JFFS2_FS_XATTR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JFFS2_LZO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JFFS2_RTIME policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JFFS2_RUBIN policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_JFFS2_SUMMARY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_JFFS2_ZLIB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JOYSTICK_A3D policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_ADI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_ANALOG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_AS5011 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_COBRA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_DB9 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_FSIA6B policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_GAMECON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_GF2K policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_GRIP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_GRIP_MP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_GUILLEMOT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_IFORCE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_IFORCE_232 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_IFORCE_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_INTERACT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_JOYDUMP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_MAGELLAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_PSXPAD_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_PSXPAD_SPI_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JOYSTICK_PXRC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_QWIIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_SENSEHAT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_SIDEWINDER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_SPACEBALL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_SPACEORB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_STINGER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_TMDC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_TURBOGRAFX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_TWIDJOY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_WALKERA0701 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_WARRIOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_XPAD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JOYSTICK_XPAD_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JOYSTICK_XPAD_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_JOYSTICK_ZHENHUA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_JSA1212 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KEMPLD_WDT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KERNEL_GZIP policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_KEYBOARD_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KEYBOARD_ADP5520 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KEYBOARD_ADP5588 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_ADP5589 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_CROS_EC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_KEYBOARD_GPIO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_LKKBD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_LM8323 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_LM8333 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_MATRIX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_MAX7359 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_MCS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_MPR121 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_MTK_PMIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KEYBOARD_NEWTON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_OPENCORES policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_QT1070 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_QT2160 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_SAMSUNG policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_STOWAWAY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_SUNKBD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_TCA6416 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_TCA8418 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_TM2_TOUCHKEY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KEYBOARD_TWL4030 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KEYBOARD_XTKBD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_KMX61 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KS7010 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KS8842 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KS8851 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KS8851_MLL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KSZ884X_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KXCJK1013 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KXSD9 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KXSD9_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_KXSD9_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD2S policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LCD_AMS369FG06 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_CLASS_DEVICE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LCD_HX8357 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_ILI922X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_ILI9320 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_L4F00242T03 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_LMS283GF05 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_LMS501KF03 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_LTV350QV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_OTM3225A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_PLATFORM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_TDO24M policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LCD_VGG2432A4 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_88PM860X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_AAEON policy<{'amd64': '-'}> +CONFIG_LEDS_ADP5520 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_AS3645A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_BD2802 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_BLINKM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_CHT_WCOVE policy<{'amd64': '-'}> +CONFIG_LEDS_CLASS policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_LEDS_CLASS_FLASH policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_CLASS_MULTICOLOR policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_DA903X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_DA9052 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_DAC124S085 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_LM3530 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_LM3533 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_LM355x policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_LM3601X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_LM3642 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_LP3944 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_LP3952 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_LP50XX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_LP8788 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_MAX8997 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_MC13783 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_MENF21BMC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_MT6323 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_MT6370_FLASH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_MT6370_RGB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_PCA9532 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_PCA9532_GPIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_LEDS_PCA955X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_PCA955X_GPIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_LEDS_PCA963X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_PWM_MULTICOLOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_REGULATOR policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_RT8515 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_SGM3140 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LEDS_TCA6507 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_TLC591XX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_TRIGGER_BACKLIGHT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_TRIGGER_CAMERA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_TRIGGER_CPU policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_LEDS_TRIGGER_DEFAULT_ON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_TRIGGER_DISK policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_LEDS_TRIGGER_GPIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_LEDS_TRIGGER_HEARTBEAT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_TRIGGER_MTD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_LEDS_TRIGGER_ONESHOT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_TRIGGER_PANIC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_LEDS_TRIGGER_TIMER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_TRIGGER_TRANSIENT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_USER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_WM831X_STATUS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LEDS_WM8350 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LED_TRIGGER_PHY policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_LG_LAPTOP policy<{'amd64': '-'}> +CONFIG_LIB80211 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIB80211_CRYPT_CCMP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIB80211_CRYPT_TKIP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIB80211_CRYPT_WEP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIB80211_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_LIBERTAS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIBERTAS_CS policy<{'amd64': '-'}> +CONFIG_LIBERTAS_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_LIBERTAS_MESH policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_LIBERTAS_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIBERTAS_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIBERTAS_THINFIRM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIBERTAS_THINFIRM_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_LIBERTAS_THINFIRM_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIBERTAS_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIBFC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LIBFCOE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIBIPW policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIBIPW_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_LIDAR_LITE_V2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIQUIDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIQUIDIO_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LIQUIDIO_VF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LKDTM policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_LMP91000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LOCK_TORTURE_TEST policy<{'amd64': 'm', 'arm64': 'n'}> +CONFIG_LOGIG940_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_LOGIRUMBLEPAD2_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_LOGITECH_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_LOGIWHEELS_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_LP8788_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LSI_ET1011C_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LTC1660 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LTC2471 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LTC2485 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LTC2496 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LTC2497 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LTC2632 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LTC2688 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LTC2983 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LTE_GDM724X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_LTR501 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LTRF216A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LV0104CS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_LXT_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_M62332 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAC80211_HWSIM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MACB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MACB_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MACB_USE_HWSTAMP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MAG3110 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MANTIS_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MARVELL_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MAX1027 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX11100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX1118 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX11205 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX11410 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX1241 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX1363 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX30100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX30102 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX30208 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX31856 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX31865 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX44000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX44009 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX517 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX5432 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX5481 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX5487 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX5522 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX5821 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX77541_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX8925_POWER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAX9611 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MAXIM_THERMOCOUPLE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MB1232 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MC3230 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MCP320X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MCP3422 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MCP3911 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MCP4018 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MCP41010 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MCP4131 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MCP4531 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MCP4725 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MCP4922 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MDIO_BCM_IPROC policy<{'arm64': 'n'}> +CONFIG_MDIO_BUS_MUX policy<{'arm64': 'y'}> +CONFIG_MDIO_BUS_MUX_BCM_IPROC policy<{'arm64': 'y'}> +CONFIG_MDIO_CAVIUM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MDIO_REGMAP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MDIO_THUNDER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MEDIATEK_MT6360_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIATEK_MT6370_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_ALTERA_CI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_MEDIA_ANALOG_TV_SUPPORT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_MEDIA_ATTACH policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MEDIA_CAMERA_SUPPORT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_MEDIA_COMMON_OPTIONS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MEDIA_CONTROLLER_DVB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MEDIA_DIGITAL_TV_SUPPORT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_MEDIA_PCI_SUPPORT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_MEDIA_RADIO_SUPPORT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_MEDIA_SDR_SUPPORT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_MEDIA_TUNER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_E4000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_FC0011 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_FC0012 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_FC0013 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_FC2580 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_IT913X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_M88RS6000T policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MAX2165 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MC44S803 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MSI001 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MT2060 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MT2063 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MT20XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MT2131 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MT2266 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MXL301RF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MXL5005S policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_MXL5007T policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_QM1D1B0004 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_QM1D1C0042 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_QT1010 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_R820T policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_SI2157 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_SIMPLE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_TDA18212 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_TDA18218 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_TDA18250 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_TDA18271 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_TDA827X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_TDA8290 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_TDA9887 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_TEA5761 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_TEA5767 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_TUA9001 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_XC2028 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_XC4000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_TUNER_XC5000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEDIA_USB_SUPPORT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_MEMSTICK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MEMSTICK_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MEMSTICK_JMICRON_38X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEMSTICK_R592 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEMSTICK_REALTEK_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEMSTICK_REALTEK_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEMSTICK_TIFM_MS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MEMSTICK_UNSAFE_RESUME policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MEN_Z188_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MESON_EFUSE policy<{'arm64': '-'}> +CONFIG_MFD_88PM800 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MFD_88PM860X policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_AAEON policy<{'amd64': '-'}> +CONFIG_MFD_AAT2870_CORE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_AS3711 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_CROS_EC_DEV policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_MFD_DA9052_I2C policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_DA9055 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_DA9062 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MFD_DA9063 policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_MFD_DA9150 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MFD_DLN2 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MFD_INTEL_M10_BMC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_MFD_INTEL_M10_BMC_PMCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MFD_KEMPLD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MFD_LM3533 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MFD_LP8788 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_MAX14577 policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_MFD_MAX77541 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MFD_MAX77693 policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_MFD_MAX77843 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_MAX8925 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_MAX8997 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_MAX8998 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_MT6397 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MFD_PALMAS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_RC5T583 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_SI476X_CORE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MFD_TPS65090 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_TPS6586X policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_TPS65910 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_TPS65912_I2C policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_MFD_TWL4030_AUDIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_VIPERBOARD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MFD_WL1273_CORE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MFD_WM831X_I2C policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_WM8350 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_WM8350_I2C policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MFD_WM8400 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MHI_BUS_PCI_GENERIC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MHI_NET policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MICREL_KS8995MA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MICREL_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MICROCHIP_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MICROSEMI_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MIPI_I3C_HCI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MISC_RTSX_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MISDN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_AVMFRITZ policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_DSP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_HDLC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_HFCMULTI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_HFCPCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_HFCUSB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_INFINEON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_IPAC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_ISAR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_L1OIP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_NETJET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_SPEEDFAX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MISDN_W6692 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MKISS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MLX5_EN_MACSEC policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_MLX5_VDPA policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MLX5_VDPA_NET policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MLX90614 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MLX90632 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMA7455 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMA7455_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMA7455_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMA7660 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMA8452 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMA9551 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMA9551_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMA9553 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_MMC35240 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_ALCOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_BCM2835 policy<{'arm64': 'm'}> +CONFIG_MMC_BLOCK_MINORS policy<{'amd64': '-', 'arm64': '8'}> +CONFIG_MMC_CB710 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_CQHCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_CRYPTO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MMC_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MMC_HSQ policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_MTK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_REALTEK_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_REALTEK_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_RICOH_MMC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MMC_SDHCI_ACPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_SDHCI_BRCMSTB policy<{'arm64': 'm'}> +CONFIG_MMC_SDHCI_F_SDH30 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_SDHCI_IO_ACCESSORS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MMC_SDHCI_IPROC policy<{'arm64': 'm'}> +CONFIG_MMC_SDHCI_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_SDHCI_XENON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_SDRICOH_CS policy<{'amd64': '-'}> +CONFIG_MMC_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_TEST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MMC_TIFM_SD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_TOSHIBA_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_USDHI6ROL0 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_USHC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_VIA_SDMMC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_VUB300 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MMC_WBSD policy<{'amd64': '-'}> +CONFIG_MOST_SND policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_MOST_USB_HDM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_MOUSE_APPLETOUCH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MOUSE_BCM5974 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MOUSE_CYAPA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MOUSE_ELAN_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MOUSE_ELAN_I2C_I2C policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_ELAN_I2C_SMBUS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_GPIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MOUSE_PS2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MOUSE_PS2_ALPS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_BYD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_CYPRESS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_ELANTECH policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_ELANTECH_SMBUS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_FOCALTECH policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_LIFEBOOK policy<{'amd64': '-'}> +CONFIG_MOUSE_PS2_LOGIPS2PP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_SENTELIC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_SMBUS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_SYNAPTICS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_TOUCHKIT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_TRACKPOINT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MOUSE_PS2_VMMOUSE policy<{'amd64': '-'}> +CONFIG_MOUSE_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MOUSE_SYNAPTICS_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MOUSE_SYNAPTICS_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MOUSE_VSXXXAA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MP2629_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MPL115 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MPL115_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MPL115_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MPL3115 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MPRLS0025PA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MPU3050 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MPU3050_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MS5611 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MS5611_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MS5611_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MS5637 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MSA311 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MSE102X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MSI_EC policy<{'amd64': '-'}> +CONFIG_MSPRO_BLOCK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MS_BLOCK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7601U policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7603E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7615E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7615_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7663S policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7663U policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7663_USB_SDIO_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76_CONNAC_LIB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MT76_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76x02_LIB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76x02_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76x0E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76x0U policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76x0_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76x2E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76x2U policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT76x2_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7915E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7921E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7921S policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7921U policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7921_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MT7986_WMAC policy<{'arm64': 'n'}> +CONFIG_MT7996E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTDRAM_ERASE_SIZE policy<{'amd64': '-', 'arm64': '128'}> +CONFIG_MTDRAM_TOTAL_SIZE policy<{'amd64': '-', 'arm64': '4096'}> +CONFIG_MTD_ABSENT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_AMD76XROM policy<{'amd64': '-'}> +CONFIG_MTD_AR7_PARTS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_BLKDEVS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_BLOCK2MTD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_BLOCK_RO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_BRCM_U_BOOT policy<{'arm64': 'n'}> +CONFIG_MTD_CFI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_CFI_ADV_OPTIONS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_CFI_AMDSTD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_CFI_I1 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_CFI_I2 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_CFI_INTELEXT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_CFI_STAA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_CFI_UTIL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_CK804XROM policy<{'amd64': '-'}> +CONFIG_MTD_CMDLINE_PARTS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_COMPLEX_MAPPINGS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_DATAFLASH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_DATAFLASH_OTP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_DATAFLASH_WRITE_VERIFY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_ESB2ROM policy<{'amd64': '-'}> +CONFIG_MTD_GEN_PROBE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_HYPERBUS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_ICHXROM policy<{'amd64': '-'}> +CONFIG_MTD_INTEL_VR_NOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_JEDECPROBE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_L440GX policy<{'amd64': '-'}> +CONFIG_MTD_LPDDR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_MAP_BANK_WIDTH_1 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_MAP_BANK_WIDTH_2 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_MAP_BANK_WIDTH_4 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_MCHP23K256 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_MCHP48L640 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_MTDRAM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_ARASAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_CAFE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_DENALI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_DENALI_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_DISKONCHIP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS policy<{'amd64': '-', 'arm64': '0'}> +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_NAND_ECC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_NAND_ECC_MXIC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_MTD_NAND_ECC_SW_BCH policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_NAND_ECC_SW_HAMMING policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_NAND_GPIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_MXIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_NANDSIM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_PLATFORM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NAND_RICOH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_NETtel policy<{'amd64': '-'}> +CONFIG_MTD_OF_PARTS_BCM4908 policy<{'arm64': 'y'}> +CONFIG_MTD_OF_PARTS_LINKSYS_NS policy<{'arm64': 'y'}> +CONFIG_MTD_ONENAND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_ONENAND_2X_PROGRAM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_ONENAND_GENERIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_ONENAND_OTP policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_OOPS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_PARTITIONED_MASTER policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_PCMCIA policy<{'amd64': '-'}> +CONFIG_MTD_PCMCIA_ANONYMOUS policy<{'amd64': '-'}> +CONFIG_MTD_PHRAM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_PHYSMAP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_PHYSMAP_COMPAT policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_PHYSMAP_GPIO_ADDR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_PLATRAM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_PMC551 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_PMC551_BUGFIX policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_PMC551_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_PSTORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_QINFO_PROBE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_RAM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK policy<{'amd64': '-', 'arm64': '-1'}> +CONFIG_MTD_REDBOOT_PARTS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_REDBOOT_PARTS_READONLY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_ROM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_SBC_GXX policy<{'amd64': '-'}> +CONFIG_MTD_SCB2_FLASH policy<{'amd64': '-'}> +CONFIG_MTD_SLRAM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_SM_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_SPI_NAND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_SPI_NOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_SPI_NOR_SWP_DISABLE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_SPI_NOR_SWP_KEEP policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_SPI_NOR_USE_4K_SECTORS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_SST25L policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_SWAP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_TESTS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_MTD_UBI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_UBI_BEB_LIMIT policy<{'amd64': '-', 'arm64': '20'}> +CONFIG_MTD_UBI_BLOCK policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_UBI_FASTMAP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MTD_UBI_GLUEBI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MTD_UBI_WL_THRESHOLD policy<{'amd64': '-', 'arm64': '4096'}> +CONFIG_MUSB_PIO_ONLY policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_MWIFIEX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MWIFIEX_PCIE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MWIFIEX_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MWIFIEX_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MWL8K policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MXC4005 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MXC6255 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MYRI10GE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_MYRI10GE_DCA policy<{'amd64': '-'}> +CONFIG_NATIONAL_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NATSEMI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NAU7802 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ND_BTT policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_ND_PFN policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_NE2K_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NETXEN_NIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NET_9P_XEN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NET_DSA_HIRSCHMANN_HELLCREEK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NET_DSA_MSCC_SEVILLE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NET_DSA_MV88E6060 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NET_DSA_MV88E6XXX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NET_DSA_MV88E6XXX_PTP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_NET_DSA_QCA8K policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NET_DSA_QCA8K_LEDS_SUPPORT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_NET_DSA_TAG_HELLCREEK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NET_FC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_IP_TUNNEL policy<{'amd64': 'y', 'arm64': 'm'}> +CONFIG_NET_TEAM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NET_TEAM_MODE_ACTIVEBACKUP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NET_TEAM_MODE_BROADCAST policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NET_TEAM_MODE_LOADBALANCE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NET_TEAM_MODE_RANDOM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NET_TEAM_MODE_ROUNDROBIN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NET_TULIP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_NET_UDP_TUNNEL policy<{'amd64': 'y', 'arm64': 'm'}> +CONFIG_NET_VENDOR_3COM policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_8390 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_NET_VENDOR_ADAPTEC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_ALTEON policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_AMAZON policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_AMD policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_ARC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_ASIX policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_ATHEROS policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_BROCADE policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_CAVIUM policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_DAVICOM policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_DEC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_ENGLEDER policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_EZCHIP policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_FUNGIBLE policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_MICREL policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_MYRI policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_NATSEMI policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_NVIDIA policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_OKI policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_QLOGIC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_QUALCOMM policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_RDC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_RENESAS policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_ROCKER policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_SAMSUNG policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_SEEQ policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_SILAN policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_SIS policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_SMSC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_SOCIONEXT policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_STMICRO policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_SUN policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_TEHUTI policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_TI policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_VERTEXCOM policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_VIA policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NET_VENDOR_WIZNET policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NFC_FDP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_FDP_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_MICROREAD_I2C policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_MRVL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_MRVL_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_MRVL_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_MRVL_UART policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_MRVL_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_NXP_NCI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_NXP_NCI_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_PN532_UART policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_PN533 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_PN533_I2C policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_PN533_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_PN544_I2C policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_PORT100 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_S3FWRN5 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_S3FWRN5_I2C policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_S3FWRN82_UART policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_SIM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_ST21NFCA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_ST21NFCA_I2C policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_ST95HF policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_ST_NCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFC_ST_NCI_I2C policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_ST_NCI_SPI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFC_TRF7970A policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NFSD_V2_ACL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_NFTL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NFTL_RW policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_NINTENDO_FF policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_NIU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NOA1305 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NORTEL_HERMES policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NOUVEAU_DEBUG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_NOUVEAU_DEBUG_DEFAULT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_NOUVEAU_DEBUG_MMU policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_NOUVEAU_DEBUG_PUSH policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_NOUVEAU_PLATFORM_DRIVER policy<{'arm64': '-'}> +CONFIG_NPCM7XX_WATCHDOG policy<{'arm64': 'm'}> +CONFIG_NS83820 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NTB_PERF policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NTB_PINGPONG policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NTB_TOOL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NVIDIA_SHIELD_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_NVMEM_BCM_OCOTP policy<{'arm64': 'm'}> +CONFIG_NVMEM_RAVE_SP_EEPROM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NVMEM_SPMI_SDAM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_NVME_COMMON policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_NVME_CORE policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_NVME_TARGET_LOOP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_NVME_TARGET_PASSTHRU policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_NVME_TARGET_RDMA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_OMAP_GPMC policy<{'arm64': 'm'}> +CONFIG_OPT3001 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_OPT4001 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ORANGEFS_FS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_ORINOCO_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_P54_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_P54_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_P54_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_P54_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_P54_SPI_DEFAULT_EEPROM policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_P54_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PA12203001 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PALMAS_GPADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PANTHERLORD_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_PARAVIRT_XXL policy<{'amd64': '-'}> +CONFIG_PARPORT_NOT_PC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_PCIE_BRCMSTB policy<{'arm64': 'm'}> +CONFIG_PCIE_EDR policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_PCIE_IPROC policy<{'arm64': 'm'}> +CONFIG_PCIE_IPROC_MSI policy<{'arm64': 'y'}> +CONFIG_PCIE_IPROC_PLATFORM policy<{'arm64': 'm'}> +CONFIG_PCI_ATMEL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PCI_HYPERV_INTERFACE policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_PCI_MSI_IRQ_DOMAIN policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_PCI_XEN policy<{'amd64': '-'}> +CONFIG_PCMCIA_3C574 policy<{'amd64': '-'}> +CONFIG_PCMCIA_3C589 policy<{'amd64': '-'}> +CONFIG_PCMCIA_ATMEL policy<{'amd64': '-'}> +CONFIG_PCMCIA_AXNET policy<{'amd64': '-'}> +CONFIG_PCMCIA_HERMES policy<{'amd64': '-'}> +CONFIG_PCMCIA_NMCLAN policy<{'amd64': '-'}> +CONFIG_PCMCIA_PCNET policy<{'amd64': '-'}> +CONFIG_PCMCIA_RAYCS policy<{'amd64': '-'}> +CONFIG_PCMCIA_SMC91C92 policy<{'amd64': '-'}> +CONFIG_PCMCIA_SPECTRUM policy<{'amd64': '-'}> +CONFIG_PCMCIA_WL3501 policy<{'amd64': '-'}> +CONFIG_PCMCIA_XIRCOM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PCNET32 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PCS_ALTERA_TSE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_PCS_LYNX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_PDA_POWER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_PDS_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PDS_VDPA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PERCPU_TEST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_PHY_BCM_NS_USB2 policy<{'arm64': 'm'}> +CONFIG_PHY_BCM_NS_USB3 policy<{'arm64': 'm'}> +CONFIG_PHY_BCM_SR_PCIE policy<{'arm64': 'm'}> +CONFIG_PHY_BCM_SR_USB policy<{'arm64': 'm'}> +CONFIG_PHY_BRCM_SATA policy<{'arm64': 'y'}> +CONFIG_PHY_BRCM_USB policy<{'arm64': 'm'}> +CONFIG_PHY_CPCAP_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PHY_NS2_PCIE policy<{'arm64': 'y'}> +CONFIG_PHY_NS2_USB_DRD policy<{'arm64': 'm'}> +CONFIG_PHY_PXA_28NM_HSIC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_PHY_PXA_28NM_USB2 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_PHY_SAMSUNG_USB2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PINCTRL_AMD policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_PINCTRL_BCM2835 policy<{'arm64': 'y'}> +CONFIG_PINCTRL_BCM4908 policy<{'arm64': 'm'}> +CONFIG_PINCTRL_DA9062 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PINCTRL_IPROC_GPIO policy<{'arm64': 'y'}> +CONFIG_PINCTRL_NS2_MUX policy<{'arm64': 'y'}> +CONFIG_PINCTRL_SX150X policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_PING policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PLATFORM_SI4713 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PLAYSTATION_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_PLFXLC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PLIP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_PLX_HERMES policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PMBUS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_PMIC_ADP5520 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_PMIC_DA903X policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_PMS7003 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PM_STD_PARTITION policy<{'amd64': '""', 'arm64': '""'}> +CONFIG_POWER_RESET_MT6323 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_PPS_CLIENT_GPIO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_PPS_CLIENT_LDISC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_PPS_CLIENT_PARPORT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_PREEMPTION policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_PREEMPT_BUILD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_PREEMPT_COUNT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_PREEMPT_DYNAMIC policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_PREEMPT_RCU policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_PREEMPT_TRACER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_PREEMPT_VOLUNTARY_BUILD policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_PRESTERA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_PRESTERA_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PRISM2_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PTE_MARKER policy<{'amd64': '-'}> +CONFIG_PTP_1588_CLOCK_DTE policy<{'arm64': 'm'}> +CONFIG_PTP_1588_CLOCK_INES policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PTP_1588_CLOCK_OCP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PTP_DFL_TOD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PWM_BCM2835 policy<{'arm64': 'm'}> +CONFIG_PWM_BCM_IPROC policy<{'arm64': 'm'}> +CONFIG_PWM_BRCMSTB policy<{'arm64': 'm'}> +CONFIG_PWM_CRC policy<{'amd64': '-'}> +CONFIG_PWM_CROS_EC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_PWM_RASPBERRYPI_POE policy<{'arm64': 'm'}> +CONFIG_PWM_TWL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_PWM_TWL_LED policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QCOM_EMAC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QCOM_HIDMA policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_QCOM_HIDMA_MGMT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_QCOM_QMI_HELPERS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QCOM_SPM policy<{'arm64': 'm'}> +CONFIG_QCOM_SPMI_ADC5 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QCOM_SPMI_IADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QCOM_SPMI_VADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QCOM_VADC_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QED policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QEDE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QEDF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QEDI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QED_FCOE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_QED_ISCSI policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_QED_LL2 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_QED_OOO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_QED_RDMA policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_QED_SRIOV policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_QLA3XXX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QLCNIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QLCNIC_DCB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_QLCNIC_HWMON policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_QLCNIC_SRIOV policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_QSEMI_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_QTNFMAC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_QTNFMAC_PCIE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_R6040 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_R8188EU policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_R8712U policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_ADAPTERS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_MAXIRADIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_SAA7706H policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_SHARK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_SHARK2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_SI470X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_SI4713 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_SI476X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_RADIO_TEA575X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_TEA5764 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_TEF6862 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_WL1273 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RADIO_WL128X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RAPIDIO_CPS_GEN2 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RAPIDIO_CPS_XX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RAPIDIO_RXS_GEN3 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RASPBERRYPI_FIRMWARE policy<{'arm64': 'y'}> +CONFIG_RASPBERRYPI_POWER policy<{'arm64': 'y'}> +CONFIG_RAVE_SP_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RAVE_SP_EEPROM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_RAVE_SP_WATCHDOG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RBTREE_TEST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_RCU_LAZY policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_RCU_NOCB_CPU policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_RCU_NOCB_CPU_DEFAULT_ALL policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_RC_ATI_REMOTE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RC_XBOX_DVD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RDMA_RXE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REALTEK_AUTOPM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_REED_SOLOMON_DEC16 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_REED_SOLOMON_TEST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_REGMAP_AC97 policy<{'arm64': '-'}> +CONFIG_REGMAP_I2C policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_REGMAP_I3C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGMAP_SCCB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGMAP_SOUNDWIRE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_REGMAP_SOUNDWIRE_MBQ policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_REGMAP_SPMI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGMAP_W1 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_88PM800 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_88PM8607 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_AAT2870 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_ACT8865 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_AD5398 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_ARIZONA_LDO1 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_REGULATOR_ARIZONA_MICSUPP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_REGULATOR_AS3711 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_AXP20X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_BCM590XX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_CROS_EC policy<{'arm64': '-'}> +CONFIG_REGULATOR_DA903X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_DA9052 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_DA9055 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_DA9062 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_DA9210 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_DA9211 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_FAN53555 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_GPIO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_ISL6271A policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_ISL9305 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_LP3971 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_LP3972 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_LP872X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_LP8755 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_LP8788 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_LTC3589 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_LTC3676 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX14577 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX1586 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX20086 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX77541 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX77693 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX8649 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX8660 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX8907 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX8925 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX8952 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX8997 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MAX8998 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MC13783 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MC13892 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MC13XXX_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MT6311 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MT6315 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MT6323 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MT6331 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MT6332 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MT6357 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MT6358 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MT6359 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_MT6360 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_MT6397 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_PALMAS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_PCA9450 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_PCAP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_PCF50633 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_PV88060 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_PV88080 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_PV88090 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_QCOM_LABIBB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_QCOM_SPMI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_QCOM_USB_VBUS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_RC5T583 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_RT4801 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_RT5033 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_RT5190A policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_RTMV20 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_SKY81452 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_SY7636A policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS51632 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS6105X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS62360 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS65023 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS6507X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS65086 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS65090 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS6524X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS6586X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS65910 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS65912 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_TPS68470 policy<{'amd64': 'n'}> +CONFIG_REGULATOR_USERSPACE_CONSUMER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_VIRTUAL_CONSUMER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_WM831X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REGULATOR_WM8350 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_WM8400 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_REGULATOR_WM8994 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_REMOTEPROC policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_REMOTEPROC_CDEV policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RESET_BRCMSTB policy<{'arm64': 'm'}> +CONFIG_RESET_BRCMSTB_RESCAL policy<{'arm64': 'y'}> +CONFIG_RESET_RASPBERRYPI policy<{'arm64': 'm'}> +CONFIG_RFD77402 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RFD_FTL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RICHTEK_RTQ6056 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RMI4_2D_SENSOR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RMI4_CORE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RMI4_F03 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RMI4_F03_SERIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RMI4_F11 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RMI4_F12 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RMI4_F30 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RMI4_F34 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RMI4_F3A policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RMI4_F54 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RMI4_F55 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RMI4_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RMI4_SMB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RMI4_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RMNET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ROCKCHIP_DTPM policy<{'arm64': '-'}> +CONFIG_ROCKER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ROHM_BU27008 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ROHM_BU27034 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ROMFS_BACKED_BY_BOTH policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ROMFS_BACKED_BY_MTD policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_RPR0521 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RSI_91X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RSI_COEX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RSI_DEBUGFS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_RSI_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RSI_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2400PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2500PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2500USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2800PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2800PCI_RT3290 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2800PCI_RT33XX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2800PCI_RT35XX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2800PCI_RT53XX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2800USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2800USB_RT33XX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2800USB_RT3573 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2800USB_RT35XX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2800USB_RT53XX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2800USB_RT55XX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2800USB_UNKNOWN policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2800_LIB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2800_LIB_MMIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2X00 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2X00_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_RT2X00_LIB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2X00_LIB_CRYPTO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2X00_LIB_DEBUGFS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_RT2X00_LIB_FIRMWARE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2X00_LIB_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RT2X00_LIB_MMIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2X00_LIB_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT2X00_LIB_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT61PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RT73USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_88PM80X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_88PM860X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_ABB5ZES3 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_ABX80X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_BQ32K policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_BQ4802 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_BRCMSTB policy<{'arm64': 'm'}> +CONFIG_RTC_DRV_CROS_EC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_RTC_DRV_DA9052 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DA9055 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_DA9063 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1286 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1302 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1305 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1307 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1307_CENTURY policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTC_DRV_DS1343 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1347 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1374 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1374_WDT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTC_DRV_DS1390 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1511 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1553 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1672 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1685 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTC_DRV_DS1685_FAMILY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS1689 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_RTC_DRV_DS17285 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_RTC_DRV_DS1742 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS17485 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_RTC_DRV_DS17885 policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_RTC_DRV_DS2404 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS3232 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_DS3232_HWMON policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTC_DRV_EM3027 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_FM3130 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_HID_SENSOR_TIME policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_ISL12022 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_ISL1208 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_LP8788 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_M41T80 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_M41T80_WDT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTC_DRV_M41T93 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_M41T94 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_M48T35 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_M48T59 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_M48T86 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_MAX6900 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_MAX6902 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_MAX6916 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_MAX8907 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_MAX8925 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_MAX8997 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_MAX8998 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_MC13XXX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_MCP795 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_MSM6242 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_MT6397 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_PALMAS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_PCAP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_PCF2123 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_PCF2127 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_PCF50633 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_PCF85063 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_PCF8523 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_PCF8563 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_PCF8583 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_R9701 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RC5T583 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_RP5C01 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RS5C348 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RS5C372 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RV3029C2 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RV3029_HWMON policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTC_DRV_RV3032 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RV8803 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RX4581 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RX6110 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RX8010 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RX8025 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_RX8581 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_S35390A policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_STK17TA8 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_TPS6586X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_TPS65910 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_V3020 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_RTC_DRV_WILCO_EC policy<{'amd64': '-'}> +CONFIG_RTC_DRV_WM831X policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_DRV_WM8350 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTC_DRV_X1205 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_RTC_I2C_AND_SPI policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_RTL8180 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8187 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8187_LEDS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTL8188EE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8192CE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8192CU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8192C_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8192DE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8192E policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8192EE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8192SE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8192U policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8723AE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8723BE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8723BS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8723_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8821AE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8XXXU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL8XXXU_UNTESTED policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTLBTCOEXIST policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTLLIB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTLLIB_CRYPTO_CCMP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTLLIB_CRYPTO_TKIP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTLLIB_CRYPTO_WEP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTLWIFI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTLWIFI_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_RTLWIFI_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTLWIFI_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTL_CARDS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8723D policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8723DE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8723DS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8723DU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8821C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8821CE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8821CS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8821CU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8822B policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8822BE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8822BS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8822BU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8822C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8822CE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8822CS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_8822CU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_DEBUG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTW88_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTW88_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW88_USB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89_8851B policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89_8851BE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89_8852A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89_8852AE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89_8852B policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89_8852BE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89_8852C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89_8852CE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RTW89_DEBUG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTW89_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTW89_DEBUGMSG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_RTW89_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_RUNTIME_TESTING_MENU policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_RUSTC_VERSION_TEXT policy<{'amd64': '-'}> +CONFIG_RUST_BUILD_ASSERT_ALLOW policy<{'amd64': '-'}> +CONFIG_RUST_DEBUG_ASSERTIONS policy<{'amd64': '-'}> +CONFIG_RUST_OVERFLOW_CHECKS policy<{'amd64': '-'}> +CONFIG_SAMPLES policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_SAMPLES_RUST policy<{'amd64': '-'}> +CONFIG_SAMPLE_AUXDISPLAY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_CONFIGFS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_FPROBE policy<{'amd64': '-'}> +CONFIG_SAMPLE_FTRACE_DIRECT policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_FTRACE_DIRECT_MULTI policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_FTRACE_OPS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_HW_BREAKPOINT policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_KDB policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_KFIFO policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_KOBJECT policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_KPROBES policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_LIVEPATCH policy<{'amd64': '-'}> +CONFIG_SAMPLE_RPMSG_CLIENT policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_TRACE_ARRAY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SAMPLE_TRACE_CUSTOM_EVENTS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_TRACE_EVENTS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_VFIO_MDEV_MBOCHS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_VFIO_MDEV_MDPY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_VFIO_MDEV_MDPY_FB policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_VFIO_MDEV_MTTY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SAMPLE_WATCHDOG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SBP_TARGET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SC92031 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCA3000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCA3300 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCD30_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCD30_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCD30_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCD4X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCSI_BNX2X_FCOE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCSI_BNX2_ISCSI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SCSI_CXGB3_ISCSI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SCSI_CXGB4_ISCSI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SCSI_FC_ATTRS policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_SCSI_UFSHCD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SCSI_UFSHCD_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCSI_UFSHCD_PLATFORM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCSI_UFS_BSG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SCSI_UFS_CDNS_PLATFORM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCSI_UFS_CRYPTO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SCSI_UFS_DWC_TC_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SCSI_UFS_HPB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SCSI_UFS_HWMON policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SDIO_UART policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SDR_MAX2175 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SDR_PLATFORM_DRIVERS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SD_ADC_MODULATOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SECURITY_APPARMOR_DEBUG policy<{'amd64': 'y', 'arm64': 'n'}> +CONFIG_SECURITY_APPARMOR_DEBUG_ASSERTS policy<{'amd64': 'n'}> +CONFIG_SECURITY_APPARMOR_DEBUG_MESSAGES policy<{'amd64': 'n'}> +CONFIG_SENSEAIR_SUNRISE_CO2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSIRION_SGP30 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSIRION_SGP40 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_AAEON policy<{'amd64': '-'}> +CONFIG_SENSORS_ACBEL_FSG032 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_ADM1266 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_ADM1275 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_AQUACOMPUTER_D5NEXT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_BEL_PFE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_BPA_RS600 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_CORSAIR_CPRO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SENSORS_CORSAIR_PSU policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SENSORS_DA9055 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_DELTA_AHE50DC_FAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_DPS920AB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_FSP_3Y policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_HMC5843 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_HMC5843_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_HMC5843_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_IBM_CFFPS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_IIO_HWMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_INSPUR_IPSPS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_IR35221 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_IR36021 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_IR38064 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_IR38064_REGULATOR policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SENSORS_IRPS5401 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_ISL29018 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_ISL29028 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_ISL68137 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_LIS3_I2C policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SENSORS_LM25066 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_LM25066_REGULATOR policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SENSORS_LM3533 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_LT7182S policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_LTC2978 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_LTC2978_REGULATOR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SENSORS_LTC2992 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SENSORS_LTC3815 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MAX127 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SENSORS_MAX15301 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MAX16064 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MAX16601 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MAX20730 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MAX20751 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MAX31785 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MAX34440 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MAX6620 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SENSORS_MAX8688 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MP2888 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MP2975 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MP5023 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MPQ7932 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_MPQ7932_REGULATOR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SENSORS_MR75203 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SENSORS_NTC_THERMISTOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_NZXT_KRAKEN2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_NZXT_SMART2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_PIM4328 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_PLI1209BC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_PLI1209BC_REGULATOR policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SENSORS_PM6764TR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_PMBUS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_PXE1610 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_Q54SJ108A2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_RASPBERRYPI_HWMON policy<{'arm64': 'm'}> +CONFIG_SENSORS_RM3100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_RM3100_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_RM3100_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_SBTSI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SENSORS_STPDDC60 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_SY7636A policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SENSORS_TDA38640 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_TDA38640_REGULATOR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SENSORS_TPS40422 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_TPS53679 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_TPS546D24 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_TSL2563 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_UCD9000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_UCD9200 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_WM8350 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_XDPE122 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_XDPE122_REGULATOR policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SENSORS_XDPE152 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SENSORS_ZL6100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SERIAL_8250_BCM2835AUX policy<{'arm64': 'n'}> +CONFIG_SERIAL_8250_BCM7271 policy<{'arm64': 'm'}> +CONFIG_SERIAL_8250_DFL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SERIAL_8250_EM policy<{'arm64': 'm'}> +CONFIG_SERIAL_BCM63XX policy<{'arm64': 'm'}> +CONFIG_SERIAL_IPOCTAL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SERIAL_SAMSUNG_CONSOLE policy<{'arm64': 'n'}> +CONFIG_SFC_FALCON_MTD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SFC_MTD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SFC_SIENA_MTD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SI1133 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SI1145 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SI7005 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SI7020 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SIS190 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SIS900 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SMARTJOYPLUS_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SMSC911X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SMSC9420 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SMSC_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SMS_SDIO_DRV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SMS_SIANO_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SMS_SIANO_MDTV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SMS_SIANO_RC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SMS_USB_DRV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SM_FTL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SND_AC97_CODEC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_AC97_POWER_SAVE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_AC97_POWER_SAVE_DEFAULT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_AD1889 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ALI5451 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ALOOP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ALS300 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ALS4000 policy<{'amd64': '-'}> +CONFIG_SND_AMD_ACP_CONFIG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_AMD_ASOC_REMBRANDT policy<{'amd64': '-'}> +CONFIG_SND_AMD_ASOC_RENOIR policy<{'amd64': '-'}> +CONFIG_SND_ASIHPI policy<{'amd64': '-'}> +CONFIG_SND_ATIIXP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ATIIXP_MODEM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ATMEL_SOC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_AU8810 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_AU8820 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_AU8830 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_AUDIO_GRAPH_CARD policy<{'arm64': '-'}> +CONFIG_SND_AUDIO_GRAPH_CARD2 policy<{'arm64': '-'}> +CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE policy<{'arm64': '-'}> +CONFIG_SND_AW2 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_AZT3328 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_BCD2000 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_BCM2835 policy<{'arm64': '-'}> +CONFIG_SND_BCM2835_SOC_I2S policy<{'arm64': '-'}> +CONFIG_SND_BCM63XX_I2S_WHISTLER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_BEBOB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_BT87X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_BT87X_OVERCLOCK policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_CA0106 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_CMIPCI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_COMPRESS_OFFLOAD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_CS4281 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_CS46XX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_CS46XX_NEW_DSP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_CTL_FAST_LOOKUP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_CTL_INPUT_VALIDATION policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_CTL_LED policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_CTXFI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_DARLA20 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_DARLA24 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_DEBUG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_DESIGNWARE_I2S policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_DESIGNWARE_PCM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_DICE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_DMAENGINE_PCM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_DMA_SGBUF policy<{'amd64': '-'}> +CONFIG_SND_DRIVERS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_DUMMY policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_DYNAMIC_MINORS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ECHO3G policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_EMU10K1 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_EMU10K1X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_EMU10K1_SEQ policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ENS1370 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ENS1371 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ES1938 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ES1968 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ES1968_INPUT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ES1968_RADIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_FIREFACE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_FIREWIRE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_FIREWIRE_DIGI00X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_FIREWIRE_LIB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_FIREWIRE_MOTU policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_FIREWIRE_TASCAM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_FIREWORKS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_FM801 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_FM801_TEA575X_BOOL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_GINA20 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_GINA24 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_ALIGNED_MMIO policy<{'arm64': '-'}> +CONFIG_SND_HDA_CODEC_ANALOG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_CA0110 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_CA0132 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_CA0132_DSP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_CIRRUS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_CMEDIA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_CONEXANT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_CS8409 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_HDMI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_REALTEK policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_SI3054 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_SIGMATEL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CODEC_VIA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_COMPONENT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CORE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CS_DSP_CONTROLS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_CTL_DEV_ID policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_DSP_LOADER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_EXT_CORE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_GENERIC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_GENERIC_LEDS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_HWDEP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_I915 policy<{'amd64': '-'}> +CONFIG_SND_HDA_INPUT_BEEP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_INPUT_BEEP_MODE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_INTEL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_PATCH_LOADER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_PREALLOC_SIZE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_SCODEC_CS35L41 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_SCODEC_CS35L41_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_SCODEC_CS35L41_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDA_TEGRA policy<{'arm64': '-'}> +CONFIG_SND_HDSP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HDSPM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HRTIMER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_HWDEP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_I2S_HI6210_I2S policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ICE1712 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ICE1724 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_IMX_SOC policy<{'arm64': '-'}> +CONFIG_SND_INDIGO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_INDIGODJ policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_INDIGODJX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_INDIGOIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_INDIGOIOX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_INTEL8X0 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_INTEL8X0M policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_INTEL_BYT_PREFER_SOF policy<{'amd64': '-'}> +CONFIG_SND_INTEL_DSP_CONFIG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_INTEL_NHLT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_INTEL_SOUNDWIRE_ACPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_ISIGHT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_JACK policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_JACK_INPUT_DEV policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_KIRKWOOD_SOC policy<{'arm64': '-'}> +CONFIG_SND_KIRKWOOD_SOC_ARMADA370_DB policy<{'arm64': '-'}> +CONFIG_SND_KORG1212 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_LAYLA20 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_LAYLA24 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_LOLA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_LX6464ES policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MAESTRO3 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MAESTRO3_INPUT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MAX_CARDS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MESON_AIU policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_FIFO policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_FRDDR policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_PDM policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_SOUND_CARD policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_SPDIFIN policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_SPDIFOUT policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_TDMIN policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_TDMOUT policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_TDM_FORMATTER policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_TDM_INTERFACE policy<{'arm64': '-'}> +CONFIG_SND_MESON_AXG_TODDR policy<{'arm64': '-'}> +CONFIG_SND_MESON_CARD_UTILS policy<{'arm64': '-'}> +CONFIG_SND_MESON_CODEC_GLUE policy<{'arm64': '-'}> +CONFIG_SND_MESON_G12A_TOACODEC policy<{'arm64': '-'}> +CONFIG_SND_MESON_G12A_TOHDMITX policy<{'arm64': '-'}> +CONFIG_SND_MESON_GX_SOUND_CARD policy<{'arm64': '-'}> +CONFIG_SND_MIA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MIXART policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MIXER_OSS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MONA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MPU401 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MPU401_UART policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MTPAV policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_MTS64 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_NM256 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_OPL3_LIB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_OPL3_LIB_SEQ policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_OSSEMUL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_OXFW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_OXYGEN policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_OXYGEN_LIB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_PCI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_PCM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_PCMCIA policy<{'amd64': '-'}> +CONFIG_SND_PCMTEST policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_PCM_ELD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_PCM_IEC958 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_PCM_TIMER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_PCSP policy<{'amd64': '-'}> +CONFIG_SND_PCXHR policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_PDAUDIOCF policy<{'amd64': '-'}> +CONFIG_SND_PORTMAN2X4 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_PROC_FS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_RAWMIDI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_RIPTIDE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_RME32 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_RME96 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_RME9652 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SB_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SEQUENCER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SEQUENCER_OSS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SEQ_DEVICE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SEQ_DUMMY policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SEQ_HRTIMER_DEFAULT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SEQ_MIDI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SEQ_MIDI_EMUL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SEQ_MIDI_EVENT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SEQ_UMP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SEQ_UMP_CLIENT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SEQ_VIRMIDI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SERIAL_GENERIC policy<{'arm64': '-'}> +CONFIG_SND_SERIAL_U16550 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SIMPLE_CARD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SIMPLE_CARD_UTILS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AC97_BUS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AC97_CODEC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ACPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ACPI_INTEL_MATCH policy<{'amd64': '-'}> +CONFIG_SND_SOC_ADAU1372 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU1372_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU1372_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU1701 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU1761 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU1761_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU1761_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU17X1 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU7002 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU7118 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU7118_HW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU7118_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADAU_UTILS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADI_AXI_I2S policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ADI_AXI_SPDIF policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AK4104 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AK4118 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AK4375 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AK4458 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AK4554 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AK4613 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AK4642 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AK5386 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AK5558 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ALC5623 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ALC5632 policy<{'arm64': '-'}> +CONFIG_SND_SOC_AMD_ACP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AMD_ACP3x policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_ACP5x policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_ACP6x policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_ACP_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_ACP_I2S policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_ACP_PCI policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_ACP_PCM policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_ACP_PDM policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_CZ_DA7219MX98357_MACH policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AMD_CZ_RT5645_MACH policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AMD_LEGACY_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_MACH_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_PS policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_PS_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_RPL_ACP6x policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_RV_RT5682_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_SOF_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_ST_ES8336_MACH policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AMD_VANGOGH_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_AMD_YC_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_APPLE_MCA policy<{'arm64': '-'}> +CONFIG_SND_SOC_APQ8016_SBC policy<{'arm64': '-'}> +CONFIG_SND_SOC_ARIZONA policy<{'amd64': '-'}> +CONFIG_SND_SOC_AW8738 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AW88395 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_AW88395_LIB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_BD28623 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_BT_SCO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CHV3_CODEC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CHV3_I2S policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_COMPRESS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CPCAP policy<{'arm64': '-'}> +CONFIG_SND_SOC_CROS_EC_CODEC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L32 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L33 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L34 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L35 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L36 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L41 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L41_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L41_LIB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L41_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L45 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L45_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L45_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L45_TABLES policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L56 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L56_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L56_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L56_SHARED policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS35L56_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS4234 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS4265 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS4270 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS4271 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS4271_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS4271_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42L42 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42L42_CORE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42L42_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42L51 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42L51_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42L52 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42L56 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42L73 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42L83 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42XX8 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS42XX8_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS43130 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS4341 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS4349 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CS53L30 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_CX2072X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_DA7213 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_DA7219 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_DAVINCI_MCASP policy<{'arm64': '-'}> +CONFIG_SND_SOC_DMIC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ES7134 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ES7241 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ES8316 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ES8326 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ES8328 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ES8328_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ES8328_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_ASOC_CARD policy<{'arm64': '-'}> +CONFIG_SND_SOC_FSL_ASRC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_AUD2HTX policy<{'arm64': '-'}> +CONFIG_SND_SOC_FSL_AUDMIX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_EASRC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_ESAI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_MICFIL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_MQS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_RPMSG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_SAI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_SPDIF policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_SSI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_UTILS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_FSL_XCVR policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_GTM601 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_HDA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_HDAC_HDA policy<{'amd64': '-'}> +CONFIG_SND_SOC_HDAC_HDMI policy<{'amd64': '-'}> +CONFIG_SND_SOC_HDMI_CODEC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_I2C_AND_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ICS43432 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_IDT821034 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_IMG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_IMG_I2S_IN policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_IMG_I2S_OUT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_IMG_PARALLEL_OUT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_IMG_PISTACHIO_INTERNAL_DAC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_IMG_SPDIF_IN policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_IMG_SPDIF_OUT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_IMX_AUDIO_RPMSG policy<{'arm64': '-'}> +CONFIG_SND_SOC_IMX_AUDMIX policy<{'arm64': '-'}> +CONFIG_SND_SOC_IMX_AUDMUX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_IMX_CARD policy<{'arm64': '-'}> +CONFIG_SND_SOC_IMX_ES8328 policy<{'arm64': '-'}> +CONFIG_SND_SOC_IMX_HDMI policy<{'arm64': '-'}> +CONFIG_SND_SOC_IMX_PCM_DMA policy<{'arm64': '-'}> +CONFIG_SND_SOC_IMX_PCM_RPMSG policy<{'arm64': '-'}> +CONFIG_SND_SOC_IMX_RPMSG policy<{'arm64': '-'}> +CONFIG_SND_SOC_IMX_SGTL5000 policy<{'arm64': '-'}> +CONFIG_SND_SOC_IMX_SPDIF policy<{'arm64': '-'}> +CONFIG_SND_SOC_INNO_RK3036 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_INTEL_APL policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_DA7219 policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_DMIC policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_HDAUDIO policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_I2S_TEST policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_MAX98357A policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_MAX98373 policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_MAX98927 policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_NAU8825 policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_PROBE policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_RT274 policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_RT286 policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_RT298 policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_RT5682 policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_AVS_MACH_SSM4567 policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BDW_RT5650_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BDW_RT5677_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BROADWELL_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BXT_RT298_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BYTCR_WM5102_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BYT_CHT_CX2072X_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BYT_CHT_DA7213_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BYT_CHT_ES8316_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_CATPT policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_CHT_BSW_NAU8824_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_CML_LP_DA7219_MAX98357A_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_DA7219_MAX98357A_GENERIC policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_EHL_RT5660_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_GLK policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_GLK_DA7219_MAX98357A_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_HASWELL_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_HDA_DSP_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_KBL policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98357A_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_KBL_DA7219_MAX98927_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_KEEMBAY policy<{'arm64': '-'}> +CONFIG_SND_SOC_INTEL_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SKL policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SKL_RT286_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SKYLAKE_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SKYLAKE_FAMILY policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SKYLAKE_SSP_CLK policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_CIRRUS_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_CML_RT1011_RT5682_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_CS42L42_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_DA7219_MAX98373_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_ES8336_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_MAXIM_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_NAU8825_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_PCM512x_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_REALTEK_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_RT5682_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_SSP_AMP_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SOF_WM8804_MACH policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SST policy<{'amd64': '-'}> +CONFIG_SND_SOC_INTEL_SST_TOPLEVEL policy<{'amd64': '-'}> +CONFIG_SND_SOC_J721E_EVM policy<{'arm64': '-'}> +CONFIG_SND_SOC_LOCHNAGAR_SC policy<{'arm64': '-'}> +CONFIG_SND_SOC_LPASS_APQ8016 policy<{'arm64': '-'}> +CONFIG_SND_SOC_LPASS_CDC_DMA policy<{'arm64': '-'}> +CONFIG_SND_SOC_LPASS_CPU policy<{'arm64': '-'}> +CONFIG_SND_SOC_LPASS_HDMI policy<{'arm64': '-'}> +CONFIG_SND_SOC_LPASS_IPQ806X policy<{'arm64': '-'}> +CONFIG_SND_SOC_LPASS_MACRO_COMMON policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_LPASS_PLATFORM policy<{'arm64': '-'}> +CONFIG_SND_SOC_LPASS_RX_MACRO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_LPASS_SC7180 policy<{'arm64': '-'}> +CONFIG_SND_SOC_LPASS_SC7280 policy<{'arm64': '-'}> +CONFIG_SND_SOC_LPASS_TX_MACRO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_LPASS_VA_MACRO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_LPASS_WSA_MACRO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX9759 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98088 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98090 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98357A policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98363 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98373 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98373_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98373_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98388 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98390 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98396 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98504 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98520 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX9860 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX9867 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MAX98927 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MEDIATEK policy<{'arm64': '-'}> +CONFIG_SND_SOC_MESON_T9015 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MIKROE_PROTO policy<{'arm64': '-'}> +CONFIG_SND_SOC_MSM8916_WCD_ANALOG policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MSM8916_WCD_DIGITAL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MSM8996 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT2701 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT6351 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MT6358 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MT6359 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT6359_ACCDET policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT6660 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_MT6797 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT6797_MT6351 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8173 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8183 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8183_DA7219_MAX98357A policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8183_MT6358_TS3A227E_MAX98357A policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8186 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8186_MT6366_DA7219_MAX98357 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8186_MT6366_RT1019_RT5682S policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8188 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8188_MT6359 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8192 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8192_MT6359_RT1015_RT5682 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8195 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MT8195_MT6359 policy<{'arm64': '-'}> +CONFIG_SND_SOC_MTK_BTCVSD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_NAU8315 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_NAU8540 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_NAU8810 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_NAU8821 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_NAU8822 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_NAU8824 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_NAU8825 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM1681 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM1789 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM1789_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM179X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM179X_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM179X_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM186X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM186X_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM186X_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM3060 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM3060_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM3060_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM3168A policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM3168A_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM3168A_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM5102A policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM512x policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM512x_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PCM512x_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_PEB2466 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_QCOM policy<{'arm64': '-'}> +CONFIG_SND_SOC_QCOM_COMMON policy<{'arm64': '-'}> +CONFIG_SND_SOC_QCOM_SDW policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6 policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_ADM policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_AFE policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_AFE_CLOCKS policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_AFE_DAI policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_APM policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_APM_DAI policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_APM_LPASS_DAI policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_ASM policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_ASM_DAI policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_COMMON policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_CORE policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_PRM policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_PRM_LPASS_CLOCKS policy<{'arm64': '-'}> +CONFIG_SND_SOC_QDSP6_ROUTING policy<{'arm64': '-'}> +CONFIG_SND_SOC_RCAR policy<{'arm64': '-'}> +CONFIG_SND_SOC_RK3288_HDMI_ANALOG policy<{'arm64': '-'}> +CONFIG_SND_SOC_RK3328 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RK3399_GRU_SOUND policy<{'arm64': '-'}> +CONFIG_SND_SOC_RK817 policy<{'arm64': '-'}> +CONFIG_SND_SOC_RL6231 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RL6347A policy<{'amd64': '-'}> +CONFIG_SND_SOC_ROCKCHIP policy<{'arm64': '-'}> +CONFIG_SND_SOC_ROCKCHIP_I2S policy<{'arm64': '-'}> +CONFIG_SND_SOC_ROCKCHIP_I2S_TDM policy<{'arm64': '-'}> +CONFIG_SND_SOC_ROCKCHIP_MAX98090 policy<{'arm64': '-'}> +CONFIG_SND_SOC_ROCKCHIP_PDM policy<{'arm64': '-'}> +CONFIG_SND_SOC_ROCKCHIP_RT5645 policy<{'arm64': '-'}> +CONFIG_SND_SOC_ROCKCHIP_SPDIF policy<{'arm64': '-'}> +CONFIG_SND_SOC_RT1011 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT1015 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT1015P policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT1019 policy<{'amd64': '-'}> +CONFIG_SND_SOC_RT1308 policy<{'amd64': '-'}> +CONFIG_SND_SOC_RT1308_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT1316_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT1318_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT274 policy<{'amd64': '-'}> +CONFIG_SND_SOC_RT286 policy<{'amd64': '-'}> +CONFIG_SND_SOC_RT298 policy<{'amd64': '-'}> +CONFIG_SND_SOC_RT5514 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5514_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5616 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5631 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5640 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5645 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5651 policy<{'amd64': '-'}> +CONFIG_SND_SOC_RT5659 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5660 policy<{'amd64': '-'}> +CONFIG_SND_SOC_RT5663 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5670 policy<{'amd64': '-'}> +CONFIG_SND_SOC_RT5677 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5677_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5682 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5682S policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5682_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT5682_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT700 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT700_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT711 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT711_SDCA_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT711_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT712_SDCA_DMIC_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT712_SDCA_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT715 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT715_SDCA_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT715_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT722_SDCA_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RT9120 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_RZ policy<{'arm64': '-'}> +CONFIG_SND_SOC_SC7180 policy<{'arm64': '-'}> +CONFIG_SND_SOC_SC7280 policy<{'arm64': '-'}> +CONFIG_SND_SOC_SC8280XP policy<{'arm64': '-'}> +CONFIG_SND_SOC_SDM845 policy<{'arm64': '-'}> +CONFIG_SND_SOC_SDW_MOCKUP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SGTL5000 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SH4_FSI policy<{'arm64': '-'}> +CONFIG_SND_SOC_SI476X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SIGMADSP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SIGMADSP_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SIGMADSP_REGMAP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SIMPLE_AMPLIFIER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SIMPLE_MUX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SM8250 policy<{'arm64': '-'}> +CONFIG_SND_SOC_SMA1303 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SOF policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SOF_ACPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SOF_ACPI_DEV policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_ALDERLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_AMD_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_AMD_REMBRANDT policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_AMD_RENOIR policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_AMD_TOPLEVEL policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_APOLLOLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_BAYTRAIL policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_BROADWELL policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_CANNONLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_CLIENT policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_COFFEELAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_COMETLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_COMPRESS policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_DEBUG_PROBES policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_DEVELOPER_SUPPORT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SOF_ELKHARTLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_GEMINILAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_HDA policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_HDA_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_HDA_LINK_BASELINE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_HDA_MLINK policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_HDA_PROBES policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_ICELAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_IMX8 policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_IMX8M policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_IMX8ULP policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_IMX_COMMON policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_IMX_TOPLEVEL policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_APL policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_ATOM_HIFI_EP policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_CNL policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_COMMON policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_HIFI_EP_IPC policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_ICL policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_IPC4 policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_MTL policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_SKL policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE_LINK_BASELINE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_TGL policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_INTEL_TOPLEVEL policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_IPC3 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SOF_JASPERLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_KABYLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_MERRIFIELD policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_METEORLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_MT8186 policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_MT8195 policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_MTK_COMMON policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_MTK_TOPLEVEL policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_OF policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_OF_DEV policy<{'arm64': '-'}> +CONFIG_SND_SOC_SOF_PCI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SOF_PCI_DEV policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_SKYLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_TIGERLAKE policy<{'amd64': '-'}> +CONFIG_SND_SOC_SOF_TOPLEVEL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SOF_XTENSA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SPDIF policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SPRD policy<{'arm64': '-'}> +CONFIG_SND_SOC_SPRD_MCDT policy<{'arm64': '-'}> +CONFIG_SND_SOC_SRC4XXX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SRC4XXX_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SSM2305 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SSM2518 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SSM2602 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SSM2602_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SSM2602_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_SSM3515 policy<{'arm64': '-'}> +CONFIG_SND_SOC_SSM4567 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_STA32X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_STA350 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_STI_SAS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_STM32_DFSDM policy<{'arm64': '-'}> +CONFIG_SND_SOC_STM32_I2S policy<{'arm64': '-'}> +CONFIG_SND_SOC_STM32_SAI policy<{'arm64': '-'}> +CONFIG_SND_SOC_STM32_SPDIFRX policy<{'arm64': '-'}> +CONFIG_SND_SOC_STORM policy<{'arm64': '-'}> +CONFIG_SND_SOC_TAS2552 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS2562 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS2764 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS2770 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS2780 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS2781_COMLIB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS2781_FMWLIB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS2781_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS5086 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS571X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS5720 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS5805M policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TAS6424 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TDA7419 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TEGRA policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA186_ASRC policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA186_DSPK policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA20_AC97 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA20_DAS policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA20_I2S policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA20_SPDIF policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA210_ADMAIF policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA210_ADX policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA210_AHUB policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA210_AMX policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA210_DMIC policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA210_I2S policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA210_MIXER policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA210_MVC policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA210_OPE policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA210_SFC policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA30_AHUB policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA30_I2S policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_ALC5632 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_AUDIO_GRAPH_CARD policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_MACHINE_DRV policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_MAX98088 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_MAX98090 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_RT5631 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_RT5640 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_RT5677 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_SGTL5000 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_TRIMSLICE policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_WM8753 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_WM8903 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TEGRA_WM9712 policy<{'arm64': '-'}> +CONFIG_SND_SOC_TFA9879 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TFA989X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TI_EDMA_PCM policy<{'arm64': '-'}> +CONFIG_SND_SOC_TI_SDMA_PCM policy<{'arm64': '-'}> +CONFIG_SND_SOC_TI_UDMA_PCM policy<{'arm64': '-'}> +CONFIG_SND_SOC_TLV320ADC3XXX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320ADCX140 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320AIC23 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320AIC23_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320AIC23_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320AIC31XX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320AIC32X4 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320AIC32X4_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320AIC32X4_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320AIC3X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320AIC3X_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TLV320AIC3X_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TOPOLOGY policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TPA6130A2 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TS3A227E policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TSCS42XX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_TSCS454 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_UDA1334 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WCD9335 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WCD934X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WCD938X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WCD938X_SDW policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WCD_MBHC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM5102 policy<{'amd64': '-'}> +CONFIG_SND_SOC_WM8510 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8523 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8524 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8580 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8711 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8728 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8731 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8731_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8731_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8737 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8741 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8750 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8753 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8770 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8776 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8782 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8804 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8804_I2C policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8804_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8903 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8904 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8940 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8960 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8961 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8962 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8974 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8978 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8985 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM8994 policy<{'arm64': '-'}> +CONFIG_SND_SOC_WM9712 policy<{'arm64': '-'}> +CONFIG_SND_SOC_WM_ADSP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WM_HUBS policy<{'arm64': '-'}> +CONFIG_SND_SOC_WSA881X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WSA883X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_WSA884X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_XILINX_I2S policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_XILINX_SPDIF policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_XTFPGA_I2S policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SOC_ZL38060 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SONICVIBES policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SPI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SST_ATOM_HIFI2_PLATFORM policy<{'amd64': '-'}> +CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI policy<{'amd64': '-'}> +CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_PCI policy<{'amd64': '-'}> +CONFIG_SND_SUN4I_CODEC policy<{'arm64': '-'}> +CONFIG_SND_SUN4I_I2S policy<{'arm64': '-'}> +CONFIG_SND_SUN4I_SPDIF policy<{'arm64': '-'}> +CONFIG_SND_SUN50I_CODEC_ANALOG policy<{'arm64': '-'}> +CONFIG_SND_SUN50I_DMIC policy<{'arm64': '-'}> +CONFIG_SND_SUN8I_ADDA_PR_REGMAP policy<{'arm64': '-'}> +CONFIG_SND_SUN8I_CODEC policy<{'arm64': '-'}> +CONFIG_SND_SUN8I_CODEC_ANALOG policy<{'arm64': '-'}> +CONFIG_SND_SUPPORT_OLD_API policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_SYNTH_EMUX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_TEST_COMPONENT policy<{'arm64': '-'}> +CONFIG_SND_TIMER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_TRIDENT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_UMP policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_UMP_LEGACY_RAWMIDI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_6FIRE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_AUDIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_AUDIO_MIDI_V2 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_CAIAQ policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_CAIAQ_INPUT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_HIFACE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_LINE6 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_POD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_PODHD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_TONEPORT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_UA101 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_USB_US122L policy<{'amd64': '-'}> +CONFIG_SND_USB_USX2Y policy<{'amd64': '-'}> +CONFIG_SND_USB_VARIAX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_VERBOSE_PRINTK policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_VERBOSE_PROCFS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_VIA82XX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_VIA82XX_MODEM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_VIRMIDI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_VIRTIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_VIRTUOSO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_VMASTER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_VX222 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_VXPOCKET policy<{'amd64': '-'}> +CONFIG_SND_VX_LIB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_X86 policy<{'amd64': '-'}> +CONFIG_SND_XEN_FRONTEND policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SND_YMFPCI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SONY_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SOUNDWIRE_AMD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SOUNDWIRE_CADENCE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SOUNDWIRE_GENERIC_ALLOCATION policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SOUNDWIRE_INTEL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SOUNDWIRE_QCOM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SOUND_OSS_CORE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SPEAKUP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_ACNTSA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_APOLLO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_AUDPTR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_BNS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_DECEXT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_DECTLK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_DUMMY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_LTLK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_SOFT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_SPKOUT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPEAKUP_SYNTH_TXPRT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPI_ALTERA_DFL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPI_AX88796C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPI_AX88796C_COMPRESSION policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SPI_BCM2835 policy<{'arm64': 'm'}> +CONFIG_SPI_BCM2835AUX policy<{'arm64': 'm'}> +CONFIG_SPI_BCM63XX_HSSPI policy<{'arm64': 'm'}> +CONFIG_SPI_BCMBCA_HSSPI policy<{'arm64': 'm'}> +CONFIG_SPI_BCM_QSPI policy<{'arm64': 'm'}> +CONFIG_SPI_DLN2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPMI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_SPMI_HISI3670 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPS30 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPS30_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SPS30_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SRF04 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SRF08 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SSB_B43_PCI_BRIDGE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SSB_BLOCKIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SSB_SDIOHOST policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SSB_SDIOHOST_POSSIBLE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SSFDC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STE10XP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_STK3310 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STK8312 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STK8BA50 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_STMMAC_ETH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STMMAC_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STMMAC_PLATFORM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STMMAC_SELFTESTS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_STM_DUMMY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STM_PROTO_BASIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STM_PROTO_SYS_T policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STM_SOURCE_CONSOLE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STM_SOURCE_FTRACE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STM_SOURCE_HEARTBEAT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_STRING_SELFTEST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_STX104 policy<{'amd64': '-'}> +CONFIG_ST_UVIS25 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ST_UVIS25_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ST_UVIS25_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SUNGEM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SUNGEM_PHY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_SURFACE3_WMI policy<{'amd64': '-'}> +CONFIG_SURFACE_3_POWER_OPREGION policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SURFACE_ACPI_NOTIFY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_AGGREGATOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_AGGREGATOR_BUS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SURFACE_AGGREGATOR_CDEV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_AGGREGATOR_ERROR_INJECTION policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SURFACE_AGGREGATOR_HUB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_AGGREGATOR_REGISTRY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_AGGREGATOR_TABLET_SWITCH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_DTX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_GPE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_HID policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_HID_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_HOTPLUG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_KBD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_PLATFORMS policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_SURFACE_PLATFORM_PROFILE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SURFACE_PRO3_BUTTON policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_SWIOTLB_XEN policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_SX9310 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SX9324 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SX9360 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SX9500 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SXGBE_ETH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SX_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_SYSFB_SIMPLEFB policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_SYSTEM76_ACPI policy<{'amd64': '-'}> +CONFIG_SYS_HYPERVISOR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_T5403 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TABLET_SERIAL_WACOM4 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TABLET_USB_ACECAD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TABLET_USB_AIPTEK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TABLET_USB_HANWANG policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TABLET_USB_KBTAB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TABLET_USB_PEGASUS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TAHVO_USB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TAHVO_USB_HOST_BY_DEFAULT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TASKS_RCU policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_TCG_ATMEL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TCG_INFINEON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TCG_TIS_SPI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TCG_TIS_SPI_CR50 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TCG_TIS_ST33ZP24 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TCG_TIS_ST33ZP24_I2C policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TCG_TIS_ST33ZP24_SPI policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TCG_VTPM_PROXY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TCG_XEN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TCM_FC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TCM_QLA2XXX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TCM_QLA2XXX_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TCS3414 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TCS3472 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TEE_BNXT_FW policy<{'arm64': 'm'}> +CONFIG_TEHUTI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TERANETICS_PHY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TEST_BITMAP policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_BITOPS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_BPF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TEST_CLOCKSOURCE_WATCHDOG policy<{'amd64': '-'}> +CONFIG_TEST_DHRY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_DIV64 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TEST_DYNAMIC_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_FIRMWARE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_FPU policy<{'amd64': '-'}> +CONFIG_TEST_FREE_PAGES policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_HEXDUMP policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_HMM policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_IDA policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_KMOD policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_KSTRTOX policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_LIVEPATCH policy<{'amd64': '-'}> +CONFIG_TEST_LKM policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_MAPLE_TREE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_MEMCAT_P policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_MEMINIT policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_MIN_HEAP policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_OBJAGG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_PARMAN policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_POWER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TEST_PRINTF policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_REF_TRACKER policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_RHASHTABLE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_SCANF policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_SIPHASH policy<{'arm64': '-'}> +CONFIG_TEST_STATIC_KEYS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_STRING_HELPERS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_STRSCPY policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_TEST_SYSCTL policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_UDELAY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_USER_COPY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_UUID policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_VMALLOC policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TEST_XARRAY policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_THINKPAD_ACPI policy<{'amd64': '-'}> +CONFIG_THINKPAD_ACPI_ALSA_SUPPORT policy<{'amd64': '-'}> +CONFIG_THINKPAD_ACPI_DEBUG policy<{'amd64': '-'}> +CONFIG_THINKPAD_ACPI_DEBUGFACILITIES policy<{'amd64': '-'}> +CONFIG_THINKPAD_ACPI_HOTKEY_POLL policy<{'amd64': '-'}> +CONFIG_THINKPAD_ACPI_UNSAFE_LEDS policy<{'amd64': '-'}> +CONFIG_THINKPAD_ACPI_VIDEO policy<{'amd64': '-'}> +CONFIG_THRUSTMASTER_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_THUNDER_NIC_BGX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_THUNDER_NIC_PF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_THUNDER_NIC_RGX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_THUNDER_NIC_VF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TICK_CPU_ACCOUNTING policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_TIPC_MEDIA_IB policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_TI_ADC081C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADC0832 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADC084S021 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADC108S102 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADC12138 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADC128S052 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADC161S626 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADS1015 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADS1100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADS124S08 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADS131E08 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADS7924 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADS7950 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADS8344 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ADS8688 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_AM335X_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_CPSW_PHY_SEL policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TI_DAC082S085 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_DAC5571 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_DAC7311 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_DAC7612 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_LMP92064 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_ST policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TI_TLC4541 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_TMAG5273 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TI_TSC2046 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TLAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TMD_HERMES policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TMP006 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TMP007 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TMP117 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TORTURE_TEST policy<{'amd64': 'm'}> +CONFIG_TOUCHSCREEN_88PM860X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_AD7877 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_AD7879 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_AD7879_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_AD7879_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ADS7846 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ATMEL_MXT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_AUO_PIXCIR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_BU21013 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_BU21029 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_CHIPONE_ICN8505 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_COLIBRI_VF50 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_CY8CTMA140 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_CY8CTMG110 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_CYTTSP4_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_CYTTSP4_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_CYTTSP4_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_CYTTSP5 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_CYTTSP_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_CYTTSP_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_CYTTSP_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_DA9034 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_DA9052 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_DMI policy<{'amd64': '-'}> +CONFIG_TOUCHSCREEN_DYNAPRO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_EDT_FT5X06 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_EETI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_EGALAX_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_EKTF2127 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ELO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_EXC3000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_FUJITSU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_GOODIX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_GUNZE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_HAMPSHIRE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_HIDEEP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_HIMAX_HX83112B policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_HYCON_HY46XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ILI210X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ILITEK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_IMAGIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_INEXIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_IPROC policy<{'arm64': 'm'}> +CONFIG_TOUCHSCREEN_IQS5XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_MAX11801 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_MC13783 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_MCS5000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_MELFAS_MIP4 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_MK712 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_TOUCHSCREEN_MMS114 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_MSG2638 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_MTOUCH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_PCAP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_PENMOUNT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_PIXCIR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_RASPBERRYPI_FW policy<{'arm64': 'm'}> +CONFIG_TOUCHSCREEN_RM_TS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ROHM_BU21023 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_S6SY761 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_SILEAD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_SIS_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ST1232 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_STMFTS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_SUR40 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_SURFACE3_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_SX8654 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_TI_AM335X_TSC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_TOUCHIT213 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_TOUCHRIGHT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_TOUCHWIN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_TPS6507X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_TSC2004 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_TSC2005 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_TSC2007 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_TSC2007_IIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_TSC200X_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_TSC_SERIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_UCB1400 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_TOUCHSCREEN_USB_3M policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_COMPOSITE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_USB_DMC_TSC10 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_E2I policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_EASYTOUCH policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_EGALAX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_ELO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_ETT_TC45USB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_ETURBO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_GOTOP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_GUNZE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_IDEALTEK policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_IRTOUCH policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_ITM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_JASTEC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_NEXIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_PANJIT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_USB_ZYTRONIC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TOUCHSCREEN_WACOM_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_WACOM_W8001 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_WDT87XX_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_WM831X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_WM9705 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_TOUCHSCREEN_WM9712 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_TOUCHSCREEN_WM9713 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_TOUCHSCREEN_WM97XX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_TOUCHSCREEN_ZET6223 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ZFORCE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TOUCHSCREEN_ZINITIX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TPL0102 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TRACE_MMIO_ACCESS policy<{'arm64': 'n'}> +CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS policy<{'amd64': 'y', 'arm64': 'n'}> +CONFIG_TRANSPARENT_HUGEPAGE_MADVISE policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_TSL2583 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TSL2591 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TSL2772 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TSL4531 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TSNEP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TSNEP_SELFTESTS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TSYS01 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TSYS02D policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TTPCI_EEPROM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TULIP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TULIP_MMIO policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TULIP_MWI policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TULIP_NAPI policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_TWL4030_CORE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TWL4030_MADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TWL4030_WATCHDOG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TWL6030_GPADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TWL6040_CORE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_TYPEC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_TYPEC_ANX7411 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_DP_ALTMODE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_FUSB302 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_HD3SS3220 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_MT6360 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_MUX_FSA4480 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_MUX_GPIO_SBU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_MUX_INTEL_PMC policy<{'amd64': '-'}> +CONFIG_TYPEC_MUX_NB7VPQ904M policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_MUX_PI3USB30532 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_NVIDIA_ALTMODE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_RT1711H policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_RT1719 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_STUSB160X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_TCPCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_TCPCI_MAXIM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_TCPCI_MT6370 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_TCPM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_TPS6598X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_UCSI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPEC_WCOVE policy<{'amd64': '-'}> +CONFIG_TYPEC_WUSB3801 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_TYPHOON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_UBIFS_ATIME_SUPPORT policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_UBIFS_FS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_UBIFS_FS_ADVANCED_COMPR policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_UBIFS_FS_AUTHENTICATION policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_UBIFS_FS_LZO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_UBIFS_FS_SECURITY policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_UBIFS_FS_XATTR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_UBIFS_FS_ZLIB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_UBIFS_FS_ZSTD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_UBUNTU_ODM_DRIVERS policy<{'amd64': '-'}> +CONFIG_UCB1400_CORE policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_UCSI_ACPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_UCSI_CCG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_UCSI_STM32G0 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_UIO_DFL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ULI526X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_UNINLINE_SPIN_UNLOCK policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_US5182D policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USBIP_CORE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USBIP_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USBIP_HOST policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USBIP_VHCI_HCD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USBIP_VHCI_HC_PORTS policy<{'amd64': '-', 'arm64': '8'}> +CONFIG_USBIP_VHCI_NR_HCS policy<{'amd64': '-', 'arm64': '1'}> +CONFIG_USBIP_VUDC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USBPCWATCHDOG policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_ADUTUX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_AIRSPY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_ALI_M5632 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_AMD5536UDC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_AN2720 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_ANNOUNCE_NEW_DEVICES policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_USB_APPLEDISPLAY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_ARMLINUX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_ATM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_AUDIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_BDC_UDC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_BELKIN policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_BRCMSTB policy<{'arm64': 'm'}> +CONFIG_USB_C67X00_HCD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_CATC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CDC_COMPOSITE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CDC_PHONET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CDNS2_UDC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CDNS3 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_CDNS3_GADGET policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CDNS3_HOST policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CDNS3_PCI_WRAP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CDNSP_GADGET policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CDNSP_HOST policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_USB_CDNS_HOST policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CHAOSKEY policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_CHIPIDEA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CHIPIDEA_GENERIC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CHIPIDEA_HOST policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_CHIPIDEA_MSM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CHIPIDEA_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CHIPIDEA_UDC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CONFIGFS_ACM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_ECM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_ECM_SUBSET policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_EEM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_F_FS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_F_HID policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_F_LB_SS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_F_MIDI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_CONFIGFS_F_PRINTER policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_F_TCM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_F_UAC1 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_CONFIGFS_F_UAC1_LEGACY policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_CONFIGFS_F_UAC2 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_CONFIGFS_F_UVC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_MASS_STORAGE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_NCM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_OBEX policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_PHONET policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_RNDIS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONFIGFS_SERIAL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_CONN_GPIO policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_CXACRU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_CYPRESS_CY7C63 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_CYTHERM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_DEFAULT_PERSIST policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_USB_DSBR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_DUMMY_HCD policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_DWC2 policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_USB_DWC2_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_DWC2_HOST policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_DWC2_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_DWC2_TRACK_MISSED_SOFS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_DWC3 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_DWC3_DUAL_ROLE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_DWC3_GADGET policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_DWC3_HAPS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_DWC3_HOST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_DWC3_PCI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_DWC3_ULPI policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_DYNAMIC_MINORS policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_USB_EG20T policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_EHCI_FSL policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_EHCI_HCD_NPCM7XX policy<{'arm64': '-'}> +CONFIG_USB_EHCI_HCD_ORION policy<{'arm64': '-'}> +CONFIG_USB_EHCI_PCI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_EHCI_ROOT_HUB_TT policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_EHCI_TEGRA policy<{'arm64': '-'}> +CONFIG_USB_EHCI_TT_NEWSCHED policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_EHSET_TEST_FIXTURE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_EMI26 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_EMI62 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_EPSON2888 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_ETH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_ETH_EEM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_ETH_RNDIS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_EZUSB_FX2 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_FOTG210_HCD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_FOTG210_UDC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_FTDI_ELAN policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_FUNCTIONFS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_FUNCTIONFS_ETH policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_FUNCTIONFS_GENERIC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_FUNCTIONFS_RNDIS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_F_ACM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_ECM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_EEM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_FS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_HID policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_MASS_STORAGE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_MIDI policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_F_NCM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_OBEX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_PHONET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_PRINTER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_RNDIS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_SS_LB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_SUBSET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_TCM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_F_UAC1 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_F_UAC1_LEGACY policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_F_UAC2 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_F_UVC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GADGET policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_GADGETFS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GADGET_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_GADGET_DEBUG_FILES policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_GADGET_DEBUG_FS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS policy<{'amd64': '-', 'arm64': '2'}> +CONFIG_USB_GADGET_TARGET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GADGET_VBUS_DRAW policy<{'amd64': '-', 'arm64': '2'}> +CONFIG_USB_GL860 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GOKU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GPIO_VBUS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_GR_UDC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_BENQ policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_CONEX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_CPIA1 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_DTCS033 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_ETOMS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_FINEPIX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_JEILINJ policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_JL2005BCD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_KINECT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_KONICA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_MARS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_MR97310A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_NW80X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_OV519 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_OV534 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_OV534_9 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_PAC207 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_PAC7302 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_PAC7311 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SE401 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SN9C2028 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SN9C20X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SONIXB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SONIXJ policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SPCA1528 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SPCA500 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SPCA501 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SPCA505 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SPCA506 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SPCA508 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SPCA561 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SQ905 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SQ905C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SQ930X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_STK014 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_STK1135 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_STV0680 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_SUNPLUS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_T613 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_TOPRO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_TOUPTEK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_TV8532 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_VC032X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_VICAM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_XIRLINK_CIT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_GSPCA_ZC3XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_G_ACM_MS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_G_DBGP policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_G_DBGP_PRINTK policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_G_DBGP_SERIAL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_G_HID policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_G_MULTI policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_G_NCM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_G_NOKIA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_G_PRINTER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_G_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_G_WEBCAM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_HACKRF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_HID policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_HIDDEV policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_HSIC_USB3503 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_HSIC_USB4604 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_HSO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_HUB_USB251XB policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_IDMOUSE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_IOWARRIOR policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_IPHETH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_ISIGHTFW policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_ISP116X_HCD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_ISP1301 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_ISP1760 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_ISP1760_DUAL_ROLE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_ISP1760_GADGET_ROLE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_ISP1760_HCD policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_ISP1760_HOST_ROLE policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_ISP1761_UDC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_KAWETH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_KBD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_KC2190 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_KEENE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_LAN78XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_LCD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_LD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_LEDS_TRIGGER_USBPORT policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_LED_TRIG policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_USB_LEGOTOWER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_LIBCOMPOSITE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_LINK_LAYER_TEST policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_M5602 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_MA901 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_MASS_STORAGE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_MAX3420_UDC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_MAX3421_HCD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_MDC800 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_MICROTEK policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_MIDI_GADGET policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_MON policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_MOUSE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_MR800 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_MSI2500 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_MUSB_DUAL_ROLE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_MUSB_GADGET policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_MUSB_HOST policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_MV_U3D policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_MV_UDC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET2272 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET2272_DMA policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_NET2280 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_AQC111 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_AX88179_178A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_AX8817X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_CDCETHER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_CDC_EEM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_CDC_MBIM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_CDC_NCM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_CDC_SUBSET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_CDC_SUBSET_ENABLE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_CH9200 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_CX82310_ETH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_DM9601 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_DRIVERS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_NET_GL620A policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_HUAWEI_CDC_NCM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_INT51X1 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_KALMIA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_MCS7830 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_NET1080 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_PLUSB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_QMI_WWAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_RNDIS_HOST policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_RNDIS_WLAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_SMSC75XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_SMSC95XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_SR9700 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_SR9800 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_NET_ZAURUS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_OHCI_HCD_PCI policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_OHCI_HCD_PLATFORM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_OXU210HP_HCD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_PEGASUS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_PRINTER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_PWC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_PWC_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_PWC_INPUT_EVDEV policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_PXA27X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_QCOM_EUD policy<{'arm64': 'n'}> +CONFIG_USB_R8A66597 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_R8A66597_HCD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_RAREMONO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_RAW_GADGET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_ROLE_SWITCH policy<{'amd64': 'm', 'arm64': 'y'}> +CONFIG_USB_RTL8150 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_RTL8152 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_RTL8153_ECM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_S2255 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_SERIAL_AIRCABLE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_ARK3116 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_BELKIN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_CH341 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_CP210X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_CYBERJACK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_CYPRESS_M8 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_DIGI_ACCELEPORT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_EDGEPORT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_EDGEPORT_TI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_EMPEG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_F81232 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_F8153X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_FTDI_SIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_GARMIN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_GENERIC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_SERIAL_IPAQ policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_IPW policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_IR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_IUU policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_KEYSPAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_KEYSPAN_PDA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_KLSI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_KOBIL_SCT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_MCT_U232 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_METRO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_MOS7715_PARPORT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_SERIAL_MOS7720 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_MOS7840 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_MXUPORT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_NAVMAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_OMNINET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_OPTICON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_OPTION policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_OTI6858 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_PL2303 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_QCAUX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_QT2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_QUALCOMM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_SAFE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_SAFE_PADDED policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_SERIAL_SIERRAWIRELESS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_SIMPLE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_SPCP8X5 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_SSU100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_SYMBOL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_TI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_UPD78F0730 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_VISOR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_WHITEHEAT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_WISHBONE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_WWAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_XR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SERIAL_XSENS_MT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SEVSEG policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_SI470X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SI4713 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SIERRA_NET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SISUSBVGA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SL811_CS policy<{'amd64': '-'}> +CONFIG_USB_SL811_HCD policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_SL811_HCD_ISO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_SNP_CORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_SPEEDTOUCH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STKWEBCAM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_STORAGE policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_STORAGE_ALAUDA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_CYPRESS_ATACB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_DATAFAB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_USB_STORAGE_ENE_UB6250 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_FREECOM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_ISD200 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_JUMPSHOT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_KARMA policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_ONETOUCH policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_REALTEK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_SDDR09 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_SDDR55 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STORAGE_USBAT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_STV06XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_TEST policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_TMC policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_TRANCEVIBRATOR policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_U132_HCD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_UAS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_UEAGLEATM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_USBNET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_USS720 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_U_AUDIO policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_USB_U_ETHER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_U_SERIAL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_VIDEO_CLASS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_USB_VL600 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_WDM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_XEN_HCD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_XHCI_PCI_RENESAS policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_USB_XUSBATM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_YUREX policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_USB_ZD1201 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_ZERO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_USB_ZR364XX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_UVC_COMMON policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_U_SERIAL_CONSOLE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_V4L2_FLASH_LED_CLASS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VBOXSF_FS policy<{'amd64': '-'}> +CONFIG_VCHIQ_CDEV policy<{'arm64': 'y'}> +CONFIG_VCNL3020 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VCNL4000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VCNL4035 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VDPA_SIM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VDPA_SIM_BLOCK policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VDPA_SIM_NET policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VEML6030 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VEML6070 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VF610_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VF610_DAC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VFIO_PLATFORM_BCMFLEXRM_RESET policy<{'arm64': 'm'}> +CONFIG_VIA_RHINE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIA_RHINE_MMIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_VIA_VELOCITY policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEOBUF2_DVB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEOBUF_DMA_SG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEOBUF_GEN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEOBUF_VMALLOC policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_AD5820 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_ADP1653 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_ADV7511_CEC policy<{'amd64': 'y'}> +CONFIG_VIDEO_AK7375 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_APTINA_PLL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_AR0521 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_ATOMISP_ISP2401 policy<{'amd64': '-'}> +CONFIG_VIDEO_AU0828 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_AU0828_RC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_VIDEO_AU0828_V4L2 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_VIDEO_BCM2835 policy<{'arm64': 'm'}> +CONFIG_VIDEO_BT848 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CAMERA_SENSOR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_VIDEO_CCS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CCS_PLL policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_COBALT policy<{'amd64': '-'}> +CONFIG_VIDEO_CPIA2 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_CX18 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CX18_ALSA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_CX231XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CX231XX_ALSA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_CX231XX_DVB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CX231XX_RC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_VIDEO_CX2341X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CX23885 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_CX25821 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CX25821_ALSA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_CX88 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CX88_ALSA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_CX88_BLACKBIRD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CX88_DVB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CX88_ENABLE_VP3054 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_VIDEO_CX88_MPEG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_CX88_VP3054 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_DT3155 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_DW9714 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_DW9768 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_DW9807_VCM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_EM28XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_EM28XX_ALSA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_EM28XX_DVB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_EM28XX_RC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_EM28XX_V4L2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_ET8EK8 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_FB_IVTV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_FB_IVTV_FORCE_PAT policy<{'amd64': '-'}> +CONFIG_VIDEO_GO7007 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_GO7007_LOADER policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_GO7007_USB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_GO7007_USB_S2250_BOARD policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_HDPVR policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_HEXIUM_GEMINI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_HEXIUM_ORION policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_HI556 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_HI846 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_HI847 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IMX208 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IMX214 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IMX219 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IMX258 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IMX274 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IMX290 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IMX296 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IMX319 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IMX355 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IPU3_CIO2 policy<{'amd64': '-'}> +CONFIG_VIDEO_IVTV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_IVTV_ALSA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_LM3560 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_LM3646 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_M5MOLS policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_MAX9271_LIB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_MEYE policy<{'amd64': '-'}> +CONFIG_VIDEO_MT9M001 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_MT9M032 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_MT9M111 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_MT9P031 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_MT9T001 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_MT9T112 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_MT9V011 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_MT9V032 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_MT9V111 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_MXB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_NOON010PC30 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_OG01A1B policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV01A10 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV02A10 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV08D10 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV08X40 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV13858 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV13B10 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV2640 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV2659 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV2680 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV2685 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV2740 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV4689 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV5647 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV5648 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV5670 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV5675 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV5693 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV5695 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV6650 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV7251 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV7640 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV7670 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV772X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV7740 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV8856 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV8858 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV8865 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV9640 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV9650 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_OV9734 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_PCI_SKELETON policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_VIDEO_PVRUSB2 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_PVRUSB2_DEBUGIFC policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_VIDEO_PVRUSB2_DVB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_VIDEO_PVRUSB2_SYSFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_VIDEO_RDACM20 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_RDACM21 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_RJ54N1 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_S5C73M3 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_S5K4ECGX policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_S5K5BAF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_S5K6A3 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_S5K6AA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_SAA7134 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_SAA7134_ALSA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_SAA7134_DVB policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_SAA7134_GO7007 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_SAA7134_RC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_VIDEO_SAA7146 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_SAA7146_VV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_SAA7164 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_SOLO6X10 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_SR030PC30 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_STK1160 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_STK1160_COMMON policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_TDA1997X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_TM6000 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_TM6000_ALSA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_TM6000_DVB policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_TUNER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_TVEEPROM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_TW5864 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_TW68 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_TW686X policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_USBTV policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_VS6624 policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_VIDEO_ZORAN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIDEO_ZORAN_DC30 policy<{'arm64': 'n'}> +CONFIG_VIDEO_ZORAN_ZR36060 policy<{'arm64': 'n'}> +CONFIG_VIPERBOARD_ADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VIRT_CPU_ACCOUNTING policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_VIRT_CPU_ACCOUNTING_GEN policy<{'amd64': 'y', 'arm64': 'y'}> +CONFIG_VIRT_WIFI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VL53L0X_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VL6180 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VME_USER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_VMXNET3 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_VORTEX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VT6656 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_VXLAN policy<{'amd64': 'y', 'arm64': 'm'}> +CONFIG_VZ89X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1 policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_W1_CON policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_W1_MASTER_DS1WM policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_W1_MASTER_DS2482 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_MASTER_DS2490 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_MASTER_GPIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_MASTER_MATROX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_MASTER_SGI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2405 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2406 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2408 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2408_READBACK policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_W1_SLAVE_DS2413 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2423 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2430 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2431 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2433 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2433_CRC policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_W1_SLAVE_DS2438 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS250X policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2780 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2781 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS2805 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS28E04 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_DS28E17 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_SMEM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_W1_SLAVE_THERM policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WANT_DEV_COREDUMP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WCN36XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WCN36XX_DEBUGFS policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_WEXT_PRIV policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WEXT_SPY policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WFX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WIL6210 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WIL6210_DEBUGFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WIL6210_ISR_COR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WIL6210_TRACING policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WILC1000 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WILC1000_HW_OOB_INTR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WILC1000_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WILC1000_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WILCO_EC policy<{'amd64': '-'}> +CONFIG_WILCO_EC_DEBUGFS policy<{'amd64': '-'}> +CONFIG_WILCO_EC_EVENTS policy<{'amd64': '-'}> +CONFIG_WILCO_EC_TELEMETRY policy<{'amd64': '-'}> +CONFIG_WILINK_PLATFORM_DATA policy<{'amd64': '-', 'arm64': '-'}> +CONFIG_WINBOND_840 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WIRELESS_EXT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WIZNET_BUS_ANY policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WIZNET_BUS_DIRECT policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_WIZNET_BUS_INDIRECT policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_WIZNET_W5100 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WIZNET_W5100_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WIZNET_W5300 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WL1251 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WL1251_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WL1251_SPI policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WL12XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WL18XX policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WLAN policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_ADMTEK policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_ATH policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_ATMEL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_BROADCOM policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_CISCO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_INTEL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_INTERSIL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_MARVELL policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_MEDIATEK policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_MICROCHIP policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_PURELIFI policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_QUANTENNA policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_RALINK policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_REALTEK policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_RSI policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_SILABS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_ST policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_TI policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLAN_VENDOR_ZYDAS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_WLCORE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WLCORE_SDIO policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WM831X_BACKUP policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_WM831X_POWER policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_WM8350_POWER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_WM8350_WATCHDOG policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_X86_AMD_PSTATE_UT policy<{'amd64': 'm'}> +CONFIG_X86_ANDROID_TABLETS policy<{'amd64': '-'}> +CONFIG_X9250 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN policy<{'amd64': 'n', 'arm64': 'y'}> +CONFIG_XENFS policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_ACPI policy<{'amd64': '-'}> +CONFIG_XEN_AUTO_XLATE policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_BACKEND policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_BALLOON policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_BALLOON_MEMORY_HOTPLUG policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_BLKDEV_BACKEND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_COMPAT_XENFS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_DEBUG_FS policy<{'amd64': '-'}> +CONFIG_XEN_DEV_EVTCHN policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_DOM0 policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_EFI policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_FBDEV_FRONTEND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_FRONT_PGDIR_SHBUF policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_GNTDEV policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_GNTDEV_DMABUF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_GRANT_DEV_ALLOC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_GRANT_DMA_ALLOC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_GRANT_DMA_OPS policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_HAVE_PVMMU policy<{'amd64': '-'}> +CONFIG_XEN_HAVE_VPMU policy<{'amd64': '-'}> +CONFIG_XEN_MCE_LOG policy<{'amd64': '-'}> +CONFIG_XEN_MEMORY_HOTPLUG_LIMIT policy<{'amd64': '-'}> +CONFIG_XEN_NETDEV_BACKEND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_PCIDEV_BACKEND policy<{'amd64': '-'}> +CONFIG_XEN_PCIDEV_FRONTEND policy<{'amd64': '-'}> +CONFIG_XEN_PCI_STUB policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_PRIVCMD policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_PV policy<{'amd64': '-'}> +CONFIG_XEN_PVCALLS_BACKEND policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_XEN_PVCALLS_FRONTEND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_PVH policy<{'amd64': '-'}> +CONFIG_XEN_PVHVM policy<{'amd64': '-'}> +CONFIG_XEN_PVHVM_GUEST policy<{'amd64': '-'}> +CONFIG_XEN_PVHVM_SMP policy<{'amd64': '-'}> +CONFIG_XEN_PV_DOM0 policy<{'amd64': '-'}> +CONFIG_XEN_PV_MSR_SAFE policy<{'amd64': '-'}> +CONFIG_XEN_PV_SMP policy<{'amd64': '-'}> +CONFIG_XEN_SAVE_RESTORE policy<{'amd64': '-'}> +CONFIG_XEN_SCRUB_PAGES_DEFAULT policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_SCSI_BACKEND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_SCSI_FRONTEND policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_SYMS policy<{'amd64': '-'}> +CONFIG_XEN_SYS_HYPERVISOR policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_UNPOPULATED_ALLOC policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_VIRTIO policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XEN_VIRTIO_FORCE_GRANT policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_XEN_WDT policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XEN_XENBUS_FRONTEND policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_XILINX_GMII2RGMII policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_XILINX_PR_DECOUPLER policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XILINX_XADC policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_XILLYBUS policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_XILLYBUS_PCIE policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_YAM policy<{'amd64': 'n', 'arm64': 'm'}> +CONFIG_YAMAHA_YAS530 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_YOGABOOK_WMI policy<{'amd64': '-'}> +CONFIG_ZD1211RW policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ZD1211RW_DEBUG policy<{'amd64': '-', 'arm64': 'n'}> +CONFIG_ZEROPLUS_FF policy<{'amd64': '-', 'arm64': 'y'}> +CONFIG_ZERO_CALL_USED_REGS policy<{'amd64': 'n', 'arm64': 'n'}> +CONFIG_ZOPT2201 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ZPA2326 policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ZPA2326_I2C policy<{'amd64': '-', 'arm64': 'm'}> +CONFIG_ZPA2326_SPI policy<{'amd64': '-', 'arm64': 'm'}> --- linux-azure-6.5.0.orig/debian.azure/control.d/azure.inclusion-list +++ linux-azure-6.5.0/debian.azure/control.d/azure.inclusion-list @@ -0,0 +1,276 @@ +arch/*/{crypto,kernel,oprofile} +arch/*/kvm/kvm.ko +arch/powerpc/kvm/kvm-hv.ko +arch/powerpc/kvm/kvm-pr.ko +arch/powerpc/kvm/vfio.ko +arch/powerpc/platforms/powernv/opal-prd.ko +arch/s390/* +arch/x86/kvm/kvm-amd.ko +arch/x86/kvm/kvm-intel.ko +block/bfq.ko +block/cfq-iosched.ko +block/deadline-iosched.ko +block/kyber-iosched.ko +block/mq-deadline.ko +crypto/* +drivers/acpi/* +drivers/ata/acard-ahci.ko +drivers/ata/ahci.ko +drivers/ata/ahci_platform.ko +drivers/ata/ata_generic.ko +drivers/ata/libahci.ko +drivers/ata/libahci_platform.ko +drivers/ata/pata_acpi.ko +drivers/block/brd.ko +drivers/block/cryptoloop.ko +drivers/block/drbd/drbd.ko +drivers/block/floppy.ko +drivers/block/loop.ko +drivers/block/nbd.ko +drivers/block/rbd.ko +drivers/block/virtio_blk.ko +drivers/block/xen-blkfront.ko +drivers/catapult/catapult.ko +drivers/char/hangcheck-timer.ko +drivers/char/hw_random/powernv-rng.ko +drivers/char/hw_random/virtio-rng.ko +drivers/char/ipmi/* +drivers/char/ipmi/ipmi_msghandler.ko +drivers/char/lp.ko +drivers/char/nvram.ko +drivers/char/ppdev.ko +drivers/char/raw.ko +drivers/char/virtio_console.ko +drivers/crypto/nx/* +drivers/crypto/vmx/vmx-crypto.ko +drivers/firmware/efi/* +drivers/firmware/iscsi_ibft.ko +drivers/fpga/* +drivers/gpu/drm/ast/ast.ko +drivers/gpu/drm/drm_kms_helper.ko +drivers/gpu/drm/drm.ko +drivers/gpu/drm/hyperv/hyperv_drm.ko +drivers/gpu/drm/ttm/ttm.ko +drivers/hid/hid-generic.ko +drivers/hid/hid-hyperv.ko +drivers/hid/hid.ko +drivers/hid/usbhid/usbhid.ko +drivers/hv/* +drivers/hwmon/ibmpowernv.ko +drivers/i2c/busses/i2c-piix4.ko +drivers/infiniband/core/ib_addr.ko +drivers/infiniband/core/ib_cm.ko +drivers/infiniband/core/ib_core.ko +drivers/infiniband/core/ib_mad.ko +drivers/infiniband/core/ib_sa.ko +drivers/infiniband/core/ib_umad.ko +drivers/infiniband/core/iw_cm.ko +drivers/infiniband/core/rdma_cm.ko +drivers/infiniband/core/rdma_ucm.ko +drivers/infiniband/hw/mlx4/* +drivers/infiniband/hw/mlx5/* +drivers/infiniband/hw/vmbus-rdma/* +drivers/infiniband/ulp/ipoib/ib_ipoib.ko +drivers/infiniband/ulp/iser/ib_iser.ko +drivers/infiniband/ulp/isert/ib_isert.ko +drivers/input/evbug.ko +drivers/input/gameport/gameport.ko +drivers/input/input-leds.ko +drivers/input/joydev.ko +drivers/input/misc/xen-kbdfront.ko +drivers/input/mouse/psmouse.ko +drivers/input/serio/hyperv-keyboard.ko +drivers/input/serio/serio_raw.ko +drivers/input/serio/serport.ko +drivers/input/touchscreen/usbtouchscreen.ko +drivers/leds/leds-powernv.ko +drivers/md/* +drivers/message/fusion* +drivers/misc/cxl/* +drivers/misc/eeprom/at24.ko +drivers/misc/vmw_balloon.ko +drivers/misc/vmw_vmci/vmw_vmci.ko +drivers/mtd/cmdlinepart.ko +drivers/mtd/devices/powernv_flash.ko +drivers/mtd/ofpart.ko +drivers/net/appletalk/ipddp.ko +drivers/net/bonding/bonding.ko +drivers/net/caif/caif_virtio.ko +drivers/net/dummy.ko +drivers/net/eql.ko +drivers/net/ethernet/8390/8390.ko +drivers/net/ethernet/8390/ne2k-pci.ko +drivers/net/ethernet/amazon/ena/ena.ko +drivers/net/ethernet/amd/pcnet32.ko +drivers/net/ethernet/broadcom/bnx2x/* +drivers/net/ethernet/broadcom/tg3.ko +drivers/net/ethernet/dec/tulip/* +drivers/net/ethernet/emulex/benet/* +drivers/net/ethernet/ibm/* +drivers/net/ethernet/intel/e1000/e1000.ko +drivers/net/ethernet/intel/e1000e/e1000e.ko +drivers/net/ethernet/intel/i40e/* +drivers/net/ethernet/intel/igb/* +drivers/net/ethernet/intel/igbvf/igbvf.ko +drivers/net/ethernet/intel/ixgbe/* +drivers/net/ethernet/intel/ixgbevf/ixgbevf.ko +drivers/net/ethernet/mellanox/* +drivers/net/ethernet/realtek/8139cp.ko +drivers/net/ethernet/realtek/8139too.ko +drivers/net/fddi/* +drivers/net/geneve.ko +drivers/net/hyperv/hv_netvsc.ko +drivers/net/ifb.ko +drivers/net/ipvlan/* +drivers/net/macvlan.ko +drivers/net/macvtap.ko +drivers/net/mii.ko +drivers/net/netconsole.ko +drivers/net/ppp/* +drivers/net/ppp/bsd_comp.ko +drivers/net/slip/* +drivers/net/veth.ko +drivers/net/virtio_net.ko +drivers/net/vmxnet3/vmxnet3.ko +drivers/net/vxlan.ko +drivers/net/wireguard/wireguard.ko +drivers/net/xen-netback/* +drivers/net/xen-netfront.ko +drivers/nvme/host/nvme.ko +drivers/nvmem/nvmem_core.ko +drivers/parport/parport.ko +drivers/parport/parport_pc.ko +drivers/pci/controller/pci-hyperv.ko +drivers/platform/x86/pvpanic.ko +drivers/pps/pps_core.ko +drivers/ptp/ptp.ko +drivers/s390/* +drivers/s390/block/xpram.ko +drivers/scsi/aacraid/* +drivers/scsi/BusLogic.ko +drivers/scsi/cxlflash/* +drivers/scsi/device_handler/scsi_dh_alua.ko +drivers/scsi/device_handler/scsi_dh_emc.ko +drivers/scsi/device_handler/scsi_dh_hp_sw.ko +drivers/scsi/device_handler/scsi_dh_rdac.ko +drivers/scsi/hv_storvsc.ko +drivers/scsi/ibmvscsi/* +drivers/scsi/ipr.ko +drivers/scsi/iscsi_boot_sysfs.ko +drivers/scsi/iscsi_tcp.ko +drivers/scsi/libiscsi.ko +drivers/scsi/libiscsi_tcp.ko +drivers/scsi/libsas/* +drivers/scsi/lpfc/* +drivers/scsi/megaraid/* +drivers/scsi/mpt3sas/* +drivers/scsi/osd/libosd.ko +drivers/scsi/osd/osd.ko +drivers/scsi/qla1280.ko +drivers/scsi/qla2xxx/* +drivers/scsi/raid_class.ko +drivers/scsi/scsi_transport_fc.ko +drivers/scsi/scsi_transport_iscsi.ko +drivers/scsi/scsi_transport_sas.ko +drivers/scsi/scsi_transport_spi.ko +drivers/scsi/sd_mod.ko +drivers/scsi/sr_mod.ko +drivers/scsi/virtio_scsi.ko +drivers/scsi/vmw_pvscsi.ko +drivers/target/loopback/tcm_loop.ko +drivers/target/target_core*.ko +drivers/tty/serial/jsm/* +drivers/uio/uio_hv_generic.ko +drivers/uio/uio.ko +drivers/uio/uio_pci_generic.ko +drivers/uio/uio_pdrv_genirq.ko +drivers/usb/host/* +drivers/usb/storage/uas.ko +drivers/usb/storage/usb-storage.ko +drivers/vfio/* +drivers/vhost/* +! find drivers/video/fbdev -name "*.ko" | grep -v hyperv_fb +drivers/video/vgastate.ko +drivers/virtio/* +drivers/watchdog/softdog.ko +drivers/xen/* +! find sound/core -name oss -prune -o -name *.ko -print +fs/9p/* +fs/aufs/aufs.ko +fs/autofs/autofs4.ko +fs/binfmt_misc.ko +fs/btrfs/* +fs/cachefiles/cachefiles.ko +fs/ceph/* +fs/configfs/* +fs/dlm/dlm.ko +fs/ecryptfs/* +fs/efivarfs/* +fs/erofs/* +fs/exofs/libore.ko +fs/ext4/* +fs/fat/* +fs/fscache/* +fs/fuse/* +fs/isofs/* +fs/lockd/* +fs/nfs/* +fs/nfs_common/* +fs/nfsd/* +fs/nls/nls_cp437.ko +fs/nls/nls_iso8859-1.ko +fs/nls/nls_utf8.ko +fs/smb/* +fs/overlayfs/* +fs/squashfs/* +fs/udf/* +fs/ufs/* +fs/xfs/* +lib/* +net/6lowpan/* +net/802/* +net/8021q/* +net/9p/* +net/appletalk/* +net/atm/* +net/ax25/* +net/bpfilter/bpfilter.ko +net/bridge/* +net/can/* +net/ceph/libceph.ko +net/core/* +net/dccp/* +net/decnet/* +net/ieee802154/* +net/ipv4/* +net/ipv6/* +net/ipx/* +net/irda/* +net/key/* +net/lapb/* +net/llc/* +net/netfilter/* +net/netlink/netlink_diag.ko +net/netrom/* +net/openvswitch/* +net/packet/af_packet_diag.ko +net/phonet/* +net/rose/* +net/rxrpc/* +net/sched/* +net/sctp/* +net/sunrpc/auth_gss/auth_rpcgss.ko +net/sunrpc/auth_gss/rpcsec_gss_krb5.ko +net/sunrpc/sunrpc.ko +net/tipc/* +net/unix/unix_diag.ko +net/vmw_vsock/* +net/x25/* +net/xfrm/* +sound/drivers/pcsp/snd-pcsp.ko +sound/pci/snd-ens1370.ko +sound/soundcore.ko +ubuntu/vbox/vboxguest/vboxguest.ko +ubuntu/vbox/vboxsf/vboxsf.ko +zfs/* +ubuntu/ubuntu-host/ubuntu-host.ko --- linux-azure-6.5.0.orig/debian.azure/control.d/flavour-control.stub +++ linux-azure-6.5.0/debian.azure/control.d/flavour-control.stub @@ -0,0 +1,152 @@ +# Items that get replaced: +# FLAVOUR +# DESC +# ARCH +# SUPPORTED +# TARGET +# BOOTLOADER +# =PROVIDES= +# +# Items marked with =FOO= are optional +# +# This file describes the template for packages that are created for each flavour +# in debian/control.d/vars.* +# +# This file gets edited in a couple of places. See the debian/control.stub rule in +# debian/rules. PGGVER, ABINUM, and SRCPKGNAME are all converted in the +# process of creating debian/control. +# +# The flavour specific strings (ARCH, DESC, etc) are converted using values from the various +# flavour files in debian/control.d/vars.* +# +# XXX: Leave the blank line before the first package!! + +Package: linux-image=SIGN-ME-PKG=-PKGVER-ABINUM-FLAVOUR +Build-Profiles: +Architecture: ARCH +Section: kernel +Priority: optional +Provides: linux-image, fuse-module, =PROVIDES=${linux:rprovides} +Depends: ${misc:Depends}, ${shlibs:Depends}, kmod, linux-base (>= 4.5ubuntu1~16.04.1), linux-modules-PKGVER-ABINUM-FLAVOUR +Recommends: BOOTLOADER +Breaks: flash-kernel (<< 3.0~rc.4ubuntu64) [arm64] +Conflicts: linux-image=SIGN-PEER-PKG=-PKGVER-ABINUM-FLAVOUR +Suggests: fdutils, SRCPKGNAME-doc-PKGVER | SRCPKGNAME-source-PKGVER, SRCPKGNAME-tools, linux-headers-PKGVER-ABINUM-FLAVOUR, initramfs-tools | linux-initramfs-tool +Description: Linux kernel image for version PKGVER on DESC + This package contains the=SIGN-ME-TXT= Linux kernel image for version PKGVER on + DESC. + . + Supports SUPPORTED processors. + . + TARGET + . + You likely do not want to install this package directly. Instead, install + the linux-FLAVOUR meta-package, which will ensure that upgrades work + correctly, and that supporting packages are also installed. + +Package: linux-modules-PKGVER-ABINUM-FLAVOUR +Build-Profiles: +Architecture: ARCH +Section: kernel +Priority: optional +Depends: ${misc:Depends}, ${shlibs:Depends}, linux-base-sgx +Built-Using: ${linux:BuiltUsing} +Description: Linux kernel extra modules for version PKGVER on DESC + Contains the corresponding System.map file, the modules built by the + packager, and scripts that try to ensure that the system is not left in an + unbootable state after an update. + . + Supports SUPPORTED processors. + . + TARGET + . + You likely do not want to install this package directly. Instead, install + the linux-FLAVOUR meta-package, which will ensure that upgrades work + correctly, and that supporting packages are also installed. + +Package: linux-modules-extra-PKGVER-ABINUM-FLAVOUR +Build-Profiles: +Architecture: ARCH +Section: kernel +Priority: optional +Depends: ${misc:Depends}, ${shlibs:Depends}, wireless-regdb, linux-modules-PKGVER-ABINUM-FLAVOUR +Description: Linux kernel extra modules for version PKGVER on DESC + This package contains the Linux kernel extra modules for version PKGVER on + DESC. + . + Also includes the corresponding System.map file, the modules built by the + packager, and scripts that try to ensure that the system is not left in an + unbootable state after an update. + . + Supports SUPPORTED processors. + . + TARGET + . + You likely do not want to install this package directly. Instead, install + the linux-FLAVOUR meta-package, which will ensure that upgrades work + correctly, and that supporting packages are also installed. + +Package: linux-headers-PKGVER-ABINUM-FLAVOUR +Build-Profiles: +Architecture: ARCH +Section: devel +Priority: optional +Depends: ${misc:Depends}, SRCPKGNAME-headers-PKGVER-ABINUM, ${shlibs:Depends} +Provides: linux-headers, linux-headers-3.0 +Description: Linux kernel headers for version PKGVER on DESC + This package provides kernel header files for version PKGVER on + DESC. + . + This is for sites that want the latest kernel headers. Please read + /usr/share/doc/linux-headers-PKGVER-ABINUM/debian.README.gz for details. + +Package: linux-image=SIGN-ME-PKG=-PKGVER-ABINUM-FLAVOUR-dbgsym +Build-Profiles: +Architecture: ARCH +Section: devel +Priority: optional +Depends: ${misc:Depends} +Provides: linux-debug +Description: Linux kernel debug image for version PKGVER on DESC + This package provides the=SIGN-ME-TXT= kernel debug image for version PKGVER on + DESC. + . + This is for sites that wish to debug the kernel. + . + The kernel image contained in this package is NOT meant to boot from. It + is uncompressed, and unstripped. This package also includes the + unstripped modules. + +Package: linux-tools-PKGVER-ABINUM-FLAVOUR +Build-Profiles: +Architecture: ARCH +Section: devel +Priority: optional +Depends: ${misc:Depends}, SRCPKGNAME-tools-PKGVER-ABINUM +Description: Linux kernel version specific tools for version PKGVER-ABINUM + This package provides the architecture dependant parts for kernel + version locked tools (such as perf and x86_energy_perf_policy) for + version PKGVER-ABINUM on + =HUMAN=. + +Package: linux-cloud-tools-PKGVER-ABINUM-FLAVOUR +Build-Profiles: +Architecture: ARCH +Section: devel +Priority: optional +Depends: ${misc:Depends}, SRCPKGNAME-cloud-tools-PKGVER-ABINUM +Description: Linux kernel version specific cloud tools for version PKGVER-ABINUM + This package provides the architecture dependant parts for kernel + version locked tools for cloud for version PKGVER-ABINUM on + =HUMAN=. + +Package: linux-udebs-FLAVOUR +Build-Profiles: +XC-Package-Type: udeb +Section: debian-installer +Architecture: ARCH +Depends: ${udeb:Depends} +Description: Metapackage depending on kernel udebs + This package depends on the all udebs that the kernel build generated, + for easier version and migration tracking. + --- linux-azure-6.5.0.orig/debian.azure/control.d/vars.azure +++ linux-azure-6.5.0/debian.azure/control.d/vars.azure @@ -0,0 +1,6 @@ +arch="amd64 arm64" +supported="Azure" +target="Geared toward Azure systems." +desc="=HUMAN= SMP" +bootloader="grub-pc [amd64] | grub-efi-amd64 [amd64] | grub-efi-ia32 [amd64] | grub [amd64] | flash-kernel [arm64] | grub-efi-arm64 [arm64]" +provides="kvm-api-4, redhat-cluster-modules, ivtv-modules, virtualbox-guest-modules [amd64]" --- linux-azure-6.5.0.orig/debian.azure/control.stub.in +++ linux-azure-6.5.0/debian.azure/control.stub.in @@ -0,0 +1,101 @@ +Source: SRCPKGNAME +Section: devel +Priority: optional +Maintainer: Ubuntu Kernel Team +Standards-Version: 3.9.4.0 +Build-Depends: + debhelper-compat (= 10), + cpio, + kernel-wedge , + dctrl-tools , + kmod , + libcap-dev , + makedumpfile [amd64] , + libelf-dev , + libnewt-dev , + libiberty-dev , + rsync , + libdw-dev , + libpci-dev , + pkg-config , + python3 , + python3-dev , + flex , + bison , + libunwind8-dev [amd64 arm64 armhf ppc64el] , + liblzma-dev , + openssl , + libssl-dev , + libaudit-dev , + bc , + gawk , + libudev-dev , + autoconf , + automake , + libtool , + uuid-dev , + libnuma-dev [amd64 arm64 ppc64el s390x] , + dkms , + curl , + zstd , + pahole [amd64 arm64] | dwarves (>= 1.21) [amd64 arm64] , + clang-15 [amd64], + libclang1-15 [amd64], + rustc-1.68 [amd64], + rust-1.68-src [amd64], + rustfmt-1.68 [amd64], + bindgen-0.56 [amd64], + llvm [amd64], + libstdc++-dev, +Build-Depends-Indep: + xmlto , + docbook-utils , + ghostscript , + fig2dev , + bzip2 , + sharutils , + asciidoc , + python3-sphinx , + python3-sphinx-rtd-theme , + python3-docutils , +Vcs-Git: git://git.launchpad.net/~canonical-kernel/ubuntu/+source/linux-azure/+git/=SERIES= +XS-Testsuite: autopkgtest +#XS-Testsuite-Depends: gcc-4.7 binutils + +Package: SRCPKGNAME-headers-PKGVER-ABINUM +Build-Profiles: +Architecture: all +Multi-Arch: foreign +Section: devel +Priority: optional +Depends: ${misc:Depends}, coreutils +Description: Header files related to Linux kernel version PKGVER + This package provides kernel header files for version PKGVER, for sites + that want the latest kernel headers. Please read + /usr/share/doc/SRCPKGNAME-headers-PKGVER-ABINUM/debian.README.gz for details + +Package: SRCPKGNAME-tools-PKGVER-ABINUM +Build-Profiles: +Architecture: amd64 arm64 +Section: devel +Priority: optional +Depends: ${misc:Depends}, ${shlibs:Depends}, linux-tools-common +Description: Linux kernel version specific tools for version PKGVER-ABINUM + This package provides the architecture dependant parts for kernel + version locked tools (such as perf and x86_energy_perf_policy) for + version PKGVER-ABINUM on + =HUMAN=. + You probably want to install linux-tools-PKGVER-ABINUM-. + +Package: SRCPKGNAME-cloud-tools-PKGVER-ABINUM +Build-Profiles: +Architecture: amd64 arm64 +Section: devel +Priority: optional +Depends: ${misc:Depends}, ${shlibs:Depends}, linux-cloud-tools-common +Description: Linux kernel version specific cloud tools for version PKGVER-ABINUM + This package provides the architecture dependant parts for kernel + version locked tools for cloud tools for version PKGVER-ABINUM on + =HUMAN=. + You probably want to install linux-cloud-tools-PKGVER-ABINUM-. + --- linux-azure-6.5.0.orig/debian.azure/copyright +++ linux-azure-6.5.0/debian.azure/copyright @@ -0,0 +1,29 @@ +This is the Ubuntu prepackaged version of the Linux kernel. +Linux was written by Linus Torvalds +and others. + +This package was put together by the Ubuntu Kernel Team, from +sources retrieved from upstream linux git. +The sources may be found at most Linux ftp sites, including +ftp://ftp.kernel.org/pub/linux/kernel/ + +This package is currently maintained by the +Ubuntu Kernel Team + +Linux is copyrighted by Linus Torvalds and others. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 dated June, 1991. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +On Ubuntu Linux systems, the complete text of the GNU General +Public License v2 can be found in `/usr/share/common-licenses/GPL-2'. --- linux-azure-6.5.0.orig/debian.azure/d-i/firmware/README.txt +++ linux-azure-6.5.0/debian.azure/d-i/firmware/README.txt @@ -0,0 +1,4 @@ +# +# Place the names of udeb modules into this directory that require +# runtime firmware. +# --- linux-azure-6.5.0.orig/debian.azure/d-i/kernel-versions +++ linux-azure-6.5.0/debian.azure/d-i/kernel-versions @@ -0,0 +1,2 @@ +# arch version flavour installedname suffix bdep +amd64 - azure - - - --- linux-azure-6.5.0.orig/debian.azure/d-i/package-list +++ linux-azure-6.5.0/debian.azure/d-i/package-list @@ -0,0 +1,208 @@ +Package: kernel-image +Provides: ext3-modules, ext4-modules +Provides_amd64: efi-modules, ext3-modules, ext4-modules +Provides_i386: efi-modules, ext3-modules, ext4-modules +Provides_ppc64el: ext3-modules, ext4-modules, fat-modules +Provides_s390x: ext3-modules, ext4-modules, ppp-modules +Description: kernel image and system map + +Package: dasd-modules +Depends: kernel-image, storage-core-modules +Priority: standard +Description: DASD storage support + +Package: dasd-extra-modules +Depends: dasd-modules +Priority: extra +Description: DASD storage support -- extras + +Package: fat-modules +Depends: kernel-image +Priority: standard +Description: FAT filesystem support + This includes Windows FAT and VFAT support. + +Package: fb-modules +Depends: kernel-image +Priority: standard +Description: Framebuffer modules + +Package: firewire-core-modules +Depends: kernel-image, storage-core-modules +Priority: standard +Description: Firewire (IEEE-1394) Support + +Package: floppy-modules +Depends: kernel-image +Priority: standard +Description: Floppy driver support + +Package: fs-core-modules +Depends: kernel-image +Priority: standard +Provides: ext2-modules, jfs-modules, reiserfs-modules, xfs-modules +Description: Base filesystem modules + This includes jfs, reiserfs and xfs. + +Package: fs-secondary-modules +Depends: kernel-image, fat-modules +Priority: standard +Provides: btrfs-modules, ntfs-modules, hfs-modules +Description: Extra filesystem modules + This includes support for Windows NTFS and MacOS HFS/HFSPlus + +Package: input-modules +Depends: kernel-image, usb-modules +Priority: standard +Description: Support for various input methods + +Package: irda-modules +Depends: kernel-image, nic-shared-modules +Priority: standard +Description: Support for Infrared protocols + +Package: md-modules +Depends: kernel-image +Priority: standard +Provides: crypto-dm-modules +Description: Multi-device support (raid, device-mapper, lvm) + +Package: nic-modules +Depends: kernel-image, nic-shared-modules, virtio-modules +Priority: standard +Description: Network interface support + +Package: nic-pcmcia-modules +Depends: kernel-image, nic-shared-modules, nic-modules +Priority: standard +Description: PCMCIA network interface support + +Package: nic-usb-modules +Depends: kernel-image, nic-shared-modules, usb-modules +Priority: standard +Description: USB network interface support + +Package: nic-shared-modules +Depends: kernel-image, crypto-modules +Priority: standard +Description: nic shared modules + This package contains modules which support nic modules + +Package: parport-modules +Depends: kernel-image +Priority: standard +Description: Parallel port support + +Package: pata-modules +Depends: kernel-image, storage-core-modules +Priority: standard +Description: PATA support modules + +Package: pcmcia-modules +Depends: kernel-image +Priority: standard +Description: PCMCIA Modules + +Package: pcmcia-storage-modules +Depends: kernel-image, scsi-modules +Priority: standard +Description: PCMCIA storage support + +Package: plip-modules +Depends: kernel-image, nic-shared-modules, parport-modules +Priority: standard +Description: PLIP (parallel port) networking support + +Package: ppp-modules +Depends: kernel-image, nic-shared-modules, serial-modules +Priority: standard +Description: PPP (serial port) networking support + +Package: sata-modules +Depends: kernel-image, storage-core-modules +Priority: standard +Description: SATA storage support + +Package: scsi-modules +Depends: kernel-image, storage-core-modules +Priority: standard +Description: SCSI storage support + +Package: serial-modules +Depends: kernel-image +Priority: standard +Description: Serial port support + +Package: storage-core-modules +Depends: kernel-image +Priority: standard +Provides: loop-modules +Description: Core storage support + Includes core SCSI, LibATA, USB-Storage. Also includes related block + devices for CD, Disk and Tape medium (and IDE Floppy). + +Package: usb-modules +Depends: kernel-image, storage-core-modules +Priority: standard +Description: Core USB support + +Package: nfs-modules +Priority: standard +Depends: kernel-image +Description: NFS filesystem drivers + Includes the NFS client driver, and supporting modules. + +Package: block-modules +Priority: standard +Provides: nbd-modules +Depends: kernel-image, storage-core-modules, parport-modules, virtio-modules +Description: Block storage devices + This package contains the block storage devices, including DAC960 and + paraide. + +Package: message-modules +Priority: standard +Depends: kernel-image, storage-core-modules, scsi-modules +Description: Fusion and i2o storage modules + This package containes the fusion and i2o storage modules. + +Package: crypto-modules +Priority: extra +Depends: kernel-image +Description: crypto modules + This package contains crypto modules. + +Package: virtio-modules +Priority: standard +Depends: kernel-image +Description: VirtIO Modules + Includes modules for VirtIO (virtual machine, generally kvm guests) + +Package: socket-modules +Depends: kernel-image +Priority: standard +Description: Unix socket support + +Package: mouse-modules +Depends: kernel-image, input-modules, usb-modules +Priority: extra +Description: Mouse support + This package contains mouse drivers for the Linux kernel. + +Package: vlan-modules +Depends: kernel-image +Priority: extra +Description: vlan modules + This package contains vlan (8021.Q) modules. + +Package: ipmi-modules +Depends: kernel-image +Priority: standard +Description: ipmi modules + +Package: multipath-modules +Depends: kernel-image +Priority: extra +Description: DM-Multipath support + This package contains modules for device-mapper multipath support. + --- linux-azure-6.5.0.orig/debian.azure/dkms-versions +++ linux-azure-6.5.0/debian.azure/dkms-versions @@ -0,0 +1,3 @@ +zfs-linux 2.2.0-0ubuntu1~23.10.2 modulename=zfs debpath=pool/universe/z/%package%/zfs-dkms_%version%_all.deb arch=amd64 arch=arm64 arch=ppc64el arch=s390x rprovides=spl-modules rprovides=spl-dkms rprovides=zfs-modules rprovides=zfs-dkms +backport-iwlwifi-dkms 11289-0ubuntu1.23.10.1 modulename=iwlwifi debpath=pool/universe/b/%package%/backport-iwlwifi-dkms_%version%_all.deb arch=amd64 rprovides=iwlwifi-modules rprovides=backport-iwlwifi-dkms type=standalone +v4l2loopback 0.12.7-2ubuntu4 modulename=v4l2loopback debpath=pool/universe/v/%package%/v4l2loopback-dkms_%version%_all.deb arch=amd64 rprovides=v4l2loopback-modules rprovides=v4l2loopback-dkms --- linux-azure-6.5.0.orig/debian.azure/etc/getabis +++ linux-azure-6.5.0/debian.azure/etc/getabis @@ -0,0 +1,19 @@ +repo_list=( + "http://ppa.launchpad.net/mhcerri/azure/ubuntu/pool/main/l/linux-azure" + "http://archive.ubuntu.com/ubuntu/pool/main/l/linux-azure" + "http://ports.ubuntu.com/ubuntu-ports/pool/main/l/linux-azure" + "http://archive.ubuntu.com/ubuntu/pool/universe/l/linux-azure" + "http://ports.ubuntu.com/ubuntu-ports/pool/universe/l/linux-azure" + "http://ppa.launchpad.net/canonical-kernel-team/ppa/ubuntu/pool/main/l/linux-azure" + "http://ppa.launchpad.net/canonical-kernel-team/ppa2/ubuntu/pool/main/l/linux-azure" + "http://ppa.launchpad.net/canonical-kernel-team/ppa/ubuntu/pool/main/l/linux-signed-azure" + "http://ppa.launchpad.net/canonical-kernel-team/unstable/ubuntu/pool/main/l/linux-azure" + "http://ppa.launchpad.net/canonical-kernel-team/bootstrap/ubuntu/pool/main/l/linux-azure" +) + +package_prefixes linux-image linux-modules linux-modules-extra + +getall amd64 azure +getall arm64 azure + +# Ports arches and flavours. --- linux-azure-6.5.0.orig/debian.azure/etc/kernelconfig +++ linux-azure-6.5.0/debian.azure/etc/kernelconfig @@ -0,0 +1,7 @@ +if [ "$variant" = "ports" ]; then + archs="" + family='ports' +else + archs="amd64 arm64" + family='ubuntu' +fi --- linux-azure-6.5.0.orig/debian.azure/etc/update.conf +++ linux-azure-6.5.0/debian.azure/etc/update.conf @@ -0,0 +1,7 @@ +# WARNING: we do not create update.conf when we are not a +# derivative. Various cranky components make use of this. +# If we start unconditionally creating update.conf we need +# to fix at least cranky close and cranky rebase. +RELEASE_REPO=git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/mantic +SOURCE_RELEASE_BRANCH=master-next +DEBIAN_MASTER=debian.master --- linux-azure-6.5.0.orig/debian.azure/modprobe.d/common.conf +++ linux-azure-6.5.0/debian.azure/modprobe.d/common.conf @@ -0,0 +1,7 @@ +# LP:1434842 -- disable OSS drivers by default to allow pulseaudio to emulate +blacklist snd-mixer-oss +blacklist snd-pcm-oss +# LP:1708699 -- prevent RDMA drivers from being hot plugged +install vmbus:3daf2e8ca732094bab99bd1f1c86b501 true +# LP:1712915 -- [Hyper-V] linux-azure: rdma_ucm should autoload on HPC images +softdep hv_network_direct_* post: rdma_ucm --- linux-azure-6.5.0.orig/debian.azure/reconstruct +++ linux-azure-6.5.0/debian.azure/reconstruct @@ -0,0 +1,57 @@ +# Recreate any symlinks created since the orig. +chmod +x 'debian.azure/scripts/helpers/copy-files' +chmod +x 'debian/cloud-tools/hv_get_dhcp_info' +chmod +x 'debian/cloud-tools/hv_get_dns_info' +chmod +x 'debian/cloud-tools/hv_set_ifconfig' +chmod +x 'debian/rules' +chmod +x 'debian/scripts/checks/final-checks' +chmod +x 'debian/scripts/checks/module-signature-check' +chmod +x 'debian/scripts/control-create' +chmod +x 'debian/scripts/dkms-build' +chmod +x 'debian/scripts/dkms-build--nvidia-N' +chmod +x 'debian/scripts/dkms-build-configure--zfs' +chmod +x 'debian/scripts/file-downloader' +chmod +x 'debian/scripts/link-headers' +chmod +x 'debian/scripts/link-lib-rust' +chmod +x 'debian/scripts/misc/annotations' +chmod +x 'debian/scripts/misc/arch-has-odm-enabled.sh' +chmod +x 'debian/scripts/misc/find-missing-sauce.sh' +chmod +x 'debian/scripts/misc/fips-checks' +chmod +x 'debian/scripts/misc/fw-to-ihex.sh' +chmod +x 'debian/scripts/misc/gen-auto-reconstruct' +chmod +x 'debian/scripts/misc/getabis' +chmod +x 'debian/scripts/misc/git-ubuntu-log' +chmod +x 'debian/scripts/misc/insert-changes' +chmod +x 'debian/scripts/misc/insert-mainline-changes' +chmod +x 'debian/scripts/misc/insert-ubuntu-changes' +chmod +x 'debian/scripts/misc/kernelconfig' +chmod +x 'debian/scripts/misc/retag' +chmod +x 'debian/scripts/misc/sanitize-annotations' +chmod +x 'debian/scripts/misc/splitconfig.pl' +chmod +x 'debian/scripts/misc/update-aufs.sh' +chmod +x 'debian/scripts/module-inclusion' +chmod +x 'debian/scripts/retpoline-extract' +chmod +x 'debian/scripts/retpoline-extract-one' +chmod +x 'debian/scripts/sign-module' +chmod +x 'debian/templates/extra.postinst.in' +chmod +x 'debian/templates/extra.postrm.in' +chmod +x 'debian/templates/headers.postinst.in' +chmod +x 'debian/templates/image.postinst.in' +chmod +x 'debian/templates/image.postrm.in' +chmod +x 'debian/templates/image.preinst.in' +chmod +x 'debian/templates/image.prerm.in' +chmod +x 'debian/tests-build/check-aliases' +chmod +x 'debian/tests/rebuild' +chmod +x 'debian/tests/ubuntu-regression-suite' +chmod +x 'drivers/watchdog/f71808e_wdt.c' +chmod +x 'tools/testing/selftests/netfilter/conntrack_sctp_collision.sh' +chmod +x 'tools/testing/selftests/netfilter/nft_audit.sh' +chmod +x 'tools/testing/selftests/netfilter/xt_string.sh' +# Remove any files deleted from the orig. +rm -f 'Documentation/networking/device_drivers/ethernet/mellanox/mlx5/devlink.rst' +rm -f 'arch/parisc/include/asm/mckinley.h' +rm -f 'drivers/media/pci/intel/ipu3/cio2-bridge.c' +rm -f 'drivers/media/pci/intel/ipu3/cio2-bridge.h' +rm -f 'include/linux/ceph/mdsmap.h' +rm -f 'scripts/is_rust_module.sh' +exit 0 --- linux-azure-6.5.0.orig/debian.azure/rules.d/amd64.mk +++ linux-azure-6.5.0/debian.azure/rules.d/amd64.mk @@ -0,0 +1,25 @@ +human_arch = 64 bit x86 +build_arch = x86 +header_arch = $(build_arch) +defconfig = defconfig +flavours = azure +build_image = bzImage +kernel_file = arch/$(build_arch)/boot/bzImage +install_file = vmlinuz +loader = grub +vdso = vdso_install +no_dumpfile = true +uefi_signed = true +do_tools_usbip = true +do_tools_cpupower = true +do_tools_perf = true +do_tools_bpftool = true +do_tools_x86 = true +do_tools_hyperv = true +do_extras_package = true +do_tools_common = false +do_zfs = true +do_libc_dev_package=false +disable_d_i=true +do_source_package = false +do_doc_package = false --- linux-azure-6.5.0.orig/debian.azure/rules.d/arm64.mk +++ linux-azure-6.5.0/debian.azure/rules.d/arm64.mk @@ -0,0 +1,25 @@ +human_arch = ARMv8 +build_arch = arm64 +header_arch = arm64 +defconfig = defconfig +flavours = azure +build_image = Image.gz +kernel_file = arch/$(build_arch)/boot/Image.gz +install_file = vmlinuz +loader = grub +vdso = vdso_install +no_dumpfile = true +uefi_signed = true +do_tools_usbip = true +do_tools_cpupower = true +do_tools_perf = true +do_tools_bpftool = true +do_tools_x86 = false +do_tools_hyperv = true +do_extras_package = true +do_tools_common = false +do_zfs = true +do_libc_dev_package=false +disable_d_i=true +do_source_package = false +do_doc_package = false --- linux-azure-6.5.0.orig/debian.azure/rules.d/hooks.mk +++ linux-azure-6.5.0/debian.azure/rules.d/hooks.mk @@ -0,0 +1 @@ +do_enforce_all = true --- linux-azure-6.5.0.orig/debian.azure/scripts/helpers/copy-files +++ linux-azure-6.5.0/debian.azure/scripts/helpers/copy-files @@ -0,0 +1,67 @@ +#!/bin/bash -eu + +if [ -f debian/debian.env ]; then + # shellcheck disable=SC1091 + . debian/debian.env +fi + +if [ ! -d "${DEBIAN}" ]; then + echo You must run this script from the top directory of this repository. + exit 1 +fi + +CONF="${DEBIAN}"/etc/update.conf +if [ -f "${CONF}" ]; then + # shellcheck disable=SC1090 + . "${CONF}" +fi + +FOREIGN_ARCHES="" +LOCAL_CONF="${DEBIAN}/etc/local.conf" +if [ -f "${LOCAL_CONF}" ]; then + # shellcheck disable=SC1090 + . "${LOCAL_CONF}" +fi + +SKIP_RULES_D=${SKIP_RULES_D:-} + +# +# Pick up any master branch changes to udeb modules or firmware. +# +rsync -avc --delete "${DEBIAN_MASTER}/d-i/" "${DEBIAN}/d-i" + +# +# Update configs from master +# +rsync -avc --delete "${DEBIAN_MASTER}/config/" "${DEBIAN}/config" + +# +# Update package and DTB settings from master +# +if [ -z "${SKIP_RULES_D}" ] ; then + rsync -avc "${DEBIAN_MASTER}/rules.d/"*.mk "${DEBIAN}/rules.d/" +fi + +# Remove the .mk files from the arch's that are not supported +for i in ${FOREIGN_ARCHES} +do + rm -f "${DEBIAN}/rules.d/${i}.mk" + git rm -f --ignore-unmatch "${DEBIAN}/rules.d/${i}.mk" || true +done + +# +# Update modprobe.d from master +# +# Some releases (trusty) don't have this directory, and rsync would fail +# without this check. +if [ -d "${DEBIAN}/modprobe.d/" ]; then + rsync -avc --delete "${DEBIAN_MASTER}/modprobe.d/" "${DEBIAN}/modprobe.d" +fi + +cp -p "${DEBIAN_MASTER}/control.d/"*.inclusion-list "${DEBIAN}/control.d" + +cp -p "${DEBIAN_MASTER}/reconstruct" "${DEBIAN}/reconstruct" + +if [ -x "${DEBIAN}/scripts/helpers/local-mangle" ]; then + "./${DEBIAN}/scripts/helpers/local-mangle" +fi --- linux-azure-6.5.0.orig/debian.azure/tracking-bug +++ linux-azure-6.5.0/debian.azure/tracking-bug @@ -0,0 +1 @@ +2055566 2024.03.04-1 --- linux-azure-6.5.0.orig/debian.master/changelog +++ linux-azure-6.5.0/debian.master/changelog @@ -0,0 +1,25586 @@ +linux (6.5.0-27.28) mantic; urgency=medium + + * mantic/linux: 6.5.0-27.28 -proposed tracker (LP: #2055584) + + * Packaging resync (LP: #1786013) + - [Packaging] drop ABI data + - [Packaging] update annotations scripts + - debian.master/dkms-versions -- update from kernel-versions (main/2024.03.04) + + * CVE-2024-26597 + - net: qualcomm: rmnet: fix global oob in rmnet_policy + + * CVE-2024-26599 + - pwm: Fix out-of-bounds access in of_pwm_single_xlate() + + * Drop ABI checks from kernel build (LP: #2055686) + - [Packaging] Remove in-tree abi checks + + * Cranky update-dkms-versions rollout (LP: #2055685) + - [Packaging] remove update-dkms-versions + - Move debian/dkms-versions to debian.master/dkms-versions + - [Packaging] Replace debian/dkms-versions with $(DEBIAN)/dkms-versions + + * linux: please move erofs.ko (CONFIG_EROFS for EROFS support) from linux- + modules-extra to linux-modules (LP: #2054809) + - UBUNTU [Packaging]: Include erofs in linux-modules instead of linux-modules- + extra + + * performance: Scheduler: ratelimit updating of load_avg (LP: #2053251) + - sched/fair: Ratelimit update to tg->load_avg + + * IB peer memory feature regressed in 6.5 (LP: #2055082) + - SAUCE: RDMA/core: Introduce peer memory interface + + * linux-tools-common: man page of usbip[d] is misplaced (LP: #2054094) + - [Packaging] rules: Put usbip manpages in the correct directory + + * CVE-2024-23851 + - dm: limit the number of targets and parameter size area + + * CVE-2024-23850 + - btrfs: do not ASSERT() if the newly created subvolume already got read + + * x86: performance: tsc: Extend watchdog check exemption to 4-Sockets platform + (LP: #2054699) + - x86/tsc: Extend watchdog check exemption to 4-Sockets platform + + * linux: please move dmi-sysfs.ko (CONFIG_DMI_SYSFS for SMBIOS support) from + linux-modules-extra to linux-modules (LP: #2045561) + - [Packaging] Move dmi-sysfs.ko into linux-modules + + * Fix AMD brightness issue on AUO panel (LP: #2054773) + - drm/amdgpu: make damage clips support configurable + + * Mantic update: upstream stable patchset 2024-02-28 (LP: #2055199) + - f2fs: explicitly null-terminate the xattr list + - pinctrl: lochnagar: Don't build on MIPS + - ALSA: hda - Fix speaker and headset mic pin config for CHUWI CoreBook XPro + - mptcp: fix uninit-value in mptcp_incoming_options + - wifi: cfg80211: lock wiphy mutex for rfkill poll + - wifi: avoid offset calculation on NULL pointer + - wifi: mac80211: handle 320 MHz in ieee80211_ht_cap_ie_to_sta_ht_cap + - debugfs: fix automount d_fsdata usage + - nvme-core: fix a memory leak in nvme_ns_info_from_identify() + - drm/amd/display: update dcn315 lpddr pstate latency + - drm/amdgpu: Fix cat debugfs amdgpu_regs_didt causes kernel null pointer + - smb: client, common: fix fortify warnings + - blk-mq: don't count completed flush data request as inflight in case of + quiesce + - nvme-core: check for too small lba shift + - hwtracing: hisi_ptt: Handle the interrupt in hardirq context + - hwtracing: hisi_ptt: Don't try to attach a task + - ASoC: wm8974: Correct boost mixer inputs + - arm64: dts: rockchip: fix rk356x pcie msg interrupt name + - ASoC: Intel: Skylake: Fix mem leak in few functions + - ASoC: nau8822: Fix incorrect type in assignment and cast to restricted + __be16 + - ASoC: Intel: Skylake: mem leak in skl register function + - ASoC: cs43130: Fix the position of const qualifier + - ASoC: cs43130: Fix incorrect frame delay configuration + - ASoC: rt5650: add mutex to avoid the jack detection failure + - ASoC: Intel: skl_hda_dsp_generic: Drop HDMI routes when HDMI is not + available + - nouveau/tu102: flush all pdbs on vmm flush + - ASoC: amd: yc: Add DMI entry to support System76 Pangolin 13 + - ASoC: hdac_hda: Conditionally register dais for HDMI and Analog + - net/tg3: fix race condition in tg3_reset_task() + - ASoC: da7219: Support low DC impedance headset + - nvme: introduce helper function to get ctrl state + - nvme: prevent potential spectre v1 gadget + - arm64: dts: rockchip: Fix PCI node addresses on rk3399-gru + - drm/amdgpu: Add NULL checks for function pointers + - drm/exynos: fix a potential error pointer dereference + - drm/exynos: fix a wrong error checking + - hwmon: (corsair-psu) Fix probe when built-in + - LoongArch: Preserve syscall nr across execve() + - clk: rockchip: rk3568: Add PLL rate for 292.5MHz + - clk: rockchip: rk3128: Fix HCLK_OTG gate register + - jbd2: correct the printing of write_flags in jbd2_write_superblock() + - jbd2: increase the journal IO's priority + - drm/crtc: Fix uninit-value bug in drm_mode_setcrtc + - neighbour: Don't let neigh_forced_gc() disable preemption for long + - platform/x86: intel-vbtn: Fix missing tablet-mode-switch events + - jbd2: fix soft lockup in journal_finish_inode_data_buffers() + - tracing: Have large events show up as '[LINE TOO BIG]' instead of nothing + - tracing: Add size check when printing trace_marker output + - stmmac: dwmac-loongson: drop useless check for compatible fallback + - MIPS: dts: loongson: drop incorrect dwmac fallback compatible + - tracing: Fix uaf issue when open the hist or hist_debug file + - ring-buffer: Do not record in NMI if the arch does not support cmpxchg in + NMI + - Input: psmouse - enable Synaptics InterTouch for ThinkPad L14 G1 + - reset: hisilicon: hi6220: fix Wvoid-pointer-to-enum-cast warning + - Input: atkbd - skip ATKBD_CMD_GETID in translated mode + - Input: i8042 - add nomux quirk for Acer P459-G2-M + - s390/scm: fix virtual vs physical address confusion + - ARC: fix spare error + - wifi: iwlwifi: pcie: avoid a NULL pointer dereference + - Input: xpad - add Razer Wolverine V2 support + - kselftest: alsa: fixed a print formatting warning + - HID: nintendo: fix initializer element is not constant error + - platform/x86: thinkpad_acpi: fix for incorrect fan reporting on some + ThinkPad systems + - ASoC: Intel: bytcr_rt5640: Add quirk for the Medion Lifetab S10346 + - ASoC: Intel: bytcr_rt5640: Add new swapped-speakers quirk + - ALSA: hda/realtek: Add quirks for ASUS Zenbook 2022 Models + - dm audit: fix Kconfig so DM_AUDIT depends on BLK_DEV_DM + - HID: nintendo: Prevent divide-by-zero on code + - smb: client: fix potential OOB in smb2_dump_detail() + - i2c: rk3x: fix potential spinlock recursion on poll + - drm/amd/display: get dprefclk ss info from integration info table + - pinctrl: cy8c95x0: Fix typo + - pinctrl: cy8c95x0: Fix get_pincfg + - virtio_blk: fix snprintf truncation compiler warning + - net: qrtr: ns: Return 0 if server port is not present + - ARM: sun9i: smp: fix return code check of of_property_match_string + - drm/crtc: fix uninitialized variable use + - ALSA: hda/realtek: Fix mute and mic-mute LEDs for HP Envy X360 13-ay0xxx + - ACPI: resource: Add another DMI match for the TongFang GMxXGxx + - ASoC: SOF: Intel: hda-codec: Delay the codec device registration + - ksmbd: don't allow O_TRUNC open on read-only share + - ksmbd: free ppace array on error in parse_dacl + - binder: use EPOLLERR from eventpoll.h + - binder: fix use-after-free in shinker's callback + - binder: fix trivial typo of binder_free_buf_locked() + - binder: fix comment on binder_alloc_new_buf() return value + - uio: Fix use-after-free in uio_open + - parport: parport_serial: Add Brainboxes BAR details + - parport: parport_serial: Add Brainboxes device IDs and geometry + - leds: ledtrig-tty: Free allocated ttyname buffer on deactivate + - PCI: Add ACS quirk for more Zhaoxin Root Ports + - coresight: etm4x: Fix width of CCITMIN field + - scripts/decode_stacktrace.sh: optionally use LLVM utilities + - pinctrl: s32cc: Avoid possible string truncation + - kunit: Warn if tests are slow + - kunit: Reset suite counter right before running tests + - io_uring: use fget/fput consistently + - block: warn once for each partition in bio_check_ro() + - drm/amdkfd: Use common function for IP version check + - drm/amdkfd: Free gang_ctx_bo and wptr_bo in pqm_uninit + - drm/amdgpu: Use another offset for GC 9.4.3 remap + - ASoC: amd: yc: Add HP 255 G10 into quirk table + - ASoC: SOF: topology: Fix mem leak in sof_dai_load() + - ASoC: fsl_xcvr: Enable 2 * TX bit clock for spdif only case + - ASoC: fsl_xcvr: refine the requested phy clock frequency + - ASoC: SOF: ipc4-topology: Add core_mask in struct snd_sof_pipeline + - ASoC: SOF: sof-audio: Modify logic for enabling/disabling topology cores + - ASoC: SOF: ipc4-topology: Correct data structures for the SRC module + - ASoC: SOF: ipc4-topology: Correct data structures for the GAIN module + - pds_vdpa: fix up format-truncation complaint + - pds_vdpa: clear config callback when status goes to 0 + - pds_vdpa: set features order + - nvme: ensure reset state check ordering + - nvme-ioctl: move capable() admin check to the end + - nvme: fix deadlock between reset and scan + - LoongArch: Apply dynamic relocations for LLD + - LoongArch: Set unwind stack type to unknown rather than set error flag + - soundwire: intel_ace2x: fix AC timing setting for ACE2.x + - efi/loongarch: Use load address to calculate kernel entry address + - pinctrl: amd: Mask non-wake source pins with interrupt enabled at suspend + - ASoC: cs35l45: Use modern pm_ops + - ASoC: cs35l45: Prevent IRQ handling when suspending/resuming + - ASoC: cs35l45: Prevents spinning during runtime suspend + - driver core: Add a guard() definition for the device_lock() + - platform/x86/amd/pmc: Move platform defines to header + - platform/x86/amd/pmc: Only run IRQ1 firmware version check on Cezanne + - platform/x86/amd/pmc: Move keyboard wakeup disablement detection to pmc- + quirks + - platform/x86/amd/pmc: Disable keyboard wakeup on AMD Framework 13 + - drm/amdkfd: svm range always mapped flag not working on APU + - drm/amd/display: Add case for dcn35 to support usb4 dmub hpd event + - pinctrl: cy8c95x0: Fix regression + - posix-timers: Get rid of [COMPAT_]SYS_NI() uses + - nfc: Do not send datagram if socket state isn't LLCP_BOUND + - x86/csum: Remove unnecessary odd handling + - x86/csum: clean up `csum_partial' further + - x86/microcode: do not cache microcode if it will not be used + - bus: moxtet: Mark the irq as shared + - bus: moxtet: Add spi device table + - drm/amd/display: Pass pwrseq inst for backlight and ABM + - Upstream stable to v6.1.74, v6.6.13 + + * Mantic update: upstream stable patchset 2024-02-27 (LP: #2055002) + - Revert "nfsd: call nfsd_last_thread() before final nfsd_put()" + - cifs: fix flushing folio regression for 6.1 backport + - Upstream stable to v6.1.73, v6.6.12 + + * Mantic update: upstream stable patchset 2024-02-26 (LP: #2054779) + - keys, dns: Fix missing size check of V1 server-list header + - ALSA: hda/realtek: enable SND_PCI_QUIRK for hp pavilion 14-ec1xxx series + - ALSA: hda/realtek: fix mute/micmute LEDs for a HP ZBook + - ALSA: hda/realtek: Fix mute and mic-mute LEDs for HP ProBook 440 G6 + - mptcp: prevent tcp diag from closing listener subflows + - Revert "PCI/ASPM: Remove pcie_aspm_pm_state_change()" + - drm/mgag200: Fix gamma lut not initialized for G200ER, G200EV, G200SE + - cifs: cifs_chan_is_iface_active should be called with chan_lock held + - cifs: do not depend on release_iface for maintaining iface_list + - wifi: iwlwifi: pcie: don't synchronize IRQs from IRQ + - drm/bridge: ti-sn65dsi86: Never store more than msg->size bytes in AUX xfer + - netfilter: nf_tables: set transport offset from mac header for netdev/egress + - nfc: llcp_core: Hold a ref to llcp_local->dev when holding a ref to + llcp_local + - octeontx2-af: Fix marking couple of structure as __packed + - drm/i915/dp: Fix passing the correct DPCD_REV for + drm_dp_set_phy_test_pattern + - ice: Fix link_down_on_close message + - ice: Shut down VSI with "link-down-on-close" enabled + - i40e: Fix filter input checks to prevent config with invalid values + - igc: Report VLAN EtherType matching back to user + - igc: Check VLAN TCI mask + - igc: Check VLAN EtherType mask + - ASoC: fsl_rpmsg: Fix error handler with pm_runtime_enable + - ASoC: mediatek: mt8186: fix AUD_PAD_TOP register and offset + - mlxbf_gige: fix receive packet race condition + - net: sched: em_text: fix possible memory leak in em_text_destroy() + - r8169: Fix PCI error on system resume + - net: Implement missing getsockopt(SO_TIMESTAMPING_NEW) + - selftests: bonding: do not set port down when adding to bond + - ARM: sun9i: smp: Fix array-index-out-of-bounds read in sunxi_mc_smp_init + - sfc: fix a double-free bug in efx_probe_filters + - net: bcmgenet: Fix FCS generation for fragmented skbuffs + - netfilter: nft_immediate: drop chain reference counter on error + - net: Save and restore msg_namelen in sock_sendmsg + - i40e: fix use-after-free in i40e_aqc_add_filters() + - ASoC: meson: g12a-toacodec: Validate written enum values + - ASoC: meson: g12a-tohdmitx: Validate written enum values + - ASoC: meson: g12a-toacodec: Fix event generation + - ASoC: meson: g12a-tohdmitx: Fix event generation for S/PDIF mux + - i40e: Restore VF MSI-X state during PCI reset + - igc: Fix hicredit calculation + - net/qla3xxx: fix potential memleak in ql_alloc_buffer_queues + - net/smc: fix invalid link access in dumping SMC-R connections + - octeontx2-af: Always configure NIX TX link credits based on max frame size + - octeontx2-af: Re-enable MAC TX in otx2_stop processing + - asix: Add check for usbnet_get_endpoints + - net: ravb: Wait for operating mode to be applied + - bnxt_en: Remove mis-applied code from bnxt_cfg_ntp_filters() + - net: Implement missing SO_TIMESTAMPING_NEW cmsg support + - bpf: Support new 32bit offset jmp instruction + - mm: merge folio_has_private()/filemap_release_folio() call pairs + - mm, netfs, fscache: stop read optimisation when folio removed from pagecache + - smb: client: fix missing mode bits for SMB symlinks + - ALSA: hda/realtek: Add quirk for Lenovo Yoga Pro 7 + - firewire: ohci: suppress unexpected system reboot in AMD Ryzen machines and + ASM108x/VT630x PCIe cards + - x86/kprobes: fix incorrect return address calculation in + kprobe_emulate_call_indirect + - i2c: core: Fix atomic xfer check for non-preempt config + - mm: fix unmap_mapping_range high bits shift bug + - drm/amdgpu: skip gpu_info fw loading on navi12 + - drm/amd/display: add nv12 bounding box + - mmc: meson-mx-sdhc: Fix initialization frozen issue + - mmc: rpmb: fixes pause retune on all RPMB partitions. + - mmc: core: Cancel delayed work before releasing host + - mmc: sdhci-sprd: Fix eMMC init failure after hw reset + - bpf: Fix a verifier bug due to incorrect branch offset comparison with + cpu=v4 + - media: qcom: camss: Comment CSID dt_id field + - Revert "interconnect: qcom: sm8250: Enable sync_state" + - drm/amd/display: pbn_div need be updated for hotplug event + - accel/qaic: Fix GEM import path code + - accel/qaic: Implement quirk for SOC_HW_VERSION + - drm/bridge: parade-ps8640: Never store more than msg->size bytes in AUX xfer + - drm/bridge: ps8640: Fix size mismatch warning w/ len + - drm/i915/perf: Update handling of MMIO triggered reports + - igc: Check VLAN EtherType mask + - netfilter: nf_nat: fix action not being set for all ct states + - virtio_net: avoid data-races on dev->stats fields + - mm: convert DAX lock/unlock page to lock/unlock folio + - mm/memory-failure: pass the folio and the page to collect_procs() + - tcp: derive delack_max from rto_min + - bpftool: Fix -Wcast-qual warning + - bpftool: Align output skeleton ELF code + - crypto: xts - use 'spawn' for underlying single-block cipher + - crypto: qat - fix double free during reset + - crypto: hisilicon/qm - fix EQ/AEQ interrupt issue + - vfio/mtty: Overhaul mtty interrupt handling + - clk: si521xx: Increase stack based print buffer size in probe + - RDMA/mlx5: Fix mkey cache WQ flush + - rcu: Break rcu_node_0 --> &rq->__lock order + - rcu: Introduce rcu_cpu_online() + - rcu/tasks: Handle new PF_IDLE semantics + - rcu/tasks-trace: Handle new PF_IDLE semantics + - KVM: s390: vsie: fix wrong VIR 37 when MSO is used + - dmaengine: ti: k3-psil-am62: Fix SPI PDMA data + - dmaengine: ti: k3-psil-am62a: Fix SPI PDMA data + - iio: imu: adis16475: use bit numbers in assign_bit() + - iommu/vt-d: Support enforce_cache_coherency only for empty domains + - phy: mediatek: mipi: mt8183: fix minimal supported frequency + - phy: sunplus: return negative error code in sp_usb_phy_probe + - clk: rockchip: rk3128: Fix aclk_peri_src's parent + - clk: rockchip: rk3128: Fix SCLK_SDMMC's clock name + - drm/i915: Call intel_pre_plane_updates() also for pipes getting enabled + - drm/amd/display: Increase num voltage states to 40 + - cxl: Add cxl_decoders_committed() helper + - cxl/core: Always hold region_rwsem while reading poison lists + - kernel/resource: Increment by align value in get_free_mem_region() + - drm/amd/display: Increase frame warning limit with KASAN or KCSAN in dml + - dmaengine: idxd: Protect int_handle field in hw descriptor + - RISCV: KVM: update external interrupt atomically for IMSIC swfile + - powerpc/pseries/vas: Migration suspend waits for no in-progress open windows + - net: prevent mss overflow in skb_segment() + - cxl/pmu: Ensure put_device on pmu devices + - net: libwx: fix memory leak on free page + - net: constify sk_dst_get() and __sk_dst_get() argument + - mm/mglru: skip special VMAs in lru_gen_look_around() + - cxl: Add cxl_num_decoders_committed() usage to cxl_test + - cxl/hdm: Fix a benign lockdep splat + - cxl/memdev: Hold region_rwsem during inject and clear poison ops + + * kvm: Running perf against qemu processes results in page fault inside guest + (LP: #2054218) // Mantic update: upstream stable patchset 2024-02-26 + (LP: #2054779) + - KVM: x86/pmu: fix masking logic for MSR_CORE_PERF_GLOBAL_CTRL + + * smb: wsize blocks of bytes followed with binary zeros on copy, destroying + data (LP: #2049634) + - smb: Fix regression in writes when non-standard maximum write size + negotiated + + * CVE-2024-1085 + - netfilter: nf_tables: check if catch-all set element is active in next + generation + + * move_mount mediation does not detect if source is detached (LP: #2052662) + - apparmor: Fix move_mount mediation by detecting if source is detached + + * CVE-2023-46838 + - xen-netback: don't produce zero-size SKB frags + + * CVE-2024-1086 + - netfilter: nf_tables: reject QUEUE/DROP verdict parameters + + * Validate connection interval to pass Bluetooth Test Suite (LP: #2052005) + - Bluetooth: Enforce validation on max value of connection interval + + * Sound: Add rtl quirk of M70-Gen5 (LP: #2051947) + - ALSA: hda/realtek: Enable headset mic on Lenovo M70 Gen5 + + * Fix spurious wakeup caused by Cirque touchpad (LP: #2051896) + - HID: i2c-hid: Remove I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV quirk + - HID: i2c-hid: Renumber I2C_HID_QUIRK_ defines + - HID: i2c-hid: Skip SET_POWER SLEEP for Cirque touchpad on system suspend + + * Mantic update: upstream stable patchset 2024-02-09 (LP: #2052792) + - ksmbd: switch to use kmemdup_nul() helper + - ksmbd: add support for read compound + - ksmbd: fix wrong interim response on compound + - ksmbd: fix `force create mode' and `force directory mode' + - ksmbd: Fix one kernel-doc comment + - ksmbd: add missing calling smb2_set_err_rsp() on error + - ksmbd: remove experimental warning + - ksmbd: remove unneeded mark_inode_dirty in set_info_sec() + - ksmbd: fix passing freed memory 'aux_payload_buf' + - ksmbd: return invalid parameter error response if smb2 request is invalid + - ksmbd: check iov vector index in ksmbd_conn_write() + - ksmbd: fix race condition with fp + - ksmbd: fix race condition from parallel smb2 logoff requests + - ksmbd: fix race condition between tree conn lookup and disconnect + - ksmbd: fix wrong error response status by using set_smb2_rsp_status() + - ksmbd: fix Null pointer dereferences in ksmbd_update_fstate() + - ksmbd: fix potential double free on smb2_read_pipe() error path + - ksmbd: Remove unused field in ksmbd_user struct + - ksmbd: reorganize ksmbd_iov_pin_rsp() + - ksmbd: fix kernel-doc comment of ksmbd_vfs_setxattr() + - ksmbd: fix missing RDMA-capable flag for IPoIB device in + ksmbd_rdma_capable_netdev() + - ksmbd: add support for surrogate pair conversion + - ksmbd: no need to wait for binded connection termination at logoff + - ksmbd: fix kernel-doc comment of ksmbd_vfs_kern_path_locked() + - ksmbd: prevent memory leak on error return + - ksmbd: separately allocate ci per dentry + - ksmbd: move oplock handling after unlock parent dir + - ksmbd: release interim response after sending status pending response + - ksmbd: move setting SMB2_FLAGS_ASYNC_COMMAND and AsyncId + - ksmbd: don't update ->op_state as OPLOCK_STATE_NONE on error + - ksmbd: set epoch in create context v2 lease + - ksmbd: set v2 lease capability + - ksmbd: downgrade RWH lease caching state to RH for directory + - ksmbd: send v2 lease break notification for directory + - ksmbd: lazy v2 lease break on smb2_write() + - ksmbd: avoid duplicate opinfo_put() call on error of smb21_lease_break_ack() + - ksmbd: fix wrong allocation size update in smb2_open() + - linux/export: Ensure natural alignment of kcrctab array + - block: renumber QUEUE_FLAG_HW_WC + - platform/x86: p2sb: Allow p2sb_bar() calls during PCI device probe + - mm/filemap: avoid buffered read/write race to read inconsistent data + - mm: migrate high-order folios in swap cache correctly + - mm/memory-failure: cast index to loff_t before shifting it + - mm/memory-failure: check the mapcount of the precise page + - ring-buffer: Fix wake ups when buffer_percent is set to 100 + - tracing: Fix blocked reader of snapshot buffer + - NFSD: fix possible oops when nfsd/pool_stats is closed. + - Revert "platform/x86: p2sb: Allow p2sb_bar() calls during PCI device probe" + - fs: cifs: Fix atime update check + - linux/export: Fix alignment for 64-bit ksymtab entries + - mptcp: refactor sndbuf auto-tuning + - mptcp: fix possible NULL pointer dereference on close + - mptcp: fix inconsistent state on fastopen race + - platform/x86/intel/pmc: Add suspend callback + - platform/x86/intel/pmc: Allow reenabling LTRs + - platform/x86/intel/pmc: Move GBE LTR ignore to suspend callback + - selftests: secretmem: floor the memory size to the multiple of page_size + - Revert "nvme-fc: fix race between error recovery and creating association" + - ftrace: Fix modification of direct_function hash while in use + - Upstream stable to v6.1.71, v6.6.10 + + * Mantic update: upstream stable patchset 2024-02-06 (LP: #2052499) + - kasan: disable kasan_non_canonical_hook() for HW tags + - bpf: Fix prog_array_map_poke_run map poke update + - ARM: dts: dra7: Fix DRA7 L3 NoC node register size + - ARM: OMAP2+: Fix null pointer dereference and memory leak in + omap_soc_device_init + - reset: Fix crash when freeing non-existent optional resets + - s390/vx: fix save/restore of fpu kernel context + - wifi: iwlwifi: pcie: add another missing bh-disable for rxq->lock + - wifi: mac80211: check if the existing link config remains unchanged + - wifi: mac80211: mesh: check element parsing succeeded + - wifi: mac80211: mesh_plink: fix matches_local logic + - Revert "net/mlx5e: fix double free of encap_header in update funcs" + - Revert "net/mlx5e: fix double free of encap_header" + - net/mlx5e: Fix slab-out-of-bounds in mlx5_query_nic_vport_mac_list() + - net/mlx5: Re-organize mlx5_cmd struct + - net/mlx5e: Fix a race in command alloc flow + - net/mlx5e: fix a potential double-free in fs_udp_create_groups + - net/mlx5: Fix fw tracer first block check + - net/mlx5e: Correct snprintf truncation handling for fw_version buffer + - net/mlx5e: Correct snprintf truncation handling for fw_version buffer used + by representors + - net: mscc: ocelot: fix eMAC TX RMON stats for bucket 256-511 and above + - octeontx2-pf: Fix graceful exit during PFC configuration failure + - net: Return error from sk_stream_wait_connect() if sk_wait_event() fails + - net: sched: ife: fix potential use-after-free + - ethernet: atheros: fix a memleak in atl1e_setup_ring_resources + - net/rose: fix races in rose_kill_by_device() + - Bluetooth: Fix deadlock in vhci_send_frame + - Bluetooth: hci_event: shut up a false-positive warning + - net: mana: select PAGE_POOL + - net: check vlan filter feature in vlan_vids_add_by_dev() and + vlan_vids_del_by_dev() + - afs: Fix the dynamic root's d_delete to always delete unused dentries + - afs: Fix dynamic root lookup DNS check + - net: check dev->gso_max_size in gso_features_check() + - keys, dns: Allow key types (eg. DNS) to be reclaimed immediately on expiry + - afs: Fix overwriting of result of DNS query + - afs: Fix use-after-free due to get/remove race in volume tree + - ASoC: hdmi-codec: fix missing report for jack initial status + - ASoC: fsl_sai: Fix channel swap issue on i.MX8MP + - i2c: aspeed: Handle the coalesced stop conditions with the start conditions. + - x86/xen: add CPU dependencies for 32-bit build + - pinctrl: at91-pio4: use dedicated lock class for IRQ + - gpiolib: cdev: add gpio_device locking wrapper around gpio_ioctl() + - nvme-pci: fix sleeping function called from interrupt context + - interconnect: Treat xlate() returning NULL node as an error + - iio: imu: inv_mpu6050: fix an error code problem in inv_mpu6050_read_raw + - Input: ipaq-micro-keys - add error handling for devm_kmemdup + - scsi: bnx2fc: Fix skb double free in bnx2fc_rcv() + - iio: common: ms_sensors: ms_sensors_i2c: fix humidity conversion time table + - iio: adc: ti_am335x_adc: Fix return value check of tiadc_request_dma() + - iio: triggered-buffer: prevent possible freeing of wrong buffer + - ALSA: usb-audio: Increase delay in MOTU M quirk + - usb-storage: Add quirk for incorrect WP on Kingston DT Ultimate 3.0 G3 + - wifi: cfg80211: Add my certificate + - wifi: cfg80211: fix certs build to not depend on file order + - USB: serial: ftdi_sio: update Actisense PIDs constant names + - USB: serial: option: add Quectel EG912Y module support + - USB: serial: option: add Foxconn T99W265 with new baseline + - USB: serial: option: add Quectel RM500Q R13 firmware support + - ALSA: hda/realtek: Add quirk for ASUS ROG GV302XA + - Bluetooth: hci_event: Fix not checking if HCI_OP_INQUIRY has been sent + - Bluetooth: MGMT/SMP: Fix address type when using SMP over BREDR/LE + - Bluetooth: Add more enc key size check + - net: usb: ax88179_178a: avoid failed operations when device is disconnected + - Input: soc_button_array - add mapping for airplane mode button + - net: 9p: avoid freeing uninit memory in p9pdu_vreadf + - net: rfkill: gpio: set GPIO direction + - net: ks8851: Fix TX stall caused by TX buffer overrun + - dt-bindings: nvmem: mxs-ocotp: Document fsl,ocotp + - smb: client: fix OOB in cifsd when receiving compounded resps + - smb: client: fix potential OOB in cifs_dump_detail() + - smb: client: fix OOB in SMB2_query_info_init() + - drm/i915: Reject async flips with bigjoiner + - 9p: prevent read overrun in protocol dump tracepoint + - btrfs: zoned: no longer count fresh BG region as zone unusable + - ubifs: fix possible dereference after free + - ublk: move ublk_cancel_dev() out of ub->mutex + - selftests: mptcp: join: fix subflow_send_ack lookup + - Revert "scsi: aacraid: Reply queue mapping to CPUs based on IRQ affinity" + - scsi: core: Always send batch on reset or error handling command + - tracing / synthetic: Disable events after testing in + synth_event_gen_test_init() + - dm-integrity: don't modify bio's immutable bio_vec in integrity_metadata() + - pinctrl: starfive: jh7100: ignore disabled device tree nodes + - bus: ti-sysc: Flush posted write only after srst_udelay + - gpio: dwapb: mask/unmask IRQ when disable/enale it + - lib/vsprintf: Fix %pfwf when current node refcount == 0 + - thunderbolt: Fix memory leak in margining_port_remove() + - KVM: arm64: vgic: Simplify kvm_vgic_destroy() + - KVM: arm64: vgic: Add a non-locking primitive for kvm_vgic_vcpu_destroy() + - KVM: arm64: vgic: Force vcpu vgic teardown on vcpu destroy + - x86/alternatives: Sync core before enabling interrupts + - mm/damon/core: make damon_start() waits until kdamond_fn() starts + - wifi: cfg80211: fix CQM for non-range use + - wifi: nl80211: fix deadlock in nl80211_set_cqm_rssi (6.6.x) + - mm/damon/core: use number of passed access sampling as a timer + - btrfs: qgroup: iterate qgroups without memory allocation for + qgroup_reserve() + - btrfs: qgroup: use qgroup_iterator in qgroup_convert_meta() + - btrfs: free qgroup pertrans reserve on transaction abort + - drm/i915: Fix FEC state dump + - drm/i915: Introduce crtc_state->enhanced_framing + - drm/i915/edp: don't write to DP_LINK_BW_SET when using rate select + - drm: Fix FD ownership check in drm_master_check_perm() + - platform/x86/intel/pmc: Fix hang in pmc_core_send_ltr_ignore() + - SUNRPC: Revert 5f7fc5d69f6e92ec0b38774c387f5cf7812c5806 + - wifi: ieee80211: don't require protected vendor action frames + - wifi: mac80211: don't re-add debugfs during reconfig + - wifi: mac80211: check defragmentation succeeded + - ice: fix theoretical out-of-bounds access in ethtool link modes + - bpf: syzkaller found null ptr deref in unix_bpf proto add + - net/mlx5e: Fix overrun reported by coverity + - net/mlx5e: XDP, Drop fragmented packets larger than MTU size + - net/mlx5: Refactor mlx5_flow_destination->rep pointer to vport num + - net/mlx5e: Fix error code in mlx5e_tc_action_miss_mapping_get() + - net/mlx5e: Fix error codes in alloc_branch_attr() + - net: mscc: ocelot: fix pMAC TX RMON stats for bucket 256-511 and above + - Bluetooth: Fix not notifying when connection encryption changes + - Bluetooth: hci_core: Fix hci_conn_hash_lookup_cis + - bnxt_en: do not map packet buffers twice + - net: phy: skip LED triggers on PHYs on SFP modules + - ice: stop trashing VF VSI aggregator node ID information + - ice: Fix PF with enabled XDP going no-carrier after reset + - net: ethernet: mtk_wed: fix possible NULL pointer dereference in + mtk_wed_wo_queue_tx_clean() + - drm/i915/hwmon: Fix static analysis tool reported issues + - drm/i915/mtl: Fix HDMI/DP PLL clock selection + - i2c: qcom-geni: fix missing clk_disable_unprepare() and + geni_se_resources_off() + - drm/amdgpu: re-create idle bo's PTE during VM state machine reset + - interconnect: qcom: sm8250: Enable sync_state + - scsi: ufs: qcom: Return ufs_qcom_clk_scale_*() errors in + ufs_qcom_clk_scale_notify() + - scsi: ufs: core: Let the sq_lock protect sq_tail_slot access + - iio: kx022a: Fix acceleration value scaling + - iio: adc: imx93: add four channels for imx93 adc + - iio: imu: adis16475: add spi_device_id table + - iio: tmag5273: fix temperature offset + - ARM: dts: Fix occasional boot hang for am3 usb + - wifi: mt76: fix crash with WED rx support enabled + - ASoC: tas2781: check the validity of prm_no/cfg_no + - usb: typec: ucsi: fix gpio-based orientation detection + - usb: fotg210-hcd: delete an incorrect bounds test + - net: avoid build bug in skb extension length calculation + - nfsd: call nfsd_last_thread() before final nfsd_put() + - ring-buffer: Fix 32-bit rb_time_read() race with rb_time_cmpxchg() + - ring-buffer: Remove useless update to write_stamp in rb_try_to_discard() + - ring-buffer: Fix slowpath of interrupted event + - spi: atmel: Do not cancel a transfer upon any signal + - spi: atmel: Prevent spi transfers from being killed + - spi: atmel: Fix clock issue when using devices with different polarities + - nvmem: brcm_nvram: store a copy of NVRAM content + - pinctrl: starfive: jh7110: ignore disabled device tree nodes + - x86/alternatives: Disable interrupts and sync when optimizing NOPs in place + - x86/smpboot/64: Handle X2APIC BIOS inconsistency gracefully + - spi: cadence: revert "Add SPI transfer delays" + - Upstream stable to v6.1.70, v6.6.9 + + * Mantic update: upstream stable patchset 2024-02-01 (LP: #2051924) + - r8152: add vendor/device ID pair for D-Link DUB-E250 + - r8152: add vendor/device ID pair for ASUS USB-C2500 + - ext4: fix warning in ext4_dio_write_end_io() + - ksmbd: fix memory leak in smb2_lock() + - afs: Fix refcount underflow from error handling race + - HID: lenovo: Restrict detection of patched firmware only to USB cptkbd + - net/mlx5e: Fix possible deadlock on mlx5e_tx_timeout_work + - net: ipv6: support reporting otherwise unknown prefix flags in RTM_NEWPREFIX + - qca_debug: Prevent crash on TX ring changes + - qca_debug: Fix ethtool -G iface tx behavior + - qca_spi: Fix reset behavior + - bnxt_en: Fix wrong return value check in bnxt_close_nic() + - bnxt_en: Fix HWTSTAMP_FILTER_ALL packet timestamp logic + - atm: solos-pci: Fix potential deadlock on &cli_queue_lock + - atm: solos-pci: Fix potential deadlock on &tx_queue_lock + - net: fec: correct queue selection + - octeontx2-af: fix a use-after-free in rvu_nix_register_reporters + - octeontx2-pf: Fix promisc mcam entry action + - octeontx2-af: Update RSS algorithm index + - iavf: Introduce new state machines for flow director + - iavf: Handle ntuple on/off based on new state machines for flow director + - qed: Fix a potential use-after-free in qed_cxt_tables_alloc + - net: Remove acked SYN flag from packet in the transmit queue correctly + - net: ena: Destroy correct number of xdp queues upon failure + - net: ena: Fix xdp drops handling due to multibuf packets + - net: ena: Fix XDP redirection error + - stmmac: dwmac-loongson: Make sure MDIO is initialized before use + - sign-file: Fix incorrect return values check + - vsock/virtio: Fix unsigned integer wrap around in + virtio_transport_has_space() + - dpaa2-switch: fix size of the dma_unmap + - dpaa2-switch: do not ask for MDB, VLAN and FDB replay + - net: stmmac: Handle disabled MDIO busses from devicetree + - net: atlantic: fix double free in ring reinit logic + - cred: switch to using atomic_long_t + - fuse: dax: set fc->dax to NULL in fuse_dax_conn_free() + - ALSA: hda/hdmi: add force-connect quirk for NUC5CPYB + - ALSA: hda/hdmi: add force-connect quirks for ASUSTeK Z170 variants + - ALSA: hda/realtek: Apply mute LED quirk for HP15-db + - PCI: loongson: Limit MRRS to 256 + - ksmbd: fix wrong name of SMB2_CREATE_ALLOCATION_SIZE + - drm/mediatek: Add spinlock for setting vblank event in atomic_begin + - x86/hyperv: Fix the detection of E820_TYPE_PRAM in a Gen2 VM + - usb: aqc111: check packet for fixup for true limit + - stmmac: dwmac-loongson: Add architecture dependency + - [Config] updateconfigs for DWMAC_LOONGSON + - blk-throttle: fix lockdep warning of "cgroup_mutex or RCU read lock + required!" + - blk-cgroup: bypass blkcg_deactivate_policy after destroying + - bcache: avoid oversize memory allocation by small stripe_size + - bcache: remove redundant assignment to variable cur_idx + - bcache: add code comments for bch_btree_node_get() and + __bch_btree_node_alloc() + - bcache: avoid NULL checking to c->root in run_cache_set() + - nbd: fold nbd config initialization into nbd_alloc_config() + - nvme-auth: set explanation code for failure2 msgs + - nvme: catch errors from nvme_configure_metadata() + - selftests/bpf: fix bpf_loop_bench for new callback verification scheme + - LoongArch: Add dependency between vmlinuz.efi and vmlinux.efi + - LoongArch: Implement constant timer shutdown interface + - platform/x86: intel_telemetry: Fix kernel doc descriptions + - HID: glorious: fix Glorious Model I HID report + - HID: add ALWAYS_POLL quirk for Apple kb + - nbd: pass nbd_sock to nbd_read_reply() instead of index + - HID: hid-asus: reset the backlight brightness level on resume + - HID: multitouch: Add quirk for HONOR GLO-GXXX touchpad + - asm-generic: qspinlock: fix queued_spin_value_unlocked() implementation + - net: usb: qmi_wwan: claim interface 4 for ZTE MF290 + - arm64: add dependency between vmlinuz.efi and Image + - HID: hid-asus: add const to read-only outgoing usb buffer + - btrfs: do not allow non subvolume root targets for snapshot + - soundwire: stream: fix NULL pointer dereference for multi_link + - ext4: prevent the normalized size from exceeding EXT_MAX_BLOCKS + - arm64: mm: Always make sw-dirty PTEs hw-dirty in pte_modify + - team: Fix use-after-free when an option instance allocation fails + - drm/amdgpu/sdma5.2: add begin/end_use ring callbacks + - dmaengine: stm32-dma: avoid bitfield overflow assertion + - mm/mglru: fix underprotected page cache + - mm/shmem: fix race in shmem_undo_range w/THP + - btrfs: free qgroup reserve when ORDERED_IOERR is set + - btrfs: don't clear qgroup reserved bit in release_folio + - drm/amdgpu: fix tear down order in amdgpu_vm_pt_free + - drm/amd/display: Disable PSR-SU on Parade 0803 TCON again + - drm/i915: Fix remapped stride with CCS on ADL+ + - smb: client: fix NULL deref in asn1_ber_decoder() + - smb: client: fix OOB in smb2_query_reparse_point() + - ring-buffer: Fix memory leak of free page + - tracing: Update snapshot buffer on resize if it is allocated + - ring-buffer: Do not update before stamp when switching sub-buffers + - ring-buffer: Have saved event hold the entire event + - ring-buffer: Fix writing to the buffer with max_data_size + - ring-buffer: Fix a race in rb_time_cmpxchg() for 32 bit archs + - ring-buffer: Do not try to put back write_stamp + - ring-buffer: Have rb_time_cmpxchg() set the msb counter too + - net/mlx5e: Honor user choice of IPsec replay window size + - net/mlx5e: Ensure that IPsec sequence packet number starts from 1 + - RDMA/mlx5: Send events from IB driver about device affiliation state + - net/mlx5e: Disable IPsec offload support if not FW steering + - net/mlx5e: TC, Don't offload post action rule if not supported + - net/mlx5: Nack sync reset request when HotPlug is enabled + - net/mlx5e: Check netdev pointer before checking its net ns + - net/mlx5: Fix a NULL vs IS_ERR() check + - bnxt_en: Fix skb recycling logic in bnxt_deliver_skb() + - net/sched: act_ct: Take per-cb reference to tcf_ct_flow_table + - octeon_ep: explicitly test for firmware ready value + - octeontx2-af: Fix pause frame configuration + - iavf: Fix iavf_shutdown to call iavf_remove instead iavf_close + - net: ena: Fix DMA syncing in XDP path when SWIOTLB is on + - net: stmmac: dwmac-qcom-ethqos: Fix drops in 10M SGMII RX + - cred: get rid of CONFIG_DEBUG_CREDENTIALS + - [Config] updateconfigs for DEBUG_CREDENTIALS + - HID: i2c-hid: Add IDEA5002 to i2c_hid_acpi_blacklist[] + - HID: Add quirk for Labtec/ODDOR/aikeec handbrake + - fuse: share lookup state between submount and its parent + - io_uring/cmd: fix breakage in SOCKET_URING_OP_SIOC* implementation + - PCI/ASPM: Add pci_enable_link_state_locked() + - PCI: vmd: Fix potential deadlock when enabling ASPM + - drm/mediatek: fix kernel oops if no crtc is found + - drm/i915/selftests: Fix engine reset count storage for multi-tile + - drm/i915: Use internal class when counting engine resets + - selftests/mm: cow: print ksft header before printing anything else + - rxrpc: Fix some minor issues with bundle tracing + - nbd: factor out a helper to get nbd_config without holding 'config_lock' + - nbd: fix null-ptr-dereference while accessing 'nbd->config' + - LoongArch: Record pc instead of offset in la_abs relocation + - LoongArch: Silence the boot warning about 'nokaslr' + - HID: mcp2221: Set driver data before I2C adapter add + - HID: mcp2221: Allow IO to start during probe + - HID: apple: add Jamesdonkey and A3R to non-apple keyboards list + - nfc: virtual_ncidev: Add variable to check if ndev is running + - scripts/checkstack.pl: match all stack sizes for s390 + - cxl/hdm: Fix dpa translation locking + - Revert "selftests: error out if kernel header files are not yet built" + - drm/mediatek: Fix access violation in mtk_drm_crtc_dma_dev_get + - mm/mglru: try to stop at high watermarks + - mm/mglru: respect min_ttl_ms with memcgs + - mm/mglru: reclaim offlined memcgs harder + - btrfs: fix qgroup_free_reserved_data int overflow + - drm/edid: also call add modes in EDID connector update fallback + - drm/i915: Fix ADL+ tiled plane stride when the POT stride is smaller than + the original + - drm/i915: Fix intel_atomic_setup_scalers() plane_state handling + - smb: client: fix potential OOBs in smb2_parse_contexts() + - x86/speculation, objtool: Use absolute relocations for annotations + - RDMA/mlx5: Change the key being sent for MPV device affiliation + - Upstream stable to v6.1.69, v6.6.8 + + * CVE-2023-50431 + - accel/habanalabs: fix information leak in sec_attest_info() + + * CVE-2024-22705 + - ksmbd: fix slab-out-of-bounds in smb_strndup_from_utf16() + + -- Roxana Nicolescu Thu, 07 Mar 2024 17:27:48 +0100 + +linux (6.5.0-25.25) mantic; urgency=medium + + * mantic/linux: 6.5.0-25.25 -proposed tracker (LP: #2052615) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/2024.02.05) + + * [SRU][22.04.04]: mpi3mr driver update (LP: #2045233) + - scsi: mpi3mr: Invoke soft reset upon TSU or event ack time out + - scsi: mpi3mr: Update MPI Headers to version 3.00.28 + - scsi: mpi3mr: Add support for more than 1MB I/O + - scsi: mpi3mr: WRITE SAME implementation + - scsi: mpi3mr: Enhance handling of devices removed after controller reset + - scsi: mpi3mr: Update driver version to 8.5.0.0.0 + - scsi: mpi3mr: Split off bus_reset function from host_reset + - scsi: mpi3mr: Add support for SAS5116 PCI IDs + - scsi: mpi3mr: Add PCI checks where SAS5116 diverges from SAS4116 + - scsi: mpi3mr: Increase maximum number of PHYs to 64 from 32 + - scsi: mpi3mr: Add support for status reply descriptor + - scsi: mpi3mr: driver version upgrade to 8.5.0.0.50 + - scsi: mpi3mr: Refresh sdev queue depth after controller reset + - scsi: mpi3mr: Clean up block devices post controller reset + - scsi: mpi3mr: Block PEL Enable Command on Controller Reset and Unrecoverable + State + - scsi: mpi3mr: Fetch correct device dev handle for status reply descriptor + - scsi: mpi3mr: Support for preallocation of SGL BSG data buffers part-1 + - scsi: mpi3mr: Support for preallocation of SGL BSG data buffers part-2 + - scsi: mpi3mr: Support for preallocation of SGL BSG data buffers part-3 + - scsi: mpi3mr: Update driver version to 8.5.1.0.0 + + * The display becomes frozen after some time when a HDMI device is connected. + (LP: #2049027) + - drm/i915/dmc: Don't enable any pipe DMC events + + * Audio balancing setting doesn't work with the cirrus codec (LP: #2051050) + - ALSA: hda/cs8409: Suppress vmaster control for Dolphin models + + * partproke is broken on empty loopback device (LP: #2049689) + - block: Move checking GENHD_FL_NO_PART to bdev_add_partition() + + * CVE-2023-51780 + - atm: Fix Use-After-Free in do_vcc_ioctl + + * CVE-2023-6915 + - ida: Fix crash in ida_free when the bitmap is empty + + * Update Ubuntu.md (LP: #2051176) + - [Packaging] update Ubuntu.md + + * test_021_aslr_dapper_libs from ubuntu_qrt_kernel_security failed on K-5.19 / + J-OEM-6.1 / J-6.2 AMD64 (LP: #1983357) + - [Config]: set ARCH_MMAP_RND_{COMPAT_, }BITS to the maximum + + * Intel E810-XXV - NETDEV WATCHDOG: (ice): transmit queue timed out + (LP: #2036239) + - ice: Add driver support for firmware changes for LAG + - ice: alter feature support check for SRIOV and LAG + + * Mantic update: upstream stable patchset 2024-01-29 (LP: #2051584) + - Upstream stable to v6.1.67, v6.6.6 + - vdpa/mlx5: preserve CVQ vringh index + - hrtimers: Push pending hrtimers away from outgoing CPU earlier + - i2c: designware: Fix corrupted memory seen in the ISR + - netfilter: ipset: fix race condition between swap/destroy and kernel side + add/del/test + - zstd: Fix array-index-out-of-bounds UBSAN warning + - tg3: Move the [rt]x_dropped counters to tg3_napi + - tg3: Increment tx_dropped in tg3_tso_bug() + - kconfig: fix memory leak from range properties + - drm/amdgpu: correct chunk_ptr to a pointer to chunk. + - x86: Introduce ia32_enabled() + - x86/coco: Disable 32-bit emulation by default on TDX and SEV + - x86/entry: Convert INT 0x80 emulation to IDTENTRY + - x86/entry: Do not allow external 0x80 interrupts + - x86/tdx: Allow 32-bit emulation by default + - dt: dt-extract-compatibles: Handle cfile arguments in generator function + - dt: dt-extract-compatibles: Don't follow symlinks when walking tree + - platform/x86: asus-wmi: Move i8042 filter install to shared asus-wmi code + - of: dynamic: Fix of_reconfig_get_state_change() return value documentation + - platform/x86: wmi: Skip blocks with zero instances + - ipv6: fix potential NULL deref in fib6_add() + - octeontx2-pf: Add missing mutex lock in otx2_get_pauseparam + - octeontx2-af: Check return value of nix_get_nixlf before using nixlf + - hv_netvsc: rndis_filter needs to select NLS + - r8152: Rename RTL8152_UNPLUG to RTL8152_INACCESSIBLE + - r8152: Add RTL8152_INACCESSIBLE checks to more loops + - r8152: Add RTL8152_INACCESSIBLE to r8156b_wait_loading_flash() + - r8152: Add RTL8152_INACCESSIBLE to r8153_pre_firmware_1() + - r8152: Add RTL8152_INACCESSIBLE to r8153_aldps_en() + - mlxbf-bootctl: correctly identify secure boot with development keys + - platform/mellanox: Add null pointer checks for devm_kasprintf() + - platform/mellanox: Check devm_hwmon_device_register_with_groups() return + value + - arcnet: restoring support for multiple Sohard Arcnet cards + - octeontx2-pf: consider both Rx and Tx packet stats for adaptive interrupt + coalescing + - net: stmmac: fix FPE events losing + - xsk: Skip polling event check for unbound socket + - octeontx2-af: fix a use-after-free in rvu_npa_register_reporters + - i40e: Fix unexpected MFS warning message + - iavf: validate tx_coalesce_usecs even if rx_coalesce_usecs is zero + - tcp: fix mid stream window clamp. + - ionic: fix snprintf format length warning + - ionic: Fix dim work handling in split interrupt mode + - ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit() + - net: atlantic: Fix NULL dereference of skb pointer in + - net: hns: fix wrong head when modify the tx feature when sending packets + - net: hns: fix fake link up on xge port + - octeontx2-af: Adjust Tx credits when MCS external bypass is disabled + - octeontx2-af: Fix mcs sa cam entries size + - octeontx2-af: Fix mcs stats register address + - octeontx2-af: Add missing mcs flr handler call + - octeontx2-af: Update Tx link register range + - dt-bindings: interrupt-controller: Allow #power-domain-cells + - netfilter: nf_tables: fix 'exist' matching on bigendian arches + - netfilter: nf_tables: validate family when identifying table via handle + - netfilter: xt_owner: Fix for unsafe access of sk->sk_socket + - tcp: do not accept ACK of bytes we never sent + - bpf: sockmap, updating the sg structure should also update curr + - psample: Require 'CAP_NET_ADMIN' when joining "packets" group + - drop_monitor: Require 'CAP_SYS_ADMIN' when joining "events" group + - mm/damon/sysfs: eliminate potential uninitialized variable warning + - tee: optee: Fix supplicant based device enumeration + - RDMA/hns: Fix unnecessary err return when using invalid congest control + algorithm + - RDMA/irdma: Do not modify to SQD on error + - RDMA/irdma: Add wait for suspend on SQD + - arm64: dts: rockchip: Expand reg size of vdec node for RK3328 + - arm64: dts: rockchip: Expand reg size of vdec node for RK3399 + - ASoC: fsl_sai: Fix no frame sync clock issue on i.MX8MP + - RDMA/rtrs-srv: Do not unconditionally enable irq + - RDMA/rtrs-clt: Start hb after path_up + - RDMA/rtrs-srv: Check return values while processing info request + - RDMA/rtrs-srv: Free srv_mr iu only when always_invalidate is true + - RDMA/rtrs-srv: Destroy path files after making sure no IOs in-flight + - RDMA/rtrs-clt: Fix the max_send_wr setting + - RDMA/rtrs-clt: Remove the warnings for req in_use check + - RDMA/bnxt_re: Correct module description string + - RDMA/irdma: Refactor error handling in create CQP + - RDMA/irdma: Fix UAF in irdma_sc_ccq_get_cqe_info() + - hwmon: (acpi_power_meter) Fix 4.29 MW bug + - ASoC: codecs: lpass-tx-macro: set active_decimator correct default value + - hwmon: (nzxt-kraken2) Fix error handling path in kraken2_probe() + - ASoC: wm_adsp: fix memleak in wm_adsp_buffer_populate + - RDMA/core: Fix umem iterator when PAGE_SIZE is greater then HCA pgsz + - RDMA/irdma: Avoid free the non-cqp_request scratch + - drm/bridge: tc358768: select CONFIG_VIDEOMODE_HELPERS + - arm64: dts: imx8mp: imx8mq: Add parkmode-disable-ss-quirk on DWC3 + - ARM: dts: imx6ul-pico: Describe the Ethernet PHY clock + - tracing: Fix a warning when allocating buffered events fails + - scsi: be2iscsi: Fix a memleak in beiscsi_init_wrb_handle() + - ARM: imx: Check return value of devm_kasprintf in imx_mmdc_perf_init + - ARM: dts: imx7: Declare timers compatible with fsl,imx6dl-gpt + - ARM: dts: imx28-xea: Pass the 'model' property + - riscv: fix misaligned access handling of C.SWSP and C.SDSP + - md: don't leave 'MD_RECOVERY_FROZEN' in error path of md_set_readonly() + - rethook: Use __rcu pointer for rethook::handler + - kprobes: consistent rcu api usage for kretprobe holder + - ASoC: amd: yc: Fix non-functional mic on ASUS E1504FA + - nvme-pci: Add sleep quirk for Kingston drives + - io_uring: fix mutex_unlock with unreferenced ctx + - ALSA: usb-audio: Add Pioneer DJM-450 mixer controls + - ALSA: pcm: fix out-of-bounds in snd_pcm_state_names + - ALSA: hda/realtek: add new Framework laptop to quirks + - ALSA: hda/realtek: Add Framework laptop 16 to quirks + - ring-buffer: Test last update in 32bit version of __rb_time_read() + - nilfs2: fix missing error check for sb_set_blocksize call + - nilfs2: prevent WARNING in nilfs_sufile_set_segment_usage() + - cgroup_freezer: cgroup_freezing: Check if not frozen + - checkstack: fix printed address + - tracing: Always update snapshot buffer size + - tracing: Disable snapshot buffer when stopping instance tracers + - tracing: Fix incomplete locking when disabling buffered events + - tracing: Fix a possible race when disabling buffered events + - packet: Move reference count in packet_sock to atomic_long_t + - r8169: fix rtl8125b PAUSE frames blasting when suspended + - regmap: fix bogus error on regcache_sync success + - platform/surface: aggregator: fix recv_buf() return value + - hugetlb: fix null-ptr-deref in hugetlb_vma_lock_write + - mm: fix oops when filemap_map_pmd() without prealloc_pte + - powercap: DTPM: Fix missing cpufreq_cpu_put() calls + - md/raid6: use valid sector values to determine if an I/O should wait on the + reshape + - arm64: dts: mediatek: mt7622: fix memory node warning check + - arm64: dts: mediatek: mt8183-kukui-jacuzzi: fix dsi unnecessary cells + properties + - arm64: dts: mediatek: cherry: Fix interrupt cells for MT6360 on I2C7 + - arm64: dts: mediatek: mt8173-evb: Fix regulator-fixed node names + - arm64: dts: mediatek: mt8195: Fix PM suspend/resume with venc clocks + - arm64: dts: mediatek: mt8183: Fix unit address for scp reserved memory + - arm64: dts: mediatek: mt8183: Move thermal-zones to the root node + - arm64: dts: mediatek: mt8183-evb: Fix unit_address_vs_reg warning on ntc + - coresight: etm4x: Remove bogous __exit annotation for some functions + - hwtracing: hisi_ptt: Add dummy callback pmu::read() + - misc: mei: client.c: return negative error code in mei_cl_write + - misc: mei: client.c: fix problem of return '-EOVERFLOW' in mei_cl_write + - LoongArch: BPF: Don't sign extend memory load operand + - LoongArch: BPF: Don't sign extend function return value + - ring-buffer: Force absolute timestamp on discard of event + - tracing: Set actual size after ring buffer resize + - tracing: Stop current tracer when resizing buffer + - parisc: Reduce size of the bug_table on 64-bit kernel by half + - parisc: Fix asm operand number out of range build error in bug table + - arm64: dts: mediatek: add missing space before { + - arm64: dts: mt8183: kukui: Fix underscores in node names + - x86/sev: Fix kernel crash due to late update to read-only ghcb_version + - gpiolib: sysfs: Fix error handling on failed export + - drm/amd/amdgpu: Fix warnings in amdgpu/amdgpu_display.c + - drm/amdgpu: Add I2C EEPROM support on smu v13_0_6 + - usb: gadget: f_hid: fix report descriptor allocation + - serial: 8250_dw: Add ACPI ID for Granite Rapids-D UART + - parport: Add support for Brainboxes IX/UC/PX parallel cards + - cifs: Fix non-availability of dedup breaking generic/304 + - Revert "xhci: Loosen RPM as default policy to cover for AMD xHC 1.1" + - smb: client: fix potential NULL deref in parse_dfs_referrals() + - ARM: PL011: Fix DMA support + - serial: sc16is7xx: address RX timeout interrupt errata + - serial: 8250: 8250_omap: Clear UART_HAS_RHR_IT_DIS bit + - serial: 8250: 8250_omap: Do not start RX DMA on THRI interrupt + - serial: 8250_omap: Add earlycon support for the AM654 UART controller + - devcoredump: Send uevent once devcd is ready + - x86/CPU/AMD: Check vendor in the AMD microcode callback + - USB: gadget: core: adjust uevent timing on gadget unbind + - cifs: Fix flushing, invalidation and file size with copy_file_range() + - cifs: Fix flushing, invalidation and file size with FICLONE + - MIPS: kernel: Clear FPU states when setting up kernel threads + - KVM: s390/mm: Properly reset no-dat + - KVM: SVM: Update EFER software model on CR0 trap for SEV-ES + - MIPS: Loongson64: Reserve vgabios memory on boot + - MIPS: Loongson64: Handle more memory types passed from firmware + - MIPS: Loongson64: Enable DMA noncoherent support + - riscv: Kconfig: Add select ARM_AMBA to SOC_STARFIVE + - [Config] updateconfigs after enabling ARM_AMBA on riscv + - scsi: sd: Fix sshdr use in sd_suspend_common() + - nouveau: use an rwlock for the event lock. + - modpost: fix section mismatch message for RELA + - drm/amdgpu: Do not program VF copy regs in mmhub v1.8 under SRIOV (v2) + - drm/amdgpu: finalizing mem_partitions at the end of GMC v9 sw_fini + - dm-crypt: start allocating with MAX_ORDER + - r8152: Hold the rtnl_lock for all of reset + - net: dsa: microchip: provide a list of valid protocols for xmit handler + - net/smc: fix missing byte order conversion in CLC handshake + - RDMA/core: Fix uninit-value access in ib_get_eth_speed() + - ARM: dts: imx6q: skov: fix ethernet clock regression + - ARM: dts: rockchip: Fix sdmmc_pwren's pinmux setting for RK3128 + - ARM: dts: bcm2711-rpi-400: Fix delete-node of led_act + - firmware: arm_scmi: Extend perf protocol ops to get number of domains + - firmware: arm_scmi: Extend perf protocol ops to get information of a domain + - firmware: arm_scmi: Fix frequency truncation by promoting multiplier type + - firmware: arm_scmi: Simplify error path in scmi_dvfs_device_opps_add() + - RDMA/irdma: Ensure iWarp QP queue memory is OS paged aligned + - RDMA/irdma: Fix support for 64k pages + - io_uring/kbuf: Fix an NULL vs IS_ERR() bug in io_alloc_pbuf_ring() + - io_uring/kbuf: check for buffer list readiness after NULL check + - arm64: dts: imx8-ss-lsio: Add PWM interrupts + - arm64: dts: freescale: imx8-ss-lsio: Fix #pwm-cells + - arm64: dts: imx93: correct mediamix power + - arm64: dts: imx8-apalis: set wifi regulator to always-on + - arm64: dts: rockchip: Fix eMMC Data Strobe PD on rk3588 + - scripts/gdb: fix lx-device-list-bus and lx-device-list-class + - ASoC: amd: yc: Fix non-functional mic on ASUS E1504FA + - ALSA: hda/realtek: Apply quirk for ASUS UM3504DA + - ALSA: hda/realtek: fix speakers on XPS 9530 (2023) + - ALSA: hda/realtek: Add quirk for Lenovo Yoga Pro 7 + - lib/group_cpus.c: avoid acquiring cpu hotplug lock in group_cpus_evenly + - leds: trigger: netdev: fix RTNL handling to prevent potential deadlock + - nfp: flower: fix for take a mutex lock in soft irq context and rcu lock + - workqueue: Make sure that wq_unbound_cpumask is never empty + - drivers/base/cpu: crash data showing should depends on KEXEC_CORE + - mm/memory_hotplug: add missing mem_hotplug_lock + - mm/memory_hotplug: fix error handling in add_memory_resource() + - drm/atomic-helpers: Invoke end_fb_access while owning plane state + - drm/i915/mst: Fix .mode_valid_ctx() return values + - drm/i915/mst: Reject modes that require the bigjoiner + - arm64: dts: mt7986: change cooling trips + - arm64: dts: mt7986: define 3W max power to both SFP on BPI-R3 + - arm64: dts: mt7986: fix emmc hs400 mode without uboot initialization + - arm64: dts: mediatek: mt8186: fix clock names for power domains + - arm64: dts: mediatek: mt8186: Change gpu speedbin nvmem cell name + - coresight: Fix crash when Perf and sysfs modes are used concurrently + - coresight: ultrasoc-smb: Fix sleep while close preempt in enable_smb + - coresight: ultrasoc-smb: Config SMB buffer before register sink + - coresight: ultrasoc-smb: Fix uninitialized before use buf_hw_base + - ASoC: ops: add correct range check for limiting volume + - nvmem: Do not expect fixed layouts to grab a layout driver + - serial: ma35d1: Validate console index before assignment + - powerpc/ftrace: Fix stack teardown in ftrace_no_trace + - perf metrics: Avoid segv if default metricgroup isn't set + - ASoC: qcom: sc8280xp: Limit speaker digital volumes + - gcc-plugins: randstruct: Update code comment in relayout_struct() + - drm/amdgpu: Fix refclk reporting for SMU v13.0.6 + - drm/amdgpu: Add bootloader status check + - drm/amdgpu: Add bootloader wait for PSP v13 + - drm/amdgpu: Restrict bootloader wait to SMUv13.0.6 + - drm/amdgpu: update retry times for psp vmbx wait + - drm/amdgpu: update retry times for psp BL wait + - drm/amdgpu: Restrict extended wait to PSP v13.0.6 + - Upstream stable to v6.1.68, v6.6.7 + + * i915 regression introduced with 5.5 kernel (LP: #2044131) + - drm/i915: Skip some timing checks on BXT/GLK DSI transcoders + + * Mantic update: upstream stable patchset 2024-01-26 (LP: #2051366) + - cifs: Fix FALLOC_FL_ZERO_RANGE by setting i_size if EOF moved + - cifs: Fix FALLOC_FL_INSERT_RANGE by setting i_size after EOF moved + - smb: client: report correct st_size for SMB and NFS symlinks + - pinctrl: avoid reload of p state in list iteration + - firewire: core: fix possible memory leak in create_units() + - mmc: sdhci-pci-gli: Disable LPM during initialization + - mmc: cqhci: Increase recovery halt timeout + - mmc: cqhci: Warn of halt or task clear failure + - mmc: cqhci: Fix task clearing in CQE error recovery + - mmc: block: Retry commands in CQE error recovery + - mmc: block: Do not lose cache flush during CQE error recovery + - mmc: block: Be sure to wait while busy in CQE error recovery + - ALSA: hda: Disable power-save on KONTRON SinglePC + - ALSA: hda/realtek: Headset Mic VREF to 100% + - ALSA: hda/realtek: Add supported ALC257 for ChromeOS + - dm-verity: align struct dm_verity_fec_io properly + - scsi: Change SCSI device boolean fields to single bit flags + - scsi: sd: Fix system start for ATA devices + - drm/amd: Enable PCIe PME from D3 + - drm/amdgpu: Force order between a read and write to the same address + - drm/amd/display: Include udelay when waiting for INBOX0 ACK + - drm/amd/display: Remove min_dst_y_next_start check for Z8 + - drm/amd/display: Use DRAM speed from validation for dummy p-state + - drm/amd/display: Update min Z8 residency time to 2100 for DCN314 + - drm/amd/display: fix ABM disablement + - dm verity: initialize fec io before freeing it + - dm verity: don't perform FEC for failed readahead IO + - nvme: check for valid nvme_identify_ns() before using it + - powercap: DTPM: Fix unneeded conversions to micro-Watts + - cpufreq/amd-pstate: Fix the return value of amd_pstate_fast_switch() + - dma-buf: fix check in dma_resv_add_fence + - bcache: revert replacing IS_ERR_OR_NULL with IS_ERR + - iommu/vt-d: Add MTL to quirk list to skip TE disabling + - KVM: PPC: Book3S HV: Fix KVM_RUN clobbering FP/VEC user registers + - powerpc: Don't clobber f0/vs0 during fp|altivec register save + - parisc: Mark ex_table entries 32-bit aligned in assembly.h + - parisc: Mark ex_table entries 32-bit aligned in uaccess.h + - parisc: Use natural CPU alignment for bug_table + - parisc: Mark lock_aligned variables 16-byte aligned on SMP + - parisc: Drop the HP-UX ENOSYM and EREMOTERELEASE error codes + - parisc: Mark jump_table naturally aligned + - parisc: Ensure 32-bit alignment on parisc unwind section + - parisc: Mark altinstructions read-only and 32-bit aligned + - btrfs: add dmesg output for first mount and last unmount of a filesystem + - btrfs: ref-verify: fix memory leaks in btrfs_ref_tree_mod() + - btrfs: fix off-by-one when checking chunk map includes logical address + - btrfs: send: ensure send_fd is writable + - btrfs: make error messages more clear when getting a chunk map + - btrfs: fix 64bit compat send ioctl arguments not initializing version member + - auxdisplay: hd44780: move cursor home after clear display command + - serial: sc16is7xx: Put IOControl register into regmap_volatile + - serial: sc16is7xx: add missing support for rs485 devicetree properties + - dpaa2-eth: increase the needed headroom to account for alignment + - uapi: propagate __struct_group() attributes to the container union + - selftests/net: ipsec: fix constant out of range + - selftests/net: fix a char signedness issue + - selftests/net: unix: fix unused variable compiler warning + - selftests/net: mptcp: fix uninitialized variable warnings + - octeontx2-af: Fix possible buffer overflow + - net: stmmac: xgmac: Disable FPE MMC interrupts + - octeontx2-pf: Fix adding mbox work queue entry when num_vfs > 64 + - octeontx2-af: Install TC filter rules in hardware based on priority + - octeontx2-pf: Restore TC ingress police rules when interface is up + - r8169: prevent potential deadlock in rtl8169_close + - ravb: Fix races between ravb_tx_timeout_work() and net related ops + - net: ravb: Check return value of reset_control_deassert() + - net: ravb: Use pm_runtime_resume_and_get() + - net: ravb: Make write access to CXR35 first before accessing other EMAC + registers + - net: ravb: Start TX queues after HW initialization succeeded + - net: ravb: Stop DMA in case of failures on ravb_open() + - net: ravb: Keep reverse order of operations in ravb_remove() + - octeontx2-af: Initialize 'cntr_val' to fix uninitialized symbol error + - spi: Fix null dereference on suspend + - cpufreq: imx6q: Don't disable 792 Mhz OPP unnecessarily + - iommu/vt-d: Omit devTLB invalidation requests when TES=0 + - iommu/vt-d: Disable PCI ATS in legacy passthrough mode + - iommu/vt-d: Make context clearing consistent with context mapping + - drm/amd/pm: fix a memleak in aldebaran_tables_init + - mmc: sdhci-sprd: Fix vqmmc not shutting down after the card was pulled + - drm/amd/display: Fix MPCC 1DLUT programming + - r8169: fix deadlock on RTL8125 in jumbo mtu mode + - xen: simplify evtchn_do_upcall() call maze + - x86/xen: fix percpu vcpu_info allocation + - smb: client: fix missing mode bits for SMB symlinks + - ksmbd: fix possible deadlock in smb2_open + - drm/i915: Also check for VGA converter in eDP probe + - net: libwx: fix memory leak on msix entry + - drm/amdgpu: correct the amdgpu runtime dereference usage count + - drm/amdgpu: fix memory overflow in the IB test + - drm/amdgpu: Update EEPROM I2C address for smu v13_0_0 + - drm/amd/display: force toggle rate wa for first link training for a retimer + - ACPI: video: Use acpi_video_device for cooling-dev driver data + - iommu/vt-d: Fix incorrect cache invalidation for mm notification + - io_uring: free io_buffer_list entries via RCU + - io_uring: don't guard IORING_OFF_PBUF_RING with SETUP_NO_MMAP + - iommu: Avoid more races around device probe + - ext2: Fix ki_pos update for DIO buffered-io fallback case + - btrfs: free the allocated memory if btrfs_alloc_page_array() fails + - io_uring/kbuf: recycle freed mapped buffer ring entries + - media: v4l2-subdev: Fix a 64bit bug + - netdevsim: Don't accept device bound programs + - net: rswitch: Fix type of ret in rswitch_start_xmit() + - net: rswitch: Fix return value in rswitch_start_xmit() + - net: rswitch: Fix missing dev_kfree_skb_any() in error path + - wifi: iwlwifi: mvm: fix an error code in iwl_mvm_mld_add_sta() + - wifi: mac80211: do not pass AP_VLAN vif pointer to drivers during flush + - net: dsa: mv88e6xxx: fix marvell 6350 switch probing + - dpaa2-eth: recycle the RX buffer only after all processing done + - bpf: Add missed allocation hint for bpf_mem_cache_alloc_flags() + - neighbour: Fix __randomize_layout crash in struct neighbour + - efi/unaccepted: Fix off-by-one when checking for overlapping ranges + - ethtool: don't propagate EOPNOTSUPP from dumps + - bpf, sockmap: af_unix stream sockets need to hold ref for pair sock + - powerpc/pseries/iommu: enable_ddw incorrectly returns direct mapping for SR- + IOV device + - s390/cmma: fix handling of swapper_pg_dir and invalid_pg_dir + - drm/amd/display: Refactor edp power control + - drm/amd/display: Remove power sequencing check + - drm/i915/gsc: Mark internal GSC engine with reserved uabi class + - drm/panel: starry-2081101qfh032011-53g: Fine tune the panel power sequence + - drm/panel: nt36523: fix return value check in nt36523_probe() + - cpufreq/amd-pstate: Fix scaling_min_freq and scaling_max_freq update + - cpufreq/amd-pstate: Only print supported EPP values for performance governor + - iommu: Fix printk arg in of_iommu_get_resv_regions() + - drm/amd/display: refactor ILR to make it work + - drm/amd/display: Reduce default backlight min from 5 nits to 1 nits + - Upstream stable to v6.1.66, v6.6.5 + + * Mantic update: upstream stable patchset 2024-01-25 (LP: #2051231) + - afs: Fix afs_server_list to be cleaned up with RCU + - afs: Make error on cell lookup failure consistent with OpenAFS + - drm/panel: auo,b101uan08.3: Fine tune the panel power sequence + - drm/panel: simple: Fix Innolux G101ICE-L01 bus flags + - drm/panel: simple: Fix Innolux G101ICE-L01 timings + - wireguard: use DEV_STATS_INC() + - octeontx2-pf: Fix memory leak during interface down + - ata: pata_isapnp: Add missing error check for devm_ioport_map() + - drm/i915: do not clean GT table on error path + - drm/rockchip: vop: Fix color for RGB888/BGR888 format on VOP full + - HID: fix HID device resource race between HID core and debugging support + - ipv4: Correct/silence an endian warning in __ip_do_redirect + - net: usb: ax88179_178a: fix failed operations during ax88179_reset + - net/smc: avoid data corruption caused by decline + - arm/xen: fix xen_vcpu_info allocation alignment + - octeontx2-pf: Fix ntuple rule creation to direct packet to VF with higher Rx + queue than its PF + - amd-xgbe: handle corner-case during sfp hotplug + - amd-xgbe: handle the corner-case during tx completion + - amd-xgbe: propagate the correct speed and duplex status + - net: axienet: Fix check for partial TX checksum + - afs: Return ENOENT if no cell DNS record can be found + - afs: Fix file locking on R/O volumes to operate in local mode + - arm64: mm: Fix "rodata=on" when CONFIG_RODATA_FULL_DEFAULT_ENABLED=y + - i40e: Fix adding unsupported cloud filters + - nvmet: nul-terminate the NQNs passed in the connect command + - USB: dwc3: qcom: fix resource leaks on probe deferral + - USB: dwc3: qcom: fix ACPI platform device leak + - lockdep: Fix block chain corruption + - cifs: distribute channels across interfaces based on speed + - cifs: account for primary channel in the interface list + - cifs: fix leak of iface for primary channel + - MIPS: KVM: Fix a build warning about variable set but not used + - media: qcom: Initialise V4L2 async notifier later + - media: qcom: camss: Fix V4L2 async notifier error path + - media: qcom: camss: Fix genpd cleanup + - NFSD: Fix "start of NFS reply" pointer passed to nfsd_cache_update() + - NFSD: Fix checksum mismatches in the duplicate reply cache + - ACPI: resource: Skip IRQ override on ASUS ExpertBook B1402CVA + - swiotlb-xen: provide the "max_mapping_size" method + - bcache: replace a mistaken IS_ERR() by IS_ERR_OR_NULL() in + btree_gc_coalesce() + - md: fix bi_status reporting in md_end_clone_io + - bcache: fixup multi-threaded bch_sectors_dirty_init() wake-up race + - io_uring/fs: consider link->flags when getting path for LINKAT + - s390/dasd: protect device queue against concurrent access + - USB: serial: option: add Luat Air72*U series products + - hv_netvsc: fix race of netvsc and VF register_netdevice + - hv_netvsc: Fix race of register_netdevice_notifier and VF register + - hv_netvsc: Mark VF as slave before exposing it to user-mode + - dm-delay: fix a race between delay_presuspend and delay_bio + - bcache: check return value from btree_node_alloc_replacement() + - bcache: prevent potential division by zero error + - bcache: fixup init dirty data errors + - bcache: fixup lock c->root error + - usb: cdnsp: Fix deadlock issue during using NCM gadget + - USB: serial: option: add Fibocom L7xx modules + - USB: serial: option: fix FM101R-GL defines + - USB: serial: option: don't claim interface 4 for ZTE MF290 + - usb: typec: tcpm: Skip hard reset when in error recovery + - USB: dwc2: write HCINT with INTMASK applied + - usb: dwc3: Fix default mode initialization + - usb: dwc3: set the dma max_seg_size + - USB: dwc3: qcom: fix software node leak on probe errors + - USB: dwc3: qcom: fix wakeup after probe deferral + - io_uring: fix off-by one bvec index + - irqchip/gic-v3-its: Flush ITS tables correctly in non-coherent GIC designs + - drm/msm/dsi: use the correct VREG_CTRL_1 value for 4nm cphy + - s390/ism: ism driver implies smc protocol + - rxrpc: Fix RTT determination to use any ACK as a source + - rxrpc: Defer the response to a PING ACK until we've parsed it + - blk-cgroup: avoid to warn !rcu_read_lock_held() in blkg_lookup() + - fs: Pass AT_GETATTR_NOSEC flag to getattr interface function + - net: wangxun: fix kernel panic due to null pointer + - filemap: add a per-mapping stable writes flag + - block: update the stable_writes flag in bdev_add + - PM: tools: Fix sleepgraph syntax error + - net, vrf: Move dstats structure to core + - net: Move {l,t,d}stats allocation to core and convert veth & vrf + - bpf: Fix dev's rx stats for bpf_redirect_peer traffic + - drm/panel: boe-tv101wum-nl6: Fine tune Himax83102-j02 panel HFP and HBP + - s390/ipl: add missing IPL_TYPE_ECKD_DUMP case to ipl_init() + - net: veth: fix ethtool stats reporting + - vsock/test: fix SEQPACKET message bounds test + - net: ipa: fix one GSI register field width + - nvme: blank out authentication fabrics options if not configured + - mm: add a NO_INHERIT flag to the PR_SET_MDWE prctl + - prctl: Disable prctl(PR_SET_MDWE) on parisc + - kselftest/arm64: Fix output formatting for za-fork + - drm/msm/dpu: Add missing safe_lut_tbl in sc8280xp catalog + - drm/ast: Disconnect BMC if physical connector is connected + - thunderbolt: Set lane bonding bit only for downstream port + - ACPI: video: Use acpi_device_fix_up_power_children() + - ACPI: processor_idle: use raw_safe_halt() in acpi_idle_play_dead() + - ACPI: resource: Skip IRQ override on ASUS ExpertBook B1402CVA + - ACPI: PM: Add acpi_device_fix_up_power_children() function + - tls: fix NULL deref on tls_sw_splice_eof() with empty record + - dt-bindings: usb: microchip,usb5744: Add second supply + - usb: misc: onboard-hub: add support for Microchip USB5744 + - platform/x86/amd/pmc: adjust getting DRAM size behavior + - ALSA: hda: ASUS UM5302LA: Added quirks for cs35L41/10431A83 on i2c bus + - ALSA: hda/realtek: Add quirks for ASUS 2024 Zenbooks + - veth: Use tstats per-CPU traffic counters + - USB: xhci-plat: fix legacy PHY double init + - usb: config: fix iteration issue in 'usb_get_bos_descriptor()' + - Upstream stable to v6.1.65, v6.6.4 + + * Mantic update: v6.5.13 upstream stable release (LP: #2051142) + - locking/ww_mutex/test: Fix potential workqueue corruption + - btrfs: abort transaction on generation mismatch when marking eb as dirty + - lib/generic-radix-tree.c: Don't overflow in peek() + - x86/retpoline: Make sure there are no unconverted return thunks due to KCSAN + - perf/core: Bail out early if the request AUX area is out of bound + - srcu: Fix srcu_struct node grpmask overflow on 64-bit systems + - selftests/lkdtm: Disable CONFIG_UBSAN_TRAP in test config + - clocksource/drivers/timer-imx-gpt: Fix potential memory leak + - clocksource/drivers/timer-atmel-tcb: Fix initialization on SAM9 hardware + - srcu: Only accelerate on enqueue time + - smp,csd: Throw an error if a CSD lock is stuck for too long + - cpu/hotplug: Don't offline the last non-isolated CPU + - workqueue: Provide one lock class key per work_on_cpu() callsite + - x86/mm: Drop the 4 MB restriction on minimal NUMA node memory size + - wifi: plfxlc: fix clang-specific fortify warning + - wifi: ath12k: Ignore fragments from uninitialized peer in dp + - wifi: mac80211_hwsim: fix clang-specific fortify warning + - wifi: mac80211: don't return unset power in ieee80211_get_tx_power() + - atl1c: Work around the DMA RX overflow issue + - bpf: Detect IP == ksym.end as part of BPF program + - wifi: ath9k: fix clang-specific fortify warnings + - wifi: ath12k: fix possible out-of-bound read in ath12k_htt_pull_ppdu_stats() + - wifi: ath10k: fix clang-specific fortify warning + - wifi: ath12k: fix possible out-of-bound write in + ath12k_wmi_ext_hal_reg_caps() + - ACPI: APEI: Fix AER info corruption when error status data has multiple + sections + - net: sfp: add quirk for Fiberstone GPON-ONU-34-20BI + - wifi: mt76: mt7921e: Support MT7992 IP in Xiaomi Redmibook 15 Pro (2023) + - net: annotate data-races around sk->sk_tx_queue_mapping + - net: annotate data-races around sk->sk_dst_pending_confirm + - wifi: ath12k: mhi: fix potential memory leak in ath12k_mhi_register() + - wifi: ath10k: Don't touch the CE interrupt registers after power up + - net: sfp: add quirk for FS's 2.5G copper SFP + - vsock: read from socket's error queue + - bpf: Ensure proper register state printing for cond jumps + - wifi: iwlwifi: mvm: fix size check for fw_link_id + - Bluetooth: btusb: Add date->evt_skb is NULL check + - Bluetooth: Fix double free in hci_conn_cleanup + - ACPI: EC: Add quirk for HP 250 G7 Notebook PC + - tsnep: Fix tsnep_request_irq() format-overflow warning + - gpiolib: acpi: Add a ignore interrupt quirk for Peaq C1010 + - platform/chrome: kunit: initialize lock for fake ec_dev + - of: address: Fix address translation when address-size is greater than 2 + - platform/x86: thinkpad_acpi: Add battery quirk for Thinkpad X120e + - drm/gma500: Fix call trace when psb_gem_mm_init() fails + - drm/amdkfd: ratelimited SQ interrupt messages + - drm/komeda: drop all currently held locks if deadlock happens + - drm/amd/display: Blank phantom OTG before enabling + - drm/amd/display: Don't lock phantom pipe on disabling + - drm/amd/display: add seamless pipe topology transition check + - drm/edid: Fixup h/vsync_end instead of h/vtotal + - md: don't rely on 'mddev->pers' to be set in mddev_suspend() + - drm/amdgpu: not to save bo in the case of RAS err_event_athub + - drm/amdkfd: Fix a race condition of vram buffer unref in svm code + - drm/amd: Update `update_pcie_parameters` functions to use uint8_t arguments + - drm/amd/display: use full update for clip size increase of large plane + source + - string.h: add array-wrappers for (v)memdup_user() + - kernel: kexec: copy user-array safely + - kernel: watch_queue: copy user-array safely + - drm_lease.c: copy user-array safely + - drm: vmwgfx_surface.c: copy user-array safely + - drm/msm/dp: skip validity check for DP CTS EDID checksum + - drm/amd: Fix UBSAN array-index-out-of-bounds for SMU7 + - drm/amd: Fix UBSAN array-index-out-of-bounds for Polaris and Tonga + - drm/amdgpu: Fix potential null pointer derefernce + - drm/panel: fix a possible null pointer dereference + - drm/panel/panel-tpo-tpg110: fix a possible null pointer dereference + - drm/radeon: fix a possible null pointer dereference + - drm/amdgpu/vkms: fix a possible null pointer dereference + - drm/panel: st7703: Pick different reset sequence + - drm/amdkfd: Fix shift out-of-bounds issue + - drm/amdgpu: Fix a null pointer access when the smc_rreg pointer is NULL + - drm/amd: Disable PP_PCIE_DPM_MASK when dynamic speed switching not supported + - drm/amd/display: fix num_ways overflow error + - drm/amd: check num of link levels when update pcie param + - arm64: dts: ls208xa: use a pseudo-bus to constrain usb dma size + - selftests/efivarfs: create-read: fix a resource leak + - ASoC: mediatek: mt8188-mt6359: support dynamic pinctrl + - ASoC: soc-card: Add storage for PCI SSID + - ASoC: SOF: Pass PCI SSID to machine driver + - crypto: pcrypt - Fix hungtask for PADATA_RESET + - ASoC: SOF: ipc4: handle EXCEPTION_CAUGHT notification from firmware + - RDMA/hfi1: Use FIELD_GET() to extract Link Width + - scsi: hisi_sas: Set debugfs_dir pointer to NULL after removing debugfs + - scsi: ibmvfc: Remove BUG_ON in the case of an empty event pool + - fs/jfs: Add check for negative db_l2nbperpage + - fs/jfs: Add validity check for db_maxag and db_agpref + - jfs: fix array-index-out-of-bounds in dbFindLeaf + - jfs: fix array-index-out-of-bounds in diAlloc + - HID: lenovo: Detect quirk-free fw on cptkbd and stop applying workaround + - ARM: 9320/1: fix stack depot IRQ stack filter + - ALSA: hda: Fix possible null-ptr-deref when assigning a stream + - gpiolib: of: Add quirk for mt2701-cs42448 ASoC sound + - PCI: tegra194: Use FIELD_GET()/FIELD_PREP() with Link Width fields + - PCI: mvebu: Use FIELD_PREP() with Link Width + - atm: iphase: Do PCI error checks on own line + - PCI: Do error check on own line to split long "if" conditions + - scsi: libfc: Fix potential NULL pointer dereference in fc_lport_ptp_setup() + - PCI: Use FIELD_GET() to extract Link Width + - PCI: Extract ATS disabling to a helper function + - PCI: Disable ATS for specific Intel IPU E2000 devices + - PCI: dwc: Add dw_pcie_link_set_max_link_width() + - PCI: dwc: Add missing PCI_EXP_LNKCAP_MLW handling + - misc: pci_endpoint_test: Add Device ID for R-Car S4-8 PCIe controller + - PCI: Use FIELD_GET() in Sapphire RX 5600 XT Pulse quirk + - ASoC: Intel: soc-acpi-cht: Add Lenovo Yoga Tab 3 Pro YT3-X90 quirk + - crypto: hisilicon/qm - prevent soft lockup in receive loop + - HID: Add quirk for Dell Pro Wireless Keyboard and Mouse KM5221W + - exfat: support handle zero-size directory + - mfd: intel-lpss: Add Intel Lunar Lake-M PCI IDs + - iio: adc: stm32-adc: harden against NULL pointer deref in stm32_adc_probe() + - thunderbolt: Apply USB 3.x bandwidth quirk only in software connection + manager + - tty: vcc: Add check for kstrdup() in vcc_probe() + - dt-bindings: phy: qcom,snps-eusb2-repeater: Add magic tuning overrides + - phy: qualcomm: phy-qcom-eusb2-repeater: Use regmap_fields + - phy: qualcomm: phy-qcom-eusb2-repeater: Zero out untouched tuning regs + - usb: dwc3: core: configure TX/RX threshold for DWC3_IP + - usb: ucsi: glink: use the connector orientation GPIO to provide switch + events + - soundwire: dmi-quirks: update HP Omen match + - f2fs: fix error path of __f2fs_build_free_nids + - f2fs: fix error handling of __get_node_page + - usb: host: xhci: Avoid XHCI resume delay if SSUSB device is not present + - usb: gadget: f_ncm: Always set current gadget in ncm_bind() + - 9p/trans_fd: Annotate data-racy writes to file::f_flags + - 9p: v9fs_listxattr: fix %s null argument warning + - i3c: mipi-i3c-hci: Fix out of bounds access in hci_dma_irq_handler + - i2c: i801: Add support for Intel Birch Stream SoC + - i2c: fix memleak in i2c_new_client_device() + - i2c: sun6i-p2wi: Prevent potential division by zero + - virtio-blk: fix implicit overflow on virtio_max_dma_size + - i3c: master: mipi-i3c-hci: Fix a kernel panic for accessing DAT_data. + - media: gspca: cpia1: shift-out-of-bounds in set_flicker + - media: vivid: avoid integer overflow + - media: ipu-bridge: increase sensor_name size + - gfs2: ignore negated quota changes + - gfs2: fix an oops in gfs2_permission + - media: cobalt: Use FIELD_GET() to extract Link Width + - media: ccs: Fix driver quirk struct documentation + - media: imon: fix access to invalid resource for the second interface + - drm/amd/display: Avoid NULL dereference of timing generator + - kgdb: Flush console before entering kgdb on panic + - riscv: VMAP_STACK overflow detection thread-safe + - i2c: dev: copy userspace array safely + - ASoC: ti: omap-mcbsp: Fix runtime PM underflow warnings + - drm/qxl: prevent memory leak + - ALSA: hda/realtek: Add quirk for ASUS UX7602ZM + - drm/amdgpu: fix software pci_unplug on some chips + - pwm: Fix double shift bug + - mtd: rawnand: tegra: add missing check for platform_get_irq() + - wifi: iwlwifi: Use FW rate for non-data frames + - sched/core: Optimize in_task() and in_interrupt() a bit + - samples/bpf: syscall_tp_user: Rename num_progs into nr_tests + - samples/bpf: syscall_tp_user: Fix array out-of-bound access + - dt-bindings: serial: fix regex pattern for matching serial node children + - SUNRPC: ECONNRESET might require a rebind + - mtd: rawnand: intel: check return value of devm_kasprintf() + - mtd: rawnand: meson: check return value of devm_kasprintf() + - drm/i915/mtl: avoid stringop-overflow warning + - NFSv4.1: fix handling NFS4ERR_DELAY when testing for session trunking + - SUNRPC: Add an IS_ERR() check back to where it was + - NFSv4.1: fix SP4_MACH_CRED protection for pnfs IO + - SUNRPC: Fix RPC client cleaned up the freed pipefs dentries + - RISC-V: hwprobe: Fix vDSO SIGSEGV + - riscv: provide riscv-specific is_trap_insn() + - gfs2: Silence "suspicious RCU usage in gfs2_permission" warning + - drm/i915/tc: Fix -Wformat-truncation in intel_tc_port_init + - vdpa_sim_blk: allocate the buffer zeroed + - vhost-vdpa: fix use after free in vhost_vdpa_probe() + - gcc-plugins: randstruct: Only warn about true flexible arrays + - bpf: handle ldimm64 properly in check_cfg() + - bpf: fix precision backtracking instruction iteration + - net: set SOCK_RCU_FREE before inserting socket into hashtable + - ipvlan: add ipvlan_route_v6_outbound() helper + - tty: Fix uninit-value access in ppp_sync_receive() + - xen/events: avoid using info_for_irq() in xen_send_IPI_one() + - net: hns3: fix add VLAN fail issue + - net: hns3: add barrier in vf mailbox reply process + - net: hns3: fix incorrect capability bit display for copper port + - net: hns3: fix out-of-bounds access may occur when coalesce info is read via + debugfs + - net: hns3: fix variable may not initialized problem in hns3_init_mac_addr() + - net: hns3: fix VF reset fail issue + - net: hns3: fix VF wrong speed and duplex issue + - tipc: Fix kernel-infoleak due to uninitialized TLV value + - net: mvneta: fix calls to page_pool_get_stats + - ppp: limit MRU to 64K + - xen/events: fix delayed eoi list handling + - blk-mq: make sure active queue usage is held for bio_integrity_prep() + - ptp: annotate data-race around q->head and q->tail + - bonding: stop the device in bond_setup_by_slave() + - net: ethernet: cortina: Fix max RX frame define + - net: ethernet: cortina: Handle large frames + - net: ethernet: cortina: Fix MTU max setting + - af_unix: fix use-after-free in unix_stream_read_actor() + - netfilter: nf_conntrack_bridge: initialize err to 0 + - netfilter: nf_tables: fix pointer math issue in nft_byteorder_eval() + - netfilter: nf_tables: bogus ENOENT when destroying element which does not + exist + - net: stmmac: fix rx budget limit check + - net: stmmac: avoid rx queue overrun + - pds_core: use correct index to mask irq + - pds_core: fix up some format-truncation complaints + - gve: Fixes for napi_poll when budget is 0 + - io_uring/fdinfo: remove need for sqpoll lock for thread/pid retrieval + - net/mlx5: Decouple PHC .adjtime and .adjphase implementations + - net/mlx5e: fix double free of encap_header + - net/mlx5e: fix double free of encap_header in update funcs + - net/mlx5e: Fix pedit endianness + - net/mlx5: Consolidate devlink documentation in devlink/mlx5.rst + - net/mlx5e: Make tx_port_ts logic resilient to out-of-order CQEs + - net/mlx5e: Add recovery flow for tx devlink health reporter for unhealthy + PTP SQ + - net/mlx5e: Update doorbell for port timestamping CQ before the software + counter + - net/mlx5: Increase size of irq name buffer + - net/mlx5e: Reduce the size of icosq_str + - net/mlx5e: Check return value of snprintf writing to fw_version buffer + - net/mlx5e: Check return value of snprintf writing to fw_version buffer for + representors + - net: sched: do not offload flows with a helper in act_ct + - macvlan: Don't propagate promisc change to lower dev in passthru + - tools/power/turbostat: Fix a knl bug + - tools/power/turbostat: Enable the C-state Pre-wake printing + - scsi: ufs: core: Expand MCQ queue slot to DeviceQueueDepth + 1 + - cifs: spnego: add ';' in HOST_KEY_LEN + - cifs: fix check of rc in function generate_smb3signingkey + - perf/core: Fix cpuctx refcounting + - i915/perf: Fix NULL deref bugs with drm_dbg() calls + - perf: arm_cspmu: Reject events meant for other PMUs + - drivers: perf: Check find_first_bit() return value + - media: venus: hfi: add checks to perform sanity on queue pointers + - perf intel-pt: Fix async branch flags + - powerpc/perf: Fix disabling BHRB and instruction sampling + - randstruct: Fix gcc-plugin performance mode to stay in group + - bpf: Fix check_stack_write_fixed_off() to correctly spill imm + - bpf: Fix precision tracking for BPF_ALU | BPF_TO_BE | BPF_END + - scsi: mpt3sas: Fix loop logic + - scsi: megaraid_sas: Increase register read retry rount from 3 to 30 for + selected registers + - scsi: ufs: qcom: Update PHY settings only when scaling to higher gears + - scsi: qla2xxx: Fix system crash due to bad pointer access + - scsi: ufs: core: Fix racing issue between ufshcd_mcq_abort() and ISR + - crypto: x86/sha - load modules based on CPU features + - x86/PCI: Avoid PME from D3hot/D3cold for AMD Rembrandt and Phoenix USB4 + - x86/apic/msi: Fix misconfigured non-maskable MSI quirk + - x86/cpu/hygon: Fix the CPU topology evaluation for real + - KVM: x86: hyper-v: Don't auto-enable stimer on write from user-space + - KVM: x86: Ignore MSR_AMD64_TW_CFG access + - KVM: x86: Clear bit12 of ICR after APIC-write VM-exit + - KVM: x86: Fix lapic timer interrupt lost after loading a snapshot. + - mmc: sdhci-pci-gli: GL9755: Mask the replay timer timeout of AER + - sched: psi: fix unprivileged polling against cgroups + - audit: don't take task_lock() in audit_exe_compare() code path + - audit: don't WARN_ON_ONCE(!current->mm) in audit_exe_compare() + - proc: sysctl: prevent aliased sysctls from getting passed to init + - tty/sysrq: replace smp_processor_id() with get_cpu() + - tty: serial: meson: fix hard LOCKUP on crtscts mode + - hvc/xen: fix console unplug + - hvc/xen: fix error path in xen_hvc_init() to always register frontend driver + - hvc/xen: fix event channel handling for secondary consoles + - PCI/sysfs: Protect driver's D3cold preference from user space + - mm/damon/sysfs: remove requested targets when online-commit inputs + - mm/damon/sysfs: update monitoring target regions for online input commit + - watchdog: move softlockup_panic back to early_param + - iommufd: Fix missing update of domains_itree after splitting iopt_area + - fbdev: stifb: Make the STI next font pointer a 32-bit signed offset + - dm crypt: account large pages in cc->n_allocated_pages + - mm/damon/lru_sort: avoid divide-by-zero in hot threshold calculation + - mm/damon/ops-common: avoid divide-by-zero during region hotness calculation + - mm/damon: implement a function for max nr_accesses safe calculation + - mm/damon/core: avoid divide-by-zero during monitoring results update + - mm/damon/sysfs-schemes: handle tried region directory allocation failure + - mm/damon/sysfs-schemes: handle tried regions sysfs directory allocation + failure + - mm/damon/sysfs: check error from damon_sysfs_update_target() + - parisc: Add nop instructions after TLB inserts + - ACPI: resource: Do IRQ override on TongFang GMxXGxx + - regmap: Ensure range selector registers are updated after cache sync + - wifi: ath11k: fix temperature event locking + - wifi: ath11k: fix dfs radar event locking + - wifi: ath11k: fix htt pktlog locking + - wifi: ath11k: fix gtk offload status event locking + - wifi: ath12k: fix htt mlo-offset event locking + - wifi: ath12k: fix dfs-radar and temperature event locking + - mmc: meson-gx: Remove setting of CMD_CFG_ERROR + - genirq/generic_chip: Make irq_remove_generic_chip() irqdomain aware + - sched/core: Fix RQCF_ACT_SKIP leak + - KEYS: trusted: tee: Refactor register SHM usage + - KEYS: trusted: Rollback init_trusted() consistently + - PCI: keystone: Don't discard .remove() callback + - PCI: keystone: Don't discard .probe() callback + - arm64: Restrict CPU_BIG_ENDIAN to GNU as or LLVM IAS 15.x or newer + - arm64: module: Fix PLT counting when CONFIG_RANDOMIZE_BASE=n + - parisc/agp: Use 64-bit LE values in SBA IOMMU PDIR table + - parisc/pdc: Add width field to struct pdc_model + - parisc/power: Add power soft-off when running on qemu + - cpufreq: stats: Fix buffer overflow detection in trans_stats() + - powercap: intel_rapl: Downgrade BIOS locked limits pr_warn() to pr_debug() + - clk: socfpga: Fix undefined behavior bug in struct stratix10_clock_data + - clk: visconti: Fix undefined behavior bug in struct visconti_pll_provider + - clk: qcom: ipq8074: drop the CLK_SET_RATE_PARENT flag from PLL clocks + - clk: qcom: ipq6018: drop the CLK_SET_RATE_PARENT flag from PLL clocks + - ksmbd: fix recursive locking in vfs helpers + - ksmbd: handle malformed smb1 message + - ksmbd: fix slab out of bounds write in smb_inherit_dacl() + - mmc: vub300: fix an error code + - mmc: sdhci_am654: fix start loop index for TAP value parsing + - mmc: Add quirk MMC_QUIRK_BROKEN_CACHE_FLUSH for Micron eMMC Q2J54A + - PCI/ASPM: Fix L1 substate handling in aspm_attr_store_common() + - PCI: kirin: Don't discard .remove() callback + - PCI: exynos: Don't discard .remove() callback + - wifi: wilc1000: use vmm_table as array in wilc struct + - svcrdma: Drop connection after an RDMA Read error + - rcu/tree: Defer setting of jiffies during stall reset + - arm64: dts: qcom: ipq6018: Fix hwlock index for SMEM + - dt-bindings: timer: renesas,rz-mtu3: Fix overflow/underflow interrupt names + - PM: hibernate: Use __get_safe_page() rather than touching the list + - PM: hibernate: Clean up sync_read handling in snapshot_write_next() + - rcu: kmemleak: Ignore kmemleak false positives when RCU-freeing objects + - btrfs: don't arbitrarily slow down delalloc if we're committing + - thermal: intel: powerclamp: fix mismatch in get function for max_idle + - arm64: dts: qcom: ipq5332: Fix hwlock index for SMEM + - arm64: dts: qcom: ipq8074: Fix hwlock index for SMEM + - firmware: qcom_scm: use 64-bit calling convention only when client is 64-bit + - ACPI: FPDT: properly handle invalid FPDT subtables + - arm64: dts: qcom: ipq9574: Fix hwlock index for SMEM + - arm64: dts: qcom: ipq6018: Fix tcsr_mutex register size + - leds: trigger: netdev: Move size check in set_device_name + - mfd: qcom-spmi-pmic: Fix reference leaks in revid helper + - mfd: qcom-spmi-pmic: Fix revid implementation + - ima: annotate iint mutex to avoid lockdep false positive warnings + - ima: detect changes to the backing overlay file + - netfilter: nf_tables: split async and sync catchall in two functions + - ASoC: soc-dai: add flag to mute and unmute stream during trigger + - ASoC: codecs: wsa883x: make use of new mute_unmute_on_trigger flag + - selftests/resctrl: Fix uninitialized .sa_flags + - selftests/resctrl: Remove duplicate feature check from CMT test + - selftests/resctrl: Move _GNU_SOURCE define into Makefile + - selftests/resctrl: Reduce failures due to outliers in MBA/MBM tests + - hid: lenovo: Resend all settings on reset_resume for compact keyboards + - ASoC: codecs: wsa-macro: fix uninitialized stack variables with name prefix + - jbd2: fix potential data lost in recovering journal raced with synchronizing + fs bdev + - quota: explicitly forbid quota files from being encrypted + - kernel/reboot: emergency_restart: Set correct system_state + - i2c: core: Run atomic i2c xfer when !preemptible + - selftests/clone3: Fix broken test under !CONFIG_TIME_NS + - tracing: Have the user copy of synthetic event address use correct context + - driver core: Release all resources during unbind before updating device + links + - mcb: fix error handling for different scenarios when parsing + - dmaengine: stm32-mdma: correct desc prep when channel running + - s390/mm: add missing arch_set_page_dat() call to vmem_crst_alloc() + - s390/cmma: fix detection of DAT pages + - mm/cma: use nth_page() in place of direct struct page manipulation + - mm/memory_hotplug: use pfn math in place of direct struct page manipulation + - mm: make PR_MDWE_REFUSE_EXEC_GAIN an unsigned long + - mtd: cfi_cmdset_0001: Byte swap OTP info + - cxl/region: Do not try to cleanup after cxl_region_setup_targets() fails + - i3c: master: cdns: Fix reading status register + - i3c: master: svc: fix race condition in ibi work thread + - i3c: master: svc: fix wrong data return when IBI happen during start frame + - i3c: master: svc: fix ibi may not return mandatory data byte + - i3c: master: svc: fix check wrong status register in irq handler + - i3c: master: svc: fix SDA keep low when polling IBIWON timeout happen + - i3c: master: svc: fix random hot join failure since timeout error + - cxl/region: Fix x1 root-decoder granularity calculations + - cxl/port: Fix delete_endpoint() vs parent unregistration race + - pmdomain: bcm: bcm2835-power: check if the ASB register is equal to enable + - pmdomain: amlogic: Fix mask for the second NNA mem PD domain + - pmdomain: imx: Make imx pgc power domain also set the fwnode + - PCI: qcom-ep: Add dedicated callback for writing to DBI2 registers + - PCI: Lengthen reset delay for VideoPropulsion Torrent QN16e card + - torture: Add a kthread-creation callback to _torture_create_kthread() + - torture: Add lock_torture writer_fifo module parameter + - torture: Make torture_hrtimeout_*() use TASK_IDLE + - torture: Move stutter_wait() timeouts to hrtimers + - torture: Make torture_hrtimeout_ns() take an hrtimer mode parameter + - rcutorture: Fix stuttering races and other issues + - mm/hugetlb: prepare hugetlb_follow_page_mask() for FOLL_PIN + - mm/hugetlb: use nth_page() in place of direct struct page manipulation + - parisc: Prevent booting 64-bit kernels on PA1.x machines + - parisc/pgtable: Do not drop upper 5 address bits of physical address + - parisc/power: Fix power soft-off when running on qemu + - xhci: Enable RPM on controllers that support low-power states + - fs: add ctime accessors infrastructure + - smb3: fix creating FIFOs when mounting with "sfu" mount option + - smb3: fix touch -h of symlink + - smb3: allow dumping session and tcon id to improve stats analysis and + debugging + - smb3: fix caching of ctime on setxattr + - smb: client: fix use-after-free bug in cifs_debug_data_proc_show() + - smb: client: fix use-after-free in smb2_query_info_compound() + - smb: client: fix potential deadlock when releasing mids + - cifs: reconnect helper should set reconnect for the right channel + - cifs: force interface update before a fresh session setup + - cifs: do not reset chan_max if multichannel is not supported at mount + - cifs: Fix encryption of cleared, but unset rq_iter data buffers + - xfs: recovery should not clear di_flushiter unconditionally + - btrfs: zoned: wait for data BG to be finished on direct IO allocation + - ALSA: info: Fix potential deadlock at disconnection + - ALSA: hda/realtek: Enable Mute LED on HP 255 G8 + - ALSA: hda/realtek - Add Dell ALC295 to pin fall back table + - ALSA: hda/realtek - Enable internal speaker of ASUS K6500ZC + - ALSA: hda/realtek: Enable Mute LED on HP 255 G10 + - ALSA: hda/realtek: Add quirks for HP Laptops + - Revert ncsi: Propagate carrier gain/loss events to the NCSI controller + - Revert "i2c: pxa: move to generic GPIO recovery" + - lsm: fix default return value for vm_enough_memory + - lsm: fix default return value for inode_getsecctx + - sbsa_gwdt: Calculate timeout with 64-bit math + - i2c: designware: Disable TX_EMPTY irq while waiting for block length byte + - s390/ap: fix AP bus crash on early config change callback invocation + - net: ethtool: Fix documentation of ethtool_sprintf() + - net: dsa: lan9303: consequently nested-lock physical MDIO + - net: phylink: initialize carrier state at creation + - gfs2: don't withdraw if init_threads() got interrupted + - i2c: i801: fix potential race in i801_block_transaction_byte_by_byte + - f2fs: do not return EFSCORRUPTED, but try to run online repair + - f2fs: set the default compress_level on ioctl + - f2fs: avoid format-overflow warning + - f2fs: split initial and dynamic conditions for extent_cache + - media: lirc: drop trailing space from scancode transmit + - media: sharp: fix sharp encoding + - media: venus: hfi_parser: Add check to keep the number of codecs within + range + - media: venus: hfi: fix the check to handle session buffer requirement + - media: venus: hfi: add checks to handle capabilities from firmware + - media: ccs: Correctly initialise try compose rectangle + - drm/mediatek/dp: fix memory leak on ->get_edid callback audio detection + - drm/mediatek/dp: fix memory leak on ->get_edid callback error path + - dm-bufio: fix no-sleep mode + - dm-verity: don't use blocking calls from tasklets + - nfsd: fix file memleak on client_opens_release + - NFSD: Update nfsd_cache_append() to use xdr_stream + - LoongArch: Mark __percpu functions as always inline + - riscv: Using TOOLCHAIN_HAS_ZIHINTPAUSE marco replace zihintpause + - riscv: put interrupt entries into .irqentry.text + - riscv: mm: Update the comment of CONFIG_PAGE_OFFSET + - riscv: correct pt_level name via pgtable_l5/4_enabled + - riscv: kprobes: allow writing to x0 + - mmc: sdhci-pci-gli: A workaround to allow GL9750 to enter ASPM L1.2 + - mm: fix for negative counter: nr_file_hugepages + - mm: kmem: drop __GFP_NOFAIL when allocating objcg vectors + - mptcp: deal with large GSO size + - mptcp: add validity check for sending RM_ADDR + - mptcp: fix setsockopt(IP_TOS) subflow locking + - selftests: mptcp: fix fastclose with csum failure + - mmc: sdhci-pci-gli: GL9750: Mask the replay timer timeout of AER + - media: qcom: camss: Fix pm_domain_on sequence in probe + - media: qcom: camss: Fix vfe_get() error jump + - media: qcom: camss: Fix VFE-17x vfe_disable_output() + - media: qcom: camss: Fix VFE-480 vfe_disable_output() + - media: qcom: camss: Fix missing vfe_lite clocks check + - media: qcom: camss: Fix set CSI2_RX_CFG1_VC_MODE when VC is greater than 3 + - media: qcom: camss: Fix invalid clock enable bit disjunction + - media: qcom: camss: Fix csid-gen2 for test pattern generator + - ext4: fix race between writepages and remount + - ext4: make sure allocate pending entry not fail + - ext4: apply umask if ACL support is disabled + - ext4: correct offset of gdb backup in non meta_bg group to update_backups + - ext4: mark buffer new if it is unwritten to avoid stale data exposure + - ext4: correct return value of ext4_convert_meta_bg + - ext4: correct the start block of counting reserved clusters + - ext4: remove gdb backup copy for meta bg in setup_new_flex_group_blocks + - ext4: add missed brelse in update_backups + - ext4: properly sync file size update after O_SYNC direct IO + - ext4: fix racy may inline data check in dio write + - drm/amd/pm: Handle non-terminated overdrive commands. + - drm: bridge: it66121: ->get_edid callback must not return err pointers + - drm/i915/mtl: Support HBR3 rate with C10 phy and eDP in MTL + - drm/i915: Bump GLK CDCLK frequency when driving multiple pipes + - drm/i915: Fix potential spectre vulnerability + - drm/i915: Flush WC GGTT only on required platforms + - drm/amdgpu/smu13: drop compute workload workaround + - drm/amdgpu: don't use pci_is_thunderbolt_attached() + - drm/amdgpu: fix GRBM read timeout when do mes_self_test + - drm/amdgpu: add a retry for IP discovery init + - drm/amdgpu: don't use ATRM for external devices + - drm/amdgpu: fix error handling in amdgpu_vm_init + - drm/amdgpu: fix error handling in amdgpu_bo_list_get() + - drm/amdgpu: lower CS errors to debug severity + - drm/amdgpu: Fix possible null pointer dereference + - drm/amd/display: Guard against invalid RPTR/WPTR being set + - drm/amd/display: Fix DSC not Enabled on Direct MST Sink + - drm/amd/display: fix a NULL pointer dereference in amdgpu_dm_i2c_xfer() + - drm/amd/display: Enable fast plane updates on DCN3.2 and above + - drm/amd/display: Change the DMCUB mailbox memory location from FB to inbox + - powerpc/powernv: Fix fortify source warnings in opal-prd.c + - tracing: Have trace_event_file have ref counters + - net/mlx5e: Avoid referencing skb after free-ing in drop path of + mlx5e_sq_xmit_wqe + - net/mlx5e: Track xmit submission to PTP WQ after populating metadata map + - Linux 6.5.13 + + * Mantic update: v6.5.12 upstream stable release (LP: #2051129) + - hwmon: (nct6775) Fix incorrect variable reuse in fan_div calculation + - numa: Generalize numa_map_to_online_node() + - sched/topology: Fix sched_numa_find_nth_cpu() in CPU-less case + - sched/topology: Fix sched_numa_find_nth_cpu() in non-NUMA case + - sched/fair: Fix cfs_rq_is_decayed() on !SMP + - iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user() + - sched/uclamp: Set max_spare_cap_cpu even if max_spare_cap is 0 + - sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0 + - objtool: Propagate early errors + - sched: Fix stop_one_cpu_nowait() vs hotplug + - nfsd: Handle EOPENSTALE correctly in the filecache + - vfs: fix readahead(2) on block devices + - writeback, cgroup: switch inodes with dirty timestamps to release dying + cgwbs + - x86/srso: Fix SBPB enablement for (possible) future fixed HW + - x86/srso: Print mitigation for retbleed IBPB case + - x86/srso: Fix vulnerability reporting for missing microcode + - x86/srso: Fix unret validation dependencies + - futex: Don't include process MM in futex key on no-MMU + - x86/numa: Introduce numa_fill_memblks() + - ACPI/NUMA: Apply SRAT proximity domain to entire CFMWS window + - x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot + - x86/boot: Fix incorrect startup_gdt_descr.size + - cpu/hotplug: Remove dependancy against cpu_primary_thread_mask + - cpu/SMT: Create topology_smt_thread_allowed() + - cpu/SMT: Make SMT control more robust against enumeration failures + - x86/apic: Fake primary thread mask for XEN/PV + - srcu: Fix callbacks acceleration mishandling + - drivers/clocksource/timer-ti-dm: Don't call clk_get_rate() in stop function + - x86/nmi: Fix out-of-order NMI nesting checks & false positive warning + - pstore/platform: Add check for kstrdup + - perf: Optimize perf_cgroup_switch() + - selftests/x86/lam: Zero out buffer for readlink() + - PCI/MSI: Provide stubs for IMS functions + - string: Adjust strtomem() logic to allow for smaller sources + - genirq/matrix: Exclude managed interrupts in irq_matrix_allocated() + - irqchip/sifive-plic: Fix syscore registration for multi-socket systems + - wifi: ath12k: fix undefined behavior with __fls in dp + - wifi: cfg80211: add flush functions for wiphy work + - wifi: mac80211: move radar detect work to wiphy work + - wifi: mac80211: move scan work to wiphy work + - wifi: mac80211: move offchannel works to wiphy work + - wifi: mac80211: move sched-scan stop work to wiphy work + - wifi: mac80211: fix RCU usage warning in mesh fast-xmit + - wifi: cfg80211: fix off-by-one in element defrag + - wifi: mac80211: fix # of MSDU in A-MSDU calculation + - wifi: iwlwifi: honor the enable_ini value + - wifi: iwlwifi: don't use an uninitialized variable + - i40e: fix potential memory leaks in i40e_remove() + - iavf: Fix promiscuous mode configuration flow messages + - selftests/bpf: Correct map_fd to data_fd in tailcalls + - bpf, x86: save/restore regs with BPF_DW size + - bpf, x86: allow function arguments up to 12 for TRACING + - bpf, x64: Fix tailcall infinite loop + - wifi: cfg80211: fix kernel-doc for wiphy_delayed_work_flush() + - udp: introduce udp->udp_flags + - udp: move udp->no_check6_tx to udp->udp_flags + - udp: move udp->no_check6_rx to udp->udp_flags + - udp: move udp->gro_enabled to udp->udp_flags + - udp: add missing WRITE_ONCE() around up->encap_rcv + - udp: move udp->accept_udp_{l4|fraglist} to udp->udp_flags + - udp: lockless UDP_ENCAP_L2TPINUDP / UDP_GRO + - udp: annotate data-races around udp->encap_type + - udplite: remove UDPLITE_BIT + - udplite: fix various data-races + - selftests/bpf: Skip module_fentry_shadow test when bpf_testmod is not + available + - tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed + - bpf: Fix kfunc callback register type handling + - gve: Use size_add() in call to struct_size() + - mlxsw: Use size_mul() in call to struct_size() + - tls: Use size_add() in call to struct_size() + - tipc: Use size_add() in calls to struct_size() + - net: spider_net: Use size_add() in call to struct_size() + - net: ethernet: mtk_wed: fix EXT_INT_STATUS_RX_FBUF definitions for MT7986 + SoC + - wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file() + - wifi: ath12k: fix DMA unmap warning on NULL DMA address + - wifi: ath11k: fix boot failure with one MSI vector + - wifi: mac80211: fix check for unusable RX result + - PM: sleep: Fix symbol export for _SIMPLE_ variants of _PM_OPS() + - cpufreq: tegra194: fix warning due to missing opp_put + - wifi: mt76: mt7603: rework/fix rx pse hang check + - wifi: mt76: mt7603: improve watchdog reset reliablity + - wifi: mt76: mt7603: improve stuck beacon handling + - wifi: mt76: connac: move connac3 definitions in mt76_connac3_mac.h + - wifi: mt76: remove unused error path in mt76_connac_tx_complete_skb + - wifi: mt76: mt7996: set correct wcid in txp + - wifi: mt76: mt7996: fix beamform mcu cmd configuration + - wifi: mt76: mt7996: fix beamformee ss subfield in EHT PHY cap + - wifi: mt76: mt7996: fix wmm queue mapping + - wifi: mt76: mt7996: fix rx rate report for CBW320-2 + - wifi: mt76: mt7996: fix TWT command format + - wifi: mt76: update beacon size limitation + - wifi: mt76: fix potential memory leak of beacon commands + - wifi: mt76: get rid of false alamrs of tx emission issues + - wifi: mt76: fix per-band IEEE80211_CONF_MONITOR flag comparison + - wifi: mt76: mt7915: fix beamforming availability check + - wifi: ath: dfs_pattern_detector: Fix a memory initialization issue + - tcp_metrics: add missing barriers on delete + - tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics() + - tcp_metrics: do not create an entry from tcp_init_metrics() + - wifi: rtlwifi: fix EDCA limit set by BT coexistence + - ACPI: property: Allow _DSD buffer data only for byte accessors + - ACPI: video: Add acpi_backlight=vendor quirk for Toshiba Portégé R100 + - can: etas_es58x: rework the version check logic to silence -Wformat- + truncation + - can: etas_es58x: add missing a blank line after declaration + - wifi: ath11k: fix Tx power value during active CAC + - can: dev: can_restart(): don't crash kernel if carrier is OK + - can: dev: can_restart(): fix race condition between controller restart and + netif_carrier_on() + - can: dev: can_put_echo_skb(): don't crash kernel if can_priv::echo_skb is + accessed out of bounds + - PM / devfreq: rockchip-dfi: Make pmu regmap mandatory + - wifi: wfx: fix case where rates are out of order + - netfilter: nf_tables: Drop pointless memset when dumping rules + - wifi: rtw88: Remove duplicate NULL check before calling usb_kill/free_urb() + - thermal: core: prevent potential string overflow + - r8169: fix rare issue with broken rx after link-down on RTL8125 + - thermal/drivers/mediatek: Fix probe for THERMAL_V2 + - bpf: Fix missed rcu read lock in bpf_task_under_cgroup() + - selftests: netfilter: test for sctp collision processing in nf_conntrack + - net: skb_find_text: Ignore patterns extending past 'to' + - thermal: core: Don't update trip points inside the hysteresis range + - chtls: fix tp->rcv_tstamp initialization + - tcp: fix cookie_init_timestamp() overflows + - wifi: iwlwifi: mvm: update station's MFP flag after association + - wifi: iwlwifi: mvm: fix removing pasn station for responder + - wifi: iwlwifi: mvm: use correct sta ID for IGTK/BIGTK + - wifi: mac80211: don't recreate driver link debugfs in reconfig + - wifi: mac80211: Fix setting vif links + - wifi: iwlwifi: yoyo: swap cdb and jacket bits values + - wifi: iwlwifi: mvm: Correctly set link configuration + - wifi: iwlwifi: mvm: Fix key flags for IGTK on AP interface + - wifi: iwlwifi: mvm: Don't always bind/link the P2P Device interface + - wifi: iwlwifi: mvm: change iwl_mvm_flush_sta() API + - wifi: iwlwifi: mvm: fix iwl_mvm_mac_flush_sta() + - wifi: iwlwifi: mvm: remove TDLS stations from FW + - wifi: iwlwifi: increase number of RX buffers for EHT devices + - wifi: iwlwifi: mvm: fix netif csum flags + - wifi: iwlwifi: pcie: synchronize IRQs before NAPI + - wifi: iwlwifi: mvm: update IGTK in mvmvif upon D3 resume + - wifi: iwlwifi: empty overflow queue during flush + - Bluetooth: ISO: Use defer setup to separate PA sync and BIG sync + - Bluetooth: ISO: Pass BIG encryption info through QoS + - Bluetooth: Make handle of hci_conn be unique + - Bluetooth: hci_sync: Fix Opcode prints in bt_dev_dbg/err + - bpf: Fix unnecessary -EBUSY from htab_lock_bucket + - ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias() + - mptcp: properly account fastopen data + - ipv6: avoid atomic fragment on GSO packets + - virtio_net: use u64_stats_t infra to avoid data-races + - net: add DEV_STATS_READ() helper + - ipvlan: properly track tx_errors + - regmap: debugfs: Fix a erroneous check after snprintf() + - spi: tegra: Fix missing IRQ check in tegra_slink_probe() + - clk: qcom: ipq5332: Drop set rate parent from gpll0 dependent clocks + - clk: qcom: gcc-msm8996: Remove RPM bus clocks + - clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies + - clk: qcom: mmcc-msm8998: Don't check halt bit on some branch clks + - clk: qcom: mmcc-msm8998: Fix the SMMU GDSC + - clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src + - regulator: mt6358: Fail probe on unknown chip ID + - clk: imx: Select MXC_CLK for CLK_IMX8QXP + - clk: imx: imx8mq: correct error handling path + - clk: imx: imx8qxp: Fix elcdif_pll clock + - clk: renesas: rcar-gen3: Extend SDnH divider table + - clk: renesas: rzg2l: Wait for status bit of SD mux before continuing + - clk: renesas: rzg2l: Lock around writes to mux register + - clk: renesas: rzg2l: Trust value returned by hardware + - clk: renesas: rzg2l: Use FIELD_GET() for PLL register fields + - clk: renesas: rzg2l: Fix computation formula + - clk: linux/clk-provider.h: fix kernel-doc warnings and typos + - spi: nxp-fspi: use the correct ioremap function + - clk: ralink: mtmips: quiet unused variable warning + - clk: keystone: pll: fix a couple NULL vs IS_ERR() checks + - clk: ti: fix double free in of_ti_divider_clk_setup() + - clk: npcm7xx: Fix incorrect kfree + - clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data + - clk: mediatek: clk-mt6779: Add check for mtk_alloc_clk_data + - clk: mediatek: clk-mt6797: Add check for mtk_alloc_clk_data + - clk: mediatek: clk-mt7629-eth: Add check for mtk_alloc_clk_data + - clk: mediatek: clk-mt7629: Add check for mtk_alloc_clk_data + - clk: mediatek: clk-mt2701: Add check for mtk_alloc_clk_data + - clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM + - clk: qcom: clk-alpha-pll: introduce stromer plus ops + - clk: qcom: apss-ipq-pll: Use stromer plus ops for stromer plus pll + - clk: qcom: apss-ipq-pll: Fix 'l' value for ipq5332_pll_config + - clk: qcom: ipq9574: drop the CLK_SET_RATE_PARENT flag from GPLL clocks + - clk: qcom: ipq5332: drop the CLK_SET_RATE_PARENT flag from GPLL clocks + - clk: mediatek: fix double free in mtk_clk_register_pllfh() + - platform/x86: wmi: Fix probe failure when failing to register WMI devices + - platform/x86: wmi: Fix opening of char device + - regulator: qcom-rpmh: Fix smps4 regulator for pm8550ve + - hwmon: (axi-fan-control) Fix possible NULL pointer dereference + - hwmon: (coretemp) Fix potentially truncated sysfs attribute name + - Revert "hwmon: (sch56xx-common) Add DMI override table" + - Revert "hwmon: (sch56xx-common) Add automatic module loading on supported + devices" + - hwmon: (sch5627) Use bit macros when accessing the control register + - hwmon: (sch5627) Disallow write access if virtual registers are locked + - hte: tegra: Fix missing error code in tegra_hte_test_probe() + - platform/chrome: cros_ec_lpc: Separate host command and irq disable + - spi: omap2-mcspi: remove redundant dev_err_probe() + - spi: omap2-mcspi: switch to use modern name + - spi: omap2-mcspi: Fix hardcoded reference clock + - drm: bridge: samsung-dsim: Initialize ULPS EXIT for i.MX8M DSIM + - drm: bridge: for GENERIC_PHY_MIPI_DPHY also select GENERIC_PHY + - drm: bridge: samsung-dsim: Fix waiting for empty cmd transfer FIFO on older + Exynos + - drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs + - drm/rockchip: vop: Fix call to crtc reset helper + - drm/rockchip: vop2: Don't crash for invalid duplicate_state + - drm/rockchip: vop2: Add missing call to crtc reset helper + - drm/radeon: possible buffer overflow + - drm: bridge: it66121: Fix invalid connector dereference + - drm/bridge: lt8912b: Fix bridge_detach + - drm/bridge: lt8912b: Fix crash on bridge detach + - drm/bridge: lt8912b: Manually disable HPD only if it was enabled + - drm/bridge: lt8912b: Add missing drm_bridge_attach call + - drm/mediatek: Fix coverity issue with unintentional integer overflow + - x86/tdx: Zero out the missing RSI in TDX_HYPERCALL macro + - drm/bridge: tc358768: Fix use of uninitialized variable + - drm/bridge: tc358768: Fix bit updates + - drm/bridge: tc358768: Use struct videomode + - drm/bridge: tc358768: Print logical values, not raw register values + - drm/bridge: tc358768: Use dev for dbg prints, not priv->dev + - drm/bridge: tc358768: Rename dsibclk to hsbyteclk + - drm/bridge: tc358768: Clean up clock period code + - drm/bridge: tc358768: Fix tc358768_ns_to_cnt() + - drm/aspeed: Convert to platform remove callback returning void + - drm/stm: Convert to platform remove callback returning void + - drm/tve200: Convert to platform remove callback returning void + - drm: Call drm_atomic_helper_shutdown() at shutdown/remove time for misc + drivers + - drm/amdgpu: Increase IH soft ring size for GFX v9.4.3 dGPU + - drm/amdkfd: fix some race conditions in vram buffer alloc/free of svm code + - drm/amdkfd: retry after EBUSY is returned from hmm_ranges_get_pages + - drm/amdkfd: Remove svm range validated_once flag + - drm/amdkfd: Handle errors from svm validate and map + - drm/amd/display: Fix null pointer dereference in error message + - drm/amd/display: Check all enabled planes in dm_check_crtc_cursor + - drm/amd/display: Refactor dm_get_plane_scale helper + - drm/amd/display: Bail from dm_check_crtc_cursor if no relevant change + - io_uring/kbuf: Fix check of BID wrapping in provided buffers + - io_uring/kbuf: Allow the full buffer id space for provided buffers + - drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data + - drm/mediatek: Fix iommu fault by swapping FBs after updating plane state + - drm/mediatek: Fix iommu fault during crtc enabling + - accel/habanalabs/gaudi2: Fix incorrect string length computation in + gaudi2_psoc_razwi_get_engines() + - drm/rockchip: cdn-dp: Fix some error handling paths in cdn_dp_probe() + - gpu: host1x: Correct allocated size for contexts + - drm/bridge: lt9611uxc: fix the race in the error path + - arm64/arm: xen: enlighten: Fix KPTI checks + - drm/rockchip: Fix type promotion bug in rockchip_gem_iommu_map() + - xenbus: fix error exit in xenbus_init() + - xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled + - drm/msm/dsi: use msm_gem_kernel_put to free TX buffer + - drm/msm/dsi: free TX buffer in unbind + - clocksource/drivers/arm_arch_timer: limit XGene-1 workaround + - drm: mediatek: mtk_dsi: Fix NO_EOT_PACKET settings/handling + - drivers/perf: hisi: use cpuhp_state_remove_instance_nocalls() for + hisi_hns3_pmu uninit process + - drm/amd/pm: Fix a memory leak on an error path + - perf/arm-cmn: Fix DTC domain detection + - drivers/perf: hisi_pcie: Check the type first in pmu::event_init() + - perf: hisi: Fix use-after-free when register pmu fails + - ARM: dts: renesas: blanche: Fix typo in GP_11_2 pin name + - arm64: dts: qcom: sdm845: Fix PSCI power domain names + - arm64: dts: qcom: sdm845: cheza doesn't support LMh node + - arm64: dts: qcom: sc7280: link usb3_phy_wrapper_gcc_usb30_pipe_clk + - arm64: dts: qcom: msm8916: Fix iommu local address range + - arm64: dts: qcom: msm8992-libra: drop duplicated reserved memory + - arm64: dts: qcom: sm6125: Pad APPS IOMMU address to 8 characters + - arm64: dts: qcom: sc7280: Add missing LMH interrupts + - arm64: dts: qcom: qrb2210-rb1: Swap UART index + - arm64: dts: qcom: sc7280: drop incorrect EUD port on SoC side + - arm64: dts: qcom: sm8150: add ref clock to PCIe PHYs + - arm64: dts: qcom: sm8350: fix pinctrl for UART18 + - arm64: dts: qcom: sdm845-mtp: fix WiFi configuration + - ARM64: dts: marvell: cn9310: Use appropriate label for spi1 pins + - arm64: dts: qcom: msm8976: Fix ipc bit shifts + - arm64: dts: qcom: msm8939: Fix iommu local address range + - riscv: dts: allwinner: remove address-cells from intc node + - arm64: dts: qcom: apq8016-sbc: Add missing ADV7533 regulators + - ARM: dts: qcom: apq8026-samsung-matisse-wifi: Fix inverted hall sensor + - ARM: dts: qcom: mdm9615: populate vsdcc fixed regulator + - soc: qcom: llcc: Handle a second device without data corruption + - kunit: Fix missed memory release in kunit_free_suite_set() + - firmware: ti_sci: Mark driver as non removable + - arm64: dts: ti: k3-am625-beagleplay: Fix typo in ramoops reg + - arm64: dts: ti: k3-am62a7-sk: Drop i2c-1 to 100Khz + - firmware: arm_ffa: Assign the missing IDR allocation ID to the FFA device + - firmware: arm_ffa: Allow the FF-A drivers to use 32bit mode of messaging + - ARM: dts: am3517-evm: Fix LED3/4 pinmux + - clk: scmi: Free scmi_clk allocated when the clocks with invalid info are + skipped + - arm64: dts: imx8qm-ss-img: Fix jpegenc compatible entry + - arm64: dts: imx8mp-debix-model-a: Remove USB hub reset-gpios + - arm64: dts: imx8mm: Add sound-dai-cells to micfil node + - arm64: dts: imx8mn: Add sound-dai-cells to micfil node + - arm64: tegra: Fix P3767 card detect polarity + - arm64: tegra: Fix P3767 QSPI speed + - firmware: tegra: Add suspend hook and reset BPMP IPC early on resume + - memory: tegra: Set BPMP msg flags to reset IPC channels + - arm64: tegra: Use correct interrupts for Tegra234 TKE + - selftests/pidfd: Fix ksft print formats + - selftests/resctrl: Ensure the benchmark commands fits to its array + - soc: qcom: pmic_glink: fix connector type to be DisplayPort + - ARM: dts: BCM5301X: Explicitly disable unused switch CPU ports + - iommufd: Add iopt_area_alloc() + - module/decompress: use vmalloc() for gzip decompression workspace + - ASoC: cs35l41: Handle mdsync_down reg write errors + - ASoC: cs35l41: Initialize completion object before requesting IRQ + - ASoC: cs35l41: Verify PM runtime resume errors in IRQ handler + - ASoC: cs35l41: Undo runtime PM changes at driver exit time + - ALSA: hda: cs35l41: Fix unbalanced pm_runtime_get() + - ALSA: hda: cs35l41: Undo runtime PM changes at driver exit time + - KEYS: Include linux/errno.h in linux/verification.h + - crypto: hisilicon/hpre - Fix a erroneous check after snprintf() + - hwrng: bcm2835 - Fix hwrng throughput regression + - hwrng: geode - fix accessing registers + - RDMA/core: Use size_{add,sub,mul}() in calls to struct_size() + - crypto: qat - fix state machines cleanup paths + - crypto: qat - ignore subsequent state up commands + - crypto: qat - fix unregistration of crypto algorithms + - crypto: qat - fix unregistration of compression algorithms + - scsi: ibmvfc: Fix erroneous use of rtas_busy_delay with hcall return code + - ASoC: soc-pcm.c: Make sure DAI parameters cleared if the DAI becomes + inactive + - libnvdimm/of_pmem: Use devm_kstrdup instead of kstrdup and check its return + value + - nd_btt: Make BTT lanes preemptible + - crypto: caam/qi2 - fix Chacha20 + Poly1305 self test failure + - crypto: caam/jr - fix Chacha20 + Poly1305 self test failure + - crypto: qat - increase size of buffers + - ASoC: SOF: ipc4-topology: Use size_add() in call to struct_size() + - PCI: vmd: Correct PCI Header Type Register's multi-function check + - hid: cp2112: Fix duplicate workqueue initialization + - crypto: hisilicon/qm - fix PF queue parameter issue + - ARM: 9321/1: memset: cast the constant byte to unsigned char + - ARM: 9323/1: mm: Fix ARCH_LOW_ADDRESS_LIMIT when CONFIG_ZONE_DMA + - ext4: move 'ix' sanity check to corrent position + - kselftest: vm: fix mdwe's mmap_FIXED test case + - ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not + described + - backlight: pwm_bl: Disable PWM on shutdown, suspend and remove + - ASoC: fsl-asoc-card: Add comment for mclk in the codec_priv + - dlm: fix no ack after final message + - IB/mlx5: Fix rdma counter binding for RAW QP + - RDMA/hns: Fix printing level of asynchronous events + - RDMA/hns: Fix uninitialized ucmd in hns_roce_create_qp_common() + - RDMA/hns: Fix signed-unsigned mixed comparisons + - RDMA/hns: Add check for SL + - RDMA/hns: The UD mode can only be configured with DCQCN + - ASoC: SOF: core: Ensure sof_ops_free() is still called when probe never ran. + - ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe + - scsi: ufs: core: Leave space for '\0' in utf8 desc string + - RDMA/hfi1: Workaround truncation compilation error + - HID: cp2112: Make irq_chip immutable + - hid: cp2112: Fix IRQ shutdown stopping polling for all IRQs on chip + - HID: uclogic: Fix user-memory-access bug in + uclogic_params_ugee_v2_init_event_hooks() + - HID: uclogic: Fix a work->entry not empty bug in __queue_work() + - sh: bios: Revive earlyprintk support + - HID: logitech-hidpp: Don't restart IO, instead defer hid_connect() only + - HID: logitech-hidpp: Revert "Don't restart communication if not necessary" + - HID: logitech-hidpp: Move get_wireless_feature_index() check to + hidpp_connect_event() + - ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails + - PCI: endpoint: Fix double free in __pci_epc_create() + - padata: Fix refcnt handling in padata_free_shell() + - certs: Break circular dependency when selftest is modular + - crypto: qat - fix deadlock in backlog processing + - ASoC: ams-delta.c: use component after check + - erofs: fix erofs_insert_workgroup() lockref usage + - IB/mlx5: Fix init stage error handling to avoid double free of same QP and + UAF + - mfd: core: Un-constify mfd_cell.of_reg + - mfd: core: Ensure disabled devices are skipped without aborting + - mfd: dln2: Fix double put in dln2_probe + - dt-bindings: mfd: mt6397: Split out compatible for MediaTek MT6366 PMIC + - mfd: arizona-spi: Set pdata.hpdet_channel for ACPI enumerated devs + - leds: turris-omnia: Drop unnecessary mutex locking + - leds: turris-omnia: Do not use SMBUS calls + - leds: pwm: Don't disable the PWM when the LED should be off + - leds: trigger: ledtrig-cpu:: Fix 'output may be truncated' issue for 'cpu' + - scripts/gdb: fix usage of MOD_TEXT not defined when CONFIG_MODULES=n + - perf stat: Fix aggr mode initialization + - iio: frequency: adf4350: Use device managed functions and fix power down + issue. + - perf kwork: Fix incorrect and missing free atom in work_push_atom() + - perf kwork: Add the supported subcommands to the document + - perf kwork: Set ordered_events to true in 'struct perf_tool' + - f2fs: compress: fix deadloop in f2fs_write_cache_pages() + - f2fs: compress: fix to avoid use-after-free on dic + - f2fs: compress: fix to avoid redundant compress extension + - f2fs: fix to drop meta_inode's page cache in f2fs_put_super() + - tty: tty_jobctrl: fix pid memleak in disassociate_ctty() + - perf parse-events: Remove unused PE_PMU_EVENT_FAKE token + - perf parse-events: Remove unused PE_KERNEL_PMU_EVENT token + - perf parse-events: Remove ABORT_ON + - perf tools: Revert enable indices setting syntax for BPF map + - perf parse-events: Fix tracepoint name memory leak + - livepatch: Fix missing newline character in klp_resolve_symbols() + - pinctrl: renesas: rzg2l: Make reverse order of enable() for disable() + - perf record: Fix BTF type checks in the off-cpu profiling + - dmaengine: idxd: Register dsa_bus_type before registering idxd sub-drivers + - usb: dwc2: fix possible NULL pointer dereference caused by driver + concurrency + - usb: chipidea: Fix DMA overwrite for Tegra + - usb: chipidea: Simplify Tegra DMA alignment code + - dmaengine: ti: edma: handle irq_of_parse_and_map() errors + - tools/perf: Update call stack check in builtin-lock.c + - misc: st_core: Do not call kfree_skb() under spin_lock_irqsave() + - tools: iio: iio_generic_buffer ensure alignment + - USB: usbip: fix stub_dev hub disconnect + - dmaengine: pxa_dma: Remove an erroneous BUG_ON() in pxad_free_desc() + - f2fs: fix to initialize map.m_pblk in f2fs_precache_extents() + - interconnect: qcom: qdu1000: Set ACV enable_mask + - interconnect: qcom: sc7180: Retire DEFINE_QBCM + - interconnect: qcom: sc7180: Set ACV enable_mask + - interconnect: qcom: sc7280: Set ACV enable_mask + - interconnect: qcom: sc8180x: Set ACV enable_mask + - interconnect: qcom: sc8280xp: Set ACV enable_mask + - interconnect: qcom: sdm670: Retire DEFINE_QBCM + - interconnect: qcom: sdm670: Set ACV enable_mask + - interconnect: qcom: sdm845: Retire DEFINE_QBCM + - interconnect: qcom: sdm845: Set ACV enable_mask + - interconnect: qcom: sm6350: Retire DEFINE_QBCM + - interconnect: qcom: sm6350: Set ACV enable_mask + - interconnect: qcom: sm8150: Retire DEFINE_QBCM + - interconnect: qcom: sm8150: Set ACV enable_mask + - interconnect: qcom: sm8350: Retire DEFINE_QBCM + - interconnect: qcom: sm8350: Set ACV enable_mask + - powerpc: Only define __parse_fpscr() when required + - interconnect: fix error handling in qnoc_probe() + - perf build: Add missing comment about NO_LIBTRACEEVENT=1 + - perf parse-events: Fix for term values that are raw events + - perf pmu: Remove logic for PMU name being NULL + - perf mem-events: Avoid uninitialized read + - s390/ap: re-init AP queues on config on + - modpost: fix tee MODULE_DEVICE_TABLE built on big-endian host + - modpost: fix ishtp MODULE_DEVICE_TABLE built on big-endian host + - perf tools: Do not ignore the default vmlinux.h + - powerpc/40x: Remove stale PTE_ATOMIC_UPDATES macro + - powerpc/xive: Fix endian conversion size + - powerpc: Hide empty pt_regs at base of the stack + - perf trace: Use the right bpf_probe_read(_str) variant for reading user data + - powerpc/vas: Limit open window failure messages in log bufffer + - powerpc/imc-pmu: Use the correct spinlock initializer. + - powerpc/pseries: fix potential memory leak in init_cpu_associativity() + - perf vendor events: Update PMC used in PM_RUN_INST_CMPL event for power10 + platform + - xhci: Loosen RPM as default policy to cover for AMD xHC 1.1 + - usb: host: xhci-plat: fix possible kernel oops while resuming + - perf machine: Avoid out of bounds LBR memory read + - libperf rc_check: Make implicit enabling work for GCC + - perf hist: Add missing puts to hist__account_cycles + - perf vendor events intel: Fix broadwellde tma_info_system_dram_bw_use metric + - perf vendor events intel: Add broadwellde two metrics + - 9p/net: fix possible memory leak in p9_check_errors() + - rtla: Fix uninitialized variable found + - i3c: Fix potential refcount leak in i3c_master_register_new_i3c_devs + - rtc: brcmstb-waketimer: support level alarm_irq + - cxl/pci: Remove unnecessary device reference management in sanitize work + - cxl/pci: Cleanup 'sanitize' to always poll + - cxl/pci: Remove inconsistent usage of dev_err_probe() + - cxl/pci: Clarify devm host for memdev relative setup + - cxl/pci: Fix sanitize notifier setup + - cxl/memdev: Fix sanitize vs decoder setup locking + - cxl/mem: Fix shutdown order + - virt: sevguest: Fix passing a stack buffer as a scatterlist target + - rtc: pcf85363: Allow to wake up system without IRQ + - rtc: pcf85363: fix wrong mask/val parameters in regmap_update_bits call + - cxl/region: Prepare the decoder match range helper for reuse + - cxl/region: Calculate a target position in a region interleave + - cxl/region: Use cxl_calc_interleave_pos() for auto-discovery + - cxl/region: Fix cxl_region_rwsem lock held when returning to user space + - cxl/core/regs: Rename @dev to @host in struct cxl_register_map + - cxl/port: Fix @host confusion in cxl_dport_setup_regs() + - cxl/hdm: Remove broken error path + - pcmcia: cs: fix possible hung task and memory leak pccardd() + - pcmcia: ds: fix refcount leak in pcmcia_device_add() + - pcmcia: ds: fix possible name leak in error path in pcmcia_device_add() + - media: imx-jpeg: initiate a drain of the capture queue in dynamic resolution + change + - media: hantro: Check whether reset op is defined before use + - media: verisilicon: Do not enable G2 postproc downscale if source is + narrower than destination + - media: ov5640: fix vblank unchange issue when work at dvp mode + - media: i2c: max9286: Fix some redundant of_node_put() calls + - media: ov5640: Fix a memory leak when ov5640_probe fails + - media: bttv: fix use after free error due to btv->timeout timer + - media: amphion: handle firmware debug message + - media: mtk-jpegenc: Fix bug in JPEG encode quality selection + - media: s3c-camif: Avoid inappropriate kfree() + - media: vidtv: psi: Add check for kstrdup + - media: vidtv: mux: Add check and kfree for kstrdup + - media: cedrus: Fix clock/reset sequence + - media: cadence: csi2rx: Unregister v4l2 async notifier + - media: dvb-usb-v2: af9035: fix missing unlock + - media: verisilicon: Fixes clock list for rk3588 av1 decoder + - media: imx-jpeg: notify source chagne event when the first picture parsed + - media: platform: mtk-mdp3: fix uninitialized variable in mdp_path_config() + - media: cec: meson: always include meson sub-directory in Makefile + - cpupower: fix reference to nonexistent document + - regmap: prevent noinc writes from clobbering cache + - drm/amdgpu/gfx10,11: use memcpy_to/fromio for MQDs + - drm/amdgpu: don't put MQDs in VRAM on ARM | ARM64 + - pwm: sti: Reduce number of allocations and drop usage of chip_data + - pwm: brcmstb: Utilize appropriate clock APIs in suspend/resume + - Input: synaptics-rmi4 - fix use after free in rmi_unregister_function() + - watchdog: ixp4xx: Make sure restart always works + - llc: verify mac len before reading mac header + - hsr: Prevent use after free in prp_create_tagged_frame() + - tipc: Change nla_policy for bearer-related names to NLA_NUL_STRING + - rxrpc: Fix two connection reaping bugs + - bpf: Check map->usercnt after timer->timer is assigned + - inet: shrink struct flowi_common + - octeontx2-pf: Fix error codes + - octeontx2-pf: Fix holes in error code + - net: page_pool: add missing free_percpu when page_pool_init fail + - dccp: Call security_inet_conn_request() after setting IPv4 addresses. + - dccp/tcp: Call security_inet_conn_request() after setting IPv6 addresses. + - Fix termination state for idr_for_each_entry_ul() + - net: stmmac: xgmac: Enable support for multiple Flexible PPS outputs + - selftests: pmtu.sh: fix result checking + - octeontx2-pf: Free pending and dropped SQEs + - net/smc: fix dangling sock under state SMC_APPFINCLOSEWAIT + - net/smc: allow cdc msg send rather than drop it with NULL sndbuf_desc + - net/smc: put sk reference if close work was canceled + - nvme: fix error-handling for io_uring nvme-passthrough + - riscv: boot: Fix creation of loader.bin + - tg3: power down device only on SYSTEM_POWER_OFF + - nbd: fix uaf in nbd_open + - blk-core: use pr_warn_ratelimited() in bio_check_ro() + - vsock/virtio: remove socket from connected/bound list on shutdown + - r8169: respect userspace disabling IFF_MULTICAST + - net: enetc: shorten enetc_setup_xdp_prog() error message to fit + NETLINK_MAX_FMTMSG_LEN + - i2c: iproc: handle invalid slave state + - netfilter: xt_recent: fix (increase) ipv6 literal buffer length + - netfilter: nat: fix ipv6 nat redirect with mapped and scoped addresses + - net/sched: act_ct: Always fill offloading tuple iifidx + - RISC-V: Don't fail in riscv_of_parent_hartid() for disabled HARTs + - module/decompress: use kvmalloc() consistently + - drm/vc4: tests: Fix UAF in the mock helpers + - drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE + - ASoC: mediatek: mt8186_mt6366_rt1019_rt5682s: trivial: fix error messages + - ASoC: hdmi-codec: register hpd callback on component probe + - ASoC: dapm: fix clock get name + - spi: spi-zynq-qspi: add spi-mem to driver kconfig dependencies + - arm64/arm: arm_pmuv3: perf: Don't truncate 64-bit registers + - fbdev: imsttfb: fix double free in probe() + - fbdev: imsttfb: fix a resource leak in probe + - fbdev: fsl-diu-fb: mark wr_reg_wa() static + - tracing/kprobes: Fix the order of argument descriptions + - Revert "drm/ast: report connection status on Display Port." + - selftests: mptcp: fix wait_rm_addr/sf parameters + - io_uring/net: ensure socket is marked connected on connect retry + - x86/amd_nb: Use Family 19h Models 60h-7Fh Function 4 IDs + - Revert "PCI/ASPM: Disable only ASPM_STATE_L1 when driver, disables L1" + - btrfs: use u64 for buffer sizes in the tree search ioctls + - bpf, x86: initialize the variable "first_off" in save_args() + - perf parse-events: Fix driver config term + - btrfs: make found_logical_ret parameter mandatory for function + queue_scrub_stripe() + - Linux 6.5.12 + + * Mantic update: v6.5.11 upstream stable release (LP: #2051117) + - ASoC: Intel: sof_sdw: add support for SKU 0B14 + - ASoC: simple-card: fixup asoc_simple_probe() error handling + - coresight: tmc-etr: Disable warnings for allocation failures + - ASoC: fsl-asoc-card: use integer type for fll_id and pll_id + - ASoC: core: Do not call link_exit() on uninitialized rtd objects + - ASoC: tlv320adc3xxx: BUG: Correct micbias setting + - net: sched: cls_u32: Fix allocation size in u32_init() + - arm64: dts: imx93: add the Flex-CAN stop mode by GPR + - can: flexcan: remove the auto stop mode for IMX93 + - irqchip/riscv-intc: Mark all INTC nodes as initialized + - irqchip/stm32-exti: add missing DT IRQ flag translation + - dmaengine: ste_dma40: Fix PM disable depth imbalance in d40_probe + - ata: pata_parport: add custom version of wait_after_reset + - ata: pata_parport: fit3: implement IDE command set registers + - powerpc/85xx: Fix math emulation exception + - media: i2c: ov8858: Don't set fwnode in the driver + - Input: synaptics-rmi4 - handle reset delay when using SMBus trsnsport + - fbdev: atyfb: only use ioremap_uc() on i386 and ia64 + - fs/ntfs3: Add ckeck in ni_update_parent() + - fs/ntfs3: Write immediately updated ntfs state + - fs/ntfs3: Use kvmalloc instead of kmalloc(... __GFP_NOWARN) + - fs/ntfs3: Add more attributes checks in mi_enum_attr() + - fs/ntfs3: Fix alternative boot searching + - fs/ntfs3: Add more info into /proc/fs/ntfs3//volinfo + - fs/ntfs3: Do not allow to change label if volume is read-only + - fs/ntfs3: Fix possible NULL-ptr-deref in ni_readpage_cmpr() + - fs/ntfs3: Fix NULL pointer dereference on error in attr_allocate_frame() + - fs/ntfs3: Fix directory element type detection + - fs/ntfs3: Avoid possible memory leak + - spi: npcm-fiu: Fix UMA reads when dummy.nbytes == 0 + - ASoC: soc-dapm: Add helper for comparing widget name + - netfilter: nfnetlink_log: silence bogus compiler warning + - net/mlx5: Bridge, fix peer entry ageing in LAG mode + - x86/efistub: Don't try to print after ExitBootService() + - efi: fix memory leak in krealloc failure handling + - ASoC: rt5650: fix the wrong result of key button + - ASoC: codecs: tas2780: Fix log of failed reset via I2C. + - s390/kasan: handle DCSS mapping in memory holes + - fbdev: omapfb: fix some error codes + - fbdev: uvesafb: Call cn_del_callback() at the end of uvesafb_exit() + - scsi: mpt3sas: Fix in error path + - ASoC: da7219: Correct the process of setting up Gnd switch in AAD + - drm/amdgpu: Unset context priority is now invalid + - gpu/drm: Eliminate DRM_SCHED_PRIORITY_UNSET + - LoongArch: Use SYM_CODE_* to annotate exception handlers + - LoongArch: Export symbol invalid_pud_table for modules building + - LoongArch: Replace kmap_atomic() with kmap_local_page() in + copy_user_highpage() + - LoongArch: Disable WUC for pgprot_writecombine() like ioremap_wc() + - netfilter: nf_tables: audit log object reset once per table + - platform/mellanox: mlxbf-tmfifo: Fix a warning message + - drm/amdgpu: Reserve fences for VM update + - riscv: dts: thead: set dma-noncoherent to soc bus + - net: chelsio: cxgb4: add an error code check in t4_load_phy_fw + - r8152: Check for unplug in rtl_phy_patch_request() + - r8152: Check for unplug in r8153b_ups_en() / r8153c_ups_en() + - powerpc/mm: Fix boot crash with FLATMEM + - ceph_wait_on_conflict_unlink(): grab reference before dropping ->d_lock + - drm/amd/display: Don't use fsleep for PSR exit waits + - rust: make `UnsafeCell` the outer type in `Opaque` + - rust: types: make `Opaque` be `!Unpin` + - perf evlist: Avoid frequency mode for the dummy event + - mmap: fix vma_iterator in error path of vma_merge() + - mmap: fix error paths with dup_anon_vma() + - ALSA: usb-audio: add quirk flag to enable native DSD for McIntosh devices + - PCI: Prevent xHCI driver from claiming AMD VanGogh USB3 DRD device + - usb: storage: set 1.50 as the lower bcdDevice for older "Super Top" + compatibility + - usb: typec: tcpm: Add additional checks for contaminant + - usb: typec: tcpm: Fix NULL pointer dereference in tcpm_pd_svdm() + - usb: raw-gadget: properly handle interrupted requests + - Bluetooth: hci_bcm4377: Mark bcm4378/bcm4387 as BROKEN_LE_CODED + - tty: n_gsm: fix race condition in status line change on dead connections + - tty: 8250: Remove UC-257 and UC-431 + - tty: 8250: Add support for additional Brainboxes UC cards + - tty: 8250: Add support for Brainboxes UP cards + - tty: 8250: Add support for Intashield IS-100 + - tty: 8250: Fix port count of PX-257 + - tty: 8250: Fix up PX-803/PX-857 + - tty: 8250: Add support for additional Brainboxes PX cards + - tty: 8250: Add support for Intashield IX cards + - tty: 8250: Add Brainboxes Oxford Semiconductor-based quirks + - dt-bindings: serial: rs485: Add rs485-rts-active-high + - misc: pci_endpoint_test: Add deviceID for J721S2 PCIe EP device support + - serial: core: Fix runtime PM handling for pending tx + - ALSA: hda: intel-dsp-config: Fix JSL Chromebook quirk detection + - ASoC: SOF: sof-pci-dev: Fix community key quirk detection + - Linux 6.5.11 + + * Mantic update: v6.5.11 upstream stable release (LP: #2051117) // black + screen when wake up from s3 with AMD W7600 gfx (LP: #2051341) + - drm/ttm: Reorder sys manager cleanup step + + * CVE-2024-0646 + - net: tls, update curr on splice as well + + * CVE-2024-0582 + - io_uring: enable io_mem_alloc/free to be used in other parts + - io_uring/kbuf: defer release of mapped buffer rings + + * CVE-2024-0565 + - smb: client: fix OOB in receive_encrypted_standard() + + * CVE-2023-51781 + - appletalk: Fix Use-After-Free in atalk_ioctl + + * Reject connection when malformed L2CAP signal packet is received + (LP: #2047634) + - Bluetooth: L2CAP: Send reject on command corrupted request + + * Mantic update: v6.5.10 upstream stable release (LP: #2049412) + - vdpa/mlx5: Fix firmware error on creation of 1k VQs + - smb3: allow controlling length of time directory entries are cached with dir + leases + - smb3: allow controlling maximum number of cached directories + - smb3: do not start laundromat thread when dir leases disabled + - smb: client: do not start laundromat thread on nohandlecache + - smb: client: make laundromat a delayed worker + - smb: client: prevent new fids from being removed by laundromat + - virtio_balloon: Fix endless deflation and inflation on arm64 + - virtio-mmio: fix memory leak of vm_dev + - virtio-crypto: handle config changed by work queue + - virtio_pci: fix the common cfg map size + - vsock/virtio: initialize the_virtio_vsock before using VQs + - vhost: Allow null msg.size on VHOST_IOTLB_INVALIDATE + - arm64: dts: qcom: apq8096-db820c: fix missing clock populate + - arm64: dts: qcom: msm8996-xiaomi: fix missing clock populate + - arm64: dts: rockchip: use codec as clock master on px30-ringneck-haikou + - arm64: dts: rockchip: set codec system-clock-fixed on px30-ringneck-haikou + - arm64: dts: qcom: sa8775p: correct PMIC GPIO label in gpio-ranges + - arm64: dts: rockchip: Add i2s0-2ch-bus-bclk-off pins to RK3399 + - arm64: dts: rockchip: Fix i2s0 pin conflict on ROCK Pi 4 boards + - i40e: sync next_to_clean and next_to_process for programming status desc + - mm: fix vm_brk_flags() to not bail out while holding lock + - hugetlbfs: clear resv_map pointer if mmap fails + - mm/page_alloc: correct start page when guard page debug is enabled + - mm/migrate: fix do_pages_move for compat pointers + - selftests/mm: include mman header to access MREMAP_DONTUNMAP identifier + - mm/mempolicy: fix set_mempolicy_home_node() previous VMA pointer + - hugetlbfs: extend hugetlb_vma_lock to private VMAs + - maple_tree: add GFP_KERNEL to allocations in mas_expected_entries() + - nfsd: lock_rename() needs both directories to live on the same fs + - vdpa_sim_blk: Fix the potential leak of mgmt_dev + - vdpa/mlx5: Fix double release of debugfs entry + - ARM: OMAP1: ams-delta: Fix MODEM initialization failure + - ARM: dts: rockchip: Fix i2c0 register address for RK3128 + - ARM: dts: rockchip: Add missing arm timer interrupt for RK3128 + - ARM: dts: rockchip: Add missing quirk for RK3128's dma engine + - ARM: dts: rockchip: Fix timer clocks for RK3128 + - accel/ivpu: Don't enter d0i3 during FLR + - drm/i915/pmu: Check if pmu is closed before stopping event + - drm/amd: Disable ASPM for VI w/ all Intel systems + - drm/dp_mst: Fix NULL deref in get_mst_branch_device_by_guid_helper() + - btrfs: remove v0 extent handling + - btrfs: fix unwritten extent buffer after snapshotting a new subvolume + - ARM: OMAP: timer32K: fix all kernel-doc warnings + - firmware/imx-dsp: Fix use_after_free in imx_dsp_setup_channels() + - clk: ti: Fix missing omap4 mcbsp functional clock and aliases + - clk: ti: Fix missing omap5 mcbsp functional clock and aliases + - r8169: fix the KCSAN reported data-race in rtl_tx() while reading tp->cur_tx + - r8169: fix the KCSAN reported data-race in rtl_tx while reading + TxDescArray[entry].opts1 + - r8169: fix the KCSAN reported data race in rtl_rx while reading desc->opts1 + - iavf: initialize waitqueues before starting watchdog_task + - i40e: Fix I40E_FLAG_VF_VLAN_PRUNING value + - treewide: Spelling fix in comment + - igb: Fix potential memory leak in igb_add_ethtool_nfc_entry + - net: do not leave an empty skb in write queue + - neighbour: fix various data-races + - igc: Fix ambiguity in the ethtool advertising + - net: ethernet: adi: adin1110: Fix uninitialized variable + - net: ieee802154: adf7242: Fix some potential buffer overflow in + adf7242_stats_show() + - net: usb: smsc95xx: Fix uninit-value access in smsc95xx_read_reg + - r8152: Increase USB control msg timeout to 5000ms as per spec + - r8152: Run the unload routine if we have errors during probe + - r8152: Cancel hw_phy_work if we have an error in probe + - r8152: Release firmware if we have an error in probe + - tcp: fix wrong RTO timeout when received SACK reneging + - wifi: cfg80211: pass correct pointer to rdev_inform_bss() + - wifi: cfg80211: fix assoc response warning on failed links + - wifi: mac80211: don't drop all unprotected public action frames + - net/handshake: fix file ref count in handshake_nl_accept_doit() + - gtp: uapi: fix GTPA_MAX + - gtp: fix fragmentation needed check with gso + - drm/i915/perf: Determine context valid in OA reports + - i40e: Fix wrong check for I40E_TXR_FLAGS_WB_ON_ITR + - netfilter: flowtable: GC pushes back packets to classic path + - net/sched: act_ct: additional checks for outdated flows + - drm/logicvc: Kconfig: select REGMAP and REGMAP_MMIO + - drm/i915/mcr: Hold GT forcewake during steering operations + - iavf: in iavf_down, disable queues when removing the driver + - scsi: sd: Introduce manage_shutdown device flag + - blk-throttle: check for overflow in calculate_bytes_allowed + - kasan: print the original fault addr when access invalid shadow + - iio: afe: rescale: Accept only offset channels + - iio: exynos-adc: request second interupt only when touchscreen mode is used + - iio: adc: xilinx-xadc: Don't clobber preset voltage/temperature thresholds + - iio: adc: xilinx-xadc: Correct temperature offset/scale for UltraScale + - i2c: muxes: i2c-mux-pinctrl: Use of_get_i2c_adapter_by_node() + - i2c: muxes: i2c-mux-gpmux: Use of_get_i2c_adapter_by_node() + - i2c: muxes: i2c-demux-pinctrl: Use of_get_i2c_adapter_by_node() + - i2c: stm32f7: Fix PEC handling in case of SMBUS transfers + - i2c: aspeed: Fix i2c bus hang in slave read + - tracing/kprobes: Fix symbol counting logic by looking at modules as well + - tracing/kprobes: Fix the description of variable length arguments + - misc: fastrpc: Reset metadata buffer to avoid incorrect free + - misc: fastrpc: Free DMA handles for RPC calls with no arguments + - misc: fastrpc: Clean buffers on remote invocation failures + - misc: fastrpc: Unmap only if buffer is unmapped from DSP + - nvmem: imx: correct nregs for i.MX6ULL + - nvmem: imx: correct nregs for i.MX6SLL + - nvmem: imx: correct nregs for i.MX6UL + - x86/tsc: Defer marking TSC unstable to a worker + - x86/i8259: Skip probing when ACPI/MADT advertises PCAT compatibility + - x86/cpu: Add model number for Intel Arrow Lake mobile processor + - perf/core: Fix potential NULL deref + - sparc32: fix a braino in fault handling in csum_and_copy_..._user() + - clk: Sanitize possible_parent_show to Handle Return Value of + of_clk_get_parent_name + - clk: socfpga: gate: Account for the divider in determine_rate + - clk: stm32: Fix a signedness issue in clk_stm32_composite_determine_rate() + - platform/x86: Add s2idle quirk for more Lenovo laptops + - mm/damon/sysfs: check DAMOS regions update progress from before_terminate() + - accel/ivpu/37xx: Fix missing VPUIP interrupts + - Linux 6.5.10 + + * CVE-2023-6560 + - io_uring: don't allow discontig pages for IORING_SETUP_NO_MMAP + + * CVE-2023-51782 + - net/rose: Fix Use-After-Free in rose_ioctl + + * Mantic update: v6.5.9 upstream stable release (LP: #2049202) + - Bluetooth: hci_event: Ignore NULL link key + - Bluetooth: Reject connection with the device which has same BD_ADDR + - Bluetooth: Fix a refcnt underflow problem for hci_conn + - Bluetooth: vhci: Fix race when opening vhci device + - Bluetooth: hci_event: Fix coding style + - Bluetooth: avoid memcmp() out of bounds warning + - Bluetooth: hci_conn: Fix modifying handle while aborting + - ice: fix over-shifted variable + - ice: Fix safe mode when DDP is missing + - ice: reset first in crash dump kernels + - net/smc: return the right falback reason when prefix checks fail + - btrfs: fix stripe length calculation for non-zoned data chunk allocation + - nfc: nci: fix possible NULL pointer dereference in send_acknowledge() + - regmap: fix NULL deref on lookup + - KVM: x86: Mask LVTPC when handling a PMI + - x86/fpu: Allow caller to constrain xfeatures when copying to uabi buffer + - KVM: x86/pmu: Truncate counter value to allowed width on write + - KVM: x86: Constrain guest-supported xfeatures only at KVM_GET_XSAVE{2} + - x86: KVM: SVM: add support for Invalid IPI Vector interception + - x86: KVM: SVM: refresh AVIC inhibition in svm_leave_nested() + - tcp: check mptcp-level constraints for backlog coalescing + - mptcp: more conservative check for zero probes + - selftests: mptcp: join: no RST when rm subflow/addr + - mm: slab: Do not create kmalloc caches smaller than arch_slab_minalign() + - fs/ntfs3: Fix OOB read in ntfs_init_from_boot + - fs/ntfs3: Fix possible null-pointer dereference in hdr_find_e() + - fs/ntfs3: fix panic about slab-out-of-bounds caused by ntfs_list_ea() + - fs/ntfs3: Fix shift-out-of-bounds in ntfs_fill_super + - fs/ntfs3: fix deadlock in mark_as_free_ex + - Revert "net: wwan: iosm: enable runtime pm support for 7560" + - netfilter: nft_payload: fix wrong mac header matching + - drm/i915: Retry gtt fault when out of fence registers + - drm/mediatek: Correctly free sg_table in gem prime vmap + - drm/nouveau/disp: fix DP capable DSM connectors + - drm/edid: add 8 bpc quirk to the BenQ GW2765 + - ALSA: hda/realtek - Fixed ASUS platform headset Mic issue + - ALSA: hda/realtek: Add quirk for ASUS ROG GU603ZV + - ALSA: hda/relatek: Enable Mute LED on HP Laptop 15s-fq5xxx + - ASoC: codecs: wcd938x-sdw: fix use after free on driver unbind + - ASoC: codecs: wcd938x-sdw: fix runtime PM imbalance on probe errors + - ASoC: codecs: wcd938x: drop bogus bind error handling + - ASoC: codecs: wcd938x: fix unbind tear down order + - ASoC: codecs: wcd938x: fix resource leaks on bind errors + - ASoC: codecs: wcd938x: fix regulator leaks on probe errors + - ASoC: codecs: wcd938x: fix runtime PM imbalance on remove + - qed: fix LL2 RX buffer allocation + - xfrm: fix a data-race in xfrm_lookup_with_ifid() + - xfrm6: fix inet6_dev refcount underflow problem + - xfrm: fix a data-race in xfrm_gen_index() + - xfrm: interface: use DEV_STATS_INC() + - net: xfrm: skip policies marked as dead while reinserting policies + - fprobe: Fix to ensure the number of active retprobes is not zero + - wifi: cfg80211: use system_unbound_wq for wiphy work + - net: ipv4: fix return value check in esp_remove_trailer + - net: ipv6: fix return value check in esp_remove_trailer + - net: rfkill: gpio: prevent value glitch during probe + - tcp: fix excessive TLP and RACK timeouts from HZ rounding + - tcp: tsq: relax tcp_small_queue_check() when rtx queue contains a single skb + - tcp: Fix listen() warning with v4-mapped-v6 address. + - docs: fix info about representor identification + - tun: prevent negative ifindex + - gve: Do not fully free QPL pages on prefill errors + - ipv4: fib: annotate races around nh->nh_saddr_genid and nh->nh_saddr + - net: usb: smsc95xx: Fix an error code in smsc95xx_reset() + - octeon_ep: update BQL sent bytes before ringing doorbell + - i40e: prevent crash on probe if hw registers have invalid values + - net: dsa: bcm_sf2: Fix possible memory leak in bcm_sf2_mdio_register() + - bonding: Return pointer to data after pull on skb + - net/sched: sch_hfsc: upgrade 'rt' to 'sc' when it becomes a inner curve + - neighbor: tracing: Move pin6 inside CONFIG_IPV6=y section + - selftests: openvswitch: Catch cases where the tests are killed + - selftests: openvswitch: Fix the ct_tuple for v4 + - selftests: netfilter: Run nft_audit.sh in its own netns + - netfilter: nft_set_rbtree: .deactivate fails if element has expired + - netlink: Correct offload_xstats size + - netfilter: nf_tables: do not refresh timeout when resetting element + - netfilter: nf_tables: do not remove elements if set backend implements + .abort + - netfilter: nf_tables: revert do not remove elements if set backend + implements .abort + - selftests: openvswitch: Add version check for pyroute2 + - net: phy: bcm7xxx: Add missing 16nm EPHY statistics + - net: pktgen: Fix interface flags printing + - net: more strict VIRTIO_NET_HDR_GSO_UDP_L4 validation + - net: mdio-mux: fix C45 access returning -EIO after API change + - net: avoid UAF on deleted altname + - net: fix ifname in netlink ntf during netns move + - net: check for altname conflicts when changing netdev's netns + - iio: light: vcnl4000: Don't power on/off chip in config + - pwr-mlxbf: extend Kconfig to include gpio-mlxbf3 dependency + - ARM: dts: ti: omap: Fix noisy serial with overrun-throttle-ms for mapphone + - arm64: dts: mediatek: Fix "mediatek,merge-mute" and "mediatek,merge-fifo-en" + types + - fs-writeback: do not requeue a clean inode having skipped pages + - btrfs: fix race when refilling delayed refs block reserve + - btrfs: prevent transaction block reserve underflow when starting transaction + - btrfs: return -EUCLEAN for delayed tree ref with a ref count not equals to 1 + - btrfs: initialize start_slot in btrfs_log_prealloc_extents + - i2c: mux: Avoid potential false error message in i2c_mux_add_adapter + - overlayfs: set ctime when setting mtime and atime + - accel/ivpu: Don't flood dmesg with VPU ready message + - gpio: timberdale: Fix potential deadlock on &tgpio->lock + - ata: libata-core: Fix compilation warning in ata_dev_config_ncq() + - ata: libata-eh: Fix compilation warning in ata_eh_link_report() + - tracing: relax trace_event_eval_update() execution with cond_resched() + - wifi: mwifiex: Sanity check tlv_len and tlv_bitmap_len + - wifi: cfg80211: validate AP phy operation before starting it + - wifi: iwlwifi: Ensure ack flag is properly cleared. + - rfkill: sync before userspace visibility/changes + - HID: logitech-hidpp: Add Bluetooth ID for the Logitech M720 Triathlon mouse + - HID: holtek: fix slab-out-of-bounds Write in holtek_kbd_input_event + - Bluetooth: btusb: add shutdown function for QCA6174 + - Bluetooth: Avoid redundant authentication + - Bluetooth: hci_core: Fix build warnings + - wifi: cfg80211: Fix 6GHz scan configuration + - wifi: mac80211: work around Cisco AP 9115 VHT MPDU length + - wifi: mac80211: allow transmitting EAPOL frames with tainted key + - wifi: cfg80211: avoid leaking stack data into trace + - regulator/core: Revert "fix kobject release warning and memory leak in + regulator_register()" + - SUNRPC: Fail quickly when server does not recognize TLS + - SUNRPC/TLS: Lock the lower_xprt during the tls handshake + - nfs: decrement nrequests counter before releasing the req + - sky2: Make sure there is at least one frag_addr available + - ipv4/fib: send notify when delete source address routes + - drm: panel-orientation-quirks: Add quirk for One Mix 2S + - btrfs: fix some -Wmaybe-uninitialized warnings in ioctl.c + - btrfs: error out when COWing block using a stale transaction + - btrfs: error when COWing block from a root that is being deleted + - btrfs: error out when reallocating block for defrag using a stale + transaction + - platform/x86: touchscreen_dmi: Add info for the BUSH Bush Windows tablet + - drm/amd/pm: add unique_id for gc 11.0.3 + - HID: multitouch: Add required quirk for Synaptics 0xcd7e device + - HID: nintendo: reinitialize USB Pro Controller after resuming from suspend + - HID: Add quirk to ignore the touchscreen battery on HP ENVY 15-eu0556ng + - platform/x86: touchscreen_dmi: Add info for the Positivo C4128B + - cpufreq: schedutil: Update next_freq when cpufreq_limits change + - Bluetooth: hci_sync: Fix not handling ISO_LINK in hci_abort_conn_sync + - Bluetooth: hci_sync: Introduce PTR_UINT/UINT_PTR macros + - Bluetooth: ISO: Fix invalid context error + - Bluetooth: hci_sync: delete CIS in BT_OPEN/CONNECT/BOUND when aborting + - Bluetooth: hci_sync: always check if connection is alive before deleting + - net/mlx5: E-switch, register event handler before arming the event + - net/mlx5: Handle fw tracer change ownership event based on MTRC + - net/mlx5e: RX, Fix page_pool allocation failure recovery for striding rq + - net/mlx5e: RX, Fix page_pool allocation failure recovery for legacy rq + - net/mlx5e: XDP, Fix XDP_REDIRECT mpwqe page fragment leaks on shutdown + - net/mlx5e: Take RTNL lock before triggering netdev notifiers + - net/mlx5e: Don't offload internal port if filter device is out device + - net/mlx5e: Fix VF representors reporting zero counters to "ip -s" command + - net/tls: split tls_rx_reader_lock + - tcp: allow again tcp_disconnect() when threads are waiting + - Bluetooth: hci_event: Fix using memcmp when comparing keys + - tcp_bpf: properly release resources on error paths + - mtd: rawnand: qcom: Unmap the right resource upon probe failure + - mtd: rawnand: pl353: Ensure program page operations are successful + - mtd: rawnand: marvell: Ensure program page operations are successful + - mtd: rawnand: arasan: Ensure program page operations are successful + - mtd: rawnand: Ensure the nand chip supports cached reads + - mtd: spinand: micron: correct bitmask for ecc status + - mtd: physmap-core: Restore map_rom fallback + - dt-bindings: mmc: sdhci-msm: correct minimum number of clocks + - mmc: sdhci-pci-gli: fix LPM negotiation so x86/S0ix SoCs can suspend + - mmc: mtk-sd: Use readl_poll_timeout_atomic in msdc_reset_hw + - mmc: core: Fix error propagation for some ioctl commands + - mmc: core: sdio: hold retuning if sdio in 1-bit mode + - pinctrl: qcom: lpass-lpi: fix concurrent register updates + - pNFS: Fix a hang in nfs4_evict_inode() + - pNFS/flexfiles: Check the layout validity in ff_layout_mirror_prepare_stats + - NFSv4.1: fixup use EXCHGID4_FLAG_USE_PNFS_DS for DS server + - ACPI: irq: Fix incorrect return value in acpi_register_gsi() + - ACPI: bus: Move acpi_arm_init() to the place of after acpi_ghes_init() + - perf dlfilter: Fix use of addr_location__exit() in dlfilter__object_code() + - fanotify: limit reporting of event with non-decodeable file handles + - NFS: Fix potential oops in nfs_inode_remove_request() + - nfs42: client needs to strip file mode's suid/sgid bit after ALLOCATE op + - nvme: sanitize metadata bounce buffer for reads + - nvme-pci: add BOGUS_NID for Intel 0a54 device + - nvme-auth: use chap->s2 to indicate bidirectional authentication + - nvmet-auth: complete a request only after freeing the dhchap pointers + - nvme-rdma: do not try to stop unallocated queues + - USB: serial: option: add Telit LE910C4-WWX 0x1035 composition + - USB: serial: option: add entry for Sierra EM9191 with new firmware + - USB: serial: option: add Fibocom to DELL custom modem FM101R-GL + - thunderbolt: Call tb_switch_put() once DisplayPort bandwidth request is + finished + - s390/pci: fix iommu bitmap allocation + - tracing/kprobes: Return EADDRNOTAVAIL when func matches several symbols + - selftests/ftrace: Add new test case which checks non unique symbol + - KEYS: asymmetric: Fix sign/verify on pkcs1pad without a hash + - apple-gmux: Hard Code max brightness for MMIO gmux + - s390/cio: fix a memleak in css_alloc_subchannel + - platform/surface: platform_profile: Propagate error if profile registration + fails + - platform/x86: intel-uncore-freq: Conditionally create attribute for read + frequency + - platform/x86: msi-ec: Fix the 3rd config + - platform/x86: asus-wmi: Change ASUS_WMI_BRN_DOWN code from 0x20 to 0x2e + - platform/x86: asus-wmi: Only map brightness codes when using asus-wmi + backlight control + - platform/x86: asus-wmi: Map 0x2a code, Ignore 0x2b and 0x2c events + - rust: error: fix the description for `ECHILD` + - gpiolib: acpi: Add missing memset(0) to acpi_get_gpiod_from_data() + - gpio: vf610: set value before the direction to avoid a glitch + - gpio: vf610: mask the gpio irq in system suspend and support wakeup + - ASoC: cs35l56: Fix illegal use of init_completion() + - ASoC: pxa: fix a memory leak in probe() + - ASoC: cs42l42: Fix missing include of gpio/consumer.h + - drm/bridge: ti-sn65dsi86: Associate DSI device lifetime with auxiliary + device + - drm/i915/cx0: Only clear/set the Pipe Reset bit of the PHY Lanes Owned + - drm/amdgpu: Fix possible null pointer dereference + - powerpc/mm: Allow ARCH_FORCE_MAX_ORDER up to 12 + - powerpc/qspinlock: Fix stale propagated yield_cpu + - docs: Move rustdoc output, cross-reference it + - rust: docs: fix logo replacement + - phy: mapphone-mdm6600: Fix runtime disable on probe + - phy: mapphone-mdm6600: Fix runtime PM for remove + - phy: mapphone-mdm6600: Fix pinctrl_pm handling for sleep pins + - phy: qcom-qmp-usb: initialize PCS_USB registers + - phy: qcom-qmp-usb: split PCS_USB init table for sc8280xp and sa8775p + - phy: qcom-qmp-combo: Square out 8550 POWER_STATE_CONFIG1 + - phy: qcom-qmp-combo: initialize PCS_USB registers + - efi/unaccepted: Fix soft lockups caused by parallel memory acceptance + - net: move altnames together with the netdevice + - Bluetooth: hci_sock: fix slab oob read in create_monitor_event + - net: rfkill: reduce data->mtx scope in rfkill_fop_open + - docs: rust: update Rust docs output path + - kbuild: remove old Rust docs output path + - Bluetooth: hci_sock: Correctly bounds check and pad HCI_MON_NEW_INDEX name + - mptcp: avoid sending RST when closing the initial subflow + - selftests: mptcp: join: correctly check for no RST + - Linux 6.5.9 + + * CVE-2023-51779 + - Bluetooth: af_bluetooth: Fix Use-After-Free in bt_sock_recvmsg + + -- Stefan Bader Fri, 02 Feb 2024 15:00:42 +0100 + +linux (6.5.0-17.17) mantic; urgency=medium + + * mantic/linux: 6.5.0-17.17 -proposed tracker (LP: #2049026) + + * [UBUNTU 23.04] Regression: Ubuntu 23.04/23.10 do not include uvdevice + anymore (LP: #2048919) + - [Config] Enable S390_UV_UAPI (built-in) + + -- Roxana Nicolescu Thu, 11 Jan 2024 13:47:08 +0100 + +linux (6.5.0-16.16) mantic; urgency=medium + + * mantic/linux: 6.5.0-16.16 -proposed tracker (LP: #2048372) + + * Packaging resync (LP: #1786013) + - [Packaging] resync git-ubuntu-log + - [Packaging] resync update-dkms-versions helper + - [Packaging] remove helper scripts + - [Packaging] update annotations scripts + - debian/dkms-versions -- update from kernel-versions (main/2024.01.08) + + * Add missing RPL P/U CPU IDs (LP: #2047398) + - drm/i915/rpl: Update pci ids for RPL P/U + + * Fix BCM57416 lost after resume (LP: #2047518) + - bnxt_en: Clear resource reservation during resume + + * Hotplugging SCSI disk in QEMU VM fails (LP: #2047382) + - Revert "PCI: acpiphp: Reassign resources on bridge if necessary" + + * Update bnxt_en with bug fixes and support for Broadcom 5760X network + adapters (LP: #2045796) + - bnxt_en: use dev_consume_skb_any() in bnxt_tx_int + - eth: bnxt: move and rename reset helpers + - eth: bnxt: take the bit to set as argument of bnxt_queue_sp_work() + - eth: bnxt: handle invalid Tx completions more gracefully + - eth: bnxt: fix one of the W=1 warnings about fortified memcpy() + - eth: bnxt: fix warning for define in struct_group + - bnxt_en: Fix W=1 warning in bnxt_dcb.c from fortify memcpy() + - bnxt_en: Fix W=stringop-overflow warning in bnxt_dcb.c + - bnxt_en: Use the unified RX page pool buffers for XDP and non-XDP + - bnxt_en: Let the page pool manage the DMA mapping + - bnxt_en: Increment rx_resets counter in bnxt_disable_napi() + - bnxt_en: Save ring error counters across reset + - bnxt_en: Display the ring error counters under ethtool -S + - bnxt_en: Add tx_resets ring counter + - bnxt: use the NAPI skb allocation cache + - bnxt_en: Update firmware interface to 1.10.2.171 + - bnxt_en: Enhance hwmon temperature reporting + - bnxt_en: Move hwmon functions into a dedicated file + - bnxt_en: Modify the driver to use hwmon_device_register_with_info + - bnxt_en: Expose threshold temperatures through hwmon + - bnxt_en: Use non-standard attribute to expose shutdown temperature + - bnxt_en: Event handler for Thermal event + - bnxt_en: Support QOS and TPID settings for the SRIOV VLAN + - bnxt_en: Update VNIC resource calculation for VFs + - Revert "bnxt_en: Support QOS and TPID settings for the SRIOV VLAN" + - eth: bnxt: fix backward compatibility with older devices + - bnxt_en: Do not call sleeping hwmon_notify_event() from NAPI + - bnxt_en: Fix invoking hwmon_notify_event + - bnxt_en: add infrastructure to lookup ethtool link mode + - bnxt_en: support lane configuration via ethtool + - bnxt_en: refactor speed independent ethtool modes + - bnxt_en: Refactor NRZ/PAM4 link speed related logic + - bnxt_en: convert to linkmode_set_bit() API + - bnxt_en: extend media types to supported and autoneg modes + - bnxt_en: Fix 2 stray ethtool -S counters + - bnxt_en: Put the TX producer information in the TX BD opaque field + - bnxt_en: Add completion ring pointer in TX and RX ring structures + - bnxt_en: Restructure cp_ring_arr in struct bnxt_cp_ring_info + - bnxt_en: Add completion ring pointer in TX and RX ring structures + - bnxt_en: Remove BNXT_RX_HDL and BNXT_TX_HDL + - bnxt_en: Refactor bnxt_tx_int() + - bnxt_en: New encoding for the TX opaque field + - bnxt_en: Refactor bnxt_hwrm_set_coal() + - bnxt_en: Support up to 8 TX rings per MSIX + - bnxt_en: Add helper to get the number of CP rings required for TX rings + - bnxt_en: Add macros related to TC and TX rings + - bnxt_en: Use existing MSIX vectors for all mqprio TX rings + - bnxt_en: Optimize xmit_more TX path + - bnxt_en: The caller of bnxt_alloc_ctx_mem() should always free bp->ctx + - bnxt_en: Free bp->ctx inside bnxt_free_ctx_mem() + - bnxt_en: Restructure context memory data structures + - bnxt_en: Add page info to struct bnxt_ctx_mem_type + - bnxt_en: Use the pg_info field in bnxt_ctx_mem_type struct + - bnxt_en: Add bnxt_setup_ctxm_pg_tbls() helper function + - bnxt_en: Add support for new backing store query firmware API + - bnxt_en: Add support for HWRM_FUNC_BACKING_STORE_CFG_V2 firmware calls + - bnxt_en: Add db_ring_mask and related macro to bnxt_db_info struct. + - bnxt_en: Modify TX ring indexing logic. + - bnxt_en: Modify RX ring indexing logic. + - bnxt_en: Modify the NAPI logic for the new P7 chips + - bnxt_en: Rename some macros for the P5 chips + - bnxt_en: Fix backing store V2 logic + - bnxt_en: Update firmware interface to 1.10.3.15 + - bnxt_en: Define basic P7 macros + - bnxt_en: Consolidate DB offset calculation + - bnxt_en: Implement the new toggle bit doorbell mechanism on P7 chips + - bnxt_en: Refactor RSS capability fields + - bnxt_en: Add new P7 hardware interface definitions + - bnxt_en: Refactor RX VLAN acceleration logic. + - bnxt_en: Refactor and refine bnxt_tpa_start() and bnxt_tpa_end(). + - bnxt_en: Add support for new RX and TPA_START completion types for P7 + - bnxt_en: Refactor ethtool speeds logic + - bnxt_en: Support new firmware link parameters + - bnxt_en: Support force speed using the new HWRM fields + - bnxt_en: Report the new ethtool link modes in the new firmware interface + - bnxt_en: Add 5760X (P7) PCI IDs + - net: bnxt: fix a potential use-after-free in bnxt_init_tc + + * drm: Update file owner during use (LP: #2047461) + - drm: Update file owner during use + + * CVE-2023-6622 + - netfilter: nf_tables: bail out on mismatching dynset and set expressions + + * CVE-2024-0193 + - netfilter: nf_tables: skip set commit for deleted/destroyed sets + + * Support Cirrus CS35L41 codec on Dell Oasis 13/14/16 laptops (LP: #2044096) + - ALSA: hda/realtek: Add support dual speaker for Dell + + * Add support of MTL audio of Lenovo (LP: #2048078) + - ALSA: hda: intel-nhlt: Ignore vbps when looking for DMIC 32 bps format + + * Fix AMDGPU crash on 6.5 kernel (LP: #2047389) + - drm/amdgpu: disable MCBP by default + + * Some machines can't pass the pm-graph test (LP: #2046217) + - wifi: iwlwifi: pcie: rescan bus if no parent + + * Sound: Add rtl quirk of M90-Gen5 (LP: #2046105) + - ALSA: hda/realtek: Enable headset on Lenovo M90 Gen5 + + * linux tools packages for derived kernels refuse to install simultaneously + due to libcpupower name collision (LP: #2035971) + - [Packaging] Statically link libcpupower into cpupower tool + + * [Debian] autoreconstruct - Do not generate chmod -x for deleted files + (LP: #2045562) + - [Debian] autoreconstruct - Do not generate chmod -x for deleted files + + * CVE-2023-6931 + - perf: Fix perf_event_validate_size() + - perf: Fix perf_event_validate_size() lockdep splat + + * Mantic update: v6.5.8 upstream stable release (LP: #2046269) + - net: stmmac: remove unneeded stmmac_poll_controller + - RDMA/cxgb4: Check skb value for failure to allocate + - perf/arm-cmn: Fix the unhandled overflow status of counter 4 to 7 + - platform/x86: think-lmi: Fix reference leak + - drm/i915: Register engines early to avoid type confusion + - cpuidle, ACPI: Evaluate LPI arch_flags for broadcast timer + - drm/amdgpu: Fix a memory leak + - platform/x86: hp-wmi:: Mark driver struct with __refdata to prevent section + mismatch warning + - media: dt-bindings: imx7-csi: Make power-domains not required for imx8mq + - drm/amd/display: implement pipe type definition and adding accessors + - drm/amd/display: apply edge-case DISPCLK WDIVIDER changes to master OTG + pipes only + - scsi: Do not rescan devices with a suspended queue + - ata: pata_parport: fix pata_parport_devchk + - ata: pata_parport: implement set_devctl + - HID: logitech-hidpp: Fix kernel crash on receiver USB disconnect + - quota: Fix slow quotaoff + - dm crypt: Fix reqsize in crypt_iv_eboiv_gen + - ASoC: amd: yc: Fix non-functional mic on Lenovo 82YM + - ASoC: hdmi-codec: Fix broken channel map reporting + - ata: libata-scsi: Disable scsi device manage_system_start_stop + - net: prevent address rewrite in kernel_bind() + - arm64: dts: qcom: sm8150: extend the size of the PDC resource + - dt-bindings: interrupt-controller: renesas,rzg2l-irqc: Update description + for '#interrupt-cells' property + - irqchip: renesas-rzg2l: Fix logic to clear TINT interrupt source + - KEYS: trusted: Remove redundant static calls usage + - ALSA: usb-audio: Fix microphone sound on Opencomm2 Headset + - ALSA: usb-audio: Fix microphone sound on Nexigo webcam. + - ALSA: hda: cs35l41: Cleanup and fix double free in firmware request + - ALSA: hda/realtek: Change model for Intel RVP board + - ASoC: SOF: amd: fix for firmware reload failure after playback + - ASoC: simple-card-utils: fixup simple_util_startup() error handling + - ASoC: Intel: soc-acpi: fix Dell SKU 0B34 + - ASoC: Intel: soc-acpi: Add entry for HDMI_In capture support in MTL match + table + - ASoC: fsl_sai: Don't disable bitclock for i.MX8MP + - ASoC: Intel: sof_sdw: add support for SKU 0B14 + - ASoC: Intel: soc-acpi: Add entry for sof_es8336 in MTL match table. + - ALSA: hda/realtek - ALC287 merge RTK codec with CS CS35L41 AMP + - ALSA: hda/realtek: Add quirk for HP Victus 16-d1xxx to enable mute LED + - ALSA: hda/realtek: Add quirk for mute LEDs on HP ENVY x360 15-eu0xxx + - pinctrl: nuvoton: wpcm450: fix out of bounds write + - pinctrl: starfive: jh7110: Fix failure to set irq after CONFIG_PM is enabled + - drm/msm/dp: do not reinitialize phy unless retry during link training + - drm/msm/dsi: skip the wait for video mode done if not applicable + - drm/msm/dsi: fix irq_of_parse_and_map() error checking + - drm/msm/dpu: change _dpu_plane_calc_bw() to use u64 to avoid overflow + - drm/msm/dp: Add newlines to debug printks + - drm/msm/dpu: fail dpu_plane_atomic_check() based on mdp clk limits + - phy: lynx-28g: cancel the CDR check work item on the remove path + - phy: lynx-28g: lock PHY while performing CDR lock workaround + - phy: lynx-28g: serialize concurrent phy_set_mode_ext() calls to shared + registers + - net: dsa: qca8k: fix regmap bulk read/write methods on big endian systems + - net: dsa: qca8k: fix potential MDIO bus conflict when accessing internal + PHYs via management frames + - can: isotp: isotp_sendmsg(): fix TX state detection and wait behavior + - can: sun4i_can: Only show Kconfig if ARCH_SUNXI is set + - arm64: dts: mediatek: fix t-phy unit name + - arm64: dts: mediatek: mt8195: Set DSU PMU status to fail + - devlink: Hold devlink lock on health reporter dump get + - ravb: Fix up dma_free_coherent() call in ravb_remove() + - ravb: Fix use-after-free issue in ravb_tx_timeout_work() + - ieee802154: ca8210: Fix a potential UAF in ca8210_probe + - mlxsw: fix mlxsw_sp2_nve_vxlan_learning_set() return type + - xen-netback: use default TX queue size for vifs + - riscv, bpf: Sign-extend return values + - riscv, bpf: Track both a0 (RISC-V ABI) and a5 (BPF) return values + - xdp: Fix zero-size allocation warning in xskq_create() + - drm/vmwgfx: fix typo of sizeof argument + - bpf: Fix verifier log for async callback return values + - net: refine debug info in skb_checksum_help() + - octeontx2-pf: mcs: update PN only when update_pn is true + - net: macsec: indicate next pn update when offloading + - net: phy: mscc: macsec: reject PN update requests + - net/mlx5e: macsec: use update_pn flag instead of PN comparation + - drm/panel: boe-tv101wum-nl6: Completely pull GPW to VGL before TP term + - ixgbe: fix crash with empty VF macvlan list + - net/smc: Fix dependency of SMC on ISM + - net/mlx5e: Again mutually exclude RX-FCS and RX-port-timestamp + - s390/bpf: Fix clobbering the caller's backchain in the trampoline + - s390/bpf: Fix unwinding past the trampoline + - net: nfc: fix races in nfc_llcp_sock_get() and nfc_llcp_sock_get_sn() + - net: tcp: fix crashes trying to free half-baked MTU probes + - pinctrl: renesas: rzn1: Enable missing PINMUX + - af_packet: Fix fortified memcpy() without flex array. + - nfc: nci: assert requested protocol is valid + - octeontx2-pf: Fix page pool frag allocation warning + - rswitch: Fix renesas_eth_sw_remove() implementation + - rswitch: Fix imbalance phy_power_off() calling + - workqueue: Override implicit ordered attribute in + workqueue_apply_unbound_cpumask() + - riscv: signal: fix sigaltstack frame size checking + - ovl: temporarily disable appending lowedirs + - dmaengine: stm32-mdma: abort resume if no ongoing transfer + - dmaengine: stm32-dma: fix stm32_dma_prep_slave_sg in case of MDMA chaining + - dmaengine: stm32-dma: fix residue in case of MDMA chaining + - dmaengine: stm32-mdma: use Link Address Register to compute residue + - dmaengine: stm32-mdma: set in_flight_bytes in case CRQA flag is set + - usb: xhci: xhci-ring: Use sysdev for mapping bounce buffer + - xhci: track port suspend state correctly in unsuccessful resume cases + - xhci: Clear EHB bit only at end of interrupt handler + - xhci: Preserve RsvdP bits in ERSTBA register correctly + - net: usb: dm9601: fix uninitialized variable use in dm9601_mdio_read + - usb: dwc3: Soft reset phy on probe for host + - usb: cdns3: Modify the return value of cdns_set_active () to void when + CONFIG_PM_SLEEP is disabled + - usb: hub: Guard against accesses to uninitialized BOS descriptors + - usb: musb: Get the musb_qh poniter after musb_giveback + - usb: musb: Modify the "HWVers" register address + - iio: pressure: bmp280: Fix NULL pointer exception + - iio: imu: bno055: Fix missing Kconfig dependencies + - iio: cros_ec: fix an use-after-free in cros_ec_sensors_push_data() + - iio: adc: imx8qxp: Fix address for command buffer registers + - iio: dac: ad3552r: Correct device IDs + - iio: admv1013: add mixer_vgate corner cases + - iio: pressure: dps310: Adjust Timeout Settings + - iio: pressure: ms5611: ms5611_prom_is_valid false negative bug + - iio: adc: ad7192: Correct reference voltage + - iio: addac: Kconfig: update ad74413r selections + - media: subdev: Don't report V4L2_SUBDEV_CAP_STREAMS when the streams API is + disabled + - arm64: dts: mediatek: mt8195-demo: fix the memory size to 8GB + - arm64: dts: mediatek: mt8195-demo: update and reorder reserved memory + regions + - drm: Do not overrun array in drm_gem_get_pages() + - drm/tiny: correctly print `struct resource *` on error + - drm/atomic-helper: relax unregistered connector check + - drm/amdgpu: add missing NULL check + - drm/amd/display: Don't set dpms_off for seamless boot + - ACPI: resource: Skip IRQ override on ASUS ExpertBook B1402CBA + - ACPI: resource: Add TongFang GM6BGEQ, GM6BG5Q and GM6BG0Q to + irq1_edge_low_force_override[] + - ACPI: EC: Add quirk for the HP Pavilion Gaming 15-dk1xxx + - serial: Reduce spinlocked portion of uart_rs485_config() + - serial: 8250_omap: Fix errors with no_console_suspend + - serial: core: Fix checks for tx runtime PM state + - binder: fix memory leaks of spam and pending work + - ksmbd: not allow to open file if delelete on close bit is set + - perf/x86/lbr: Filter vsyscall addresses + - x86/cpu: Fix AMD erratum #1485 on Zen4-based CPUs + - x86/alternatives: Disable KASAN in apply_alternatives() + - mcb: remove is_added flag from mcb_device struct + - thunderbolt: Workaround an IOMMU fault on certain systems with Intel Maple + Ridge + - thunderbolt: Check that lane 1 is in CL0 before enabling lane bonding + - thunderbolt: Correct TMU mode initialization from hardware + - thunderbolt: Restart XDomain discovery handshake after failure + - powerpc/pseries: Fix STK_PARAM access in the hcall tracing code + - powerpc/47x: Fix 47x syscall return crash + - libceph: use kernel_connect() + - ceph: fix incorrect revoked caps assert in ceph_fill_file_size() + - ceph: fix type promotion bug on 32bit systems + - Input: powermate - fix use-after-free in powermate_config_complete + - Input: psmouse - fix fast_reconnect function for PS/2 mode + - Input: xpad - add PXN V900 support + - Input: i8042 - add Fujitsu Lifebook E5411 to i8042 quirk table + - Input: xpad - add HyperX Clutch Gladiate Support + - Input: goodix - ensure int GPIO is in input for gpio_count == 1 && + gpio_int_idx == 0 case + - tee: amdtee: fix use-after-free vulnerability in amdtee_close_session + - mctp: perform route lookups under a RCU read-side lock + - block: Don't invalidate pagecache for invalid falloc modes + - nfp: flower: avoid rmmod nfp crash issues + - can: sja1000: Always restart the Tx queue after an overrun + - power: supply: qcom_battmgr: fix battery_id type + - power: supply: qcom_battmgr: fix enable request endianness + - usb: typec: ucsi: Use GET_CAPABILITY attributes data to set power supply + scope + - cgroup: Remove duplicates in cgroup v1 tasks file + - dma-buf: add dma_fence_timestamp helper + - scsi: ufs: core: Correct clear TM error log + - riscv: Only consider swbp/ss handlers for correct privileged mode + - counter: chrdev: fix getting array extensions + - counter: microchip-tcb-capture: Fix the use of internal GCLK logic + - coresight: Fix run time warnings while reusing ETR buffer + - riscv: Remove duplicate objcopy flag + - RISC-V: Fix wrong use of CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK + - usb: typec: ucsi: Fix missing link removal + - usb: typec: altmodes/displayport: Signal hpd low when exiting mode + - usb: typec: ucsi: Clear EVENT_PENDING bit if ucsi_send_command fails + - usb: gadget: udc-xilinx: replace memcpy with memcpy_toio + - usb: gadget: ncm: Handle decoding of multiple NTB's in unwrap call + - usb: cdnsp: Fixes issue with dequeuing not queued requests + - usb: typec: qcom: Update the logic of regulator enable and disable + - usb: misc: onboard_hub: add support for Microchip USB2412 USB 2.0 hub + - dmaengine: idxd: use spin_lock_irqsave before wait_event_lock_irq + - dmaengine: mediatek: Fix deadlock caused by synchronize_irq() + - powerpc/8xx: Fix pte_access_permitted() for PAGE_NONE + - powerpc/64e: Fix wrong test in __ptep_test_and_clear_young() + - fs: Fix kernel-doc warnings + - fs: factor out vfs_parse_monolithic_sep() helper + - ovl: fix regression in parsing of mount options with escaped comma + - ovl: make use of ->layers safe in rcu pathwalk + - ovl: fix regression in showing lowerdir mount option + - ALSA: hda/realtek - Fixed two speaker platform + - Linux 6.5.8 + + * Mantic update: v6.5.7 upstream stable release (LP: #2045806) + - ASoC: soc-utils: Export snd_soc_dai_is_dummy() symbol + - ASoC: tegra: Fix redundant PLLA and PLLA_OUT0 updates + - maple_tree: add mas_is_active() to detect in-tree walks + - mptcp: Remove unnecessary test for __mptcp_init_sock() + - mptcp: rename timer related helper to less confusing names + - mptcp: fix dangling connection hang-up + - scsi: core: Improve type safety of scsi_rescan_device() + - scsi: Do not attempt to rescan suspended devices + - ata: libata-scsi: Fix delayed scsi_rescan_device() execution + - btrfs: remove btrfs_writepage_endio_finish_ordered + - btrfs: remove end_extent_writepage + - btrfs: don't clear uptodate on write errors + - arm64: add HWCAP for FEAT_HBC (hinted conditional branches) + - arm64: cpufeature: Fix CLRBHB and BC detection + - net: add sysctl accept_ra_min_rtr_lft + - net: change accept_ra_min_rtr_lft to affect all RA lifetimes + - net: release reference to inet6_dev pointer + - iommu/arm-smmu-v3: Avoid constructing invalid range commands + - maple_tree: reduce resets during store setup + - maple_tree: add MAS_UNDERFLOW and MAS_OVERFLOW states + - iommu/apple-dart: Handle DMA_FQ domains in attach_dev() + - scsi: zfcp: Fix a double put in zfcp_port_enqueue() + - iommu/vt-d: Avoid memory allocation in iommu_suspend() + - net: mana: Fix TX CQE error handling + - net: ethernet: mediatek: disable irq before schedule napi + - mptcp: fix delegated action races + - mptcp: userspace pm allow creating id 0 subflow + - qed/red_ll2: Fix undefined behavior bug in struct qed_ll2_info + - Bluetooth: hci_codec: Fix leaking content of local_codecs + - wifi: brcmfmac: Replace 1-element arrays with flexible arrays + - Bluetooth: hci_sync: Fix handling of HCI_QUIRK_STRICT_DUPLICATE_FILTER + - wifi: rtw88: rtw8723d: Fix MAC address offset in EEPROM + - wifi: mwifiex: Fix tlv_buf_left calculation + - md/raid5: release batch_last before waiting for another stripe_head + - PCI/PM: Mark devices disconnected if upstream PCIe link is down on resume + - PCI: qcom: Fix IPQ8074 enumeration + - platform/x86/intel/ifs: release cpus_read_lock() + - net: replace calls to sock->ops->connect() with kernel_connect() + - btrfs: always print transaction aborted messages with an error level + - net: prevent rewrite of msg_name in sock_sendmsg() + - drm/i915: Don't set PIPE_CONTROL_FLUSH_L3 for aux inval + - drm/amd: Fix detection of _PR3 on the PCIe root port + - drm/amd: Fix logic error in sienna_cichlid_update_pcie_parameters() + - arm64: Add Cortex-A520 CPU part definition + - [Config] updateconfigs for ARM64_ERRATUM_2966298 + - arm64: errata: Add Cortex-A520 speculative unprivileged load workaround + - HID: sony: Fix a potential memory leak in sony_probe() + - wifi: mt76: fix lock dependency problem for wed_lock + - ubi: Refuse attaching if mtd's erasesize is 0 + - erofs: fix memory leak of LZMA global compressed deduplication + - wifi: cfg80211/mac80211: hold link BSSes when assoc fails for MLO connection + - iwlwifi: mvm: handle PS changes in vif_cfg_changed + - wifi: iwlwifi: dbg_ini: fix structure packing + - wifi: iwlwifi: mvm: Fix a memory corruption issue + - wifi: cfg80211: fix cqm_config access race + - rtla/timerlat_aa: Zero thread sum after every sample analysis + - rtla/timerlat_aa: Fix negative IRQ delay + - rtla/timerlat_aa: Fix previous IRQ delay for IRQs that happens after thread + sample + - wifi: cfg80211: add missing kernel-doc for cqm_rssi_work + - wifi: mac80211: fix mesh id corruption on 32 bit systems + - wifi: mwifiex: Fix oob check condition in mwifiex_process_rx_packet + - HID: nvidia-shield: add LEDS_CLASS dependency + - erofs: allow empty device tags in flatdev mode + - s390/bpf: Let arch_prepare_bpf_trampoline return program size + - leds: Drop BUG_ON check for LED_COLOR_ID_MULTI + - bpf: Fix tr dereferencing + - bpf: unconditionally reset backtrack_state masks on global func exit + - regulator: mt6358: split ops for buck and linear range LDO regulators + - Bluetooth: Delete unused hci_req_prepare_suspend() declaration + - Bluetooth: Fix hci_link_tx_to RCU lock usage + - Bluetooth: ISO: Fix handling of listen for unicast + - drivers/net: process the result of hdlc_open() and add call of hdlc_close() + in uhdlc_close() + - wifi: mt76: mt76x02: fix MT76x0 external LNA gain handling + - perf/x86/amd/core: Fix overflow reset on hotplug + - rtla/timerlat: Do not stop user-space if a cpu is offline + - regmap: rbtree: Fix wrong register marked as in-cache when creating new node + - wifi: mac80211: fix potential key use-after-free + - perf/x86/amd: Do not WARN() on every IRQ + - iommu/mediatek: Fix share pgtable for iova over 4GB + - wifi: mac80211: Create resources for disabled links + - regulator/core: regulator_register: set device->class earlier + - ima: Finish deprecation of IMA_TRUSTED_KEYRING Kconfig + - [Config] updateconfigs for IMA_BLACKLIST_KEYRING + - wifi: iwlwifi: mvm: Fix incorrect usage of scan API + - scsi: target: core: Fix deadlock due to recursive locking + - ima: rework CONFIG_IMA dependency block + - NFSv4: Fix a nfs4_state_manager() race + - ice: always add legacy 32byte RXDID in supported_rxdids + - bpf: tcp_read_skb needs to pop skb regardless of seq + - bpf, sockmap: Do not inc copied_seq when PEEK flag set + - bpf, sockmap: Reject sk_msg egress redirects to non-TCP sockets + - modpost: add missing else to the "of" check + - net: stmmac: platform: fix the incorrect parameter + - net: fix possible store tearing in neigh_periodic_work() + - neighbour: fix data-races around n->output + - ipv4, ipv6: Fix handling of transhdrlen in __ip{,6}_append_data() + - ptp: ocp: Fix error handling in ptp_ocp_device_init + - net: dsa: mv88e6xxx: Avoid EEPROM timeout when EEPROM is absent + - ovl: move freeing ovl_entry past rcu delay + - ovl: fetch inode once in ovl_dentry_revalidate_common() + - ipv6: tcp: add a missing nf_reset_ct() in 3WHS handling + - net: usb: smsc75xx: Fix uninit-value access in __smsc75xx_read_reg + - ethtool: plca: fix plca enable data type while parsing the value + - net: nfc: llcp: Add lock when modifying device list + - net: renesas: rswitch: Add spin lock protection for irq {un}mask + - rswitch: Fix PHY station management clock setting + - net: ethernet: ti: am65-cpsw: Fix error code in + am65_cpsw_nuss_init_tx_chns() + - ibmveth: Remove condition to recompute TCP header checksum. + - netfilter: nft_payload: rebuild vlan header on h_proto access + - netfilter: handle the connecting collision properly in + nf_conntrack_proto_sctp + - selftests: netfilter: Test nf_tables audit logging + - selftests: netfilter: Extend nft_audit.sh + - netfilter: nf_tables: Deduplicate nft_register_obj audit logs + - netfilter: nf_tables: nft_set_rbtree: fix spurious insertion failure + - ipv4: Set offload_failed flag in fibmatch results + - net: stmmac: dwmac-stm32: fix resume on STM32 MCU + - tipc: fix a potential deadlock on &tx->lock + - tcp: fix quick-ack counting to count actual ACKs of new data + - tcp: fix delayed ACKs for MSS boundary condition + - sctp: update transport state when processing a dupcook packet + - sctp: update hb timer immediately after users change hb_interval + - netlink: annotate data-races around sk->sk_err + - net: mana: Fix the tso_bytes calculation + - net: mana: Fix oversized sge0 for GSO packets + - HID: nvidia-shield: Fix a missing led_classdev_unregister() in the probe + error handling path + - HID: sony: remove duplicate NULL check before calling usb_free_urb() + - HID: intel-ish-hid: ipc: Disable and reenable ACPI GPE bit + - net: lan743x: also select PHYLIB + - parisc: Restore __ldcw_align for PA-RISC 2.0 processors + - smb: use kernel_connect() and kernel_bind() + - parisc: Fix crash with nr_cpus=1 option + - dm zoned: free dmz->ddev array in dmz_put_zoned_devices + - RDMA/core: Require admin capabilities to set system parameters + - of: dynamic: Fix potential memory leak in of_changeset_action() + - IB/mlx4: Fix the size of a buffer in add_port_entries() + - gpio: aspeed: fix the GPIO number passed to pinctrl_gpio_set_config() + - gpio: pxa: disable pinctrl calls for MMP_GPIO + - RDMA/cma: Initialize ib_sa_multicast structure to 0 when join + - RDMA/cma: Fix truncation compilation warning in make_cma_ports + - RDMA/bnxt_re: Fix the handling of control path response data + - RDMA/uverbs: Fix typo of sizeof argument + - RDMA/srp: Do not call scsi_done() from srp_abort() + - RDMA/siw: Fix connection failure handling + - RDMA/mlx5: Fix mkey cache possible deadlock on cleanup + - RDMA/mlx5: Fix assigning access flags to cache mkeys + - RDMA/mlx5: Fix mutex unlocking on error flow for steering anchor creation + - RDMA/mlx5: Fix NULL string error + - x86/sev: Change npages to unsigned long in snp_accept_memory() + - x86/sev: Use the GHCB protocol when available for SNP CPUID requests + - ksmbd: fix race condition between session lookup and expire + - ksmbd: fix uaf in smb20_oplock_break_ack + - ksmbd: fix race condition from parallel smb2 lock requests + - RDMA/mlx5: Remove not-used cache disable flag + - Linux 6.5.7 + + * Mantic update: v6.5.7 upstream stable release (LP: #2045806) // + CVE-2023-34324 + - xen/events: replace evtchn_rwlock with RCU + + * CVE-2023-6932 + - ipv4: igmp: fix refcnt uaf issue when receiving igmp query packet + + * CVE-2023-6531 + - io_uring/af_unix: disable sending io_uring over sockets + + * CVE-2023-6606 + - smb: client: fix OOB in smbCalcSize() + + * CVE-2023-6817 + - netfilter: nft_set_pipapo: skip inactive elements during set walk + + * Avoid using damage rectangle under hardware rotation mode when PSR is + enabled (LP: #2045958) + - drm/amd/display: fix hw rotated modes when PSR-SU is enabled + + * CVE-2023-46813 + - x86/sev: Disable MMIO emulation from user mode + - x86/sev: Check IOBM for IOIO exceptions from user-space + - x86/sev: Check for user-space IOIO pointing to kernel space + + * CVE-2023-6111 + - netfilter: nf_tables: remove catchall element in GC sync path + + * CVE-2023-5972 + - nf_tables: fix NULL pointer dereference in nft_inner_init() + - nf_tables: fix NULL pointer dereference in nft_expr_inner_parse() + + * Orchid Bay MLK2/Maya Bay MLK soundwire support (LP: #2042090) + - ASoC: Intel: soc-acpi-intel-mtl-match: add rt713 rt1316 config + - ASoC: Intel: sof_sdw_rt_sdca_jack_common: add rt713 support + - ASoC: Intel: sof_sdw_rt712_sdca: construct cards->components by name_prefix + - ASoC: Intel: soc-acpi: rt713+rt1316, no sdw-dmic config + + * Build failure if run in a console (LP: #2044512) + - [Packaging] Fix kernel module compression failures + + * Fix system suspend problem for Cirrus CS35L41 HDA codec on HP ZBook Fury 16 + G9 (LP: #2042060) + - ALSA: hda: cs35l41: Override the _DSD for HP Zbook Fury 17 G9 to correct + boost type + - ALSA: hda: cs35l41: Use reset label to get GPIO for HP Zbook Fury 17 G9 + - ALSA: hda: cs35l41: Assert reset before system suspend + - ALSA: hda: cs35l41: Assert Reset prior to de-asserting in probe and system + resume + - ALSA: hda: cs35l41: Run boot process during resume callbacks + - ALSA: hda: cs35l41: Force a software reset after hardware reset + - ALSA: hda: cs35l41: Do not unload firmware before reset in system suspend + - ALSA: hda: cs35l41: Check CSPL state after loading firmware + - ASoC: cs35l41: Detect CSPL errors when sending CSPL commands + + * Support speaker mute hotkey for Cirrus CS35L41 HDA codec (LP: #2039151) + - ALSA: hda: cs35l41: Support systems with missing _DSD properties + - ALSA: hda: cs35l41: Fix the loop check in cs35l41_add_dsd_properties + - ALSA: hda: cs35l41: Add notification support into component binding + - ALSA: hda/realtek: Support ACPI Notification framework via component binding + - ALSA: hda: cs35l41: Support mute notifications for CS35L41 HDA + - ALSA: hda: cs35l41: Add read-only ALSA control for forced mute + + * Add SoF topology support on Intel RaptorLake DELL SKU 0C11 (LP: #2038263) + - ASoC: Intel: soc-acpi-intel-rpl-match: add rt711-l0-rt1316-l12 support + + * Update io_uring to 6.6 (LP: #2043730) + - fs: create kiocb_{start,end}_write() helpers + - fs: add IOCB flags related to passing back dio completions + - io_uring/poll: always set 'ctx' in io_cancel_data + - io_uring/timeout: always set 'ctx' in io_cancel_data + - io_uring/cancel: abstract out request match helper + - io_uring/cancel: fix sequence matching for IORING_ASYNC_CANCEL_ANY + - io_uring: use cancelation match helper for poll and timeout requests + - io_uring/cancel: add IORING_ASYNC_CANCEL_USERDATA + - io_uring/cancel: support opcode based lookup and cancelation + - io_uring/cancel: wire up IORING_ASYNC_CANCEL_OP for sync cancel + - io_uring/rw: add write support for IOCB_DIO_CALLER_COMP + - io_uring: Add io_uring command support for sockets + - io_uring/rsrc: Remove unused declaration io_rsrc_put_tw() + - io_uring: cleanup 'ret' handling in io_iopoll_check() + - io_uring/fdinfo: get rid of ref tryget + - io_uring/splice: use fput() directly + - io_uring: have io_file_put() take an io_kiocb rather than the file + - io_uring: remove unnecessary forward declaration + - io_uring/io-wq: don't grab wq->lock for worker activation + - io_uring/io-wq: reduce frequency of acct->lock acquisitions + - io_uring/io-wq: don't gate worker wake up success on wake_up_process() + - io_uring: open code io_fill_cqe_req() + - io_uring: remove return from io_req_cqe_overflow() + - io_uring: never overflow io_aux_cqe + - io_uring/rsrc: keep one global dummy_ubuf + - io_uring: simplify io_run_task_work_sig return + - io_uring/rsrc: Annotate struct io_mapped_ubuf with __counted_by + - io_uring: rename kiocb_end_write() local helper + - io_uring: use kiocb_{start,end}_write() helpers + - io_uring: stop calling free_compound_page() + - io_uring: improve cqe !tracing hot path + - io_uring: cqe init hardening + - io_uring: simplify big_cqe handling + - io_uring: refactor __io_get_cqe() + - io_uring: optimise extra io_get_cqe null check + - io_uring: reorder cqring_flush and wakeups + - io_uring: merge iopoll and normal completion paths + - io_uring: force inline io_fill_cqe_req + - io_uring: compact SQ/CQ heads/tails + - io_uring: add option to remove SQ indirection + - io_uring: move non aligned field to the end + - io_uring: banish non-hot data to end of io_ring_ctx + - io_uring: separate task_work/waiting cache line + - io_uring: move multishot cqe cache in ctx + - io_uring: move iopoll ctx fields around + - io_uring: fix IO hang in io_wq_put_and_exit from do_exit() + - io_uring/fdinfo: only print ->sq_array[] if it's there + - io_uring: fix unprotected iopoll overflow + - Revert "io_uring: fix IO hang in io_wq_put_and_exit from do_exit()" + - io_uring/kbuf: don't allow registered buffer rings on highmem pages + - io_uring: ensure io_lockdep_assert_cq_locked() handles disabled rings + - io_uring: don't allow IORING_SETUP_NO_MMAP rings on highmem pages + - io-wq: fully initialize wqe before calling + cpuhp_state_add_instance_nocalls() + - io_uring: fix crash with IORING_SETUP_NO_MMAP and invalid SQ ring address + - io_uring/fdinfo: lock SQ thread while retrieving thread cpu/pid + - io_uring/rw: disable IOCB_DIO_CALLER_COMP + - io_uring: kiocb_done() should *not* trust ->ki_pos if ->{read,write}_iter() + failed + + * System hang after unplug/plug DP monitor with AMD W7500 card (LP: #2042912) + - drm/amd/pm: Fix error of MACO flag setting code + + * correct cephfs pull request for uidmap support (LP: #2041613) + - Revert "UBUNTU: SAUCE: ceph: BUG if MDS changed truncate_seq with client + caps still outstanding" + - Revert "UBUNTU: SAUCE: ceph: make sure all the files successfully put before + unmounting" + - Revert "UBUNTU: SAUCE: mm: BUG if filemap_alloc_folio gives us a folio with + a non-NULL ->private" + - Revert "UBUNTU: SAUCE: ceph: dump info about cap flushes when we're waiting + too long for them" + - Revert "UBUNTU: SAUCE: rbd: bump RBD_MAX_PARENT_CHAIN_LEN to 128" + + * RTL8111EPP: Fix the network lost after resume with DASH (LP: #2043786) + - r8169: add handling DASH when DASH is disabled + - r8169: fix network lost after resume on DASH systems + + * kernel BUG: io_uring openat triggers audit reference count underflow + (LP: #2043841) + - audit, io_uring: io_uring openat triggers audit reference count underflow + + * Fix ADL: System enabled AHCI can't get into s0ix when attached ODD + (LP: #2037493) + - ata: ahci: Add Intel Alder Lake-P AHCI controller to low power chipsets list + + * [UBUNTU 23.04] Kernel config option missing for s390x PCI passthrough + (LP: #2042853) + - [Config] CONFIG_VFIO_PCI_ZDEV_KVM=y + + * Azure: Fix Azure vendor ID (LP: #2036600) + - SAUCE: (no-up) hv: Fix supply vendor ID + + * Mantic update: v6.5.6 upstream stable release (LP: #2044174) + - NFS: Fix error handling for O_DIRECT write scheduling + - NFS: Fix O_DIRECT locking issues + - NFS: More O_DIRECT accounting fixes for error paths + - NFS: Use the correct commit info in nfs_join_page_group() + - NFS: More fixes for nfs_direct_write_reschedule_io() + - NFS/pNFS: Report EINVAL errors from connect() to the server + - SUNRPC: Mark the cred for revalidation if the server rejects it + - NFSv4.1: use EXCHGID4_FLAG_USE_PNFS_DS for DS server + - NFSv4.1: fix pnfs MDS=DS session trunking + - media: v4l: Use correct dependency for camera sensor drivers + - media: via: Use correct dependency for camera sensor drivers + - gfs2: Fix another freeze/thaw hang + - netfs: Only call folio_start_fscache() one time for each folio + - btrfs: improve error message after failure to add delayed dir index item + - btrfs: remove BUG() after failure to insert delayed dir index item + - ext4: replace the traditional ternary conditional operator with with + max()/min() + - ext4: move setting of trimmed bit into ext4_try_to_trim_range() + - ext4: do not let fstrim block system suspend + - netfilter: nft_set_rbtree: use read spinlock to avoid datapath contention + - netfilter: nft_set_pipapo: call nft_trans_gc_queue_sync() in catchall GC + - netfilter: nft_set_pipapo: stop GC iteration if GC transaction allocation + fails + - netfilter: nft_set_hash: try later when GC hits EAGAIN on iteration + - netfilter: nf_tables: fix memleak when more than 255 elements expired + - ASoC: meson: spdifin: start hw on dai probe + - netfilter: nf_tables: disallow element removal on anonymous sets + - bpf: Avoid deadlock when using queue and stack maps from NMI + - bpf: Avoid dummy bpf_offload_netdev in __bpf_prog_dev_bound_init + - ALSA: docs: Fix a typo of midi2_ump_probe option for snd-usb-audio + - ALSA: seq: Avoid delivery of events for disabled UMP groups + - ASoC: rt5640: Revert "Fix sleep in atomic context" + - ASoC: rt5640: Fix sleep in atomic context + - ASoC: rt5640: fix typos + - ASoC: rt5640: Do not disable/enable IRQ twice on suspend/resume + - ASoC: rt5640: Enable the IRQ on resume after configuring jack-detect + - ASoC: rt5640: Fix IRQ not being free-ed for HDA jack detect mode + - bpf: Fix a erroneous check after snprintf() + - selftests/bpf: fix unpriv_disabled check in test_verifier + - ALSA: hda/realtek: Splitting the UX3402 into two separate models + - netfilter: conntrack: fix extension size table + - netfilter: nf_tables: Fix entries val in rule reset audit log + - Compiler Attributes: counted_by: Adjust name and identifier expansion + - uapi: stddef.h: Fix header guard location + - uapi: stddef.h: Fix __DECLARE_FLEX_ARRAY for C++ + - memblock tests: Fix compilation errors. + - ASoC: SOF: ipc4-topology: fix wrong sizeof argument + - net: microchip: sparx5: Fix memory leak for + vcap_api_rule_add_keyvalue_test() + - net: microchip: sparx5: Fix memory leak for + vcap_api_rule_add_actionvalue_test() + - net: microchip: sparx5: Fix possible memory leak in + vcap_api_encode_rule_test() + - net: microchip: sparx5: Fix possible memory leaks in + test_vcap_xn_rule_creator() + - net: microchip: sparx5: Fix possible memory leaks in vcap_api_kunit + - selftests: tls: swap the TX and RX sockets in some tests + - net/core: Fix ETH_P_1588 flow dissector + - ALSA: seq: ump: Fix -Wformat-truncation warning + - ASoC: hdaudio.c: Add missing check for devm_kstrdup + - ASoC: imx-audmix: Fix return error with devm_clk_get() + - octeon_ep: fix tx dma unmap len values in SG + - iavf: do not process adminq tasks when __IAVF_IN_REMOVE_TASK is set + - ASoC: SOF: core: Only call sof_ops_free() on remove if the probe was + successful + - iavf: add iavf_schedule_aq_request() helper + - iavf: schedule a request immediately after add/delete vlan + - i40e: Fix VF VLAN offloading when port VLAN is configured + - netfilter, bpf: Adjust timeouts of non-confirmed CTs in + bpf_ct_insert_entry() + - ionic: fix 16bit math issue when PAGE_SIZE >= 64KB + - igc: Fix infinite initialization loop with early XDP redirect + - scsi: iscsi_tcp: restrict to TCP sockets + - powerpc/perf/hv-24x7: Update domain value check + - powerpc/dexcr: Move HASHCHK trap handler + - dccp: fix dccp_v4_err()/dccp_v6_err() again + - x86/mm, kexec, ima: Use memblock_free_late() from ima_free_kexec_buffer() + - net: hsr: Properly parse HSRv1 supervisor frames. + - platform/x86: intel_scu_ipc: Check status after timeout in busy_loop() + - platform/x86: intel_scu_ipc: Check status upon timeout in + ipc_wait_for_interrupt() + - platform/x86: intel_scu_ipc: Don't override scu in + intel_scu_ipc_dev_simple_command() + - platform/x86: intel_scu_ipc: Fail IPC send if still busy + - x86/asm: Fix build of UML with KASAN + - x86/srso: Fix srso_show_state() side effect + - x86/srso: Set CPUID feature bits independently of bug or mitigation status + - x86/srso: Don't probe microcode in a guest + - x86/srso: Fix SBPB enablement for spec_rstack_overflow=off + - net: hns3: add cmdq check for vf periodic service task + - net: hns3: fix GRE checksum offload issue + - net: hns3: only enable unicast promisc when mac table full + - net: hns3: fix fail to delete tc flower rules during reset issue + - net: hns3: add 5ms delay before clear firmware reset irq source + - net: bridge: use DEV_STATS_INC() + - team: fix null-ptr-deref when team device type is changed + - net: rds: Fix possible NULL-pointer dereference + - vxlan: Add missing entries to vxlan_get_size() + - netfilter: nf_tables: disable toggling dormant table state more than once + - net: hinic: Fix warning-hinic_set_vlan_fliter() warn: variable dereferenced + before check 'hwdev' + - net/handshake: Fix memory leak in __sock_create() and sock_alloc_file() + - i915/pmu: Move execlist stats initialization to execlist specific setup + - drm/virtio: clean out_fence on complete_submit + - locking/seqlock: Do the lockdep annotation before locking in + do_write_seqcount_begin_nested() + - net: ena: Flush XDP packets on error. + - bnxt_en: Flush XDP for bnxt_poll_nitroa0()'s NAPI + - octeontx2-pf: Do xdp_do_flush() after redirects. + - igc: Expose tx-usecs coalesce setting to user + - cxl/region: Match auto-discovered region decoders by HPA range + - proc: nommu: /proc//maps: release mmap read lock + - proc: nommu: fix empty /proc//maps + - cifs: Fix UAF in cifs_demultiplex_thread() + - gpio: tb10x: Fix an error handling path in tb10x_gpio_probe() + - i2c: mux: demux-pinctrl: check the return value of devm_kstrdup() + - i2c: mux: gpio: Add missing fwnode_handle_put() + - i2c: xiic: Correct return value check for xiic_reinit() + - drm/amdgpu: set completion status as preempted for the resubmission + - ASoC: cs35l56: Disable low-power hibernation mode + - drm/amd/display: Update DPG test pattern programming + - drm/amd/display: fix a regression in blank pixel data caused by coding + mistake + - arm64: dts: qcom: sdm845-db845c: Mark cont splash memory region as reserved + - direct_write_fallback(): on error revert the ->ki_pos update from buffered + write + - btrfs: reset destination buffer when read_extent_buffer() gets invalid range + - vfio/mdev: Fix a null-ptr-deref bug for mdev_unregister_parent() + - MIPS: Alchemy: only build mmc support helpers if au1xmmc is enabled + - spi: spi-gxp: BUG: Correct spi write return value + - bus: ti-sysc: Use fsleep() instead of usleep_range() in sysc_reset() + - bus: ti-sysc: Fix missing AM35xx SoC matching + - firmware: arm_scmi: Harden perf domain info access + - firmware: arm_scmi: Fixup perf power-cost/microwatt support + - power: supply: mt6370: Fix missing error code in mt6370_chg_toggle_cfo() + - clk: sprd: Fix thm_parents incorrect configuration + - clk: si521xx: Use REGCACHE_FLAT instead of NONE + - clk: si521xx: Fix regmap write accessor + - clk: tegra: fix error return case for recalc_rate + - ARM: dts: ti: omap: Fix bandgap thermal cells addressing for omap3/4 + - ARM: dts: ti: omap: motorola-mapphone: Fix abe_clkctrl warning on boot + - bus: ti-sysc: Fix SYSC_QUIRK_SWSUP_SIDLE_ACT handling for uart wake-up + - swiotlb: use the calculated number of areas + - power: supply: ucs1002: fix error code in ucs1002_get_property() + - power: supply: rt9467: Fix rt9467_run_aicl() + - power: supply: core: fix use after free in uevent + - firmware: imx-dsp: Fix an error handling path in imx_dsp_setup_channels() + - xtensa: add default definition for XCHAL_HAVE_DIV32 + - xtensa: iss/network: make functions static + - xtensa: boot: don't add include-dirs + - xtensa: umulsidi3: fix conditional expression + - xtensa: boot/lib: fix function prototypes + - power: supply: rk817: Fix node refcount leak + - powerpc/stacktrace: Fix arch_stack_walk_reliable() + - selftests/powerpc: Fix emit_tests to work with run_kselftest.sh + - arm64: dts: imx8mp: Fix SDMA2/3 clocks + - arm64: dts: imx8mp-beacon-kit: Fix audio_pll2 clock + - soc: imx8m: Enable OCOTP clock for imx8mm before reading registers + - arm64: dts: imx8mm-evk: Fix hdmi@3d node + - arm64: dts: imx: Add imx8mm-prt8mm.dtb to build + - firmware: arm_ffa: Don't set the memory region attributes for MEM_LEND + - i915/guc: Get runtime pm in busyness worker only if already active + - accel/ivpu: Do not use wait event interruptible + - gpio: pmic-eic-sprd: Add can_sleep flag for PMIC EIC chip + - i2c: npcm7xx: Fix callback completion ordering + - NFSD: Fix zero NFSv4 READ results when RQ_SPLICE_OK is not set + - x86/reboot: VMCLEAR active VMCSes before emergency reboot + - dma-debug: don't call __dma_entry_alloc_check_leak() under free_entries_lock + - bpf: Annotate bpf_long_memcpy with data_race + - ASoC: amd: yc: Add DMI entries to support Victus by HP Gaming Laptop + 15-fb0xxx (8A3E) + - spi: sun6i: reduce DMA RX transfer width to single byte + - spi: sun6i: fix race between DMA RX transfer completion and RX FIFO drain + - nvme-fc: Prevent null pointer dereference in nvme_fc_io_getuuid() + - parisc: sba: Fix compile warning wrt list of SBA devices + - parisc: sba-iommu: Fix sparse warnigs + - parisc: ccio-dma: Fix sparse warnings + - parisc: iosapic.c: Fix sparse warnings + - parisc: drivers: Fix sparse warning + - parisc: irq: Make irq_stack_union static to avoid sparse warning + - scsi: qedf: Add synchronization between I/O completions and abort + - scsi: ufs: core: Move __ufshcd_send_uic_cmd() outside host_lock + - scsi: ufs: core: Poll HCS.UCRDY before issuing a UIC command + - selftests/ftrace: Correctly enable event in instance-event.tc + - ring-buffer: Avoid softlockup in ring_buffer_resize() + - btrfs: assert delayed node locked when removing delayed item + - selftests: fix dependency checker script + - ring-buffer: Do not attempt to read past "commit" + - net/smc: bugfix for smcr v2 server connect success statistic + - ata: sata_mv: Fix incorrect string length computation in mv_dump_mem() + - efi/x86: Ensure that EFI_RUNTIME_MAP is enabled for kexec + - platform/mellanox: mlxbf-bootctl: add NET dependency into Kconfig + - platform/x86: asus-wmi: Support 2023 ROG X16 tablet mode + - thermal/of: add missing of_node_put() + - drm/amdgpu: Store CU info from all XCCs for GFX v9.4.3 + - drm/amdkfd: Update cache info reporting for GFX v9.4.3 + - drm/amdkfd: Update CU masking for GFX 9.4.3 + - drm/amd/display: Don't check registers, if using AUX BL control + - drm/amdgpu/soc21: don't remap HDP registers for SR-IOV + - drm/amdgpu/nbio4.3: set proper rmmio_remap.reg_offset for SR-IOV + - drm/amdgpu: fallback to old RAS error message for aqua_vanjaram + - drm/amdkfd: Checkpoint and restore queues on GFX11 + - drm/amdgpu: Handle null atom context in VBIOS info ioctl + - objtool: Fix _THIS_IP_ detection for cold functions + - nvme-pci: do not set the NUMA node of device if it has none + - riscv: errata: fix T-Head dcache.cva encoding + - scsi: pm80xx: Use phy-specific SAS address when sending PHY_START command + - scsi: pm80xx: Avoid leaking tags when processing + OPC_INB_SET_CONTROLLER_CONFIG command + - smb3: correct places where ENOTSUPP is used instead of preferred EOPNOTSUPP + - ata: libata-eh: do not clear ATA_PFLAG_EH_PENDING in ata_eh_reset() + - ata: libata-eh: do not thaw the port twice in ata_eh_reset() + - Add DMI ID for MSI Bravo 15 B7ED + - spi: nxp-fspi: reset the FLSHxCR1 registers + - spi: stm32: add a delay before SPI disable + - ASoC: fsl: imx-pcm-rpmsg: Add SNDRV_PCM_INFO_BATCH flag + - spi: intel-pci: Add support for Granite Rapids SPI serial flash + - bpf: Clarify error expectations from bpf_clone_redirect + - ASoC: rt5640: Only cancel jack-detect work on suspend if active + - ALSA: hda: intel-sdw-acpi: Use u8 type for link index + - ASoC: cs42l42: Ensure a reset pulse meets minimum pulse width. + - ASoC: cs42l42: Don't rely on GPIOD_OUT_LOW to set RESET initially low + - ASoC: cs42l42: Avoid stale SoundWire ATTACH after hard reset + - firmware: cirrus: cs_dsp: Only log list of algorithms in debug build + - ASoC: wm_adsp: Fix missing locking in wm_adsp_[read|write]_ctl() + - memblock tests: fix warning: "__ALIGN_KERNEL" redefined + - memblock tests: fix warning ‘struct seq_file’ declared inside parameter list + - ASoC: imx-rpmsg: Set ignore_pmdown_time for dai_link + - ASoC: SOF: sof-audio: Fix DSP core put imbalance on widget setup failure + - media: vb2: frame_vector.c: replace WARN_ONCE with a comment + - NFSv4.1: fix zero value filehandle in post open getattr + - ASoC: SOF: Intel: MTL: Reduce the DSP init timeout + - powerpc/watchpoints: Disable preemption in thread_change_pc() + - powerpc/watchpoint: Disable pagefaults when getting user instruction + - powerpc/watchpoints: Annotate atomic context in more places + - ncsi: Propagate carrier gain/loss events to the NCSI controller + - net: hsr: Add __packed to struct hsr_sup_tlv. + - tsnep: Fix NAPI scheduling + - tsnep: Fix ethtool channels + - tsnep: Fix NAPI polling with budget 0 + - gfs2: fix glock shrinker ref issues + - i2c: designware: fix __i2c_dw_disable() in case master is holding SCL low + - LoongArch: Use _UL() and _ULL() + - LoongArch: Set all reserved memblocks on Node#0 at initialization + - fbdev/sh7760fb: Depend on FB=y + - perf build: Define YYNOMEM as YYNOABORT for bison < 3.81 + - ASoC: cs35l56: Call pm_runtime_dont_use_autosuspend() + - iommu/arm-smmu-v3: Fix soft lockup triggered by arm_smmu_mm_invalidate_range + - spi: zynqmp-gqspi: fix clock imbalance on probe failure + - x86/sgx: Resolves SECS reclaim vs. page fault for EAUG race + - x86/srso: Add SRSO mitigation for Hygon processors + - KVM: SVM: INTERCEPT_RDTSCP is never intercepted anyway + - KVM: SVM: Fix TSC_AUX virtualization setup + - KVM: x86/mmu: Open code leaf invalidation from mmu_notifier + - KVM: x86/mmu: Do not filter address spaces in + for_each_tdp_mmu_root_yield_safe() + - KVM: x86/mmu: Stop zapping invalidated TDP MMU roots asynchronously + - mptcp: fix bogus receive window shrinkage with multiple subflows + - mptcp: move __mptcp_error_report in protocol.c + - mptcp: process pending subflow error on close + - Revert "tty: n_gsm: fix UAF in gsm_cleanup_mux" + - scsi: core: ata: Do no try to probe for CDL on old drives + - serial: 8250_port: Check IRQ data before use + - nilfs2: fix potential use after free in nilfs_gccache_submit_read_data() + - crypto: sm2 - Fix crash caused by uninitialized context + - ALSA: rawmidi: Fix NULL dereference at proc read + - ALSA: hda: Disable power save for solving pop issue on Lenovo ThinkCentre + M70q + - LoongArch: Fix lockdep static memory detection + - LoongArch: Define relocation types for ABI v2.10 + - LoongArch: numa: Fix high_memory calculation + - LoongArch: Add support for 32_PCREL relocation type + - LoongArch: Add support for 64_PCREL relocation type + - ata: libata-scsi: link ata port and scsi device + - scsi: sd: Differentiate system and runtime start/stop management + - scsi: sd: Do not issue commands to suspended disks on shutdown + - ata: libata-scsi: ignore reserved bits for REPORT SUPPORTED OPERATION CODES + - io_uring/fs: remove sqe->rw_flags checking from LINKAT + - i2c: i801: unregister tco_pdev in i801_probe() error path + - ASoC: amd: yc: Fix non-functional mic on Lenovo 82QF and 82UG + - kernel/sched: Modify initial boot task idle setup + - sched/rt: Fix live lock between select_fallback_rq() and RT push + - Revert "SUNRPC dont update timeout value on connection reset" + - NFSv4: Fix a state manager thread deadlock regression + - ACPI: NFIT: Fix incorrect calculation of idt size + - timers: Tag (hr)timer softirq as hotplug safe + - drm/tests: Fix incorrect argument in drm_test_mm_insert_range + - cxl/mbox: Fix CEL logic for poison and security commands + - arm64: defconfig: remove CONFIG_COMMON_CLK_NPCM8XX=y + - mm/damon/vaddr-test: fix memory leak in damon_do_test_apply_three_regions() + - selftests/mm: fix awk usage in charge_reserved_hugetlb.sh and + hugetlb_reparenting_test.sh that may cause error + - mm: mempolicy: keep VMA walk if both MPOL_MF_STRICT and MPOL_MF_MOVE are + specified + - mm/slab_common: fix slab_caches list corruption after kmem_cache_destroy() + - mm: page_alloc: fix CMA and HIGHATOMIC landing on the wrong buddy list + - mm: memcontrol: fix GFP_NOFS recursion in memory.high enforcement + - cxl/port: Fix cxl_test register enumeration regression + - cxl/pci: Fix appropriate checking for _OSC while handling CXL RAS registers + - ring-buffer: Fix bytes info in per_cpu buffer stats + - ring-buffer: Update "shortest_full" in polling + - btrfs: refresh dir last index during a rewinddir(3) call + - btrfs: file_remove_privs needs an exclusive lock in direct io write + - btrfs: set last dir index to the current last index when opening dir + - btrfs: fix race between reading a directory and adding entries to it + - btrfs: properly report 0 avail for very full file systems + - media: uvcvideo: Fix OOB read + - bpf: Add override check to kprobe multi link attach + - bpf: Fix BTF_ID symbol generation collision + - bpf: Fix BTF_ID symbol generation collision in tools/ + - net: thunderbolt: Fix TCPv6 GSO checksum calculation + - thermal: sysfs: Fix trip_point_hyst_store() + - tracing/user_events: Align set_bit() address for all archs + - ata: libata-core: Fix ata_port_request_pm() locking + - ata: libata-core: Fix port and device removal + - ata: libata-core: Do not register PM operations for SAS ports + - ata: libata-sata: increase PMP SRST timeout to 10s + - i915: Limit the length of an sg list to the requested length + - drm/i915/gt: Fix reservation address in ggtt_reserve_guc_top + - power: supply: rk817: Add missing module alias + - power: supply: ab8500: Set typing and props + - fs: binfmt_elf_efpic: fix personality for ELF-FDPIC + - drm/amdkfd: Use gpu_offset for user queue's wptr + - drm/amd/display: fix the ability to use lower resolution modes on eDP + - drm/meson: fix memory leak on ->hpd_notify callback + - rbd: move rbd_dev_refresh() definition + - rbd: decouple header read-in from updating rbd_dev->header + - rbd: decouple parent info read-in from updating rbd_dev + - rbd: take header_rwsem in rbd_dev_refresh() only when updating + - memcg: drop kmem.limit_in_bytes + - mm, memcg: reconsider kmem.limit_in_bytes deprecation + - ASoC: amd: yc: Fix a non-functional mic on Lenovo 82TL + - Linux 6.5.6 + + * Mantic update: v6.5.5 upstream stable release (LP: #2043416) + - iomap: Fix possible overflow condition in iomap_write_delalloc_scan + - autofs: fix memory leak of waitqueues in autofs_catatonic_mode + - btrfs: handle errors properly in update_inline_extent_backref() + - btrfs: output extra debug info if we failed to find an inline backref + - locks: fix KASAN: use-after-free in trace_event_raw_event_filelock_lock + - ACPICA: Add AML_NO_OPERAND_RESOLVE flag to Timer + - kernel/fork: beware of __put_task_struct() calling context + - rcuscale: Move rcu_scale_writer() schedule_timeout_uninterruptible() to + _idle() + - scftorture: Forgive memory-allocation failure if KASAN + - ACPI: video: Add backlight=native DMI quirk for Lenovo Ideapad Z470 + - platform/chrome: cros_ec_lpc: Remove EC panic shutdown timeout + - x86/amd_nb: Add PCI IDs for AMD Family 1Ah-based models + - perf/smmuv3: Enable HiSilicon Erratum 162001900 quirk for HIP08/09 + - s390/boot: cleanup number of page table levels setup + - kselftest/arm64: fix a memleak in zt_regs_run() + - perf/imx_ddr: speed up overflow frequency of cycle + - ACPI: video: Add backlight=native DMI quirk for Apple iMac12,1 and iMac12,2 + - hw_breakpoint: fix single-stepping when using bpf_overflow_handler + - ACPI: x86: s2idle: Catch multiple ACPI_TYPE_PACKAGE objects + - selftests/nolibc: fix up kernel parameters support + - selftests/nolibc: prevent out of bounds access in expect_vfprintf + - spi: sun6i: add quirk for dual and quad SPI modes support + - devlink: remove reload failed checks in params get/set callbacks + - crypto: lrw,xts - Replace strlcpy with strscpy + - ice: Don't tx before switchdev is fully configured + - wifi: ath9k: fix fortify warnings + - wifi: ath9k: fix printk specifier + - wifi: rtw88: delete timer and free skb queue when unloading + - wifi: mwifiex: fix fortify warning + - mt76: mt7921: don't assume adequate headroom for SDIO headers + - wifi: wil6210: fix fortify warnings + - can: sun4i_can: Add acceptance register quirk + - can: sun4i_can: Add support for the Allwinner D1 + - [Config] updateconfigs for CAN_SUN4I + - net: Use sockaddr_storage for getsockopt(SO_PEERNAME). + - wifi: ath12k: Fix a NULL pointer dereference in ath12k_mac_op_hw_scan() + - wifi: ath12k: avoid array overflow of hw mode for preferred_hw_mode + - net/ipv4: return the real errno instead of -EINVAL + - crypto: lib/mpi - avoid null pointer deref in mpi_cmp_ui() + - Bluetooth: btusb: Add device 0489:e0f5 as MT7922 device + - Bluetooth: btusb: Add a new VID/PID 0489/e0f6 for MT7922 + - Bluetooth: btusb: Add new VID/PID 0489/e102 for MT7922 + - Bluetooth: btusb: Add new VID/PID 04ca/3804 for MT7922 + - Bluetooth: Fix hci_suspend_sync crash + - Bluetooth: btusb: Add support for another MediaTek 7922 VID/PID + - netlink: convert nlk->flags to atomic flags + - tpm_tis: Resend command to recover from data transfer errors + - mmc: sdhci-esdhc-imx: improve ESDHC_FLAG_ERR010450 + - alx: fix OOB-read compiler warning + - wifi: iwlwifi: pcie: avoid a warning in case prepare card failed + - wifi: mac80211: check S1G action frame size + - netfilter: ebtables: fix fortify warnings in size_entry_mwt() + - wifi: cfg80211: reject auth/assoc to AP with our address + - wifi: cfg80211: ocb: don't leave if not joined + - wifi: mac80211: check for station first in client probe + - wifi: mac80211_hwsim: drop short frames + - Revert "wifi: mac80211_hwsim: check the return value of nla_put_u32" + - libbpf: Free btf_vmlinux when closing bpf_object + - wifi: ath12k: Fix memory leak in rx_desc and tx_desc + - wifi: ath12k: add check max message length while scanning with extraie + - Fix nomenclature for USB and PCI wireless devices + - bpf: Consider non-owning refs trusted + - bpf: Consider non-owning refs to refcounted nodes RCU protected + - drm/bridge: tc358762: Instruct DSI host to generate HSE packets + - drm/edid: Add quirk for OSVR HDK 2.0 + - drm: bridge: samsung-dsim: Drain command transfer FIFO before transfer + - arm64: dts: qcom: sm6125-pdx201: correct ramoops pmsg-size + - arm64: dts: qcom: sm6125-sprout: correct ramoops pmsg-size + - arm64: dts: qcom: sm6350: correct ramoops pmsg-size + - arm64: dts: qcom: sm8150-kumano: correct ramoops pmsg-size + - arm64: dts: qcom: sm8250-edo: correct ramoops pmsg-size + - drm/amdgpu: Increase soft IH ring size + - samples/hw_breakpoint: Fix kernel BUG 'invalid opcode: 0000' + - drm/amdgpu: Update ring scheduler info as needed + - drm/amd/display: Fix underflow issue on 175hz timing + - ASoC: SOF: topology: simplify code to prevent static analysis warnings + - ASoC: Intel: sof_sdw: Update BT offload config for soundwire config + - ALSA: hda: intel-dsp-cfg: add LunarLake support + - drm/amd/display: Use DTBCLK as refclk instead of DPREFCLK + - drm/amd/display: Blocking invalid 420 modes on HDMI TMDS for DCN31 + - drm/amd/display: Blocking invalid 420 modes on HDMI TMDS for DCN314 + - drm/amd/display: Use max memclk variable when setting max memclk + - drm/msm/adreno: Use quirk identify hw_apriv + - drm/msm/adreno: Use quirk to identify cached-coherent support + - drm/exynos: fix a possible null-pointer dereference due to data race in + exynos_drm_crtc_atomic_disable() + - io_uring: annotate the struct io_kiocb slab for appropriate user copy + - drm/mediatek: dp: Change logging to dev for mtk_dp_aux_transfer() + - bus: ti-sysc: Configure uart quirks for k3 SoC + - arm64: dts: qcom: sc8280xp-x13s: Add camera activity LED + - md: raid1: fix potential OOB in raid1_remove_disk() + - ext2: fix datatype of block number in ext2_xattr_set2() + - blk-mq: fix tags leak when shrink nr_hw_queues + - ASoC: SOF: amd: clear panic mask status when panic occurs + - x86: bring back rep movsq for user access on CPUs without ERMS + - fs/jfs: prevent double-free in dbUnmount() after failed jfs_remount() + - jfs: fix invalid free of JFS_IP(ipimap)->i_imap in diUnmount + - ext4: add two helper functions extent_logical_end() and pa_logical_end() + - ext4: avoid overlapping preallocations due to overflow + - PCI: dwc: Provide deinit callback for i.MX + - ARM: 9317/1: kexec: Make smp stop calls asynchronous + - powerpc/pseries: fix possible memory leak in ibmebus_bus_init() + - PCI: vmd: Disable bridge window for domain reset + - PCI: fu740: Set the number of MSI vectors + - media: mdp3: Fix resource leaks in of_find_device_by_node + - media: dvb-usb-v2: af9035: Fix null-ptr-deref in af9035_i2c_master_xfer + - media: dw2102: Fix null-ptr-deref in dw2102_i2c_transfer() + - media: af9005: Fix null-ptr-deref in af9005_i2c_xfer + - media: anysee: fix null-ptr-deref in anysee_master_xfer + - media: az6007: Fix null-ptr-deref in az6007_i2c_xfer() + - media: dvb-usb-v2: gl861: Fix null-ptr-deref in gl861_i2c_master_xfer + - scsi: lpfc: Abort outstanding ELS cmds when mailbox timeout error is + detected + - media: tuners: qt1010: replace BUG_ON with a regular error + - media: pci: cx23885: replace BUG with error return + - usb: cdns3: Put the cdns set active part outside the spin lock + - usb: typec: intel_pmc_mux: Add new ACPI ID for Lunar Lake IOM device + - usb: gadget: fsl_qe_udc: validate endpoint index for ch9 udc + - tools: iio: iio_generic_buffer: Fix some integer type and calculation + - scsi: target: iscsi: Fix buffer overflow in lio_target_nacl_info_show() + - serial: cpm_uart: Avoid suspicious locking + - misc: open-dice: make OPEN_DICE depend on HAS_IOMEM + - usb: dwc3: dwc3-octeon: Verify clock divider + - usb: ehci: add workaround for chipidea PORTSC.PEC bug + - usb: chipidea: add workaround for chipidea PEC bug + - media: pci: ipu3-cio2: Initialise timing struct to avoid a compiler warning + - kobject: Add sanity check for kset->kobj.ktype in kset_register() + - interconnect: Fix locking for runpm vs reclaim + - usb: typec: qcom-pmic-typec: register drm_bridge + - printk: Reduce console_unblank() usage in unsafe scenarios + - printk: Keep non-panic-CPUs out of console lock + - printk: Do not take console lock for console_flush_on_panic() + - printk: Consolidate console deferred printing + - printk: Rename abandon_console_lock_in_panic() to other_cpu_in_panic() + - ext4: fix BUG in ext4_mb_new_inode_pa() due to overflow + - btrfs: introduce struct to consolidate extent buffer write context + - btrfs: zoned: introduce block group context to btrfs_eb_write_context + - btrfs: zoned: return int from btrfs_check_meta_write_pointer + - btrfs: zoned: defer advancing meta write pointer + - btrfs: zoned: activate metadata block group on write time + - mtd: spi-nor: spansion: use CLPEF as an alternative to CLSR + - mtd: spi-nor: spansion: preserve CFR2V[7] when writing MEMLAT + - btrfs: add a helper to read the superblock metadata_uuid + - btrfs: compare the correct fsid/metadata_uuid in btrfs_validate_super + - nvmet-tcp: pass iov_len instead of sg->length to bvec_set_page() + - drm: gm12u320: Fix the timeout usage for usb_bulk_msg() + - scsi: qla2xxx: Fix NULL vs IS_ERR() bug for debugfs_create_dir() + - md: don't dereference mddev after export_rdev() + - md: fix warning for holder mismatch from export_rdev() + - efivarfs: fix statfs() on efivarfs + - PM: hibernate: Fix the exclusive get block device in test_resume mode + - selftests: tracing: Fix to unmount tracefs for recovering environment + - x86/ibt: Suppress spurious ENDBR + - x86/ibt: Avoid duplicate ENDBR in __put_user_nocheck*() + - riscv: kexec: Align the kexeced kernel entry + - x86/sched: Restore the SD_ASYM_PACKING flag in the DIE domain + - scsi: target: core: Fix target_cmd_counter leak + - scsi: lpfc: Fix the NULL vs IS_ERR() bug for debugfs_create_file() + - panic: Reenable preemption in WARN slowpath + - ata: libata-core: fetch sense data for successful commands iff CDL enabled + - x86/boot/compressed: Reserve more memory for page tables + - x86/purgatory: Remove LTO flags + - samples/hw_breakpoint: fix building without module unloading + - blk-mq: prealloc tags when increase tagset nr_hw_queues + - blk-mq: fix tags UAF when shrinking q->nr_hw_queues + - md/raid1: fix error: ISO C90 forbids mixed declarations + - Revert "SUNRPC: Fail faster on bad verifier" + - attr: block mode changes of symlinks + - ovl: fix failed copyup of fileattr on a symlink + - ovl: fix incorrect fdput() on aio completion + - io_uring/net: fix iter retargeting for selected buf + - x86/platform/uv: Use alternate source for socket to node data + - Revert "firewire: core: obsolete usage of GFP_ATOMIC at building node tree" + - drm/amd: Make fence wait in suballocator uninterruptible + - Revert "drm/amd: Disable S/G for APUs when 64GB or more host memory" + - dm: don't attempt to queue IO under RCU protection + - dm: fix a race condition in retrieve_deps + - btrfs: fix lockdep splat and potential deadlock after failure running + delayed items + - btrfs: fix a compilation error if DEBUG is defined in btree_dirty_folio + - btrfs: fix race between finishing block group creation and its item update + - btrfs: release path before inode lookup during the ino lookup ioctl + - btrfs: check for BTRFS_FS_ERROR in pending ordered assert + - tracing/synthetic: Fix order of struct trace_dynamic_info + - tracing: Have tracing_max_latency inc the trace array ref count + - tracing: Have event inject files inc the trace array ref count + - tracing/synthetic: Print out u64 values properly + - tracing: Increase trace array ref count on enable and filter files + - tracing: Have current_trace inc the trace array ref count + - tracing: Have option files inc the trace array ref count + - selinux: fix handling of empty opts in selinux_fs_context_submount() + - nfsd: fix change_info in NFSv4 RENAME replies + - tracefs: Add missing lockdown check to tracefs_create_dir() + - i2c: aspeed: Reset the i2c controller when timeout occurs + - ata: libata: disallow dev-initiated LPM transitions to unsupported states + - ata: libahci: clear pending interrupt status + - scsi: megaraid_sas: Fix deadlock on firmware crashdump + - scsi: qla2xxx: Use raw_smp_processor_id() instead of smp_processor_id() + - scsi: pm8001: Setup IRQs on resume + - Revert "comedi: add HAS_IOPORT dependencies" + - [Config] updateconfigs for COMEDI/HAS_IOPORT deps + - ext4: fix rec_len verify error + - drm/radeon: make fence wait in suballocator uninterrruptable + - drm/i915: Only check eDP HPD when AUX CH is shared + - drm/amdkfd: Insert missing TLB flush on GFX10 and later + - drm/tests: helpers: Avoid a driver uaf + - drm/amd/display: Adjust the MST resume flow + - drm/amd/display: fix the white screen issue when >= 64GB DRAM + - drm/amd/display: Add DPIA Link Encoder Assignment Fix + - drm/amd/display: Fix 2nd DPIA encoder Assignment + - Revert "memcg: drop kmem.limit_in_bytes" + - drm/amdgpu: fix amdgpu_cs_p1_user_fence + - interconnect: Teach lockdep about icc_bw_lock order + - x86/alternatives: Remove faulty optimization + - x86,static_call: Fix static-call vs return-thunk + - Linux 6.5.5 + + * Could not probe Samsung P44 30S3 PM9C1a SSD correctly: nvme nvme0: Device + not ready: aborting installation, CSTS=0x0 (LP: #2041495) // Mantic update: + v6.5.5 upstream stable release (LP: #2043416) + - nvme: avoid bogus CRTO values + + * Mantic update: v6.5.4 upstream stable release (LP: #2041999) + - net/ipv6: SKB symmetric hash should incorporate transport ports + - drm/virtio: Conditionally allocate virtio_gpu_fence + - scsi: ufs: core: Add advanced RPMB support where UFSHCI 4.0 does not support + EHS length in UTRD + - scsi: qla2xxx: Adjust IOCB resource on qpair create + - scsi: qla2xxx: Limit TMF to 8 per function + - scsi: qla2xxx: Fix deletion race condition + - scsi: qla2xxx: fix inconsistent TMF timeout + - scsi: qla2xxx: Fix command flush during TMF + - scsi: qla2xxx: Fix erroneous link up failure + - scsi: qla2xxx: Turn off noisy message log + - scsi: qla2xxx: Fix session hang in gnl + - scsi: qla2xxx: Fix TMF leak through + - scsi: qla2xxx: Remove unsupported ql2xenabledif option + - scsi: qla2xxx: Flush mailbox commands on chip reset + - scsi: qla2xxx: Fix smatch warn for qla_init_iocb_limit() + - scsi: qla2xxx: Error code did not return to upper layer + - scsi: qla2xxx: Fix firmware resource tracking + - null_blk: fix poll request timeout handling + - kernfs: fix missing kernfs_iattr_rwsem locking + - fbdev/ep93xx-fb: Do not assign to struct fb_info.dev + - clk: qcom: camcc-sc7180: fix async resume during probe + - drm/ast: Fix DRAM init on AST2200 + - ASoC: tegra: Fix SFC conversion for few rates + - ARM: dts: samsung: exynos4210-i9100: Fix LCD screen's physical size + - arm64: tegra: Update AHUB clock parent and rate on Tegra234 + - arm64: tegra: Update AHUB clock parent and rate + - clk: qcom: turingcc-qcs404: fix missing resume during probe + - ARM: dts: qcom: msm8974pro-castor: correct inverted X of touchscreen + - arm64: dts: qcom: msm8953-vince: drop duplicated touschreen parent interrupt + - ARM: dts: qcom: msm8974pro-castor: correct touchscreen function names + - ARM: dts: qcom: msm8974pro-castor: correct touchscreen syna,nosleep-mode + - arm64: dts: renesas: rzg2l: Fix txdv-skew-psec typos + - ARM: dts: BCM5301X: Extend RAM to full 256MB for Linksys EA6500 V2 + - send channel sequence number in SMB3 requests after reconnects + - memcg: drop kmem.limit_in_bytes + - mm: hugetlb_vmemmap: fix a race between vmemmap pmd split + - lib/test_meminit: allocate pages up to order MAX_ORDER + - Multi-gen LRU: avoid race in inc_min_seq() + - parisc: led: Fix LAN receive and transmit LEDs + - parisc: led: Reduce CPU overhead for disk & lan LED computation + - cifs: update desired access while requesting for directory lease + - pinctrl: cherryview: fix address_space_handler() argument + - dt-bindings: clock: xlnx,versal-clk: drop select:false + - clk: imx: pll14xx: dynamically configure PLL for 393216000/361267200Hz + - clk: imx: pll14xx: align pdiv with reference manual + - clk: qcom: gcc-mdm9615: use proper parent for pll0_vote clock + - soc: qcom: qmi_encdec: Restrict string length in decode + - clk: qcom: dispcc-sm8450: fix runtime PM imbalance on probe errors + - clk: qcom: dispcc-sm8550: fix runtime PM imbalance on probe errors + - clk: qcom: lpasscc-sc7280: fix missing resume during probe + - clk: qcom: q6sstop-qcs404: fix missing resume during probe + - clk: qcom: mss-sc7180: fix missing resume during probe + - NFS: Fix a potential data corruption + - NFSv4/pnfs: minor fix for cleanup path in nfs4_get_device_info + - bus: mhi: host: Skip MHI reset if device is in RDDM + - kbuild: rpm-pkg: define _arch conditionally + - kbuild: do not run depmod for 'make modules_sign' + - kbuild: dummy-tools: make MPROFILE_KERNEL checks work on BE + - tpm_crb: Fix an error handling path in crb_acpi_add() + - gfs2: Switch to wait_event in gfs2_logd + - gfs2: low-memory forced flush fixes + - mailbox: qcom-ipcc: fix incorrect num_chans counting + - kconfig: fix possible buffer overflow + - tools/mm: fix undefined reference to pthread_once + - Input: iqs7222 - configure power mode before triggering ATI + - perf trace: Really free the evsel->priv area + - pwm: atmel-tcb: Harmonize resource allocation order + - pwm: atmel-tcb: Fix resource freeing in error path and remove + - backlight: lp855x: Initialize PWM state on first brightness change + - backlight: gpio_backlight: Drop output GPIO direction check for initial + power state + - perf parse-events: Separate YYABORT and YYNOMEM cases + - perf parse-events: Move instances of YYABORT to YYNOMEM + - perf parse-events: Separate ENOMEM memory handling + - perf parse-events: Additional error reporting + - KVM: SVM: Don't defer NMI unblocking until next exit for SEV-ES guests + - Input: tca6416-keypad - always expect proper IRQ number in i2c client + - Input: tca6416-keypad - fix interrupt enable disbalance + - perf annotate bpf: Don't enclose non-debug code with an assert() + - x86/virt: Drop unnecessary check on extended CPUID level in cpu_has_svm() + - perf script: Print "cgroup" field on the same line as "comm" + - perf bpf-filter: Fix sample flag check with || + - perf dlfilter: Initialize addr_location before passing it to + thread__find_symbol_fb() + - perf dlfilter: Add al_cleanup() + - perf vendor events: Update the JSON/events descriptions for power10 platform + - perf vendor events: Drop some of the JSON/events for power10 platform + - perf vendor events: Drop STORES_PER_INST metric event for power10 platform + - perf vendor events: Move JSON/events to appropriate files for power10 + platform + - perf vendor events: Update metric event names for power10 platform + - perf top: Don't pass an ERR_PTR() directly to perf_session__delete() + - perf lock: Don't pass an ERR_PTR() directly to perf_session__delete() + - watchdog: intel-mid_wdt: add MODULE_ALIAS() to allow auto-load + - perf vendor events arm64: Remove L1D_CACHE_LMISS from AmpereOne list + - pwm: lpc32xx: Remove handling of PWM channels + - accel/ivpu: refactor deprecated strncpy + - perf header: Fix missing PMU caps + - i3c: master: svc: Describe member 'saved_regs' + - perf test stat_bpf_counters_cgrp: Fix shellcheck issue about logical + operators + - perf test stat_bpf_counters_cgrp: Enhance perf stat cgroup BPF counter test + - regulator: tps6287x: Fix n_voltages + - selftests/bpf: Fix flaky cgroup_iter_sleepable subtest + - drm/i915: mark requests for GuC virtual engines to avoid use-after-free + - blk-throttle: use calculate_io/bytes_allowed() for throtl_trim_slice() + - blk-throttle: consider 'carryover_ios/bytes' in throtl_trim_slice() + - netfilter: nf_tables: Audit log setelem reset + - netfilter: nf_tables: Audit log rule reset + - smb: propagate error code of extract_sharename() + - net/sched: fq_pie: avoid stalls in fq_pie_timer() + - sctp: annotate data-races around sk->sk_wmem_queued + - ipv4: annotate data-races around fi->fib_dead + - net: read sk->sk_family once in sk_mc_loop() + - net: fib: avoid warn splat in flow dissector + - xsk: Fix xsk_diag use-after-free error during socket cleanup + - drm/i915/gvt: Verify pfn is "valid" before dereferencing "struct page" + - drm/i915/gvt: Put the page reference obtained by KVM's gfn_to_pfn() + - drm/i915/gvt: Drop unused helper intel_vgpu_reset_gtt() + - drm/amd/display: fix mode scaling (RMX_.*) + - net/handshake: fix null-ptr-deref in handshake_nl_done_doit() + - net: use sk_forward_alloc_get() in sk_get_meminfo() + - net: annotate data-races around sk->sk_forward_alloc + - mptcp: annotate data-races around msk->rmem_fwd_alloc + - net: annotate data-races around sk->sk_tsflags + - net: annotate data-races around sk->sk_bind_phc + - ipv4: ignore dst hint for multipath routes + - ipv6: ignore dst hint for multipath routes + - selftests/bpf: Fix a CI failure caused by vsock write + - igb: disable virtualization features on 82580 + - gve: fix frag_list chaining + - veth: Fixing transmit return status for dropped packets + - net: ipv6/addrconf: avoid integer underflow in ipv6_create_tempaddr + - net: phy: micrel: Correct bit assignments for phy_device flags + - bpf, sockmap: Fix skb refcnt race after locking changes + - af_unix: Fix msg_controllen test in scm_pidfd_recv() for MSG_CMSG_COMPAT. + - af_unix: Fix data-races around user->unix_inflight. + - af_unix: Fix data-race around unix_tot_inflight. + - af_unix: Fix data-races around sk->sk_shutdown. + - af_unix: Fix data race around sk->sk_err. + - kcm: Destroy mutex in kcm_exit_net() + - octeontx2-af: Fix truncation of smq in CN10K NIX AQ enqueue mbox handler + - igc: Change IGC_MIN to allow set rx/tx value between 64 and 80 + - igbvf: Change IGBVF_MIN to allow set rx/tx value between 64 and 80 + - igb: Change IGB_MIN to allow set rx/tx value between 64 and 80 + - s390/zcrypt: don't leak memory if dev_set_name() fails + - regulator: tps6594-regulator: Fix random kernel crash + - idr: fix param name in idr_alloc_cyclic() doc + - ip_tunnels: use DEV_STATS_INC() + - net/mlx5e: Clear mirred devices array if the rule is split + - net/mlx5: Give esw_offloads_load/unload_rep() "mlx5_" prefix + - net/mlx5: Rework devlink port alloc/free into init/cleanup + - net/mlx5: Push devlink port PF/VF init/cleanup calls out of + devlink_port_register/unregister() + - mlx5/core: E-Switch, Create ACL FT for eswitch manager in switchdev mode + - net: dsa: sja1105: fix bandwidth discrepancy between tc-cbs software and + offload + - net: dsa: sja1105: fix -ENOSPC when replacing the same tc-cbs too many times + - net: dsa: sja1105: complete tc-cbs offload support on SJA1110 + - net: phylink: fix sphinx complaint about invalid literal + - bpf: Invoke __bpf_prog_exit_sleepable_recur() on recursion in + kern_sys_bpf(). + - bpf: Assign bpf_tramp_run_ctx::saved_run_ctx before recursion check. + - s390/bpf: Pass through tail call counter in trampolines + - bpf: bpf_sk_storage: Fix invalid wait context lockdep report + - bpf: bpf_sk_storage: Fix the missing uncharge in sk_omem_alloc + - netfilter: nf_tables: Unbreak audit log reset + - net: phy: Provide Module 4 KSZ9477 errata (DS80000754C) + - net: hns3: fix tx timeout issue + - net: hns3: fix byte order conversion issue in hclge_dbg_fd_tcam_read() + - net: hns3: fix debugfs concurrency issue between kfree buffer and read + - net: hns3: fix invalid mutex between tc qdisc and dcb ets command issue + - net: hns3: fix the port information display when sfp is absent + - net: hns3: remove GSO partial feature bit + - net: enetc: distinguish error from valid pointers in + enetc_fixup_clear_rss_rfs() + - sh: boards: Fix CEU buffer size passed to dma_declare_coherent_memory() + - sh: push-switch: Reorder cleanup operations to avoid use-after-free bug + - linux/export: fix reference to exported functions for parisc64 + - watchdog: advantech_ec_wdt: fix Kconfig dependencies + - drm/amd/display: Temporary Disable MST DP Colorspace Property + - ARC: atomics: Add compiler barrier to atomic operations... + - clocksource/drivers/arm_arch_timer: Disable timer before programming CVAL + - dmaengine: sh: rz-dmac: Fix destination and source data size setting + - misc: fastrpc: Fix remote heap allocation request + - misc: fastrpc: Fix incorrect DMA mapping unmap request + - jbd2: fix checkpoint cleanup performance regression + - jbd2: check 'jh->b_transaction' before removing it from checkpoint + - jbd2: correct the end of the journal recovery scan range + - ext4: add correct group descriptors and reserved GDT blocks to system zone + - ext4: fix memory leaks in ext4_fname_{setup_filename,prepare_lookup} + - ext4: drop dio overwrite only flag and associated warning + - f2fs: get out of a repeat loop when getting a locked data page + - f2fs: flush inode if atomic file is aborted + - f2fs: avoid false alarm of circular locking + - lib: test_scanf: Add explicit type cast to result initialization in + test_number_prefix() + - hwspinlock: qcom: add missing regmap config for SFPB MMIO implementation + - memcontrol: ensure memcg acquired by id is properly set up + - ata: ahci: Add Elkhart Lake AHCI controller + - ata: pata_falcon: fix IO base selection for Q40 + - ata: sata_gemini: Add missing MODULE_DESCRIPTION + - ata: pata_ftide010: Add missing MODULE_DESCRIPTION + - fuse: nlookup missing decrement in fuse_direntplus_link + - btrfs: zoned: do not zone finish data relocation block group + - btrfs: fix start transaction qgroup rsv double free + - btrfs: free qgroup rsv on io failure + - btrfs: don't start transaction when joining with TRANS_JOIN_NOSTART + - btrfs: set page extent mapped after read_folio in relocate_one_page + - btrfs: zoned: re-enable metadata over-commit for zoned mode + - btrfs: use the correct superblock to compare fsid in btrfs_validate_super + - btrfs: scrub: avoid unnecessary extent tree search preparing stripes + - btrfs: scrub: avoid unnecessary csum tree search preparing stripes + - btrfs: scrub: fix grouping of read IO + - drm/mxsfb: Disable overlay plane in mxsfb_plane_overlay_atomic_disable() + - mtd: rawnand: brcmnand: Fix crash during the panic_write + - mtd: rawnand: brcmnand: Fix potential out-of-bounds access in oob write + - mtd: spi-nor: Correct flags for Winbond w25q128 + - mtd: rawnand: brcmnand: Fix potential false time out warning + - mtd: rawnand: brcmnand: Fix ECC level field setting for v7.2 controller + - Revert "drm/amd/display: Remove v_startup workaround for dcn3+" + - drm/amd/display: enable cursor degamma for DCN3+ DRM legacy gamma + - drm/amd/display: limit the v_startup workaround to ASICs older than DCN3.1 + - drm/amd/display: prevent potential division by zero errors + - KVM: VMX: Refresh available regs and IDT vectoring info before NMI handling + - KVM: SVM: Take and hold ir_list_lock when updating vCPU's Physical ID entry + - KVM: SVM: Don't inject #UD if KVM attempts to skip SEV guest insn + - KVM: SVM: Get source vCPUs from source VM for SEV-ES intrahost migration + - KVM: nSVM: Check instead of asserting on nested TSC scaling support + - KVM: nSVM: Load L1's TSC multiplier based on L1 state, not L2 state + - KVM: SVM: Set target pCPU during IRTE update if target vCPU is running + - KVM: SVM: Skip VMSA init in sev_es_init_vmcb() if pointer is NULL + - MIPS: Only fiddle with CHECKFLAGS if `need-compiler' + - MIPS: Fix CONFIG_CPU_DADDI_WORKAROUNDS `modules_install' regression + - perf hists browser: Fix hierarchy mode header + - perf build: Update build rule for generated files + - perf test shell stat_bpf_counters: Fix test on Intel + - perf tools: Handle old data in PERF_RECORD_ATTR + - perf build: Include generated header files properly + - perf hists browser: Fix the number of entries for 'e' key + - drm/amd/display: always switch off ODM before committing more streams + - drm/amd/display: Remove wait while locked + - drm/amdkfd: Add missing gfx11 MQD manager callbacks + - drm/amdgpu: register a dirty framebuffer callback for fbcon + - bpf: fix bpf_probe_read_kernel prototype mismatch + - regulator: raa215300: Change the scope of the variables {clkin_name, + xin_name} + - regulator: raa215300: Fix resource leak in case of error + - parisc: sba_iommu: Fix build warning if procfs if disabled + - kunit: Fix wild-memory-access bug in kunit_free_suite_set() + - net: ipv4: fix one memleak in __inet_del_ifa() + - kselftest/runner.sh: Propagate SIGTERM to runner child + - selftests: Keep symlinks, when possible + - selftests/ftrace: Fix dependencies for some of the synthetic event tests + - net: microchip: vcap api: Fix possible memory leak for vcap_dup_rule() + - octeontx2-pf: Fix page pool cache index corruption. + - net/smc: use smc_lgr_list.lock to protect smc_lgr_list.list iterate in + smcr_port_add + - net: stmmac: fix handling of zero coalescing tx-usecs + - net: ethernet: mvpp2_main: fix possible OOB write in + mvpp2_ethtool_get_rxnfc() + - net: ethernet: mtk_eth_soc: fix possible NULL pointer dereference in + mtk_hwlro_get_fdir_all() + - hsr: Fix uninit-value access in fill_frame_info() + - net: ethernet: adi: adin1110: use eth_broadcast_addr() to assign broadcast + address + - net:ethernet:adi:adin1110: Fix forwarding offload + - net: dsa: sja1105: hide all multicast addresses from "bridge fdb show" + - net: dsa: sja1105: propagate exact error code from + sja1105_dynamic_config_poll_valid() + - net: dsa: sja1105: fix multicast forwarding working only for last added mdb + entry + - net: dsa: sja1105: serialize sja1105_port_mcast_flood() with other FDB + accesses + - net: dsa: sja1105: block FDB accesses that are concurrent with a switch + reset + - r8152: check budget for r8152_poll() + - kcm: Fix memory leak in error path of kcm_sendmsg() + - platform/mellanox: mlxbf-tmfifo: Drop the Rx packet if no more descriptors + - platform/mellanox: mlxbf-tmfifo: Drop jumbo frames + - platform/mellanox: mlxbf-pmc: Fix potential buffer overflows + - platform/mellanox: mlxbf-pmc: Fix reading of unprogrammed events + - platform/mellanox: NVSW_SN2201 should depend on ACPI + - [Config] updateconfigs for NVSW_SN2201 + - net: macb: fix sleep inside spinlock + - veth: Update XDP feature set when bringing up device + - ipv6: fix ip6_sock_set_addr_preferences() typo + - tcp: Factorise sk_family-independent comparison in + inet_bind2_bucket_match(_addr_any). + - tcp: Fix bind() regression for v4-mapped-v6 wildcard address. + - tcp: Fix bind() regression for v4-mapped-v6 non-wildcard address. + - selftest: tcp: Fix address length in bind_wildcard.c. + - ixgbe: fix timestamp configuration code + - igb: clean up in all error paths when enabling SR-IOV + - net: renesas: rswitch: Fix unmasking irq condition + - kcm: Fix error handling for SOCK_DGRAM in kcm_sendmsg(). + - vm: fix move_vma() memory accounting being off + - drm/amd/display: Fix a bug when searching for insert_above_mpcc + - Linux 6.5.4 + + * CVE-2023-6176 + - net/tls: do not free tls_rec on async operation in bpf_exec_tx_verdict() + + -- Roxana Nicolescu Fri, 05 Jan 2024 15:57:56 +0100 + +linux (6.5.0-14.14) mantic; urgency=medium + + * mantic/linux: 6.5.0-14.14 -proposed tracker (LP: #2042660) + + * Boot log print hang on screen, no login prompt on Aspeed 2600 rev 52 BMC + (LP: #2042850) + - drm/ast: Add BMC virtual connector + + * arm64 atomic issues cause disk corruption (LP: #2042573) + - locking/atomic: scripts: fix fallback ifdeffery + + * Packaging resync (LP: #1786013) + - [Packaging] update annotations scripts + + -- Roxana Nicolescu Tue, 14 Nov 2023 14:46:30 +0100 + +linux (6.5.0-12.12) mantic; urgency=medium + + * mantic/linux: 6.5.0-12.12 -proposed tracker (LP: #2041536) + + * Packaging resync (LP: #1786013) + - [Packaging] update annotations scripts + - [Packaging] update helper scripts + - debian/dkms-versions -- update from kernel-versions (main/2023.10.30) + + * CVE-2023-5633 + - drm/vmwgfx: Keep a gem reference to user bos in surfaces + + * CVE-2023-5345 + - fs/smb/client: Reset password pointer to NULL + + * CVE-2023-39189 + - netfilter: nfnetlink_osf: avoid OOB read + + * CVE-2023-4244 + - netfilter: nft_set_rbtree: skip sync GC for new elements in this transaction + + * apparmor restricts read access of user namespace mediation sysctls to root + (LP: #2040194) + - SAUCE: apparmor: open userns related sysctl so lxc can check if restriction + are in place + + * AppArmor spams kernel log with assert when auditing (LP: #2040192) + - SAUCE: apparmor: fix request field from a prompt reply that denies all + access + + * apparmor notification files verification (LP: #2040250) + - SAUCE: apparmor: fix notification header size + + * apparmor oops when racing to retrieve a notification (LP: #2040245) + - SAUCE: apparmor: fix oops when racing to retrieve notification + + * SMC stats: Wrong bucket calculation for payload of exactly 4096 bytes + (LP: #2039575) + - net/smc: Fix pos miscalculation in statistics + + * Support mipi camera on Intel Meteor Lake platform (LP: #2031412) + - SAUCE: iommu: intel-ipu: use IOMMU passthrough mode for Intel IPUs on Meteor + Lake + - SAUCE: platform/x86: int3472: Add handshake GPIO function + + * CVE-2023-45898 + - ext4: fix slab-use-after-free in ext4_es_insert_extent() + + * CVE-2023-31085 + - ubi: Refuse attaching if mtd's erasesize is 0 + + * CVE-2023-5717 + - perf: Disallow mis-matched inherited group reads + + * CVE-2023-5178 + - nvmet-tcp: Fix a possible UAF in queue intialization setup + + * CVE-2023-5158 + - vringh: don't use vringh_kiov_advance() in vringh_iov_xfer() + + * CVE-2023-5090 + - x86: KVM: SVM: always update the x2avic msr interception + + * [SRU][J/L/M] UBUNTU: [Packaging] Make WWAN driver a loadable module + (LP: #2033406) + - [Packaging] Make WWAN driver loadable modules + + * Unable to power off the system with MTL CPU (LP: #2039405) + - Revert "x86/smp: Put CPUs into INIT on shutdown if possible" + + * usbip: error: failed to open /usr/share/hwdata//usb.ids (LP: #2039439) + - [Packaging] Make linux-tools-common depend on hwdata + + * drop all references to is_rust_module.sh in kernels >= 6.5 (LP: #2038611) + - [Packaging] drop references to is_rust_module.sh + + * disable shiftfs (LP: #2038522) + - SAUCE: ceph: enable unsafe idmapped mounts by default + - [Config] disable shiftfs + + * Infinite systemd loop when power off the machine with multiple MD RAIDs + (LP: #2036184) + - md: Put the right device in md_seq_next + + * [Mediatek] mt8195-demo: enable CONFIG_MTK_IOMMU as module for multimedia and + PCIE peripherals (LP: #2036587) + - [Config] Enable CONFIG_MTK_IOMMU on arm64 + + * Realtek 8852CE WiFi 6E country code udpates (LP: #2037273) + - wifi: rtw89: regd: update regulatory map to R64-R43 + + * Unable to use nvme drive to install Ubuntu 23.10 (LP: #2040157) + - misc: rtsx: Fix some platforms can not boot and move the l1ss judgment to + probe + + * CVE-2023-42754 + - ipv4: fix null-deref in ipv4_link_failure + + * linux-*: please enable dm-verity kconfigs to allow MoK/db verified root + images (LP: #2019040) + - [Config] CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG_SECONDARY_KEYRING=y + + * Fix RCU warning on AMD laptops (LP: #2036377) + - power: supply: core: Use blocking_notifier_call_chain to avoid RCU complaint + + * allow io_uring to be disabled in runtime (LP: #2035116) + - io_uring: add a sysctl to disable io_uring system-wide + + * Fix unstable audio at low levels on Thinkpad P1G4 (LP: #2037077) + - ALSA: hda/realtek - ALC287 I2S speaker platform support + + -- Roxana Nicolescu Mon, 30 Oct 2023 13:08:56 +0100 + +linux (6.5.0-10.10) mantic; urgency=medium + + * mantic/linux: 6.5.0-10.10 -proposed tracker (LP: #2039204) + + * CVE-2023-4921 + - net: sched: sch_qfq: Fix UAF in qfq_dequeue() + + * CVE-2023-42756 + - netfilter: ipset: Fix race between IPSET_CMD_CREATE and IPSET_CMD_SWAP + + * CVE-2023-4881 + - netfilter: nftables: exthdr: fix 4-byte stack OOB write + + * CVE-2023-5197 + - netfilter: nf_tables: disallow rule removal from chain binding + + -- Stefan Bader Fri, 13 Oct 2023 11:43:15 +0200 + +linux (6.5.0-9.9) mantic; urgency=medium + + * mantic/linux: 6.5.0-9.9 -proposed tracker (LP: #2038687) + + * update apparmor and LSM stacking patch set (LP: #2028253) + - re-apply apparmor 4.0.0 + + * Disable restricting unprivileged change_profile by default, due to LXD + latest/stable not yet compatible with this new apparmor feature + (LP: #2038567) + - SAUCE: apparmor: Make apparmor_restrict_unprivileged_unconfined opt-in + + -- Andrea Righi Fri, 06 Oct 2023 21:03:52 +0200 + +linux (6.5.0-8.8) mantic; urgency=medium + + * mantic/linux: 6.5.0-8.8 -proposed tracker (LP: #2038577) + + * update apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [02/60]: rename SK_CTX() to aa_sock and make it an + inline fn + - SAUCE: apparmor3.2.0 [05/60]: Add sysctls for additional controls of unpriv + userns restrictions + - SAUCE: apparmor3.2.0 [08/60]: Stacking v38: LSM: Identify modules by more + than name + - SAUCE: apparmor3.2.0 [09/60]: Stacking v38: LSM: Add an LSM identifier for + external use + - SAUCE: apparmor3.2.0 [10/60]: Stacking v38: LSM: Identify the process + attributes for each module + - SAUCE: apparmor3.2.0 [11/60]: Stacking v38: LSM: Maintain a table of LSM + attribute data + - SAUCE: apparmor3.2.0 [12/60]: Stacking v38: proc: Use lsmids instead of lsm + names for attrs + - SAUCE: apparmor3.2.0 [13/60]: Stacking v38: integrity: disassociate + ima_filter_rule from security_audit_rule + - SAUCE: apparmor3.2.0 [14/60]: Stacking v38: LSM: Infrastructure management + of the sock security + - SAUCE: apparmor3.2.0 [15/60]: Stacking v38: LSM: Add the lsmblob data + structure. + - SAUCE: apparmor3.2.0 [16/60]: Stacking v38: LSM: provide lsm name and id + slot mappings + - SAUCE: apparmor3.2.0 [17/60]: Stacking v38: IMA: avoid label collisions with + stacked LSMs + - SAUCE: apparmor3.2.0 [18/60]: Stacking v38: LSM: Use lsmblob in + security_audit_rule_match + - SAUCE: apparmor3.2.0 [19/60]: Stacking v38: LSM: Use lsmblob in + security_kernel_act_as + - SAUCE: apparmor3.2.0 [20/60]: Stacking v38: LSM: Use lsmblob in + security_secctx_to_secid + - SAUCE: apparmor3.2.0 [21/60]: Stacking v38: LSM: Use lsmblob in + security_secid_to_secctx + - SAUCE: apparmor3.2.0 [22/60]: Stacking v38: LSM: Use lsmblob in + security_ipc_getsecid + - SAUCE: apparmor3.2.0 [23/60]: Stacking v38: LSM: Use lsmblob in + security_current_getsecid + - SAUCE: apparmor3.2.0 [24/60]: Stacking v38: LSM: Use lsmblob in + security_inode_getsecid + - SAUCE: apparmor3.2.0 [25/60]: Stacking v38: LSM: Use lsmblob in + security_cred_getsecid + - SAUCE: apparmor3.2.0 [26/60]: Stacking v38: LSM: Specify which LSM to + display + - SAUCE: apparmor3.2.0 [28/60]: Stacking v38: LSM: Ensure the correct LSM + context releaser + - SAUCE: apparmor3.2.0 [29/60]: Stacking v38: LSM: Use lsmcontext in + security_secid_to_secctx + - SAUCE: apparmor3.2.0 [30/60]: Stacking v38: LSM: Use lsmcontext in + security_inode_getsecctx + - SAUCE: apparmor3.2.0 [31/60]: Stacking v38: Use lsmcontext in + security_dentry_init_security + - SAUCE: apparmor3.2.0 [32/60]: Stacking v38: LSM: security_secid_to_secctx in + netlink netfilter + - SAUCE: apparmor3.2.0 [33/60]: Stacking v38: NET: Store LSM netlabel data in + a lsmblob + - SAUCE: apparmor3.2.0 [34/60]: Stacking v38: binder: Pass LSM identifier for + confirmation + - SAUCE: apparmor3.2.0 [35/60]: Stacking v38: LSM: security_secid_to_secctx + module selection + - SAUCE: apparmor3.2.0 [36/60]: Stacking v38: Audit: Keep multiple LSM data in + audit_names + - SAUCE: apparmor3.2.0 [37/60]: Stacking v38: Audit: Create audit_stamp + structure + - SAUCE: apparmor3.2.0 [38/60]: Stacking v38: LSM: Add a function to report + multiple LSMs + - SAUCE: apparmor3.2.0 [39/60]: Stacking v38: Audit: Allow multiple records in + an audit_buffer + - SAUCE: apparmor3.2.0 [40/60]: Stacking v38: Audit: Add record for multiple + task security contexts + - SAUCE: apparmor3.2.0 [41/60]: Stacking v38: audit: multiple subject lsm + values for netlabel + - SAUCE: apparmor3.2.0 [42/60]: Stacking v38: Audit: Add record for multiple + object contexts + - SAUCE: apparmor3.2.0 [43/60]: Stacking v38: netlabel: Use a struct lsmblob + in audit data + - SAUCE: apparmor3.2.0 [44/60]: Stacking v38: LSM: Removed scaffolding + function lsmcontext_init + - SAUCE: apparmor3.2.0 [45/60]: Stacking v38: AppArmor: Remove the exclusive + flag + - SAUCE: apparmor3.2.0 [46/60]: combine common_audit_data and + apparmor_audit_data + - SAUCE: apparmor3.2.0 [47/60]: setup slab cache for audit data + - SAUCE: apparmor3.2.0 [48/60]: rename audit_data->label to + audit_data->subj_label + - SAUCE: apparmor3.2.0 [49/60]: pass cred through to audit info. + - SAUCE: apparmor3.2.0 [50/60]: Improve debug print infrastructure + - SAUCE: apparmor3.2.0 [51/60]: add the ability for profiles to have a + learning cache + - SAUCE: apparmor3.2.0 [52/60]: enable userspace upcall for mediation + - SAUCE: apparmor3.2.0 [53/60]: cache buffers on percpu list if there is lock + contention + - SAUCE: apparmor3.2.0 [55/60]: advertise availability of exended perms + - SAUCE: apparmor3.2.0 [60/60]: [Config] enable + CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS + + * LSM stacking and AppArmor for 6.2: additional fixes (LP: #2017903) // update + apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [57/60]: fix profile verification and enable it + + * udev fails to make prctl() syscall with apparmor=0 (as used by maas by + default) (LP: #2016908) // update apparmor and LSM stacking patch set + (LP: #2028253) + - SAUCE: apparmor3.2.0 [27/60]: Stacking v38: Fix prctl() syscall with + apparmor=0 + + * kinetic: apply new apparmor and LSM stacking patch set (LP: #1989983) // + update apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [01/60]: add/use fns to print hash string hex value + - SAUCE: apparmor3.2.0 [03/60]: patch to provide compatibility with v2.x net + rules + - SAUCE: apparmor3.2.0 [04/60]: add user namespace creation mediation + - SAUCE: apparmor3.2.0 [06/60]: af_unix mediation + - SAUCE: apparmor3.2.0 [07/60]: Add fine grained mediation of posix mqueues + + -- Andrea Righi Fri, 06 Oct 2023 07:34:00 +0200 + +linux (6.5.0-7.7) mantic; urgency=medium + + * mantic/linux: 6.5.0-7.7 -proposed tracker (LP: #2037611) + + * kexec enable to load/kdump zstd compressed zimg (LP: #2037398) + - [Packaging] Revert arm64 image format to Image.gz + + * Mantic minimized/minimal cloud images do not receive IP address during + provisioning (LP: #2036968) + - [Config] Enable virtio-net as built-in to avoid race + + * Miscellaneous Ubuntu changes + - SAUCE: Add mdev_set_iommu_device() kABI + - [Config] update gcc version in annotations + + -- Andrea Righi Thu, 28 Sep 2023 10:19:24 +0200 + +linux (6.5.0-6.6) mantic; urgency=medium + + * mantic/linux: 6.5.0-6.6 -proposed tracker (LP: #2035595) + + * Mantic update: v6.5.3 upstream stable release (LP: #2035588) + - drm/amd/display: ensure async flips are only accepted for fast updates + - cpufreq: intel_pstate: set stale CPU frequency to minimum + - tpm: Enable hwrng only for Pluton on AMD CPUs + - Input: i8042 - add quirk for TUXEDO Gemini 17 Gen1/Clevo PD70PN + - Revert "fuse: in fuse_flush only wait if someone wants the return code" + - Revert "f2fs: clean up w/ sbi->log_sectors_per_block" + - Revert "PCI: tegra194: Enable support for 256 Byte payload" + - Revert "net: macsec: preserve ingress frame ordering" + - reiserfs: Check the return value from __getblk() + - splice: always fsnotify_access(in), fsnotify_modify(out) on success + - splice: fsnotify_access(fd)/fsnotify_modify(fd) in vmsplice + - splice: fsnotify_access(in), fsnotify_modify(out) on success in tee + - eventfd: prevent underflow for eventfd semaphores + - fs: Fix error checking for d_hash_and_lookup() + - iomap: Remove large folio handling in iomap_invalidate_folio() + - tmpfs: verify {g,u}id mount options correctly + - selftests/harness: Actually report SKIP for signal tests + - vfs, security: Fix automount superblock LSM init problem, preventing NFS sb + sharing + - ARM: ptrace: Restore syscall restart tracing + - ARM: ptrace: Restore syscall skipping for tracers + - btrfs: zoned: skip splitting and logical rewriting on pre-alloc write + - erofs: release ztailpacking pclusters properly + - locking/arch: Avoid variable shadowing in local_try_cmpxchg() + - refscale: Fix uninitalized use of wait_queue_head_t + - clocksource: Handle negative skews in "skew is too large" messages + - powercap: arm_scmi: Remove recursion while parsing zones + - OPP: Fix potential null ptr dereference in dev_pm_opp_get_required_pstate() + - OPP: Fix passing 0 to PTR_ERR in _opp_attach_genpd() + - selftests/resctrl: Add resctrl.h into build deps + - selftests/resctrl: Don't leak buffer in fill_cache() + - selftests/resctrl: Unmount resctrl FS if child fails to run benchmark + - selftests/resctrl: Close perf value read fd on errors + - sched/fair: remove util_est boosting + - arm64/ptrace: Clean up error handling path in sve_set_common() + - sched/psi: Select KERNFS as needed + - cpuidle: teo: Update idle duration estimate when choosing shallower state + - x86/decompressor: Don't rely on upper 32 bits of GPRs being preserved + - arm64/fpsimd: Only provide the length to cpufeature for xCR registers + - sched/rt: Fix sysctl_sched_rr_timeslice intial value + - perf/imx_ddr: don't enable counter0 if none of 4 counters are used + - selftests/futex: Order calls to futex_lock_pi + - irqchip/loongson-eiointc: Fix return value checking of eiointc_index + - ACPI: x86: s2idle: Post-increment variables when getting constraints + - ACPI: x86: s2idle: Fix a logic error parsing AMD constraints table + - thermal/of: Fix potential uninitialized value access + - cpufreq: amd-pstate-ut: Remove module parameter access + - cpufreq: amd-pstate-ut: Fix kernel panic when loading the driver + - tools/nolibc: arch-*.h: add missing space after ',' + - tools/nolibc: fix up startup failures for -O0 under gcc < 11.1.0 + - x86/efistub: Fix PCI ROM preservation in mixed mode + - cpufreq: powernow-k8: Use related_cpus instead of cpus in driver.exit() + - cpufreq: tegra194: add online/offline hooks + - cpufreq: tegra194: remove opp table in exit hook + - selftests/bpf: Fix bpf_nf failure upon test rerun + - libbpf: only reset sec_def handler when necessary + - bpftool: use a local copy of perf_event to fix accessing :: Bpf_cookie + - bpftool: Define a local bpf_perf_link to fix accessing its fields + - bpftool: Use a local copy of BPF_LINK_TYPE_PERF_EVENT in pid_iter.bpf.c + - bpftool: Use a local bpf_perf_event_value to fix accessing its fields + - libbpf: Fix realloc API handling in zero-sized edge cases + - bpf: Clear the probe_addr for uprobe + - bpf: Fix an error around PTR_UNTRUSTED + - bpf: Fix an error in verifying a field in a union + - crypto: qat - change value of default idle filter + - tcp: tcp_enter_quickack_mode() should be static + - hwrng: nomadik - keep clock enabled while hwrng is registered + - hwrng: pic32 - use devm_clk_get_enabled + - regmap: maple: Use alloc_flags for memory allocations + - regmap: rbtree: Use alloc_flags for memory allocations + - wifi: mt76: mt7996: fix header translation logic + - wifi: mt76: mt7915: fix background radar event being blocked + - wifi: mt76: mt7915: rework tx packets counting when WED is active + - wifi: mt76: mt7915: rework tx bytes counting when WED is active + - wifi: mt76: mt7921: fix non-PSC channel scan fail + - wifi: mt76: mt7996: fix bss wlan_idx when sending bss_info command + - wifi: mt76: mt7996: use correct phy for background radar event + - wifi: mt76: mt7996: fix WA event ring size + - udp: re-score reuseport groups when connected sockets are present + - bpf: reject unhashed sockets in bpf_sk_assign + - wifi: mt76: mt7915: fix command timeout in AP stop period + - wifi: mt76: mt7915: fix capabilities in non-AP mode + - wifi: mt76: mt7915: remove VHT160 capability on MT7915 + - wifi: mt76: testmode: add nla_policy for MT76_TM_ATTR_TX_LENGTH + - spi: tegra20-sflash: fix to check return value of platform_get_irq() in + tegra_sflash_probe() + - can: gs_usb: gs_usb_receive_bulk_callback(): count RX overflow errors also + in case of OOM + - can: tcan4x5x: Remove reserved register 0x814 from writable table + - wifi: mt76: mt7915: fix tlv length of mt7915_mcu_get_chan_mib_info + - wifi: mt76: mt7915: fix power-limits while chan_switch + - wifi: rtw89: Fix loading of compressed firmware + - wifi: mwifiex: Fix OOB and integer underflow when rx packets + - wifi: mwifiex: fix error recovery in PCIE buffer descriptor management + - wifi: ath11k: fix band selection for ppdu received in channel 177 of 5 GHz + - wifi: ath12k: fix memcpy array overflow in ath12k_peer_assoc_h_he() + - selftests/bpf: fix static assert compilation issue for test_cls_*.c + - power: supply: qcom_pmi8998_charger: fix uninitialized variable + - spi: mpc5xxx-psc: Fix unsigned expression compared with zero + - crypto: af_alg - Fix missing initialisation affecting gcm-aes-s390 + - bpf: fix bpf_dynptr_slice() to stop return an ERR_PTR. + - kbuild: rust_is_available: remove -v option + - kbuild: rust_is_available: fix version check when CC has multiple arguments + - kbuild: rust_is_available: add check for `bindgen` invocation + - kbuild: rust_is_available: fix confusion when a version appears in the path + - crypto: stm32 - Properly handle pm_runtime_get failing + - crypto: api - Use work queue in crypto_destroy_instance + - Bluetooth: ISO: Add support for connecting multiple BISes + - Bluetooth: ISO: do not emit new LE Create CIS if previous is pending + - Bluetooth: nokia: fix value check in nokia_bluetooth_serdev_probe() + - Bluetooth: ISO: Fix not checking for valid CIG/CIS IDs + - Bluetooth: hci_conn: Fix not allowing valid CIS ID + - Bluetooth: hci_conn: Fix hci_le_set_cig_params + - Bluetooth: Fix potential use-after-free when clear keys + - Bluetooth: hci_sync: Don't double print name in add/remove adv_monitor + - Bluetooth: hci_sync: Avoid use-after-free in dbg for hci_add_adv_monitor() + - Bluetooth: hci_conn: Always allocate unique handles + - Bluetooth: hci_event: drop only unbound CIS if Set CIG Parameters fails + - net: tcp: fix unexcepted socket die when snd_wnd is 0 + - net: pcs: lynx: fix lynx_pcs_link_up_sgmii() not doing anything in fixed- + link mode + - libbpf: Set close-on-exec flag on gzopen + - selftests/bpf: Fix repeat option when kfunc_call verification fails + - selftests/bpf: Clean up fmod_ret in bench_rename test script + - net: hns3: move dump regs function to a separate file + - net: hns3: Support tlv in regs data for HNS3 PF driver + - net: hns3: fix wrong rpu tln reg issue + - net-memcg: Fix scope of sockmem pressure indicators + - ice: ice_aq_check_events: fix off-by-one check when filling buffer + - crypto: caam - fix unchecked return value error + - hwrng: iproc-rng200 - Implement suspend and resume calls + - lwt: Fix return values of BPF xmit ops + - lwt: Check LWTUNNEL_XMIT_CONTINUE strictly + - usb: typec: tcpm: set initial svdm version based on pd revision + - usb: typec: bus: verify partner exists in typec_altmode_attention + - USB: core: Unite old scheme and new scheme descriptor reads + - USB: core: Change usb_get_device_descriptor() API + - USB: core: Fix race by not overwriting udev->descriptor in hub_port_init() + - scripts/gdb: fix 'lx-lsmod' show the wrong size + - nmi_backtrace: allow excluding an arbitrary CPU + - watchdog/hardlockup: avoid large stack frames in watchdog_hardlockup_check() + - fs: ocfs2: namei: check return value of ocfs2_add_entry() + - net: lan966x: Fix return value check for vcap_get_rule() + - net: annotate data-races around sk->sk_lingertime + - hwmon: (asus-ec-sensosrs) fix mutex path for X670E Hero + - wifi: mwifiex: fix memory leak in mwifiex_histogram_read() + - wifi: mwifiex: Fix missed return in oob checks failed path + - wifi: rtw89: 8852b: rfk: fine tune IQK parameters to improve performance on + 2GHz band + - selftests: memfd: error out test process when child test fails + - samples/bpf: fix bio latency check with tracepoint + - samples/bpf: fix broken map lookup probe + - wifi: ath9k: fix races between ath9k_wmi_cmd and ath9k_wmi_ctrl_rx + - wifi: ath9k: protect WMI command response buffer replacement with a lock + - bpf: Fix a bpf_kptr_xchg() issue with local kptr + - wifi: mac80211: fix puncturing bitmap handling in CSA + - wifi: nl80211/cfg80211: add forgotten nla_policy for BSS color attribute + - mac80211: make ieee80211_tx_info padding explicit + - bpf: Fix check_func_arg_reg_off bug for graph root/node + - wifi: mwifiex: avoid possible NULL skb pointer dereference + - Bluetooth: hci_conn: Consolidate code for aborting connections + - Bluetooth: ISO: Notify user space about failed bis connections + - Bluetooth: hci_sync: Fix UAF on hci_abort_conn_sync + - Bluetooth: hci_sync: Fix UAF in hci_disconnect_all_sync + - Bluetooth: hci_conn: fail SCO/ISO via hci_conn_failed if ACL gone early + - Bluetooth: btusb: Do not call kfree_skb() under spin_lock_irqsave() + - arm64: mm: use ptep_clear() instead of pte_clear() in clear_flush() + - net/mlx5: Dynamic cyclecounter shift calculation for PTP free running clock + - wifi: ath9k: use IS_ERR() with debugfs_create_dir() + - ice: avoid executing commands on other ports when driving sync + - octeontx2-pf: fix page_pool creation fail for rings > 32k + - net: arcnet: Do not call kfree_skb() under local_irq_disable() + - kunit: Fix checksum tests on big endian CPUs + - mlxsw: i2c: Fix chunk size setting in output mailbox buffer + - mlxsw: i2c: Limit single transaction buffer size + - mlxsw: core_hwmon: Adjust module label names based on MTCAP sensor counter + - crypto: qat - fix crypto capability detection for 4xxx + - hwmon: (tmp513) Fix the channel number in tmp51x_is_visible() + - octeontx2-pf: Fix PFC TX scheduler free + - octeontx2-af: CN10KB: fix PFC configuration + - cteonxt2-pf: Fix backpressure config for multiple PFC priorities to work + simultaneously + - sfc: Check firmware supports Ethernet PTP filter + - net/sched: sch_hfsc: Ensure inner classes have fsc curve + - pds_core: protect devlink callbacks from fw_down state + - pds_core: no health reporter in VF + - pds_core: no reset command for VF + - pds_core: check for work queue before use + - pds_core: pass opcode to devcmd_wait + - netrom: Deny concurrent connect(). + - drm/bridge: tc358764: Fix debug print parameter order + - ASoC: soc-compress: Fix deadlock in soc_compr_open_fe + - ASoC: cs43130: Fix numerator/denominator mixup + - drm: bridge: dw-mipi-dsi: Fix enable/disable of DSI controller + - quota: factor out dquot_write_dquot() + - quota: rename dquot_active() to inode_quota_active() + - quota: add new helper dquot_active() + - quota: fix dqput() to follow the guarantees dquot_srcu should provide + - drm/amd/display: Do not set drr on pipe commit + - drm/hyperv: Fix a compilation issue because of not including screen_info.h + - ASoC: stac9766: fix build errors with REGMAP_AC97 + - soc: qcom: ocmem: Fix NUM_PORTS & NUM_MACROS macros + - arm64: defconfig: enable Qualcomm MSM8996 Global Clock Controller as built- + in + - arm64: dts: qcom: sm8150: use proper DSI PHY compatible + - arm64: dts: qcom: sm6350: Fix ZAP region + - Revert "arm64: dts: qcom: msm8996: rename labels for HDMI nodes" + - arm64: dts: qcom: sm8250: correct dynamic power coefficients + - arm64: dts: qcom: sm8450: correct crypto unit address + - arm64: dts: qcom: msm8916-l8150: correct light sensor VDDIO supply + - arm64: dts: qcom: sm8250-edo: Add gpio line names for TLMM + - arm64: dts: qcom: sm8250-edo: Add GPIO line names for PMIC GPIOs + - arm64: dts: qcom: sm8250-edo: Rectify gpio-keys + - arm64: dts: qcom: sc8280xp-crd: Correct vreg_misc_3p3 GPIO + - arm64: dts: qcom: sc8280xp: Add missing SCM interconnect + - arm64: dts: qcom: msm8939: Drop "qcom,idle-state-spc" compatible + - arm64: dts: qcom: msm8939: Add missing 'cache-unified' to L2 + - arm64: dts: qcom: msm8996: Add missing interrupt to the USB2 controller + - arm64: dts: qcom: sdm845-tama: Set serial indices and stdout-path + - arm64: dts: qcom: sm8350: Fix CPU idle state residency times + - arm64: dts: qcom: sm8350: Add missing LMH interrupts to cpufreq + - arm64: dts: qcom: sc8180x: Fix cluster PSCI suspend param + - arm64: dts: qcom: sm8350: Use proper CPU compatibles + - arm64: dts: qcom: pm8350: fix thermal zone name + - arm64: dts: qcom: pm8350b: fix thermal zone name + - arm64: dts: qcom: pmr735b: fix thermal zone name + - arm64: dts: qcom: pmk8350: fix ADC-TM compatible string + - arm64: dts: qcom: sm8450-hdk: remove pmr735b PMIC inclusion + - arm64: dts: qcom: sm8250: Mark PCIe hosts as DMA coherent + - arm64: dts: qcom: minor whitespace cleanup around '=' + - arm64: dts: qcom: sm8250: Mark SMMUs as DMA coherent + - ARM: dts: stm32: Add missing detach mailbox for emtrion emSBC-Argon + - ARM: dts: stm32: Add missing detach mailbox for Odyssey SoM + - ARM: dts: stm32: Add missing detach mailbox for DHCOM SoM + - ARM: dts: stm32: Add missing detach mailbox for DHCOR SoM + - firmware: ti_sci: Use system_state to determine polling + - drm/amdgpu: avoid integer overflow warning in amdgpu_device_resize_fb_bar() + - ARM: dts: BCM53573: Drop nonexistent "default-off" LED trigger + - ARM: dts: BCM53573: Drop nonexistent #usb-cells + - ARM: dts: BCM53573: Add cells sizes to PCIe node + - ARM: dts: BCM53573: Use updated "spi-gpio" binding properties + - arm64: tegra: Add missing alias for NVIDIA IGX Orin + - arm64: tegra: Fix HSUART for Jetson AGX Orin + - arm64: dts: qcom: sm8250-sony-xperia: correct GPIO keys wakeup again + - arm64: dts: qcom: pm6150l: Add missing short interrupt + - arm64: dts: qcom: pm660l: Add missing short interrupt + - arm64: dts: qcom: pmi8950: Add missing OVP interrupt + - arm64: dts: qcom: pmi8994: Add missing OVP interrupt + - arm64: dts: qcom: sc8180x: Add missing 'cache-unified' to L3 + - arm64: tegra: Fix HSUART for Smaug + - drm/etnaviv: fix dumping of active MMU context + - block: cleanup queue_wc_store + - block: don't allow enabling a cache on devices that don't support it + - blk-flush: fix rq->flush.seq for post-flush requests + - x86/mm: Fix PAT bit missing from page protection modify mask + - drm/bridge: anx7625: Use common macros for DP power sequencing commands + - drm/bridge: anx7625: Use common macros for HDCP capabilities + - ARM: dts: samsung: s3c6410-mini6410: correct ethernet reg addresses (split) + - ARM: dts: samsung: s5pv210-smdkv210: correct ethernet reg addresses (split) + - drm: adv7511: Fix low refresh rate register for ADV7533/5 + - ARM: dts: BCM53573: Fix Ethernet info for Luxul devices + - arm64: dts: qcom: sdm845: Add missing RPMh power domain to GCC + - arm64: dts: qcom: sdm845: Fix the min frequency of "ice_core_clk" + - arm64: dts: qcom: sc8180x: Fix LLCC reg property + - arm64: dts: qcom: msm8996-gemini: fix touchscreen VIO supply + - arm64: dts: qcom: sc8180x-pmics: add missing qcom,spmi-gpio fallbacks + - arm64: dts: qcom: sc8180x-pmics: add missing gpio-ranges + - arm64: dts: qcom: sc8180x-pmics: align SPMI PMIC Power-on node name with + dtschema + - arm64: dts: qcom: sc8180x-pmics: align LPG node name with dtschema + - dt-bindings: arm: msm: kpss-acc: Make the optional reg truly optional + - drm/amdgpu: Update min() to min_t() in 'amdgpu_info_ioctl' + - drm/amdgpu: Use seq_puts() instead of seq_printf() + - arm64: dts: rockchip: Fix PCIe regulators on Radxa E25 + - arm64: dts: rockchip: Enable SATA on Radxa E25 + - ASoC: loongson: drop of_match_ptr for OF device id + - ASoC: fsl: fsl_qmc_audio: Fix snd_pcm_format_t values handling + - md: restore 'noio_flag' for the last mddev_resume() + - md/raid10: factor out dereference_rdev_and_rrdev() + - md/raid10: use dereference_rdev_and_rrdev() to get devices + - md/md-bitmap: remove unnecessary local variable in backlog_store() + - md/md-bitmap: hold 'reconfig_mutex' in backlog_store() + - drm/msm: Update dev core dump to not print backwards + - drm/tegra: dpaux: Fix incorrect return value of platform_get_irq + - of: unittest: fix null pointer dereferencing in + of_unittest_find_node_by_name() + - arm64: dts: qcom: sm8150: Fix the I2C7 interrupt + - drm/ast: report connection status on Display Port. + - ARM: dts: BCM53573: Fix Tenda AC9 switch CPU port + - drm/armada: Fix off-by-one error in armada_overlay_get_property() + - drm/repaper: Reduce temporary buffer size in repaper_fb_dirty() + - drm/panel: simple: Add missing connector type and pixel format for AUO + T215HVN01 + - ima: Remove deprecated IMA_TRUSTED_KEYRING Kconfig + - drm: xlnx: zynqmp_dpsub: Add missing check for dma_set_mask + - drm/msm/dpu: increase memtype count to 16 for sm8550 + - drm/msm/dpu: inline DSC_BLK and DSC_BLK_1_2 macros + - drm/msm/dpu: fix DSC 1.2 block lengths + - drm/msm/dpu1: Rename sm8150_dspp_blk to sdm845_dspp_blk + - drm/msm/dpu: Define names for unnamed sblks + - drm/msm/dpu: fix DSC 1.2 enc subblock length + - arm64: dts: qcom: sm8550-mtp: Add missing supply for L1B regulator + - soc: qcom: smem: Fix incompatible types in comparison + - drm/msm/mdp5: Don't leak some plane state + - firmware: meson_sm: fix to avoid potential NULL pointer dereference + - drm/msm/dpu: fix the irq index in dpu_encoder_phys_wb_wait_for_commit_done + - arm64: dts: ti: k3-j784s4-evm: Correct Pin mux offset for ospi + - arm64: dts: ti: k3-j721s2: correct pinmux offset for ospi + - smackfs: Prevent underflow in smk_set_cipso() + - drm/amdgpu: Sort the includes in amdgpu/amdgpu_drv.c + - drm/amdgpu: Move vram, gtt & flash defines to amdgpu_ ttm & _psp.h + - drm/amd/pm: fix variable dereferenced issue in amdgpu_device_attr_create() + - drm/msm/a2xx: Call adreno_gpu_init() earlier + - drm/msm/a6xx: Fix GMU lockdep splat + - ASoC: SOF: Intel: hda-mlink: fix off-by-one error + - ASoC: SOF: Intel: fix u16/32 confusion in LSDIID + - drm/mediatek: Fix uninitialized symbol + - audit: fix possible soft lockup in __audit_inode_child() + - block/mq-deadline: use correct way to throttling write requests + - io_uring: fix drain stalls by invalid SQE + - block: move the BIO_CLONED checks out of __bio_try_merge_page + - block: move the bi_vcnt check out of __bio_try_merge_page + - block: move the bi_size overflow check in __bio_try_merge_page + - block: move the bi_size update out of __bio_try_merge_page + - block: don't pass a bio to bio_try_merge_hw_seg + - block: make bvec_try_merge_hw_page() non-static + - bio-integrity: create multi-page bvecs in bio_integrity_add_page() + - drm/mediatek: dp: Add missing error checks in mtk_dp_parse_capabilities + - arm64: dts: ti: k3-j784s4-evm: Correct Pin mux offset for ADC + - arm64: dts: ti: k3-j784s4: Fix interrupt ranges for wkup & main gpio + - bus: ti-sysc: Fix build warning for 64-bit build + - drm/mediatek: Remove freeing not dynamic allocated memory + - drm/mediatek: Add cnt checking for coverity issue + - arm64: dts: imx8mp-debix: remove unused fec pinctrl node + - ARM: dts: qcom: ipq4019: correct SDHCI XO clock + - arm64: dts: ti: k3-am62x-sk-common: Update main-i2c1 frequency + - drm/mediatek: Fix potential memory leak if vmap() fail + - drm/mediatek: Fix void-pointer-to-enum-cast warning + - arm64: dts: qcom: apq8016-sbc: Fix ov5640 regulator supply names + - arm64: dts: qcom: apq8016-sbc: Rename ov5640 enable-gpios to powerdown-gpios + - arm64: dts: qcom: msm8998: Drop bus clock reference from MMSS SMMU + - arm64: dts: qcom: msm8998: Add missing power domain to MMSS SMMU + - ARM: dts: qcom: sdx65-mtp: Update the pmic used in sdx65 + - arm64: dts: qcom: msm8996: Fix dsi1 interrupts + - arm64: dts: qcom: sc8280xp-x13s: Unreserve NC pins + - drm/msm/a690: Switch to a660_gmu.bin + - bus: ti-sysc: Fix cast to enum warning + - block: uapi: Fix compilation errors using ioprio.h with C++ + - md/raid5-cache: fix a deadlock in r5l_exit_log() + - md/raid5-cache: fix null-ptr-deref for r5l_flush_stripe_to_raid() + - firmware: cs_dsp: Fix new control name check + - blk-cgroup: Fix NULL deref caused by blkg_policy_data being installed before + init + - md/raid0: Factor out helper for mapping and submitting a bio + - md/raid0: Fix performance regression for large sequential writes + - md: raid0: account for split bio in iostat accounting + - ASoC: SOF: amd: clear dsp to host interrupt status + - of: overlay: Call of_changeset_init() early + - of: unittest: Fix overlay type in apply/revert check + - ALSA: ac97: Fix possible error value of *rac97 + - ALSA: usb-audio: Attach legacy rawmidi after probing all UMP EPs + - ALSA: ump: Fill group names for legacy rawmidi substreams + - ALSA: ump: Don't create unused substreams for static blocks + - ALSA: ump: Fix -Wformat-truncation warnings + - ipmi:ssif: Add check for kstrdup + - ipmi:ssif: Fix a memory leak when scanning for an adapter + - clk: qcom: gpucc-sm6350: Introduce index-based clk lookup + - clk: qcom: gpucc-sm6350: Fix clock source names + - clk: qcom: gcc-sc8280xp: Add missing GDSC flags + - dt-bindings: clock: qcom,gcc-sc8280xp: Add missing GDSCs + - clk: qcom: gcc-sc8280xp: Add missing GDSCs + - clk: qcom: gcc-sm7150: Add CLK_OPS_PARENT_ENABLE to sdcc2 rcg + - clk: rockchip: rk3568: Fix PLL rate setting for 78.75MHz + - PCI: apple: Initialize pcie->nvecs before use + - PCI: qcom-ep: Switch MHI bus master clock off during L1SS + - clk: qcom: gcc-sc8280xp: fix runtime PM imbalance on probe errors + - drivers: clk: keystone: Fix parameter judgment in _of_pll_clk_init() + - iommufd: Fix locking around hwpt allocation + - PCI/DOE: Fix destroy_work_on_stack() race + - clk: qcom: dispcc-sc8280xp: Use ret registers on GDSCs + - clk: sunxi-ng: Modify mismatched function name + - clk: qcom: gcc-sc7180: Fix up gcc_sdcc2_apps_clk_src + - EDAC/igen6: Fix the issue of no error events + - ext4: correct grp validation in ext4_mb_good_group + - ext4: avoid potential data overflow in next_linear_group + - clk: qcom: gcc-sm8250: Fix gcc_sdcc2_apps_clk_src + - clk: qcom: fix some Kconfig corner cases + - kvm/vfio: Prepare for accepting vfio device fd + - kvm/vfio: ensure kvg instance stays around in kvm_vfio_group_add() + - clk: qcom: reset: Use the correct type of sleep/delay based on length + - clk: qcom: gcc-sm6350: Fix gcc_sdcc2_apps_clk_src + - PCI: microchip: Correct the DED and SEC interrupt bit offsets + - PCI: Mark NVIDIA T4 GPUs to avoid bus reset + - pinctrl: mcp23s08: check return value of devm_kasprintf() + - PCI: Add locking to RMW PCI Express Capability Register accessors + - PCI: Make link retraining use RMW accessors for changing LNKCTL + - PCI: pciehp: Use RMW accessors for changing LNKCTL + - PCI/ASPM: Use RMW accessors for changing LNKCTL + - clk: qcom: gcc-sm8450: Use floor ops for SDCC RCGs + - clk: qcom: gcc-qdu1000: Fix gcc_pcie_0_pipe_clk_src clock handling + - clk: qcom: gcc-qdu1000: Fix clkref clocks handling + - clk: imx: pllv4: Fix SPLL2 MULT range + - clk: imx: imx8ulp: update SPLL2 type + - clk: imx8mp: fix sai4 clock + - clk: imx: composite-8m: fix clock pauses when set_rate would be a no-op + - powerpc/radix: Move some functions into #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE + - vfio/type1: fix cap_migration information leak + - nvdimm: Fix memleak of pmu attr_groups in unregister_nvdimm_pmu() + - nvdimm: Fix dereference after free in register_nvdimm_pmu() + - powerpc/fadump: reset dump area size if fadump memory reserve fails + - powerpc/perf: Convert fsl_emb notifier to state machine callbacks + - pinctrl: mediatek: fix pull_type data for MT7981 + - pinctrl: mediatek: assign functions to configure pin bias on MT7986 + - drm/amdgpu: Use RMW accessors for changing LNKCTL + - drm/radeon: Use RMW accessors for changing LNKCTL + - net/mlx5: Use RMW accessors for changing LNKCTL + - wifi: ath11k: Use RMW accessors for changing LNKCTL + - wifi: ath12k: Use RMW accessors for changing LNKCTL + - wifi: ath10k: Use RMW accessors for changing LNKCTL + - NFSv4.2: Fix READ_PLUS smatch warnings + - NFSv4.2: Fix READ_PLUS size calculations + - NFSv4.2: Rework scratch handling for READ_PLUS (again) + - PCI: layerscape: Add workaround for lost link capabilities during reset + - powerpc: Don't include lppaca.h in paca.h + - powerpc/pseries: Rework lppaca_shared_proc() to avoid DEBUG_PREEMPT + - nfs/blocklayout: Use the passed in gfp flags + - powerpc/pseries: Fix hcall tracepoints with JUMP_LABEL=n + - powerpc/mpc5xxx: Add missing fwnode_handle_put() + - powerpc/iommu: Fix notifiers being shared by PCI and VIO buses + - ext4: fix unttached inode after power cut with orphan file feature enabled + - jfs: validate max amount of blocks before allocation. + - SUNRPC: Fix the recent bv_offset fix + - fs: lockd: avoid possible wrong NULL parameter + - NFSD: da_addr_body field missing in some GETDEVICEINFO replies + - clk: qcom: Fix SM_GPUCC_8450 dependencies + - NFS: Guard against READDIR loop when entry names exceed MAXNAMELEN + - NFSv4.2: fix handling of COPY ERR_OFFLOAD_NO_REQ + - pNFS: Fix assignment of xprtdata.cred + - cgroup/cpuset: Inherit parent's load balance state in v2 + - RDMA/qedr: Remove a duplicate assignment in irdma_query_ah() + - media: ov5640: fix low resolution image abnormal issue + - media: i2c: imx290: drop format param from imx290_ctrl_update + - media: ad5820: Drop unsupported ad5823 from i2c_ and of_device_id tables + - media: i2c: tvp5150: check return value of devm_kasprintf() + - media: v4l2-core: Fix a potential resource leak in v4l2_fwnode_parse_link() + - iommu/amd/iommu_v2: Fix pasid_state refcount dec hit 0 warning on pasid + unbind + - iommu: rockchip: Fix directory table address encoding + - drivers: usb: smsusb: fix error handling code in smsusb_init_device + - media: dib7000p: Fix potential division by zero + - media: dvb-usb: m920x: Fix a potential memory leak in m920x_i2c_xfer() + - media: cx24120: Add retval check for cx24120_message_send() + - RDMA/siw: Fabricate a GID on tun and loopback devices + - scsi: hisi_sas: Fix normally completed I/O analysed as failed + - dt-bindings: extcon: maxim,max77843: restrict connector properties + - media: amphion: reinit vpu if reqbufs output 0 + - media: amphion: add helper function to get id name + - media: verisilicon: Fix TRY_FMT on encoder OUTPUT + - media: mtk-jpeg: Fix use after free bug due to uncanceled work + - media: amphion: decoder support display delay for all formats + - media: rkvdec: increase max supported height for H.264 + - media: amphion: fix CHECKED_RETURN issues reported by coverity + - media: amphion: fix REVERSE_INULL issues reported by coverity + - media: amphion: fix UNINIT issues reported by coverity + - media: amphion: fix UNUSED_VALUE issue reported by coverity + - media: amphion: ensure the bitops don't cross boundaries + - media: mediatek: vcodec: fix AV1 decode fail for 36bit iova + - media: mediatek: vcodec: Return NULL if no vdec_fb is found + - media: mediatek: vcodec: fix potential double free + - media: mediatek: vcodec: fix resource leaks in vdec_msg_queue_init() + - usb: phy: mxs: fix getting wrong state with mxs_phy_is_otg_host() + - scsi: RDMA/srp: Fix residual handling + - scsi: ufs: Fix residual handling + - scsi: iscsi: Add length check for nlattr payload + - scsi: iscsi: Add strlen() check in iscsi_if_set{_host}_param() + - scsi: be2iscsi: Add length check when parsing nlattrs + - scsi: qla4xxx: Add length check when parsing nlattrs + - iio: accel: adxl313: Fix adxl313_i2c_id[] table + - serial: sprd: Assign sprd_port after initialized to avoid wrong access + - serial: sprd: Fix DMA buffer leak issue + - x86/APM: drop the duplicate APM_MINOR_DEV macro + - RDMA/rxe: Move work queue code to subroutines + - RDMA/rxe: Fix unsafe drain work queue code + - RDMA/rxe: Fix rxe_modify_srq + - RDMA/rxe: Fix incomplete state save in rxe_requester + - scsi: qedf: Do not touch __user pointer in + qedf_dbg_stop_io_on_error_cmd_read() directly + - scsi: qedf: Do not touch __user pointer in qedf_dbg_debug_cmd_read() + directly + - scsi: qedf: Do not touch __user pointer in qedf_dbg_fp_int_cmd_read() + directly + - RDMA/irdma: Replace one-element array with flexible-array member + - coresight: tmc: Explicit type conversions to prevent integer overflow + - interconnect: qcom: qcm2290: Enable sync state + - dma-buf/sync_file: Fix docs syntax + - driver core: test_async: fix an error code + - driver core: Call dma_cleanup() on the test_remove path + - kernfs: add stub helper for kernfs_generic_poll() + - extcon: cht_wc: add POWER_SUPPLY dependency + - iommu/mediatek: Fix two IOMMU share pagetable issue + - iommu/sprd: Add missing force_aperture + - iommu: Remove kernel-doc warnings + - bnxt_en: Update HW interface headers + - bnxt_en: Share the bar0 address with the RoCE driver + - RDMA/bnxt_re: Initialize Doorbell pacing feature + - RDMA/bnxt_re: Fix max_qp count for virtual functions + - RDMA/bnxt_re: Remove a redundant flag + - RDMA/hns: Fix port active speed + - RDMA/hns: Fix incorrect post-send with direct wqe of wr-list + - RDMA/hns: Fix inaccurate error label name in init instance + - RDMA/hns: Fix CQ and QP cache affinity + - IB/uverbs: Fix an potential error pointer dereference + - fsi: aspeed: Reset master errors after CFAM reset + - iommu/qcom: Disable and reset context bank before programming + - tty: serial: qcom-geni-serial: Poll primary sequencer irq status after + cancel_tx + - iommu/vt-d: Fix to flush cache of PASID directory table + - platform/x86: dell-sysman: Fix reference leak + - media: cec: core: add adap_nb_transmit_canceled() callback + - media: cec: core: add adap_unconfigured() callback + - media: go7007: Remove redundant if statement + - media: venus: hfi_venus: Only consider sys_idle_indicator on V1 + - arm64: defconfig: Drop CONFIG_VIDEO_IMX_MEDIA + - media: ipu-bridge: Fix null pointer deref on SSDB/PLD parsing warnings + - media: ipu3-cio2: rename cio2 bridge to ipu bridge and move out of ipu3 + - media: ipu-bridge: Do not use on stack memory for software_node.name field + - docs: ABI: fix spelling/grammar in SBEFIFO timeout interface + - USB: gadget: core: Add missing kerneldoc for vbus_work + - USB: gadget: f_mass_storage: Fix unused variable warning + - drivers: base: Free devm resources when unregistering a device + - HID: input: Support devices sending Eraser without Invert + - HID: nvidia-shield: Remove led_classdev_unregister in thunderstrike_create + - media: ov5640: Enable MIPI interface in ov5640_set_power_mipi() + - media: ov5640: Fix initial RESETB state and annotate timings + - media: Documentation: Fix [GS]_ROUTING documentation + - media: ov2680: Remove auto-gain and auto-exposure controls + - media: ov2680: Fix ov2680_bayer_order() + - media: ov2680: Fix vflip / hflip set functions + - media: ov2680: Remove VIDEO_V4L2_SUBDEV_API ifdef-s + - media: ov2680: Don't take the lock for try_fmt calls + - media: ov2680: Add ov2680_fill_format() helper function + - media: ov2680: Fix ov2680_set_fmt() which == V4L2_SUBDEV_FORMAT_TRY not + working + - media: ov2680: Fix regulators being left enabled on ov2680_power_on() errors + - media: i2c: rdacm21: Fix uninitialized value + - f2fs: fix spelling in ABI documentation + - f2fs: fix to avoid mmap vs set_compress_option case + - f2fs: don't reopen the main block device in f2fs_scan_devices + - f2fs: check zone type before sending async reset zone command + - f2fs: Only lfs mode is allowed with zoned block device feature + - Revert "f2fs: fix to do sanity check on extent cache correctly" + - f2fs: fix to account gc stats correctly + - f2fs: fix to account cp stats correctly + - cgroup:namespace: Remove unused cgroup_namespaces_init() + - coresight: trbe: Allocate platform data per device + - coresight: platform: acpi: Ignore the absence of graph + - coresight: Fix memory leak in acpi_buffer->pointer + - coresight: trbe: Fix TRBE potential sleep in atomic context + - Revert "f2fs: do not issue small discard commands during checkpoint" + - RDMA/irdma: Prevent zero-length STAG registration + - scsi: core: Use 32-bit hostnum in scsi_host_lookup() + - scsi: fcoe: Fix potential deadlock on &fip->ctlr_lock + - interconnect: qcom: sm8450: Enable sync_state + - interconnect: qcom: bcm-voter: Improve enable_mask handling + - interconnect: qcom: bcm-voter: Use enable_maks for keepalive voting + - dt-bindings: usb: samsung,exynos-dwc3: fix order of clocks on Exynos5433 + - dt-bindings: usb: samsung,exynos-dwc3: Fix Exynos5433 compatible + - serial: tegra: handle clk prepare error in tegra_uart_hw_init() + - Documentation: devices.txt: Remove ttyIOC* + - Documentation: devices.txt: Remove ttySIOC* + - Documentation: devices.txt: Fix minors for ttyCPM* + - amba: bus: fix refcount leak + - Revert "IB/isert: Fix incorrect release of isert connection" + - RDMA/siw: Balance the reference of cep->kref in the error path + - RDMA/siw: Correct wrong debug message + - RDMA/efa: Fix wrong resources deallocation order + - HID: logitech-dj: Fix error handling in logi_dj_recv_switch_to_dj_mode() + - nvmem: core: Return NULL when no nvmem layout is found + - riscv: Require FRAME_POINTER for some configurations + - f2fs: compress: fix to assign compress_level for lz4 correctly + - HID: uclogic: Correct devm device reference for hidinput input_dev name + - HID: multitouch: Correct devm device reference for hidinput input_dev name + - HID: nvidia-shield: Reference hid_device devm allocation of input_dev name + - platform/x86/amd/pmf: Fix a missing cleanup path + - workqueue: fix data race with the pwq->stats[] increment + - tick/rcu: Fix false positive "softirq work is pending" messages + - x86/speculation: Mark all Skylake CPUs as vulnerable to GDS + - tracing: Remove extra space at the end of hwlat_detector/mode + - tracing: Fix race issue between cpu buffer write and swap + - mm/pagewalk: fix bootstopping regression from extra pte_unmap() + - mtd: rawnand: brcmnand: Fix mtd oobsize + - dmaengine: idxd: Modify the dependence of attribute pasid_enabled + - phy/rockchip: inno-hdmi: use correct vco_div_5 macro on rk3328 + - phy/rockchip: inno-hdmi: round fractal pixclock in rk3328 recalc_rate + - phy/rockchip: inno-hdmi: do not power on rk3328 post pll on reg write + - rpmsg: glink: Add check for kstrdup + - leds: aw200xx: Fix error code in probe() + - leds: simatic-ipc-leds-gpio: Restore LEDS_CLASS dependency + - leds: pwm: Fix error code in led_pwm_create_fwnode() + - thermal/drivers/mediatek/lvts_thermal: Handle IRQ on all controllers + - thermal/drivers/mediatek/lvts_thermal: Honor sensors in immediate mode + - thermal/drivers/mediatek/lvts_thermal: Use offset threshold for IRQ + - thermal/drivers/mediatek/lvts_thermal: Disable undesired interrupts + - thermal/drivers/mediatek/lvts_thermal: Don't leave threshold zeroed + - thermal/drivers/mediatek/lvts_thermal: Manage threshold between sensors + - thermal/drivers/imx8mm: Suppress log message on probe deferral + - leds: multicolor: Use rounded division when calculating color components + - leds: Fix BUG_ON check for LED_COLOR_ID_MULTI that is always false + - leds: trigger: tty: Do not use LED_ON/OFF constants, use + led_blink_set_oneshot instead + - mtd: spi-nor: Check bus width while setting QE bit + - mtd: rawnand: fsmc: handle clk prepare error in fsmc_nand_resume() + - mfd: rk808: Make MFD_RK8XX tristate + - mfd: rz-mtu3: Link time dependencies + - um: Fix hostaudio build errors + - dmaengine: ste_dma40: Add missing IRQ check in d40_probe + - dmaengine: idxd: Simplify WQ attribute visibility checks + - dmaengine: idxd: Expose ATS disable knob only when WQ ATS is supported + - dmaengine: idxd: Allow ATS disable update only for configurable devices + - dmaengine: idxd: Fix issues with PRS disable sysfs knob + - remoteproc: stm32: fix incorrect optional pointers + - Drivers: hv: vmbus: Don't dereference ACPI root object handle + - um: virt-pci: fix missing declaration warning + - cpufreq: Fix the race condition while updating the transition_task of policy + - virtio_vdpa: build affinity masks conditionally + - virtio_ring: fix avail_wrap_counter in virtqueue_add_packed + - net: deal with integer overflows in kmalloc_reserve() + - igmp: limit igmpv3_newpack() packet size to IP_MAX_MTU + - netfilter: ipset: add the missing IP_SET_HASH_WITH_NET0 macro for + ip_set_hash_netportnet.c + - netfilter: nft_exthdr: Fix non-linear header modification + - netfilter: xt_u32: validate user space input + - netfilter: xt_sctp: validate the flag_info count + - skbuff: skb_segment, Call zero copy functions before using skbuff frags + - drbd: swap bvec_set_page len and offset + - gpio: zynq: restore zynq_gpio_irq_reqres/zynq_gpio_irq_relres callbacks + - igb: set max size RX buffer when store bad packet is enabled + - parisc: ccio-dma: Create private runway procfs root entry + - PM / devfreq: Fix leak in devfreq_dev_release() + - Multi-gen LRU: fix per-zone reclaim + - ALSA: pcm: Fix missing fixup call in compat hw_refine ioctl + - virtio_pmem: add the missing REQ_OP_WRITE for flush bio + - rcu: dump vmalloc memory info safely + - printk: ringbuffer: Fix truncating buffer size min_t cast + - scsi: core: Fix the scsi_set_resid() documentation + - mm/vmalloc: add a safer version of find_vm_area() for debug + - cpu/hotplug: Prevent self deadlock on CPU hot-unplug + - media: i2c: ccs: Check rules is non-NULL + - media: i2c: Add a camera sensor top level menu + - PCI: rockchip: Use 64-bit mask on MSI 64-bit PCI address + - ipmi_si: fix a memleak in try_smi_init() + - ARM: OMAP2+: Fix -Warray-bounds warning in _pwrdm_state_switch() + - riscv: Move create_tmp_mapping() to init sections + - riscv: Mark KASAN tmp* page tables variables as static + - XArray: Do not return sibling entries from xa_load() + - io_uring: fix false positive KASAN warnings + - io_uring: break iopolling on signal + - io_uring/sqpoll: fix io-wq affinity when IORING_SETUP_SQPOLL is used + - io_uring/net: don't overflow multishot recv + - io_uring/net: don't overflow multishot accept + - io_uring: break out of iowq iopoll on teardown + - backlight/gpio_backlight: Compare against struct fb_info.device + - backlight/bd6107: Compare against struct fb_info.device + - backlight/lv5207lp: Compare against struct fb_info.device + - drm/amd/display: register edp_backlight_control() for DCN301 + - xtensa: PMU: fix base address for the newer hardware + - LoongArch: mm: Add p?d_leaf() definitions + - powercap: intel_rapl: Fix invalid setting of Power Limit 4 + - powerpc/ftrace: Fix dropping weak symbols with older toolchains + - i3c: master: svc: fix probe failure when no i3c device exist + - io_uring: Don't set affinity on a dying sqpoll thread + - arm64: csum: Fix OoB access in IP checksum code for negative lengths + - ALSA: usb-audio: Fix potential memory leaks at error path for UMP open + - ALSA: seq: Fix snd_seq_expand_var_event() call to user-space + - ALSA: hda/cirrus: Fix broken audio on hardware with two CS42L42 codecs. + - selftests/landlock: Fix a resource leak + - media: dvb: symbol fixup for dvb_attach() + - media: venus: hfi_venus: Write to VIDC_CTRL_INIT after unmasking interrupts + - media: nxp: Fix wrong return pointer check in mxc_isi_crossbar_init() + - Revert "scsi: qla2xxx: Fix buffer overrun" + - scsi: mpt3sas: Perform additional retries if doorbell read returns 0 + - PCI: Free released resource after coalescing + - PCI: hv: Fix a crash in hv_pci_restore_msi_msg() during hibernation + - PCI/PM: Only read PCI_PM_CTRL register when available + - dt-bindings: PCI: qcom: Fix SDX65 compatible + - ntb: Drop packets when qp link is down + - ntb: Clean up tx tail index on link down + - ntb: Fix calculation ntb_transport_tx_free_entry() + - Revert "PCI: Mark NVIDIA T4 GPUs to avoid bus reset" + - block: fix pin count management when merging same-page segments + - block: don't add or resize partition on the disk with GENHD_FL_NO_PART + - procfs: block chmod on /proc/thread-self/comm + - parisc: Fix /proc/cpuinfo output for lscpu + - misc: fastrpc: Pass proper scm arguments for static process init + - drm/amd/display: Add smu write msg id fail retry process + - bpf: Fix issue in verifying allow_ptr_leaks + - dlm: fix plock lookup when using multiple lockspaces + - dccp: Fix out of bounds access in DCCP error handler + - x86/sev: Make enc_dec_hypercall() accept a size instead of npages + - r8169: fix ASPM-related issues on a number of systems with NIC version from + RTL8168h + - X.509: if signature is unsupported skip validation + - net: handle ARPHRD_PPP in dev_is_mac_header_xmit() + - fsverity: skip PKCS#7 parser when keyring is empty + - x86/MCE: Always save CS register on AMD Zen IF Poison errors + - crypto: af_alg - Decrement struct key.usage in alg_set_by_key_serial() + - platform/chrome: chromeos_acpi: print hex string for ACPI_TYPE_BUFFER + - mmc: renesas_sdhi: register irqs before registering controller + - pstore/ram: Check start of empty przs during init + - arm64: sdei: abort running SDEI handlers during crash + - regulator: dt-bindings: qcom,rpm: fix pattern for children + - iov_iter: Fix iov_iter_extract_pages() with zero-sized entries + - RISC-V: Add ptrace support for vectors + - s390/dcssblk: fix kernel crash with list_add corruption + - s390/ipl: add missing secure/has_secure file to ipl type 'unknown' + - s390/dasd: fix string length handling + - HID: logitech-hidpp: rework one more time the retries attempts + - crypto: stm32 - fix loop iterating through scatterlist for DMA + - crypto: stm32 - fix MDMAT condition + - cpufreq: brcmstb-avs-cpufreq: Fix -Warray-bounds bug + - of: property: fw_devlink: Add a devlink for panel followers + - USB: core: Fix oversight in SuperSpeed initialization + - x86/smp: Don't send INIT to non-present and non-booted CPUs + - x86/sgx: Break up long non-preemptible delays in sgx_vepc_release() + - x86/build: Fix linker fill bytes quirk/incompatibility for ld.lld + - perf/x86/uncore: Correct the number of CHAs on EMR + - media: ipu3-cio2: allow ipu_bridge to be a module again + - Bluetooth: msft: Extended monitor tracking by address filter + - Bluetooth: HCI: Introduce HCI_QUIRK_BROKEN_LE_CODED + - serial: sc16is7xx: remove obsolete out_thread label + - serial: sc16is7xx: fix regression with GPIO configuration + - mm/memfd: sysctl: fix MEMFD_NOEXEC_SCOPE_NOEXEC_ENFORCED + - selftests/memfd: sysctl: fix MEMFD_NOEXEC_SCOPE_NOEXEC_ENFORCED + - memfd: do not -EACCES old memfd_create() users with vm.memfd_noexec=2 + - memfd: replace ratcheting feature from vm.memfd_noexec with hierarchy + - memfd: improve userspace warnings for missing exec-related flags + - revert "memfd: improve userspace warnings for missing exec-related flags". + - drm/amd/display: Block optimize on consecutive FAMS enables + - Linux 6.5.3 + + * Mantic update: v6.5.2 upstream stable release (LP: #2035583) + - drm/amdgpu: correct vmhub index in GMC v10/11 + - erofs: ensure that the post-EOF tails are all zeroed + - ksmbd: fix wrong DataOffset validation of create context + - ksmbd: fix slub overflow in ksmbd_decode_ntlmssp_auth_blob() + - ksmbd: replace one-element array with flex-array member in struct + smb2_ea_info + - ksmbd: reduce descriptor size if remaining bytes is less than request size + - ARM: pxa: remove use of symbol_get() + - mmc: au1xmmc: force non-modular build and remove symbol_get usage + - net: enetc: use EXPORT_SYMBOL_GPL for enetc_phc_index + - rtc: ds1685: use EXPORT_SYMBOL_GPL for ds1685_rtc_poweroff + - USB: serial: option: add Quectel EM05G variant (0x030e) + - USB: serial: option: add FOXCONN T99W368/T99W373 product + - ALSA: usb-audio: Fix init call orders for UAC1 + - usb: dwc3: meson-g12a: do post init to fix broken usb after resumption + - usb: chipidea: imx: improve logic if samsung,picophy-* parameter is 0 + - HID: wacom: remove the battery when the EKR is off + - staging: rtl8712: fix race condition + - wifi: mt76: mt7921: do not support one stream on secondary antenna only + - wifi: mt76: mt7921: fix skb leak by txs missing in AMSDU + - wifi: rtw88: usb: kill and free rx urbs on probe failure + - wifi: ath11k: Don't drop tx_status when peer cannot be found + - wifi: ath11k: Cleanup mac80211 references on failure during tx_complete + - serial: qcom-geni: fix opp vote on shutdown + - serial: sc16is7xx: fix broken port 0 uart init + - serial: sc16is7xx: fix bug when first setting GPIO direction + - firmware: stratix10-svc: Fix an NULL vs IS_ERR() bug in probe + - fsi: master-ast-cf: Add MODULE_FIRMWARE macro + - tcpm: Avoid soft reset when partner does not support get_status + - dt-bindings: sc16is7xx: Add property to change GPIO function + - tracing: Zero the pipe cpumask on alloc to avoid spurious -EBUSY + - nilfs2: fix WARNING in mark_buffer_dirty due to discarded buffer reuse + - usb: typec: tcpci: clear the fault status bit + - pinctrl: amd: Don't show `Invalid config param` errors + - Linux 6.5.2 + + * Mantic update: v6.5.1 upstream stable release (LP: #2035581) + - ACPI: thermal: Drop nocrt parameter + - module: Expose module_init_layout_section() + - arm64: module: Use module_init_layout_section() to spot init sections + - ARM: module: Use module_init_layout_section() to spot init sections + - ipv6: remove hard coded limitation on ipv6_pinfo + - lockdep: fix static memory detection even more + - kallsyms: Fix kallsyms_selftest failure + - Linux 6.5.1 + + * [23.10 FEAT] [SEC2352] pkey: support EP11 API ordinal 6 for secure guests + (LP: #2029390) + - s390/zcrypt_ep11misc: support API ordinal 6 with empty pin-blob + + * [23.10 FEAT] [SEC2341] pkey: support generation of keys of type + PKEY_TYPE_EP11_AES (LP: #2028937) + - s390/pkey: fix/harmonize internal keyblob headers + - s390/pkey: fix PKEY_TYPE_EP11_AES handling in PKEY_GENSECK2 IOCTL + - s390/pkey: fix PKEY_TYPE_EP11_AES handling in PKEY_CLR2SECK2 IOCTL + - s390/pkey: fix PKEY_TYPE_EP11_AES handling in PKEY_KBLOB2PROTK[23] + - s390/pkey: fix PKEY_TYPE_EP11_AES handling in PKEY_VERIFYKEY2 IOCTL + - s390/pkey: fix PKEY_TYPE_EP11_AES handling for sysfs attributes + - s390/paes: fix PKEY_TYPE_EP11_AES handling for secure keyblobs + + * [23.10 FEAT] KVM: Enable Secure Execution Crypto Passthrough - kernel part + (LP: #2003674) + - KVM: s390: interrupt: Fix single-stepping into interrupt handlers + - KVM: s390: interrupt: Fix single-stepping into program interrupt handlers + - KVM: s390: interrupt: Fix single-stepping kernel-emulated instructions + - KVM: s390: interrupt: Fix single-stepping userspace-emulated instructions + - KVM: s390: interrupt: Fix single-stepping keyless mode exits + - KVM: s390: selftests: Add selftest for single-stepping + - s390/vfio-ap: no need to check the 'E' and 'I' bits in APQSW after TAPQ + - s390/vfio-ap: clean up irq resources if possible + - s390/vfio-ap: wait for response code 05 to clear on queue reset + - s390/vfio-ap: allow deconfigured queue to be passed through to a guest + - s390/vfio-ap: remove upper limit on wait for queue reset to complete + - s390/vfio-ap: store entire AP queue status word with the queue object + - s390/vfio-ap: use work struct to verify queue reset + - s390/vfio-ap: handle queue state change in progress on reset + - s390/vfio-ap: check for TAPQ response codes 0x35 and 0x36 + - s390/uv: export uv_pin_shared for direct usage + - KVM: s390: export kvm_s390_pv*_is_protected functions + - s390/vfio-ap: make sure nib is shared + - KVM: s390: pv: relax WARN_ONCE condition for destroy fast + - s390/uv: UV feature check utility + - KVM: s390: Add UV feature negotiation + - KVM: s390: pv: Allow AP-instructions for pv-guests + + * Make backlight module auto detect dell_uart_backlight (LP: #2008882) + - SAUCE: ACPI: video: Dell AIO UART backlight detection + + * Avoid address overwrite in kernel_connect (LP: #2035163) + - net: annotate data-races around sock->ops + - net: Avoid address overwrite in kernel_connect + + * Include QCA WWAN 5G Qualcomm SDX62/DW5932e support (LP: #2035306) + - bus: mhi: host: pci_generic: Add support for Dell DW5932e + + * NULL pointer dereference on CS35L41 HDA AMP (LP: #2029199) + - ALSA: cs35l41: Use mbox command to enable speaker output for external boost + - ALSA: cs35l41: Poll for Power Up/Down rather than waiting a fixed delay + - ALSA: hda: cs35l41: Check mailbox status of pause command after firmware + load + - ALSA: hda: cs35l41: Ensure we correctly re-sync regmap before system + suspending. + - ALSA: hda: cs35l41: Ensure we pass up any errors during system suspend. + - ALSA: hda: cs35l41: Move Play and Pause into separate functions + - ALSA: hda: hda_component: Add pre and post playback hooks to hda_component + - ALSA: hda: cs35l41: Use pre and post playback hooks + - ALSA: hda: cs35l41: Rework System Suspend to ensure correct call separation + - ALSA: hda: cs35l41: Add device_link between HDA and cs35l41_hda + - ALSA: hda: cs35l41: Ensure amp is only unmuted during playback + + * Enable ASPM for NVMe behind VMD (LP: #2034504) + - Revert "UBUNTU: SAUCE: vmd: fixup bridge ASPM by driver name instead" + - Revert "UBUNTU: SAUCE: PCI/ASPM: Enable LTR for endpoints behind VMD" + - Revert "UBUNTU: SAUCE: PCI/ASPM: Enable ASPM for links under VMD domain" + - SAUCE: PCI/ASPM: Allow ASPM override over FADT default + - SAUCE: PCI: vmd: Mark ASPM override for device behind VMD bridge + + * Linux 6.2 fails to reboot with current u-boot-nezha (LP: #2021364) + - [Config] Default to performance CPUFreq governor on riscv64 + + * Enable Nezha board (LP: #1975592) + - [Config] Enable CONFIG_REGULATOR_FIXED_VOLTAGE on riscv64 + - [Config] Build in D1 clock drivers on riscv64 + - [Config] Enable CONFIG_SUN6I_RTC_CCU on riscv64 + - [Config] Enable CONFIG_SUNXI_WATCHDOG on riscv64 + - [Config] Disable SUN50I_DE2_BUS on riscv64 + - [Config] Disable unneeded sunxi pinctrl drivers on riscv64 + + * Enable Nezha board (LP: #1975592) // Enable StarFive VisionFive 2 board + (LP: #2013232) + - [Config] Enable CONFIG_SERIAL_8250_DW on riscv64 + + * Enable StarFive VisionFive 2 board (LP: #2013232) + - [Config] Enable CONFIG_PINCTRL_STARFIVE_JH7110_SYS on riscv64 + - [Config] Enable CONFIG_STARFIVE_WATCHDOG on riscv64 + + * rcu_sched detected stalls on CPUs/tasks (LP: #1967130) + - [Config] Enable virtually mapped stacks on riscv64 + + * RISC-V kernel config is out of sync with other archs (LP: #1981437) + - [Config] Sync riscv64 config with other architectures + + * Support for Intel Discrete Gale Peak2/BE200 (LP: #2028065) + - Bluetooth: btintel: Add support for Gale Peak + - Bluetooth: Add support for Gale Peak (8087:0036) + + * Missing BT IDs for support for Intel Discrete Misty Peak2/BE202 + (LP: #2033455) + - SAUCE: Bluetooth: btusb: Add support for Intel Misty Peak - 8087:0038 + + * Audio device fails to function randomly on Intel MTL platform: No CPC match + in the firmware file's manifest (LP: #2034506) + - ASoC: SOF: ipc4-topology: Add module parameter to ignore the CPC value + + * Check for changes relevant for security certifications (LP: #1945989) + - [Packaging] Add a new fips-checks script + + * Installation support for SMARC RZ/G2L platform (LP: #2030525) + - [Config] build Renesas RZ/G2L USBPHY control driver statically + + * Add support for kernels compiled with CONFIG_EFI_ZBOOT (LP: #2002226) + - [Config]: Turn on CONFIG_EFI_ZBOOT on ARM64 + + * Default module signing algo should be accelerated (LP: #2034061) + - [Config] Default module signing algo should be accelerated + + * NEW SRU rustc linux kernel requirements (LP: #1993183) + - [Packaging] re-enable Rust support + + * FATAL:credentials.cc(127)] Check failed: . : Permission denied (13) + (LP: #2017980) + - [Config] disable CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS + + * update apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor4.0.0 [01/76]: add/use fns to print hash string hex value + - SAUCE: apparmor4.0.0 [02/76]: rename SK_CTX() to aa_sock and make it an + inline fn + - SAUCE: apparmor4.0.0 [03/76]: patch to provide compatibility with v2.x net + rules + - SAUCE: apparmor4.0.0 [04/76]: add user namespace creation mediation + - SAUCE: apparmor4.0.0 [05/76]: Add sysctls for additional controls of unpriv + userns restrictions + - SAUCE: apparmor4.0.0 [06/76]: af_unix mediation + - SAUCE: apparmor4.0.0 [07/76]: Add fine grained mediation of posix mqueues + - SAUCE: apparmor4.0.0 [08/76]: Stacking v38: LSM: Identify modules by more + than name + - SAUCE: apparmor4.0.0 [09/76]: Stacking v38: LSM: Add an LSM identifier for + external use + - SAUCE: apparmor4.0.0 [10/76]: Stacking v38: LSM: Identify the process + attributes for each module + - SAUCE: apparmor4.0.0 [11/76]: Stacking v38: LSM: Maintain a table of LSM + attribute data + - SAUCE: apparmor4.0.0 [12/76]: Stacking v38: proc: Use lsmids instead of lsm + names for attrs + - SAUCE: apparmor4.0.0 [13/76]: Stacking v38: integrity: disassociate + ima_filter_rule from security_audit_rule + - SAUCE: apparmor4.0.0 [14/76]: Stacking v38: LSM: Infrastructure management + of the sock security + - SAUCE: apparmor4.0.0 [15/76]: Stacking v38: LSM: Add the lsmblob data + structure. + - SAUCE: apparmor4.0.0 [16/76]: Stacking v38: LSM: provide lsm name and id + slot mappings + - SAUCE: apparmor4.0.0 [17/76]: Stacking v38: IMA: avoid label collisions with + stacked LSMs + - SAUCE: apparmor4.0.0 [18/76]: Stacking v38: LSM: Use lsmblob in + security_audit_rule_match + - SAUCE: apparmor4.0.0 [19/76]: Stacking v38: LSM: Use lsmblob in + security_kernel_act_as + - SAUCE: apparmor4.0.0 [20/76]: Stacking v38: LSM: Use lsmblob in + security_secctx_to_secid + - SAUCE: apparmor4.0.0 [21/76]: Stacking v38: LSM: Use lsmblob in + security_secid_to_secctx + - SAUCE: apparmor4.0.0 [22/76]: Stacking v38: LSM: Use lsmblob in + security_ipc_getsecid + - SAUCE: apparmor4.0.0 [23/76]: Stacking v38: LSM: Use lsmblob in + security_current_getsecid + - SAUCE: apparmor4.0.0 [24/70]: Stacking v38: LSM: Use lsmblob in + security_inode_getsecid + - SAUCE: apparmor4.0.0 [25/76]: Stacking v38: LSM: Use lsmblob in + security_cred_getsecid + - SAUCE: apparmor4.0.0 [26/76]: Stacking v38: LSM: Specify which LSM to + display + - SAUCE: apparmor4.0.0 [28/76]: Stacking v38: LSM: Ensure the correct LSM + context releaser + - SAUCE: apparmor4.0.0 [29/76]: Stacking v38: LSM: Use lsmcontext in + security_secid_to_secctx + - SAUCE: apparmor4.0.0 [30/76]: Stacking v38: LSM: Use lsmcontext in + security_inode_getsecctx + - SAUCE: apparmor4.0.0 [31/76]: Stacking v38: Use lsmcontext in + security_dentry_init_security + - SAUCE: apparmor4.0.0 [32/76]: Stacking v38: LSM: security_secid_to_secctx in + netlink netfilter + - SAUCE: apparmor4.0.0 [33/76]: Stacking v38: NET: Store LSM netlabel data in + a lsmblob + - SAUCE: apparmor4.0.0 [34/76]: Stacking v38: binder: Pass LSM identifier for + confirmation + - SAUCE: apparmor4.0.0 [35/76]: Stacking v38: LSM: security_secid_to_secctx + module selection + - SAUCE: apparmor4.0.0 [36/76]: Stacking v38: Audit: Keep multiple LSM data in + audit_names + - SAUCE: apparmor4.0.0 [37/76]: Stacking v38: Audit: Create audit_stamp + structure + - SAUCE: apparmor4.0.0 [38/76]: Stacking v38: LSM: Add a function to report + multiple LSMs + - SAUCE: apparmor4.0.0 [39/76]: Stacking v38: Audit: Allow multiple records in + an audit_buffer + - SAUCE: apparmor4.0.0 [40/76]: Stacking v38: Audit: Add record for multiple + task security contexts + - SAUCE: apparmor4.0.0 [41/76]: Stacking v38: audit: multiple subject lsm + values for netlabel + - SAUCE: apparmor4.0.0 [42/76]: Stacking v38: Audit: Add record for multiple + object contexts + - SAUCE: apparmor4.0.0 [43/76]: Stacking v38: netlabel: Use a struct lsmblob + in audit data + - SAUCE: apparmor4.0.0 [44/76]: Stacking v38: LSM: Removed scaffolding + function lsmcontext_init + - SAUCE: apparmor4.0.0 [45/76]: Stacking v38: AppArmor: Remove the exclusive + flag + - SAUCE: apparmor4.0.0 [46/76]: combine common_audit_data and + apparmor_audit_data + - SAUCE: apparmor4.0.0 [47/76]: setup slab cache for audit data + - SAUCE: apparmor4.0.0 [48/76]: rename audit_data->label to + audit_data->subj_label + - SAUCE: apparmor4.0.0 [49/76]: pass cred through to audit info. + - SAUCE: apparmor4.0.0 [50/76]: Improve debug print infrastructure + - SAUCE: apparmor4.0.0 [51/76]: add the ability for profiles to have a + learning cache + - SAUCE: apparmor4.0.0 [52/76]: enable userspace upcall for mediation + - SAUCE: apparmor4.0.0 [53/76]: cache buffers on percpu list if there is lock + contention + - SAUCE: apparmor4.0.0 [54/76]: advertise availability of exended perms + - SAUCE: apparmor4.0.0 [56/76]: cleanup: provide separate audit messages for + file and policy checks + - SAUCE: apparmor4.0.0 [57/76]: prompt - lock down prompt interface + - SAUCE: apparmor4.0.0 [58/76]: prompt - ref count pdb + - SAUCE: apparmor4.0.0 [59/76]: prompt - allow controlling of caching of a + prompt response + - SAUCE: apparmor4.0.0 [60/76]: prompt - add refcount to audit_node in prep or + reuse and delete + - SAUCE: apparmor4.0.0 [61/76]: prompt - refactor to moving caching to + uresponse + - SAUCE: apparmor4.0.0 [62/76]: prompt - Improve debug statements + - SAUCE: apparmor4.0.0 [63/76]: prompt - fix caching + - SAUCE: apparmor4.0.0 [64/76]: prompt - rework build to use append fn, to + simplify adding strings + - SAUCE: apparmor4.0.0 [65/76]: prompt - refcount notifications + - SAUCE: apparmor4.0.0 [66/76]: prompt - add the ability to reply with a + profile name + - SAUCE: apparmor4.0.0 [67/76]: prompt - fix notification cache when updating + - SAUCE: apparmor4.0.0 [68/76]: prompt - add tailglob on name for cache + support + - SAUCE: apparmor4.0.0 [69/76]: prompt - allow profiles to set prompts as + interruptible + - SAUCE: apparmor4.0.0 [74/76]: advertise disconnected.path is available + - SAUCE: apparmor4.0.0 [75/76]: fix invalid reference on profile->disconnected + - SAUCE: apparmor4.0.0 [76/76]: add io_uring mediation + - SAUCE: apparmor4.0.0: apparmor: Fix regression in mount mediation + + * update apparmor and LSM stacking patch set (LP: #2028253) // [FFe] + apparmor-4.0.0-alpha2 for unprivileged user namespace restrictions in mantic + (LP: #2032602) + - SAUCE: apparmor4.0.0 [70/76]: prompt - add support for advanced filtering of + notifications + - SAUCE: apparmor4.0.0 [71/76]: userns - add the ability to reference a global + variable for a feature value + - SAUCE: apparmor4.0.0 [72/76]: userns - make it so special unconfined + profiles can mediate user namespaces + - SAUCE: apparmor4.0.0 [73/76]: userns - allow restricting unprivileged + change_profile + + * LSM stacking and AppArmor for 6.2: additional fixes (LP: #2017903) // update + apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor4.0.0 [55/76]: fix profile verification and enable it + + * udev fails to make prctl() syscall with apparmor=0 (as used by maas by + default) (LP: #2016908) // update apparmor and LSM stacking patch set + (LP: #2028253) + - SAUCE: apparmor4.0.0 [27/76]: Stacking v38: Fix prctl() syscall with + apparmor=0 + + * Miscellaneous Ubuntu changes + - SAUCE: fan: relax strict length validation in vxlan policy + - [Config] update gcc version in annotations + - [Config] update annotations after apply 6.5 stable updates + + * Miscellaneous upstream changes + - fs/address_space: add alignment padding for i_map and i_mmap_rwsem to + mitigate a false sharing. + - mm/mmap: move vma operations to mm_struct out of the critical section of + file mapping lock + + -- Andrea Righi Thu, 14 Sep 2023 15:14:55 +0200 + +linux (6.5.0-5.5) mantic; urgency=medium + + * mantic/linux: 6.5.0-5.5 -proposed tracker (LP: #2034546) + + * Packaging resync (LP: #1786013) + - [Packaging] update helper scripts + - debian/dkms-versions -- update from kernel-versions (main/d2023.08.23) + + -- Andrea Righi Wed, 06 Sep 2023 15:51:04 +0200 + +linux (6.5.0-4.4) mantic; urgency=medium + + * mantic/linux: 6.5.0-4.4 -proposed tracker (LP: #2034042) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/d2023.08.23) + + -- Andrea Righi Mon, 04 Sep 2023 16:55:44 +0200 + +linux (6.5.0-3.3) mantic; urgency=medium + + * mantic/linux: 6.5.0-3.3 -proposed tracker (LP: #2033904) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/d2023.08.23) + + * [23.10] Please test secure-boot and lockdown on the early 6.5 kernel (s390x) + (LP: #2026833) + - [Packaging] re-enable signing for s390x + + * Miscellaneous upstream changes + - module/decompress: use vmalloc() for zstd decompression workspace + + -- Andrea Righi Fri, 01 Sep 2023 16:15:33 +0200 + +linux (6.5.0-2.2) mantic; urgency=medium + + * mantic/linux: 6.5.0-2.2 -proposed tracker (LP: #2033240) + + * Soundwire support for Dell SKU0C87 devices (LP: #2029281) + - SAUCE: ASoC: Intel: soc-acpi: add support for Dell SKU0C87 devices + + * Fix numerous AER related issues (LP: #2033025) + - SAUCE: PCI/AER: Disable AER service during suspend, again + - SAUCE: PCI/DPC: Disable DPC service during suspend, again + + * Support Realtek RTL8852CE WiFi 6E/BT Combo (LP: #2025672) + - wifi: rtw89: debug: Fix error handling in rtw89_debug_priv_btc_manual_set() + - Bluetooth: btrtl: Load FW v2 otherwise FW v1 for RTL8852C + + [ Upstream Kernel Changes ] + + * Rebase to v6.5 + + -- Andrea Righi Mon, 28 Aug 2023 08:53:19 +0200 + +linux (6.5.0-1.1) mantic; urgency=medium + + * mantic/linux: 6.5.0-1.1 -proposed tracker (LP: #2032750) + + * Packaging resync (LP: #1786013) + - [Packaging] resync update-dkms-versions helper + - [Packaging] update variants + - debian/dkms-versions -- update from kernel-versions (main/d2023.07.26) + + * ceph: support idmapped mounts (LP: #2032959) + - SAUCE: libceph: add spinlock around osd->o_requests + - SAUCE: libceph: define struct ceph_sparse_extent and add some helpers + - SAUCE: libceph: new sparse_read op, support sparse reads on msgr2 crc + codepath + - SAUCE: libceph: support sparse reads on msgr2 secure codepath + - SAUCE: libceph: add sparse read support to msgr1 + - SAUCE: libceph: add sparse read support to OSD client + - SAUCE: ceph: add new mount option to enable sparse reads + - SAUCE: ceph: preallocate inode for ops that may create one + - SAUCE: ceph: make ceph_msdc_build_path use ref-walk + - SAUCE: libceph: add new iov_iter-based ceph_msg_data_type and + ceph_osd_data_type + - SAUCE: ceph: use osd_req_op_extent_osd_iter for netfs reads + - SAUCE: ceph: fscrypt_auth handling for ceph + - SAUCE: ceph: implement -o test_dummy_encryption mount option + - SAUCE: ceph: add fscrypt ioctls and ceph.fscrypt.auth vxattr + - SAUCE: ceph: make ioctl cmds more readable in debug log + - SAUCE: ceph: add base64 endcoding routines for encrypted names + - SAUCE: ceph: encode encrypted name in ceph_mdsc_build_path and dentry + release + - SAUCE: ceph: send alternate_name in MClientRequest + - SAUCE: ceph: decode alternate_name in lease info + - SAUCE: ceph: set DCACHE_NOKEY_NAME flag in ceph_lookup/atomic_open() + - SAUCE: ceph: make d_revalidate call fscrypt revalidator for encrypted + dentries + - SAUCE: ceph: add helpers for converting names for userland presentation + - SAUCE: ceph: make ceph_fill_trace and ceph_get_name decrypt names + - SAUCE: ceph: pass the request to parse_reply_info_readdir() + - SAUCE: ceph: add support to readdir for encrypted names + - SAUCE: ceph: create symlinks with encrypted and base64-encoded targets + - SAUCE: ceph: add some fscrypt guardrails + - SAUCE: ceph: allow encrypting a directory while not having Ax caps + - SAUCE: ceph: mark directory as non-complete after loading key + - SAUCE: ceph: size handling in MClientRequest, cap updates and inode traces + - SAUCE: ceph: handle fscrypt fields in cap messages from MDS + - SAUCE: ceph: add infrastructure for file encryption and decryption + - SAUCE: libceph: add CEPH_OSD_OP_ASSERT_VER support + - SAUCE: libceph: allow ceph_osdc_new_request to accept a multi-op read + - SAUCE: ceph: add object version support for sync read + - SAUCE: ceph: add truncate size handling support for fscrypt + - SAUCE: ceph: don't use special DIO path for encrypted inodes + - SAUCE: ceph: align data in pages in ceph_sync_write + - SAUCE: ceph: add read/modify/write to ceph_sync_write + - SAUCE: ceph: add encryption support to writepage and writepages + - SAUCE: ceph: plumb in decryption during reads + - SAUCE: ceph: invalidate pages when doing direct/sync writes + - SAUCE: ceph: add support for encrypted snapshot names + - SAUCE: ceph: prevent snapshot creation in encrypted locked directories + - SAUCE: ceph: update documentation regarding snapshot naming limitations + - SAUCE: ceph: drop messages from MDS when unmounting + - SAUCE: ceph: wait for OSD requests' callbacks to finish when unmounting + - SAUCE: ceph: fix updating i_truncate_pagecache_size for fscrypt + - SAUCE: ceph: switch ceph_lookup/atomic_open() to use new fscrypt helper + - SAUCE: libceph: do not include crypto/algapi.h + - SAUCE: rbd: bump RBD_MAX_PARENT_CHAIN_LEN to 128 + - SAUCE: ceph: dump info about cap flushes when we're waiting too long for + them + - SAUCE: mm: BUG if filemap_alloc_folio gives us a folio with a non-NULL + ->private + - SAUCE: ceph: make sure all the files successfully put before unmounting + - SAUCE: ceph: BUG if MDS changed truncate_seq with client caps still + outstanding + - SAUCE: ceph: add the *_client debug macros support + - SAUCE: ceph: pass the mdsc to several helpers + - SAUCE: ceph: rename _to_client() to _to_fs_client() + - SAUCE: ceph: move mdsmap.h to fs/ceph/ + - SAUCE: ceph: add ceph_inode_to_client() helper support + - SAUCE: ceph: print the client global_id in all the debug logs + - SAUCE: ceph: make the members in struct ceph_mds_request_args_ext an union + - SAUCE: ceph: make num_fwd and num_retry to __u32 + - SAUCE: fs: export mnt_idmap_get/mnt_idmap_put + - SAUCE: ceph: stash idmapping in mdsc request + - SAUCE: ceph: handle idmapped mounts in create_request_message() + - SAUCE: ceph: add enable_unsafe_idmap module parameter + - SAUCE: ceph: pass an idmapping to mknod/symlink/mkdir + - SAUCE: ceph: allow idmapped getattr inode op + - SAUCE: ceph: allow idmapped permission inode op + - SAUCE: ceph: pass idmap to __ceph_setattr + - SAUCE: ceph: allow idmapped setattr inode op + - SAUCE: ceph/acl: allow idmapped set_acl inode op + - SAUCE: ceph/file: allow idmapped atomic_open inode op + - SAUCE: ceph: allow idmapped mounts + + * Got soft lockup CPU if dell_uart_backlight is probed (LP: #2032174) + - SAUCE: platform/x86: dell-uart-backlight: replace chars_in_buffer() with + flush_chars() + + * Fix ACPI TAD on some Intel based systems (LP: #2032767) + - ACPI: TAD: Install SystemCMOS address space handler for ACPI000E + + * Fix unreliable ethernet cable detection on I219 NIC (LP: #2028122) + - e1000e: Use PME poll to circumvent unreliable ACPI wake + + * Fix panel brightness issues on HP laptops (LP: #2032704) + - ACPI: video: Put ACPI video and its child devices into D0 on boot + + * FATAL:credentials.cc(127)] Check failed: . : Permission denied (13) + (LP: #2017980) + - [Config] disable CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS + + * Support initrdless boot on default qemu virt models and openstack + (LP: #2030745) + - [Config] set VIRTIO_BLK=y for default qemu/openstack boot + + * Miscellaneous Ubuntu changes + - [Packaging] rust: use Rust 1.68.2 + - [Packaging] depend on clang/libclang-15 for Rust + - [Config] update toolchain versions in annotations + - [Config] update annotations after rebase to v6.5-rc6 + - [Config] update toolchain version in annotations + - [Packaging] temporarily disable Rust support + - [Packaging] temporarily disable signing for ppc64el + - [Packaging] temporarily disable signing for s390x + + -- Andrea Righi Thu, 24 Aug 2023 17:47:10 +0200 + +linux (6.5.0-0.0) mantic; urgency=medium + + * Empty entry + + -- Andrea Righi Wed, 23 Aug 2023 08:14:48 +0200 + +linux-unstable (6.5.0-4.4) mantic; urgency=medium + + * mantic/linux-unstable: 6.5.0-4.4 -proposed tracker (LP: #2029086) + + * Miscellaneous Ubuntu changes + - [Packaging] Add .NOTPARALLEL + - [Packaging] Remove meaningless $(header_arch) + - [Packaging] Fix File exists error in install-arch-headers + - [Packaging] clean debian/linux-* directories + - [Packaging] remove hmake + - [Packaging] install headers to debian/linux-libc-dev directly + - [Config] define CONFIG options for arm64 instead of arm64-generic + - [Config] update annotations after rebase to v6.5-rc4 + - [Packaging] temporarily disable Rust support + + [ Upstream Kernel Changes ] + + * Rebase to v6.5-rc4 + + -- Andrea Righi Mon, 31 Jul 2023 08:41:59 +0200 + +linux-unstable (6.5.0-3.3) mantic; urgency=medium + + * mantic/linux-unstable: 6.5.0-3.3 -proposed tracker (LP: #2028779) + + * enable Rust support in the kernel (LP: #2007654) + - SAUCE: rust: support rustc-1.69.0 + - [Packaging] depend on rustc-1.69.0 + + * Packaging resync (LP: #1786013) + - [Packaging] resync update-dkms-versions helper + - [Packaging] resync getabis + + * Fix UBSAN in Intel EDAC driver (LP: #2028746) + - EDAC/i10nm: Skip the absent memory controllers + + * Ship kernel modules Zstd compressed (LP: #2028568) + - SAUCE: Support but do not require compressed modules + - [Config] Enable support for ZSTD compressed modules + - [Packaging] ZSTD compress modules + + * update apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [02/60]: rename SK_CTX() to aa_sock and make it an + inline fn + - SAUCE: apparmor3.2.0 [05/60]: Add sysctls for additional controls of unpriv + userns restrictions + - SAUCE: apparmor3.2.0 [08/60]: Stacking v38: LSM: Identify modules by more + than name + - SAUCE: apparmor3.2.0 [09/60]: Stacking v38: LSM: Add an LSM identifier for + external use + - SAUCE: apparmor3.2.0 [10/60]: Stacking v38: LSM: Identify the process + attributes for each module + - SAUCE: apparmor3.2.0 [11/60]: Stacking v38: LSM: Maintain a table of LSM + attribute data + - SAUCE: apparmor3.2.0 [12/60]: Stacking v38: proc: Use lsmids instead of lsm + names for attrs + - SAUCE: apparmor3.2.0 [13/60]: Stacking v38: integrity: disassociate + ima_filter_rule from security_audit_rule + - SAUCE: apparmor3.2.0 [14/60]: Stacking v38: LSM: Infrastructure management + of the sock security + - SAUCE: apparmor3.2.0 [15/60]: Stacking v38: LSM: Add the lsmblob data + structure. + - SAUCE: apparmor3.2.0 [16/60]: Stacking v38: LSM: provide lsm name and id + slot mappings + - SAUCE: apparmor3.2.0 [17/60]: Stacking v38: IMA: avoid label collisions with + stacked LSMs + - SAUCE: apparmor3.2.0 [18/60]: Stacking v38: LSM: Use lsmblob in + security_audit_rule_match + - SAUCE: apparmor3.2.0 [19/60]: Stacking v38: LSM: Use lsmblob in + security_kernel_act_as + - SAUCE: apparmor3.2.0 [20/60]: Stacking v38: LSM: Use lsmblob in + security_secctx_to_secid + - SAUCE: apparmor3.2.0 [21/60]: Stacking v38: LSM: Use lsmblob in + security_secid_to_secctx + - SAUCE: apparmor3.2.0 [22/60]: Stacking v38: LSM: Use lsmblob in + security_ipc_getsecid + - SAUCE: apparmor3.2.0 [23/60]: Stacking v38: LSM: Use lsmblob in + security_current_getsecid + - SAUCE: apparmor3.2.0 [24/60]: Stacking v38: LSM: Use lsmblob in + security_inode_getsecid + - SAUCE: apparmor3.2.0 [25/60]: Stacking v38: LSM: Use lsmblob in + security_cred_getsecid + - SAUCE: apparmor3.2.0 [26/60]: Stacking v38: LSM: Specify which LSM to + display + - SAUCE: apparmor3.2.0 [28/60]: Stacking v38: LSM: Ensure the correct LSM + context releaser + - SAUCE: apparmor3.2.0 [29/60]: Stacking v38: LSM: Use lsmcontext in + security_secid_to_secctx + - SAUCE: apparmor3.2.0 [30/60]: Stacking v38: LSM: Use lsmcontext in + security_inode_getsecctx + - SAUCE: apparmor3.2.0 [31/60]: Stacking v38: Use lsmcontext in + security_dentry_init_security + - SAUCE: apparmor3.2.0 [32/60]: Stacking v38: LSM: security_secid_to_secctx in + netlink netfilter + - SAUCE: apparmor3.2.0 [33/60]: Stacking v38: NET: Store LSM netlabel data in + a lsmblob + - SAUCE: apparmor3.2.0 [34/60]: Stacking v38: binder: Pass LSM identifier for + confirmation + - SAUCE: apparmor3.2.0 [35/60]: Stacking v38: LSM: security_secid_to_secctx + module selection + - SAUCE: apparmor3.2.0 [36/60]: Stacking v38: Audit: Keep multiple LSM data in + audit_names + - SAUCE: apparmor3.2.0 [37/60]: Stacking v38: Audit: Create audit_stamp + structure + - SAUCE: apparmor3.2.0 [38/60]: Stacking v38: LSM: Add a function to report + multiple LSMs + - SAUCE: apparmor3.2.0 [39/60]: Stacking v38: Audit: Allow multiple records in + an audit_buffer + - SAUCE: apparmor3.2.0 [40/60]: Stacking v38: Audit: Add record for multiple + task security contexts + - SAUCE: apparmor3.2.0 [41/60]: Stacking v38: audit: multiple subject lsm + values for netlabel + - SAUCE: apparmor3.2.0 [42/60]: Stacking v38: Audit: Add record for multiple + object contexts + - SAUCE: apparmor3.2.0 [43/60]: Stacking v38: netlabel: Use a struct lsmblob + in audit data + - SAUCE: apparmor3.2.0 [44/60]: Stacking v38: LSM: Removed scaffolding + function lsmcontext_init + - SAUCE: apparmor3.2.0 [45/60]: Stacking v38: AppArmor: Remove the exclusive + flag + - SAUCE: apparmor3.2.0 [46/60]: combine common_audit_data and + apparmor_audit_data + - SAUCE: apparmor3.2.0 [47/60]: setup slab cache for audit data + - SAUCE: apparmor3.2.0 [48/60]: rename audit_data->label to + audit_data->subj_label + - SAUCE: apparmor3.2.0 [49/60]: pass cred through to audit info. + - SAUCE: apparmor3.2.0 [50/60]: Improve debug print infrastructure + - SAUCE: apparmor3.2.0 [51/60]: add the ability for profiles to have a + learning cache + - SAUCE: apparmor3.2.0 [52/60]: enable userspace upcall for mediation + - SAUCE: apparmor3.2.0 [53/60]: cache buffers on percpu list if there is lock + contention + - SAUCE: apparmor3.2.0 [55/60]: advertise availability of exended perms + - SAUCE: apparmor3.2.0 [60/60]: [Config] enable + CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS + + * LSM stacking and AppArmor for 6.2: additional fixes (LP: #2017903) // update + apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [57/60]: fix profile verification and enable it + + * udev fails to make prctl() syscall with apparmor=0 (as used by maas by + default) (LP: #2016908) // update apparmor and LSM stacking patch set + (LP: #2028253) + - SAUCE: apparmor3.2.0 [27/60]: Stacking v38: Fix prctl() syscall with + apparmor=0 + + * kinetic: apply new apparmor and LSM stacking patch set (LP: #1989983) // + update apparmor and LSM stacking patch set (LP: #2028253) + - SAUCE: apparmor3.2.0 [01/60]: add/use fns to print hash string hex value + - SAUCE: apparmor3.2.0 [03/60]: patch to provide compatibility with v2.x net + rules + - SAUCE: apparmor3.2.0 [04/60]: add user namespace creation mediation + - SAUCE: apparmor3.2.0 [06/60]: af_unix mediation + - SAUCE: apparmor3.2.0 [07/60]: Add fine grained mediation of posix mqueues + + * Miscellaneous Ubuntu changes + - [Packaging] Use consistent llvm/clang for rust + + [ Upstream Kernel Changes ] + + * Rebase to v6.5-rc3 + + -- Andrea Righi Fri, 28 Jul 2023 07:44:20 +0200 + +linux-unstable (6.5.0-2.2) mantic; urgency=medium + + * mantic/linux-unstable: 6.5.0-2.2 -proposed tracker (LP: #2027953) + + * Remove non-LPAE kernel flavor (LP: #2025265) + - [Packaging] Rename armhf generic-lpae flavor to generic + + * Please enable Renesas RZ platform serial installer (LP: #2022361) + - [Config] enable hihope RZ/G2M serial console + + * Miscellaneous Ubuntu changes + - [Packaging] snap: Remove old configs handling + - [Packaging] checks/final-checks: Remove old configs handling + - [Packaging] checks/final-checks: check existance of Makefile first + - [Packaging] checks/final-checks: Fix shellcheck issues + - [Packaging] add libstdc++-dev to the build dependencies + - [Config] update annotations after rebase to v6.5-rc2 + + * Miscellaneous upstream changes + - kbuild: rust: avoid creating temporary files + - rust: fix bindgen build error with UBSAN_BOUNDS_STRICT + + [ Upstream Kernel Changes ] + + * Rebase to v6.5-rc2 + + -- Andrea Righi Tue, 18 Jul 2023 10:14:14 +0200 + +linux-unstable (6.5.0-1.1) mantic; urgency=medium + + * mantic/linux-unstable: 6.5.0-1.1 -proposed tracker (LP: #2026689) + + * CVE-2023-31248 + - netfilter: nf_tables: do not ignore genmask when looking up chain by id + + * CVE-2023-35001 + - netfilter: nf_tables: prevent OOB access in nft_byteorder_eval + + * HDMI output with More than one child device for port B in VBT error + (LP: #2025195) + - SAUCE: drm/i915/quirks: Add multiple VBT quirk for HP ZBook Power G10 + + * CVE-2023-2640 // CVE-2023-32629 + - SAUCE: overlayfs: default to userxattr when mounted from non initial user + namespace + + * Packaging resync (LP: #1786013) + - [Packaging] resync update-dkms-versions helper + + * enable Rust support in the kernel (LP: #2007654) + - SAUCE: btf, scripts: rust: drop is_rust_module.sh + - [Packaging] add rust dependencies + + * CVE-2023-2612 + - SAUCE: shiftfs: prevent lock unbalance in shiftfs_create_object() + + * Miscellaneous Ubuntu changes + - SAUCE: shiftfs: support linux 6.5 + - [Config] update annotations after rebase to v6.5-rc1 + - [Config] temporarily disable Rust + + [ Upstream Kernel Changes ] + + * Rebase to v6.5-rc1 + + -- Andrea Righi Mon, 10 Jul 2023 09:15:26 +0200 + +linux-unstable (6.5.0-0.0) mantic; urgency=medium + + * Empty entry + + -- Andrea Righi Wed, 05 Jul 2023 12:48:39 +0200 + +linux-unstable (6.4.0-8.8) mantic; urgency=medium + + * mantic/linux-unstable: 6.4.0-8.8 -proposed tracker (LP: #2025018) + + * Miscellaneous Ubuntu changes + - [Config] update toolchain version (gcc) in annotations + + [ Upstream Kernel Changes ] + + * Rebase to v6.4 + + -- Andrea Righi Mon, 26 Jun 2023 09:14:02 +0200 + +linux-unstable (6.4.0-7.7) mantic; urgency=medium + + * mantic/linux-unstable: 6.4.0-7.7 -proposed tracker (LP: #2024338) + + [ Upstream Kernel Changes ] + + * Rebase to v6.4-rc7 + + -- Andrea Righi Mon, 19 Jun 2023 08:51:27 +0200 + +linux-unstable (6.4.0-6.6) mantic; urgency=medium + + * mantic/linux-unstable: 6.4.0-6.6 -proposed tracker (LP: #2023966) + + * Packaging resync (LP: #1786013) + - [Packaging] update annotations scripts + + * enable multi-gen LRU by default (LP: #2023629) + - [Config] enable multi-gen LRU by default + + * Fix Monitor lost after replug WD19TBS to SUT port with VGA/DVI to type-C + dongle (LP: #2021949) + - thunderbolt: Do not touch CL state configuration during discovery + - thunderbolt: Increase DisplayPort Connection Manager handshake timeout + + * Neuter signing tarballs (LP: #2012776) + - [Packaging] remove the signing tarball support + + * Enable Tracing Configs for OSNOISE and TIMERLAT (LP: #2018591) + - [Config] Enable OSNOISE_TRACER and TIMERLAT_TRACER configs + + * Miscellaneous Ubuntu changes + - [Config] Add CONFIG_AS_HAS_NON_CONST_LEB128 on riscv64 + - [Packaging] introduce do_lib_rust and enable it only on generic amd64 + - [Config] update annotations after rebase to v6.4-rc6 + + [ Upstream Kernel Changes ] + + * Rebase to v6.4-rc6 + + -- Andrea Righi Thu, 15 Jun 2023 20:11:07 +0200 + +linux-unstable (6.4.0-5.5) mantic; urgency=medium + + * mantic/linux-unstable: 6.4.0-5.5 -proposed tracker (LP: #2022886) + + * Miscellaneous Ubuntu changes + - [Packaging] update getabis to support linux-unstable + - UBUNTU [Config]: disable hibernation on riscv64 + + [ Upstream Kernel Changes ] + + * Rebase to v6.4-rc5 + + -- Andrea Righi Tue, 06 Jun 2023 08:18:01 +0200 + +linux-unstable (6.4.0-4.4) mantic; urgency=medium + + * mantic/linux-unstable: 6.4.0-4.4 -proposed tracker (LP: #2021597) + + * Miscellaneous Ubuntu changes + - [Config] udpate annotations after rebase to v6.4-rc4 + + -- Andrea Righi Tue, 30 May 2023 11:55:41 +0200 + +linux-unstable (6.4.0-3.3) mantic; urgency=medium + + * mantic/linux-unstable: 6.4.0-3.3 -proposed tracker (LP: #2021497) + + * Packaging resync (LP: #1786013) + - [Packaging] resync git-ubuntu-log + - [Packaging] resync getabis + + * support python < 3.9 with annotations (LP: #2020531) + - [Packaging] kconfig/annotations.py: support older way of merging dicts + + * generate linux-lib-rust only on amd64 (LP: #2020356) + - [Packaging] generate linux-lib-rust only on amd64 + + * Miscellaneous Ubuntu changes + - [Packaging] annotations: never drop configs that have notes different than + the parent + - [Config] drop CONFIG_SMBFS_COMMON from annotations + - [Packaging] perf: build without libtraceevent + + [ Upstream Kernel Changes ] + + * Rebase to v6.4-rc4 + + -- Andrea Righi Tue, 30 May 2023 08:38:10 +0200 + +linux-unstable (6.4.0-2.2) mantic; urgency=medium + + * mantic/linux-unstable: 6.4.0-2.2 -proposed tracker (LP: #2020330) + + * Computer with Intel Atom CPU will not boot with Kernel 6.2.0-20 + (LP: #2017444) + - [Config]: Disable CONFIG_INTEL_ATOMISP + + * Fix NVME storage with RAID ON disappeared under Dell factory WINPE + environment (LP: #2011768) + - SAUCE: PCI: vmd: Reset VMD config register between soft reboots + + * Miscellaneous Ubuntu changes + - [Packaging] Drop support of old config handling + - [Config] update annotations after rebase to v6.4-rc3 + + [ Upstream Kernel Changes ] + + * Rebase to v6.4-rc3 + + -- Andrea Righi Mon, 22 May 2023 11:22:14 +0200 + +linux-unstable (6.4.0-1.1) mantic; urgency=medium + + * mantic/linux-unstable: 6.4.0-1.1 -proposed tracker (LP: #2019965) + + * Packaging resync (LP: #1786013) + - [Packaging] update variants + - [Packaging] update helper scripts + + * Kernel 6.1 bumped the disk consumption on default images by 15% + (LP: #2015867) + - [Packaging] introduce a separate linux-lib-rust package + + * Miscellaneous Ubuntu changes + - [Config] enable CONFIG_BLK_DEV_UBLK on amd64 + - [Packaging] annotations: use python3 in the shebang + - SAUCE: blk-throttle: Fix io statistics for cgroup v1 + - [Packaging] move to v6.4 and rename to linux-unstable + - [Config] update annotations after rebase to v6.4-rc1 + - [Packaging] temporarily disable perf + - [Packaging] temporarily disable bpftool + - [Config] ppc64el: reduce CONFIG_ARCH_FORCE_MAX_ORDER from 9 to 8 + - SAUCE: perf: explicitly disable libtraceevent + + [ Upstream Kernel Changes ] + + * Rebase to v6.4-rc2 + + -- Andrea Righi Thu, 18 May 2023 07:34:09 +0200 + +linux-unstable (6.4.0-0.0) mantic; urgency=medium + + * Empty entry + + -- Andrea Righi Wed, 17 May 2023 15:29:25 +0200 + +linux-unstable (6.3.0-2.2) lunar; urgency=medium + + * lunar/linux-unstable: 6.3.0-2.2 -proposed tracker (LP: #2017788) + + * Miscellaneous Ubuntu changes + - [Packaging] move python3-dev to build-depends + + -- Andrea Righi Wed, 26 Apr 2023 21:52:12 +0200 + +linux-unstable (6.3.0-1.1) lunar; urgency=medium + + * lunar/linux-unstable: 6.3.0-1.1 -proposed tracker (LP: #2017776) + + * RFC: virtio and virtio-scsi should be built in (LP: #1685291) + - [Config] Mark CONFIG_SCSI_VIRTIO built-in + + * Debian autoreconstruct Fix restoration of execute permissions (LP: #2015498) + - [Debian] autoreconstruct - fix restoration of execute permissions + + * [SRU][Jammy] CONFIG_PCI_MESON is not enabled (LP: #2007745) + - [Config] arm64: Enable PCI_MESON module + + * vmd may fail to create sysfs entry while `pci_rescan_bus()` called in some + other drivers like wwan (LP: #2011389) + - SAUCE: PCI: vmd: guard device addition and removal + + * Lunar update: v6.2.9 upstream stable release (LP: #2016877) + - [Config] ppc64: updateconfigs following v6.2.9 stable updates + + * Lunar update: v6.2.8 upstream stable release (LP: #2016876) + - [Config] ppc64: updateconfigs following v6.2.8 stable updates + + * Miscellaneous Ubuntu changes + - [Packaging] Move final-checks script to debian/scripts/checks + - [Packaging] checks/final-checks: Honor 'do_skip_checks' + - [Packaging] Drop wireguard DKMS + - [Packaging] Remove update-version-dkms + - [Packaging] debian/rules: Add DKMS info to 'printenv' output + - [Packaging] ignore KBUILD_VERBOSE in arch-has-odm-enabled.sh + - SAUCE: shiftfs: support linux 6.3 + - [Packaging] move to v6.3 and rename to linux-unstable + - [Config] latency-related optimizations + - [Config] update annotations after rebase to v6.3 + - [Packaging] temporarily disable dkms + + [ Upstream Kernel Changes ] + + * Rebase to v6.3 + + -- Andrea Righi Wed, 26 Apr 2023 14:53:52 +0200 + +linux-unstable (6.3.0-0.0) lunar; urgency=medium + + * Empty entry + + -- Andrea Righi Tue, 25 Apr 2023 10:24:12 +0200 + +linux (6.2.0-21.21) lunar; urgency=medium + + * lunar/linux: 6.2.0-21.21 -proposed tracker (LP: #2016249) + + * efivarfs:efivarfs.sh in ubuntu_kernel_selftests crash L-6.2 ARM64 node + dazzle (rcu_preempt detected stalls) (LP: #2015741) + - efi/libstub: smbios: Use length member instead of record struct size + - arm64: efi: Use SMBIOS processor version to key off Ampere quirk + - efi/libstub: smbios: Drop unused 'recsize' parameter + + * Miscellaneous Ubuntu changes + - SAUCE: selftests/bpf: ignore pointer types check with clang + - SAUCE: selftests/bpf: avoid conflicting data types in profiler.inc.h + - [Packaging] get rid of unnecessary artifacts in linux-headers + + * Miscellaneous upstream changes + - Revert "UBUNTU: SAUCE: Revert "efi: random: refresh non-volatile random seed + when RNG is initialized"" + - Revert "UBUNTU: SAUCE: Revert "efi: random: fix NULL-deref when refreshing + seed"" + + -- Andrea Righi Fri, 14 Apr 2023 12:11:49 +0200 + +linux (6.2.0-20.20) lunar; urgency=medium + + * lunar/linux: 6.2.0-20.20 -proposed tracker (LP: #2015429) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + + * FTBFS with different dkms or when makeflags are set (LP: #2015361) + - [Packaging] FTBFS with different dkms or when makeflags are set + + * expoline.o is packaged unconditionally for s390x (LP: #2013209) + - [Packaging] Copy expoline.o only when produced by the build + + * net:l2tp.sh failure with lunar:linux 6.2 (LP: #2013014) + - SAUCE: l2tp: generate correct module alias strings + + * Miscellaneous Ubuntu changes + - [Packaging] annotations: prevent duplicate include lines + + -- Andrea Righi Thu, 06 Apr 2023 08:33:14 +0200 + +linux (6.2.0-19.19) lunar; urgency=medium + + * lunar/linux: 6.2.0-19.19 -proposed tracker (LP: #2012488) + + * Neuter signing tarballs (LP: #2012776) + - [Packaging] neuter the signing tarball + + * LSM stacking and AppArmor refresh for 6.2 kernel (LP: #2012136) + - Revert "UBUNTU: [Config] define CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS" + - Revert "UBUNTU: SAUCE: apparmor: add user namespace creation mediation" + - Revert "UBUNTU: SAUCE: apparmor: Add fine grained mediation of posix + mqueues" + - Revert "UBUNTU: SAUCE: Revert "apparmor: make __aa_path_perm() static"" + - Revert "UBUNTU: SAUCE: LSM: Specify which LSM to display (using struct cred + as input)" + - Revert "UBUNTU: SAUCE: apparmor: Fix build error, make sk parameter const" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in smk_netlbl_mls()" + - Revert "UBUNTU: SAUCE: LSM: change ima_read_file() to use lsmblob" + - Revert "UBUNTU: SAUCE: apparmor: rename kzfree() to kfree_sensitive()" + - Revert "UBUNTU: SAUCE: AppArmor: Remove the exclusive flag" + - Revert "UBUNTU: SAUCE: LSM: Add /proc attr entry for full LSM context" + - Revert "UBUNTU: SAUCE: Audit: Fix incorrect static inline function + declration." + - Revert "UBUNTU: SAUCE: Audit: Fix for missing NULL check" + - Revert "UBUNTU: SAUCE: Audit: Add a new record for multiple object LSM + attributes" + - Revert "UBUNTU: SAUCE: Audit: Add new record for multiple process LSM + attributes" + - Revert "UBUNTU: SAUCE: NET: Store LSM netlabel data in a lsmblob" + - Revert "UBUNTU: SAUCE: LSM: security_secid_to_secctx in netlink netfilter" + - Revert "UBUNTU: SAUCE: LSM: Use lsmcontext in security_inode_getsecctx" + - Revert "UBUNTU: SAUCE: LSM: Use lsmcontext in security_secid_to_secctx" + - Revert "UBUNTU: SAUCE: LSM: Ensure the correct LSM context releaser" + - Revert "UBUNTU: SAUCE: LSM: Specify which LSM to display" + - Revert "UBUNTU: SAUCE: IMA: Change internal interfaces to use lsmblobs" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_cred_getsecid" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_inode_getsecid" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_task_getsecid" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_ipc_getsecid" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_secid_to_secctx" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_secctx_to_secid" + - Revert "UBUNTU: SAUCE: net: Prepare UDS for security module stacking" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_kernel_act_as" + - Revert "UBUNTU: SAUCE: LSM: Use lsmblob in security_audit_rule_match" + - Revert "UBUNTU: SAUCE: LSM: Create and manage the lsmblob data structure." + - Revert "UBUNTU: SAUCE: LSM: Infrastructure management of the sock security" + - Revert "UBUNTU: SAUCE: apparmor: LSM stacking: switch from SK_CTX() to + aa_sock()" + - Revert "UBUNTU: SAUCE: apparmor: rename aa_sock() to aa_unix_sk()" + - Revert "UBUNTU: SAUCE: apparmor: disable showing the mode as part of a secid + to secctx" + - Revert "UBUNTU: SAUCE: apparmor: fix use after free in sk_peer_label" + - Revert "UBUNTU: SAUCE: apparmor: af_unix mediation" + - Revert "UBUNTU: SAUCE: apparmor: patch to provide compatibility with v2.x + net rules" + - Revert "UBUNTU: SAUCE: apparmor: add/use fns to print hash string hex value" + - SAUCE: apparmor: rename SK_CTX() to aa_sock and make it an inline fn + - SAUCE: apparmor: Add sysctls for additional controls of unpriv userns + restrictions + - SAUCE: Stacking v38: LSM: Identify modules by more than name + - SAUCE: Stacking v38: LSM: Add an LSM identifier for external use + - SAUCE: Stacking v38: LSM: Identify the process attributes for each module + - SAUCE: Stacking v38: LSM: Maintain a table of LSM attribute data + - SAUCE: Stacking v38: proc: Use lsmids instead of lsm names for attrs + - SAUCE: Stacking v38: integrity: disassociate ima_filter_rule from + security_audit_rule + - SAUCE: Stacking v38: LSM: Infrastructure management of the sock security + - SAUCE: Stacking v38: LSM: Add the lsmblob data structure. + - SAUCE: Stacking v38: LSM: provide lsm name and id slot mappings + - SAUCE: Stacking v38: IMA: avoid label collisions with stacked LSMs + - SAUCE: Stacking v38: LSM: Use lsmblob in security_audit_rule_match + - SAUCE: Stacking v38: LSM: Use lsmblob in security_kernel_act_as + - SAUCE: Stacking v38: LSM: Use lsmblob in security_secctx_to_secid + - SAUCE: Stacking v38: LSM: Use lsmblob in security_secid_to_secctx + - SAUCE: Stacking v38: LSM: Use lsmblob in security_ipc_getsecid + - SAUCE: Stacking v38: LSM: Use lsmblob in security_current_getsecid + - SAUCE: Stacking v38: LSM: Use lsmblob in security_inode_getsecid + - SAUCE: Stacking v38: LSM: Use lsmblob in security_cred_getsecid + - SAUCE: Stacking v38: LSM: Specify which LSM to display + - SAUCE: Stacking v38: LSM: Ensure the correct LSM context releaser + - SAUCE: Stacking v38: LSM: Use lsmcontext in security_secid_to_secctx + - SAUCE: Stacking v38: LSM: Use lsmcontext in security_inode_getsecctx + - SAUCE: Stacking v38: Use lsmcontext in security_dentry_init_security + - SAUCE: Stacking v38: LSM: security_secid_to_secctx in netlink netfilter + - SAUCE: Stacking v38: NET: Store LSM netlabel data in a lsmblob + - SAUCE: Stacking v38: binder: Pass LSM identifier for confirmation + - SAUCE: Stacking v38: LSM: security_secid_to_secctx module selection + - SAUCE: Stacking v38: Audit: Keep multiple LSM data in audit_names + - SAUCE: Stacking v38: Audit: Create audit_stamp structure + - SAUCE: Stacking v38: LSM: Add a function to report multiple LSMs + - SAUCE: Stacking v38: Audit: Allow multiple records in an audit_buffer + - SAUCE: Stacking v38: Audit: Add record for multiple task security contexts + - SAUCE: Stacking v38: audit: multiple subject lsm values for netlabel + - SAUCE: Stacking v38: Audit: Add record for multiple object contexts + - SAUCE: Stacking v38: netlabel: Use a struct lsmblob in audit data + - SAUCE: Stacking v38: LSM: Removed scaffolding function lsmcontext_init + - SAUCE: Stacking v38: AppArmor: Remove the exclusive flag + - SAUCE: apparmor: combine common_audit_data and apparmor_audit_data + - SAUCE: apparmor: setup slab cache for audit data + - SAUCE: apparmor: rename audit_data->label to audit_data->subj_label + - SAUCE: apparmor: pass cred through to audit info. + - SAUCE: apparmor: Improve debug print infrastructure + - SAUCE: apparmor: add the ability for profiles to have a learning cache + - SAUCE: apparmor: enable userspace upcall for mediation + - SAUCE: apparmor: cache buffers on percpu list if there is lock contention + - SAUCE: apparmor: fix policy_compat permission remap with extended + permissions + - SAUCE: apparmor: advertise availability of exended perms + - [Config] define CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS + + * kinetic: apply new apparmor and LSM stacking patch set (LP: #1989983) // LSM + stacking and AppArmor refresh for 6.2 kernel (LP: #2012136) + - SAUCE: apparmor: add/use fns to print hash string hex value + - SAUCE: apparmor: patch to provide compatibility with v2.x net rules + - SAUCE: apparmor: add user namespace creation mediation + - SAUCE: apparmor: af_unix mediation + - SAUCE: apparmor: Add fine grained mediation of posix mqueues + + * devlink_port_split from ubuntu_kernel_selftests.net fails on hirsute + (KeyError: 'flavour') (LP: #1937133) + - selftests: net: devlink_port_split.py: skip test if no suitable device + available + + * NFS deathlock with last Kernel 5.4.0-144.161 and 5.15.0-67.74 (LP: #2009325) + - NFS: Correct timing for assigning access cache timestamp + + -- Andrea Righi Sat, 25 Mar 2023 07:37:30 +0100 + +linux (6.2.0-18.18) lunar; urgency=medium + + * lunar/linux: 6.2.0-18.18 -proposed tracker (LP: #2011750) + + * lunar/linux 6.2 fails to boot on arm64 (LP: #2011748) + - SAUCE: Revert "efi: random: fix NULL-deref when refreshing seed" + - SAUCE: Revert "efi: random: refresh non-volatile random seed when RNG is + initialized" + + -- Andrea Righi Wed, 15 Mar 2023 23:54:18 +0100 + +linux (6.2.0-17.17) lunar; urgency=medium + + * lunar/linux: 6.2.0-17.17 -proposed tracker (LP: #2011593) + + * lunar/linux 6.2 fails to boot on ppc64el (LP: #2011413) + - SAUCE: Revert "powerpc: remove STACK_FRAME_OVERHEAD" + - SAUCE: Revert "powerpc/pseries: hvcall stack frame overhead" + + * Speaker / Audio/Mic mute LED don't work on a HP platform (LP: #2011379) + - SAUCE: ALSA: hda/realtek: fix speaker, mute/micmute LEDs not work on a HP + platform + + * Some QHD panels fail to refresh when PSR2 enabled (LP: #2009014) + - SAUCE: drm/i915/psr: Use calculated io and fast wake lines + + * Lunar update: v6.2.6 upstream stable release (LP: #2011431) + - tpm: disable hwrng for fTPM on some AMD designs + - wifi: cfg80211: Partial revert "wifi: cfg80211: Fix use after free for wext" + - staging: rtl8192e: Remove function ..dm_check_ac_dc_power calling a script + - staging: rtl8192e: Remove call_usermodehelper starting RadioPower.sh + - Linux 6.2.6 + + * Lunar update: v6.2.5 upstream stable release (LP: #2011430) + - net/sched: Retire tcindex classifier + - auxdisplay: hd44780: Fix potential memory leak in hd44780_remove() + - fs/jfs: fix shift exponent db_agl2size negative + - driver: soc: xilinx: fix memory leak in xlnx_add_cb_for_notify_event() + - f2fs: don't rely on F2FS_MAP_* in f2fs_iomap_begin + - f2fs: fix to avoid potential deadlock + - objtool: Fix memory leak in create_static_call_sections() + - soc: mediatek: mtk-pm-domains: Allow mt8186 ADSP default power on + - soc: qcom: socinfo: Fix soc_id order + - memory: renesas-rpc-if: Split-off private data from struct rpcif + - memory: renesas-rpc-if: Move resource acquisition to .probe() + - soc: mediatek: mtk-svs: Enable the IRQ later + - pwm: sifive: Always let the first pwm_apply_state succeed + - pwm: stm32-lp: fix the check on arr and cmp registers update + - f2fs: introduce trace_f2fs_replace_atomic_write_block + - f2fs: clear atomic_write_task in f2fs_abort_atomic_write() + - soc: mediatek: mtk-svs: restore default voltages when svs_init02() fail + - soc: mediatek: mtk-svs: reset svs when svs_resume() fail + - soc: mediatek: mtk-svs: Use pm_runtime_resume_and_get() in svs_init01() + - f2fs: fix to do sanity check on extent cache correctly + - fs: f2fs: initialize fsdata in pagecache_write() + - f2fs: allow set compression option of files without blocks + - f2fs: fix to abort atomic write only during do_exist() + - um: vector: Fix memory leak in vector_config + - ubi: ensure that VID header offset + VID header size <= alloc, size + - ubifs: Fix build errors as symbol undefined + - ubifs: Fix memory leak in ubifs_sysfs_init() + - ubifs: Rectify space budget for ubifs_symlink() if symlink is encrypted + - ubifs: Rectify space budget for ubifs_xrename() + - ubifs: Fix wrong dirty space budget for dirty inode + - ubifs: do_rename: Fix wrong space budget when target inode's nlink > 1 + - ubifs: Reserve one leb for each journal head while doing budget + - ubi: Fix use-after-free when volume resizing failed + - ubi: Fix unreferenced object reported by kmemleak in ubi_resize_volume() + - ubifs: Fix memory leak in alloc_wbufs() + - ubi: Fix possible null-ptr-deref in ubi_free_volume() + - ubifs: Re-statistic cleaned znode count if commit failed + - ubifs: dirty_cow_znode: Fix memleak in error handling path + - ubifs: ubifs_writepage: Mark page dirty after writing inode failed + - ubifs: ubifs_releasepage: Remove ubifs_assert(0) to valid this process + - ubi: fastmap: Fix missed fm_anchor PEB in wear-leveling after disabling + fastmap + - ubi: Fix UAF wear-leveling entry in eraseblk_count_seq_show() + - ubi: ubi_wl_put_peb: Fix infinite loop when wear-leveling work failed + - f2fs: fix to handle F2FS_IOC_START_ATOMIC_REPLACE in f2fs_compat_ioctl() + - f2fs: fix to avoid potential memory corruption in __update_iostat_latency() + - f2fs: fix to update age extent correctly during truncation + - f2fs: fix to update age extent in f2fs_do_zero_range() + - soc: qcom: stats: Populate all subsystem debugfs files + - f2fs: introduce IS_F2FS_IPU_* macro + - f2fs: fix to set ipu policy + - ext4: use ext4_fc_tl_mem in fast-commit replay path + - ext4: don't show commit interval if it is zero + - netfilter: nf_tables: allow to fetch set elements when table has an owner + - x86: um: vdso: Add '%rcx' and '%r11' to the syscall clobber list + - um: virtio_uml: free command if adding to virtqueue failed + - um: virtio_uml: mark device as unregistered when breaking it + - um: virtio_uml: move device breaking into workqueue + - um: virt-pci: properly remove PCI device from bus + - f2fs: synchronize atomic write aborts + - watchdog: rzg2l_wdt: Issue a reset before we put the PM clocks + - watchdog: rzg2l_wdt: Handle TYPE-B reset for RZ/V2M + - watchdog: at91sam9_wdt: use devm_request_irq to avoid missing free_irq() in + error path + - watchdog: Fix kmemleak in watchdog_cdev_register + - watchdog: pcwd_usb: Fix attempting to access uninitialized memory + - watchdog: sbsa_wdog: Make sure the timeout programming is within the limits + - netfilter: ctnetlink: fix possible refcount leak in + ctnetlink_create_conntrack() + - netfilter: conntrack: fix rmmod double-free race + - netfilter: ip6t_rpfilter: Fix regression with VRF interfaces + - netfilter: ebtables: fix table blob use-after-free + - netfilter: xt_length: use skb len to match in length_mt6 + - netfilter: ctnetlink: make event listener tracking global + - netfilter: x_tables: fix percpu counter block leak on error path when + creating new netns + - swiotlb: mark swiotlb_memblock_alloc() as __init + - ptp: vclock: use mutex to fix "sleep on atomic" bug + - drm/i915: move a Kconfig symbol to unbreak the menu presentation + - ipv6: Add lwtunnel encap size of all siblings in nexthop calculation + - drm/i915/xelpmp: Consider GSI offset when doing MCR lookups + - octeontx2-pf: Recalculate UDP checksum for ptp 1-step sync packet + - net: sunhme: Fix region request + - sctp: add a refcnt in sctp_stream_priorities to avoid a nested loop + - octeontx2-pf: Use correct struct reference in test condition + - net: fix __dev_kfree_skb_any() vs drop monitor + - 9p/xen: fix version parsing + - 9p/xen: fix connection sequence + - 9p/rdma: unmap receive dma buffer in rdma_request()/post_recv() + - spi: tegra210-quad: Fix validate combined sequence + - mlx5: fix skb leak while fifo resync and push + - mlx5: fix possible ptp queue fifo use-after-free + - net/mlx5: ECPF, wait for VF pages only after disabling host PFs + - net/mlx5e: Verify flow_source cap before using it + - net/mlx5: Geneve, Fix handling of Geneve object id as error code + - ext4: fix incorrect options show of original mount_opt and extend mount_opt2 + - nfc: fix memory leak of se_io context in nfc_genl_se_io + - net/sched: transition act_pedit to rcu and percpu stats + - net/sched: act_pedit: fix action bind logic + - net/sched: act_mpls: fix action bind logic + - net/sched: act_sample: fix action bind logic + - net: dsa: seville: ignore mscc-miim read errors from Lynx PCS + - net: dsa: felix: fix internal MDIO controller resource length + - ARM: dts: aspeed: p10bmc: Update battery node name + - ARM: dts: spear320-hmi: correct STMPE GPIO compatible + - tcp: tcp_check_req() can be called from process context + - vc_screen: modify vcs_size() handling in vcs_read() + - spi: tegra210-quad: Fix iterator outside loop + - rtc: sun6i: Always export the internal oscillator + - genirq/ipi: Fix NULL pointer deref in irq_data_get_affinity_mask() + - scsi: ipr: Work around fortify-string warning + - scsi: mpi3mr: Fix an issue found by KASAN + - scsi: mpi3mr: Use number of bits to manage bitmap sizes + - rtc: allow rtc_read_alarm without read_alarm callback + - io_uring: fix size calculation when registering buf ring + - loop: loop_set_status_from_info() check before assignment + - ASoC: adau7118: don't disable regulators on device unbind + - ASoC: apple: mca: Fix final status read on SERDES reset + - ASoC: apple: mca: Fix SERDES reset sequence + - ASoC: apple: mca: Improve handling of unavailable DMA channels + - nvme: bring back auto-removal of deleted namespaces during sequential scan + - nvme-tcp: don't access released socket during error recovery + - nvme-fabrics: show well known discovery name + - ASoC: zl38060 add gpiolib dependency + - ASoC: mediatek: mt8195: add missing initialization + - thermal: intel: quark_dts: fix error pointer dereference + - thermal: intel: BXT_PMIC: select REGMAP instead of depending on it + - cpufreq: apple-soc: Fix an IS_ERR() vs NULL check + - tracing: Add NULL checks for buffer in ring_buffer_free_read_page() + - kernel/printk/index.c: fix memory leak with using debugfs_lookup() + - firmware/efi sysfb_efi: Add quirk for Lenovo IdeaPad Duet 3 + - bootconfig: Increase max nodes of bootconfig from 1024 to 8192 for DCC + support + - mfd: arizona: Use pm_runtime_resume_and_get() to prevent refcnt leak + - IB/hfi1: Update RMT size calculation + - iommu: Remove deferred attach check from __iommu_detach_device() + - PCI/ACPI: Account for _S0W of the target bridge in acpi_pci_bridge_d3() + - media: uvcvideo: Remove format descriptions + - media: uvcvideo: Handle cameras with invalid descriptors + - media: uvcvideo: Handle errors from calls to usb_string + - media: uvcvideo: Quirk for autosuspend in Logitech B910 and C910 + - media: uvcvideo: Silence memcpy() run-time false positive warnings + - USB: fix memory leak with using debugfs_lookup() + - cacheinfo: Fix shared_cpu_map to handle shared caches at different levels + - usb: fotg210: List different variants + - dt-bindings: usb: Add device id for Genesys Logic hub controller + - staging: emxx_udc: Add checks for dma_alloc_coherent() + - tty: fix out-of-bounds access in tty_driver_lookup_tty() + - tty: serial: fsl_lpuart: disable the CTS when send break signal + - serial: sc16is7xx: setup GPIO controller later in probe + - mei: bus-fixup:upon error print return values of send and receive + - tools/iio/iio_utils:fix memory leak + - bus: mhi: ep: Fix the debug message for MHI_PKT_TYPE_RESET_CHAN_CMD cmd + - iio: accel: mma9551_core: Prevent uninitialized variable in + mma9551_read_status_word() + - iio: accel: mma9551_core: Prevent uninitialized variable in + mma9551_read_config_word() + - media: uvcvideo: Add GUID for BGRA/X 8:8:8:8 + - soundwire: bus_type: Avoid lockdep assert in sdw_drv_probe() + - PCI/portdrv: Prevent LS7A Bus Master clearing on shutdown + - PCI: loongson: Prevent LS7A MRRS increases + - staging: pi433: fix memory leak with using debugfs_lookup() + - USB: dwc3: fix memory leak with using debugfs_lookup() + - USB: chipidea: fix memory leak with using debugfs_lookup() + - USB: ULPI: fix memory leak with using debugfs_lookup() + - USB: uhci: fix memory leak with using debugfs_lookup() + - USB: sl811: fix memory leak with using debugfs_lookup() + - USB: fotg210: fix memory leak with using debugfs_lookup() + - USB: isp116x: fix memory leak with using debugfs_lookup() + - USB: isp1362: fix memory leak with using debugfs_lookup() + - USB: gadget: gr_udc: fix memory leak with using debugfs_lookup() + - USB: gadget: bcm63xx_udc: fix memory leak with using debugfs_lookup() + - USB: gadget: lpc32xx_udc: fix memory leak with using debugfs_lookup() + - USB: gadget: pxa25x_udc: fix memory leak with using debugfs_lookup() + - USB: gadget: pxa27x_udc: fix memory leak with using debugfs_lookup() + - usb: host: xhci: mvebu: Iterate over array indexes instead of using pointer + math + - USB: ene_usb6250: Allocate enough memory for full object + - usb: uvc: Enumerate valid values for color matching + - usb: gadget: uvc: Make bSourceID read/write + - PCI: Align extra resources for hotplug bridges properly + - PCI: Take other bus devices into account when distributing resources + - PCI: Distribute available resources for root buses, too + - tty: pcn_uart: fix memory leak with using debugfs_lookup() + - misc: vmw_balloon: fix memory leak with using debugfs_lookup() + - drivers: base: component: fix memory leak with using debugfs_lookup() + - drivers: base: dd: fix memory leak with using debugfs_lookup() + - kernel/fail_function: fix memory leak with using debugfs_lookup() + - PCI: loongson: Add more devices that need MRRS quirk + - PCI: Add ACS quirk for Wangxun NICs + - PCI: pciehp: Add Qualcomm quirk for Command Completed erratum + - phy: rockchip-typec: Fix unsigned comparison with less than zero + - RDMA/cma: Distinguish between sockaddr_in and sockaddr_in6 by size + - soundwire: cadence: Remove wasted space in response_buf + - soundwire: cadence: Drain the RX FIFO after an IO timeout + - eth: fealnx: bring back this old driver + - net: tls: avoid hanging tasks on the tx_lock + - x86/resctl: fix scheduler confusion with 'current' + - vDPA/ifcvf: decouple hw features manipulators from the adapter + - vDPA/ifcvf: decouple config space ops from the adapter + - vDPA/ifcvf: alloc the mgmt_dev before the adapter + - vDPA/ifcvf: decouple vq IRQ releasers from the adapter + - vDPA/ifcvf: decouple config IRQ releaser from the adapter + - vDPA/ifcvf: decouple vq irq requester from the adapter + - vDPA/ifcvf: decouple config/dev IRQ requester and vectors allocator from the + adapter + - vDPA/ifcvf: ifcvf_request_irq works on ifcvf_hw + - vDPA/ifcvf: manage ifcvf_hw in the mgmt_dev + - vDPA/ifcvf: allocate the adapter in dev_add() + - drm/display/dp_mst: Add drm_atomic_get_old_mst_topology_state() + - drm/display/dp_mst: Fix down/up message handling after sink disconnect + - drm/display/dp_mst: Fix down message handling after a packet reception error + - drm/display/dp_mst: Fix payload addition on a disconnected sink + - drm/i915/dp_mst: Add the MST topology state for modesetted CRTCs + - drm/display/dp_mst: Handle old/new payload states in drm_dp_remove_payload() + - drm/i915/dp_mst: Fix payload removal during output disabling + - drm/i915: Fix system suspend without fbdev being initialized + - media: uvcvideo: Fix race condition with usb_kill_urb + - arm64: efi: Make efi_rt_lock a raw_spinlock + - usb: gadget: uvc: fix missing mutex_unlock() if kstrtou8() fails + - Linux 6.2.5 + + * Lunar update: v6.2.4 upstream stable release (LP: #2011428) + - Revert "blk-cgroup: synchronize pd_free_fn() from blkg_free_workfn() and + blkcg_deactivate_policy()" + - Revert "blk-cgroup: dropping parent refcount after pd_free_fn() is done" + - Linux 6.2.4 + + * Lunar update: v6.2.3 upstream stable release (LP: #2011425) + - HID: asus: use spinlock to protect concurrent accesses + - HID: asus: use spinlock to safely schedule workers + - iommu/amd: Fix error handling for pdev_pri_ats_enable() + - iommu/amd: Skip attach device domain is same as new domain + - iommu/amd: Improve page fault error reporting + - iommu: Attach device group to old domain in error path + - powerpc/mm: Rearrange if-else block to avoid clang warning + - ata: ahci: Revert "ata: ahci: Add Tiger Lake UP{3,4} AHCI controller" + - ARM: OMAP2+: Fix memory leak in realtime_counter_init() + - arm64: dts: qcom: qcs404: use symbol names for PCIe resets + - arm64: dts: qcom: msm8996-tone: Fix USB taking 6 minutes to wake up + - arm64: dts: qcom: sm6115: Fix UFS node + - arm64: dts: qcom: sm6115: Provide xo clk to rpmcc + - arm64: dts: qcom: sm8150-kumano: Panel framebuffer is 2.5k instead of 4k + - arm64: dts: qcom: pmi8950: Correct rev_1250v channel label to mv + - arm64: dts: qcom: sm6350: Fix up the ramoops node + - arm64: dts: qcom: sdm670-google-sargo: keep pm660 ldo8 on + - arm64: dts: qcom: Re-enable resin on MSM8998 and SDM845 boards + - arm64: dts: qcom: sm8350-sagami: Configure SLG51000 PMIC on PDX215 + - arm64: dts: qcom: sm8350-sagami: Add GPIO line names for PMIC GPIOs + - arm64: dts: qcom: sm8350-sagami: Rectify GPIO keys + - arm64: dts: qcom: sm6350-lena: Flatten gpio-keys pinctrl state + - arm64: dts: qcom: sm6125: Reorder HSUSB PHY clocks to match bindings + - arm64: dts: qcom: sm6125-seine: Clean up gpio-keys (volume down) + - arm64: dts: imx8m: Align SoC unique ID node unit address + - ARM: zynq: Fix refcount leak in zynq_early_slcr_init + - fs: dlm: fix return value check in dlm_memory_init() + - arm64: dts: mediatek: mt8195: Add power domain to U3PHY1 T-PHY + - arm64: dts: mediatek: mt8183: Fix systimer 13 MHz clock description + - arm64: dts: mediatek: mt8192: Fix systimer 13 MHz clock description + - arm64: dts: mediatek: mt8195: Fix systimer 13 MHz clock description + - arm64: dts: mediatek: mt8186: Fix systimer 13 MHz clock description + - arm64: dts: qcom: sdm845-db845c: fix audio codec interrupt pin name + - arm64: dts: qcom: sdm845-xiaomi-beryllium: fix audio codec interrupt pin + name + - x86/acpi/boot: Do not register processors that cannot be onlined for x2APIC + - arm64: dts: qcom: sc7180: correct SPMI bus address cells + - arm64: dts: qcom: sc7280: correct SPMI bus address cells + - arm64: dts: qcom: sc8280xp: correct SPMI bus address cells + - arm64: dts: qcom: sm8450: correct Soundwire wakeup interrupt name + - arm64: dts: qcom: sdm845: make DP node follow the schema + - arm64: dts: qcom: msm8996-oneplus-common: drop vdda-supply from DSI PHY + - arm64: dts: qcom: sc8280xp: Vote for CX in USB controllers + - arm64: dts: meson-gxl: jethub-j80: Fix WiFi MAC address node + - arm64: dts: meson-gxl: jethub-j80: Fix Bluetooth MAC node name + - arm64: dts: meson-axg: jethub-j1xx: Fix MAC address node names + - arm64: dts: meson-gx: Fix Ethernet MAC address unit name + - arm64: dts: meson-g12a: Fix internal Ethernet PHY unit name + - arm64: dts: meson-gx: Fix the SCPI DVFS node name and unit address + - cpuidle, intel_idle: Fix CPUIDLE_FLAG_IRQ_ENABLE *again* + - arm64: dts: ti: k3-am62-main: Fix clocks for McSPI + - arm64: tegra: Fix duplicate regulator on Jetson TX1 + - arm64: dts: qcom: msm8992-bullhead: Fix cont_splash_mem size + - arm64: dts: qcom: msm8992-bullhead: Disable dfps_data_mem + - arm64: dts: qcom: msm8956: use SoC-specific compat for tsens + - arm64: dts: qcom: ipq8074: correct USB3 QMP PHY-s clock output names + - arm64: dts: qcom: ipq8074: fix Gen2 PCIe QMP PHY + - arm64: dts: qcom: ipq8074: fix Gen3 PCIe QMP PHY + - arm64: dts: qcom: ipq8074: correct Gen2 PCIe ranges + - arm64: dts: qcom: ipq8074: fix Gen3 PCIe node + - arm64: dts: qcom: ipq8074: correct PCIe QMP PHY output clock names + - arm64: dts: meson: remove CPU opps below 1GHz for G12A boards + - ARM: OMAP1: call platform_device_put() in error case in + omap1_dm_timer_init() + - arm64: dts: mediatek: mt8192: Mark scp_adsp clock as broken + - ARM: bcm2835_defconfig: Enable the framebuffer + - ARM: s3c: fix s3c64xx_set_timer_source prototype + - arm64: dts: ti: k3-j7200: Fix wakeup pinmux range + - ARM: dts: exynos: correct wr-active property in Exynos3250 Rinato + - ARM: imx: Call ida_simple_remove() for ida_simple_get + - arm64: dts: amlogic: meson-gx: fix SCPI clock dvfs node name + - arm64: dts: amlogic: meson-axg: fix SCPI clock dvfs node name + - arm64: dts: amlogic: meson-gx: add missing SCPI sensors compatible + - arm64: dts: amlogic: meson-axg-jethome-jethub-j1xx: fix supply name of USB + controller node + - arm64: dts: amlogic: meson-gxl-s905d-sml5442tw: drop invalid clock-names + property + - arm64: dts: amlogic: meson-gx: add missing unit address to rng node name + - arm64: dts: amlogic: meson-gxl-s905w-jethome-jethub-j80: fix invalid rtc + node name + - arm64: dts: amlogic: meson-axg-jethome-jethub-j1xx: fix invalid rtc node + name + - arm64: dts: amlogic: meson-gxl: add missing unit address to eth-phy-mux node + name + - arm64: dts: amlogic: meson-gx-libretech-pc: fix update button name + - arm64: dts: amlogic: meson-sm1-bananapi-m5: fix adc keys node names + - arm64: dts: amlogic: meson-gxl-s905d-phicomm-n1: fix led node name + - arm64: dts: amlogic: meson-gxbb-kii-pro: fix led node name + - arm64: dts: amlogic: meson-g12b-odroid-go-ultra: fix rk818 pmic properties + - arm64: dts: amlogic: meson-sm1-odroid-hc4: fix active fan thermal trip + - locking/rwsem: Disable preemption in all down_read*() and up_read() code + paths + - arm64: tegra: Mark host1x as dma-coherent on Tegra194/234 + - arm64: dts: renesas: beacon-renesom: Fix gpio expander reference + - arm64: dts: meson: radxa-zero: allow usb otg mode + - arm64: dts: meson: bananapi-m5: switch VDDIO_C pin to OPEN_DRAIN + - ARM: dts: sun8i: nanopi-duo2: Fix regulator GPIO reference + - ublk_drv: remove nr_aborted_queues from ublk_device + - ublk_drv: don't probe partitions if the ubq daemon isn't trusted + - ARM: dts: imx7s: correct iomuxc gpr mux controller cells + - sbitmap: remove redundant check in __sbitmap_queue_get_batch + - sbitmap: correct wake_batch recalculation to avoid potential IO hung + - arm64: dts: mt8195: Fix CPU map for single-cluster SoC + - arm64: dts: mt8192: Fix CPU map for single-cluster SoC + - arm64: dts: mt8186: Fix CPU map for single-cluster SoC + - arm64: dts: mediatek: mt7622: Add missing pwm-cells to pwm node + - arm64: dts: mediatek: mt8186: Fix watchdog compatible + - arm64: dts: mediatek: mt8195: Fix watchdog compatible + - arm64: dts: mediatek: mt7986: Fix watchdog compatible + - ARM: dts: stm32: Update part number NVMEM description on stm32mp131 + - arm64: dts: qcom: sm8450-nagara: Correct firmware paths + - blk-mq: avoid sleep in blk_mq_alloc_request_hctx + - blk-mq: remove stale comment for blk_mq_sched_mark_restart_hctx + - blk-mq: wait on correct sbitmap_queue in blk_mq_mark_tag_wait + - blk-mq: Fix potential io hung for shared sbitmap per tagset + - blk-mq: correct stale comment of .get_budget + - arm64: dts: qcom: msm8996: support using GPLL0 as kryocc input + - arm64: dts: qcom: msm8996 switch from RPM_SMD_BB_CLK1 to RPM_SMD_XO_CLK_SRC + - arm64: dts: qcom: sm8350: drop incorrect cells from serial + - arm64: dts: qcom: sm8450: drop incorrect cells from serial + - arm64: dts: qcom: msm8992-lg-bullhead: Correct memory overlaps with the SMEM + and MPSS memory regions + - arm64: dts: qcom: msm8953: correct TLMM gpio-ranges + - arm64: dts: qcom: sm6115: correct TLMM gpio-ranges + - arm64: dts: qcom: msm8992-lg-bullhead: Enable regulators + - s390/dasd: Fix potential memleak in dasd_eckd_init() + - io_uring,audit: don't log IORING_OP_MADVISE + - sched/rt: pick_next_rt_entity(): check list_entry + - perf/x86/intel/ds: Fix the conversion from TSC to perf time + - x86/perf/zhaoxin: Add stepping check for ZXC + - KEYS: asymmetric: Fix ECDSA use via keyctl uapi + - block: ublk: check IO buffer based on flag need_get_data + - arm64: dts: qcom: pmk8350: Use the correct PON compatible + - erofs: relinquish volume with mutex held + - block: sync mixed merged request's failfast with 1st bio's + - block: Fix io statistics for cgroup in throttle path + - block: bio-integrity: Copy flags when bio_integrity_payload is cloned + - block: use proper return value from bio_failfast() + - wifi: mt76: mt7915: add missing of_node_put() + - wifi: mt76: mt7921s: fix slab-out-of-bounds access in sdio host + - wifi: mt76: mt7915: fix mt7915_rate_txpower_get() resource leaks + - wifi: mt76: mt7996: fix insecure data handling of mt7996_mcu_ie_countdown() + - wifi: mt76: mt7996: fix insecure data handling of + mt7996_mcu_rx_radar_detected() + - wifi: mt76: mt7996: fix integer handling issue of mt7996_rf_regval_set() + - wifi: mt76: mt7915: check return value before accessing free_block_num + - wifi: mt76: mt7996: check return value before accessing free_block_num + - wifi: mt76: mt7915: drop always true condition of __mt7915_reg_addr() + - wifi: mt76: mt7996: drop always true condition of __mt7996_reg_addr() + - wifi: mt76: mt7996: fix endianness warning in mt7996_mcu_sta_he_tlv + - wifi: mt76: mt76x0: fix oob access in mt76x0_phy_get_target_power + - wifi: mt76: mt7996: fix unintended sign extension of mt7996_hw_queue_read() + - wifi: mt76: mt7915: fix unintended sign extension of mt7915_hw_queue_read() + - wifi: mt76: fix coverity uninit_use_in_call in + mt76_connac2_reverse_frag0_hdr_trans() + - wifi: mt76: mt7921: resource leaks at mt7921_check_offload_capability() + - wifi: rsi: Fix memory leak in rsi_coex_attach() + - wifi: rtlwifi: rtl8821ae: don't call kfree_skb() under spin_lock_irqsave() + - wifi: rtlwifi: rtl8188ee: don't call kfree_skb() under spin_lock_irqsave() + - wifi: rtlwifi: rtl8723be: don't call kfree_skb() under spin_lock_irqsave() + - wifi: iwlegacy: common: don't call dev_kfree_skb() under spin_lock_irqsave() + - wifi: libertas: fix memory leak in lbs_init_adapter() + - wifi: rtl8xxxu: Fix assignment to bit field priv->pi_enabled + - wifi: rtl8xxxu: Fix assignment to bit field priv->cck_agc_report_type + - wifi: rtl8xxxu: don't call dev_kfree_skb() under spin_lock_irqsave() + - wifi: rtw89: 8852c: rfk: correct DACK setting + - wifi: rtw89: 8852c: rfk: correct DPK settings + - wifi: rtlwifi: Fix global-out-of-bounds bug in + _rtl8812ae_phy_set_txpower_limit() + - libbpf: Fix single-line struct definition output in btf_dump + - libbpf: Fix btf__align_of() by taking into account field offsets + - wifi: ipw2x00: don't call dev_kfree_skb() under spin_lock_irqsave() + - wifi: ipw2200: fix memory leak in ipw_wdev_init() + - wifi: wilc1000: fix potential memory leak in wilc_mac_xmit() + - wifi: wilc1000: add missing unregister_netdev() in wilc_netdev_ifc_init() + - wifi: brcmfmac: fix potential memory leak in brcmf_netdev_start_xmit() + - wifi: brcmfmac: unmap dma buffer in brcmf_msgbuf_alloc_pktid() + - wifi: libertas_tf: don't call kfree_skb() under spin_lock_irqsave() + - wifi: libertas: if_usb: don't call kfree_skb() under spin_lock_irqsave() + - wifi: libertas: main: don't call kfree_skb() under spin_lock_irqsave() + - wifi: libertas: cmdresp: don't call kfree_skb() under spin_lock_irqsave() + - wifi: wl3501_cs: don't call kfree_skb() under spin_lock_irqsave() + - libbpf: Fix invalid return address register in s390 + - crypto: x86/ghash - fix unaligned access in ghash_setkey() + - crypto: ux500 - update debug config after ux500 cryp driver removal + - ACPICA: Drop port I/O validation for some regions + - genirq: Fix the return type of kstat_cpu_irqs_sum() + - rcu-tasks: Improve comments explaining tasks_rcu_exit_srcu purpose + - rcu-tasks: Remove preemption disablement around srcu_read_[un]lock() calls + - rcu-tasks: Fix synchronize_rcu_tasks() VS zap_pid_ns_processes() + - lib/mpi: Fix buffer overrun when SG is too long + - crypto: ccp - Avoid page allocation failure warning for SEV_GET_ID2 + - platform/chrome: cros_ec_typec: Update port DP VDO + - ACPICA: nsrepair: handle cases without a return value correctly + - libbpf: Fix map creation flags sanitization + - bpf_doc: Fix build error with older python versions + - selftests/xsk: print correct payload for packet dump + - selftests/xsk: print correct error codes when exiting + - arm64/cpufeature: Fix field sign for DIT hwcap detection + - arm64/sysreg: Fix errors in 32 bit enumeration values + - kselftest/arm64: Fix syscall-abi for systems without 128 bit SME + - workqueue: Protects wq_unbound_cpumask with wq_pool_attach_mutex + - s390/early: fix sclp_early_sccb variable lifetime + - s390/vfio-ap: fix an error handling path in vfio_ap_mdev_probe_queue() + - x86/signal: Fix the value returned by strict_sas_size() + - thermal/drivers/tsens: Drop msm8976-specific defines + - thermal/drivers/tsens: Sort out msm8976 vs msm8956 data + - thermal/drivers/tsens: fix slope values for msm8939 + - thermal/drivers/tsens: limit num_sensors to 9 for msm8939 + - wifi: rtw89: fix potential leak in rtw89_append_probe_req_ie() + - wifi: rtw89: Add missing check for alloc_workqueue + - wifi: rtl8xxxu: Fix memory leaks with RTL8723BU, RTL8192EU + - wifi: orinoco: check return value of hermes_write_wordrec() + - wifi: rtw88: Use rtw_iterate_vifs() for rtw_vif_watch_dog_iter() + - wifi: rtw88: Use non-atomic sta iterator in rtw_ra_mask_info_update() + - thermal/drivers/imx_sc_thermal: Fix the loop condition + - wifi: ath9k: htc_hst: free skb in ath9k_htc_rx_msg() if there is no callback + function + - wifi: ath9k: hif_usb: clean up skbs if ath9k_hif_usb_rx_stream() fails + - wifi: ath9k: Fix potential stack-out-of-bounds write in + ath9k_wmi_rsp_callback() + - wifi: ath11k: Fix memory leak in ath11k_peer_rx_frag_setup + - wifi: cfg80211: Fix extended KCK key length check in + nl80211_set_rekey_data() + - ACPI: battery: Fix missing NUL-termination with large strings + - selftests/bpf: Fix build errors if CONFIG_NF_CONNTRACK=m + - crypto: ccp - Failure on re-initialization due to duplicate sysfs filename + - crypto: essiv - Handle EBUSY correctly + - crypto: seqiv - Handle EBUSY correctly + - powercap: fix possible name leak in powercap_register_zone() + - bpf: Fix state pruning for STACK_DYNPTR stack slots + - bpf: Fix missing var_off check for ARG_PTR_TO_DYNPTR + - bpf: Fix partial dynptr stack slot reads/writes + - x86/microcode: Add a parameter to microcode_check() to store CPU + capabilities + - x86/microcode: Check CPU capabilities after late microcode update correctly + - x86/microcode: Adjust late loading result reporting message + - net: ethernet: ti: am65-cpsw/cpts: Fix CPTS release action + - selftests/bpf: Fix vmtest static compilation error + - crypto: xts - Handle EBUSY correctly + - leds: led-class: Add missing put_device() to led_put() + - drm/nouveau/disp: Fix nvif_outp_acquire_dp() argument size + - s390/bpf: Add expoline to tail calls + - wifi: iwlwifi: mei: fix compilation errors in rfkill() + - kselftest/arm64: Fix enumeration of systems without 128 bit SME + - can: rcar_canfd: Fix R-Car V3U CAN mode selection + - can: rcar_canfd: Fix R-Car V3U GAFLCFG field accesses + - selftests/bpf: Initialize tc in xdp_synproxy + - crypto: ccp - Flush the SEV-ES TMR memory before giving it to firmware + - bpftool: profile online CPUs instead of possible + - wifi: mt76: mt7921: fix deadlock in mt7921_abort_roc + - wifi: mt76: mt7915: call mt7915_mcu_set_thermal_throttling() only after + init_work + - wifi: mt76: mt7915: rework mt7915_mcu_set_thermal_throttling + - wifi: mt76: mt7915: rework mt7915_thermal_temp_store() + - wifi: mt76: mt7921: fix channel switch fail in monitor mode + - wifi: mt76: mt7996: fix chainmask calculation in mt7996_set_antenna() + - wifi: mt76: mt7996: update register for CFEND_RATE + - wifi: mt76: connac: fix POWER_CTRL command name typo + - wifi: mt76: mt7921: fix invalid remain_on_channel duration + - wifi: mt76: mt7915: fix memory leak in mt7915_mcu_exit + - wifi: mt76: mt7996: fix memory leak in mt7996_mcu_exit + - wifi: mt76: dma: fix memory leak running mt76_dma_tx_cleanup + - wifi: mt76: fix switch default case in mt7996_reverse_frag0_hdr_trans + - wifi: mt76: mt7915: fix WED TxS reporting + - wifi: mt76: add memory barrier to SDIO queue kick + - wifi: mt76: mt7996: rely on mt76_connac2_mac_tx_rate_val + - net/mlx5: Enhance debug print in page allocation failure + - irqchip: Fix refcount leak in platform_irqchip_probe + - irqchip/alpine-msi: Fix refcount leak in alpine_msix_init_domains + - irqchip/irq-mvebu-gicp: Fix refcount leak in mvebu_gicp_probe + - irqchip/ti-sci: Fix refcount leak in ti_sci_intr_irq_domain_probe + - s390/mem_detect: fix detect_memory() error handling + - s390/vmem: fix empty page tables cleanup under KASAN + - s390/boot: cleanup decompressor header files + - s390/mem_detect: rely on diag260() if sclp_early_get_memsize() fails + - s390/boot: fix mem_detect extended area allocation + - net: add sock_init_data_uid() + - tun: tun_chr_open(): correctly initialize socket uid + - tap: tap_open(): correctly initialize socket uid + - rxrpc: Fix overwaking on call poking + - OPP: fix error checking in opp_migrate_dentry() + - cpufreq: davinci: Fix clk use after free + - Bluetooth: hci_conn: Refactor hci_bind_bis() since it always succeeds + - Bluetooth: L2CAP: Fix potential user-after-free + - Bluetooth: hci_qca: get wakeup status from serdev device handle + - net: ipa: generic command param fix + - s390: vfio-ap: tighten the NIB validity check + - s390/ap: fix status returned by ap_aqic() + - s390/ap: fix status returned by ap_qact() + - libbpf: Fix alen calculation in libbpf_nla_dump_errormsg() + - xen/grant-dma-iommu: Implement a dummy probe_device() callback + - rds: rds_rm_zerocopy_callback() correct order for list_add_tail() + - crypto: rsa-pkcs1pad - Use akcipher_request_complete + - m68k: /proc/hardware should depend on PROC_FS + - RISC-V: time: initialize hrtimer based broadcast clock event device + - clocksource/drivers/riscv: Patch riscv_clock_next_event() jump before first + use + - wifi: iwl3945: Add missing check for create_singlethread_workqueue + - wifi: iwl4965: Add missing check for create_singlethread_workqueue() + - wifi: brcmfmac: Rename Cypress 89459 to BCM4355 + - wifi: brcmfmac: pcie: Add IDs/properties for BCM4355 + - wifi: brcmfmac: pcie: Add IDs/properties for BCM4377 + - wifi: brcmfmac: pcie: Perform correct BCM4364 firmware selection + - wifi: mwifiex: fix loop iterator in mwifiex_update_ampdu_txwinsize() + - wifi: rtw89: fix parsing offset for MCC C2H + - selftests/bpf: Fix out-of-srctree build + - ACPI: resource: Add IRQ overrides for MAINGEAR Vector Pro 2 models + - ACPI: resource: Do IRQ override on all TongFang GMxRGxx + - crypto: octeontx2 - Fix objects shared between several modules + - crypto: crypto4xx - Call dma_unmap_page when done + - vfio/ccw: remove WARN_ON during shutdown + - wifi: mac80211: move color collision detection report in a delayed work + - wifi: mac80211: make rate u32 in sta_set_rate_info_rx() + - wifi: mac80211: fix non-MLO station association + - wifi: mac80211: Don't translate MLD addresses for multicast + - wifi: mac80211: avoid u32_encode_bits() warning + - wifi: mac80211: fix off-by-one link setting + - tools/lib/thermal: Fix thermal_sampling_exit() + - thermal/drivers/hisi: Drop second sensor hi3660 + - selftests/bpf: Fix map_kptr test. + - wifi: mac80211: pass 'sta' to ieee80211_rx_data_set_sta() + - bpf: Zeroing allocated object from slab in bpf memory allocator + - selftests/bpf: Fix xdp_do_redirect on s390x + - can: esd_usb: Move mislocated storage of SJA1000_ECC_SEG bits in case of a + bus error + - can: esd_usb: Make use of can_change_state() and relocate checking skb for + NULL + - xsk: check IFF_UP earlier in Tx path + - LoongArch, bpf: Use 4 instructions for function address in JIT + - bpf: Fix global subprog context argument resolution logic + - irqchip/irq-brcmstb-l2: Set IRQ_LEVEL for level triggered interrupts + - irqchip/irq-bcm7120-l2: Set IRQ_LEVEL for level triggered interrupts + - net/smc: fix potential panic dues to unprotected smc_llc_srv_add_link() + - net/smc: fix application data exception + - selftests/net: Interpret UDP_GRO cmsg data as an int value + - l2tp: Avoid possible recursive deadlock in l2tp_tunnel_register() + - net: bcmgenet: fix MoCA LED control + - net: lan966x: Fix possible deadlock inside PTP + - net/mlx4_en: Introduce flexible array to silence overflow warning + - net/mlx5e: Align IPsec ASO result memory to be as required by hardware + - selftest: fib_tests: Always cleanup before exit + - sefltests: netdevsim: wait for devlink instance after netns removal + - drm: Fix potential null-ptr-deref due to drmm_mode_config_init() + - drm/fourcc: Add missing big-endian XRGB1555 and RGB565 formats + - drm/bridge: ti-sn65dsi83: Fix delay after reset deassert to match spec + - drm: mxsfb: DRM_IMX_LCDIF should depend on ARCH_MXC + - drm: mxsfb: DRM_MXSFB should depend on ARCH_MXS || ARCH_MXC + - drm/bridge: megachips: Fix error handling in i2c_register_driver() + - drm/vkms: Fix memory leak in vkms_init() + - drm/vkms: Fix null-ptr-deref in vkms_release() + - drm/modes: Use strscpy() to copy command-line mode name + - drm/vc4: dpi: Fix format mapping for RGB565 + - drm/bridge: it6505: Guard bridge power in IRQ handler + - drm: tidss: Fix pixel format definition + - gpu: ipu-v3: common: Add of_node_put() for reference returned by + of_graph_get_port_by_id() + - drm/ast: Init iosys_map pointer as I/O memory for damage handling + - drm/vc4: drop all currently held locks if deadlock happens + - hwmon: (ftsteutates) Fix scaling of measurements + - drm/msm/dpu: check for null return of devm_kzalloc() in dpu_writeback_init() + - drm/msm/hdmi: Add missing check for alloc_ordered_workqueue + - pinctrl: qcom: pinctrl-msm8976: Correct function names for wcss pins + - pinctrl: stm32: Fix refcount leak in stm32_pctrl_get_irq_domain + - pinctrl: rockchip: Fix refcount leak in rockchip_pinctrl_parse_groups + - drm/vc4: hvs: Configure the HVS COB allocations + - drm/vc4: hvs: Set AXI panic modes + - drm/vc4: hvs: SCALER_DISPBKGND_AUTOHS is only valid on HVS4 + - drm/vc4: hvs: Correct interrupt masking bit assignment for HVS5 + - drm/vc4: hvs: Fix colour order for xRGB1555 on HVS5 + - drm/vc4: hdmi: Correct interlaced timings again + - drm/msm: clean event_thread->worker in case of an error + - drm/panel-edp: fix name for IVO product id 854b + - scsi: qla2xxx: Fix exchange oversubscription + - scsi: qla2xxx: Fix exchange oversubscription for management commands + - scsi: qla2xxx: edif: Fix clang warning + - ASoC: fsl_sai: initialize is_dsp_mode flag + - drm/bridge: tc358767: Set default CLRSIPO count + - drm/msm/adreno: Fix null ptr access in adreno_gpu_cleanup() + - ALSA: hda/ca0132: minor fix for allocation size + - drm/amdgpu: Use the sched from entity for amdgpu_cs trace + - drm/msm/gem: Add check for kmalloc + - drm/msm/dpu: Disallow unallocated resources to be returned + - drm/bridge: lt9611: fix sleep mode setup + - drm/bridge: lt9611: fix HPD reenablement + - drm/bridge: lt9611: fix polarity programming + - drm/bridge: lt9611: fix programming of video modes + - drm/bridge: lt9611: fix clock calculation + - drm/bridge: lt9611: pass a pointer to the of node + - regulator: tps65219: use IS_ERR() to detect an error pointer + - drm/mipi-dsi: Fix byte order of 16-bit DCS set/get brightness + - drm: exynos: dsi: Fix MIPI_DSI*_NO_* mode flags + - drm/msm/dsi: Allow 2 CTRLs on v2.5.0 + - scsi: ufs: exynos: Fix DMA alignment for PAGE_SIZE != 4096 + - drm/msm/dpu: sc7180: add missing WB2 clock control + - drm/msm: use strscpy instead of strncpy + - drm/msm/dpu: Add check for cstate + - drm/msm/dpu: Add check for pstates + - drm/msm/mdp5: Add check for kzalloc + - habanalabs: bugs fixes in timestamps buff alloc + - pinctrl: bcm2835: Remove of_node_put() in bcm2835_of_gpio_ranges_fallback() + - pinctrl: mediatek: Initialize variable pullen and pullup to zero + - pinctrl: mediatek: Initialize variable *buf to zero + - gpu: host1x: Fix mask for syncpoint increment register + - gpu: host1x: Don't skip assigning syncpoints to channels + - drm/tegra: firewall: Check for is_addr_reg existence in IMM check + - drm/i915/mtl: Add initial gt workarounds + - drm/i915/xehp: GAM registers don't need to be re-applied on engine resets + - pinctrl: renesas: rzg2l: Fix configuring the GPIO pins as interrupts + - drm/i915/xehp: Annotate a couple more workaround registers as MCR + - drm/msm/dpu: set pdpu->is_rt_pipe early in dpu_plane_sspp_atomic_update() + - drm/mediatek: dsi: Reduce the time of dsi from LP11 to sending cmd + - drm/mediatek: Use NULL instead of 0 for NULL pointer + - drm/mediatek: Drop unbalanced obj unref + - drm/mediatek: mtk_drm_crtc: Add checks for devm_kcalloc + - drm/mediatek: Clean dangling pointer on bind error path + - ASoC: soc-compress.c: fixup private_data on snd_soc_new_compress() + - dt-bindings: display: mediatek: Fix the fallback for mediatek,mt8186-disp- + ccorr + - gpio: pca9570: rename platform_data to chip_data + - gpio: vf610: connect GPIO label to dev name + - ASoC: topology: Properly access value coming from topology file + - spi: dw_bt1: fix MUX_MMIO dependencies + - ASoC: mchp-spdifrx: fix controls which rely on rsr register + - ASoC: mchp-spdifrx: fix return value in case completion times out + - ASoC: mchp-spdifrx: fix controls that works with completion mechanism + - ASoC: mchp-spdifrx: disable all interrupts in mchp_spdifrx_dai_remove() + - dm: improve shrinker debug names + - regmap: apply reg_base and reg_downshift for single register ops + - accel: fix CONFIG_DRM dependencies + - ASoC: rsnd: fixup #endif position + - ASoC: mchp-spdifrx: Fix uninitialized use of mr in mchp_spdifrx_hw_params() + - ASoC: dt-bindings: meson: fix gx-card codec node regex + - regulator: tps65219: use generic set_bypass() + - hwmon: (asus-ec-sensors) add missing mutex path + - hwmon: (ltc2945) Handle error case in ltc2945_value_store + - ALSA: hda: Fix the control element identification for multiple codecs + - drm/amdgpu: fix enum odm_combine_mode mismatch + - scsi: mpt3sas: Fix a memory leak + - scsi: aic94xx: Add missing check for dma_map_single() + - HID: multitouch: Add quirks for flipped axes + - HID: retain initial quirks set up when creating HID devices + - ASoC: qcom: q6apm-lpass-dai: unprepare stream if its already prepared + - ASoC: qcom: q6apm-dai: fix race condition while updating the position + pointer + - ASoC: qcom: q6apm-dai: Add SNDRV_PCM_INFO_BATCH flag + - ASoC: codecs: lpass: register mclk after runtime pm + - ASoC: codecs: lpass: fix incorrect mclk rate + - drm/amd/display: don't call dc_interrupt_set() for disabled crtcs + - HID: logitech-hidpp: Hard-code HID++ 1.0 fast scroll support + - spi: bcm63xx-hsspi: Fix multi-bit mode setting + - hwmon: (mlxreg-fan) Return zero speed for broken fan + - ASoC: tlv320adcx140: fix 'ti,gpio-config' DT property init + - dm: remove flush_scheduled_work() during local_exit() + - nfs4trace: fix state manager flag printing + - NFS: fix disabling of swap + - drm/i915/pvc: Implement recommended caching policy + - drm/i915/pvc: Annotate two more workaround/tuning registers as MCR + - drm/i915: Fix GEN8_MISCCPCTL + - spi: synquacer: Fix timeout handling in synquacer_spi_transfer_one() + - ASoC: soc-dapm.h: fixup warning struct snd_pcm_substream not declared + - HID: bigben: use spinlock to protect concurrent accesses + - HID: bigben_worker() remove unneeded check on report_field + - HID: bigben: use spinlock to safely schedule workers + - hid: bigben_probe(): validate report count + - ALSA: hda/hdmi: Register with vga_switcheroo on Dual GPU Macbooks + - drm/shmem-helper: Fix locking for drm_gem_shmem_get_pages_sgt() + - NFSD: enhance inter-server copy cleanup + - NFSD: fix leaked reference count of nfsd4_ssc_umount_item + - nfsd: fix race to check ls_layouts + - nfsd: clean up potential nfsd_file refcount leaks in COPY codepath + - NFSD: fix problems with cleanup on errors in nfsd4_copy + - nfsd: fix courtesy client with deny mode handling in nfs4_upgrade_open + - nfsd: don't fsync nfsd_files on last close + - NFSD: copy the whole verifier in nfsd_copy_write_verifier + - cifs: Fix lost destroy smbd connection when MR allocate failed + - cifs: Fix warning and UAF when destroy the MR list + - cifs: use tcon allocation functions even for dummy tcon + - gfs2: jdata writepage fix + - perf llvm: Fix inadvertent file creation + - leds: led-core: Fix refcount leak in of_led_get() + - leds: is31fl319x: Wrap mutex_destroy() for devm_add_action_or_rest() + - leds: simatic-ipc-leds-gpio: Make sure we have the GPIO providing driver + - tools/tracing/rtla: osnoise_hist: use total duration for average calculation + - perf inject: Use perf_data__read() for auxtrace + - perf intel-pt: Do not try to queue auxtrace data on pipe + - perf stat: Hide invalid uncore event output for aggr mode + - perf jevents: Correct bad character encoding + - perf test bpf: Skip test if kernel-debuginfo is not present + - perf tools: Fix auto-complete on aarch64 + - perf stat: Avoid merging/aggregating metric counts twice + - sparc: allow PM configs for sparc32 COMPILE_TEST + - selftests: find echo binary to use -ne options + - selftests/ftrace: Fix bash specific "==" operator + - selftests: use printf instead of echo -ne + - perf record: Fix segfault with --overwrite and --max-size + - printf: fix errname.c list + - perf tests stat_all_metrics: Change true workload to sleep workload for + system wide check + - objtool: add UACCESS exceptions for __tsan_volatile_read/write + - selftests/ftrace: Fix probepoint testcase to ignore __pfx_* symbols + - sysctl: fix proc_dobool() usability + - mfd: rk808: Re-add rk808-clkout to RK818 + - mfd: cs5535: Don't build on UML + - mfd: pcf50633-adc: Fix potential memleak in pcf50633_adc_async_read() + - dmaengine: idxd: Set traffic class values in GRPCFG on DSA 2.0 + - RDMA/erdma: Fix refcount leak in erdma_mmap + - dmaengine: HISI_DMA should depend on ARCH_HISI + - RDMA/hns: Fix refcount leak in hns_roce_mmap + - iio: light: tsl2563: Do not hardcode interrupt trigger type + - usb: gadget: fusb300_udc: free irq on the error path in fusb300_probe() + - i2c: designware: fix i2c_dw_clk_rate() return size to be u32 + - i2c: qcom-geni: change i2c_master_hub to static + - soundwire: cadence: Don't overflow the command FIFOs + - driver core: fix potential null-ptr-deref in device_add() + - kobject: Fix slab-out-of-bounds in fill_kobj_path() + - alpha/boot/tools/objstrip: fix the check for ELF header + - media: uvcvideo: Check for INACTIVE in uvc_ctrl_is_accessible() + - media: uvcvideo: Implement mask for V4L2_CTRL_TYPE_MENU + - media: uvcvideo: Refactor uvc_ctrl_mappings_uvcXX + - media: uvcvideo: Refactor power_line_frequency_controls_limited + - coresight: etm4x: Fix accesses to TRCSEQRSTEVR and TRCSEQSTR + - coresight: cti: Prevent negative values of enable count + - coresight: cti: Add PM runtime call in enable_store + - usb: typec: intel_pmc_mux: Don't leak the ACPI device reference count + - PCI/IOV: Enlarge virtfn sysfs name buffer + - PCI: switchtec: Return -EFAULT for copy_to_user() errors + - PCI: endpoint: pci-epf-vntb: Add epf_ntb_mw_bar_clear() num_mws kernel-doc + - hwtracing: hisi_ptt: Only add the supported devices to the filters list + - tty: serial: fsl_lpuart: disable Rx/Tx DMA in lpuart32_shutdown() + - tty: serial: fsl_lpuart: clear LPUART Status Register in lpuart32_shutdown() + - serial: tegra: Add missing clk_disable_unprepare() in tegra_uart_hw_init() + - Revert "char: pcmcia: cm4000_cs: Replace mdelay with usleep_range in + set_protocol" + - eeprom: idt_89hpesx: Fix error handling in idt_init() + - applicom: Fix PCI device refcount leak in applicom_init() + - firmware: stratix10-svc: add missing gen_pool_destroy() in + stratix10_svc_drv_probe() + - firmware: stratix10-svc: fix error handle while alloc/add device failed + - VMCI: check context->notify_page after call to get_user_pages_fast() to + avoid GPF + - mei: pxp: Use correct macros to initialize uuid_le + - misc/mei/hdcp: Use correct macros to initialize uuid_le + - misc: fastrpc: Fix an error handling path in fastrpc_rpmsg_probe() + - iommu/exynos: Fix error handling in exynos_iommu_init() + - driver core: fix resource leak in device_add() + - driver core: location: Free struct acpi_pld_info *pld before return false + - drivers: base: transport_class: fix possible memory leak + - drivers: base: transport_class: fix resource leak when + transport_add_device() fails + - firmware: dmi-sysfs: Fix null-ptr-deref in dmi_sysfs_register_handle + - selftests: iommu: Fix test_cmd_destroy_access() call in user_copy + - iommufd: Add three missing structures in ucmd_buffer + - fotg210-udc: Add missing completion handler + - dmaengine: dw-edma: Fix missing src/dst address of interleaved xfers + - fpga: microchip-spi: move SPI I/O buffers out of stack + - fpga: microchip-spi: rewrite status polling in a time measurable way + - usb: early: xhci-dbc: Fix a potential out-of-bound memory access + - tty: serial: fsl_lpuart: Fix the wrong RXWATER setting for rx dma case + - RDMA/cxgb4: add null-ptr-check after ip_dev_find() + - usb: musb: mediatek: don't unregister something that wasn't registered + - usb: gadget: configfs: Restrict symlink creation is UDC already binded + - phy: mediatek: remove temporary variable @mask_ + - PCI: mt7621: Delay phy ports initialization + - iommu/vt-d: Set No Execute Enable bit in PASID table entry + - power: supply: remove faulty cooling logic + - RDMA/siw: Fix user page pinning accounting + - RDMA/cxgb4: Fix potential null-ptr-deref in pass_establish() + - usb: max-3421: Fix setting of I/O pins + - RDMA/irdma: Cap MSIX used to online CPUs + 1 + - serial: fsl_lpuart: fix RS485 RTS polariy inverse issue + - tty: serial: imx: disable Ageing Timer interrupt request irq + - driver core: fw_devlink: Add DL_FLAG_CYCLE support to device links + - driver core: fw_devlink: Don't purge child fwnode's consumer links + - driver core: fw_devlink: Allow marking a fwnode link as being part of a + cycle + - driver core: fw_devlink: Consolidate device link flag computation + - driver core: fw_devlink: Improve check for fwnode with no device/driver + - driver core: fw_devlink: Make cycle detection more robust + - mtd: mtdpart: Don't create platform device that'll never probe + - usb: host: fsl-mph-dr-of: reuse device_set_of_node_from_dev + - dmaengine: dw-edma: Fix readq_ch() return value truncation + - PCI: Fix dropping valid root bus resources with .end = zero + - phy: rockchip-typec: fix tcphy_get_mode error case + - PCI: qcom: Fix host-init error handling + - iw_cxgb4: Fix potential NULL dereference in c4iw_fill_res_cm_id_entry() + - iommu: Fix error unwind in iommu_group_alloc() + - iommu/amd: Do not identity map v2 capable device when snp is enabled + - dmaengine: sf-pdma: pdma_desc memory leak fix + - dmaengine: dw-axi-dmac: Do not dereference NULL structure + - dmaengine: ptdma: check for null desc before calling pt_cmd_callback + - iommu/vt-d: Fix error handling in sva enable/disable paths + - iommu/vt-d: Allow to use flush-queue when first level is default + - RDMA/rxe: Cleanup mr_check_range + - RDMA/rxe: Move rxe_map_mr_sg to rxe_mr.c + - RDMA-rxe: Isolate mr code from atomic_reply() + - RDMA-rxe: Isolate mr code from atomic_write_reply() + - RDMA/rxe: Cleanup page variables in rxe_mr.c + - RDMA/rxe: Replace rxe_map and rxe_phys_buf by xarray + - Subject: RDMA/rxe: Handle zero length rdma + - RDMA/mana_ib: Fix a bug when the PF indicates more entries for registering + memory on first packet + - RDMA/rxe: Fix missing memory barriers in rxe_queue.h + - IB/hfi1: Fix math bugs in hfi1_can_pin_pages() + - IB/hfi1: Fix sdma.h tx->num_descs off-by-one errors + - Revert "remoteproc: qcom_q6v5_mss: map/unmap metadata region before/after + use" + - remoteproc: qcom_q6v5_mss: Use a carveout to authenticate modem headers + - media: ti: cal: fix possible memory leak in cal_ctx_create() + - media: platform: ti: Add missing check for devm_regulator_get + - media: imx: imx7-media-csi: fix missing clk_disable_unprepare() in + imx7_csi_init() + - powerpc: Remove linker flag from KBUILD_AFLAGS + - s390/vdso: Drop '-shared' from KBUILD_CFLAGS_64 + - builddeb: clean generated package content + - media: max9286: Fix memleak in max9286_v4l2_register() + - media: ov2740: Fix memleak in ov2740_init_controls() + - media: ov5675: Fix memleak in ov5675_init_controls() + - media: i2c: tc358746: fix missing return assignment + - media: i2c: tc358746: fix ignoring read error in g_register callback + - media: i2c: tc358746: fix possible endianness issue + - media: ov5640: Fix soft reset sequence and timings + - media: ov5640: Handle delays when no reset_gpio set + - media: mc: Get media_device directly from pad + - media: i2c: ov772x: Fix memleak in ov772x_probe() + - media: i2c: imx219: Split common registers from mode tables + - media: i2c: imx219: Fix binning for RAW8 capture + - media: platform: mtk-mdp3: Fix return value check in mdp_probe() + - media: camss: csiphy-3ph: avoid undefined behavior + - media: platform: mtk-mdp3: fix Kconfig dependencies + - media: v4l2-jpeg: correct the skip count in jpeg_parse_app14_data + - media: v4l2-jpeg: ignore the unknown APP14 marker + - media: hantro: Fix JPEG encoder ENUM_FRMSIZE on RK3399 + - media: imx-jpeg: Apply clk_bulk api instead of operating specific clk + - media: amphion: correct the unspecified color space + - media: drivers/media/v4l2-core/v4l2-h264 : add detection of null pointers + - media: rc: Fix use-after-free bugs caused by ene_tx_irqsim() + - media: atomisp: fix videobuf2 Kconfig depenendency + - media: atomisp: Only set default_run_mode on first open of a stream/asd + - media: i2c: ov7670: 0 instead of -EINVAL was returned + - media: usb: siano: Fix use after free bugs caused by do_submit_urb + - media: saa7134: Use video_unregister_device for radio_dev + - rpmsg: glink: Avoid infinite loop on intent for missing channel + - rpmsg: glink: Release driver_override + - ARM: OMAP2+: omap4-common: Fix refcount leak bug + - arm64: dts: qcom: msm8996: Add additional A2NoC clocks + - udf: Define EFSCORRUPTED error code + - context_tracking: Fix noinstr vs KASAN + - exit: Detect and fix irq disabled state in oops + - ARM: dts: exynos: Use Exynos5420 compatible for the MIPI video phy + - fs: Use CHECK_DATA_CORRUPTION() when kernel bugs are detected + - blk-iocost: fix divide by 0 error in calc_lcoefs() + - blk-cgroup: dropping parent refcount after pd_free_fn() is done + - blk-cgroup: synchronize pd_free_fn() from blkg_free_workfn() and + blkcg_deactivate_policy() + - trace/blktrace: fix memory leak with using debugfs_lookup() + - btrfs: scrub: improve tree block error reporting + - arm64: zynqmp: Enable hs termination flag for USB dwc3 controller + - cpuidle, intel_idle: Fix CPUIDLE_FLAG_INIT_XSTATE + - x86/fpu: Don't set TIF_NEED_FPU_LOAD for PF_IO_WORKER threads + - cpuidle: drivers: firmware: psci: Dont instrument suspend code + - cpuidle: lib/bug: Disable rcu_is_watching() during WARN/BUG + - perf/x86/intel/uncore: Add Meteor Lake support + - wifi: ath9k: Fix use-after-free in ath9k_hif_usb_disconnect() + - wifi: ath11k: fix monitor mode bringup crash + - wifi: brcmfmac: Fix potential stack-out-of-bounds in brcmf_c_preinit_dcmds() + - rcu: Make RCU_LOCKDEP_WARN() avoid early lockdep checks + - rcu: Suppress smp_processor_id() complaint in + synchronize_rcu_expedited_wait() + - srcu: Delegate work to the boot cpu if using SRCU_SIZE_SMALL + - rcu-tasks: Make rude RCU-Tasks work well with CPU hotplug + - rcu-tasks: Handle queue-shrink/callback-enqueue race condition + - wifi: ath11k: debugfs: fix to work with multiple PCI devices + - thermal: intel: Fix unsigned comparison with less than zero + - timers: Prevent union confusion from unexpected restart_syscall() + - x86/bugs: Reset speculation control settings on init + - bpftool: Always disable stack protection for BPF objects + - wifi: brcmfmac: ensure CLM version is null-terminated to prevent stack-out- + of-bounds + - wifi: rtw89: fix assignation of TX BD RAM table + - wifi: mt7601u: fix an integer underflow + - inet: fix fast path in __inet_hash_connect() + - ice: restrict PTP HW clock freq adjustments to 100, 000, 000 PPB + - ice: add missing checks for PF vsi type + - Compiler attributes: GCC cold function alignment workarounds + - ACPI: Don't build ACPICA with '-Os' + - bpf, docs: Fix modulo zero, division by zero, overflow, and underflow + - thermal: intel: intel_pch: Add support for Wellsburg PCH + - clocksource: Suspend the watchdog temporarily when high read latency + detected + - crypto: hisilicon: Wipe entire pool on error + - net: bcmgenet: Add a check for oversized packets + - m68k: Check syscall_trace_enter() return code + - s390/mm,ptdump: avoid Kasan vs Memcpy Real markers swapping + - netfilter: nf_tables: NULL pointer dereference in nf_tables_updobj() + - can: isotp: check CAN address family in isotp_bind() + - gcc-plugins: drop -std=gnu++11 to fix GCC 13 build + - tools/power/x86/intel-speed-select: Add Emerald Rapid quirk + - platform/x86: dell-ddv: Add support for interface version 3 + - wifi: mt76: dma: free rx_head in mt76_dma_rx_cleanup + - ACPI: video: Fix Lenovo Ideapad Z570 DMI match + - net/mlx5: fw_tracer: Fix debug print + - coda: Avoid partial allocation of sig_inputArgs + - uaccess: Add minimum bounds check on kernel buffer size + - s390/idle: mark arch_cpu_idle() noinstr + - time/debug: Fix memory leak with using debugfs_lookup() + - PM: domains: fix memory leak with using debugfs_lookup() + - PM: EM: fix memory leak with using debugfs_lookup() + - Bluetooth: Fix issue with Actions Semi ATS2851 based devices + - Bluetooth: btusb: Add new PID/VID 0489:e0f2 for MT7921 + - Bluetooth: btusb: Add VID:PID 13d3:3529 for Realtek RTL8821CE + - wifi: rtw89: debug: avoid invalid access on RTW89_DBG_SEL_MAC_30 + - hv_netvsc: Check status in SEND_RNDIS_PKT completion message + - s390/kfence: fix page fault reporting + - devlink: Fix TP_STRUCT_entry in trace of devlink health report + - scm: add user copy checks to put_cmsg() + - drm: panel-orientation-quirks: Add quirk for Lenovo Yoga Tab 3 X90F + - drm: panel-orientation-quirks: Add quirk for DynaBook K50 + - drm/amd/display: Reduce expected sdp bandwidth for dcn321 + - drm/amd/display: Revert Reduce delay when sink device not able to ACK 00340h + write + - drm/amd/display: Fix potential null-deref in dm_resume + - drm/omap: dsi: Fix excessive stack usage + - HID: Add Mapping for System Microphone Mute + - drm/tiny: ili9486: Do not assume 8-bit only SPI controllers + - drm/amd/display: Defer DIG FIFO disable after VID stream enable + - drm/radeon: free iio for atombios when driver shutdown + - drm/amd: Avoid BUG() for case of SRIOV missing IP version + - drm/amdkfd: Page aligned memory reserve size + - scsi: lpfc: Fix use-after-free KFENCE violation during sysfs firmware write + - Revert "fbcon: don't lose the console font across generic->chip driver + switch" + - drm/amd: Avoid ASSERT for some message failures + - drm: amd: display: Fix memory leakage + - drm/amd/display: fix mapping to non-allocated address + - HID: uclogic: Add frame type quirk + - HID: uclogic: Add battery quirk + - HID: uclogic: Add support for XP-PEN Deco Pro SW + - HID: uclogic: Add support for XP-PEN Deco Pro MW + - drm/msm/dsi: Add missing check for alloc_ordered_workqueue + - drm: rcar-du: Add quirk for H3 ES1.x pclk workaround + - drm: rcar-du: Fix setting a reserved bit in DPLLCR + - drm/drm_print: correct format problem + - drm/amd/display: Set hvm_enabled flag for S/G mode + - drm/client: Test for connectors before sending hotplug event + - habanalabs: extend fatal messages to contain PCI info + - habanalabs: fix bug in timestamps registration code + - docs/scripts/gdb: add necessary make scripts_gdb step + - drm/msm/dpu: Add DSC hardware blocks to register snapshot + - ASoC: soc-compress: Reposition and add pcm_mutex + - ASoC: kirkwood: Iterate over array indexes instead of using pointer math + - regulator: max77802: Bounds check regulator id against opmode + - regulator: s5m8767: Bounds check id indexing into arrays + - Revert "drm/amdgpu: TA unload messages are not actually sent to psp when + amdgpu is uninstalled" + - drm/amd/display: fix FCLK pstate change underflow + - gfs2: Improve gfs2_make_fs_rw error handling + - hwmon: (coretemp) Simplify platform device handling + - hwmon: (nct6775) Directly call ASUS ACPI WMI method + - hwmon: (nct6775) B650/B660/X670 ASUS boards support + - pinctrl: at91: use devm_kasprintf() to avoid potential leaks + - drm/amd/display: Do not commit pipe when updating DRR + - scsi: snic: Fix memory leak with using debugfs_lookup() + - scsi: ufs: core: Fix device management cmd timeout flow + - HID: logitech-hidpp: Don't restart communication if not necessary + - drm/amd/display: Enable P-state validation checks for DCN314 + - drm: panel-orientation-quirks: Add quirk for Lenovo IdeaPad Duet 3 10IGL5 + - drm/amd/display: Disable HUBP/DPP PG on DCN314 for now + - drm/amd/display: disable SubVP + DRR to prevent underflow + - dm thin: add cond_resched() to various workqueue loops + - dm cache: add cond_resched() to various workqueue loops + - nfsd: zero out pointers after putting nfsd_files on COPY setup error + - nfsd: don't hand out delegation on setuid files being opened for write + - cifs: prevent data race in smb2_reconnect() + - drm/i915/mtl: Correct implementation of Wa_18018781329 + - drm/shmem-helper: Revert accidental non-GPL export + - driver core: fw_devlink: Avoid spurious error message + - wifi: rtl8xxxu: fixing transmisison failure for rtl8192eu + - firmware: coreboot: framebuffer: Ignore reserved pixel color bits + - block: don't allow multiple bios for IOCB_NOWAIT issue + - block: clear bio->bi_bdev when putting a bio back in the cache + - block: be a bit more careful in checking for NULL bdev while polling + - rtc: pm8xxx: fix set-alarm race + - ipmi: ipmb: Fix the MODULE_PARM_DESC associated to 'retry_time_ms' + - ipmi:ssif: resend_msg() cannot fail + - ipmi_ssif: Rename idle state and check + - ipmi:ssif: Add a timer between request retries + - io_uring: Replace 0-length array with flexible array + - io_uring: use user visible tail in io_uring_poll() + - io_uring: handle TIF_NOTIFY_RESUME when checking for task_work + - io_uring: add a conditional reschedule to the IOPOLL cancelation loop + - io_uring: add reschedule point to handle_tw_list() + - io_uring/rsrc: disallow multi-source reg buffers + - io_uring: remove MSG_NOSIGNAL from recvmsg + - io_uring/poll: allow some retries for poll triggering spuriously + - io_uring: fix fget leak when fs don't support nowait buffered read + - s390/extmem: return correct segment type in __segment_load() + - s390: discard .interp section + - s390/kprobes: fix irq mask clobbering on kprobe reenter from post_handler + - s390/kprobes: fix current_kprobe never cleared after kprobes reenter + - KVM: s390: disable migration mode when dirty tracking is disabled + - cifs: improve checking of DFS links over STATUS_OBJECT_NAME_INVALID + - cifs: Fix uninitialized memory read in smb3_qfs_tcon() + - cifs: Fix uninitialized memory reads for oparms.mode + - cifs: fix mount on old smb servers + - cifs: introduce cifs_io_parms in smb2_async_writev() + - cifs: split out smb3_use_rdma_offload() helper + - cifs: don't try to use rdma offload on encrypted connections + - cifs: Check the lease context if we actually got a lease + - cifs: return a single-use cfid if we did not get a lease + - scsi: mpi3mr: Fix missing mrioc->evtack_cmds initialization + - scsi: mpi3mr: Fix issues in mpi3mr_get_all_tgt_info() + - scsi: mpi3mr: Remove unnecessary memcpy() to alltgt_info->dmi + - btrfs: hold block group refcount during async discard + - btrfs: sysfs: update fs features directory asynchronously + - locking/rwsem: Prevent non-first waiter from spinning in down_write() + slowpath + - ksmbd: fix wrong data area length for smb2 lock request + - ksmbd: do not allow the actual frame length to be smaller than the rfc1002 + length + - ksmbd: fix possible memory leak in smb2_lock() + - torture: Fix hang during kthread shutdown phase + - ARM: dts: exynos: correct HDMI phy compatible in Exynos4 + - io_uring: mark task TASK_RUNNING before handling resume/task work + - hfs: fix missing hfs_bnode_get() in __hfs_bnode_create + - fs: hfsplus: fix UAF issue in hfsplus_put_super + - exfat: fix reporting fs error when reading dir beyond EOF + - exfat: fix unexpected EOF while reading dir + - exfat: redefine DIR_DELETED as the bad cluster number + - exfat: fix inode->i_blocks for non-512 byte sector size device + - fs: dlm: start midcomms before scand + - fs: dlm: fix use after free in midcomms commit + - fs: dlm: be sure to call dlm_send_queue_flush() + - fs: dlm: fix race setting stop tx flag + - fs: dlm: don't set stop rx flag after node reset + - fs: dlm: move sending fin message into state change handling + - fs: dlm: send FIN ack back in right cases + - f2fs: fix information leak in f2fs_move_inline_dirents() + - f2fs: retry to update the inode page given data corruption + - f2fs: fix cgroup writeback accounting with fs-layer encryption + - f2fs: fix kernel crash due to null io->bio + - f2fs: Revert "f2fs: truncate blocks in batch in __complete_revoke_list()" + - ocfs2: fix defrag path triggering jbd2 ASSERT + - ocfs2: fix non-auto defrag path not working issue + - fs/cramfs/inode.c: initialize file_ra_state + - selftests/landlock: Skip overlayfs tests when not supported + - selftests/landlock: Test ptrace as much as possible with Yama + - udf: Truncate added extents on failed expansion + - udf: Do not bother merging very long extents + - udf: Do not update file length for failed writes to inline files + - udf: Preserve link count of system files + - udf: Detect system inodes linked into directory hierarchy + - udf: Fix file corruption when appending just after end of preallocated + extent + - md: don't update recovery_cp when curr_resync is ACTIVE + - KVM: Destroy target device if coalesced MMIO unregistration fails + - KVM: VMX: Fix crash due to uninitialized current_vmcs + - KVM: Register /dev/kvm as the _very_ last thing during initialization + - KVM: x86: Purge "highest ISR" cache when updating APICv state + - KVM: x86: Blindly get current x2APIC reg value on "nodecode write" traps + - KVM: x86: Don't inhibit APICv/AVIC on xAPIC ID "change" if APIC is disabled + - KVM: x86: Don't inhibit APICv/AVIC if xAPIC ID mismatch is due to 32-bit ID + - KVM: SVM: Flush the "current" TLB when activating AVIC + - KVM: SVM: Process ICR on AVIC IPI delivery failure due to invalid target + - KVM: SVM: Don't put/load AVIC when setting virtual APIC mode + - KVM: x86: Inject #GP if WRMSR sets reserved bits in APIC Self-IPI + - KVM: x86: Inject #GP on x2APIC WRMSR that sets reserved bits 63:32 + - KVM: SVM: Fix potential overflow in SEV's send|receive_update_data() + - KVM: SVM: hyper-v: placate modpost section mismatch error + - selftests: x86: Fix incorrect kernel headers search path + - x86/virt: Force GIF=1 prior to disabling SVM (for reboot flows) + - x86/crash: Disable virt in core NMI crash handler to avoid double shootdown + - x86/reboot: Disable virtualization in an emergency if SVM is supported + - x86/reboot: Disable SVM, not just VMX, when stopping CPUs + - x86/kprobes: Fix __recover_optprobed_insn check optimizing logic + - x86/kprobes: Fix arch_check_optimized_kprobe check within optimized_kprobe + range + - x86/microcode/amd: Remove load_microcode_amd()'s bsp parameter + - x86/microcode/AMD: Add a @cpu parameter to the reloading functions + - x86/microcode/AMD: Fix mixed steppings support + - x86/speculation: Allow enabling STIBP with legacy IBRS + - Documentation/hw-vuln: Document the interaction between IBRS and STIBP + - virt/sev-guest: Return -EIO if certificate buffer is not large enough + - brd: mark as nowait compatible + - brd: return 0/-error from brd_insert_page() + - brd: check for REQ_NOWAIT and set correct page allocation mask + - ima: fix error handling logic when file measurement failed + - ima: Align ima_file_mmap() parameters with mmap_file LSM hook + - selftests/powerpc: Fix incorrect kernel headers search path + - selftests/ftrace: Fix eprobe syntax test case to check filter support + - selftests: sched: Fix incorrect kernel headers search path + - selftests: core: Fix incorrect kernel headers search path + - selftests: pid_namespace: Fix incorrect kernel headers search path + - selftests: arm64: Fix incorrect kernel headers search path + - selftests: clone3: Fix incorrect kernel headers search path + - selftests: pidfd: Fix incorrect kernel headers search path + - selftests: membarrier: Fix incorrect kernel headers search path + - selftests: kcmp: Fix incorrect kernel headers search path + - selftests: media_tests: Fix incorrect kernel headers search path + - selftests: gpio: Fix incorrect kernel headers search path + - selftests: filesystems: Fix incorrect kernel headers search path + - selftests: user_events: Fix incorrect kernel headers search path + - selftests: ptp: Fix incorrect kernel headers search path + - selftests: sync: Fix incorrect kernel headers search path + - selftests: rseq: Fix incorrect kernel headers search path + - selftests: move_mount_set_group: Fix incorrect kernel headers search path + - selftests: mount_setattr: Fix incorrect kernel headers search path + - selftests: perf_events: Fix incorrect kernel headers search path + - selftests: ipc: Fix incorrect kernel headers search path + - selftests: futex: Fix incorrect kernel headers search path + - selftests: drivers: Fix incorrect kernel headers search path + - selftests: dmabuf-heaps: Fix incorrect kernel headers search path + - selftests: vm: Fix incorrect kernel headers search path + - selftests: seccomp: Fix incorrect kernel headers search path + - irqdomain: Fix association race + - irqdomain: Fix disassociation race + - irqdomain: Look for existing mapping only once + - irqdomain: Drop bogus fwspec-mapping error handling + - irqdomain: Refactor __irq_domain_alloc_irqs() + - irqdomain: Fix mapping-creation race + - irqdomain: Fix domain registration race + - crypto: qat - fix out-of-bounds read + - mm/damon/paddr: fix missing folio_put() + - ALSA: ice1712: Do not left ice->gpio_mutex locked in aureon_add_controls() + - ALSA: hda/realtek: Add quirk for HP EliteDesk 800 G6 Tower PC + - jbd2: fix data missing when reusing bh which is ready to be checkpointed + - ext4: optimize ea_inode block expansion + - ext4: refuse to create ea block when umounted + - cxl/pmem: Fix nvdimm registration races + - Input: exc3000 - properly stop timer on shutdown + - mtd: spi-nor: sfdp: Fix index value for SCCR dwords + - mtd: spi-nor: spansion: Consider reserved bits in CFR5 register + - dm: send just one event on resize, not two + - dm: add cond_resched() to dm_wq_work() + - dm: add cond_resched() to dm_wq_requeue_work() + - wifi: rtw88: use RTW_FLAG_POWERON flag to prevent to power on/off twice + - wifi: rtl8xxxu: Use a longer retry limit of 48 + - wifi: ath11k: allow system suspend to survive ath11k + - wifi: cfg80211: Fix use after free for wext + - wifi: cfg80211: Set SSID if it is not already set + - cpuidle: add ARCH_SUSPEND_POSSIBLE dependencies + - qede: fix interrupt coalescing configuration + - thermal: intel: powerclamp: Fix cur_state for multi package system + - dm flakey: fix logic when corrupting a bio + - dm cache: free background tracker's queued work in btracker_destroy + - dm flakey: don't corrupt the zero page + - dm flakey: fix a bug with 32-bit highmem systems + - hwmon: (peci/cputemp) Fix off-by-one in coretemp_label allocation + - hwmon: (nct6775) Fix incorrect parenthesization in nct6775_write_fan_div() + - spi: intel: Check number of chip selects after reading the descriptor + - ARM: dts: qcom: sdx65: Add Qcom SMMU-500 as the fallback for IOMMU node + - ARM: dts: qcom: sdx55: Add Qcom SMMU-500 as the fallback for IOMMU node + - ARM: dts: exynos: correct TMU phandle in Exynos4210 + - ARM: dts: exynos: correct TMU phandle in Exynos4 + - ARM: dts: exynos: correct TMU phandle in Odroid XU3 family + - ARM: dts: exynos: correct TMU phandle in Exynos5250 + - ARM: dts: exynos: correct TMU phandle in Odroid XU + - ARM: dts: exynos: correct TMU phandle in Odroid HC1 + - arm64: acpi: Fix possible memory leak of ffh_ctxt + - arm64: mm: hugetlb: Disable HUGETLB_PAGE_OPTIMIZE_VMEMMAP + - arm64: Reset KASAN tag in copy_highpage with HW tags only + - fuse: add inode/permission checks to fileattr_get/fileattr_set + - rbd: avoid use-after-free in do_rbd_add() when rbd_dev_create() fails + - ceph: update the time stamps and try to drop the suid/sgid + - regulator: core: Use ktime_get_boottime() to determine how long a regulator + was off + - panic: fix the panic_print NMI backtrace setting + - mm/hwpoison: convert TTU_IGNORE_HWPOISON to TTU_HWPOISON + - genirq/msi, platform-msi: Ensure that MSI descriptors are unreferenced + - genirq/msi: Take the per-device MSI lock before validating the control + structure + - spi: spi-sn-f-ospi: fix duplicate flag while assigning to mode_bits + - alpha: fix FEN fault handling + - dax/kmem: Fix leak of memory-hotplug resources + - mips: fix syscall_get_nr + - media: ipu3-cio2: Fix PM runtime usage_count in driver unbind + - remoteproc/mtk_scp: Move clk ops outside send_lock + - vfio: Fix NULL pointer dereference caused by uninitialized group->iommufd + - docs: gdbmacros: print newest record + - mm: memcontrol: deprecate charge moving + - mm/thp: check and bail out if page in deferred queue already + - ktest.pl: Give back console on Ctrt^C on monitor + - kprobes: Fix to handle forcibly unoptimized kprobes on freeing_list + - ktest.pl: Fix missing "end_monitor" when machine check fails + - ktest.pl: Add RUN_TIMEOUT option with default unlimited + - memory tier: release the new_memtier in find_create_memory_tier() + - ring-buffer: Handle race between rb_move_tail and rb_check_pages + - tools/bootconfig: fix single & used for logical condition + - tracing/eprobe: Fix to add filter on eprobe description in README file + - iommu/amd: Add a length limitation for the ivrs_acpihid command-line + parameter + - scsi: aacraid: Allocate cmd_priv with scsicmd + - scsi: qla2xxx: Fix link failure in NPIV environment + - scsi: qla2xxx: Check if port is online before sending ELS + - scsi: qla2xxx: Fix DMA-API call trace on NVMe LS requests + - scsi: qla2xxx: Remove unintended flag clearing + - scsi: qla2xxx: Fix erroneous link down + - scsi: qla2xxx: Remove increment of interface err cnt + - scsi: ses: Don't attach if enclosure has no components + - scsi: ses: Fix slab-out-of-bounds in ses_enclosure_data_process() + - scsi: ses: Fix possible addl_desc_ptr out-of-bounds accesses + - scsi: ses: Fix possible desc_ptr out-of-bounds accesses + - scsi: ses: Fix slab-out-of-bounds in ses_intf_remove() + - RISC-V: add a spin_shadow_stack declaration + - riscv: Avoid enabling interrupts in die() + - riscv: mm: fix regression due to update_mmu_cache change + - riscv: jump_label: Fixup unaligned arch_static_branch function + - riscv: ftrace: Fixup panic by disabling preemption + - riscv, mm: Perform BPF exhandler fixup on page fault + - riscv: ftrace: Remove wasted nops for !RISCV_ISA_C + - riscv: ftrace: Reduce the detour code size to half + - MIPS: DTS: CI20: fix otg power gpio + - PCI/PM: Observe reset delay irrespective of bridge_d3 + - PCI: Unify delay handling for reset and resume + - PCI: hotplug: Allow marking devices as disconnected during bind/unbind + - PCI: Avoid FLR for AMD FCH AHCI adapters + - PCI/DPC: Await readiness of secondary bus after reset + - bus: mhi: ep: Only send -ENOTCONN status if client driver is available + - bus: mhi: ep: Move chan->lock to the start of processing queued ch ring + - bus: mhi: ep: Save channel state locally during suspend and resume + - iommufd: Make sure to zero vfio_iommu_type1_info before copying to user + - iommufd: Do not add the same hwpt to the ioas->hwpt_list twice + - iommu/vt-d: Avoid superfluous IOTLB tracking in lazy mode + - iommu/vt-d: Fix PASID directory pointer coherency + - vfio/type1: exclude mdevs from VFIO_UPDATE_VADDR + - vfio/type1: prevent underflow of locked_vm via exec() + - vfio/type1: track locked_vm per dma + - vfio/type1: restore locked_vm + - drm/amd: Fix initialization for nbio 7.5.1 + - drm/i915/quirks: Add inverted backlight quirk for HP 14-r206nv + - drm/radeon: Fix eDP for single-display iMac11,2 + - drm/i915: Don't use stolen memory for ring buffers with LLC + - drm/i915: Don't use BAR mappings for ring buffers with LLC + - drm/gud: Fix UBSAN warning + - drm/edid: fix AVI infoframe aspect ratio handling + - drm/edid: fix parsing of 3D modes from HDMI VSDB + - qede: avoid uninitialized entries in coal_entry array + - brd: use radix_tree_maybe_preload instead of radix_tree_preload + - net: avoid double iput when sock_alloc_file fails + - Linux 6.2.3 + + * Miscellaneous Ubuntu changes + - [Config] update annotations after applying 6.2.3 stable patches + - [Config] update annotations after applying 6.2.6 stable patches + + -- Andrea Righi Tue, 14 Mar 2023 16:43:44 +0100 + +linux (6.2.0-16.16) lunar; urgency=medium + + * lunar/linux: 6.2.0-16.16 -proposed tracker (LP: #2009914) + + * linux-libc-dev is no longer multi-arch safe (LP: #2009355) + - Revert "UBUNTU: [Packaging] install headers to debian/linux-libc-dev + directly" + + * linux: CONFIG_SERIAL_8250_MID=y (LP: #2009283) + - [Config] enable CONFIG_SERIAL_8250_MID=y + + * cpufreq: intel_pstate: Update Balance performance EPP for Sapphire Rapids + (LP: #2008519) + - cpufreq: intel_pstate: Adjust balance_performance EPP for Sapphire Rapids + + -- Andrea Righi Fri, 10 Mar 2023 18:34:28 +0100 + +linux (6.2.0-15.15) lunar; urgency=medium + + * Miscellaneous Ubuntu changes + - [Packaging] annotations: document annotations headers + + -- Andrea Righi Fri, 10 Mar 2023 07:36:59 +0100 + +linux (6.2.0-14.14) lunar; urgency=medium + + * lunar/linux: 6.2.0-14.14 -proposed tracker (LP: #2009856) + + * Miscellaneous Ubuntu changes + - [Packaging] rust: add rust build dependencies to all arches + - [Packaging] Support skipped dkms modules + - [Packaging] actually enforce set -e in dkms-build--nvidia-N + - [Packaging] Preserve the correct log file variable value + - [Packaging] update getabis + + -- Andrea Righi Thu, 09 Mar 2023 16:40:36 +0100 + +linux (6.2.0-13.13) lunar; urgency=medium + + * lunar/linux: 6.2.0-13.13 -proposed tracker (LP: #2009704) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + + * mt7921: add support of MTFG table (LP: #2009642) + - wifi: mt76: mt7921: add support to update fw capability with MTFG table + + -- Andrea Righi Wed, 08 Mar 2023 14:40:25 +0100 + +linux (6.2.0-12.12) lunar; urgency=medium + + * lunar/linux: 6.2.0-12.12 -proposed tracker (LP: #2009698) + + * Miscellaneous Ubuntu changes + - SAUCE: enforce rust availability only on x86_64 + - [Config] update CONFIG_RUST_IS_AVAILABLE + + -- Andrea Righi Wed, 08 Mar 2023 12:50:15 +0100 + +linux (6.2.0-11.11) lunar; urgency=medium + + * lunar/linux: 6.2.0-11.11 -proposed tracker (LP: #2009697) + + * Miscellaneous Ubuntu changes + - [Packaging] do not stop the build if rust is not available + + -- Andrea Righi Wed, 08 Mar 2023 12:24:55 +0100 + +linux (6.2.0-10.10) lunar; urgency=medium + + * lunar/linux: 6.2.0-10.10 -proposed tracker (LP: #2009673) + + * Packaging resync (LP: #1786013) + - debian/dkms-versions -- update from kernel-versions (main/master) + + * enable Rust support in the kernel (LP: #2007654) + - [Packaging] propagate makefile variables to kernelconfig + - SAUCE: rust: fix regexp in scripts/is_rust_module.sh + - SAUCE: scripts: rust: drop is_rust_module.sh + - SAUCE: rust: allow to use INIT_STACK_ALL_ZERO + - SAUCE: scripts: Exclude Rust CUs with pahole + - SAUCE: modpost: support arbitrary symbol length in modversion + - SAUCE: allows to enable Rust with modversions + - SAUCE: rust: properly detect the version of libclang used by bindgen + - [Packaging] rust: add the proper make flags to enable rust support + - [Packaging] add rust dependencies + - [Packaging] bpftool: always use vmlinux to generate headers + - [Packaging] run rustavailable target as debugging before build + - [Config] enable Rust support + + * Fail to output sound to external monitor which connects via docking station + (LP: #2009024) + - [Config] Enable CONFIG_SND_HDA_INTEL_HDMI_SILENT_STREAM + + * Miscellaneous Ubuntu changes + - SAUCE: Makefile: replace rsync with tar + + -- Andrea Righi Wed, 08 Mar 2023 12:01:56 +0100 + +linux (6.2.0-1.1) lunar; urgency=medium + + * lunar/linux: 6.2.0-1.1 -proposed tracker (LP: #2009621) + + * Packaging resync (LP: #1786013) + - [Packaging] update variants + - debian/dkms-versions -- update from kernel-versions (main/master) + + * kinetic: apply new apparmor and LSM stacking patch set (LP: #1989983) + - SAUCE: apparmor: Add fine grained mediation of posix mqueues + - SAUCE: apparmor: add user namespace creation mediation + + * Lunar update: v6.2.2 upstream stable release (LP: #2009358) + - ALSA: hda: cs35l41: Correct error condition handling + - crypto: arm64/sm4-gcm - Fix possible crash in GCM cryption + - bpf: bpf_fib_lookup should not return neigh in NUD_FAILED state + - vc_screen: don't clobber return value in vcs_read + - drm/amd/display: Move DCN314 DOMAIN power control to DMCUB + - drm/amd/display: Properly reuse completion structure + - scripts/tags.sh: fix incompatibility with PCRE2 + - wifi: rtw88: usb: Set qsel correctly + - wifi: rtw88: usb: send Zero length packets if necessary + - wifi: rtw88: usb: drop now unnecessary URB size check + - usb: dwc3: pci: add support for the Intel Meteor Lake-M + - USB: serial: option: add support for VW/Skoda "Carstick LTE" + - usb: gadget: u_serial: Add null pointer check in gserial_resume + - arm64: dts: uniphier: Fix property name in PXs3 USB node + - usb: typec: pd: Remove usb_suspend_supported sysfs from sink PDO + - USB: core: Don't hold device lock while reading the "descriptors" sysfs file + - Linux 6.2.2 + + * Lunar update: v6.2.1 upstream stable release (LP: #2009127) + - uaccess: Add speculation barrier to copy_from_user() + - x86/alternatives: Introduce int3_emulate_jcc() + - x86/alternatives: Teach text_poke_bp() to patch Jcc.d32 instructions + - x86/static_call: Add support for Jcc tail-calls + - HID: mcp-2221: prevent UAF in delayed work + - wifi: mwifiex: Add missing compatible string for SD8787 + - audit: update the mailing list in MAINTAINERS + - platform/x86/amd/pmf: Add depends on CONFIG_POWER_SUPPLY + - platform/x86: nvidia-wmi-ec-backlight: Add force module parameter + - ext4: Fix function prototype mismatch for ext4_feat_ktype + - randstruct: disable Clang 15 support + - bpf: add missing header file include + - Linux 6.2.1 + + * Fix mediatek wifi driver crash when loading wrong SAR table (LP: #2009118) + - wifi: mt76: mt7921: fix error code of return in mt7921_acpi_read + + * overlayfs mounts as R/O over idmapped mount (LP: #2009065) + - SAUCE: overlayfs: handle idmapped mounts in ovl_do_(set|remove)xattr + + * RaptorLake: Fix the Screen is shaking by onboard HDMI port in mirror mode + (LP: #1993561) + - drm/i915/display: Drop check for doublescan mode in modevalid + - drm/i915/display: Prune Interlace modes for Display >=12 + + * screen flicker after PSR2 enabled (LP: #2007516) + - SAUCE: drm/i915/display/psr: Disable PSR2 sel fetch on panel SHP 5457 + + * [23.04 FEAT] Support for new IBM Z Hardware (IBM z16) - Reset DAT-Protection + facility support (LP: #1982378) + - s390/mm: add support for RDP (Reset DAT-Protection) + + * [23.04 FEAT] zcrypt DD: AP command filtering (LP: #2003637) + - s390/zcrypt: introduce ctfm field in struct CPRBX + + * rtcpie in timers from ubuntu_kernel_selftests randomly failing + (LP: #1814234) + - SAUCE: selftest: rtcpie: Force passing unreliable subtest + + * [23.04 FEAT] Support for List-Directed IPL and re-IPL from ECKD DASD + (LP: #2003394) + - s390/ipl: add DEFINE_GENERIC_LOADPARM() + - s390/ipl: add loadparm parameter to eckd ipl/reipl data + + * Miscellaneous Ubuntu changes + - SAUCE: drm/i915/sseu: fix max_subslices array-index-out-of-bounds access + - SAUCE: mtd: spi-nor: Fix shift-out-of-bounds in spi_nor_set_erase_type + - SAUCE: Revert "fbdev: Make registered_fb[] private to fbmem.c" + - [Packaging] disable signing for ppc64el + - [Config] define CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS + - SAUCE: Revert "arm64/fpsimd: Make kernel_neon_ API _GPL" + + -- Andrea Righi Tue, 07 Mar 2023 18:45:31 +0100 + +linux (6.2.0-0.0) lunar; urgency=medium + + * Empty entry + + -- Andrea Righi Fri, 03 Mar 2023 08:42:43 +0100 + +linux-unstable (6.2.0-10.10) lunar; urgency=medium + + * lunar/linux-unstable: 6.2.0-10.10 -proposed tracker (LP: #2007818) + + * Built-in camera device dies after runtime suspended (LP: #2007530) + - SAUCE: usb: xhci: Workaround for runpm issue on AMD xHC + + * Miscellaneous Ubuntu changes + - [Config] update annotations after rebase to v6.2 + + [ Upstream Kernel Changes ] + + * Rebase to v6.2 + + -- Andrea Righi Mon, 20 Feb 2023 10:36:20 +0100 + +linux-unstable (6.2.0-9.9) lunar; urgency=medium + + * lunar/linux-unstable: 6.2.0-9.9 -proposed tracker (LP: #2007069) + + * Move kernel ADT tests to python3 (LP: #2004429) + - [Debian] Use a python3 compatable kernel-testing repo + + * Mediatek FM350-GL wwan module failed to init: Invalid device status 0x1 + (LP: #2002089) + - SAUCE: Revert "net: wwan: t7xx: Add AP CLDMA" + - SAUCE: net: wwan: t7xx: Add AP CLDMA + - SAUCE: net: wwan: t7xx: Infrastructure for early port configuration + - SAUCE: net: wwan: t7xx: PCIe reset rescan + - SAUCE: net: wwan: t7xx: Enable devlink based fw flashing and coredump + collection + - SAUCE: net: wwan: t7xx: Devlink documentation + + * LXD containers using shiftfs on ZFS or TMPFS broken on 5.15.0-48.54 + (LP: #1990849) + - SAUCE: shiftfs: fix -EOVERFLOW inside the container + + * Miscellaneous Ubuntu changes + - [Packaging] annotations: do not drop undefined configs in derivatives + - [Packaging]: annotations: fix _remove_entry() logic + - [Packaging] rsync no longer available on lunar + - [Packaging] annotations: Handle single-line annoation rules + - [Packaging] annotations: Preserve single-line annotation rules + - [Packaging] annotations: Fix linter errors + - [Packaging] annotations: Clean up policy writes + - [Packaging] annotations: Handle tabs in annotations file + - [Packaging] annotations: Fail on invalid lines + - [Packaging] annotations: Write out annotations with notes first + - [Packaging] annotations: Check validity of FLAVOUR_DEP + - [Config] update annotations to split configs with/without notes + - [Packaging] annotations: various code cleanups + - [Config] update annotations after rebase to v6.2-rc8 + + * Miscellaneous upstream changes + - selftests/net: mv bpf/nat6to4.c to net folder + + [ Upstream Kernel Changes ] + + * Rebase to v6.1-rc8 + + -- Andrea Righi Mon, 13 Feb 2023 09:32:18 +0100 + +linux-unstable (6.2.0-8.8) lunar; urgency=medium + + * lunar/linux-unstable: 6.2.0-8.8 -proposed tracker (LP: #2004229) + + * Miscellaneous Ubuntu changes + - [Packaging] re-enable signing for ppc64el and s390x + - SAUCE: s390/decompressor: specify __decompress() buf len to avoid overflow + + -- Andrea Righi Tue, 31 Jan 2023 08:21:21 +0100 + +linux-unstable (6.2.0-7.7) lunar; urgency=medium + + * lunar/linux-unstable: 6.2.0-7.7 -proposed tracker (LP: #2004142) + + -- Andrea Righi Mon, 30 Jan 2023 10:23:15 +0100 + +linux-unstable (6.2.0-6.6) lunar; urgency=medium + + * lunar/linux-unstable: 6.2.0-6.6 -proposed tracker (LP: #2004138) + + * Miscellaneous Ubuntu changes + - [Packaging] debian/rules: Bring back 'editconfigs' + - [Packaging] debian/rules: 1-maintainer.mk -- Use make's if-else + - [Packaging] annotations: make sure to always drop undefined configs + - [Config] update annotations after rebase to v6.2-rc6 + + [ Upstream Kernel Changes ] + + * Rebase to v6.1-rc6 + + -- Andrea Righi Mon, 30 Jan 2023 09:20:26 +0100 + +linux-unstable (6.2.0-5.5) lunar; urgency=medium + + * lunar/linux-unstable: 6.2.0-5.5 -proposed tracker (LP: #2003682) + + * [23.04] Kernel 6.2 does not boot on s390x (LP: #2003348) + - SAUCE Revert "zstd: import usptream v1.5.2" + - SAUCE: Revert "zstd: Move zstd-common module exports to + zstd_common_module.c" + + * Revoke & rotate to new signing key (LP: #2002812) + - [Packaging] Revoke and rotate to new signing key + + * CVE-2023-0179 + - netfilter: nft_payload: incorrect arithmetics when fetching VLAN header bits + + * [23.04] net/smc: Alibaba patches about tunable buffer sizes may cause errors + and need to be removed (kernel 6.2) (LP: #2003547) + - SAUCE: Revert "net/smc: Unbind r/w buffer size from clcsock and make them + tunable" + - SAUCE: Revert "net/smc: Introduce a specific sysctl for TEST_LINK time" + + * 5.15 stuck at boot on c4.large (LP: #1956780) + - SAUCE: Revert "PCI/MSI: Mask MSI-X vectors only on success" + + * Miscellaneous Ubuntu changes + - [Packaging] scripts/misc/kernelconfig: Disable config checks for mainline + builds + - [Packaging] annotations: add CONFIG_GCC_VERSION to the list of ignored + configs + + -- Andrea Righi Mon, 23 Jan 2023 08:20:26 +0100 + +linux-unstable (6.2.0-4.4) lunar; urgency=medium + + * lunar/linux-unstable: 6.2.0-4.4 -proposed tracker (LP: #2003051) + + * Miscellaneous Ubuntu changes + - [Packaging] add python3 as a build dependency + - [Packaging] scripts/misc/kernelconfig: Rewrite + + -- Andrea Righi Tue, 17 Jan 2023 09:18:54 +0100 + +linux-unstable (6.2.0-3.3) lunar; urgency=medium + + * lunar/linux-unstable: 6.2.0-3.3 -proposed tracker (LP: #2002939) + + * Enable kernel config for P2PDMA (LP: #1987394) + - [Config] Enable CONFIG_HSA_AMD_P2P + + * Miscellaneous Ubuntu changes + - SAUCE: (no-up) Remove obj- += foo.o hack + - SAUCE: (no-up) re-add ubuntu/ directory + - [Config] enable EFI handover protocol + - [Packaging] Fix module-check error when modules are compressed + - SAUCE: (no-up) do not remove debian directory by 'make mrproper' + - [Packaging] debian/rules: Drop AUTOBUILD + - [Packaging] debian/rules: Drop NOKERNLOG and PRINTSHAS env variables + - [Packaging] debian/rules: Replace skip variables with skip_checks + - [Packaging] checks/retpoline-check: Make 'skipretpoline' argument optional + - [Packaging] checks/module-signature-check: Add 'skip_checks' argument + - [Packaging] debian/rules: Rename 'skip_dbg' to 'do_dbgsym_package' + - [Packaging] debian/rules: Rename 'skip_checks' to 'do_skip_checks' + - [Packaging] debian/rules: Rename 'full_build' to 'do_full_build' + - [Packaging] debian/rules: Fix PPA debug package builds + - [Packaging] debian/rules: Remove debug package install directory earlier + - [Packaging] debian/rules: Remove unnecessary 'lockme_' variables + - [Packaging] debian/rules: Remove unused target 'diffupstream' + - [Packaging] debian/rules: Mark PHONY targets individually + - [Packaging] debian/rules: Clean up 'help' target output + - [Packaging] debian/rules: Clean up 'printenv' target output + - [Packaging] debian/rules: Add missing 'do_' variables to 'printenv' + - [Config] update annotations after rebase to v6.2-rc4 + + [ Upstream Kernel Changes ] + + * Rebase to v6.1-rc4 + + -- Andrea Righi Mon, 16 Jan 2023 16:01:40 +0100 + +linux-unstable (6.2.0-2.2) lunar; urgency=medium + + * lunar/linux-unstable: 6.2.0-2.2 -proposed tracker (LP: #2001892) + + * Soundwire support for the Intel RPL Gen 0C40/0C11 platforms (LP: #2000030) + - SAUCE: ASoC: Intel: soc-acpi: add configuration for variant of 0C40 product + - SAUCE: ASoC: Intel: soc-acpi: add configuration for variant of 0C11 product + + * Miscellaneous Ubuntu changes + - [Config] update toolchain version in annotations + + * Miscellaneous upstream changes + - Revert "UBUNTU: [Packaging] Support skipped dkms modules" + + [ Upstream Kernel Changes ] + + * Rebase to v6.1-rc2 + + -- Andrea Righi Thu, 05 Jan 2023 09:19:55 +0100 + +linux-unstable (6.2.0-1.1) lunar; urgency=medium + + * lunar/linux-unstable: 6.2.0-1.1 -proposed tracker (LP: #2000904) + + * Packaging resync (LP: #1786013) + - [Packaging] update variants + + * Miscellaneous Ubuntu changes + - [Packaging] annotations: remove configs that are undefined across all + arches/flavours + - SAUCE: Revert "apparmor: make __aa_path_perm() static" + - [Packaging] abi-check: ignore failures when abi check is skipped + - [Packaging] temporarily disable zfs dkms + - [Config] update annotations after rebase to 6.2-rc1 + + [ Upstream Kernel Changes ] + + * Rebase to v6.1-rc1 + + -- Andrea Righi Wed, 04 Jan 2023 12:08:32 +0100 + +linux-unstable (6.2.0-0.0) lunar; urgency=medium + + * Empty entry + + -- Andrea Righi Sun, 01 Jan 2023 10:16:00 +0100 + +linux (6.1.0-11.11) lunar; urgency=medium + + * lunar/linux: 6.1.0-11.11 -proposed tracker (LP: #2000704) + + * Packaging resync (LP: #1786013) + - [Packaging] update helper scripts + + * Lunar update: v6.1.1 upstream stable release (LP: #2000706) + - x86/vdso: Conditionally export __vdso_sgx_enter_enclave() + - libbpf: Fix uninitialized warning in btf_dump_dump_type_data + - PCI: mt7621: Add sentinel to quirks table + - mips: ralink: mt7621: define MT7621_SYSC_BASE with __iomem + - mips: ralink: mt7621: soc queries and tests as functions + - mips: ralink: mt7621: do not use kzalloc too early + - irqchip/ls-extirq: Fix endianness detection + - udf: Discard preallocation before extending file with a hole + - udf: Fix preallocation discarding at indirect extent boundary + - udf: Do not bother looking for prealloc extents if i_lenExtents matches + i_size + - udf: Fix extending file within last block + - usb: gadget: uvc: Prevent buffer overflow in setup handler + - USB: serial: option: add Quectel EM05-G modem + - USB: serial: cp210x: add Kamstrup RF sniffer PIDs + - USB: serial: f81232: fix division by zero on line-speed change + - USB: serial: f81534: fix division by zero on line-speed change + - xhci: Apply XHCI_RESET_TO_DEFAULT quirk to ADL-N + - staging: r8188eu: fix led register settings + - igb: Initialize mailbox message for VF reset + - usb: typec: ucsi: Resume in separate work + - usb: dwc3: pci: Update PCIe device ID for USB3 controller on CPU sub-system + for Raptor Lake + - cifs: fix oops during encryption + - KEYS: encrypted: fix key instantiation with user-provided data + - Linux 6.1.1 + + * Expose built-in trusted and revoked certificates (LP: #1996892) + - [Packaging] Expose built-in trusted and revoked certificates + + * Fix System cannot detect bluetooth after running suspend stress test + (LP: #1998727) + - wifi: rtw88: 8821c: enable BT device recovery mechanism + + * Gnome doesn't run smooth when performing normal usage with RPL-P CPU + (LP: #1998419) + - drm/i915/rpl-p: Add stepping info + + * Mute/mic LEDs no function on a HP platfrom (LP: #1998882) + - ALSA: hda/realtek: fix mute/micmute LEDs for a HP ProBook + + * Add additional Mediatek MT7922 BT device ID (LP: #1998885) + - Bluetooth: btusb: Add a new VID/PID 0489/e0f2 for MT7922 + + * Support Icicle Kit reference design v2022.10 (LP: #1993148) + - SAUCE: riscv: dts: microchip: Disable PCIe on the Icicle Kit + + * Add iommu passthrough quirk for Intel IPU6 on RaptorLake (LP: #1989041) + - SAUCE: iommu: intel-ipu: use IOMMU passthrough mode for Intel IPUs on Raptor + Lake + + * Enable Intel FM350 wwan CCCI driver port logging (LP: #1997686) + - net: wwan: t7xx: use union to group port type specific data + - net: wwan: t7xx: Add port for modem logging + + * TEE Support for CCP driver (LP: #1991608) + - crypto: ccp - Add support for TEE for PCI ID 0x14CA + + * Kinetic update: v5.19.17 upstream stable release (LP: #1994179) + - Revert "fs: check FMODE_LSEEK to control internal pipe splicing" + - kbuild: Add skip_encoding_btf_enum64 option to pahole + + * Kinetic update: v5.19.15 upstream stable release (LP: #1994078) + - Revert "clk: ti: Stop using legacy clkctrl names for omap4 and 5" + + * support independent clock and LED GPIOs for Intel IPU6 platforms + (LP: #1989046) + - SAUCE: platform/x86: int3472: support independent clock and LED GPIOs + + * Kernel livepatch support for for s390x (LP: #1639924) + - [Config] Enable EXPOLINE_EXTERN on s390x + + * Kinetic update: v5.19.7 upstream stable release (LP: #1988733) + - Revert "PCI/portdrv: Don't disable AER reporting in + get_port_device_capability()" + + * Kinetic update: v5.19.3 upstream stable release (LP: #1987345) + - Revert "mm: kfence: apply kmemleak_ignore_phys on early allocated pool" + + * Fix non-working e1000e device after resume (LP: #1951861) + - SAUCE: Revert "e1000e: Add polling mechanism to indicate CSME DPG exit" + + * Add additional Mediatek MT7921 WiFi/BT device IDs (LP: #1937004) + - SAUCE: Bluetooth: btusb: Add support for Foxconn Mediatek Chip + + * Fix system sleep on TGL systems with Intel ME (LP: #1919321) + - SAUCE: PCI: Serialize TGL e1000e PM ops + + * Fix broken e1000e device after S3 (LP: #1897755) + - SAUCE: e1000e: Increase polling timeout on MDIC ready bit + + * Fix unusable USB hub on Dell TB16 after S3 (LP: #1855312) + - SAUCE: USB: core: Make port power cycle a seperate helper function + - SAUCE: USB: core: Attempt power cycle port when it's in eSS.Disabled state + + * Set explicit CC in the headers package (LP: #1999750) + - [Packaging] Set explicit CC in the headers package + + * commit cf58599cded35cf4affed1e659c0e2c742d3fda7 seems to be missing in + kinetic master to remove "hio" reference from Makefile (LP: #1999556) + - SAUCE: remove leftover reference to ubuntu/hio driver + + * Miscellaneous Ubuntu changes + - [Packaging] kernelconfig: always complete all config checks + - [Packaging] annotations: unify same rule across all flavour within the same + arch + - [Config] annotations: compact annotations file + - [Config] disable EFI_ZBOOT + - SAUCE: input: i8042: fix section mismatch warning + - debian/dkms-versions -- re-enable zfs + - [Packaging] old-kernelconfig: update config-check path + - [Packaging] update getabis + - [Packaging] update Ubuntu.md + + * Miscellaneous upstream changes + - Revert "drm/i915/opregion: check port number bounds for SWSCI display power + state" + + -- Andrea Righi Fri, 30 Dec 2022 11:23:16 +0100 + +linux (6.1.0-10.10) lunar; urgency=medium + + * lunar/linux: 6.1.0-10.10 -proposed tracker (LP: #1999569) + + * Soundwire support for the Intel RPL Gen platforms (LP: #1997944) + - ASoC: Intel: sof_sdw: Add support for SKU 0C10 product + - ASoC: Intel: soc-acpi: add SKU 0C10 SoundWire configuration + - ASoC: Intel: sof_sdw: Add support for SKU 0C40 product + - ASoC: Intel: soc-acpi: add SKU 0C40 SoundWire configuration + - ASoC: Intel: sof_sdw: Add support for SKU 0C4F product + - ASoC: rt1318: Add RT1318 SDCA vendor-specific driver + - ASoC: intel: sof_sdw: add rt1318 codec support. + - ASoC: Intel: sof_sdw: Add support for SKU 0C11 product + - ASoC: Intel: soc-acpi: add SKU 0C11 SoundWire configuration + - SAUCE: ASoC: Intel: soc-acpi: update codec addr on 0C11/0C4F product + - [Config] enable CONFIG_SND_SOC_RT1318_SDW + + * Virtual GPU driver packaging regression (LP: #1996112) + - [Packaging] Reintroduce VM DRM drivers into modules + + -- Andrea Righi Tue, 13 Dec 2022 22:14:08 +0100 + +linux (6.1.0-9.9) lunar; urgency=medium + + * Empty entry (ABI bump) + + -- Andrea Righi Tue, 13 Dec 2022 21:31:08 +0100 + +linux (6.1.0-3.3) lunar; urgency=medium + + * lunar/linux: 6.1.0-3.3 -proposed tracker (LP: #1999534) + + * [DEP-8] Run ADT regression suite for lowlatency kernels Jammy and later + (LP: #1999528) + - [DEP-8] Fix regression suite to run on lowlatency + + * Miscellaneous Ubuntu changes + - [Packaging] annotations: do not add constraints on toolchain versions + + -- Andrea Righi Tue, 13 Dec 2022 16:45:59 +0100 + +linux (6.1.0-2.2) lunar; urgency=medium + + * lunar/linux: 6.1.0-2.2 -proposed tracker (LP: #1999411) + + * Miscellaneous Ubuntu changes + - [Packaging] annotations: do not enforce toolchain versions + + -- Andrea Righi Mon, 12 Dec 2022 17:05:59 +0100 + +linux (6.1.0-1.1) lunar; urgency=medium + + * lunar/linux: 6.1.0-1.1 -proposed tracker (LP: #1999373) + + * Packaging resync (LP: #1786013) + - [Packaging] update variants + + * Miscellaneous Ubuntu changes + - [Packaging] annotations: set and delete configs from command line + - [Packaging] migrateconfigs: ignore README.rst if it doesn't exist + - [Packaging] migrate-annotations: properly determine arches in derivatives + - [Packaging] annotations: allow to set note to config options directly + - [Packaging] annotations: assume --query as default command + - [Packaging] annotations: allow to query using CONFIG_&2 + exit 1 + fi +} + +# Form an associative lookup for the section numbers in the ELF symbol table. +# Uses 8 character 0 expanded hexadecimal key for ease of consumption. +__sectionmap_init() +{ + readelf -W --headers "$1" | \ + awk ' + { sub("\\[", ""); sub("\\]", ""); } + ($1 ~ /^[0-9][0-9]*/) { printf("%08x %s %s %s\n", int($1), $2, $3, $4); } + ' | \ + { + while read section_num section_name section_type section_vma + do + echo "sectionmap_$section_num='$section_name'" + echo "sectionvma_$section_num='$section_vma'" + case "$section_type" in + REL|RELA) section_relocation="$section_type" ;; + esac + done + echo "section_relocation='$section_relocation'" + } +} +sectionmap_init() +{ + eval $(__sectionmap_init "$1") +} +sectionmap() +{ + eval RET="\$sectionmap_$1" + if [ "$RET" = '' ]; then + echo "sectionmap: $1: invalid section" 1>&2 + exit 1 + fi +} +sectionvma() +{ + eval RET="\$sectionvma_$1" + if [ "$RET" = '' ]; then + echo "sectionvma: $1: invalid section" 1>&2 + exit 1 + fi +} + +# Read and parse the hex-dump output. +hex="[0-9a-f]" +hex_8="$hex$hex$hex$hex$hex$hex$hex$hex" +hexspc="[0-9a-f ]" +hexspc_8="$hexspc$hexspc$hexspc$hexspc$hexspc$hexspc$hexspc$hexspc" + +raw32() +{ + readelf --hex-dump "$2" "$1" 2>/dev/null | + sed \ + -e '/^Hex/d' -e '/^$/d' -e '/^ *NOTE/d' \ + -e 's/ *[^ ][^ ]* *\('"$hex_8"'\) \('"$hexspc_8"'\) \('"$hexspc_8"'\) \('"$hexspc_8"'\) .*/\1 \2 \3 \4 /' \ + -e 's/\('"$hex$hex"'\)\('"$hex$hex"'\)\('"$hex$hex"'\)\('"$hex$hex"'\) /\4\3\2\1 /g' \ + -e 's/ $//g' -e 's/ /\n/g' +} +#-e 's/\([^ ][^ ][^ ][^ ][^ ][^ ][^ ][^ ]\) \([^ ][^ ][^ ][^ ][^ ][^ ][^ ][^ ]\) /\2\1 /g' \ + +rela() +{ + #file="$(basename "$1")" + file="$1" + + # Read relocation information for a 64bit binary. Each relocation entry + # is 3 long longs so we collect 6 quads here. Note that the dump is in + # listed in increasing byte order not withstanding the quad split. + # + # The record says to take the value of add and + # shove that into in the segment of the . + # + # Format: + # 64 bits + # 32 bits + # 32 bits + # 64 bits + raw32 "$1" ".rela$SECTION" | \ + { + a1=''; a2=''; a3=''; a4=''; a5='' + while read a6 + do + [ "$a1" = '' ] && { a1="$a6"; continue; } + [ "$a2" = '' ] && { a2="$a6"; continue; } + [ "$a3" = '' ] && { a3="$a6"; continue; } + [ "$a4" = '' ] && { a4="$a6"; continue; } + [ "$a5" = '' ] && { a5="$a6"; continue; } + + #echo ">$a1< >$a2< >$a3< >$a4< >$a5< >$a6<" 1>&2 + #echo "type<$a3> symbol<$a4> offset<$a2$a1> addr<$a6a5>" 1>&2 + + symbolmap "$a4"; section_num="$RET" + #echo "section_num<$section_num>" 1>&2 + + sectionmap "$section_num"; section="$RET" + sectionvma "$section_num"; vma="$RET" + #echo "section<$section> vma<$vma>" 1>&2 + + # Adjust the segment addressing by the segment offset. + printf -v addr "%u" "0x$a6$a5" + printf -v vma "%u" "0x$vma" + let offset="$addr + $vma" + printf -v offset "%x" "$offset" + + echo "$file-$section-$offset" + + a1=''; a2=''; a3=''; a4=''; a5='' + done + } | sed -e 's/-00*\([0-9a-f]\)/-\1/' +} + +# Form an associative lookup for the raw contents for an ELF section. +# Uses 8 character 0 expanded hexadecimal key for ease of consumption. +contentmap_init() +{ + raw32 "$1" "$2" >"$tmp" + let offset=0 + while read value + do + printf -v offset_hex "%08x" $offset + eval contentmap_$offset_hex=\'$value\' + + let offset="$offset + 4" + done <"$tmp" + rm -f "$tmp" +} +contentmap() +{ + eval RET="\$contentmap_$1" + if [ "$RET" = '' ]; then + echo "contentmap: $1: invalid offset" 1>&2 + exit 1 + fi +} + +rel() +{ + # Load up the current contents of the $SECTION segment + # as the offsets (see below) are recorded there and we will need + # those to calculate the actuall address. + contentmap_init "$1" "$SECTION" + + #file="$(basename "$1")" + file="$1" + + # Read relocation information for a 32bit binary. Each relocation entry + # is 3 longs so we collect 3 quads here. Note that the dump is in + # listed in increasing byte order not withstanding the quad split. + # + # The record says to take the value of and add that to the + # existing contents of in the segment of the . + # + # Format: + # 32 bits + # 24 bits + # 8 bits + raw32 "$1" ".rel$SECTION" | \ + { + a1='' + while read a2 + do + [ "$a1" = '' ] && { a1="$a2"; continue; } + + #echo ">$a1< >$a2<" + contentmap "$a1"; offset="$RET" + symbolmap "00${a2%??}"; section_num="$RET" + + sectionmap "$section_num"; section="$RET" + sectionvma "$section_num"; vma="$RET" + #echo ">$a1< >$a2< >$offset< >$section<" + + echo "$file-$section-$offset" + + a1='' + done + } | sed -e 's/-00*\([0-9a-f]\)/-\1/' +} + +tmp=$(mktemp --tmpdir "retpoline-extract-XXXXXX") + +disassemble() +{ + local object="$1" + local src="$2" + local options="$3" + local selector="$4" + + objdump $options --disassemble --no-show-raw-insn "$object" | \ + awk -F' ' ' + BEGIN { file="'"$object"'"; src="'"$src"'"; } + /Disassembly of section/ { segment=$4; sub(":", "", segment); } + /^[0-9a-f][0-9a-f]* <.*>:/ { tag=$0; sub(".*<", "", tag); sub(">.*", "", tag); } + $0 ~ /(call|jmp)q? *\*0x[0-9a-f]*\(%rip\)/ { + next + } + $0 ~ /(call|jmp)q? *\*.*%/ { + sub(":", "", $1); + if ('"$selector"') { + offset=$1 + $1=tag + print(file "-" segment "-" offset " " src " " segment " " $0); + } + } + ' +} + +# Accumulate potentially vunerable indirect call/jmp sequences. We do this +# by examining the raw disassembly for affected forms, recording the location +# of each. +case "$bit16" in +'') disassemble "$object" "$src" '' 'segment != ".init.text"' ;; +*) disassemble "$object" "$src" '--disassembler-options=i8086' 'segment != ".init.text" && segment != ".text32" && segment != ".text64"' + disassemble "$object" "$src" '--disassembler-options=i386' 'segment == ".text32"' + disassemble "$object" "$src" '--disassembler-options=x86-64' 'segment == ".text64"' + ;; +esac | sort -k 1b,1 >"$object.ur-detected" +[ ! -s "$object.ur-detected" ] && rm -f "$object.ur-detected" + +# Load up the symbol table and section mappings. +symbolmap_init "$object" +sectionmap_init "$object" + +# Accumulate annotated safe indirect call/jmp sequences. We do this by examining +# the $SECTION sections (and their associated relocation information), +# each entry represents the address of an instruction which has been marked +# as ok. +case "$section_relocation" in +REL) rel "$object" ;; +RELA) rela "$object" ;; +esac | sort -k 1b,1 >"$object.ur-safe" +[ ! -s "$object.ur-safe" ] && rm -f "$object.ur-safe" + +# We will perform the below join on the summarised and sorted fragments +# formed above. This is performed in retpoline-check. +#join -v 1 -j 1 "$tmp.extracted" "$tmp.safe" | sed -s 's/[^ ]* *//' + +rm -f "$tmp" --- linux-azure-6.5.0.orig/security/Kconfig +++ linux-azure-6.5.0/security/Kconfig @@ -19,6 +19,15 @@ If you are unsure how to answer this question, answer N. +config SECURITY_PERF_EVENTS_RESTRICT + bool "Restrict unprivileged use of performance events" + depends on PERF_EVENTS + help + If you say Y here, the kernel.perf_event_paranoid sysctl + will be set to 3 by default, and no unprivileged use of the + perf_event_open syscall will be permitted unless it is + changed. + config SECURITY bool "Enable different security models" depends on SYSFS --- linux-azure-6.5.0.orig/security/apparmor/Kconfig +++ linux-azure-6.5.0/security/apparmor/Kconfig @@ -105,6 +105,18 @@ includes policy, and has some form of integrity check. Disabling the check will speed up policy loads. +config SECURITY_APPARMOR_RESTRICT_USERNS + bool "Restrict user namespace creation to confined domains" + depends on SECURITY_APPARMOR && USER_NS + default y + help + This options allows controlling whether apparmor restricts + the creation of new user namespaces to confined tasks by + default. If set unconfined tasks without CAP_SYS_ADMIN + will not be allowed to create new user namespaces. Confined + tasks ability to create new user namespaces will be controlled + by their profile. + config SECURITY_APPARMOR_KUNIT_TEST tristate "Build KUnit tests for policy_unpack.c" if !KUNIT_ALL_TESTS depends on KUNIT && SECURITY_APPARMOR --- linux-azure-6.5.0.orig/security/apparmor/Makefile +++ linux-azure-6.5.0/security/apparmor/Makefile @@ -6,7 +6,7 @@ apparmor-y := apparmorfs.o audit.o capability.o task.o ipc.o lib.o match.o \ path.o domain.o policy.o policy_unpack.o procattr.o lsm.o \ resource.o secid.o file.o policy_ns.o label.o mount.o net.o \ - policy_compat.o + policy_compat.o af_unix.o notify.o apparmor-$(CONFIG_SECURITY_APPARMOR_HASH) += crypto.o obj-$(CONFIG_SECURITY_APPARMOR_KUNIT_TEST) += apparmor_policy_unpack_test.o --- linux-azure-6.5.0.orig/security/apparmor/af_unix.c +++ linux-azure-6.5.0/security/apparmor/af_unix.c @@ -0,0 +1,702 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * AppArmor security module + * + * This file contains AppArmor af_unix fine grained mediation + * + * Copyright 2018 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2 of the + * License. + */ + +#include + +#include "include/audit.h" +#include "include/af_unix.h" +#include "include/apparmor.h" +#include "include/file.h" +#include "include/label.h" +#include "include/path.h" +#include "include/policy.h" +#include "include/cred.h" + +static inline struct sock *aa_unix_sk(struct unix_sock *u) +{ + return &u->sk; +} + +static umode_t sock_i_mode(struct sock *sk) +{ + umode_t mode; + + read_lock_bh(&sk->sk_callback_lock); + mode = sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_mode : 0; + read_unlock_bh(&sk->sk_callback_lock); + return mode; +} + +static inline int unix_fs_perm(const char *op, u32 mask, + const struct cred *subj_cred, + struct aa_label *label, + struct unix_sock *u, int flags) +{ + AA_BUG(!label); + AA_BUG(!u); + AA_BUG(!UNIX_FS(aa_unix_sk(u))); + + if (unconfined(label) || !LABEL_MEDIATES(label, AA_CLASS_FILE)) + return 0; + + mask &= NET_FS_PERMS; + if (!u->path.dentry) { + struct path_cond cond = { + .uid = sock_i_uid(&u->sk), + .mode = sock_i_mode(&u->sk), + }; + struct aa_perms perms = { }; + struct aa_profile *profile; + + /* socket path has been cleared because it is being shutdown + * can only fall back to original sun_path request + */ + struct aa_sk_ctx *ctx = aa_sock(&u->sk); + + if (ctx->path.dentry) + return aa_path_perm(op, subj_cred, label, &ctx->path, + flags, mask, + &cond); + return fn_for_each_confined(label, profile, + ((flags | profile->path_flags) & PATH_MEDIATE_DELETED) ? + __aa_path_perm(op, subj_cred, profile, + u->addr->name->sun_path, mask, + &cond, flags, &perms, false) : + aa_audit_file(subj_cred, profile, &nullperms, + op, mask, + u->addr->name->sun_path, NULL, + NULL, cond.uid, + "Failed name lookup - deleted entry", + -EACCES, false)); + } else { + /* the sunpath may not be valid for this ns so use the path */ + struct path_cond cond = { u->path.dentry->d_inode->i_uid, + u->path.dentry->d_inode->i_mode + }; + + return aa_path_perm(op, subj_cred, label, &u->path, flags, + mask, &cond); + } + + return 0; +} + +/* passing in state returned by PROFILE_MEDIATES_AF */ +static unsigned int match_to_prot(struct aa_dfa *dfa, + unsigned int state, int type, int protocol, + const char **info) +{ + __be16 buffer[2]; + + buffer[0] = cpu_to_be16(type); + buffer[1] = cpu_to_be16(protocol); + state = aa_dfa_match_len(dfa, state, (char *) &buffer, 4); + if (!state) + *info = "failed type and protocol match"; + return state; +} + +static unsigned int match_addr(struct aa_dfa *dfa, unsigned int state, + struct sockaddr_un *addr, int addrlen) +{ + if (addr) + /* include leading \0 */ + state = aa_dfa_match_len(dfa, state, addr->sun_path, + unix_addr_len(addrlen)); + else + /* anonymous end point */ + state = aa_dfa_match_len(dfa, state, "\x01", 1); + /* todo change to out of band */ + state = aa_dfa_null_transition(dfa, state); + return state; +} + +static unsigned int match_to_local(struct aa_dfa *dfa, + unsigned int state, int type, int protocol, + struct sockaddr_un *addr, int addrlen, + const char **info) +{ + state = match_to_prot(dfa, state, type, protocol, info); + if (state) { + state = match_addr(dfa, state, addr, addrlen); + if (state) { + /* todo: local label matching */ + state = aa_dfa_null_transition(dfa, state); + if (!state) + *info = "failed local label match"; + } else + *info = "failed local address match"; + } + + return state; +} + +static unsigned int match_to_sk(struct aa_dfa *dfa, + unsigned int state, struct unix_sock *u, + const char **info) +{ + struct sockaddr_un *addr = NULL; + int addrlen = 0; + + if (u->addr) { + addr = u->addr->name; + addrlen = u->addr->len; + } + + return match_to_local(dfa, state, u->sk.sk_type, u->sk.sk_protocol, + addr, addrlen, info); +} + +#define CMD_ADDR 1 +#define CMD_LISTEN 2 +#define CMD_OPT 4 + +static inline unsigned int match_to_cmd(struct aa_dfa *dfa, + unsigned int state, struct unix_sock *u, + char cmd, const char **info) +{ + state = match_to_sk(dfa, state, u, info); + if (state) { + state = aa_dfa_match_len(dfa, state, &cmd, 1); + if (!state) + *info = "failed cmd selection match"; + } + + return state; +} + +static inline unsigned int match_to_peer(struct aa_dfa *dfa, + unsigned int state, + struct unix_sock *u, + struct sockaddr_un *peer_addr, + int peer_addrlen, + const char **info) +{ + state = match_to_cmd(dfa, state, u, CMD_ADDR, info); + if (state) { + state = match_addr(dfa, state, peer_addr, peer_addrlen); + if (!state) + *info = "failed peer address match"; + } + return state; +} + +static int do_perms(struct aa_profile *profile, struct aa_ruleset *rule, + unsigned int state, u32 request, + struct apparmor_audit_data *ad) +{ + struct aa_perms perms; + + AA_BUG(!profile); + + perms = *aa_lookup_perms(rule->policy, state); + aa_apply_modes_to_perms(profile, &perms); + return aa_check_perms(profile, &perms, request, ad, + audit_net_cb); +} + +static int match_label(struct aa_profile *profile, struct aa_ruleset *rule, + struct aa_profile *peer, unsigned int state, u32 request, + struct apparmor_audit_data *ad) +{ + AA_BUG(!profile); + AA_BUG(!peer); + + ad->peer = &peer->label; + + if (state) { + state = aa_dfa_match(rule->policy->dfa, state, + peer->base.hname); + if (!state) + ad->info = "failed peer label match"; + } + return do_perms(profile, rule, state, request, ad); +} + + +/* unix sock creation comes before we know if the socket will be an fs + * socket + * v6 - semantics are handled by mapping in profile load + * v7 - semantics require sock create for tasks creating an fs socket. + */ +static int profile_create_perm(struct aa_profile *profile, int family, + int type, int protocol) +{ + struct aa_ruleset *rules = list_first_entry(&profile->rules, + typeof(*rules), list); + aa_state_t state; + DEFINE_AUDIT_NET(ad, OP_CREATE, NULL, family, type, protocol); + + AA_BUG(!profile); + AA_BUG(profile_unconfined(profile)); + + state = RULE_MEDIATES_AF(rules, AF_UNIX); + if (state) { + state = match_to_prot(rules->policy->dfa, state, type, protocol, + &ad.info); + return do_perms(profile, rules, state, AA_MAY_CREATE, &ad); + } + + return aa_profile_af_perm(profile, &ad, AA_MAY_CREATE, family, type); +} + +int aa_unix_create_perm(struct aa_label *label, int family, int type, + int protocol) +{ + struct aa_profile *profile; + + if (unconfined(label)) + return 0; + + return fn_for_each_confined(label, profile, + profile_create_perm(profile, family, type, protocol)); +} + + +static inline int profile_sk_perm(struct aa_profile *profile, + struct apparmor_audit_data *ad, + u32 request, struct sock *sk) +{ + struct aa_ruleset *rules = list_first_entry(&profile->rules, + typeof(*rules), + list); + unsigned int state; + + AA_BUG(!profile); + AA_BUG(!sk); + AA_BUG(UNIX_FS(sk)); + AA_BUG(profile_unconfined(profile)); + + state = RULE_MEDIATES_AF(rules, AF_UNIX); + if (state) { + state = match_to_sk(rules->policy->dfa, state, unix_sk(sk), + &ad->info); + return do_perms(profile, rules, state, request, ad); + } + + return aa_profile_af_sk_perm(profile, ad, request, sk); +} + +int aa_unix_label_sk_perm(const struct cred *subj_cred, + struct aa_label *label, const char *op, u32 request, + struct sock *sk) +{ + if (!unconfined(label)) { + struct aa_profile *profile; + DEFINE_AUDIT_SK(ad, op, sk); + + ad.subj_cred = subj_cred; + return fn_for_each_confined(label, profile, + profile_sk_perm(profile, &ad, request, sk)); + } + return 0; +} + +static int unix_label_sock_perm(const struct cred *subj_cred, + struct aa_label *label, const char *op, + u32 request, struct socket *sock) +{ + if (unconfined(label)) + return 0; + if (UNIX_FS(sock->sk)) + return unix_fs_perm(op, request, subj_cred, label, + unix_sk(sock->sk), 0); + + return aa_unix_label_sk_perm(subj_cred, label, op, request, sock->sk); +} + +/* revaliation, get/set attr */ +int aa_unix_sock_perm(const char *op, u32 request, struct socket *sock) +{ + struct aa_label *label; + int error; + + label = begin_current_label_crit_section(); + error = unix_label_sock_perm(current_cred(), label, op, request, sock); + end_current_label_crit_section(label); + + return error; +} + +static int profile_bind_perm(struct aa_profile *profile, struct sock *sk, + struct sockaddr *addr, int addrlen) +{ + struct aa_ruleset *rules = list_first_entry(&profile->rules, + typeof(*rules), list); + unsigned int state; + DEFINE_AUDIT_SK(ad, OP_BIND, sk); + + ad.subj_cred = current_cred(); + AA_BUG(!profile); + AA_BUG(!sk); + AA_BUG(addr->sa_family != AF_UNIX); + AA_BUG(profile_unconfined(profile)); + AA_BUG(unix_addr_fs(addr, addrlen)); + + state = RULE_MEDIATES_AF(rules, AF_UNIX); + if (state) { + /* bind for abstract socket */ + ad.net.addr = unix_addr(addr); + ad.net.addrlen = addrlen; + + state = match_to_local(rules->policy->dfa, state, + sk->sk_type, sk->sk_protocol, + unix_addr(addr), addrlen, + &ad.info); + return do_perms(profile, rules, state, AA_MAY_BIND, &ad); + } + + return aa_profile_af_sk_perm(profile, &ad, AA_MAY_BIND, sk); +} + +int aa_unix_bind_perm(struct socket *sock, struct sockaddr *address, + int addrlen) +{ + struct aa_profile *profile; + struct aa_label *label; + int error = 0; + + label = begin_current_label_crit_section(); + /* fs bind is handled by mknod */ + if (!(unconfined(label) || unix_addr_fs(address, addrlen))) + error = fn_for_each_confined(label, profile, + profile_bind_perm(profile, sock->sk, address, + addrlen)); + end_current_label_crit_section(label); + + return error; +} + +int aa_unix_connect_perm(struct socket *sock, struct sockaddr *address, + int addrlen) +{ + /* unix connections are covered by the + * - unix_stream_connect (stream) and unix_may_send hooks (dgram) + * - fs connect is handled by open + */ + return 0; +} + +static int profile_listen_perm(struct aa_profile *profile, struct sock *sk, + int backlog) +{ + struct aa_ruleset *rules = list_first_entry(&profile->rules, + typeof(*rules), list); + unsigned int state; + DEFINE_AUDIT_SK(ad, OP_LISTEN, sk); + + AA_BUG(!profile); + AA_BUG(!sk); + AA_BUG(UNIX_FS(sk)); + AA_BUG(profile_unconfined(profile)); + + state = RULE_MEDIATES_AF(rules, AF_UNIX); + if (state) { + __be16 b = cpu_to_be16(backlog); + + state = match_to_cmd(rules->policy->dfa, state, unix_sk(sk), + CMD_LISTEN, &ad.info); + if (state) { + state = aa_dfa_match_len(rules->policy->dfa, state, + (char *) &b, 2); + if (!state) + ad.info = "failed listen backlog match"; + } + return do_perms(profile, rules, state, AA_MAY_LISTEN, &ad); + } + + return aa_profile_af_sk_perm(profile, &ad, AA_MAY_LISTEN, sk); +} + +int aa_unix_listen_perm(struct socket *sock, int backlog) +{ + struct aa_profile *profile; + struct aa_label *label; + int error = 0; + + label = begin_current_label_crit_section(); + if (!(unconfined(label) || UNIX_FS(sock->sk))) + error = fn_for_each_confined(label, profile, + profile_listen_perm(profile, sock->sk, + backlog)); + end_current_label_crit_section(label); + + return error; +} + + +static inline int profile_accept_perm(struct aa_profile *profile, + struct sock *sk, + struct sock *newsk) +{ + struct aa_ruleset *rules = list_first_entry(&profile->rules, + typeof(*rules), list); + unsigned int state; + DEFINE_AUDIT_SK(ad, OP_ACCEPT, sk); + + AA_BUG(!profile); + AA_BUG(!sk); + AA_BUG(UNIX_FS(sk)); + AA_BUG(profile_unconfined(profile)); + + state = RULE_MEDIATES_AF(rules, AF_UNIX); + if (state) { + state = match_to_sk(rules->policy->dfa, state, unix_sk(sk), + &ad.info); + return do_perms(profile, rules, state, AA_MAY_ACCEPT, &ad); + } + + return aa_profile_af_sk_perm(profile, &ad, AA_MAY_ACCEPT, sk); +} + +/* ability of sock to connect, not peer address binding */ +int aa_unix_accept_perm(struct socket *sock, struct socket *newsock) +{ + struct aa_profile *profile; + struct aa_label *label; + int error = 0; + + label = begin_current_label_crit_section(); + if (!(unconfined(label) || UNIX_FS(sock->sk))) + error = fn_for_each_confined(label, profile, + profile_accept_perm(profile, sock->sk, + newsock->sk)); + end_current_label_crit_section(label); + + return error; +} + + +/* dgram handled by unix_may_sendmsg, right to send on stream done at connect + * could do per msg unix_stream here + */ +/* sendmsg, recvmsg */ +int aa_unix_msg_perm(const char *op, u32 request, struct socket *sock, + struct msghdr *msg, int size) +{ + return 0; +} + + +static int profile_opt_perm(struct aa_profile *profile, const char *op, u32 request, + struct sock *sk, int level, int optname) +{ + struct aa_ruleset *rules = list_first_entry(&profile->rules, + typeof(*rules), list); + unsigned int state; + DEFINE_AUDIT_SK(ad, op, sk); + + AA_BUG(!profile); + AA_BUG(!sk); + AA_BUG(UNIX_FS(sk)); + AA_BUG(profile_unconfined(profile)); + + state = RULE_MEDIATES_AF(rules, AF_UNIX); + if (state) { + __be16 b = cpu_to_be16(optname); + + state = match_to_cmd(rules->policy->dfa, state, unix_sk(sk), + CMD_OPT, &ad.info); + if (state) { + state = aa_dfa_match_len(rules->policy->dfa, state, + (char *) &b, 2); + if (!state) + ad.info = "failed sockopt match"; + } + return do_perms(profile, rules, state, request, &ad); + } + + return aa_profile_af_sk_perm(profile, &ad, request, sk); +} + +int aa_unix_opt_perm(const char *op, u32 request, struct socket *sock, int level, + int optname) +{ + struct aa_profile *profile; + struct aa_label *label; + int error = 0; + + label = begin_current_label_crit_section(); + if (!(unconfined(label) || UNIX_FS(sock->sk))) + error = fn_for_each_confined(label, profile, + profile_opt_perm(profile, op, request, + sock->sk, level, optname)); + end_current_label_crit_section(label); + + return error; +} + +/* null peer_label is allowed, in which case the peer_sk label is used */ +static int profile_peer_perm(struct aa_profile *profile, const char *op, u32 request, + struct sock *sk, struct sock *peer_sk, + struct aa_label *peer_label, + struct apparmor_audit_data *ad) +{ + struct aa_ruleset *rules = list_first_entry(&profile->rules, + typeof(*rules), list); + unsigned int state; + + AA_BUG(!profile); + AA_BUG(profile_unconfined(profile)); + AA_BUG(!sk); + AA_BUG(!peer_sk); + AA_BUG(UNIX_FS(peer_sk)); + + state = RULE_MEDIATES_AF(rules, AF_UNIX); + if (state) { + struct aa_sk_ctx *peer_ctx = aa_sock(peer_sk); + struct aa_profile *peerp; + struct sockaddr_un *addr = NULL; + int len = 0; + + if (unix_sk(peer_sk)->addr) { + addr = unix_sk(peer_sk)->addr->name; + len = unix_sk(peer_sk)->addr->len; + } + state = match_to_peer(rules->policy->dfa, state, unix_sk(sk), + addr, len, &ad->info); + if (!peer_label) + peer_label = peer_ctx->label; + return fn_for_each_in_ns(peer_label, peerp, + match_label(profile, rules, peerp, state, + request, ad)); + } + + return aa_profile_af_sk_perm(profile, ad, request, sk); +} + +/** + * + * Requires: lock held on both @sk and @peer_sk + */ +int aa_unix_peer_perm(const struct cred *subj_cred, + struct aa_label *label, const char *op, u32 request, + struct sock *sk, struct sock *peer_sk, + struct aa_label *peer_label) +{ + struct unix_sock *peeru = unix_sk(peer_sk); + struct unix_sock *u = unix_sk(sk); + + AA_BUG(!label); + AA_BUG(!sk); + AA_BUG(!peer_sk); + + if (UNIX_FS(aa_unix_sk(peeru))) { + return unix_fs_perm(op, request, subj_cred, label, peeru, 0); + } else if (UNIX_FS(aa_unix_sk(u))) { + return unix_fs_perm(op, request, subj_cred, label, u, 0); + } else { + struct aa_profile *profile; + DEFINE_AUDIT_SK(ad, op, sk); + + ad.net.peer_sk = peer_sk; + ad.subj_cred = subj_cred; + /* TODO: ns!!! */ + if (!net_eq(sock_net(sk), sock_net(peer_sk))) + ; + + if (unconfined(label)) + return 0; + + return fn_for_each_confined(label, profile, + profile_peer_perm(profile, op, request, sk, + peer_sk, peer_label, &ad)); + } +} + + +/* from net/unix/af_unix.c */ +static void unix_state_double_lock(struct sock *sk1, struct sock *sk2) +{ + if (unlikely(sk1 == sk2) || !sk2) { + unix_state_lock(sk1); + return; + } + if (sk1 < sk2) { + unix_state_lock(sk1); + unix_state_lock_nested(sk2); + } else { + unix_state_lock(sk2); + unix_state_lock_nested(sk1); + } +} + +static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2) +{ + if (unlikely(sk1 == sk2) || !sk2) { + unix_state_unlock(sk1); + return; + } + unix_state_unlock(sk1); + unix_state_unlock(sk2); +} + +int aa_unix_file_perm(const struct cred *subj_cred, struct aa_label *label, + const char *op, u32 request, struct socket *sock) +{ + struct sock *peer_sk = NULL; + u32 sk_req = request & ~NET_PEER_MASK; + int error = 0; + + AA_BUG(!label); + AA_BUG(!sock); + AA_BUG(!sock->sk); + AA_BUG(sock->sk->sk_family != AF_UNIX); + + /* TODO: update sock label with new task label */ + unix_state_lock(sock->sk); + peer_sk = unix_peer(sock->sk); + if (peer_sk) + sock_hold(peer_sk); + if (!unix_connected(sock) && sk_req) { + error = unix_label_sock_perm(subj_cred, label, op, sk_req, + sock); + if (!error) + ; // TODO: update label + } + unix_state_unlock(sock->sk); + if (!peer_sk) + return error; + + unix_state_double_lock(sock->sk, peer_sk); + if (UNIX_FS(sock->sk)) { + error = unix_fs_perm(op, request, subj_cred, label, + unix_sk(sock->sk), + PATH_SOCK_COND); + } else if (UNIX_FS(peer_sk)) { + error = unix_fs_perm(op, request, subj_cred, label, + unix_sk(peer_sk), + PATH_SOCK_COND); + } else { + struct aa_sk_ctx *pctx = aa_sock(peer_sk); + + if (sk_req) + error = aa_unix_label_sk_perm(subj_cred, + label, op, sk_req, + sock->sk); + last_error(error, + xcheck(aa_unix_peer_perm(subj_cred, label, op, + MAY_READ | MAY_WRITE, + sock->sk, peer_sk, NULL), + aa_unix_peer_perm(sock->file ? sock->file->f_cred : NULL, + pctx->label, op, + MAY_READ | MAY_WRITE, + peer_sk, sock->sk, label))); + } + + unix_state_double_unlock(sock->sk, peer_sk); + sock_put(peer_sk); + + return error; +} --- linux-azure-6.5.0.orig/security/apparmor/apparmorfs.c +++ linux-azure-6.5.0/security/apparmor/apparmorfs.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "include/apparmor.h" #include "include/apparmorfs.h" @@ -35,6 +36,7 @@ #include "include/policy.h" #include "include/policy_ns.h" #include "include/resource.h" +#include "include/path.h" #include "include/policy_unpack.h" #include "include/task.h" @@ -423,7 +425,7 @@ /* high level check about policy management - fine grained in * below after unpack */ - error = aa_may_manage_policy(label, ns, mask); + error = aa_may_manage_policy(current_cred(), label, ns, mask); if (error) goto end_section; @@ -486,7 +488,8 @@ /* high level check about policy management - fine grained in * below after unpack */ - error = aa_may_manage_policy(label, ns, AA_MAY_REMOVE_POLICY); + error = aa_may_manage_policy(current_cred(), label, ns, + AA_MAY_REMOVE_POLICY); if (error) goto out; @@ -608,6 +611,215 @@ .release = ns_revision_release, }; + +/* file hook fn for notificaions of policy actions */ +static int listener_release(struct inode *inode, struct file *file) +{ + struct aa_listener *listener = file->private_data; + + if (!aa_current_policy_admin_capable(NULL)) + return -EPERM; + if (listener) + aa_put_listener(listener); + + return 0; +} + +static int listener_open(struct inode *inode, struct file *file) +{ + struct aa_listener *listener; + + if (!aa_current_policy_admin_capable(NULL)) + return -EPERM; + listener = aa_new_listener(NULL, GFP_KERNEL); + if (!listener) + return -ENOMEM; + file->private_data = listener; + return 0; +} + +/* todo: separate register and set filter */ +static long notify_set_filter(struct aa_listener *listener, + unsigned long arg) +{ + struct apparmor_notif_filter *unotif; + struct aa_ns *ns = NULL; + long ret; + u16 size; + void __user *buf = (void __user *)arg; + + if (copy_from_user(&size, buf, sizeof(size))) + return -EFAULT; + if (size < sizeof(unotif)) + return -EINVAL; + /* size is capped at U16_MAX by data type */ + unotif = kzalloc(size, GFP_KERNEL); + if (!unotif) + return -ENOMEM; + + if (copy_from_user(unotif, buf, size)) { + ret = -EFAULT; + goto out; + } + ret = size; + + /* todo validate to known modes */ + listener->mask = unotif->modeset; + AA_DEBUG(DEBUG_UPCALL, "setting filter mask to 0x%x", listener->mask); + if (unotif->ns) + /* todo */ + ns = NULL; + if (unotif->filter) { + struct aa_dfa *dfa; + void *pos = (void *) unotif + unotif->filter; + + if (unotif->filter >= size || + ALIGN((size_t) pos, 8) != (size_t)pos) { + ret = -EINVAL; + goto out; + } + dfa = aa_dfa_unpack(pos, size - ((void *) unotif - pos), + DFA_FLAG_VERIFY_STATES | + TO_ACCEPT1_FLAG(YYTD_DATA32)); + if (IS_ERR(dfa)) { + ret = PTR_ERR(dfa); + goto out; + } + listener->filter = dfa; + } + if (!aa_register_listener_proxy(listener, ns)) + ret = -ENOMEM; + +out: + kfree(unotif); + + return ret; +} + + +static long notify_user_recv(struct aa_listener *listener, + unsigned long arg) +{ + u16 max_size; + void __user *buf = (void __user *)arg; + + if (copy_from_user(&max_size, buf, sizeof(max_size))) + return -EFAULT; + /* size check handled by individual message handlers */ + return aa_listener_unotif_recv(listener, buf, max_size); +} + +static long notify_user_response(struct aa_listener *listener, + unsigned long arg) +{ + union apparmor_notif_resp uresp = {}; + union apparmor_notif_resp *big_resp = NULL; + long error; + u16 size; + void __user *buf = (void __user *)arg; + + if (copy_from_user(&size, buf, sizeof(size))) + return -EFAULT; + if (size > aa_g_path_max) + return -EMSGSIZE; + if (size > sizeof(uresp)) { + /* TODO: put max size on message */ + big_resp = (union apparmor_notif_resp *) aa_get_buffer(false); + if (big_resp) + return -ENOMEM; + if (copy_from_user(big_resp, buf, size)) { + kfree(big_resp); + return -EFAULT; + } + } else { + size = min_t(size_t, size, sizeof(uresp)); + if (copy_from_user(&uresp, buf, size)) + return -EFAULT; + } + + error = aa_listener_unotif_response(listener, &uresp, size); + aa_put_buffer((char *) big_resp); + + return error; +} + +static long notify_is_id_valid(struct aa_listener *listener, + unsigned long arg) +{ + void __user *buf = (void __user *)arg; + u64 id; + long ret = -ENOENT; + + if (copy_from_user(&id, buf, sizeof(id))) + return -EFAULT; + + spin_lock(&listener->lock); + if (__aa_find_notif(listener, id)) + ret = 0; + spin_unlock(&listener->lock); + + return ret; +} + +static long listener_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + struct aa_listener *listener = file->private_data; + + if (!aa_current_policy_admin_capable(NULL)) + return -EPERM; + if (!listener) + return -EINVAL; + + /* todo permission to issue these commands */ + switch (cmd) { + case APPARMOR_NOTIF_SET_FILTER: + return notify_set_filter(listener, arg); + case APPARMOR_NOTIF_RECV: + return notify_user_recv(listener, arg); + case APPARMOR_NOTIF_SEND: + return notify_user_response(listener, arg); + case APPARMOR_NOTIF_IS_ID_VALID: + return notify_is_id_valid(listener, arg); + default: + return -EINVAL; + + } + + return -EINVAL; +} + +static __poll_t listener_poll(struct file *file, poll_table *pt) +{ + struct aa_listener *listener = file->private_data; + __poll_t mask = 0; + + if (!aa_current_policy_admin_capable(NULL)) + return -EPERM; + + if (listener) { + spin_lock(&listener->lock); + poll_wait(file, &listener->wait, pt); + if (!list_empty(&listener->notifications)) + mask |= EPOLLIN | EPOLLRDNORM; + if (!list_empty(&listener->pending)) + mask |= EPOLLOUT | EPOLLWRNORM; + spin_unlock(&listener->lock); + } + + return mask; +} + +static const struct file_operations aa_sfs_notify_fops = { + .owner = THIS_MODULE, + .open = listener_open, + .poll = listener_poll, +// .read = notification_read, + .llseek = generic_file_llseek, + .release = listener_release, + .unlocked_ioctl = listener_ioctl, +}; + static void profile_query_cb(struct aa_profile *profile, struct aa_perms *perms, const char *match_str, size_t match_len) { @@ -618,23 +830,23 @@ if (profile_unconfined(profile)) return; - if (rules->file.dfa && *match_str == AA_CLASS_FILE) { - state = aa_dfa_match_len(rules->file.dfa, - rules->file.start[AA_CLASS_FILE], + if (rules->file->dfa && *match_str == AA_CLASS_FILE) { + state = aa_dfa_match_len(rules->file->dfa, + rules->file->start[AA_CLASS_FILE], match_str + 1, match_len - 1); if (state) { struct path_cond cond = { }; - tmp = *(aa_lookup_fperms(&(rules->file), state, &cond)); + tmp = *(aa_lookup_fperms(rules->file, state, &cond)); } - } else if (rules->policy.dfa) { + } else if (rules->policy->dfa) { if (!RULE_MEDIATES(rules, *match_str)) return; /* no change to current perms */ - state = aa_dfa_match_len(rules->policy.dfa, - rules->policy.start[0], + state = aa_dfa_match_len(rules->policy->dfa, + rules->policy->start[0], match_str, match_len); if (state) - tmp = *aa_lookup_perms(&rules->policy, state); + tmp = *aa_lookup_perms(rules->policy, state); } aa_apply_modes_to_perms(profile, &tmp); aa_perms_accum_raw(perms, &tmp); @@ -1004,6 +1216,9 @@ case AA_SFS_TYPE_U64: seq_printf(seq, "%#08lx\n", fs_file->v.u64); break; + case AA_SFS_TYPE_INTPTR: + seq_printf(seq, "%d\n", READ_ONCE(*fs_file->v.intptr)); + break; default: /* Ignore unpritable entry types. */ break; @@ -1095,7 +1310,7 @@ struct aa_profile *profile = labels_profile(label); if (profile->attach.xmatch_str) seq_printf(seq, "%s\n", profile->attach.xmatch_str); - else if (profile->attach.xmatch.dfa) + else if (profile->attach.xmatch->dfa) seq_puts(seq, "\n"); else seq_printf(seq, "%s\n", profile->base.name); @@ -1121,10 +1336,24 @@ return 0; } +static int seq_profile_learning_count_show(struct seq_file *seq, void *v) +{ + struct aa_proxy *proxy = seq->private; + struct aa_label *label = aa_get_label_rcu(&proxy->label); + struct aa_profile *profile = labels_profile(label); + int count = READ_ONCE(profile->learning_cache.size); + + seq_printf(seq, "%d\n", count); + aa_put_label(label); + + return 0; +} + SEQ_PROFILE_FOPS(name); SEQ_PROFILE_FOPS(mode); SEQ_PROFILE_FOPS(attach); SEQ_PROFILE_FOPS(hash); +SEQ_PROFILE_FOPS(learning_count); /* * namespace based files @@ -1739,6 +1968,12 @@ goto fail; profile->dents[AAFS_PROF_ATTACH] = dent; + dent = create_profile_file(dir, "learning_count", profile, + &seq_profile_learning_count_fops); + if (IS_ERR(dent)) + goto fail; + profile->dents[AAFS_PROF_LEARNING_COUNT] = dent; + if (profile->hash) { dent = create_profile_file(dir, "sha1", profile, &seq_profile_hash_fops); @@ -1802,7 +2037,8 @@ int error; label = begin_current_label_crit_section(); - error = aa_may_manage_policy(label, NULL, AA_MAY_LOAD_POLICY); + error = aa_may_manage_policy(current_cred(), label, NULL, + AA_MAY_LOAD_POLICY); end_current_label_crit_section(label); if (error) return error; @@ -1851,7 +2087,8 @@ int error; label = begin_current_label_crit_section(); - error = aa_may_manage_policy(label, NULL, AA_MAY_LOAD_POLICY); + error = aa_may_manage_policy(current_cred(), label, NULL, + AA_MAY_LOAD_POLICY); end_current_label_crit_section(label); if (error) return error; @@ -2311,6 +2548,12 @@ { } }; +static struct aa_sfs_entry aa_sfs_entry_ipc[] = { + AA_SFS_FILE_STRING("posix_mqueue", + "create read write open delete setattr getattr"), + { } +}; + static struct aa_sfs_entry aa_sfs_entry_ptrace[] = { AA_SFS_FILE_STRING("mask", "read trace"), { } @@ -2348,22 +2591,47 @@ { } }; +static struct aa_sfs_entry aa_sfs_entry_unconfined[] = { + AA_SFS_FILE_INTPTR("userns", unprivileged_userns_restricted), + AA_SFS_FILE_INTPTR("change_profile", + aa_unprivileged_unconfined_restricted), + AA_SFS_FILE_INTPTR("io_uring", + aa_unprivileged_uring_restricted), + { } +}; + +static struct aa_sfs_entry aa_sfs_entry_profile[] = { + AA_SFS_FILE_BOOLEAN("interruptible", 1), + AA_SFS_FILE_BOOLEAN("disconnected.path", 1), + { } +}; + static struct aa_sfs_entry aa_sfs_entry_policy[] = { AA_SFS_DIR("versions", aa_sfs_entry_versions), AA_SFS_FILE_BOOLEAN("set_load", 1), /* number of out of band transitions supported */ AA_SFS_FILE_U64("outofband", MAX_OOB_SUPPORTED), + AA_SFS_FILE_U64("permstable32_version", 2), + AA_SFS_FILE_STRING("permstable32", "allow deny subtree cond kill complain prompt audit quiet hide xindex tag label"), + AA_SFS_DIR("unconfined_restrictions", aa_sfs_entry_unconfined), { } }; static struct aa_sfs_entry aa_sfs_entry_mount[] = { AA_SFS_FILE_STRING("mask", "mount umount pivot_root"), + AA_SFS_FILE_STRING("move_mount", "detached"), { } }; static struct aa_sfs_entry aa_sfs_entry_ns[] = { AA_SFS_FILE_BOOLEAN("profile", 1), AA_SFS_FILE_BOOLEAN("pivot_root", 0), + AA_SFS_FILE_STRING("mask", "userns_create"), + { } +}; + +static struct aa_sfs_entry aa_sfs_entry_dbus[] = { + AA_SFS_FILE_STRING("mask", "acquire send receive"), { } }; @@ -2378,11 +2646,19 @@ AA_SFS_DIR("label", aa_sfs_entry_query_label), { } }; + +static struct aa_sfs_entry aa_sfs_entry_io_uring[] = { + AA_SFS_FILE_STRING("mask", "sqpoll override_creds"), + { } +}; + static struct aa_sfs_entry aa_sfs_entry_features[] = { AA_SFS_DIR("policy", aa_sfs_entry_policy), AA_SFS_DIR("domain", aa_sfs_entry_domain), AA_SFS_DIR("file", aa_sfs_entry_file), + AA_SFS_DIR("ipc", aa_sfs_entry_ipc), AA_SFS_DIR("network_v8", aa_sfs_entry_network), + AA_SFS_DIR("network", aa_sfs_entry_network_compat), AA_SFS_DIR("mount", aa_sfs_entry_mount), AA_SFS_DIR("namespaces", aa_sfs_entry_ns), AA_SFS_FILE_U64("capability", VFS_CAP_FLAGS_MASK), @@ -2390,12 +2666,15 @@ AA_SFS_DIR("caps", aa_sfs_entry_caps), AA_SFS_DIR("ptrace", aa_sfs_entry_ptrace), AA_SFS_DIR("signal", aa_sfs_entry_signal), + AA_SFS_DIR("dbus", aa_sfs_entry_dbus), AA_SFS_DIR("query", aa_sfs_entry_query), + AA_SFS_DIR("io_uring", aa_sfs_entry_io_uring), { } }; static struct aa_sfs_entry aa_sfs_entry_apparmor[] = { AA_SFS_FILE_FOPS(".access", 0666, &aa_sfs_access), + AA_SFS_FILE_FOPS(".notify", 0666, &aa_sfs_notify_fops), AA_SFS_FILE_FOPS(".stacked", 0444, &seq_ns_stacked_fops), AA_SFS_FILE_FOPS(".ns_stacked", 0444, &seq_ns_nsstacked_fops), AA_SFS_FILE_FOPS(".ns_level", 0444, &seq_ns_level_fops), --- linux-azure-6.5.0.orig/security/apparmor/audit.c +++ linux-azure-6.5.0/security/apparmor/audit.c @@ -58,8 +58,8 @@ "io_uring", "module", "lsm", - "unknown", - "unknown", + "namespace", + "io_uring", "unknown", "unknown", "unknown", @@ -92,30 +92,30 @@ static void audit_pre(struct audit_buffer *ab, void *ca) { struct common_audit_data *sa = ca; + struct apparmor_audit_data *ad = aad(sa); if (aa_g_audit_header) { audit_log_format(ab, "apparmor=\"%s\"", - aa_audit_type[aad(sa)->type]); + aa_audit_type[ad->type]); } - if (aad(sa)->op) { - audit_log_format(ab, " operation=\"%s\"", aad(sa)->op); - } + if (ad->op) + audit_log_format(ab, " operation=\"%s\"", ad->op); - if (aad(sa)->class) + if (ad->class) audit_log_format(ab, " class=\"%s\"", - aad(sa)->class <= AA_CLASS_LAST ? - aa_class_names[aad(sa)->class] : + ad->class <= AA_CLASS_LAST ? + aa_class_names[ad->class] : "unknown"); - if (aad(sa)->info) { - audit_log_format(ab, " info=\"%s\"", aad(sa)->info); - if (aad(sa)->error) - audit_log_format(ab, " error=%d", aad(sa)->error); + if (ad->info) { + audit_log_format(ab, " info=\"%s\"", ad->info); + if (ad->error) + audit_log_format(ab, " error=%d", ad->error); } - if (aad(sa)->label) { - struct aa_label *label = aad(sa)->label; + if (ad->subj_label) { + struct aa_label *label = ad->subj_label; if (label_isprofile(label)) { struct aa_profile *profile = labels_profile(label); @@ -134,42 +134,43 @@ } } - if (aad(sa)->name) { + if (ad->name) { audit_log_format(ab, " name="); - audit_log_untrustedstring(ab, aad(sa)->name); + audit_log_untrustedstring(ab, ad->name); } } /** * aa_audit_msg - Log a message to the audit subsystem - * @sa: audit event structure (NOT NULL) + * @ad: audit event structure (NOT NULL) * @cb: optional callback fn for type specific fields (MAYBE NULL) */ -void aa_audit_msg(int type, struct common_audit_data *sa, +void aa_audit_msg(int type, struct apparmor_audit_data *ad, void (*cb) (struct audit_buffer *, void *)) { - aad(sa)->type = type; - common_lsm_audit(sa, audit_pre, cb); + ad->type = type; + common_lsm_audit(&ad->common, audit_pre, cb); } /** * aa_audit - Log a profile based audit event to the audit subsystem * @type: audit type for the message * @profile: profile to check against (NOT NULL) - * @sa: audit event (NOT NULL) + * @ad: audit event (NOT NULL) * @cb: optional callback fn for type specific fields (MAYBE NULL) * * Handle default message switching based off of audit mode flags * * Returns: error on failure */ -int aa_audit(int type, struct aa_profile *profile, struct common_audit_data *sa, +int aa_audit(int type, struct aa_profile *profile, + struct apparmor_audit_data *ad, void (*cb) (struct audit_buffer *, void *)) { AA_BUG(!profile); if (type == AUDIT_APPARMOR_AUTO) { - if (likely(!aad(sa)->error)) { + if (likely(!ad->error)) { if (AUDIT_MODE(profile) != AUDIT_ALL) return 0; type = AUDIT_APPARMOR_AUDIT; @@ -181,30 +182,32 @@ if (AUDIT_MODE(profile) == AUDIT_QUIET || (type == AUDIT_APPARMOR_DENIED && AUDIT_MODE(profile) == AUDIT_QUIET_DENIED)) - return aad(sa)->error; + return ad->error; if (KILL_MODE(profile) && type == AUDIT_APPARMOR_DENIED) type = AUDIT_APPARMOR_KILL; - aad(sa)->label = &profile->label; + ad->subj_label = &profile->label; - aa_audit_msg(type, sa, cb); + aa_audit_msg(type, ad, cb); - if (aad(sa)->type == AUDIT_APPARMOR_KILL) + if (ad->type == AUDIT_APPARMOR_KILL) (void)send_sig_info(SIGKILL, NULL, - sa->type == LSM_AUDIT_DATA_TASK && sa->u.tsk ? - sa->u.tsk : current); + ad->common.type == LSM_AUDIT_DATA_TASK && + ad->common.u.tsk ? ad->common.u.tsk : current); - if (aad(sa)->type == AUDIT_APPARMOR_ALLOWED) - return complain_error(aad(sa)->error); + if (ad->type == AUDIT_APPARMOR_ALLOWED) + return complain_error(ad->error); - return aad(sa)->error; + return ad->error; } struct aa_audit_rule { struct aa_label *label; }; +/****************************** audit rules *******************************/ + void aa_audit_rule_free(void *vrule) { struct aa_audit_rule *rule = vrule; @@ -288,3 +291,259 @@ } return 0; } + +/****************************** audit cache *******************************/ + +static int uid_cmp(kuid_t lhs, kuid_t rhs) +{ + if (uid_lt(lhs, rhs)) + return -1; + if (uid_gt(lhs, rhs)) + return 1; + return 0; +} + +/* std C cmp. negative is less than, 0 is equal, positive greater than */ +long aa_audit_data_cmp(struct apparmor_audit_data *lhs, + struct apparmor_audit_data *rhs) +{ + long res; + + /* don't compare type */ + res = lhs->class - rhs->class; + if (res) + return res; + /* don't compare op */ + if (lhs->flags & AUDIT_TAILGLOB_NAME) + /* lhs glob matches strings longer than it */ + res = strncmp(lhs->name, rhs->name, strlen(lhs->name)); + else + res = strcmp(lhs->name, rhs->name); + if (res) + return res; + res = aa_label_cmp(lhs->subj_label, rhs->subj_label); + if (res) + return res; + switch (lhs->class) { + case AA_CLASS_FILE: + if (lhs->subj_cred) { + if (rhs->subj_cred) { + return uid_cmp(lhs->subj_cred->fsuid, + rhs->subj_cred->fsuid); + } else { + return 1; + } + } else if (rhs->subj_cred) { + return -1; + } + res = uid_cmp(lhs->fs.ouid, rhs->fs.ouid); + if (res) + return res; + res = lhs->fs.target - rhs->fs.target; + if (res) + return res; + } + return 0; +} + +static void audit_node_free(struct aa_audit_node *node) +{ + if (!node) + return; + + AA_BUG(!list_empty(&node->list)); + + /* common data that needs freed */ + kfree(node->data.name); + aa_put_label(node->data.subj_label); + if (node->data.subj_cred) + put_cred(node->data.subj_cred); + + /* class specific data that needs freed */ + switch (node->data.class) { + case AA_CLASS_FILE: + aa_put_label(node->data.peer); + kfree(node->data.fs.target); + } + + kmem_cache_free(aa_audit_slab, node); +} + +void aa_audit_node_free_kref(struct kref *kref) +{ + struct aa_audit_node *node = container_of(kref, struct aa_audit_node, + count); + audit_node_free(node); +} + +struct aa_audit_node *aa_dup_audit_data(struct apparmor_audit_data *orig, + gfp_t gfp) +{ + struct aa_audit_node *copy; + + copy = kmem_cache_zalloc(aa_audit_slab, gfp); + if (!copy) + return NULL; + kref_init(©->count); + + copy->knotif.ad = ©->data; + INIT_LIST_HEAD(©->list); + /* copy class early so aa_free_audit_node can use switch on failure */ + copy->data.class = orig->class; + copy->data.flags = orig->flags; + + /* handle anything with possible failure first */ + if (orig->name) { + copy->data.name = kstrdup(orig->name, gfp); + if (!copy->data.name) + goto fail; + } + /* don't dup info */ + switch (orig->class) { + case AA_CLASS_FILE: + if (orig->fs.target) { + copy->data.fs.target = kstrdup(orig->fs.target, gfp); + if (!copy->data.fs.target) + goto fail; + } + break; + case AA_CLASS_MOUNT: + if (orig->mnt.src_name) { + copy->data.mnt.src_name = kstrdup(orig->mnt.src_name, gfp); + if (!copy->data.mnt.src_name) + goto fail; + } + if (orig->mnt.type) { + copy->data.mnt.type = kstrdup(orig->mnt.type, gfp); + if (!copy->data.mnt.type) + goto fail; + } + // copy->mnt.trans; not used atm + if (orig->mnt.data) { + copy->data.mnt.data = kstrdup(orig->mnt.data, gfp); + if (!copy->data.mnt.data) + goto fail; + } + break; + } + + /* now inc counts, and copy data that can't fail */ + copy->data.error = orig->error; + copy->data.type = orig->type; + copy->data.request = orig->request; + copy->data.denied = orig->denied; + copy->data.subj_label = aa_get_label(orig->subj_label); + + if (orig->subj_cred) + copy->data.subj_cred = get_cred(orig->subj_cred); + + switch (orig->class) { + case AA_CLASS_NET: + /* + * peer_sk; + * addr; + */ + fallthrough; + case AA_CLASS_FILE: + copy->data.fs.ouid = orig->fs.ouid; + break; + case AA_CLASS_RLIMITS: + case AA_CLASS_SIGNAL: + case AA_CLASS_POSIX_MQUEUE: + copy->data.peer = aa_get_label(orig->peer); + break; +/* + * case AA_CLASS_IFACE: + * copy->data.iface.profile = aa_get_label(orig.iface.profile); + * break; + */ + }; + + + return copy; +fail: + audit_node_free(copy); + return NULL; +} + +#define __audit_cache_find(C, AD, COND...) \ +({ \ + struct aa_audit_node *__node; \ + list_for_each_entry_rcu(__node, &(C)->head, list, COND) { \ + if (aa_audit_data_cmp(&__node->data, AD) == 0) \ + goto __out_skip; \ + } \ + __node = NULL; \ +__out_skip: \ + __node; \ +}) + +// increments refcount on node +struct aa_audit_node *aa_audit_cache_find(struct aa_audit_cache *cache, + struct apparmor_audit_data *ad) +{ + struct aa_audit_node *node; + + rcu_read_lock(); + node = __audit_cache_find(cache, ad); + aa_get_audit_node(node); + rcu_read_unlock(); + + return node; +} + +/** + * aa_audit_cache_insert - insert an audit node into the cache + * @cache: the cache to insert into + * @node: the audit node to insert into the cache + * + * Returns: refcounted matching node in cache OR @node if @node was inserted. + * + * Increments refcount on node if successfully inserted. Assumes caller + * already has valid ref count. + * Increments refcount on existing node if returned + */ +struct aa_audit_node *aa_audit_cache_insert(struct aa_audit_cache *cache, + struct aa_audit_node *node) + +{ + struct aa_audit_node *tmp; + + spin_lock(&cache->lock); + tmp = __audit_cache_find(cache, &node->data, + spin_is_lock(&cache->lock)); + if (!tmp) { + list_add_rcu(&node->list, &cache->head); + tmp = node; + cache->size++; + } + + aa_get_audit_node(tmp); + /* else raced another insert */ + spin_unlock(&cache->lock); + + return tmp; +} + +void aa_audit_cache_update_ent(struct aa_audit_cache *cache, + struct aa_audit_node *node, + struct apparmor_audit_data *data) +{ + spin_lock(&cache->lock); + node->data.denied |= data->denied; + node->data.request = (node->data.request | data->request) & + ~node->data.denied; + spin_unlock(&cache->lock); +} + +/* assumes rcu callback has already happened and list can not be walked */ +void aa_audit_cache_destroy(struct aa_audit_cache *cache) +{ + struct aa_audit_node *node, *tmp; + + list_for_each_entry_safe(node, tmp, &cache->head, list) { + list_del_init(&node->list); + aa_put_audit_node(node); + } + cache->size = 0; +} --- linux-azure-6.5.0.orig/security/apparmor/capability.c +++ linux-azure-6.5.0/security/apparmor/capability.c @@ -51,7 +51,7 @@ /** * audit_caps - audit a capability - * @sa: audit data + * @as: audit data * @profile: profile being tested for confinement (NOT NULL) * @cap: capability tested * @error: error code returned by test @@ -59,9 +59,9 @@ * Do auditing of capability and handle, audit/complain/kill modes switching * and duplicate message elimination. * - * Returns: 0 or sa->error on success, error code on failure + * Returns: 0 or ad->error on success, error code on failure */ -static int audit_caps(struct common_audit_data *sa, struct aa_profile *profile, +static int audit_caps(struct apparmor_audit_data *ad, struct aa_profile *profile, int cap, int error) { struct aa_ruleset *rules = list_first_entry(&profile->rules, @@ -69,7 +69,7 @@ struct audit_cache *ent; int type = AUDIT_APPARMOR_AUTO; - aad(sa)->error = error; + ad->error = error; if (likely(!error)) { /* test if auditing is being forced */ @@ -101,7 +101,7 @@ } put_cpu_var(audit_cache); - return aa_audit(type, profile, sa, audit_cb); + return aa_audit(type, profile, ad, audit_cb); } /** @@ -109,12 +109,12 @@ * @profile: profile being enforced (NOT NULL, NOT unconfined) * @cap: capability to test if allowed * @opts: CAP_OPT_NOAUDIT bit determines whether audit record is generated - * @sa: audit data (MAY BE NULL indicating no auditing) + * @ad: audit data (MAY BE NULL indicating no auditing) * * Returns: 0 if allowed else -EPERM */ static int profile_capable(struct aa_profile *profile, int cap, - unsigned int opts, struct common_audit_data *sa) + unsigned int opts, struct apparmor_audit_data *ad) { struct aa_ruleset *rules = list_first_entry(&profile->rules, typeof(*rules), list); @@ -132,14 +132,15 @@ /* audit the cap request in complain mode but note that it * should be optional. */ - aad(sa)->info = "optional: no audit"; + ad->info = "optional: no audit"; } - return audit_caps(sa, profile, cap, error); + return audit_caps(ad, profile, cap, error); } /** * aa_capable - test permission to use capability + * @subj_cread: cred we are testing capability against * @label: label being tested for capability (NOT NULL) * @cap: capability to be tested * @opts: CAP_OPT_NOAUDIT bit determines whether audit record is generated @@ -148,15 +149,17 @@ * * Returns: 0 on success, or else an error code. */ -int aa_capable(struct aa_label *label, int cap, unsigned int opts) +int aa_capable(const struct cred *subj_cred, struct aa_label *label, + int cap, unsigned int opts) { struct aa_profile *profile; int error = 0; - DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_CAP, AA_CLASS_CAP, OP_CAPABLE); + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_CAP, AA_CLASS_CAP, OP_CAPABLE); - sa.u.cap = cap; + ad.subj_cred = subj_cred; + ad.common.u.cap = cap; error = fn_for_each_confined(label, profile, - profile_capable(profile, cap, opts, &sa)); + profile_capable(profile, cap, opts, &ad)); return error; } --- linux-azure-6.5.0.orig/security/apparmor/crypto.c +++ linux-azure-6.5.0/security/apparmor/crypto.c @@ -25,6 +25,26 @@ return apparmor_hash_size; } +void aa_snprint_hashstr(char *out, unsigned char *hash, unsigned int hsize) +{ + unsigned int i; + + for (i = 0; i < hsize; i++) + sprintf(out + i*2, "%.2x", hash[i]); + out[hsize*2] = 0; +} + +char *aa_asprint_hashstr(unsigned char *hash, unsigned int hsize, gfp_t gfp) +{ + char *buffer = kmalloc(hsize*2 + 1, gfp); + + if (!buffer) + return NULL; + aa_snprint_hashstr(buffer, hash, hsize); + + return buffer; +} + char *aa_calc_hash(void *data, size_t len) { SHASH_DESC_ON_STACK(desc, apparmor_tfm); --- linux-azure-6.5.0.orig/security/apparmor/domain.c +++ linux-azure-6.5.0/security/apparmor/domain.c @@ -31,6 +31,7 @@ /** * may_change_ptraced_domain - check if can change profile on ptraced task + * @cred: cred of task changing domain * @to_label: profile to change to (NOT NULL) * @info: message if there is an error * @@ -39,28 +40,34 @@ * * Returns: %0 or error if change not allowed */ -static int may_change_ptraced_domain(struct aa_label *to_label, +static int may_change_ptraced_domain(const struct cred *to_cred, + struct aa_label *to_label, const char **info) { struct task_struct *tracer; struct aa_label *tracerl = NULL; + const struct cred *tracer_cred = NULL; + int error = 0; rcu_read_lock(); tracer = ptrace_parent(current); - if (tracer) + if (tracer) { /* released below */ tracerl = aa_get_task_label(tracer); - + tracer_cred = get_task_cred(tracer); + } /* not ptraced */ if (!tracer || unconfined(tracerl)) goto out; - error = aa_may_ptrace(tracerl, to_label, PTRACE_MODE_ATTACH); + error = aa_may_ptrace(tracer_cred, tracerl, to_cred, to_label, + PTRACE_MODE_ATTACH); out: rcu_read_unlock(); aa_put_label(tracerl); + put_cred(tracer_cred); if (error) *info = "ptrace prevents transition"; @@ -70,7 +77,7 @@ /**** TODO: dedup to aa_label_match - needs perm and dfa, merging * specifically this is an exact copy of aa_label_match except * aa_compute_perms is replaced with aa_compute_fperms - * and policy.dfa with file.dfa + * and policy->dfa with file->dfa ****/ /* match a profile and its associated ns component if needed * Assumes visibility test has already been done. @@ -86,16 +93,16 @@ const char *ns_name; if (stack) - state = aa_dfa_match(rules->file.dfa, state, "&"); + state = aa_dfa_match(rules->file->dfa, state, "&"); if (profile->ns == tp->ns) - return aa_dfa_match(rules->file.dfa, state, tp->base.hname); + return aa_dfa_match(rules->file->dfa, state, tp->base.hname); /* try matching with namespace name and then profile */ ns_name = aa_ns_name(profile->ns, tp->ns, true); - state = aa_dfa_match_len(rules->file.dfa, state, ":", 1); - state = aa_dfa_match(rules->file.dfa, state, ns_name); - state = aa_dfa_match_len(rules->file.dfa, state, ":", 1); - return aa_dfa_match(rules->file.dfa, state, tp->base.hname); + state = aa_dfa_match_len(rules->file->dfa, state, ":", 1); + state = aa_dfa_match(rules->file->dfa, state, ns_name); + state = aa_dfa_match_len(rules->file->dfa, state, ":", 1); + return aa_dfa_match(rules->file->dfa, state, tp->base.hname); } /** @@ -143,12 +150,12 @@ label_for_each_cont(i, label, tp) { if (!aa_ns_visible(profile->ns, tp->ns, subns)) continue; - state = aa_dfa_match(rules->file.dfa, state, "//&"); + state = aa_dfa_match(rules->file->dfa, state, "//&"); state = match_component(profile, tp, false, state); if (!state) goto fail; } - *perms = *(aa_lookup_fperms(&(rules->file), state, &cond)); + *perms = *(aa_lookup_fperms(rules->file, state, &cond)); aa_apply_modes_to_perms(profile, perms); if ((perms->allow & request) != request) return -EACCES; @@ -203,7 +210,7 @@ return 0; next: - tmp = *(aa_lookup_fperms(&(rules->file), state, &cond)); + tmp = *(aa_lookup_fperms(rules->file, state, &cond)); aa_apply_modes_to_perms(profile, &tmp); aa_perms_accum(perms, &tmp); label_for_each_cont(i, label, tp) { @@ -212,7 +219,7 @@ state = match_component(profile, tp, stack, start); if (!state) goto fail; - tmp = *(aa_lookup_fperms(&(rules->file), state, &cond)); + tmp = *(aa_lookup_fperms(rules->file, state, &cond)); aa_apply_modes_to_perms(profile, &tmp); aa_perms_accum(perms, &tmp); } @@ -309,7 +316,7 @@ might_sleep(); /* transition from exec match to xattr set */ - state = aa_dfa_outofband_transition(attach->xmatch.dfa, state); + state = aa_dfa_outofband_transition(attach->xmatch->dfa, state); d = bprm->file->f_path.dentry; for (i = 0; i < attach->xattr_count; i++) { @@ -323,20 +330,20 @@ * that not present xattr can be distinguished from a 0 * length value or rule that matches any value */ - state = aa_dfa_null_transition(attach->xmatch.dfa, + state = aa_dfa_null_transition(attach->xmatch->dfa, state); /* Check xattr value */ - state = aa_dfa_match_len(attach->xmatch.dfa, state, + state = aa_dfa_match_len(attach->xmatch->dfa, state, value, size); - index = ACCEPT_TABLE(attach->xmatch.dfa)[state]; - perm = attach->xmatch.perms[index].allow; + index = ACCEPT_TABLE(attach->xmatch->dfa)[state]; + perm = attach->xmatch->perms[index].allow; if (!(perm & MAY_EXEC)) { ret = -EINVAL; goto out; } } /* transition to next element */ - state = aa_dfa_outofband_transition(attach->xmatch.dfa, state); + state = aa_dfa_outofband_transition(attach->xmatch->dfa, state); if (size < 0) { /* * No xattr match, so verify if transition to @@ -405,16 +412,16 @@ * as another profile, signal a conflict and refuse to * match. */ - if (attach->xmatch.dfa) { + if (attach->xmatch->dfa) { unsigned int count; aa_state_t state; u32 index, perm; - state = aa_dfa_leftmatch(attach->xmatch.dfa, - attach->xmatch.start[AA_CLASS_XMATCH], + state = aa_dfa_leftmatch(attach->xmatch->dfa, + attach->xmatch->start[AA_CLASS_XMATCH], name, &count); - index = ACCEPT_TABLE(attach->xmatch.dfa)[state]; - perm = attach->xmatch.perms[index].allow; + index = ACCEPT_TABLE(attach->xmatch->dfa)[state]; + perm = attach->xmatch->perms[index].allow; /* any accepting state means a valid match. */ if (perm & MAY_EXEC) { int ret = 0; @@ -517,7 +524,7 @@ /* TODO: move lookup parsing to unpack time so this is a straight * index into the resultant label */ - for (*name = rules->file.trans.table[index]; !label && *name; + for (*name = rules->file->trans.table[index]; !label && *name; *name = next_name(xtype, *name)) { if (xindex & AA_X_CHILD) { struct aa_profile *new_profile; @@ -570,7 +577,7 @@ break; case AA_X_TABLE: /* TODO: fix when perm mapping done at unload */ - stack = rules->file.trans.table[xindex & AA_X_INDEX_MASK]; + stack = rules->file->trans.table[xindex & AA_X_INDEX_MASK]; if (*stack != '&') { /* released by caller */ new = x_table_lookup(profile, xindex, lookupname); @@ -619,7 +626,8 @@ return new; } -static struct aa_label *profile_transition(struct aa_profile *profile, +static struct aa_label *profile_transition(const struct cred *subj_cred, + struct aa_profile *profile, const struct linux_binprm *bprm, char *buffer, struct path_cond *cond, bool *secure_exec) @@ -628,7 +636,7 @@ typeof(*rules), list); struct aa_label *new = NULL; const char *info = NULL, *name = NULL, *target = NULL; - aa_state_t state = rules->file.start[AA_CLASS_FILE]; + aa_state_t state = rules->file->start[AA_CLASS_FILE]; struct aa_perms perms = {}; bool nonewprivs = false; int error = 0; @@ -642,7 +650,7 @@ if (error) { if (profile_unconfined(profile) || (profile->label.flags & FLAG_IX_ON_NAME_ERROR)) { - AA_DEBUG("name lookup ix on error"); + AA_DEBUG(DEBUG_DOMAIN, "name lookup ix on error"); error = 0; new = aa_get_newest_label(&profile->label); } @@ -654,15 +662,15 @@ new = find_attach(bprm, profile->ns, &profile->ns->base.profiles, name, &info); if (new) { - AA_DEBUG("unconfined attached to new label"); + AA_DEBUG(DEBUG_DOMAIN, "unconfined attached to new label"); return new; } - AA_DEBUG("unconfined exec no attachment"); + AA_DEBUG(DEBUG_DOMAIN, "unconfined exec no attachment"); return aa_get_newest_label(&profile->label); } /* find exec permissions for name */ - state = aa_str_perms(&(rules->file), state, name, cond, &perms); + state = aa_str_perms(rules->file, state, name, cond, &perms); if (perms.allow & MAY_EXEC) { /* exec permission determine how to transition */ new = x_to_label(profile, bprm, name, perms.xindex, &target, @@ -709,8 +717,8 @@ } audit: - aa_audit_file(profile, &perms, OP_EXEC, MAY_EXEC, name, target, new, - cond->uid, info, error); + aa_audit_file(subj_cred, profile, &perms, OP_EXEC, MAY_EXEC, name, target, new, + cond->uid, info, error, true); if (!new || nonewprivs) { aa_put_label(new); return ERR_PTR(error); @@ -719,14 +727,15 @@ return new; } -static int profile_onexec(struct aa_profile *profile, struct aa_label *onexec, +static int profile_onexec(const struct cred *subj_cred, + struct aa_profile *profile, struct aa_label *onexec, bool stack, const struct linux_binprm *bprm, char *buffer, struct path_cond *cond, bool *secure_exec) { struct aa_ruleset *rules = list_first_entry(&profile->rules, typeof(*rules), list); - aa_state_t state = rules->file.start[AA_CLASS_FILE]; + aa_state_t state = rules->file->start[AA_CLASS_FILE]; struct aa_perms perms = {}; const char *xname = NULL, *info = "change_profile onexec"; int error = -EACCES; @@ -751,7 +760,7 @@ if (error) { if (profile_unconfined(profile) || (profile->label.flags & FLAG_IX_ON_NAME_ERROR)) { - AA_DEBUG("name lookup ix on error"); + AA_DEBUG(DEBUG_DOMAIN, "name lookup ix on error"); error = 0; } xname = bprm->filename; @@ -759,7 +768,7 @@ } /* find exec permissions for name */ - state = aa_str_perms(&(rules->file), state, xname, cond, &perms); + state = aa_str_perms(rules->file, state, xname, cond, &perms); if (!(perms.allow & AA_MAY_ONEXEC)) { info = "no change_onexec valid for executable"; goto audit; @@ -768,7 +777,7 @@ * onexec permission is linked to exec with a standard pairing * exec\0change_profile */ - state = aa_dfa_null_transition(rules->file.dfa, state); + state = aa_dfa_null_transition(rules->file->dfa, state); error = change_profile_perms(profile, onexec, stack, AA_MAY_ONEXEC, state, &perms); if (error) { @@ -787,13 +796,15 @@ } audit: - return aa_audit_file(profile, &perms, OP_EXEC, AA_MAY_ONEXEC, xname, - NULL, onexec, cond->uid, info, error); + return aa_audit_file(subj_cred, profile, &perms, OP_EXEC, + AA_MAY_ONEXEC, xname, + NULL, onexec, cond->uid, info, error, false); } /* ensure none ns domain transitions are correctly applied with onexec */ -static struct aa_label *handle_onexec(struct aa_label *label, +static struct aa_label *handle_onexec(const struct cred *subj_cred, + struct aa_label *label, struct aa_label *onexec, bool stack, const struct linux_binprm *bprm, char *buffer, struct path_cond *cond, @@ -810,26 +821,28 @@ if (!stack) { error = fn_for_each_in_ns(label, profile, - profile_onexec(profile, onexec, stack, + profile_onexec(subj_cred, profile, onexec, stack, bprm, buffer, cond, unsafe)); if (error) return ERR_PTR(error); new = fn_label_build_in_ns(label, profile, GFP_KERNEL, aa_get_newest_label(onexec), - profile_transition(profile, bprm, buffer, + profile_transition(subj_cred, profile, bprm, + buffer, cond, unsafe)); } else { /* TODO: determine how much we want to loosen this */ error = fn_for_each_in_ns(label, profile, - profile_onexec(profile, onexec, stack, bprm, + profile_onexec(subj_cred, profile, onexec, stack, bprm, buffer, cond, unsafe)); if (error) return ERR_PTR(error); new = fn_label_build_in_ns(label, profile, GFP_KERNEL, aa_label_merge(&profile->label, onexec, GFP_KERNEL), - profile_transition(profile, bprm, buffer, + profile_transition(subj_cred, profile, bprm, + buffer, cond, unsafe)); } @@ -838,10 +851,11 @@ /* TODO: get rid of GLOBAL_ROOT_UID */ error = fn_for_each_in_ns(label, profile, - aa_audit_file(profile, &nullperms, OP_CHANGE_ONEXEC, + aa_audit_file(subj_cred, profile, &nullperms, + OP_CHANGE_ONEXEC, AA_MAY_ONEXEC, bprm->filename, NULL, onexec, GLOBAL_ROOT_UID, - "failed to build target label", -ENOMEM)); + "failed to build target label", -ENOMEM, false)); return ERR_PTR(error); } @@ -857,6 +871,7 @@ { struct aa_task_ctx *ctx; struct aa_label *label, *new = NULL; + const struct cred *subj_cred; struct aa_profile *profile; char *buffer = NULL; const char *info = NULL; @@ -869,6 +884,7 @@ file_inode(bprm->file)->i_mode }; + subj_cred = current_cred(); ctx = task_ctx(current); AA_BUG(!cred_label(bprm->cred)); AA_BUG(!ctx); @@ -895,11 +911,12 @@ /* Test for onexec first as onexec override other x transitions. */ if (ctx->onexec) - new = handle_onexec(label, ctx->onexec, ctx->token, + new = handle_onexec(subj_cred, label, ctx->onexec, ctx->token, bprm, buffer, &cond, &unsafe); else new = fn_label_build(label, profile, GFP_KERNEL, - profile_transition(profile, bprm, buffer, + profile_transition(subj_cred, profile, bprm, + buffer, &cond, &unsafe)); AA_BUG(!new); @@ -934,7 +951,7 @@ if (bprm->unsafe & (LSM_UNSAFE_PTRACE)) { /* TODO: test needs to be profile of label to new */ - error = may_change_ptraced_domain(new, &info); + error = may_change_ptraced_domain(bprm->cred, new, &info); if (error) goto audit; } @@ -971,9 +988,11 @@ audit: error = fn_for_each(label, profile, - aa_audit_file(profile, &nullperms, OP_EXEC, MAY_EXEC, + aa_audit_file(current_cred(), profile, &nullperms, + OP_EXEC, MAY_EXEC, bprm->filename, NULL, new, - vfsuid_into_kuid(vfsuid), info, error)); + vfsuid_into_kuid(vfsuid), info, error, + false)); aa_put_label(new); goto done; } @@ -987,7 +1006,8 @@ * * Returns: label for hat transition OR ERR_PTR. Does NOT return NULL */ -static struct aa_label *build_change_hat(struct aa_profile *profile, +static struct aa_label *build_change_hat(const struct cred *subj_cred, + struct aa_profile *profile, const char *name, bool sibling) { struct aa_profile *root, *hat = NULL; @@ -1019,10 +1039,11 @@ aa_put_profile(root); audit: - aa_audit_file(profile, &nullperms, OP_CHANGE_HAT, AA_MAY_CHANGEHAT, + aa_audit_file(subj_cred, profile, &nullperms, OP_CHANGE_HAT, + AA_MAY_CHANGEHAT, name, hat ? hat->base.hname : NULL, hat ? &hat->label : NULL, GLOBAL_ROOT_UID, info, - error); + error, false); if (!hat || (error && error != -ENOENT)) return ERR_PTR(error); /* if hat && error - complain mode, already audited and we adjust for @@ -1035,7 +1056,8 @@ * * Returns: label for hat transition or ERR_PTR. Does not return NULL */ -static struct aa_label *change_hat(struct aa_label *label, const char *hats[], +static struct aa_label *change_hat(const struct cred *subj_cred, + struct aa_label *label, const char *hats[], int count, int flags) { struct aa_profile *profile, *root, *hat = NULL; @@ -1111,16 +1133,18 @@ */ /* TODO: get rid of GLOBAL_ROOT_UID */ if (count > 1 || COMPLAIN_MODE(profile)) { - aa_audit_file(profile, &nullperms, OP_CHANGE_HAT, + aa_audit_file(subj_cred, profile, &nullperms, + OP_CHANGE_HAT, AA_MAY_CHANGEHAT, name, NULL, NULL, - GLOBAL_ROOT_UID, info, error); + GLOBAL_ROOT_UID, info, error, false); } } return ERR_PTR(error); build: new = fn_label_build_in_ns(label, profile, GFP_KERNEL, - build_change_hat(profile, name, sibling), + build_change_hat(subj_cred, profile, name, + sibling), aa_get_label(&profile->label)); if (!new) { info = "label build failed"; @@ -1150,7 +1174,7 @@ */ int aa_change_hat(const char *hats[], int count, u64 token, int flags) { - const struct cred *cred; + const struct cred *subj_cred; struct aa_task_ctx *ctx = task_ctx(current); struct aa_label *label, *previous, *new = NULL, *target = NULL; struct aa_profile *profile; @@ -1159,8 +1183,8 @@ int error = 0; /* released below */ - cred = get_current_cred(); - label = aa_get_newest_cred_label(cred); + subj_cred = get_current_cred(); + label = aa_get_newest_cred_label(subj_cred); previous = aa_get_newest_label(ctx->previous); /* @@ -1180,7 +1204,7 @@ } if (count) { - new = change_hat(label, hats, count, flags); + new = change_hat(subj_cred, label, hats, count, flags); AA_BUG(!new); if (IS_ERR(new)) { error = PTR_ERR(new); @@ -1189,7 +1213,8 @@ goto out; } - error = may_change_ptraced_domain(new, &info); + /* target cred is the same as current except new label */ + error = may_change_ptraced_domain(subj_cred, new, &info); if (error) goto fail; @@ -1200,7 +1225,8 @@ if (task_no_new_privs(current) && !unconfined(label) && !aa_label_is_unconfined_subset(new, ctx->nnp)) { /* not an apparmor denial per se, so don't log it */ - AA_DEBUG("no_new_privs - change_hat denied"); + AA_DEBUG(DEBUG_DOMAIN, + "no_new_privs - change_hat denied"); error = -EPERM; goto out; } @@ -1221,7 +1247,8 @@ if (task_no_new_privs(current) && !unconfined(label) && !aa_label_is_unconfined_subset(previous, ctx->nnp)) { /* not an apparmor denial per se, so don't log it */ - AA_DEBUG("no_new_privs - change_hat denied"); + AA_DEBUG(DEBUG_DOMAIN, + "no_new_privs - change_hat denied"); error = -EPERM; goto out; } @@ -1242,7 +1269,7 @@ aa_put_label(new); aa_put_label(previous); aa_put_label(label); - put_cred(cred); + put_cred(subj_cred); return error; @@ -1252,15 +1279,16 @@ fail: fn_for_each_in_ns(label, profile, - aa_audit_file(profile, &perms, OP_CHANGE_HAT, + aa_audit_file(subj_cred, profile, &perms, OP_CHANGE_HAT, AA_MAY_CHANGEHAT, NULL, NULL, target, - GLOBAL_ROOT_UID, info, error)); + GLOBAL_ROOT_UID, info, error, false)); goto out; } static int change_profile_perms_wrapper(const char *op, const char *name, + const struct cred *subj_cred, struct aa_profile *profile, struct aa_label *target, bool stack, u32 request, struct aa_perms *perms) @@ -1272,12 +1300,13 @@ if (!error) error = change_profile_perms(profile, target, stack, request, - rules->file.start[AA_CLASS_FILE], + rules->file->start[AA_CLASS_FILE], perms); if (error) - error = aa_audit_file(profile, perms, op, request, name, + error = aa_audit_file(subj_cred, profile, perms, op, request, + name, NULL, target, GLOBAL_ROOT_UID, info, - error); + error, false); return error; } @@ -1304,6 +1333,7 @@ const char *auditname = fqname; /* retain leading & if stack */ bool stack = flags & AA_CHANGE_STACK; struct aa_task_ctx *ctx = task_ctx(current); + const struct cred *subj_cred = get_current_cred(); int error = 0; char *op; u32 request; @@ -1322,7 +1352,7 @@ if (!fqname || !*fqname) { aa_put_label(label); - AA_DEBUG("no profile name"); + AA_DEBUG(DEBUG_DOMAIN, "no profile name"); return -EINVAL; } @@ -1340,6 +1370,30 @@ op = OP_CHANGE_PROFILE; } + /* This should move to a per profile test. Requires pushing build + * into callback + */ + if (!stack && unconfined(label) && + label == &labels_ns(label)->unconfined->label && + aa_unprivileged_unconfined_restricted && + /* TODO: refactor so this check is a fn */ + cap_capable(current_cred(), &init_user_ns, CAP_MAC_OVERRIDE, + CAP_OPT_NOAUDIT)) { + /* regardless of the request in this case apparmor + * stacks against unconfined so admin set policy can't be + * by-passed + */ + stack = true; + perms.audit = request; + (void) fn_for_each_in_ns(label, profile, + aa_audit_file(subj_cred, profile, &perms, op, + request, auditname, NULL, target, + GLOBAL_ROOT_UID, + "change_profile unprivileged unconfined converted to stacking", + 0, false)); + perms.audit = 0; + } + if (*fqname == '&') { stack = true; /* don't have label_parse() do stacking */ @@ -1381,6 +1435,7 @@ */ error = fn_for_each_in_ns(label, profile, change_profile_perms_wrapper(op, auditname, + subj_cred, profile, target, stack, request, &perms)); if (error) @@ -1391,7 +1446,7 @@ check: /* check if tracing task is allowed to trace target domain */ - error = may_change_ptraced_domain(target, &info); + error = may_change_ptraced_domain(subj_cred, target, &info); if (error && !fn_for_each_in_ns(label, profile, COMPLAIN_MODE(profile))) goto audit; @@ -1418,7 +1473,8 @@ if (task_no_new_privs(current) && !unconfined(label) && !aa_label_is_unconfined_subset(new, ctx->nnp)) { /* not an apparmor denial per se, so don't log it */ - AA_DEBUG("no_new_privs - change_hat denied"); + AA_DEBUG(DEBUG_DOMAIN, + "no_new_privs - change_hat denied"); error = -EPERM; goto out; } @@ -1451,14 +1507,16 @@ audit: error = fn_for_each_in_ns(label, profile, - aa_audit_file(profile, &perms, op, request, auditname, + aa_audit_file(subj_cred, + profile, &perms, op, request, auditname, NULL, new ? new : target, - GLOBAL_ROOT_UID, info, error)); + GLOBAL_ROOT_UID, info, error, false)); out: aa_put_label(new); aa_put_label(target); aa_put_label(label); + put_cred(subj_cred); return error; } --- linux-azure-6.5.0.orig/security/apparmor/file.c +++ linux-azure-6.5.0/security/apparmor/file.c @@ -13,13 +13,17 @@ #include #include #include +#include +#include "include/af_unix.h" #include "include/apparmor.h" #include "include/audit.h" #include "include/cred.h" #include "include/file.h" +#include "include/ipc.h" #include "include/match.h" #include "include/net.h" +#include "include/notify.h" #include "include/path.h" #include "include/policy.h" #include "include/label.h" @@ -44,38 +48,138 @@ static void file_audit_cb(struct audit_buffer *ab, void *va) { struct common_audit_data *sa = va; - kuid_t fsuid = current_fsuid(); + struct apparmor_audit_data *ad = aad(sa); + kuid_t fsuid = ad->subj_cred ? ad->subj_cred->fsuid : current_fsuid(); char str[10]; - if (aad(sa)->request & AA_AUDIT_FILE_MASK) { + if (ad->request & AA_AUDIT_FILE_MASK) { aa_perm_mask_to_str(str, sizeof(str), aa_file_perm_chrs, - map_mask_to_chr_mask(aad(sa)->request)); + map_mask_to_chr_mask(ad->request)); audit_log_format(ab, " requested_mask=\"%s\"", str); } - if (aad(sa)->denied & AA_AUDIT_FILE_MASK) { + if (ad->denied & AA_AUDIT_FILE_MASK) { aa_perm_mask_to_str(str, sizeof(str), aa_file_perm_chrs, - map_mask_to_chr_mask(aad(sa)->denied)); + map_mask_to_chr_mask(ad->denied)); audit_log_format(ab, " denied_mask=\"%s\"", str); } - if (aad(sa)->request & AA_AUDIT_FILE_MASK) { + if (ad->request & AA_AUDIT_FILE_MASK) { audit_log_format(ab, " fsuid=%d", from_kuid(&init_user_ns, fsuid)); audit_log_format(ab, " ouid=%d", - from_kuid(&init_user_ns, aad(sa)->fs.ouid)); + from_kuid(&init_user_ns, ad->fs.ouid)); } - if (aad(sa)->peer) { + if (ad->peer) { audit_log_format(ab, " target="); - aa_label_xaudit(ab, labels_ns(aad(sa)->label), aad(sa)->peer, + aa_label_xaudit(ab, labels_ns(ad->subj_label), ad->peer, FLAG_VIEW_SUBNS, GFP_KERNEL); - } else if (aad(sa)->fs.target) { + } else if (ad->fs.target) { audit_log_format(ab, " target="); - audit_log_untrustedstring(ab, aad(sa)->fs.target); + audit_log_untrustedstring(ab, ad->fs.target); } } +// ??? differentiate between +// cached - allow : no audit == 1 +// cached - deny : no audit < 0 +// cached - complain : no audit +// cached - partial : audit missing part : as miss +// not cached = 0 +static int check_cache(struct aa_profile *profile, + struct apparmor_audit_data *ad) +{ + struct aa_audit_node *hit; + + AA_BUG(!profile); + ad->subj_label = &profile->label; // normally set in aa_audit + + /* TODO: need rcu locking around whole check once we allow + * removing node from cache + */ + AA_DEBUG(DEBUG_UPCALL, "cache check: profile '%s', pid %d name:'%s'", + profile->base.hname, current->pid, ad->name); + hit = aa_audit_cache_find(&profile->learning_cache, ad); + if (hit) { + AA_DEBUG(DEBUG_UPCALL, " matched node in audit cache"); + if (ad->request & hit->data.denied) { + /* this request could only partly succeed prompting for + * the part and failing makes no sense + */ + AA_DEBUG(DEBUG_UPCALL, + " hit denied, request: 0x%x by cached deny 0x%x\n", + ad->request, hit->data.denied); + aa_put_audit_node(hit); + return ad->error; + } else if (ad->request & ~hit->data.request) { + /* asking for more perms than is cached */ + AA_DEBUG(DEBUG_UPCALL, + " miss insufficient perms, request: 0x%x cached 0x%x\n", + ad->request, hit->data.request); + /* continue to do prompt */ + } else { + AA_DEBUG(DEBUG_UPCALL, "cache hit->error %d. returning 0", + hit->data.error); + aa_put_audit_node(hit); + /* don't audit: if its in the cache already audited */ + return 0; + } + aa_put_audit_node(hit); + } else { + AA_DEBUG(DEBUG_UPCALL, "cache miss"); + } + + return 1; +} + +// error - immediate return +// - debug message do audit +// caching is handled on listener task side +static int check_user(struct aa_profile *profile, + struct apparmor_audit_data *ad, + struct aa_perms *perms) +{ + struct aa_audit_node *node = NULL; + int err; + + /* assume we are going to dispatch */ + node = aa_dup_audit_data(ad, GFP_KERNEL); + if (!node) { + AA_DEBUG(DEBUG_UPCALL, + "notifcation failed to duplicate with error -ENOMEM\n"); + /* do audit */ + return -ENOMEM; + } + + get_task_struct(current); + node->data.subjtsk = current; + node->data.type = AUDIT_APPARMOR_USER; + node->data.request = ad->request; + node->data.denied = ad->request & ~perms->allow; + err = aa_do_notification(APPARMOR_NOTIF_OP, node); + put_task_struct(node->data.subjtsk); + + if (err) { + // do we want to do something special with -ERESTARTSYS + AA_DEBUG(DEBUG_UPCALL, "notifcation failed with error %d\n", + err); + goto return_to_audit; + } + + /* update based on node data for audit */ + perms->deny = node->data.denied; + perms->allow = node->data.request & ~node->data.denied; + ad->request |= node->data.request; + ad->denied = node->data.denied; + ad->error = node->data.error; + +return_to_audit: + aa_put_audit_node(node); + return err; +} + /** * aa_audit_file - handle the auditing of file operations + * @subj_cred: cred of the subject * @profile: the profile being enforced (NOT NULL) * @perms: the permissions computed for the request (NOT NULL) * @op: operation being mediated @@ -89,59 +193,114 @@ * * Returns: %0 or error on failure */ -int aa_audit_file(struct aa_profile *profile, struct aa_perms *perms, +int aa_audit_file(const struct cred *subj_cred, + struct aa_profile *profile, struct aa_perms *perms, const char *op, u32 request, const char *name, const char *target, struct aa_label *tlabel, - kuid_t ouid, const char *info, int error) + kuid_t ouid, const char *info, int error, bool prompt) { int type = AUDIT_APPARMOR_AUTO; - DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_TASK, AA_CLASS_FILE, op); + int err; + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_TASK, AA_CLASS_FILE, op); - sa.u.tsk = NULL; - aad(&sa)->request = request; - aad(&sa)->name = name; - aad(&sa)->fs.target = target; - aad(&sa)->peer = tlabel; - aad(&sa)->fs.ouid = ouid; - aad(&sa)->info = info; - aad(&sa)->error = error; - sa.u.tsk = NULL; + ad.subj_cred = subj_cred; + ad.request = request; + ad.name = name; + ad.fs.target = target; + ad.peer = tlabel; + ad.fs.ouid = ouid; + ad.info = info; + ad.error = error; + ad.common.u.tsk = NULL; + ad.subjtsk = NULL; + + ad.denied = denied_perms(perms, ad.request); + + if (unlikely(ad.error)) { + u32 implicit_deny; + + /* learning cache - not audit dedup yet */ + err = check_cache(profile, &ad); + if (err <= 0) { + AA_DEBUG(DEBUG_UPCALL, "cache early bail %d\n", err); + /* cached */ + return err; + } + implicit_deny = (ad.request & ~perms->allow) & ~perms->deny; + if (USER_MODE(profile)) + perms->prompt = ALL_PERMS_MASK; + + if (ad.request & MAY_EXEC) + AA_DEBUG(DEBUG_UPCALL, + "do prompt %d: exec req 0x%x, allow 0x%x, deny 0x%x, ideny 0x%x, prompt 0x%x", + prompt, ad.request, perms->allow, perms->deny, + implicit_deny, perms->prompt); + + /* don't prompt + * - if explicit deny + * - if implicit_deny is not entirely covered by prompt + * as no point asking user to just deny it anyway. + */ + if (prompt && !(request & perms->deny) && + (perms->prompt & implicit_deny) == implicit_deny) { + err = check_user(profile, &ad, perms); + if (err == -ERESTARTSYS) { + AA_DEBUG(DEBUG_UPCALL, " check user returned -ERESTART_SYS"); + /* are there other errors we should bail on */ + return err; + } + } + } - if (likely(!aad(&sa)->error)) { + if (likely(!ad.error)) { u32 mask = perms->audit; if (unlikely(AUDIT_MODE(profile) == AUDIT_ALL)) mask = 0xffff; /* mask off perms that are not being force audited */ - aad(&sa)->request &= mask; + ad.request &= mask; - if (likely(!aad(&sa)->request)) + if (likely(!ad.request)) return 0; type = AUDIT_APPARMOR_AUDIT; } else { /* only report permissions that were denied */ - aad(&sa)->request = aad(&sa)->request & ~perms->allow; - AA_BUG(!aad(&sa)->request); + ad.request = ad.request & ~perms->allow; + AA_BUG(!ad.request); - if (aad(&sa)->request & perms->kill) + if (ad.request & perms->kill) type = AUDIT_APPARMOR_KILL; /* quiet known rejects, assumes quiet and kill do not overlap */ - if ((aad(&sa)->request & perms->quiet) && + if ((ad.request & perms->quiet) && AUDIT_MODE(profile) != AUDIT_NOQUIET && AUDIT_MODE(profile) != AUDIT_ALL) - aad(&sa)->request &= ~perms->quiet; + ad.request &= ~perms->quiet; - if (!aad(&sa)->request) - return aad(&sa)->error; + if (!ad.request) + return ad.error; } - aad(&sa)->denied = aad(&sa)->request & ~perms->allow; - return aa_audit(type, profile, &sa, file_audit_cb); + err = aa_audit(type, profile, &ad, file_audit_cb); + return err; } -static int path_name(const char *op, struct aa_label *label, +/** + * is_deleted - test if a file has been completely unlinked + * @dentry: dentry of file to test for deletion (NOT NULL) + * + * Returns: true if deleted else false + */ +static inline bool is_deleted(struct dentry *dentry) +{ + if (d_unlinked(dentry) && d_backing_inode(dentry)->i_nlink == 0) + return true; + return false; +} + +static int path_name(const char *op, const struct cred *subj_cred, + struct aa_label *label, const struct path *path, int flags, char *buffer, const char **name, struct path_cond *cond, u32 request) { @@ -153,8 +312,9 @@ labels_profile(label)->disconnected); if (error) { fn_for_each_confined(label, profile, - aa_audit_file(profile, &nullperms, op, request, *name, - NULL, NULL, cond->uid, info, error)); + aa_audit_file(subj_cred, + profile, &nullperms, op, request, *name, + NULL, NULL, cond->uid, info, error, true)); return error; } @@ -207,30 +367,33 @@ return state; } -static int __aa_path_perm(const char *op, struct aa_profile *profile, - const char *name, u32 request, - struct path_cond *cond, int flags, - struct aa_perms *perms) +int __aa_path_perm(const char *op, const struct cred *subj_cred, + struct aa_profile *profile, const char *name, + u32 request, struct path_cond *cond, int flags, + struct aa_perms *perms, bool prompt) { struct aa_ruleset *rules = list_first_entry(&profile->rules, typeof(*rules), list); int e = 0; - if (profile_unconfined(profile)) + if (profile_unconfined(profile) || + ((flags & PATH_SOCK_COND) && !RULE_MEDIATES_AF(rules, AF_UNIX))) return 0; - aa_str_perms(&(rules->file), rules->file.start[AA_CLASS_FILE], + aa_str_perms(rules->file, rules->file->start[AA_CLASS_FILE], name, cond, perms); if (request & ~perms->allow) e = -EACCES; - return aa_audit_file(profile, perms, op, request, name, NULL, NULL, - cond->uid, NULL, e); + return aa_audit_file(subj_cred, + profile, perms, op, request, name, NULL, NULL, + cond->uid, NULL, e, prompt); } -static int profile_path_perm(const char *op, struct aa_profile *profile, +static int profile_path_perm(const char *op, const struct cred *subj_cred, + struct aa_profile *profile, const struct path *path, char *buffer, u32 request, struct path_cond *cond, int flags, - struct aa_perms *perms) + struct aa_perms *perms, bool prompt) { const char *name; int error; @@ -238,18 +401,19 @@ if (profile_unconfined(profile)) return 0; - error = path_name(op, &profile->label, path, + error = path_name(op, subj_cred, &profile->label, path, flags | profile->path_flags, buffer, &name, cond, request); if (error) return error; - return __aa_path_perm(op, profile, name, request, cond, flags, - perms); + return __aa_path_perm(op, subj_cred, profile, name, request, cond, + flags, perms, prompt); } /** * aa_path_perm - do permissions check & audit for @path * @op: operation being checked + * @subj_cred: subject cred * @label: profile being enforced (NOT NULL) * @path: path to check permissions of (NOT NULL) * @flags: any additional path flags beyond what the profile specifies @@ -258,7 +422,8 @@ * * Returns: %0 else error if access denied or other error */ -int aa_path_perm(const char *op, struct aa_label *label, +int aa_path_perm(const char *op, const struct cred *subj_cred, + struct aa_label *label, const struct path *path, int flags, u32 request, struct path_cond *cond) { @@ -273,8 +438,9 @@ if (!buffer) return -ENOMEM; error = fn_for_each_confined(label, profile, - profile_path_perm(op, profile, path, buffer, request, - cond, flags, &perms)); + profile_path_perm(op, subj_cred, profile, path, + buffer, request, + cond, flags, &perms, true)); aa_put_buffer(buffer); @@ -301,7 +467,8 @@ return true; } -static int profile_path_link(struct aa_profile *profile, +static int profile_path_link(const struct cred *subj_cred, + struct aa_profile *profile, const struct path *link, char *buffer, const struct path *target, char *buffer2, struct path_cond *cond) @@ -315,29 +482,31 @@ aa_state_t state; int error; - error = path_name(OP_LINK, &profile->label, link, profile->path_flags, + error = path_name(OP_LINK, subj_cred, &profile->label, link, + profile->path_flags, buffer, &lname, cond, AA_MAY_LINK); if (error) goto audit; /* buffer2 freed below, tname is pointer in buffer2 */ - error = path_name(OP_LINK, &profile->label, target, profile->path_flags, + error = path_name(OP_LINK, subj_cred, &profile->label, target, + profile->path_flags, buffer2, &tname, cond, AA_MAY_LINK); if (error) goto audit; error = -EACCES; /* aa_str_perms - handles the case of the dfa being NULL */ - state = aa_str_perms(&(rules->file), - rules->file.start[AA_CLASS_FILE], lname, + state = aa_str_perms(rules->file, + rules->file->start[AA_CLASS_FILE], lname, cond, &lperms); if (!(lperms.allow & AA_MAY_LINK)) goto audit; /* test to see if target can be paired with link */ - state = aa_dfa_null_transition(rules->file.dfa, state); - aa_str_perms(&(rules->file), state, tname, cond, &perms); + state = aa_dfa_null_transition(rules->file->dfa, state); + aa_str_perms(rules->file, state, tname, cond, &perms); /* force audit/quiet masks for link are stored in the second entry * in the link pair. @@ -359,7 +528,7 @@ /* Do link perm subset test requiring allowed permission on link are * a subset of the allowed permissions on target. */ - aa_str_perms(&(rules->file), rules->file.start[AA_CLASS_FILE], + aa_str_perms(rules->file, rules->file->start[AA_CLASS_FILE], tname, cond, &perms); /* AA_MAY_LINK is not considered in the subset test */ @@ -381,12 +550,14 @@ error = 0; audit: - return aa_audit_file(profile, &lperms, OP_LINK, request, lname, tname, - NULL, cond->uid, info, error); + return aa_audit_file(subj_cred, profile, &lperms, OP_LINK, request, + lname, tname, + NULL, cond->uid, info, error, false); } /** * aa_path_link - Handle hard link permission check + * @subj_cred: subject cred * @label: the label being enforced (NOT NULL) * @old_dentry: the target dentry (NOT NULL) * @new_dir: directory the new link will be created in (NOT NULL) @@ -403,7 +574,8 @@ * * Returns: %0 if allowed else error */ -int aa_path_link(struct aa_label *label, struct dentry *old_dentry, +int aa_path_link(const struct cred *subj_cred, + struct aa_label *label, struct dentry *old_dentry, const struct path *new_dir, struct dentry *new_dentry) { struct path link = { .mnt = new_dir->mnt, .dentry = new_dentry }; @@ -424,8 +596,8 @@ goto out; error = fn_for_each_confined(label, profile, - profile_path_link(profile, &link, buffer, &target, - buffer2, &cond)); + profile_path_link(subj_cred, profile, &link, buffer, + &target, buffer2, &cond)); out: aa_put_buffer(buffer); aa_put_buffer(buffer2); @@ -453,7 +625,8 @@ spin_unlock(&fctx->lock); } -static int __file_path_perm(const char *op, struct aa_label *label, +static int __file_path_perm(const char *op, const struct cred *subj_cred, + struct aa_label *label, struct aa_label *flabel, struct file *file, u32 request, u32 denied, bool in_atomic) { @@ -480,8 +653,9 @@ /* check every profile in task label not in current cache */ error = fn_for_each_not_in_set(flabel, label, profile, - profile_path_perm(op, profile, &file->f_path, buffer, - request, &cond, flags, &perms)); + profile_path_perm(op, subj_cred, profile, + &file->f_path, buffer, + request, &cond, flags, &perms, false)); if (denied && !error) { /* * check every profile in file label that was not tested @@ -493,14 +667,16 @@ */ if (label == flabel) error = fn_for_each(label, profile, - profile_path_perm(op, profile, &file->f_path, + profile_path_perm(op, subj_cred, + profile, &file->f_path, buffer, request, &cond, flags, - &perms)); + &perms, false)); else error = fn_for_each_not_in_set(label, flabel, profile, - profile_path_perm(op, profile, &file->f_path, + profile_path_perm(op, subj_cred, + profile, &file->f_path, buffer, request, &cond, flags, - &perms)); + &perms, false)); } if (!error) update_file_ctx(file_ctx(file), label, request); @@ -510,7 +686,8 @@ return error; } -static int __file_sock_perm(const char *op, struct aa_label *label, +static int __file_sock_perm(const char *op, const struct cred *subj_cred, + struct aa_label *label, struct aa_label *flabel, struct file *file, u32 request, u32 denied) { @@ -524,11 +701,12 @@ return 0; /* TODO: improve to skip profiles cached in flabel */ - error = aa_sock_file_perm(label, op, request, sock); + error = aa_sock_file_perm(subj_cred, label, op, request, sock); if (denied) { /* TODO: improve to skip profiles checked above */ /* check every profile in file label to is cached */ - last_error(error, aa_sock_file_perm(flabel, op, request, sock)); + last_error(error, aa_sock_file_perm(subj_cred, flabel, op, + request, sock)); } if (!error) update_file_ctx(file_ctx(file), label, request); @@ -536,9 +714,65 @@ return error; } +/* TODO: combine with __file_path_perm */ +static int __file_mqueue_perm(const char *op, const struct cred *subj_cred, + struct aa_label *label, + struct aa_label *flabel, struct file *file, + u32 request, u32 denied, bool in_atomic) +{ + struct aa_profile *profile; + char *buffer; + int error; + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_POSIX_MQUEUE, op); + + /* revalidation due to label out of date. No revocation at this time */ + if (!denied && aa_label_is_subset(flabel, label)) + /* TODO: check for revocation on stale profiles */ + return 0; + + buffer = aa_get_buffer(in_atomic); + if (!buffer) + return -ENOMEM; + + ad.subj_cred = subj_cred; + ad.request = request; + ad.peer = NULL; + ad.mq.ouid = file_inode(file)->i_uid; + + /* check every profile in task label not in current cache */ + error = fn_for_each_not_in_set(flabel, label, profile, + aa_profile_mqueue_perm(profile, &file->f_path, + request, buffer, &ad)); + if (denied && !error) { + /* + * check every profile in file label that was not tested + * in the initial check above. + * + * TODO: cache full perms so this only happens because of + * conditionals + * TODO: don't audit here + */ + if (label == flabel) + error = fn_for_each(label, profile, + aa_profile_mqueue_perm(profile, &file->f_path, + request, buffer, &ad)); + else + error = fn_for_each_not_in_set(label, flabel, profile, + aa_profile_mqueue_perm(profile, &file->f_path, + request, buffer, &ad)); + } + if (!error) + update_file_ctx(file_ctx(file), label, request); + + aa_put_buffer(buffer); + + return error; +} + /** * aa_file_perm - do permission revalidation check & audit for @file * @op: operation being checked + * @subj_cred: subject cred * @label: label being enforced (NOT NULL) * @file: file to revalidate access permissions on (NOT NULL) * @request: requested permissions @@ -546,7 +780,8 @@ * * Returns: %0 if access allowed else error */ -int aa_file_perm(const char *op, struct aa_label *label, struct file *file, +int aa_file_perm(const char *op, const struct cred *subj_cred, + struct aa_label *label, struct file *file, u32 request, bool in_atomic) { struct aa_file_ctx *fctx; @@ -581,20 +816,23 @@ rcu_read_unlock(); /* TODO: label cross check */ - if (file->f_path.mnt && path_mediated_fs(file->f_path.dentry)) - error = __file_path_perm(op, label, flabel, file, request, - denied, in_atomic); + if (is_mqueue_inode(file_inode(file))) { + error = __file_mqueue_perm(op, subj_cred, label, flabel, file, + request, denied, in_atomic); + } else if (file->f_path.mnt && path_mediated_fs(file->f_path.dentry)) + error = __file_path_perm(op, subj_cred, label, flabel, file, + request, denied, in_atomic); else if (S_ISSOCK(file_inode(file)->i_mode)) - error = __file_sock_perm(op, label, flabel, file, request, - denied); + error = __file_sock_perm(op, subj_cred, label, flabel, file, + request, denied); aa_put_label(flabel); done: return error; } -static void revalidate_tty(struct aa_label *label) +static void revalidate_tty(const struct cred *subj_cred, struct aa_label *label) { struct tty_struct *tty; int drop_tty = 0; @@ -612,8 +850,8 @@ struct tty_file_private, list); file = file_priv->file; - if (aa_file_perm(OP_INHERIT, label, file, MAY_READ | MAY_WRITE, - IN_ATOMIC)) + if (aa_file_perm(OP_INHERIT, subj_cred, label, file, + MAY_READ | MAY_WRITE, IN_ATOMIC)) drop_tty = 1; } spin_unlock(&tty->files_lock); @@ -623,12 +861,17 @@ no_tty(); } +struct cred_label { + const struct cred *cred; + struct aa_label *label; +}; + static int match_file(const void *p, struct file *file, unsigned int fd) { - struct aa_label *label = (struct aa_label *)p; + struct cred_label *cl = (struct cred_label *)p; - if (aa_file_perm(OP_INHERIT, label, file, aa_map_file_to_perms(file), - IN_ATOMIC)) + if (aa_file_perm(OP_INHERIT, cl->cred, cl->label, file, + aa_map_file_to_perms(file), IN_ATOMIC)) return fd + 1; return 0; } @@ -638,13 +881,17 @@ void aa_inherit_files(const struct cred *cred, struct files_struct *files) { struct aa_label *label = aa_get_newest_cred_label(cred); + struct cred_label cl = { + .cred = cred, + .label = label, + }; struct file *devnull = NULL; unsigned int n; - revalidate_tty(label); + revalidate_tty(cred, label); /* Revalidate access to inherited open files. */ - n = iterate_fd(files, 0, match_file, label); + n = iterate_fd(files, 0, match_file, &cl); if (!n) /* none found? */ goto out; @@ -654,7 +901,7 @@ /* replace all the matching ones with this */ do { replace_fd(n - 1, devnull, 0); - } while ((n = iterate_fd(files, n, match_file, label)) != 0); + } while ((n = iterate_fd(files, n, match_file, &cl)) != 0); if (devnull) fput(devnull); out: --- linux-azure-6.5.0.orig/security/apparmor/include/af_unix.h +++ linux-azure-6.5.0/security/apparmor/include/af_unix.h @@ -0,0 +1,121 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * AppArmor security module + * + * This file contains AppArmor af_unix fine grained mediation + * + * Copyright 2014 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2 of the + * License. + */ +#ifndef __AA_AF_UNIX_H + +#include + +#include "label.h" +//#include "include/net.h" + +#define unix_addr_len(L) ((L) - sizeof(sa_family_t)) +#define unix_abstract_name_len(L) (unix_addr_len(L) - 1) +#define unix_abstract_len(U) (unix_abstract_name_len((U)->addr->len)) +#define addr_unix_abstract_name(B) ((B)[0] == 0) +#define addr_unix_anonymous(U) (addr_unix_len(U) <= 0) +#define addr_unix_abstract(U) (!addr_unix_anonymous(U) && addr_unix_abstract_name((U)->addr)) +//#define unix_addr_fs(U) (!unix_addr_anonymous(U) && !unix_addr_abstract_name((U)->addr)) + +#define unix_addr(A) ((struct sockaddr_un *)(A)) +#define unix_addr_anon(A, L) ((A) && unix_addr_len(L) <= 0) +#define unix_addr_fs(A, L) (!unix_addr_anon(A, L) && \ + !addr_unix_abstract_name(unix_addr(A)->sun_path)) + +#define UNIX_ANONYMOUS(U) (!unix_sk(U)->addr) +/* from net/unix/af_unix.c */ +#define UNIX_ABSTRACT(U) (!UNIX_ANONYMOUS(U) && \ + unix_sk(U)->addr->hash < UNIX_HASH_SIZE) +#define UNIX_FS(U) (!UNIX_ANONYMOUS(U) && unix_sk(U)->addr->name->sun_path[0]) +#define unix_peer(sk) (unix_sk(sk)->peer) +#define unix_connected(S) ((S)->state == SS_CONNECTED) + +static inline void print_unix_addr(struct sockaddr_un *A, int L) +{ + char *buf = (A) ? (char *) &(A)->sun_path : NULL; + int len = unix_addr_len(L); + + if (!buf || len <= 0) + pr_warn(" "); + else if (buf[0]) + pr_warn(" %s", buf); + else + /* abstract name len includes leading \0 */ + pr_warn(" %d @%.*s", len - 1, len - 1, buf+1); +}; + +#define print_unix_sk(SK) \ +do { \ + struct unix_sock *u = unix_sk(SK); \ + \ + pr_warn("%s: f %d, t %d, p %d", #SK, \ + (SK)->sk_family, (SK)->sk_type, (SK)->sk_protocol); \ + if (u->addr) \ + print_unix_addr(u->addr->name, u->addr->len); \ + else \ + print_unix_addr(NULL, sizeof(sa_family_t)); \ +} while (0) + +#define print_sk(SK) \ +do { \ + if (!(SK)) { \ + pr_warn("%s: %s is null\n", __func__, #SK); \ + } else if ((SK)->sk_family == PF_UNIX) { \ + print_unix_sk(SK); \ + pr_warn("\n"); \ + } else { \ + pr_warn("%s: %s: family %d\n", __func__, #SK, \ + (SK)->sk_family); \ + } \ +} while (0) + +#define print_sock_addr(U) \ +do { \ + pr_warn("%s:\n", __func__); \ + pr_warn" sock %s:", sock_ctx && sock_ctx->label ? \ + aa_label_printk(sock_ctx->label, GFP_ATOMIC); : \ + ""); print_sk(sock); \ + pr_warn(" other %s:", other_ctx && other_ctx->label ? \ + aa_label_printk(other_ctx->label, GFP_ATOMIC); : \ + ""); print_sk(other); \ + pr_warn(" new %s", new_ctx && new_ctx->label ? \ + aa_label_printk(new_ctx->label, GFP_ATOMIC); : \ + ""); print_sk(newsk); \ +} while (0) + + + + +int aa_unix_peer_perm(const struct cred *subj_cred, + struct aa_label *label, const char *op, u32 request, + struct sock *sk, struct sock *peer_sk, + struct aa_label *peer_label); +int aa_unix_label_sk_perm(const struct cred *subj_cred, + struct aa_label *label, const char *op, u32 request, + struct sock *sk); +int aa_unix_sock_perm(const char *op, u32 request, struct socket *sock); +int aa_unix_create_perm(struct aa_label *label, int family, int type, + int protocol); +int aa_unix_bind_perm(struct socket *sock, struct sockaddr *address, + int addrlen); +int aa_unix_connect_perm(struct socket *sock, struct sockaddr *address, + int addrlen); +int aa_unix_listen_perm(struct socket *sock, int backlog); +int aa_unix_accept_perm(struct socket *sock, struct socket *newsock); +int aa_unix_msg_perm(const char *op, u32 request, struct socket *sock, + struct msghdr *msg, int size); +int aa_unix_opt_perm(const char *op, u32 request, struct socket *sock, int level, + int optname); +int aa_unix_file_perm(const struct cred *subj_cred, struct aa_label *label, + const char *op, u32 request, struct socket *sock); + +#endif /* __AA_AF_UNIX_H */ --- linux-azure-6.5.0.orig/security/apparmor/include/apparmor.h +++ linux-azure-6.5.0/security/apparmor/include/apparmor.h @@ -20,7 +20,7 @@ #define AA_CLASS_UNKNOWN 1 #define AA_CLASS_FILE 2 #define AA_CLASS_CAP 3 -#define AA_CLASS_DEPRECATED 4 +#define AA_CLASS_NET_COMPAT 4 #define AA_CLASS_RLIMITS 5 #define AA_CLASS_DOMAIN 6 #define AA_CLASS_MOUNT 7 @@ -30,9 +30,10 @@ #define AA_CLASS_NET 14 #define AA_CLASS_LABEL 16 #define AA_CLASS_POSIX_MQUEUE 17 -#define AA_CLASS_IO_URING 18 #define AA_CLASS_MODULE 19 #define AA_CLASS_DISPLAY_LSM 20 +#define AA_CLASS_NS 21 +#define AA_CLASS_IO_URING 22 #define AA_CLASS_X 31 #define AA_CLASS_DBUS 32 @@ -42,7 +43,7 @@ /* Control parameters settable through module/boot flags */ extern enum audit_mode aa_g_audit; extern bool aa_g_audit_header; -extern bool aa_g_debug; +extern int aa_g_debug; extern bool aa_g_hash_policy; extern bool aa_g_export_binary; extern int aa_g_rawdata_compression_level; --- linux-azure-6.5.0.orig/security/apparmor/include/apparmorfs.h +++ linux-azure-6.5.0/security/apparmor/include/apparmorfs.h @@ -17,6 +17,7 @@ AA_SFS_TYPE_BOOLEAN, AA_SFS_TYPE_STRING, AA_SFS_TYPE_U64, + AA_SFS_TYPE_INTPTR, AA_SFS_TYPE_FOPS, AA_SFS_TYPE_DIR, }; @@ -33,6 +34,7 @@ char *string; unsigned long u64; struct aa_sfs_entry *files; + int *intptr; } v; const struct file_operations *file_ops; }; @@ -51,6 +53,10 @@ { .name = (_name), .mode = 0444, \ .v_type = AA_SFS_TYPE_U64, .v.u64 = (_value), \ .file_ops = &aa_sfs_seq_file_ops } +#define AA_SFS_FILE_INTPTR(_name, _value) \ + { .name = (_name), .mode = 0444, \ + .v_type = AA_SFS_TYPE_INTPTR, .v.intptr = &(_value), \ + .file_ops = &aa_sfs_seq_file_ops } #define AA_SFS_FILE_FOPS(_name, _mode, _fops) \ { .name = (_name), .v_type = AA_SFS_TYPE_FOPS, \ .mode = (_mode), .file_ops = (_fops) } @@ -89,6 +95,7 @@ AAFS_PROF_RAW_DATA, AAFS_PROF_RAW_HASH, AAFS_PROF_RAW_ABI, + AAFS_PROF_LEARNING_COUNT, AAFS_PROF_SIZEOF, }; --- linux-azure-6.5.0.orig/security/apparmor/include/audit.h +++ linux-azure-6.5.0/security/apparmor/include/audit.h @@ -19,6 +19,7 @@ #include "file.h" #include "label.h" +#include "notify.h" extern const char *const audit_mode_names[]; #define AUDIT_MAX_INDEX 5 @@ -38,6 +39,7 @@ AUDIT_APPARMOR_STATUS, AUDIT_APPARMOR_ERROR, AUDIT_APPARMOR_KILL, + AUDIT_APPARMOR_USER, AUDIT_APPARMOR_AUTO }; @@ -103,17 +105,27 @@ #define OP_PROF_LOAD "profile_load" #define OP_PROF_RM "profile_remove" +#define OP_USERNS_CREATE "userns_create" +#define OP_URING_OVERRIDE "uring_override" +#define OP_URING_SQPOLL "uring_sqpoll" + +#define AUDIT_TAILGLOB_NAME 1 struct apparmor_audit_data { + u32 flags; /* control flags not part of actual data */ int error; int type; u16 class; const char *op; - struct aa_label *label; + const struct cred *subj_cred; + struct aa_label *subj_label; const char *name; const char *info; u32 request; u32 denied; + + struct task_struct *subjtsk; + union { /* these entries require a custom callback fn */ struct { @@ -137,6 +149,9 @@ void *addr; int addrlen; } net; + struct { + kuid_t ouid; + } mq; }; }; struct { @@ -151,34 +166,76 @@ const char *data; unsigned long flags; } mnt; + struct { + struct aa_label *target; + } uring; }; + + struct common_audit_data common; +}; + +struct aa_audit_node { + struct kref count; + struct apparmor_audit_data data; + struct list_head list; + struct aa_knotif knotif; }; +extern struct kmem_cache *aa_audit_slab; + +static inline struct aa_audit_node *aa_alloc_audit_node(gfp_t gfp) +{ + return kmem_cache_zalloc(aa_audit_slab, gfp); +} + + +struct aa_audit_cache { + spinlock_t lock; + int size; + struct list_head head; +}; + +static inline void aa_audit_cache_init(struct aa_audit_cache *cache) +{ + cache->size = 0; + spin_lock_init(&cache->lock); + INIT_LIST_HEAD(&cache->head); +} + +struct aa_audit_node *aa_audit_cache_find(struct aa_audit_cache *cache, + struct apparmor_audit_data *ad); +struct aa_audit_node *aa_audit_cache_insert(struct aa_audit_cache *cache, + struct aa_audit_node *node); +void aa_audit_cache_update_ent(struct aa_audit_cache *cache, + struct aa_audit_node *node, + struct apparmor_audit_data *data); +void aa_audit_cache_destroy(struct aa_audit_cache *cache); + + /* macros for dealing with apparmor_audit_data structure */ -#define aad(SA) ((SA)->apparmor_audit_data) +#define aad(SA) (container_of(SA, struct apparmor_audit_data, common)) #define DEFINE_AUDIT_DATA(NAME, T, C, X) \ /* TODO: cleanup audit init so we don't need _aad = {0,} */ \ - struct apparmor_audit_data NAME ## _aad = { \ + struct apparmor_audit_data NAME = { \ .class = (C), \ .op = (X), \ - }; \ - struct common_audit_data NAME = \ - { \ - .type = (T), \ - .u.tsk = NULL, \ - }; \ - NAME.apparmor_audit_data = &(NAME ## _aad) + .subjtsk = NULL, \ + .common.type = (T), \ + .common.u.tsk = NULL, \ + .common.apparmor_audit_data = &NAME, \ + }; -void aa_audit_msg(int type, struct common_audit_data *sa, +void aa_audit_msg(int type, struct apparmor_audit_data *ad, void (*cb) (struct audit_buffer *, void *)); -int aa_audit(int type, struct aa_profile *profile, struct common_audit_data *sa, +int aa_audit(int type, struct aa_profile *profile, + struct apparmor_audit_data *ad, void (*cb) (struct audit_buffer *, void *)); -#define aa_audit_error(ERROR, SA, CB) \ +#define aa_audit_error(ERROR, AD, CB) \ ({ \ - aad((SA))->error = (ERROR); \ - aa_audit_msg(AUDIT_APPARMOR_ERROR, (SA), (CB)); \ - aad((SA))->error; \ + (AD)->error = (ERROR); \ + aa_audit_msg(AUDIT_APPARMOR_ERROR, (AD), (CB)); \ + (AD)->error; \ }) @@ -194,4 +251,27 @@ int aa_audit_rule_known(struct audit_krule *rule); int aa_audit_rule_match(u32 sid, u32 field, u32 op, void *vrule); + +void aa_audit_node_free_kref(struct kref *kref); +struct aa_audit_node *aa_dup_audit_data(struct apparmor_audit_data *orig, + gfp_t gfp); +long aa_audit_data_cmp(struct apparmor_audit_data *lhs, + struct apparmor_audit_data *rhs); + + +static inline struct aa_audit_node *aa_get_audit_node(struct aa_audit_node *node) +{ + if (node) + kref_get(&(node->count)); + + return node; +} + +static inline void aa_put_audit_node(struct aa_audit_node *node) +{ + if (node) + kref_put(&node->count, aa_audit_node_free_kref); +} + + #endif /* __AA_AUDIT_H */ --- linux-azure-6.5.0.orig/security/apparmor/include/capability.h +++ linux-azure-6.5.0/security/apparmor/include/capability.h @@ -36,7 +36,8 @@ extern struct aa_sfs_entry aa_sfs_entry_caps[]; -int aa_capable(struct aa_label *label, int cap, unsigned int opts); +int aa_capable(const struct cred *subj_cred, struct aa_label *label, + int cap, unsigned int opts); static inline void aa_free_cap_rules(struct aa_caps *caps) { --- linux-azure-6.5.0.orig/security/apparmor/include/crypto.h +++ linux-azure-6.5.0/security/apparmor/include/crypto.h @@ -14,6 +14,8 @@ #ifdef CONFIG_SECURITY_APPARMOR_HASH unsigned int aa_hash_size(void); +void aa_snprint_hashstr(char *out, unsigned char *hash, unsigned int hsize); +char *aa_asprint_hashstr(unsigned char *hash, unsigned int hsize, gfp_t gfp); char *aa_calc_hash(void *data, size_t len); int aa_calc_profile_hash(struct aa_profile *profile, u32 version, void *start, size_t len); @@ -32,6 +34,15 @@ { return 0; } + +void aa_snprint_hashstr(char *out, unsigned char *hash, unsigned int hsize) +{ +} + +char *aa_asprint_hashstr(unsigned char *hash, unsigned int hsize, gfp_t gfp); +{ + return NULL; +} #endif #endif /* __APPARMOR_CRYPTO_H */ --- linux-azure-6.5.0.orig/security/apparmor/include/file.h +++ linux-azure-6.5.0/security/apparmor/include/file.h @@ -108,10 +108,11 @@ #define COMBINED_PERM_MASK(X) ((X).allow | (X).audit | (X).quiet | (X).kill) -int aa_audit_file(struct aa_profile *profile, struct aa_perms *perms, +int aa_audit_file(const struct cred *cred, + struct aa_profile *profile, struct aa_perms *perms, const char *op, u32 request, const char *name, const char *target, struct aa_label *tlabel, kuid_t ouid, - const char *info, int error); + const char *info, int error, bool prompt); struct aa_perms *aa_lookup_fperms(struct aa_policydb *file_rules, aa_state_t state, struct path_cond *cond); @@ -119,14 +120,21 @@ const char *name, struct path_cond *cond, struct aa_perms *perms); -int aa_path_perm(const char *op, struct aa_label *label, +int __aa_path_perm(const char *op, const struct cred *cred, + struct aa_profile *profile, + const char *name, u32 request, struct path_cond *cond, + int flags, struct aa_perms *perms, bool prompt); +int aa_path_perm(const char *op, const struct cred *cred, + struct aa_label *label, const struct path *path, int flags, u32 request, struct path_cond *cond); -int aa_path_link(struct aa_label *label, struct dentry *old_dentry, +int aa_path_link(const struct cred *cred, + struct aa_label *label, struct dentry *old_dentry, const struct path *new_dir, struct dentry *new_dentry); -int aa_file_perm(const char *op, struct aa_label *label, struct file *file, +int aa_file_perm(const char *op, const struct cred *cred, + struct aa_label *label, struct file *file, u32 request, bool in_atomic); void aa_inherit_files(const struct cred *cred, struct files_struct *files); --- linux-azure-6.5.0.orig/security/apparmor/include/inode.h +++ linux-azure-6.5.0/security/apparmor/include/inode.h @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * AppArmor security module + * + * This file contains AppArmor file mediation function definitions. + * + * Copyright 2022 Canonical Ltd. + */ + +#ifndef __AA_INODE_H +#define __AA_INODE_H + +#include + +#include "lib.h" + +struct aa_inode_sec { + struct inode *inode; /* back pointer to inode object */ + struct aa_label *label; + u16 sclass; /* security class of this object */ + bool initialized; /* initialization flag */ + spinlock_t lock; +}; + +struct aa_superblock_sec { + struct aa_label *label; +}; + +static inline struct aa_inode_sec *apparmor_inode(const struct inode *inode) +{ + if (unlikely(!inode->i_security)) + return NULL; + return inode->i_security + apparmor_blob_sizes.lbs_inode; +} + +static inline struct aa_superblock_sec *apparmor_superblock( + const struct super_block *sb) +{ + return sb->s_security + apparmor_blob_sizes.lbs_superblock; +} + +#endif /* __AA_INODE_H */ --- linux-azure-6.5.0.orig/security/apparmor/include/ipc.h +++ linux-azure-6.5.0/security/apparmor/include/ipc.h @@ -11,8 +11,68 @@ #ifndef __AA_IPC_H #define __AA_IPC_H +#include #include -int aa_may_signal(struct aa_label *sender, struct aa_label *target, int sig); +#include "inode.h" +#include "perms.h" + +struct aa_msg_sec { + struct aa_label *label; +}; + +struct aa_ipc_sec { + struct aa_label *label; +}; + +static inline struct aa_ipc_sec *apparmor_ipc(const struct kern_ipc_perm *ipc) +{ + return ipc->security + apparmor_blob_sizes.lbs_ipc; +} + +static inline struct aa_msg_sec *apparmor_msg_msg(const struct msg_msg *msg_msg) +{ + return msg_msg->security + apparmor_blob_sizes.lbs_msg_msg; +} + + +static inline bool is_mqueue_sb(struct super_block *sb) +{ + if (!sb) + pr_warn("mqueue sb == NULL\n"); + if (!sb && !sb->s_type->name) + pr_warn("mqueue sb name == NULL\n"); + return sb && sb->s_type->name && strcmp(sb->s_type->name, "mqueue") == 0; +} + +static inline bool is_mqueue_inode(struct inode *i) +{ + struct aa_inode_sec *isec; + + if (!i) + return false; + + isec = apparmor_inode(i); + return isec && isec->sclass == AA_CLASS_POSIX_MQUEUE; +} + +int aa_may_signal(const struct cred *subj_cred, struct aa_label *sender, + const struct cred *target_cred, struct aa_label *target, + int sig); + +#define AA_AUDIT_POSIX_MQUEUE_MASK (AA_MAY_WRITE | AA_MAY_READ | \ + AA_MAY_CREATE | AA_MAY_DELETE | \ + AA_MAY_OPEN | AA_MAY_SETATTR | \ + AA_MAY_GETATTR) + + +int aa_profile_mqueue_perm(struct aa_profile *profile, + const struct path *path, + u32 request, char *buffer, + struct apparmor_audit_data *ad); + +int aa_mqueue_perm(const char *op, const struct cred *subj_cred, + struct aa_label *label, + const struct path *path, u32 request); #endif /* __AA_IPC_H */ --- linux-azure-6.5.0.orig/security/apparmor/include/label.h +++ linux-azure-6.5.0/security/apparmor/include/label.h @@ -90,7 +90,7 @@ FLAG_PROFILE = 0x200, /* label is a profile */ FLAG_EXPLICIT = 0x400, /* explicit static label */ FLAG_STALE = 0x800, /* replaced/removed */ - FLAG_RENAMED = 0x1000, /* label has renaming in it */ + FLAG_INTERRUPTIBLE = 0x1000, FLAG_REVOKED = 0x2000, /* label has revocation in it */ FLAG_DEBUG1 = 0x4000, FLAG_DEBUG2 = 0x8000, @@ -261,7 +261,10 @@ struct label_it i; \ int ret = 0; \ label_for_each(i, (L), profile) { \ - if (RULE_MEDIATES(&profile->rules, (C))) { \ + struct aa_ruleset *rules = \ + list_first_entry(&profile->rules, typeof(*rules),\ + list); \ + if (RULE_MEDIATES(rules, (C))) { \ ret = 1; \ break; \ } \ @@ -270,6 +273,7 @@ }) +int aa_label_cmp(struct aa_label *a, struct aa_label *b); void aa_labelset_destroy(struct aa_labelset *ls); void aa_labelset_init(struct aa_labelset *ls); void __aa_labelset_update_subtree(struct aa_ns *ns); --- linux-azure-6.5.0.orig/security/apparmor/include/lib.h +++ linux-azure-6.5.0/security/apparmor/include/lib.h @@ -16,23 +16,45 @@ #include "match.h" -/* - * DEBUG remains global (no per profile flag) since it is mostly used in sysctl - * which is not related to profile accesses. - */ +extern struct aa_dfa *stacksplitdfa; + + +#define list_add_entry(ent, list, member) list_add(&(ent)->member, (list)) +#define list_add_tail_entry(ent, list, member) list_add_tail(&(ent)->member, (list)) -#define DEBUG_ON (aa_g_debug) /* * split individual debug cases out in preparation for finer grained * debug controls in the future. */ -#define AA_DEBUG_LABEL DEBUG_ON #define dbg_printk(__fmt, __args...) pr_debug(__fmt, ##__args) -#define AA_DEBUG(fmt, args...) \ + +#define DEBUG_PROMPT 2 + +#define DEBUG_NONE 0 +#define DEBUG_LABEL_ABS_ROOT 1 +#define DEBUG_LABEL 2 +#define DEBUG_DOMAIN 4 +#define DEBUG_POLICY 8 +#define DEBUG_INTERFACE 0x10 +#define DEBUG_UPCALL 0x20 + +#define DEBUG_ALL 0x3f /* update if new DEBUG_X added */ +#define DEBUG_PARSE_ERROR (-1) + +#define DEBUG_ON (aa_g_debug != DEBUG_NONE) +#define DEBUG_ABS_ROOT (aa_g_debug & DEBUG_LABEL_ABS_ROOT) + +#define AA_DEBUG(opt, fmt, args...) \ do { \ - if (DEBUG_ON) \ - pr_debug_ratelimited("AppArmor: " fmt, ##args); \ + if (aa_g_debug & opt) \ + pr_warn("%s: " fmt, __func__, ##args); \ } while (0) +#define AA_DEBUG_ON(C, args...) do { if (C) AA_DEBUG(args); } while (0) +#define AA_DEBUG_LABEL(LAB, X, fmt, args) \ +do { \ + if ((LAB)->flags & FLAG_DEBUG1) \ + AA_DEBUG(X, fmt, args); \ +} while (0) #define AA_WARN(X) WARN((X), "APPARMOR WARN %s: %s\n", __func__, #X) @@ -49,6 +71,9 @@ #define AA_BUG_FMT(X, fmt, args...) no_printk(fmt, ##args) #endif +int aa_parse_debug_params(const char *str); +int aa_print_debug_params(char *buffer); + #define AA_ERROR(fmt, args...) \ pr_err_ratelimited("AppArmor: " fmt, ##args) @@ -94,6 +119,14 @@ return aa_dfa_next(dfa, start, 0); } +static inline aa_state_t aa_dfa_match_u16(struct aa_dfa *dfa, aa_state_t state, + u16 data) +{ + __be16 buffer = cpu_to_be16(data); + + return aa_dfa_match_len(dfa, state, (char *) &buffer, 2); +} + static inline bool path_mediated_fs(struct dentry *dentry) { return !(dentry->d_sb->s_flags & SB_NOUSER); @@ -280,7 +313,7 @@ } \ __done: \ if (!__new_) \ - AA_DEBUG("label build failed\n"); \ + AA_DEBUG(DEBUG_LABEL, "label build failed\n"); \ (__new_); \ }) --- linux-azure-6.5.0.orig/security/apparmor/include/match.h +++ linux-azure-6.5.0/security/apparmor/include/match.h @@ -102,9 +102,6 @@ struct table_header *tables[YYTD_ID_TSIZE]; }; -extern struct aa_dfa *nulldfa; -extern struct aa_dfa *stacksplitdfa; - #define byte_to_byte(X) (X) #define UNPACK_ARRAY(TABLE, BLOB, LEN, TTYPE, BTYPE, NTOHX) \ @@ -122,9 +119,6 @@ return ALIGN(sizeof(struct table_header) + len * el_size, 8); } -int aa_setup_dfa_engine(void); -void aa_teardown_dfa_engine(void); - #define aa_state_t unsigned int struct aa_dfa *aa_dfa_unpack(void *blob, size_t size, int flags); --- linux-azure-6.5.0.orig/security/apparmor/include/mount.h +++ linux-azure-6.5.0/security/apparmor/include/mount.h @@ -25,26 +25,36 @@ #define AA_MS_IGNORE_MASK (MS_KERNMOUNT | MS_NOSEC | MS_ACTIVE | MS_BORN) -int aa_remount(struct aa_label *label, const struct path *path, +int aa_remount(const struct cred *subj_cred, + struct aa_label *label, const struct path *path, unsigned long flags, void *data); -int aa_bind_mount(struct aa_label *label, const struct path *path, +int aa_bind_mount(const struct cred *subj_cred, + struct aa_label *label, const struct path *path, const char *old_name, unsigned long flags); -int aa_mount_change_type(struct aa_label *label, const struct path *path, +int aa_mount_change_type(const struct cred *subj_cred, + struct aa_label *label, const struct path *path, unsigned long flags); -int aa_move_mount(struct aa_label *label, const struct path *path, - const char *old_name); +int aa_move_mount_old(const struct cred *subj_cred, + struct aa_label *label, const struct path *path, + const char *old_name); +int aa_move_mount(const struct cred *subj_cred, + struct aa_label *label, const struct path *from_path, + const struct path *to_path); -int aa_new_mount(struct aa_label *label, const char *dev_name, +int aa_new_mount(const struct cred *subj_cred, + struct aa_label *label, const char *dev_name, const struct path *path, const char *type, unsigned long flags, void *data); -int aa_umount(struct aa_label *label, struct vfsmount *mnt, int flags); +int aa_umount(const struct cred *subj_cred, + struct aa_label *label, struct vfsmount *mnt, int flags); -int aa_pivotroot(struct aa_label *label, const struct path *old_path, +int aa_pivotroot(const struct cred *subj_cred, + struct aa_label *label, const struct path *old_path, const struct path *new_path); #endif /* __AA_MOUNT_H */ --- linux-azure-6.5.0.orig/security/apparmor/include/net.h +++ linux-azure-6.5.0/security/apparmor/include/net.h @@ -49,9 +49,14 @@ struct aa_sk_ctx { struct aa_label *label; struct aa_label *peer; + struct path path; }; -#define SK_CTX(X) ((X)->sk_security) +static inline struct aa_sk_ctx *aa_sock(const struct sock *sk) +{ + return sk->sk_security + apparmor_blob_sizes.lbs_sock; +} + #define SOCK_ctx(X) SOCK_INODE(X)->i_security #define DEFINE_AUDIT_NET(NAME, OP, SK, F, T, P) \ struct lsm_network_audit NAME ## _net = { .sk = (SK), \ @@ -61,19 +66,32 @@ LSM_AUDIT_DATA_NONE, \ AA_CLASS_NET, \ OP); \ - NAME.u.net = &(NAME ## _net); \ - aad(&NAME)->net.type = (T); \ - aad(&NAME)->net.protocol = (P) + NAME.common.u.net = &(NAME ## _net); \ + NAME.net.type = (T); \ + NAME.net.protocol = (P) #define DEFINE_AUDIT_SK(NAME, OP, SK) \ DEFINE_AUDIT_NET(NAME, OP, SK, (SK)->sk_family, (SK)->sk_type, \ (SK)->sk_protocol) +/* struct aa_net - network confinement data + * @allow: basic network families permissions + * @audit: which network permissions to force audit + * @quiet: which network permissions to quiet rejects + */ +struct aa_net_compat { + u16 allow[AF_MAX]; + u16 audit[AF_MAX]; + u16 quiet[AF_MAX]; +}; #define af_select(FAMILY, FN, DEF_FN) \ ({ \ int __e; \ switch ((FAMILY)) { \ + case AF_UNIX: \ + __e = aa_unix_ ## FN; \ + break; \ default: \ __e = DEF_FN; \ } \ @@ -88,23 +106,27 @@ }; extern struct aa_sfs_entry aa_sfs_entry_network[]; +extern struct aa_sfs_entry aa_sfs_entry_network_compat[]; void audit_net_cb(struct audit_buffer *ab, void *va); -int aa_profile_af_perm(struct aa_profile *profile, struct common_audit_data *sa, +int aa_profile_af_perm(struct aa_profile *profile, + struct apparmor_audit_data *ad, u32 request, u16 family, int type); -int aa_af_perm(struct aa_label *label, const char *op, u32 request, u16 family, +int aa_af_perm(const struct cred *subj_cred, struct aa_label *label, + const char *op, u32 request, u16 family, int type, int protocol); static inline int aa_profile_af_sk_perm(struct aa_profile *profile, - struct common_audit_data *sa, + struct apparmor_audit_data *ad, u32 request, struct sock *sk) { - return aa_profile_af_perm(profile, sa, request, sk->sk_family, + return aa_profile_af_perm(profile, ad, request, sk->sk_family, sk->sk_type); } int aa_sk_perm(const char *op, u32 request, struct sock *sk); -int aa_sock_file_perm(struct aa_label *label, const char *op, u32 request, +int aa_sock_file_perm(const struct cred *subj_cred, struct aa_label *label, + const char *op, u32 request, struct socket *sock); int apparmor_secmark_check(struct aa_label *label, char *op, u32 request, --- linux-azure-6.5.0.orig/security/apparmor/include/notify.h +++ linux-azure-6.5.0/security/apparmor/include/notify.h @@ -0,0 +1,98 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * AppArmor security module + * + * This file contains AppArmor notifications function definitions. + * + * Copyright 2019 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2 of the + * License. + */ + +#ifndef __AA_NOTIFY_H +#define __AA_NOTIFY_H + +#include +#include +#include +#include +#include + +#include + +#include "match.h" + +struct aa_ns; +struct aa_audit_node; +struct apparmor_audit_data; + +struct aa_listener { + struct kref count; + spinlock_t lock; + wait_queue_head_t wait; + struct list_head ns_proxies; /* aa_listener_proxy */ + struct list_head notifications; /* aa_audit_proxy */ + struct list_head pending; /* aa_audit_proxy */ + struct aa_ns *ns; /* counted - ns of listener */ + struct aa_dfa *filter; + u64 last_id; + u32 mask; + u32 flags; +}; + +struct aa_listener_proxy { + struct aa_ns *ns; /* counted - ns listening to */ + struct aa_listener *listener; + struct list_head llist; + struct list_head nslist; +}; + +#define KNOTIF_ON_LIST 1 +#define KNOTIF_PULSE +#define KNOTIF_PENDING +#define KNOTIF_CANCELLED +/* need to split knofif into audit_proxy + * prompt notifications only go to first taker so no need for completion + * in the proxy, it increases size of proxy in non-prompt case + */ +struct aa_knotif { + struct apparmor_audit_data *ad; /* counted */ + struct list_head list; + struct completion ready; + u64 id; + u16 ntype; + u16 flags; +}; + +void aa_free_listener_proxy(struct aa_listener_proxy *proxy); +bool aa_register_listener_proxy(struct aa_listener *listener, struct aa_ns *ns); +struct aa_listener *aa_new_listener(struct aa_ns *ns, gfp_t gfp); +struct aa_knotif *__aa_find_notif(struct aa_listener *listener, u64 id); +int aa_do_notification(u16 ntype, struct aa_audit_node *node); + +long aa_listener_unotif_recv(struct aa_listener *listener, void __user *buf, + u16 max_size); +long aa_listener_unotif_response(struct aa_listener *listener, + union apparmor_notif_resp *uresp, + u16 size); + +void aa_listener_kref(struct kref *kref); + +static inline struct aa_listener *aa_get_listener(struct aa_listener *listener) +{ + if (listener) + kref_get(&(listener->count)); + + return listener; +} + +static inline void aa_put_listener(struct aa_listener *listener) +{ + if (listener) + kref_put(&listener->count, aa_listener_kref); +} + +#endif /* __AA_NOTIFY_H */ --- linux-azure-6.5.0.orig/security/apparmor/include/path.h +++ linux-azure-6.5.0/security/apparmor/include/path.h @@ -13,6 +13,7 @@ enum path_flags { PATH_IS_DIR = 0x1, /* path is a directory */ + PATH_SOCK_COND = 0x2, PATH_CONNECT_PATH = 0x4, /* connect disconnected paths to / */ PATH_CHROOT_REL = 0x8, /* do path lookup relative to chroot */ PATH_CHROOT_NSCONNECT = 0x10, /* connect paths that are at ns root */ --- linux-azure-6.5.0.orig/security/apparmor/include/perms.h +++ linux-azure-6.5.0/security/apparmor/include/perms.h @@ -48,6 +48,9 @@ #define AA_LINK_SUBSET AA_MAY_LOCK /* overlaid */ +#define AA_MAY_CREATE_SQPOLL AA_MAY_CREATE +#define AA_MAY_OVERRIDE_CRED AA_MAY_APPEND +#define AA_URING_PERM_MASK (AA_MAY_OVERRIDE_CRED | AA_MAY_CREATE_SQPOLL) #define PERMS_CHRS_MASK (MAY_READ | MAY_WRITE | AA_MAY_CREATE | \ AA_MAY_DELETE | AA_MAY_LINK | AA_MAY_LOCK | \ @@ -195,12 +198,15 @@ extern struct aa_perms default_perms; - +struct apparmor_audit_data; void aa_perm_mask_to_str(char *str, size_t str_size, const char *chrs, u32 mask); void aa_audit_perm_names(struct audit_buffer *ab, const char * const *names, u32 mask); +void aa_audit_perms(struct audit_buffer *ab, struct apparmor_audit_data *ad, + const char *chrs, u32 chrsmask, const char * const *names, + u32 namesmask); void aa_audit_perm_mask(struct audit_buffer *ab, u32 mask, const char *chrs, u32 chrsmask, const char * const *names, u32 namesmask); void aa_apply_modes_to_perms(struct aa_profile *profile, @@ -212,8 +218,14 @@ int type, u32 request, struct aa_perms *perms); int aa_profile_label_perm(struct aa_profile *profile, struct aa_profile *target, u32 request, int type, u32 *deny, - struct common_audit_data *sa); + struct apparmor_audit_data *ad); + +static inline u32 denied_perms(struct aa_perms *perms, u32 request) +{ + return request & (~perms->allow | perms->deny); +} + int aa_check_perms(struct aa_profile *profile, struct aa_perms *perms, - u32 request, struct common_audit_data *sa, + u32 request, struct apparmor_audit_data *ad, void (*cb)(struct audit_buffer *, void *)); #endif /* __AA_PERM_H */ --- linux-azure-6.5.0.orig/security/apparmor/include/policy.h +++ linux-azure-6.5.0/security/apparmor/include/policy.h @@ -34,6 +34,11 @@ struct aa_ns; extern int unprivileged_userns_apparmor_policy; +extern int unprivileged_userns_restricted; +extern int unprivileged_userns_restricted_force; +extern int unprivileged_userns_restricted_complain; +extern int aa_unprivileged_unconfined_restricted; +extern int aa_unprivileged_uring_restricted; extern const char *const aa_profile_mode_names[]; #define APPARMOR_MODE_NAMES_MAX_INDEX 4 @@ -74,12 +79,14 @@ /* struct aa_policydb - match engine for a policy + * count: refcount for the pdb * dfa: dfa pattern match * perms: table of permissions * strs: table of strings, index by x * start: set of start states for the different classes of data */ struct aa_policydb { + struct kref count; struct aa_dfa *dfa; struct { struct aa_perms *perms; @@ -89,13 +96,36 @@ aa_state_t start[AA_CLASS_LAST + 1]; }; -static inline void aa_destroy_policydb(struct aa_policydb *policy) +extern struct aa_policydb *nullpdb; + +struct aa_policydb *aa_alloc_pdb(gfp_t gfp); +void aa_pdb_free_kref(struct kref *kref); + +/** + * aa_get_pdb - increment refcount on @pdb + * @pdb: policydb (MAYBE NULL) + * + * Returns: pointer to @pdb if @pdb is NULL will return NULL + * Requires: @pdb must be held with valid refcount when called + */ +static inline struct aa_policydb *aa_get_pdb(struct aa_policydb *pdb) { - aa_put_dfa(policy->dfa); - if (policy->perms) - kvfree(policy->perms); - aa_free_str_table(&policy->trans); + if (pdb) + kref_get(&(pdb->count)); + return pdb; +} + +/** + * aa_put_pdb - put a pdb refcount + * @pdb: pdb to put refcount (MAYBE NULL) + * + * Requires: if @pdb != NULL that a valid refcount be held + */ +static inline void aa_put_pdb(struct aa_policydb *pdb) +{ + if (pdb) + kref_put(&pdb->count, aa_pdb_free_kref); } static inline struct aa_perms *aa_lookup_perms(struct aa_policydb *policy, @@ -139,8 +169,8 @@ int size; /* TODO: merge policy and file */ - struct aa_policydb policy; - struct aa_policydb file; + struct aa_policydb *policy; + struct aa_policydb *file; struct aa_caps caps; struct aa_rlimit rlimits; @@ -149,6 +179,10 @@ struct aa_secmark *secmark; }; +void aa_free_ruleset(struct aa_ruleset *rules); +struct aa_ruleset *aa_new_ruleset(gfp_t gfp); +struct aa_ruleset *aa_clone_ruleset(struct aa_ruleset *rules); + /* struct aa_attachment - data and rules for a profiles attachment * @list: * @xmatch_str: human readable attachment string @@ -159,7 +193,7 @@ */ struct aa_attachment { const char *xmatch_str; - struct aa_policydb xmatch; + struct aa_policydb *xmatch; unsigned int xmatch_len; int xattr_count; char **xattrs; @@ -178,6 +212,7 @@ * @disconnected: what to prepend if attach_disconnected is specified * @attach: attachment rules for the profile * @rules: rules to be enforced + * @net_compat: v2 compat network controls for the profile * * @dents: dentries for the profiles file entries in apparmorfs * @dirname: name of the profile dir in apparmorfs @@ -209,6 +244,9 @@ struct aa_attachment attach; struct list_head rules; + struct aa_net_compat *net_compat; + + struct aa_audit_cache learning_cache; struct aa_loaddata *rawdata; unsigned char *hash; @@ -276,10 +314,10 @@ unsigned char class) { if (class <= AA_CLASS_LAST) - return rules->policy.start[class]; + return rules->policy->start[class]; else - return aa_dfa_match_len(rules->policy.dfa, - rules->policy.start[0], &class, 1); + return aa_dfa_match_len(rules->policy->dfa, + rules->policy->start[0], &class, 1); } static inline aa_state_t RULE_MEDIATES_AF(struct aa_ruleset *rules, u16 AF) @@ -287,9 +325,12 @@ aa_state_t state = RULE_MEDIATES(rules, AA_CLASS_NET); __be16 be_af = cpu_to_be16(AF); - if (!state) - return DFA_NOMATCH; - return aa_dfa_match_len(rules->policy.dfa, state, (char *) &be_af, 2); + if (!state) { + state = RULE_MEDIATES(rules, AA_CLASS_NET_COMPAT); + if (!state) + return DFA_NOMATCH; + } + return aa_dfa_match_len(rules->policy->dfa, state, (char *) &be_af, 2); } static inline aa_state_t ANY_RULE_MEDIATES(struct list_head *head, @@ -370,9 +411,12 @@ return profile->audit; } -bool aa_policy_view_capable(struct aa_label *label, struct aa_ns *ns); -bool aa_policy_admin_capable(struct aa_label *label, struct aa_ns *ns); -int aa_may_manage_policy(struct aa_label *label, struct aa_ns *ns, +bool aa_policy_view_capable(const struct cred *subj_cred, + struct aa_label *label, struct aa_ns *ns); +bool aa_policy_admin_capable(const struct cred *subj_cred, + struct aa_label *label, struct aa_ns *ns); +int aa_may_manage_policy(const struct cred *subj_cred, + struct aa_label *label, struct aa_ns *ns, u32 mask); bool aa_current_policy_view_capable(struct aa_ns *ns); bool aa_current_policy_admin_capable(struct aa_ns *ns); --- linux-azure-6.5.0.orig/security/apparmor/include/policy_ns.h +++ linux-azure-6.5.0/security/apparmor/include/policy_ns.h @@ -12,6 +12,7 @@ #define __AA_NAMESPACE_H #include +#include #include "apparmor.h" #include "apparmorfs.h" @@ -42,6 +43,12 @@ * @uniq_null: uniq value used for null learning profiles * @uniq_id: a unique id count for the profiles in the namespace * @level: level of ns within the tree hierarchy + * @revision: policy revision for this ns + * @wait: waitq for tasks waiting on revision changes + * @listener_lock: lock for listeners + * @listeners: notification listeners' proxies list + * @labels: all the labels associated with this ns + * @rawdata_list: raw policy data for policy * @dents: dentries for the namespaces file entries in apparmorfs * * An aa_ns defines the set profiles that are searched to determine which @@ -65,9 +72,13 @@ atomic_t uniq_null; long uniq_id; int level; + long revision; wait_queue_head_t wait; + spinlock_t listener_lock; + struct list_head listeners; + struct aa_labelset labels; struct list_head rawdata_list; --- linux-azure-6.5.0.orig/security/apparmor/include/policy_unpack.h +++ linux-azure-6.5.0/security/apparmor/include/policy_unpack.h @@ -31,6 +31,7 @@ #define PACKED_FLAG_HAT 1 #define PACKED_FLAG_DEBUG1 2 #define PACKED_FLAG_DEBUG2 4 +#define PACKED_FLAG_INTERRUPTIBLE 8 #define PACKED_MODE_ENFORCE 0 #define PACKED_MODE_COMPLAIN 1 --- linux-azure-6.5.0.orig/security/apparmor/include/resource.h +++ linux-azure-6.5.0/security/apparmor/include/resource.h @@ -33,7 +33,8 @@ extern struct aa_sfs_entry aa_sfs_entry_rlimit[]; int aa_map_resource(int resource); -int aa_task_setrlimit(struct aa_label *label, struct task_struct *task, +int aa_task_setrlimit(const struct cred *subj_cred, struct aa_label *label, + struct task_struct *task, unsigned int resource, struct rlimit *new_rlim); void __aa_transition_rlimits(struct aa_label *old, struct aa_label *new); --- linux-azure-6.5.0.orig/security/apparmor/include/task.h +++ linux-azure-6.5.0/security/apparmor/include/task.h @@ -91,8 +91,16 @@ "segv usr2 pipe alrm term stkflt chld cont stop stp ttin ttou urg " \ "xcpu xfsz vtalrm prof winch io pwr sys emt lost" -int aa_may_ptrace(struct aa_label *tracer, struct aa_label *tracee, +int aa_may_ptrace(const struct cred *tracer_cred, struct aa_label *tracer, + const struct cred *tracee_cred, struct aa_label *tracee, u32 request); + +#define AA_USERNS_CREATE 8 + +int aa_profile_ns_perm(struct aa_profile *profile, + struct apparmor_audit_data *ad, + u32 request); + #endif /* __AA_TASK_H */ --- linux-azure-6.5.0.orig/security/apparmor/ipc.c +++ linux-azure-6.5.0/security/apparmor/ipc.c @@ -9,10 +9,13 @@ */ #include +#include +#include #include "include/audit.h" #include "include/capability.h" #include "include/cred.h" +#include "include/path.h" #include "include/policy.h" #include "include/ipc.h" #include "include/sig_names.h" @@ -52,31 +55,33 @@ static void audit_signal_cb(struct audit_buffer *ab, void *va) { struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); - if (aad(sa)->request & AA_SIGNAL_PERM_MASK) { + if (ad->request & AA_SIGNAL_PERM_MASK) { audit_log_format(ab, " requested_mask=\"%s\"", - audit_signal_mask(aad(sa)->request)); - if (aad(sa)->denied & AA_SIGNAL_PERM_MASK) { + audit_signal_mask(ad->request)); + if (ad->denied & AA_SIGNAL_PERM_MASK) { audit_log_format(ab, " denied_mask=\"%s\"", - audit_signal_mask(aad(sa)->denied)); + audit_signal_mask(ad->denied)); } } - if (aad(sa)->signal == SIGUNKNOWN) + if (ad->signal == SIGUNKNOWN) audit_log_format(ab, "signal=unknown(%d)", - aad(sa)->unmappedsig); - else if (aad(sa)->signal < MAXMAPPED_SIGNAME) - audit_log_format(ab, " signal=%s", sig_names[aad(sa)->signal]); + ad->unmappedsig); + else if (ad->signal < MAXMAPPED_SIGNAME) + audit_log_format(ab, " signal=%s", sig_names[ad->signal]); else audit_log_format(ab, " signal=rtmin+%d", - aad(sa)->signal - SIGRT_BASE); + ad->signal - SIGRT_BASE); audit_log_format(ab, " peer="); - aa_label_xaudit(ab, labels_ns(aad(sa)->label), aad(sa)->peer, + aa_label_xaudit(ab, labels_ns(ad->subj_label), ad->peer, FLAGS_NONE, GFP_ATOMIC); } -static int profile_signal_perm(struct aa_profile *profile, +static int profile_signal_perm(const struct cred *cred, + struct aa_profile *profile, struct aa_label *peer, u32 request, - struct common_audit_data *sa) + struct apparmor_audit_data *ad) { struct aa_ruleset *rules = list_first_entry(&profile->rules, typeof(*rules), list); @@ -87,24 +92,133 @@ !ANY_RULE_MEDIATES(&profile->rules, AA_CLASS_SIGNAL)) return 0; - aad(sa)->peer = peer; + ad->subj_cred = cred; + ad->peer = peer; /* TODO: secondary cache check */ - state = aa_dfa_next(rules->policy.dfa, - rules->policy.start[AA_CLASS_SIGNAL], - aad(sa)->signal); + state = aa_dfa_next(rules->policy->dfa, + rules->policy->start[AA_CLASS_SIGNAL], + ad->signal); aa_label_match(profile, rules, peer, state, false, request, &perms); aa_apply_modes_to_perms(profile, &perms); - return aa_check_perms(profile, &perms, request, sa, audit_signal_cb); + return aa_check_perms(profile, &perms, request, ad, audit_signal_cb); } -int aa_may_signal(struct aa_label *sender, struct aa_label *target, int sig) +int aa_may_signal(const struct cred *subj_cred, struct aa_label *sender, + const struct cred *target_cred, struct aa_label *target, + int sig) { struct aa_profile *profile; - DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, AA_CLASS_SIGNAL, OP_SIGNAL); + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_SIGNAL, OP_SIGNAL); - aad(&sa)->signal = map_signal_num(sig); - aad(&sa)->unmappedsig = sig; + ad.signal = map_signal_num(sig); + ad.unmappedsig = sig; return xcheck_labels(sender, target, profile, - profile_signal_perm(profile, target, MAY_WRITE, &sa), - profile_signal_perm(profile, sender, MAY_READ, &sa)); + profile_signal_perm(subj_cred, profile, target, + MAY_WRITE, &ad), + profile_signal_perm(target_cred, profile, sender, + MAY_READ, &ad)); +} + + +static void audit_mqueue_cb(struct audit_buffer *ab, void *va) +{ + struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); + + aa_audit_perms(ab, ad, NULL, 0, NULL, AA_AUDIT_POSIX_MQUEUE_MASK); + + /* move class into generic audit framse work */ + audit_log_format(ab, "class=\"posix_mqueue\""); + if (ad->request & AA_AUDIT_FILE_MASK) { + audit_log_format(ab, " fsuid=%u", + from_kuid(&init_user_ns, ad->subj_cred->fsuid)); + audit_log_format(ab, " ouid=%u", + from_kuid(&init_user_ns, ad->mq.ouid)); + } + if (ad->peer) { + audit_log_format(ab, " olabel="); + aa_label_xaudit(ab, labels_ns(ad->subj_label), ad->peer, + FLAGS_NONE, GFP_ATOMIC); + } +} + +int aa_profile_mqueue_perm(struct aa_profile *profile, const struct path *path, + u32 request, char *buffer, + struct apparmor_audit_data *ad) +{ + struct aa_ruleset *rules = list_first_entry(&profile->rules, + typeof(*rules), list); + struct aa_perms perms = { }; + unsigned int state; + char *name; + + if (profile_unconfined(profile) || + !RULE_MEDIATES(rules, AA_CLASS_POSIX_MQUEUE)) + return 0; + + name = dentry_path_raw(path->dentry, buffer, aa_g_path_max); + if (IS_ERR(name)) + return PTR_ERR(name); + if (path->mnt != current->nsproxy->ipc_ns->mq_mnt) { + /* TODO: disconnected path detection */ + pr_warn("apparmor mqueue disconnected TODO\n"); + } + + ad->name = name; + + state = aa_dfa_match(rules->policy->dfa, + rules->policy->start[AA_CLASS_POSIX_MQUEUE], + name); + perms = *aa_lookup_perms(rules->policy, state); + aa_apply_modes_to_perms(profile, &perms); + if (!denied_perms(&perms, request)) { + /* early bailout sufficient perms no need to do further + * checks + */ + return aa_check_perms(profile, &perms, request, ad, + audit_mqueue_cb); + } + /* continue check to see if we have label perms */ + //aa_label_match(profile, peer??, state false, request, &perms); + //aa_apply_modes_to_perms(profile, &perms); + + // this will just cause failure without above label check + return aa_check_perms(profile, &perms, request, ad, audit_mqueue_cb); +} + +/* mqueue - no label caching test */ +int aa_mqueue_perm(const char *op, const struct cred *subj_cred, + struct aa_label *label, + const struct path *path, u32 request) +{ + struct aa_profile *profile; + char *buffer; + int error; + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_POSIX_MQUEUE, op); + + // do we need delegate deleted with mqueues? probably + //flags |= PATH_DELEGATE_DELETED; + + /* sadly due to rcu walk hairiness, we use dentry_path_raw instead + * of just accessing the name directly, which means we need to + * do the whole buffer allocation mess + */ + buffer = aa_get_buffer(false); + if (!buffer) + return -ENOMEM; + + /* audit fields that won't change during iteration */ + ad.subj_cred = subj_cred; + ad.request = request; + ad.peer = NULL; + ad.mq.ouid = d_backing_inode(path->dentry) ? + d_backing_inode(path->dentry)->i_uid : + subj_cred->fsuid; + + error = fn_for_each_confined(label, profile, + aa_profile_mqueue_perm(profile, path, request, + buffer, &ad)); + aa_put_buffer(buffer); + + return error; } --- linux-azure-6.5.0.orig/security/apparmor/label.c +++ linux-azure-6.5.0/security/apparmor/label.c @@ -429,7 +429,7 @@ /* + 1 for null terminator entry on vec */ new = kzalloc(struct_size(new, vec, size + 1), gfp); - AA_DEBUG("%s (%p)\n", __func__, new); + AA_DEBUG(DEBUG_LABEL, "%s (%p)\n", __func__, new); if (!new) goto fail; @@ -455,7 +455,7 @@ /** - * label_cmp - label comparison for set ordering + * aa_label_cmp - label comparison for set ordering * @a: label to compare (NOT NULL) * @b: label to compare (NOT NULL) * @@ -463,7 +463,7 @@ * ==0 if a == b * >0 if a > b */ -static int label_cmp(struct aa_label *a, struct aa_label *b) +int aa_label_cmp(struct aa_label *a, struct aa_label *b) { AA_BUG(!b); @@ -677,7 +677,7 @@ new = &ls->root.rb_node; while (*new) { struct aa_label *this = rb_entry(*new, struct aa_label, node); - int result = label_cmp(label, this); + int result = aa_label_cmp(label, this); parent = *new; if (result == 0) { @@ -1269,14 +1269,14 @@ const char *ns_name; if (profile->ns == tp->ns) - return aa_dfa_match(rules->policy.dfa, state, tp->base.hname); + return aa_dfa_match(rules->policy->dfa, state, tp->base.hname); /* try matching with namespace name and then profile */ ns_name = aa_ns_name(profile->ns, tp->ns, true); - state = aa_dfa_match_len(rules->policy.dfa, state, ":", 1); - state = aa_dfa_match(rules->policy.dfa, state, ns_name); - state = aa_dfa_match_len(rules->policy.dfa, state, ":", 1); - return aa_dfa_match(rules->policy.dfa, state, tp->base.hname); + state = aa_dfa_match_len(rules->policy->dfa, state, ":", 1); + state = aa_dfa_match(rules->policy->dfa, state, ns_name); + state = aa_dfa_match_len(rules->policy->dfa, state, ":", 1); + return aa_dfa_match(rules->policy->dfa, state, tp->base.hname); } /** @@ -1321,12 +1321,12 @@ label_for_each_cont(i, label, tp) { if (!aa_ns_visible(profile->ns, tp->ns, subns)) continue; - state = aa_dfa_match(rules->policy.dfa, state, "//&"); + state = aa_dfa_match(rules->policy->dfa, state, "//&"); state = match_component(profile, rules, tp, state); if (!state) goto fail; } - *perms = *aa_lookup_perms(&rules->policy, state); + *perms = *aa_lookup_perms(rules->policy, state); aa_apply_modes_to_perms(profile, perms); if ((perms->allow & request) != request) return -EACCES; @@ -1379,7 +1379,7 @@ return 0; next: - tmp = *aa_lookup_perms(&rules->policy, state); + tmp = *aa_lookup_perms(rules->policy, state); aa_apply_modes_to_perms(profile, &tmp); aa_perms_accum(perms, &tmp); label_for_each_cont(i, label, tp) { @@ -1388,7 +1388,7 @@ state = match_component(profile, rules, tp, start); if (!state) goto fail; - tmp = *aa_lookup_perms(&rules->policy, state); + tmp = *aa_lookup_perms(rules->policy, state); aa_apply_modes_to_perms(profile, &tmp); aa_perms_accum(perms, &tmp); } @@ -1632,7 +1632,7 @@ AA_BUG(!str && size != 0); AA_BUG(!label); - if (AA_DEBUG_LABEL && (flags & FLAG_ABS_ROOT)) { + if (DEBUG_ABS_ROOT && (flags & FLAG_ABS_ROOT)) { ns = root_ns; len = snprintf(str, size, "_"); update_for_len(total, len, size, str); @@ -1746,7 +1746,7 @@ display_mode(ns, label, flags)) { len = aa_label_asxprint(&name, ns, label, flags, gfp); if (len < 0) { - AA_DEBUG("label print error"); + AA_DEBUG(DEBUG_LABEL, "label print error"); return; } str = name; @@ -1774,7 +1774,7 @@ len = aa_label_asxprint(&str, ns, label, flags, gfp); if (len < 0) { - AA_DEBUG("label print error"); + AA_DEBUG(DEBUG_LABEL, "label print error"); return; } seq_puts(f, str); @@ -1797,7 +1797,7 @@ len = aa_label_asxprint(&str, ns, label, flags, gfp); if (len < 0) { - AA_DEBUG("label print error"); + AA_DEBUG(DEBUG_LABEL, "label print error"); return; } pr_info("%s", str); @@ -1896,7 +1896,7 @@ AA_BUG(!str); str = skipn_spaces(str, n); - if (str == NULL || (AA_DEBUG_LABEL && *str == '_' && + if (str == NULL || (DEBUG_ABS_ROOT && *str == '_' && base != &root_ns->unconfined->label)) return ERR_PTR(-EINVAL); --- linux-azure-6.5.0.orig/security/apparmor/lib.c +++ linux-azure-6.5.0/security/apparmor/lib.c @@ -25,6 +25,98 @@ .quiet = ALL_PERMS_MASK, .hide = ALL_PERMS_MASK }; +struct val_table_ent { + const char *str; + int value; +}; + +struct val_table_ent debug_values_table[] = { + { "N", DEBUG_NONE }, + { "none", DEBUG_NONE }, + { "n", DEBUG_NONE }, + { "0", DEBUG_NONE }, + { "all", DEBUG_ALL }, + { "Y", DEBUG_ALL }, + { "y", DEBUG_ALL }, + { "1", DEBUG_ALL }, + { "abs_root", DEBUG_LABEL_ABS_ROOT }, + { "label", DEBUG_LABEL }, + { "domain", DEBUG_DOMAIN }, + { "policy", DEBUG_POLICY }, + { "interface", DEBUG_INTERFACE }, + { "upcall", DEBUG_UPCALL }, + { NULL, 0 } +}; + +static struct val_table_ent *val_table_find_ent(struct val_table_ent *table, + const char *name, size_t len) +{ + struct val_table_ent *entry; + + for (entry = table; entry->str != NULL; entry++) { + if (strncmp(entry->str, name, len) == 0 && + strlen(entry->str) == len) + return entry; + } + return NULL; +} + +int aa_parse_debug_params(const char *str) +{ + struct val_table_ent *ent; + const char *next; + int val = 0; + + do { + size_t n = strcspn(str, "\r\n,"); + + next = str + n; + ent = val_table_find_ent(debug_values_table, str, next - str); + if (ent) + val |= ent->value; + else + AA_DEBUG(DEBUG_INTERFACE, "unknown debug type '%.*s'", + (int)(next - str), str); + str = next + 1; + } while (*next != 0); + return val; +} + +/** + * aa_mask_to_str - convert a perm mask to its short string + * @str: character buffer to store string in (at least 10 characters) + * @str_size: size of the @str buffer + * @chrs: NUL-terminated character buffer of permission characters + * @mask: permission mask to convert + */ +static int val_mask_to_str(char *str, size_t size, + const struct val_table_ent *table, u32 mask) +{ + const struct val_table_ent *ent; + int total = 0; + + for (ent = table; ent->str; ent++) { + if (ent->value && (ent->value & mask) == ent->value) { + int len = scnprintf(str, size, "%s%s", total ? "," : "", + ent->str); + size -= len; + str += len; + total += len; + mask &= ~ent->value; + } + } + + return total; +} + +int aa_print_debug_params(char *buffer) +{ + if (!aa_g_debug) + return sprintf(buffer, "N"); + return val_mask_to_str(buffer, PAGE_SIZE, debug_values_table, + aa_g_debug); +} + /** * aa_free_str_table - free entries str table * @str: the string table to free (MAYBE NULL) @@ -143,10 +235,10 @@ void aa_info_message(const char *str) { if (audit_enabled) { - DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, NULL); + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, NULL); - aad(&sa)->info = str; - aa_audit_msg(AUDIT_APPARMOR_STATUS, &sa, NULL); + ad.info = str; + aa_audit_msg(AUDIT_APPARMOR_STATUS, &ad, NULL); } printk(KERN_INFO "AppArmor: %s\n", str); } @@ -170,7 +262,7 @@ const char aa_file_perm_chrs[] = "xwracd km l "; -const char *aa_file_perm_names[] = { +const char *aa_base_perm_names[] = { "exec", "write", "read", @@ -260,6 +352,10 @@ { char str[33]; + if (!chrs) + chrs = aa_file_perm_chrs; + if (!names) + names = aa_base_perm_names; audit_log_format(ab, "\""); if ((mask & chrsmask) && chrs) { aa_perm_mask_to_str(str, sizeof(str), chrs, mask & chrsmask); @@ -273,6 +369,22 @@ audit_log_format(ab, "\""); } +void aa_audit_perms(struct audit_buffer *ab, struct apparmor_audit_data *ad, + const char *chrs, u32 chrsmask, const char * const *names, + u32 namesmask) +{ + if (ad->request) { + audit_log_format(ab, " requested="); + aa_audit_perm_mask(ab, ad->request, chrs, chrsmask, + names, namesmask); + } + if (ad->denied) { + audit_log_format(ab, " denied="); + aa_audit_perm_mask(ab, ad->denied, chrs, chrsmask, + names, namesmask); + } +} + /** * aa_audit_perms_cb - generic callback fn for auditing perms * @ab: audit buffer (NOT NULL) @@ -281,21 +393,12 @@ static void aa_audit_perms_cb(struct audit_buffer *ab, void *va) { struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); - if (aad(sa)->request) { - audit_log_format(ab, " requested_mask="); - aa_audit_perm_mask(ab, aad(sa)->request, aa_file_perm_chrs, - PERMS_CHRS_MASK, aa_file_perm_names, - PERMS_NAMES_MASK); - } - if (aad(sa)->denied) { - audit_log_format(ab, "denied_mask="); - aa_audit_perm_mask(ab, aad(sa)->denied, aa_file_perm_chrs, - PERMS_CHRS_MASK, aa_file_perm_names, - PERMS_NAMES_MASK); - } + aa_audit_perms(ab, ad, aa_file_perm_chrs, PERMS_CHRS_MASK, + aa_base_perm_names, PERMS_NAMES_MASK); audit_log_format(ab, " peer="); - aa_label_xaudit(ab, labels_ns(aad(sa)->label), aad(sa)->peer, + aa_label_xaudit(ab, labels_ns(ad->subj_label), ad->peer, FLAGS_NONE, GFP_ATOMIC); } @@ -339,8 +442,8 @@ /* TODO: doesn't yet handle extended types */ aa_state_t state; - state = aa_dfa_next(rules->policy.dfa, - rules->policy.start[AA_CLASS_LABEL], + state = aa_dfa_next(rules->policy->dfa, + rules->policy->start[AA_CLASS_LABEL], type); aa_label_match(profile, rules, label, state, false, request, perms); } @@ -349,21 +452,20 @@ /* currently unused */ int aa_profile_label_perm(struct aa_profile *profile, struct aa_profile *target, u32 request, int type, u32 *deny, - struct common_audit_data *sa) + struct apparmor_audit_data *ad) { struct aa_ruleset *rules = list_first_entry(&profile->rules, typeof(*rules), list); struct aa_perms perms; - aad(sa)->label = &profile->label; - aad(sa)->peer = &target->label; - aad(sa)->request = request; + ad->peer = &target->label; + ad->request = request; aa_profile_match_label(profile, rules, &target->label, type, request, &perms); aa_apply_modes_to_perms(profile, &perms); *deny |= request & perms.deny; - return aa_check_perms(profile, &perms, request, sa, aa_audit_perms_cb); + return aa_check_perms(profile, &perms, request, ad, aa_audit_perms_cb); } /** @@ -372,7 +474,7 @@ * @perms: perms computed for the request * @request: requested perms * @deny: Returns: explicit deny set - * @sa: initialized audit structure (MAY BE NULL if not auditing) + * @ad: initialized audit structure (MAY BE NULL if not auditing) * @cb: callback fn for type specific fields (MAY BE NULL) * * Returns: 0 if permission else error code @@ -385,16 +487,16 @@ * with a positive value. */ int aa_check_perms(struct aa_profile *profile, struct aa_perms *perms, - u32 request, struct common_audit_data *sa, + u32 request, struct apparmor_audit_data *ad, void (*cb)(struct audit_buffer *, void *)) { int type, error; - u32 denied = request & (~perms->allow | perms->deny); + u32 denied = denied_perms(perms, request); if (likely(!denied)) { /* mask off perms that are not being force audited */ request &= perms->audit; - if (!request || !sa) + if (!request || !ad) return 0; type = AUDIT_APPARMOR_AUDIT; @@ -413,16 +515,17 @@ error = -ENOENT; denied &= ~perms->quiet; - if (!sa || !denied) + if (!ad || !denied) return error; } - if (sa) { - aad(sa)->label = &profile->label; - aad(sa)->request = request; - aad(sa)->denied = denied; - aad(sa)->error = error; - aa_audit_msg(type, sa, cb); + if (ad) { + // do_notification() + ad->subj_label = &profile->label; + ad->request = request; + ad->denied = denied; + ad->error = error; + aa_audit_msg(type, ad, cb); } if (type == AUDIT_APPARMOR_ALLOWED) --- linux-azure-6.5.0.orig/security/apparmor/lsm.c +++ linux-azure-6.5.0/security/apparmor/lsm.c @@ -15,22 +15,28 @@ #include #include #include +#include #include #include #include +#include +#include #include #include #include #include #include #include +#include +#include "include/af_unix.h" #include "include/apparmor.h" #include "include/apparmorfs.h" #include "include/audit.h" #include "include/capability.h" #include "include/cred.h" #include "include/file.h" +#include "include/inode.h" #include "include/ipc.h" #include "include/net.h" #include "include/path.h" @@ -49,12 +55,28 @@ DECLARE_FLEX_ARRAY(char, buffer); }; +struct aa_local_cache { + unsigned int contention; + unsigned int hold; + unsigned int count; + struct list_head head; +}; + +#define MAX_LOCAL_COUNT 2 #define RESERVE_COUNT 2 static int reserve_count = RESERVE_COUNT; static int buffer_count; static LIST_HEAD(aa_global_buffers); static DEFINE_SPINLOCK(aa_buffers_lock); +static DEFINE_PER_CPU(struct aa_local_cache, aa_local_buffers); + +struct kmem_cache *aa_audit_slab; + +static bool is_mqueue_dentry(struct dentry *dentry) +{ + return dentry && is_mqueue_inode(d_backing_inode(dentry)); +} /* * LSM hook functions @@ -116,15 +138,17 @@ unsigned int mode) { struct aa_label *tracer, *tracee; + const struct cred *cred; int error; + cred = get_task_cred(child); + tracee = cred_label(cred); /* ref count on cred */ tracer = __begin_current_label_crit_section(); - tracee = aa_get_task_label(child); - error = aa_may_ptrace(tracer, tracee, + error = aa_may_ptrace(current_cred(), tracer, cred, tracee, (mode & PTRACE_MODE_READ) ? AA_PTRACE_READ : AA_PTRACE_TRACE); - aa_put_label(tracee); __end_current_label_crit_section(tracer); + put_cred(cred); return error; } @@ -132,12 +156,15 @@ static int apparmor_ptrace_traceme(struct task_struct *parent) { struct aa_label *tracer, *tracee; + const struct cred *cred; int error; tracee = __begin_current_label_crit_section(); - tracer = aa_get_task_label(parent); - error = aa_may_ptrace(tracer, tracee, AA_PTRACE_TRACE); - aa_put_label(tracer); + cred = get_task_cred(parent); + tracer = cred_label(cred); /* ref count on cred */ + error = aa_may_ptrace(cred, tracer, current_cred(), tracee, + AA_PTRACE_TRACE); + put_cred(cred); __end_current_label_crit_section(tracee); return error; @@ -188,7 +215,7 @@ label = aa_get_newest_cred_label(cred); if (!unconfined(label)) - error = aa_capable(label, cap, opts); + error = aa_capable(cred, label, cap, opts); aa_put_label(label); return error; @@ -211,7 +238,8 @@ label = __begin_current_label_crit_section(); if (!unconfined(label)) - error = aa_path_perm(op, label, path, 0, mask, cond); + error = aa_path_perm(op, current_cred(), label, path, 0, mask, + cond); __end_current_label_crit_section(label); return error; @@ -357,7 +385,8 @@ label = begin_current_label_crit_section(); if (!unconfined(label)) - error = aa_path_link(label, old_dentry, new_dir, new_dentry); + error = aa_path_link(current_cred(), label, old_dentry, new_dir, + new_dentry); end_current_label_crit_section(label); return error; @@ -396,23 +425,27 @@ vfsuid = i_uid_into_vfsuid(idmap, d_backing_inode(old_dentry)); cond_exchange.uid = vfsuid_into_kuid(vfsuid); - error = aa_path_perm(OP_RENAME_SRC, label, &new_path, 0, + error = aa_path_perm(OP_RENAME_SRC, current_cred(), + label, &new_path, 0, MAY_READ | AA_MAY_GETATTR | MAY_WRITE | AA_MAY_SETATTR | AA_MAY_DELETE, &cond_exchange); if (!error) - error = aa_path_perm(OP_RENAME_DEST, label, &old_path, + error = aa_path_perm(OP_RENAME_DEST, current_cred(), + label, &old_path, 0, MAY_WRITE | AA_MAY_SETATTR | AA_MAY_CREATE, &cond_exchange); } if (!error) - error = aa_path_perm(OP_RENAME_SRC, label, &old_path, 0, + error = aa_path_perm(OP_RENAME_SRC, current_cred(), + label, &old_path, 0, MAY_READ | AA_MAY_GETATTR | MAY_WRITE | AA_MAY_SETATTR | AA_MAY_DELETE, &cond); if (!error) - error = aa_path_perm(OP_RENAME_DEST, label, &new_path, + error = aa_path_perm(OP_RENAME_DEST, current_cred(), + label, &new_path, 0, MAY_WRITE | AA_MAY_SETATTR | AA_MAY_CREATE, &cond); @@ -432,11 +465,169 @@ return common_perm_cond(OP_CHOWN, path, AA_MAY_CHOWN); } +static int common_mqueue_path_perm(const char *op, u32 request, + const struct path *path) +{ + struct aa_label *label; + int error = 0; + + label = begin_current_label_crit_section(); + if (!unconfined(label)) + error = aa_mqueue_perm(OP_UNLINK, current_cred(), label, path, + request); + + end_current_label_crit_section(label); + + return error; +} + static int apparmor_inode_getattr(const struct path *path) { + if (is_mqueue_dentry(path->dentry)) + /* TODO: fn() for d_parent */ + return common_mqueue_path_perm(OP_UNLINK, AA_MAY_GETATTR, path); + return common_perm_cond(OP_GETATTR, path, AA_MAY_GETATTR); } +/* inode security operations */ + +/* alloced by infrastructure */ +static int apparmor_inode_alloc_security(struct inode *inode) +{ + struct aa_inode_sec *isec = apparmor_inode(inode); + + spin_lock_init(&isec->lock); + isec->inode = inode; + isec->label = NULL; + isec->sclass = 0; + isec->initialized = false; + + return 0; +} + +/* freed by infrastructure */ +static void apparmor_inode_free_security(struct inode *inode) +{ + struct aa_inode_sec *isec = apparmor_inode(inode); + + if (!isec) + return; + + aa_put_label(isec->label); +} + + +/* this is broken, in that we must make it work for ALL xattr fs + * or it will bail early, so this does not work with LSM stacking + */ +static int apparmor_inode_init_security(struct inode *inode, struct inode *dir, + const struct qstr *qstr, + const char **name, + void **value, size_t *len) +{ + struct aa_inode_sec *isec = apparmor_inode(inode); + + if (is_mqueue_inode(dir)) { + /* only initialize based on implied label atm */ + isec->label = aa_get_current_label(); + isec->sclass = AA_CLASS_POSIX_MQUEUE; + isec->initialized = true; + } + + /* we aren't setting xattrs yet so pretend it isn't supported, + * note bug in LSM means other LSMs won't get to init inode either + */ + return -EOPNOTSUPP; +} + +static int inode_init_with_dentry(struct inode *inode, struct dentry *dentry) +{ + struct aa_inode_sec *isec = apparmor_inode(inode); + + if (isec->initialized) + return 0; + spin_lock(&isec->lock); + /* recheck under lock */ + if (isec->initialized) + goto unlock; + + if (is_mqueue_sb(inode->i_sb)) { + /* only initialize based on implied label atm */ + isec->label = aa_get_current_label(); + isec->sclass = AA_CLASS_POSIX_MQUEUE; + isec->initialized = true; + } + +unlock: + spin_unlock(&isec->lock); + + return 0; +} + +static void apparmor_d_instantiate(struct dentry *dentry, struct inode *inode) +{ + if (inode) + inode_init_with_dentry(inode, dentry); +} + +static int apparmor_inode_create(struct inode *dir, struct dentry *dentry, + umode_t mode) +{ + struct aa_label *label; + int error = 0; + + label = begin_current_label_crit_section(); + if (!unconfined(label)) { + struct path path = { + .dentry = dentry, + .mnt = current->nsproxy->ipc_ns->mq_mnt, + }; + if (is_mqueue_inode(dir)) + error = aa_mqueue_perm(OP_CREATE, current_cred(), + label, &path, AA_MAY_CREATE); + } + end_current_label_crit_section(label); + + return error; +} + +static int common_mqueue_perm(const char *op, u32 request, struct inode *dir, struct dentry *dentry) +{ + /* can't directly determine ipc ns, but know for mqueues dir is mnt_root */ + bool isdir = d_inode(current->nsproxy->ipc_ns->mq_mnt->mnt_root) == dir; + struct path path = { + .dentry = dentry, + .mnt = isdir ? current->nsproxy->ipc_ns->mq_mnt : NULL, + }; + + if (dir != d_inode(current->nsproxy->ipc_ns->mq_mnt->mnt_root)) + pr_warn("apparmor: unlink dir != mnt_root - disconnected"); + + return common_mqueue_path_perm(op, request, &path); +} + +static int apparmor_inode_unlink(struct inode *dir, struct dentry *dentry) +{ + int error = 0; + + if (is_mqueue_dentry(dentry)) + error = common_mqueue_perm(OP_UNLINK, AA_MAY_DELETE, dir, dentry); + + return error; +} + +static int apparmor_inode_setattr(struct dentry *dentry, struct iattr *iattr) +{ + /* TODO: extend to support iattr as a parameter */ + if (is_mqueue_dentry(dentry)) + /* TODO: fn() for d_parent */ + return common_mqueue_perm(OP_UNLINK, AA_MAY_SETATTR, + d_backing_inode(dentry->d_parent), dentry); + + return 0; +} + static int apparmor_file_open(struct file *file) { struct aa_file_ctx *fctx = file_ctx(file); @@ -467,10 +658,17 @@ vfsuid = i_uid_into_vfsuid(idmap, inode); cond.uid = vfsuid_into_kuid(vfsuid); - error = aa_path_perm(OP_OPEN, label, &file->f_path, 0, - aa_map_file_to_perms(file), &cond); + if (is_mqueue_inode(file_inode(file))) + error = aa_mqueue_perm(OP_OPEN, file->f_cred, + label, &file->f_path, + aa_map_file_to_perms(file)); + else + error = aa_path_perm(OP_OPEN, file->f_cred, + label, &file->f_path, 0, + aa_map_file_to_perms(file), &cond); /* todo cache full allowed permissions set and state */ - fctx->allow = aa_map_file_to_perms(file); + if (!error) + fctx->allow = aa_map_file_to_perms(file); } aa_put_label(label); @@ -482,6 +680,7 @@ struct aa_file_ctx *ctx = file_ctx(file); struct aa_label *label = begin_current_label_crit_section(); + /* no inode available here */ spin_lock_init(&ctx->lock); rcu_assign_pointer(ctx->label, aa_get_label(label)); end_current_label_crit_section(label); @@ -507,7 +706,7 @@ return -EACCES; label = __begin_current_label_crit_section(); - error = aa_file_perm(op, label, file, mask, in_atomic); + error = aa_file_perm(op, current_cred(), label, file, mask, in_atomic); __end_current_label_crit_section(label); return error; @@ -570,6 +769,141 @@ false); } +#ifdef CONFIG_IO_URING +static const char *audit_uring_mask(u32 mask) +{ + if (mask & AA_MAY_CREATE_SQPOLL) + return "sqpoll"; + if (mask & AA_MAY_OVERRIDE_CRED) + return "override_creds"; + return ""; +} + +static void audit_uring_cb(struct audit_buffer *ab, void *va) +{ + struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); + + if (ad->request & AA_URING_PERM_MASK) { + audit_log_format(ab, " requested=\"%s\"", + audit_uring_mask(ad->request)); + if (ad->denied & AA_URING_PERM_MASK) { + audit_log_format(ab, " denied=\"%s\"", + audit_uring_mask(ad->denied)); + } + } + if (ad->uring.target) { + audit_log_format(ab, " tcontext="); + aa_label_xaudit(ab, labels_ns(ad->subj_label), + ad->uring.target, + FLAGS_NONE, GFP_ATOMIC); + } +} + +static int profile_uring(struct aa_profile *profile, u32 request, + struct aa_label *new, int cap, + struct apparmor_audit_data *ad) +{ + unsigned int state; + struct aa_ruleset *rules; + + AA_BUG(!profile); + + rules = list_first_entry(&profile->rules, typeof(*rules), list); + + /* TODO: rework unconfined profile/dfa to mediate user ns, then + * we can drop the unconfined test + */ + state = RULE_MEDIATES(rules, AA_CLASS_IO_URING); + if (!state) { + /* TODO: this gets replaced when the default unconfined + * profile dfa gets updated to handle this + */ + if (profile_unconfined(profile) && + profile == profiles_ns(profile)->unconfined) { + if (!aa_unprivileged_uring_restricted || + ns_capable_noaudit(current_user_ns(), cap)) + /* unconfined early bail out */ + return 0; + /* unconfined unprivileged user */ + /* don't just return: allow complain mode to override */ + } else { + /* Fallback to capability check if profile doesn't + * support io_uring rules. Note: special unconfined + * profiles as well. + */ + return aa_capable(current_cred(), &profile->label, + cap, CAP_OPT_NONE); + } + /* continue to mediation - !state means non-accepting + * but can be overidden by complain + */ + } + /* block so perms is not initialized unless mediating */ + do { + struct aa_perms perms = { }; + + if (new) { + aa_label_match(profile, rules, new, state, + false, request, &perms); + } else { + perms = *aa_lookup_perms(rules->policy, state); + } + aa_apply_modes_to_perms(profile, &perms); + return aa_check_perms(profile, &perms, request, ad, + audit_uring_cb); + } while (0); +} + +/** + * apparmor_uring_override_creds - check the requested cred override + * @new: the target creds + * + * Check to see if the current task is allowed to override it's credentials + * to service an io_uring operation. + */ +int apparmor_uring_override_creds(const struct cred *new) +{ + struct aa_profile *profile; + struct aa_label *label; + int error; + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_IO_URING, + OP_URING_OVERRIDE); + + ad.uring.target = cred_label(new); + label = __begin_current_label_crit_section(); + error = fn_for_each(label, profile, + profile_uring(profile, AA_MAY_OVERRIDE_CRED, + cred_label(new), CAP_SYS_ADMIN, &ad)); + __end_current_label_crit_section(label); + + return error; +} + +/** + * apparmor_uring_sqpoll - check if a io_uring polling thread can be created + * + * Check to see if the current task is allowed to create a new io_uring + * kernel polling thread. + */ +int apparmor_uring_sqpoll(void) +{ + struct aa_profile *profile; + struct aa_label *label; + int error; + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_IO_URING, + OP_URING_SQPOLL); + + label = __begin_current_label_crit_section(); + error = fn_for_each(label, profile, + profile_uring(profile, AA_MAY_CREATE_SQPOLL, + NULL, CAP_SYS_ADMIN, &ad)); + __end_current_label_crit_section(label); + + return error; +} +#endif /* CONFIG_IO_URING */ + static int apparmor_sb_mount(const char *dev_name, const struct path *path, const char *type, unsigned long flags, void *data) { @@ -585,23 +919,42 @@ label = __begin_current_label_crit_section(); if (!unconfined(label)) { if (flags & MS_REMOUNT) - error = aa_remount(label, path, flags, data); + error = aa_remount(current_cred(), label, path, flags, + data); else if (flags & MS_BIND) - error = aa_bind_mount(label, path, dev_name, flags); + error = aa_bind_mount(current_cred(), label, path, + dev_name, flags); else if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE)) - error = aa_mount_change_type(label, path, flags); + error = aa_mount_change_type(current_cred(), label, + path, flags); else if (flags & MS_MOVE) - error = aa_move_mount(label, path, dev_name); + error = aa_move_mount_old(current_cred(), label, path, + dev_name); else - error = aa_new_mount(label, dev_name, path, type, - flags, data); + error = aa_new_mount(current_cred(), label, dev_name, + path, type, flags, data); } __end_current_label_crit_section(label); return error; } +static int apparmor_move_mount(const struct path *from_path, + const struct path *to_path) +{ + struct aa_label *label; + int error = 0; + + label = __begin_current_label_crit_section(); + if (!unconfined(label)) + error = aa_move_mount(current_cred(), label, from_path, + to_path); + __end_current_label_crit_section(label); + + return error; +} + static int apparmor_sb_umount(struct vfsmount *mnt, int flags) { struct aa_label *label; @@ -609,7 +962,7 @@ label = __begin_current_label_crit_section(); if (!unconfined(label)) - error = aa_umount(label, mnt, flags); + error = aa_umount(current_cred(), label, mnt, flags); __end_current_label_crit_section(label); return error; @@ -623,7 +976,7 @@ label = aa_get_current_label(); if (!unconfined(label)) - error = aa_pivotroot(label, old_path, new_path); + error = aa_pivotroot(current_cred(), label, old_path, new_path); aa_put_label(label); return error; @@ -656,13 +1009,55 @@ return error; } + +static int profile_interface_lsm(struct aa_profile *profile, + struct apparmor_audit_data *ad) +{ + struct aa_ruleset *rules = list_first_entry(&profile->rules, + typeof(*rules), list); + struct aa_perms perms = { }; + unsigned int state; + + state = RULE_MEDIATES(rules, AA_CLASS_DISPLAY_LSM); + if (state) { + perms = *aa_lookup_perms(rules->policy, state); + aa_apply_modes_to_perms(profile, &perms); + + return aa_check_perms(profile, &perms, AA_MAY_WRITE, ad, NULL); + } + + return 0; +} + +static int apparmor_task_prctl(int option, unsigned long arg2, + unsigned long arg3, unsigned long arg4, + unsigned long arg5) +{ + struct aa_profile *profile; + struct aa_label *label; + int error; + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, + OP_SETPROCATTR); + + if (option != PR_LSM_ATTR_SET) + return -ENOSYS; + + /* LSM infrastructure does actual setting of interface_lsm if allowed */ + ad.info = "set interface lsm"; + label = begin_current_label_crit_section(); + error = fn_for_each_confined(label, profile, + profile_interface_lsm(profile, &ad)); + end_current_label_crit_section(label); + return error; +} + static int apparmor_setprocattr(const char *name, void *value, size_t size) { char *command, *largs = NULL, *args = value; size_t arg_size; int error; - DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, OP_SETPROCATTR); if (size == 0) @@ -722,11 +1117,11 @@ return error; fail: - aad(&sa)->label = begin_current_label_crit_section(); - aad(&sa)->info = name; - aad(&sa)->error = error = -EINVAL; - aa_audit_msg(AUDIT_APPARMOR_DENIED, &sa, NULL); - end_current_label_crit_section(aad(&sa)->label); + ad.subj_label = begin_current_label_crit_section(); + ad.info = name; + ad.error = error = -EINVAL; + aa_audit_msg(AUDIT_APPARMOR_DENIED, &ad, NULL); + end_current_label_crit_section(ad.subj_label); goto out; } @@ -785,7 +1180,8 @@ int error = 0; if (!unconfined(label)) - error = aa_task_setrlimit(label, task, resource, new_rlim); + error = aa_task_setrlimit(current_cred(), label, task, + resource, new_rlim); __end_current_label_crit_section(label); return error; @@ -794,44 +1190,51 @@ static int apparmor_task_kill(struct task_struct *target, struct kernel_siginfo *info, int sig, const struct cred *cred) { + const struct cred *tc; struct aa_label *cl, *tl; int error; + tc = get_task_cred(target); + tl = aa_get_newest_cred_label(tc); if (cred) { /* * Dealing with USB IO specific behavior */ cl = aa_get_newest_cred_label(cred); - tl = aa_get_task_label(target); - error = aa_may_signal(cl, tl, sig); + error = aa_may_signal(cred, cl, tc, tl, sig); aa_put_label(cl); - aa_put_label(tl); return error; + } else { + cl = __begin_current_label_crit_section(); + error = aa_may_signal(current_cred(), cl, tc, tl, sig); + __end_current_label_crit_section(cl); } - - cl = __begin_current_label_crit_section(); - tl = aa_get_task_label(target); - error = aa_may_signal(cl, tl, sig); aa_put_label(tl); - __end_current_label_crit_section(cl); + put_cred(tc); return error; } -/** - * apparmor_sk_alloc_security - allocate and attach the sk_security field - */ -static int apparmor_sk_alloc_security(struct sock *sk, int family, gfp_t flags) +static int apparmor_userns_create(const struct cred *cred) { - struct aa_sk_ctx *ctx; - - ctx = kzalloc(sizeof(*ctx), flags); - if (!ctx) - return -ENOMEM; + struct aa_label *label; + struct aa_profile *profile; + int error = 0; - SK_CTX(sk) = ctx; + label = begin_current_label_crit_section(); + /* remove unprivileged_userns_restricted check when unconfined is updated */ + if (unprivileged_userns_restricted || + LABEL_MEDIATES(label, AA_CLASS_NS)) { + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_TASK, AA_CLASS_NS, + OP_USERNS_CREATE); + ad.subj_cred = current_cred(); + + error = fn_for_each(label, profile, + aa_profile_ns_perm(profile, &ad, AA_USERNS_CREATE)); + end_current_label_crit_section(label); + } - return 0; + return error; } /** @@ -839,12 +1242,11 @@ */ static void apparmor_sk_free_security(struct sock *sk) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *ctx = aa_sock(sk); - SK_CTX(sk) = NULL; aa_put_label(ctx->label); aa_put_label(ctx->peer); - kfree(ctx); + path_put(&ctx->path); } /** @@ -853,8 +1255,8 @@ static void apparmor_sk_clone_security(const struct sock *sk, struct sock *newsk) { - struct aa_sk_ctx *ctx = SK_CTX(sk); - struct aa_sk_ctx *new = SK_CTX(newsk); + struct aa_sk_ctx *ctx = aa_sock(sk); + struct aa_sk_ctx *new = aa_sock(newsk); if (new->label) aa_put_label(new->label); @@ -863,6 +1265,102 @@ if (new->peer) aa_put_label(new->peer); new->peer = aa_get_label(ctx->peer); + new->path = ctx->path; + path_get(&new->path); +} + +static struct path *UNIX_FS_CONN_PATH(struct sock *sk, struct sock *newsk) +{ + if (sk->sk_family == PF_UNIX && UNIX_FS(sk)) + return &unix_sk(sk)->path; + else if (newsk->sk_family == PF_UNIX && UNIX_FS(newsk)) + return &unix_sk(newsk)->path; + return NULL; +} + +/** + * apparmor_unix_stream_connect - check perms before making unix domain conn + * + * peer is locked when this hook is called + */ +static int apparmor_unix_stream_connect(struct sock *sk, struct sock *peer_sk, + struct sock *newsk) +{ + struct aa_sk_ctx *sk_ctx = aa_sock(sk); + struct aa_sk_ctx *peer_ctx = aa_sock(peer_sk); + struct aa_sk_ctx *new_ctx = aa_sock(newsk); + struct aa_label *label; + struct path *path; + int error; + + label = __begin_current_label_crit_section(); + error = aa_unix_peer_perm(current_cred(), label, OP_CONNECT, + (AA_MAY_CONNECT | AA_MAY_SEND | AA_MAY_RECEIVE), + sk, peer_sk, NULL); + if (!UNIX_FS(peer_sk)) { + last_error(error, + aa_unix_peer_perm(current_cred(), + peer_ctx->label, OP_CONNECT, + (AA_MAY_ACCEPT | AA_MAY_SEND | AA_MAY_RECEIVE), + peer_sk, sk, label)); + } + __end_current_label_crit_section(label); + + if (error) + return error; + + /* label newsk if it wasn't labeled in post_create. Normally this + * would be done in sock_graft, but because we are directly looking + * at the peer_sk to obtain peer_labeling for unix socks this + * does not work + */ + if (!new_ctx->label) + new_ctx->label = aa_get_label(peer_ctx->label); + + /* Cross reference the peer labels for SO_PEERSEC */ + if (new_ctx->peer) + aa_put_label(new_ctx->peer); + + if (sk_ctx->peer) + aa_put_label(sk_ctx->peer); + + new_ctx->peer = aa_get_label(sk_ctx->label); + sk_ctx->peer = aa_get_label(peer_ctx->label); + + path = UNIX_FS_CONN_PATH(sk, peer_sk); + if (path) { + new_ctx->path = *path; + sk_ctx->path = *path; + path_get(path); + path_get(path); + } + return 0; +} + +/** + * apparmor_unix_may_send - check perms before conn or sending unix dgrams + * + * other is locked when this hook is called + * + * dgram connect calls may_send, peer setup but path not copied????? + */ +static int apparmor_unix_may_send(struct socket *sock, struct socket *peer) +{ + struct aa_sk_ctx *peer_ctx = aa_sock(peer->sk); + struct aa_label *label; + int error; + + label = __begin_current_label_crit_section(); + error = xcheck(aa_unix_peer_perm(current_cred(), + label, OP_SENDMSG, AA_MAY_SEND, + sock->sk, peer->sk, NULL), + aa_unix_peer_perm(peer->file ? peer->file->f_cred : NULL, + peer_ctx->label, OP_SENDMSG, + AA_MAY_RECEIVE, + peer->sk, sock->sk, label)); + __end_current_label_crit_section(label); + + return error; } /** @@ -879,7 +1377,8 @@ if (!(kern || unconfined(label))) error = af_select(family, create_perm(label, family, type, protocol), - aa_af_perm(label, OP_CREATE, AA_MAY_CREATE, + aa_af_perm(current_cred(), label, + OP_CREATE, AA_MAY_CREATE, family, type, protocol)); end_current_label_crit_section(label); @@ -907,7 +1406,7 @@ label = aa_get_current_label(); if (sock->sk) { - struct aa_sk_ctx *ctx = SK_CTX(sock->sk); + struct aa_sk_ctx *ctx = aa_sock(sock->sk); aa_put_label(ctx->label); ctx->label = aa_get_label(label); @@ -1092,7 +1591,7 @@ */ static int apparmor_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *ctx = aa_sock(sk); if (!skb->secmark) return 0; @@ -1103,14 +1602,30 @@ #endif -static struct aa_label *sk_peer_label(struct sock *sk) +static struct aa_label *sk_peer_get_label(struct sock *sk) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct sock *peer_sk; + struct aa_sk_ctx *ctx = aa_sock(sk); + struct aa_label *label = ERR_PTR(-ENOPROTOOPT); if (ctx->peer) - return ctx->peer; + return aa_get_label(ctx->peer); - return ERR_PTR(-ENOPROTOOPT); + if (sk->sk_family != PF_UNIX) + return ERR_PTR(-ENOPROTOOPT); + + /* check for sockpair peering which does not go through + * security_unix_stream_connect + */ + peer_sk = unix_peer_get(sk); + if (peer_sk) { + ctx = aa_sock(peer_sk); + if (ctx->label) + label = aa_get_label(ctx->label); + sock_put(peer_sk); + } + + return label; } /** @@ -1128,7 +1643,7 @@ struct aa_label *peer; label = begin_current_label_crit_section(); - peer = sk_peer_label(sock->sk); + peer = sk_peer_get_label(sock->sk); if (IS_ERR(peer)) { error = PTR_ERR(peer); goto done; @@ -1139,7 +1654,7 @@ /* don't include terminating \0 in slen, it breaks some apps */ if (slen < 0) { error = -ENOMEM; - goto done; + goto done_put; } if (slen > len) { error = -ERANGE; @@ -1151,6 +1666,9 @@ done_len: if (copy_to_sockptr(optlen, &slen, sizeof(slen))) error = -EFAULT; + +done_put: + aa_put_label(peer); done: end_current_label_crit_section(label); kfree(name); @@ -1158,22 +1676,6 @@ } /** - * apparmor_socket_getpeersec_dgram - get security label of packet - * @sock: the peer socket - * @skb: packet data - * @secid: pointer to where to put the secid of the packet - * - * Sets the netlabel socket state on sk from parent - */ -static int apparmor_socket_getpeersec_dgram(struct socket *sock, - struct sk_buff *skb, u32 *secid) - -{ - /* TODO: requires secid support */ - return -ENOPROTOOPT; -} - -/** * apparmor_sock_graft - Initialize newly created socket * @sk: child sock * @parent: parent socket @@ -1186,7 +1688,7 @@ */ static void apparmor_sock_graft(struct sock *sk, struct socket *parent) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *ctx = aa_sock(sk); if (!ctx->label) ctx->label = aa_get_current_label(); @@ -1196,7 +1698,7 @@ static int apparmor_inet_conn_request(const struct sock *sk, struct sk_buff *skb, struct request_sock *req) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *ctx = aa_sock(sk); if (!skb->secmark) return 0; @@ -1212,15 +1714,29 @@ struct lsm_blob_sizes apparmor_blob_sizes __ro_after_init = { .lbs_cred = sizeof(struct aa_label *), .lbs_file = sizeof(struct aa_file_ctx), + .lbs_inode = sizeof(struct aa_inode_sec), .lbs_task = sizeof(struct aa_task_ctx), + .lbs_ipc = sizeof(struct aa_ipc_sec), + .lbs_msg_msg = sizeof(struct aa_msg_sec), + .lbs_superblock = sizeof(struct aa_superblock_sec), + .lbs_sock = sizeof(struct aa_sk_ctx), +}; + +static struct lsm_id apparmor_lsmid __ro_after_init = { + .lsm = "apparmor", + .id = LSM_ID_APPARMOR, + .features = LSM_ATTR_CURRENT | LSM_ATTR_PREV | LSM_ATTR_EXEC, + .slot = LSMBLOB_NEEDED, }; static struct security_hook_list apparmor_hooks[] __ro_after_init = { LSM_HOOK_INIT(ptrace_access_check, apparmor_ptrace_access_check), LSM_HOOK_INIT(ptrace_traceme, apparmor_ptrace_traceme), + LSM_HOOK_INIT(task_prctl, apparmor_task_prctl), LSM_HOOK_INIT(capget, apparmor_capget), LSM_HOOK_INIT(capable, apparmor_capable), + LSM_HOOK_INIT(move_mount, apparmor_move_mount), LSM_HOOK_INIT(sb_mount, apparmor_sb_mount), LSM_HOOK_INIT(sb_umount, apparmor_sb_umount), LSM_HOOK_INIT(sb_pivotroot, apparmor_sb_pivotroot), @@ -1237,6 +1753,16 @@ LSM_HOOK_INIT(path_truncate, apparmor_path_truncate), LSM_HOOK_INIT(inode_getattr, apparmor_inode_getattr), + LSM_HOOK_INIT(inode_alloc_security, apparmor_inode_alloc_security), + LSM_HOOK_INIT(inode_free_security, apparmor_inode_free_security), + LSM_HOOK_INIT(inode_init_security, apparmor_inode_init_security), + LSM_HOOK_INIT(d_instantiate, apparmor_d_instantiate), + + LSM_HOOK_INIT(inode_create, apparmor_inode_create), + LSM_HOOK_INIT(inode_unlink, apparmor_inode_unlink), + LSM_HOOK_INIT(inode_setattr, apparmor_inode_setattr), + LSM_HOOK_INIT(inode_getattr, apparmor_inode_getattr), + LSM_HOOK_INIT(file_open, apparmor_file_open), LSM_HOOK_INIT(file_receive, apparmor_file_receive), LSM_HOOK_INIT(file_permission, apparmor_file_permission), @@ -1250,10 +1776,12 @@ LSM_HOOK_INIT(getprocattr, apparmor_getprocattr), LSM_HOOK_INIT(setprocattr, apparmor_setprocattr), - LSM_HOOK_INIT(sk_alloc_security, apparmor_sk_alloc_security), LSM_HOOK_INIT(sk_free_security, apparmor_sk_free_security), LSM_HOOK_INIT(sk_clone_security, apparmor_sk_clone_security), + LSM_HOOK_INIT(unix_stream_connect, apparmor_unix_stream_connect), + LSM_HOOK_INIT(unix_may_send, apparmor_unix_may_send), + LSM_HOOK_INIT(socket_create, apparmor_socket_create), LSM_HOOK_INIT(socket_post_create, apparmor_socket_post_create), LSM_HOOK_INIT(socket_bind, apparmor_socket_bind), @@ -1272,8 +1800,6 @@ #endif LSM_HOOK_INIT(socket_getpeersec_stream, apparmor_socket_getpeersec_stream), - LSM_HOOK_INIT(socket_getpeersec_dgram, - apparmor_socket_getpeersec_dgram), LSM_HOOK_INIT(sock_graft, apparmor_sock_graft), #ifdef CONFIG_NETWORK_SECMARK LSM_HOOK_INIT(inet_conn_request, apparmor_inet_conn_request), @@ -1294,6 +1820,7 @@ LSM_HOOK_INIT(task_getsecid_obj, apparmor_task_getsecid_obj), LSM_HOOK_INIT(task_setrlimit, apparmor_task_setrlimit), LSM_HOOK_INIT(task_kill, apparmor_task_kill), + LSM_HOOK_INIT(userns_create, apparmor_userns_create), #ifdef CONFIG_AUDIT LSM_HOOK_INIT(audit_rule_init, aa_audit_rule_init), @@ -1305,6 +1832,11 @@ LSM_HOOK_INIT(secid_to_secctx, apparmor_secid_to_secctx), LSM_HOOK_INIT(secctx_to_secid, apparmor_secctx_to_secid), LSM_HOOK_INIT(release_secctx, apparmor_release_secctx), + +#ifdef CONFIG_IO_URING + LSM_HOOK_INIT(uring_override_creds, apparmor_uring_override_creds), + LSM_HOOK_INIT(uring_sqpoll, apparmor_uring_sqpoll), +#endif }; /* @@ -1347,6 +1879,9 @@ .get = param_get_aalockpolicy }; +static int param_set_debug(const char *val, const struct kernel_param *kp); +static int param_get_debug(char *buffer, const struct kernel_param *kp); + static int param_set_audit(const char *val, const struct kernel_param *kp); static int param_get_audit(char *buffer, const struct kernel_param *kp); @@ -1380,8 +1915,9 @@ aacompressionlevel, 0400); /* Debug mode */ -bool aa_g_debug = IS_ENABLED(CONFIG_SECURITY_APPARMOR_DEBUG_MESSAGES); -module_param_named(debug, aa_g_debug, aabool, S_IRUSR | S_IWUSR); +int aa_g_debug; +module_param_call(debug, param_set_debug, param_get_debug, + &aa_g_debug, S_IRUSR | S_IWUSR); /* Audit mode */ enum audit_mode aa_g_audit; @@ -1574,6 +2110,34 @@ return param_get_int(buffer, kp); } +static int param_get_debug(char *buffer, const struct kernel_param *kp) +{ + if (!apparmor_enabled) + return -EINVAL; + if (apparmor_initialized && !aa_current_policy_view_capable(NULL)) + return -EPERM; + return aa_print_debug_params(buffer); +} + +static int param_set_debug(const char *val, const struct kernel_param *kp) +{ + int i; + + if (!apparmor_enabled) + return -EINVAL; + if (!val) + return -EINVAL; + if (apparmor_initialized && !aa_current_policy_admin_capable(NULL)) + return -EPERM; + + i = aa_parse_debug_params(val); + if (i == DEBUG_PARSE_ERROR) + return -EINVAL; + + aa_g_debug = i; + return 0; +} + static int param_get_audit(char *buffer, const struct kernel_param *kp) { if (!apparmor_enabled) @@ -1632,14 +2196,45 @@ return 0; } +static void update_contention(struct aa_local_cache *cache) +{ + cache->contention += 3; + if (cache->contention > 9) + cache->contention = 9; + cache->hold += 1 << cache->contention; /* 8, 64, 512 */ +} + char *aa_get_buffer(bool in_atomic) { union aa_buffer *aa_buf; + struct aa_local_cache *cache; bool try_again = true; gfp_t flags = (GFP_KERNEL | __GFP_RETRY_MAYFAIL | __GFP_NOWARN); + /* use per cpu cached buffers first */ + cache = get_cpu_ptr(&aa_local_buffers); + if (!list_empty(&cache->head)) { + aa_buf = list_first_entry(&cache->head, union aa_buffer, list); + list_del(&aa_buf->list); + cache->hold--; + cache->count--; + put_cpu_ptr(&aa_local_buffers); + return &aa_buf->buffer[0]; + } + put_cpu_ptr(&aa_local_buffers); + + if (!spin_trylock(&aa_buffers_lock)) { + cache = get_cpu_ptr(&aa_local_buffers); + update_contention(cache); + put_cpu_ptr(&aa_local_buffers); + spin_lock(&aa_buffers_lock); + } else { + cache = get_cpu_ptr(&aa_local_buffers); + if (cache->contention) + cache->contention--; + put_cpu_ptr(&aa_local_buffers); + } retry: - spin_lock(&aa_buffers_lock); if (buffer_count > reserve_count || (in_atomic && !list_empty(&aa_global_buffers))) { aa_buf = list_first_entry(&aa_global_buffers, union aa_buffer, @@ -1665,6 +2260,7 @@ if (!aa_buf) { if (try_again) { try_again = false; + spin_lock(&aa_buffers_lock); goto retry; } pr_warn_once("AppArmor: Failed to allocate a memory buffer.\n"); @@ -1676,15 +2272,42 @@ void aa_put_buffer(char *buf) { union aa_buffer *aa_buf; + struct aa_local_cache *cache; if (!buf) return; aa_buf = container_of(buf, union aa_buffer, buffer[0]); - spin_lock(&aa_buffers_lock); - list_add(&aa_buf->list, &aa_global_buffers); - buffer_count++; - spin_unlock(&aa_buffers_lock); + cache = get_cpu_ptr(&aa_local_buffers); + if (!cache->hold) { + bool must_lock = cache->count >= MAX_LOCAL_COUNT; + + put_cpu_ptr(&aa_local_buffers); + + if (must_lock) { + spin_lock(&aa_buffers_lock); + goto locked; + } else if (spin_trylock(&aa_buffers_lock)) { + locked: + /* put back on global list */ + list_add(&aa_buf->list, &aa_global_buffers); + buffer_count++; + spin_unlock(&aa_buffers_lock); + cache = get_cpu_ptr(&aa_local_buffers); + if (cache->contention) + cache->contention--; + put_cpu_ptr(&aa_local_buffers); + return; + } + /* contention on global list, fallback to percpu */ + cache = get_cpu_ptr(&aa_local_buffers); + update_contention(cache); + } + + /* cache in percpu list */ + list_add(&aa_buf->list, &cache->head); + cache->count++; + put_cpu_ptr(&aa_local_buffers); } /* @@ -1727,6 +2350,16 @@ int i, num; /* + * per cpu set of cached allocated buffers used to help reduce + * lock contention + */ + for_each_possible_cpu(i) { + per_cpu(aa_local_buffers, i).contention = 0; + per_cpu(aa_local_buffers, i).hold = 0; + per_cpu(aa_local_buffers, i).count = 0; + INIT_LIST_HEAD(&per_cpu(aa_local_buffers, i).head); + } + /* * A function may require two buffers at once. Usually the buffers are * used for a short period of time and are shared. On UP kernel buffers * two should be enough, with more CPUs it is possible that more @@ -1764,7 +2397,19 @@ return proc_dointvec(table, write, buffer, lenp, ppos); } +static int userns_restrict_dointvec(struct ctl_table *table, int write, + void *buffer, size_t *lenp, loff_t *ppos) +{ + if (!apparmor_enabled) + return -EINVAL; + if (write && !aa_current_policy_admin_capable(NULL)) + return -EPERM; + + return proc_dointvec(table, write, buffer, lenp, ppos); +} + static struct ctl_table apparmor_sysctl_table[] = { +#ifdef CONFIG_USER_NS { .procname = "unprivileged_userns_apparmor_policy", .data = &unprivileged_userns_apparmor_policy, @@ -1772,6 +2417,7 @@ .mode = 0600, .proc_handler = apparmor_dointvec, }, +#endif /* CONFIG_USER_NS */ { .procname = "apparmor_display_secid_mode", .data = &apparmor_display_secid_mode, @@ -1779,7 +2425,43 @@ .mode = 0600, .proc_handler = apparmor_dointvec, }, - +#ifdef CONFIG_USER_NS + { + .procname = "apparmor_restrict_unprivileged_userns", + .data = &unprivileged_userns_restricted, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = userns_restrict_dointvec, + }, + { + .procname = "apparmor_restrict_unprivileged_userns_force", + .data = &unprivileged_userns_restricted_force, + .maxlen = sizeof(int), + .mode = 0600, + .proc_handler = apparmor_dointvec, + }, + { + .procname = "apparmor_restrict_unprivileged_userns_complain", + .data = &unprivileged_userns_restricted_complain, + .maxlen = sizeof(int), + .mode = 0600, + .proc_handler = apparmor_dointvec, + }, +#endif /* CONFIG_USER_NS */ + { + .procname = "apparmor_restrict_unprivileged_unconfined", + .data = &aa_unprivileged_unconfined_restricted, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = userns_restrict_dointvec, + }, + { + .procname = "apparmor_restrict_unprivileged_io_uring", + .data = &aa_unprivileged_uring_restricted, + .maxlen = sizeof(int), + .mode = 0600, + .proc_handler = apparmor_dointvec, + }, { } }; @@ -1809,7 +2491,7 @@ if (sk == NULL) return NF_ACCEPT; - ctx = SK_CTX(sk); + ctx = aa_sock(sk); if (!apparmor_secmark_check(ctx->label, OP_SENDMSG, AA_MAY_SEND, skb->secmark, sk)) return NF_ACCEPT; @@ -1868,9 +2550,81 @@ __initcall(apparmor_nf_ip_init); #endif +static char nulldfa_src[] = { + #include "nulldfa.in" +}; +struct aa_dfa *nulldfa; + +static char stacksplitdfa_src[] = { + #include "stacksplitdfa.in" +}; +struct aa_dfa *stacksplitdfa; +struct aa_policydb *nullpdb; + +static int __init aa_setup_dfa_engine(void) +{ + int error = -ENOMEM; + + nullpdb = aa_alloc_pdb(GFP_KERNEL); + if (!nullpdb) + return -ENOMEM; + + nulldfa = aa_dfa_unpack(nulldfa_src, sizeof(nulldfa_src), + TO_ACCEPT1_FLAG(YYTD_DATA32) | + TO_ACCEPT2_FLAG(YYTD_DATA32)); + if (IS_ERR(nulldfa)) { + error = PTR_ERR(nulldfa); + goto fail; + } + nullpdb->dfa = aa_get_dfa(nulldfa); + nullpdb->perms = kcalloc(2, sizeof(struct aa_perms), GFP_KERNEL); + if (!nullpdb->perms) + goto fail; + nullpdb->size = 2; + + stacksplitdfa = aa_dfa_unpack(stacksplitdfa_src, + sizeof(stacksplitdfa_src), + TO_ACCEPT1_FLAG(YYTD_DATA32) | + TO_ACCEPT2_FLAG(YYTD_DATA32)); + if (IS_ERR(stacksplitdfa)) { + error = PTR_ERR(stacksplitdfa); + goto fail; + } + + return 0; + +fail: + aa_put_pdb(nullpdb); + aa_put_dfa(nulldfa); + nullpdb = NULL; + nulldfa = NULL; + stacksplitdfa = NULL; + + return error; +} + +static void __init aa_teardown_dfa_engine(void) +{ + aa_put_dfa(stacksplitdfa); + aa_put_dfa(nulldfa); + aa_put_pdb(nullpdb); + nullpdb = NULL; + stacksplitdfa = NULL; + nulldfa = NULL; +} + static int __init apparmor_init(void) { - int error; + int error = -ENOMEM; + + /* setup allocation caches */ + aa_audit_slab = kmem_cache_create("apparmor_auditcache", + sizeof(struct aa_audit_node), + 0, SLAB_PANIC, NULL); + if (!aa_audit_slab) { + AA_ERROR("Unable to setup auditdata slab cache\n"); + goto alloc_out; + } error = aa_setup_dfa_engine(); if (error) { @@ -1904,7 +2658,7 @@ goto buffers_out; } security_add_hooks(apparmor_hooks, ARRAY_SIZE(apparmor_hooks), - "apparmor"); + &apparmor_lsmid); /* Report that AppArmor successfully initialized */ apparmor_initialized = 1; @@ -1922,6 +2676,7 @@ alloc_out: aa_destroy_aafs(); aa_teardown_dfa_engine(); + kmem_cache_destroy(aa_audit_slab); apparmor_enabled = false; return error; @@ -1929,7 +2684,7 @@ DEFINE_LSM(apparmor) = { .name = "apparmor", - .flags = LSM_FLAG_LEGACY_MAJOR | LSM_FLAG_EXCLUSIVE, + .flags = LSM_FLAG_LEGACY_MAJOR, .enabled = &apparmor_enabled, .blobs = &apparmor_blob_sizes, .init = apparmor_init, --- linux-azure-6.5.0.orig/security/apparmor/match.c +++ linux-azure-6.5.0/security/apparmor/match.c @@ -21,50 +21,6 @@ #define base_idx(X) ((X) & 0xffffff) -static char nulldfa_src[] = { - #include "nulldfa.in" -}; -struct aa_dfa *nulldfa; - -static char stacksplitdfa_src[] = { - #include "stacksplitdfa.in" -}; -struct aa_dfa *stacksplitdfa; - -int __init aa_setup_dfa_engine(void) -{ - int error; - - nulldfa = aa_dfa_unpack(nulldfa_src, sizeof(nulldfa_src), - TO_ACCEPT1_FLAG(YYTD_DATA32) | - TO_ACCEPT2_FLAG(YYTD_DATA32)); - if (IS_ERR(nulldfa)) { - error = PTR_ERR(nulldfa); - nulldfa = NULL; - return error; - } - - stacksplitdfa = aa_dfa_unpack(stacksplitdfa_src, - sizeof(stacksplitdfa_src), - TO_ACCEPT1_FLAG(YYTD_DATA32) | - TO_ACCEPT2_FLAG(YYTD_DATA32)); - if (IS_ERR(stacksplitdfa)) { - aa_put_dfa(nulldfa); - nulldfa = NULL; - error = PTR_ERR(stacksplitdfa); - stacksplitdfa = NULL; - return error; - } - - return 0; -} - -void __init aa_teardown_dfa_engine(void) -{ - aa_put_dfa(stacksplitdfa); - aa_put_dfa(nulldfa); -} - /** * unpack_table - unpack a dfa table (one of accept, default, base, next check) * @blob: data to unpack (NOT NULL) --- linux-azure-6.5.0.orig/security/apparmor/mount.c +++ linux-azure-6.5.0/security/apparmor/mount.c @@ -86,32 +86,34 @@ static void audit_cb(struct audit_buffer *ab, void *va) { struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); - if (aad(sa)->mnt.type) { + if (ad->mnt.type) { audit_log_format(ab, " fstype="); - audit_log_untrustedstring(ab, aad(sa)->mnt.type); + audit_log_untrustedstring(ab, ad->mnt.type); } - if (aad(sa)->mnt.src_name) { + if (ad->mnt.src_name) { audit_log_format(ab, " srcname="); - audit_log_untrustedstring(ab, aad(sa)->mnt.src_name); + audit_log_untrustedstring(ab, ad->mnt.src_name); } - if (aad(sa)->mnt.trans) { + if (ad->mnt.trans) { audit_log_format(ab, " trans="); - audit_log_untrustedstring(ab, aad(sa)->mnt.trans); + audit_log_untrustedstring(ab, ad->mnt.trans); } - if (aad(sa)->mnt.flags) { + if (ad->mnt.flags) { audit_log_format(ab, " flags=\""); - audit_mnt_flags(ab, aad(sa)->mnt.flags); + audit_mnt_flags(ab, ad->mnt.flags); audit_log_format(ab, "\""); } - if (aad(sa)->mnt.data) { + if (ad->mnt.data) { audit_log_format(ab, " options="); - audit_log_untrustedstring(ab, aad(sa)->mnt.data); + audit_log_untrustedstring(ab, ad->mnt.data); } } /** * audit_mount - handle the auditing of mount operations + * @subj_cred: cred of the subject * @profile: the profile being enforced (NOT NULL) * @op: operation being mediated (NOT NULL) * @name: name of object being mediated (MAYBE NULL) @@ -127,14 +129,15 @@ * * Returns: %0 or error on failure */ -static int audit_mount(struct aa_profile *profile, const char *op, +static int audit_mount(const struct cred *subj_cred, + struct aa_profile *profile, const char *op, const char *name, const char *src_name, const char *type, const char *trans, unsigned long flags, const void *data, u32 request, struct aa_perms *perms, const char *info, int error) { int audit_type = AUDIT_APPARMOR_AUTO; - DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, AA_CLASS_MOUNT, op); + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_MOUNT, op); if (likely(!error)) { u32 mask = perms->audit; @@ -165,17 +168,18 @@ return error; } - aad(&sa)->name = name; - aad(&sa)->mnt.src_name = src_name; - aad(&sa)->mnt.type = type; - aad(&sa)->mnt.trans = trans; - aad(&sa)->mnt.flags = flags; + ad.subj_cred = subj_cred; + ad.name = name; + ad.mnt.src_name = src_name; + ad.mnt.type = type; + ad.mnt.trans = trans; + ad.mnt.flags = flags; if (data && (perms->audit & AA_AUDIT_DATA)) - aad(&sa)->mnt.data = data; - aad(&sa)->info = info; - aad(&sa)->error = error; + ad.mnt.data = data; + ad.info = info; + ad.error = error; - return aa_audit(audit_type, profile, &sa, audit_cb); + return aa_audit(audit_type, profile, &ad, audit_cb); } /** @@ -283,6 +287,7 @@ /** * match_mnt_path_str - handle path matching for mount + * @subj_cred: cred of confined subject * @profile: the confining profile * @mntpath: for the mntpnt (NOT NULL) * @buffer: buffer to be used to lookup mntpath @@ -295,7 +300,8 @@ * * Returns: 0 on success else error */ -static int match_mnt_path_str(struct aa_profile *profile, +static int match_mnt_path_str(const struct cred *subj_cred, + struct aa_profile *profile, const struct path *mntpath, char *buffer, const char *devname, const char *type, unsigned long flags, void *data, bool binary, @@ -326,8 +332,8 @@ } error = -EACCES; - pos = do_match_mnt(&rules->policy, - rules->policy.start[AA_CLASS_MOUNT], + pos = do_match_mnt(rules->policy, + rules->policy->start[AA_CLASS_MOUNT], mntpnt, devname, type, flags, data, binary, &perms); if (pos) { info = mnt_info_table[pos]; @@ -336,12 +342,14 @@ error = 0; audit: - return audit_mount(profile, OP_MOUNT, mntpnt, devname, type, NULL, + return audit_mount(subj_cred, profile, OP_MOUNT, mntpnt, devname, + type, NULL, flags, data, AA_MAY_MOUNT, &perms, info, error); } /** * match_mnt - handle path matching for mount + * @subj_cred: cred of the subject * @profile: the confining profile * @path: for the mntpnt (NOT NULL) * @buffer: buffer to be used to lookup mntpath @@ -354,7 +362,8 @@ * * Returns: 0 on success else error */ -static int match_mnt(struct aa_profile *profile, const struct path *path, +static int match_mnt(const struct cred *subj_cred, + struct aa_profile *profile, const struct path *path, char *buffer, const struct path *devpath, char *devbuffer, const char *type, unsigned long flags, void *data, bool binary) @@ -378,11 +387,12 @@ devname = ERR_PTR(error); } - return match_mnt_path_str(profile, path, buffer, devname, type, flags, - data, binary, info); + return match_mnt_path_str(subj_cred, profile, path, buffer, devname, + type, flags, data, binary, info); } -int aa_remount(struct aa_label *label, const struct path *path, +int aa_remount(const struct cred *subj_cred, + struct aa_label *label, const struct path *path, unsigned long flags, void *data) { struct aa_profile *profile; @@ -399,14 +409,16 @@ if (!buffer) return -ENOMEM; error = fn_for_each_confined(label, profile, - match_mnt(profile, path, buffer, NULL, NULL, NULL, + match_mnt(subj_cred, profile, path, buffer, NULL, + NULL, NULL, flags, data, binary)); aa_put_buffer(buffer); return error; } -int aa_bind_mount(struct aa_label *label, const struct path *path, +int aa_bind_mount(const struct cred *subj_cred, + struct aa_label *label, const struct path *path, const char *dev_name, unsigned long flags) { struct aa_profile *profile; @@ -433,8 +445,8 @@ goto out; error = fn_for_each_confined(label, profile, - match_mnt(profile, path, buffer, &old_path, old_buffer, - NULL, flags, NULL, false)); + match_mnt(subj_cred, profile, path, buffer, &old_path, + old_buffer, NULL, flags, NULL, false)); out: aa_put_buffer(buffer); aa_put_buffer(old_buffer); @@ -443,7 +455,8 @@ return error; } -int aa_mount_change_type(struct aa_label *label, const struct path *path, +int aa_mount_change_type(const struct cred *subj_cred, + struct aa_label *label, const struct path *path, unsigned long flags) { struct aa_profile *profile; @@ -461,50 +474,67 @@ if (!buffer) return -ENOMEM; error = fn_for_each_confined(label, profile, - match_mnt(profile, path, buffer, NULL, NULL, NULL, + match_mnt(subj_cred, profile, path, buffer, NULL, + NULL, NULL, flags, NULL, false)); aa_put_buffer(buffer); return error; } -int aa_move_mount(struct aa_label *label, const struct path *path, - const char *orig_name) +int aa_move_mount(const struct cred *subj_cred, + struct aa_label *label, const struct path *from_path, + const struct path *to_path) { struct aa_profile *profile; - char *buffer = NULL, *old_buffer = NULL; - struct path old_path; + char *to_buffer = NULL, *from_buffer = NULL; int error; AA_BUG(!label); - AA_BUG(!path); + AA_BUG(!from_path); + AA_BUG(!to_path); + + to_buffer = aa_get_buffer(false); + from_buffer = aa_get_buffer(false); + error = -ENOMEM; + if (!to_buffer || !from_buffer) + goto out; + + if (!our_mnt(from_path->mnt)) + /* moving a mount detached from the namespace */ + from_path = NULL; + error = fn_for_each_confined(label, profile, + match_mnt(subj_cred, profile, to_path, to_buffer, + from_path, from_buffer, + NULL, MS_MOVE, NULL, false)); +out: + aa_put_buffer(to_buffer); + aa_put_buffer(from_buffer); + + return error; +} + +int aa_move_mount_old(const struct cred *subj_cred, struct aa_label *label, + const struct path *path, const char *orig_name) +{ + struct path old_path; + int error; if (!orig_name || !*orig_name) return -EINVAL; - error = kern_path(orig_name, LOOKUP_FOLLOW, &old_path); if (error) return error; - buffer = aa_get_buffer(false); - old_buffer = aa_get_buffer(false); - error = -ENOMEM; - if (!buffer || !old_buffer) - goto out; - error = fn_for_each_confined(label, profile, - match_mnt(profile, path, buffer, &old_path, old_buffer, - NULL, MS_MOVE, NULL, false)); -out: - aa_put_buffer(buffer); - aa_put_buffer(old_buffer); + error = aa_move_mount(subj_cred, label, &old_path, path); path_put(&old_path); return error; } -int aa_new_mount(struct aa_label *label, const char *dev_name, - const struct path *path, const char *type, unsigned long flags, - void *data) +int aa_new_mount(const struct cred *subj_cred, struct aa_label *label, + const char *dev_name, const struct path *path, + const char *type, unsigned long flags, void *data) { struct aa_profile *profile; char *buffer = NULL, *dev_buffer = NULL; @@ -549,12 +579,14 @@ goto out; } error = fn_for_each_confined(label, profile, - match_mnt(profile, path, buffer, dev_path, dev_buffer, + match_mnt(subj_cred, profile, path, buffer, + dev_path, dev_buffer, type, flags, data, binary)); } else { error = fn_for_each_confined(label, profile, - match_mnt_path_str(profile, path, buffer, dev_name, - type, flags, data, binary, NULL)); + match_mnt_path_str(subj_cred, profile, path, + buffer, dev_name, + type, flags, data, binary, NULL)); } out: @@ -566,7 +598,8 @@ return error; } -static int profile_umount(struct aa_profile *profile, const struct path *path, +static int profile_umount(const struct cred *subj_cred, + struct aa_profile *profile, const struct path *path, char *buffer) { struct aa_ruleset *rules = list_first_entry(&profile->rules, @@ -587,19 +620,21 @@ if (error) goto audit; - state = aa_dfa_match(rules->policy.dfa, - rules->policy.start[AA_CLASS_MOUNT], + state = aa_dfa_match(rules->policy->dfa, + rules->policy->start[AA_CLASS_MOUNT], name); - perms = *aa_lookup_perms(&rules->policy, state); + perms = *aa_lookup_perms(rules->policy, state); if (AA_MAY_UMOUNT & ~perms.allow) error = -EACCES; audit: - return audit_mount(profile, OP_UMOUNT, name, NULL, NULL, NULL, 0, NULL, + return audit_mount(subj_cred, profile, OP_UMOUNT, name, NULL, NULL, + NULL, 0, NULL, AA_MAY_UMOUNT, &perms, info, error); } -int aa_umount(struct aa_label *label, struct vfsmount *mnt, int flags) +int aa_umount(const struct cred *subj_cred, struct aa_label *label, + struct vfsmount *mnt, int flags) { struct aa_profile *profile; char *buffer = NULL; @@ -614,7 +649,7 @@ return -ENOMEM; error = fn_for_each_confined(label, profile, - profile_umount(profile, &path, buffer)); + profile_umount(subj_cred, profile, &path, buffer)); aa_put_buffer(buffer); return error; @@ -624,7 +659,8 @@ * * Returns: label for transition or ERR_PTR. Does not return NULL */ -static struct aa_label *build_pivotroot(struct aa_profile *profile, +static struct aa_label *build_pivotroot(const struct cred *subj_cred, + struct aa_profile *profile, const struct path *new_path, char *new_buffer, const struct path *old_path, @@ -658,18 +694,19 @@ goto audit; error = -EACCES; - state = aa_dfa_match(rules->policy.dfa, - rules->policy.start[AA_CLASS_MOUNT], + state = aa_dfa_match(rules->policy->dfa, + rules->policy->start[AA_CLASS_MOUNT], new_name); - state = aa_dfa_null_transition(rules->policy.dfa, state); - state = aa_dfa_match(rules->policy.dfa, state, old_name); - perms = *aa_lookup_perms(&rules->policy, state); + state = aa_dfa_null_transition(rules->policy->dfa, state); + state = aa_dfa_match(rules->policy->dfa, state, old_name); + perms = *aa_lookup_perms(rules->policy, state); if (AA_MAY_PIVOTROOT & perms.allow) error = 0; audit: - error = audit_mount(profile, OP_PIVOTROOT, new_name, old_name, + error = audit_mount(subj_cred, profile, OP_PIVOTROOT, new_name, + old_name, NULL, trans_name, 0, NULL, AA_MAY_PIVOTROOT, &perms, info, error); if (error) @@ -678,7 +715,8 @@ return aa_get_newest_label(&profile->label); } -int aa_pivotroot(struct aa_label *label, const struct path *old_path, +int aa_pivotroot(const struct cred *subj_cred, struct aa_label *label, + const struct path *old_path, const struct path *new_path) { struct aa_profile *profile; @@ -696,7 +734,8 @@ if (!old_buffer || !new_buffer) goto out; target = fn_label_build(label, profile, GFP_KERNEL, - build_pivotroot(profile, new_path, new_buffer, + build_pivotroot(subj_cred, profile, new_path, + new_buffer, old_path, old_buffer)); if (!target) { info = "label build failed"; @@ -722,7 +761,8 @@ fail: /* TODO: add back in auditing of new_name and old_name */ error = fn_for_each(label, profile, - audit_mount(profile, OP_PIVOTROOT, NULL /*new_name */, + audit_mount(subj_cred, profile, OP_PIVOTROOT, + NULL /*new_name */, NULL /* old_name */, NULL, NULL, 0, NULL, AA_MAY_PIVOTROOT, &nullperms, info, --- linux-azure-6.5.0.orig/security/apparmor/net.c +++ linux-azure-6.5.0/security/apparmor/net.c @@ -8,6 +8,7 @@ * Copyright 2009-2017 Canonical Ltd. */ +#include "include/af_unix.h" #include "include/apparmor.h" #include "include/audit.h" #include "include/cred.h" @@ -24,6 +25,12 @@ { } }; +struct aa_sfs_entry aa_sfs_entry_network_compat[] = { + AA_SFS_FILE_STRING("af_mask", AA_SFS_AF_MASK), + AA_SFS_FILE_BOOLEAN("af_unix", 1), + { } +}; + static const char * const net_mask_names[] = { "unknown", "send", @@ -66,46 +73,95 @@ "unknown", }; +static void audit_unix_addr(struct audit_buffer *ab, const char *str, + struct sockaddr_un *addr, int addrlen) +{ + int len = unix_addr_len(addrlen); + + if (!addr || len <= 0) { + audit_log_format(ab, " %s=none", str); + } else if (addr->sun_path[0]) { + audit_log_format(ab, " %s=", str); + audit_log_untrustedstring(ab, addr->sun_path); + } else { + audit_log_format(ab, " %s=\"@", str); + if (audit_string_contains_control(&addr->sun_path[1], len - 1)) + audit_log_n_hex(ab, &addr->sun_path[1], len - 1); + else + audit_log_format(ab, "%.*s", len - 1, + &addr->sun_path[1]); + audit_log_format(ab, "\""); + } +} + +static void audit_unix_sk_addr(struct audit_buffer *ab, const char *str, + const struct sock *sk) +{ + const struct unix_sock *u = unix_sk(sk); + + if (u && u->addr) + audit_unix_addr(ab, str, u->addr->name, u->addr->len); + else + audit_unix_addr(ab, str, NULL, 0); +} /* audit callback for net specific fields */ void audit_net_cb(struct audit_buffer *ab, void *va) { struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); - if (address_family_names[sa->u.net->family]) + if (address_family_names[ad->common.u.net->family]) audit_log_format(ab, " family=\"%s\"", - address_family_names[sa->u.net->family]); + address_family_names[ad->common.u.net->family]); else audit_log_format(ab, " family=\"unknown(%d)\"", - sa->u.net->family); - if (sock_type_names[aad(sa)->net.type]) + ad->common.u.net->family); + if (sock_type_names[ad->net.type]) audit_log_format(ab, " sock_type=\"%s\"", - sock_type_names[aad(sa)->net.type]); + sock_type_names[ad->net.type]); else audit_log_format(ab, " sock_type=\"unknown(%d)\"", - aad(sa)->net.type); - audit_log_format(ab, " protocol=%d", aad(sa)->net.protocol); + ad->net.type); + audit_log_format(ab, " protocol=%d", ad->net.protocol); - if (aad(sa)->request & NET_PERMS_MASK) { + if (ad->request & NET_PERMS_MASK) { audit_log_format(ab, " requested_mask="); - aa_audit_perm_mask(ab, aad(sa)->request, NULL, 0, + aa_audit_perm_mask(ab, ad->request, NULL, 0, net_mask_names, NET_PERMS_MASK); - if (aad(sa)->denied & NET_PERMS_MASK) { + if (ad->denied & NET_PERMS_MASK) { audit_log_format(ab, " denied_mask="); - aa_audit_perm_mask(ab, aad(sa)->denied, NULL, 0, + aa_audit_perm_mask(ab, ad->denied, NULL, 0, net_mask_names, NET_PERMS_MASK); } } - if (aad(sa)->peer) { + if (ad->common.u.net->family == AF_UNIX) { + if ((ad->request & ~NET_PEER_MASK) && ad->net.addr) + audit_unix_addr(ab, "addr", + unix_addr(ad->net.addr), + ad->net.addrlen); + else + audit_unix_sk_addr(ab, "addr", ad->common.u.net->sk); + if (ad->request & NET_PEER_MASK) { + if (ad->net.addr) + audit_unix_addr(ab, "peer_addr", + unix_addr(ad->net.addr), + ad->net.addrlen); + else + audit_unix_sk_addr(ab, "peer_addr", + ad->net.peer_sk); + } + } + if (ad->peer) { audit_log_format(ab, " peer="); - aa_label_xaudit(ab, labels_ns(aad(sa)->label), aad(sa)->peer, + aa_label_xaudit(ab, labels_ns(ad->subj_label), ad->peer, FLAGS_NONE, GFP_ATOMIC); } } /* Generic af perm */ -int aa_profile_af_perm(struct aa_profile *profile, struct common_audit_data *sa, +int aa_profile_af_perm(struct aa_profile *profile, struct apparmor_audit_data *ad, u32 request, u16 family, int type) { struct aa_ruleset *rules = list_first_entry(&profile->rules, @@ -120,34 +176,46 @@ if (profile_unconfined(profile)) return 0; state = RULE_MEDIATES(rules, AA_CLASS_NET); - if (!state) - return 0; + if (state) { + buffer[0] = cpu_to_be16(family); + buffer[1] = cpu_to_be16((u16) type); + state = aa_dfa_match_len(rules->policy->dfa, state, + (char *) &buffer, 4); + perms = *aa_lookup_perms(rules->policy, state); + } else if (profile->net_compat) { + /* 2.x socket mediation compat */ + perms.allow = (profile->net_compat->allow[family] & (1 << type)) ? + ALL_PERMS_MASK : 0; + perms.audit = (profile->net_compat->audit[family] & (1 << type)) ? + ALL_PERMS_MASK : 0; + perms.quiet = (profile->net_compat->quiet[family] & (1 << type)) ? + ALL_PERMS_MASK : 0; - buffer[0] = cpu_to_be16(family); - buffer[1] = cpu_to_be16((u16) type); - state = aa_dfa_match_len(rules->policy.dfa, state, (char *) &buffer, - 4); - perms = *aa_lookup_perms(&rules->policy, state); + } else { + return 0; + } aa_apply_modes_to_perms(profile, &perms); - return aa_check_perms(profile, &perms, request, sa, audit_net_cb); + return aa_check_perms(profile, &perms, request, ad, audit_net_cb); } -int aa_af_perm(struct aa_label *label, const char *op, u32 request, u16 family, - int type, int protocol) +int aa_af_perm(const struct cred *subj_cred, struct aa_label *label, + const char *op, u32 request, u16 family, int type, int protocol) { struct aa_profile *profile; - DEFINE_AUDIT_NET(sa, op, NULL, family, type, protocol); + DEFINE_AUDIT_NET(ad, op, NULL, family, type, protocol); return fn_for_each_confined(label, profile, - aa_profile_af_perm(profile, &sa, request, family, + aa_profile_af_perm(profile, &ad, request, family, type)); } -static int aa_label_sk_perm(struct aa_label *label, const char *op, u32 request, +static int aa_label_sk_perm(const struct cred *subj_cred, + struct aa_label *label, + const char *op, u32 request, struct sock *sk) { - struct aa_sk_ctx *ctx = SK_CTX(sk); + struct aa_sk_ctx *ctx = aa_sock(sk); int error = 0; AA_BUG(!label); @@ -155,10 +223,11 @@ if (ctx->label != kernel_t && !unconfined(label)) { struct aa_profile *profile; - DEFINE_AUDIT_SK(sa, op, sk); + DEFINE_AUDIT_SK(ad, op, sk); + ad.subj_cred = subj_cred; error = fn_for_each_confined(label, profile, - aa_profile_af_sk_perm(profile, &sa, request, sk)); + aa_profile_af_sk_perm(profile, &ad, request, sk)); } return error; @@ -174,21 +243,24 @@ /* TODO: switch to begin_current_label ???? */ label = begin_current_label_crit_section(); - error = aa_label_sk_perm(label, op, request, sk); + error = aa_label_sk_perm(current_cred(), label, op, request, sk); end_current_label_crit_section(label); return error; } -int aa_sock_file_perm(struct aa_label *label, const char *op, u32 request, - struct socket *sock) +int aa_sock_file_perm(const struct cred *subj_cred, struct aa_label *label, + const char *op, u32 request, struct socket *sock) { AA_BUG(!label); AA_BUG(!sock); AA_BUG(!sock->sk); - return aa_label_sk_perm(label, op, request, sock->sk); + return af_select(sock->sk->sk_family, + file_perm(subj_cred, label, op, request, sock), + aa_label_sk_perm(subj_cred, label, op, request, + sock->sk)); } #ifdef CONFIG_NETWORK_SECMARK @@ -214,7 +286,7 @@ } static int aa_secmark_perm(struct aa_profile *profile, u32 request, u32 secid, - struct common_audit_data *sa) + struct apparmor_audit_data *ad) { int i, ret; struct aa_perms perms = { }; @@ -245,17 +317,17 @@ aa_apply_modes_to_perms(profile, &perms); - return aa_check_perms(profile, &perms, request, sa, audit_net_cb); + return aa_check_perms(profile, &perms, request, ad, audit_net_cb); } int apparmor_secmark_check(struct aa_label *label, char *op, u32 request, u32 secid, const struct sock *sk) { struct aa_profile *profile; - DEFINE_AUDIT_SK(sa, op, sk); + DEFINE_AUDIT_SK(ad, op, sk); return fn_for_each_confined(label, profile, aa_secmark_perm(profile, request, secid, - &sa)); + &ad)); } #endif --- linux-azure-6.5.0.orig/security/apparmor/notify.c +++ linux-azure-6.5.0/security/apparmor/notify.c @@ -0,0 +1,1058 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * AppArmor security module + * + * This file contains AppArmor notifications function definitions. + * + * Copyright 2019 Canonical Ltd. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2 of the + * License. + */ +#include +#include +#include + +#include + +#include "include/audit.h" +#include "include/cred.h" +#include "include/lib.h" +#include "include/notify.h" +#include "include/policy_ns.h" + +/* TODO: when adding listener or ns propagate, on recursive add to child ns */ + +// TODO: currently all knotif will have audit_node but not all in future +static inline struct aa_knotif *aa_get_knotif(struct aa_knotif *knotif) +{ + if (knotif) + aa_get_audit_node(container_of(knotif, struct aa_audit_node, + knotif)); + + return knotif; +} + +static inline void aa_put_knotif(struct aa_knotif *knotif) +{ + if (knotif) + aa_put_audit_node(container_of(knotif, struct aa_audit_node, + knotif)); +} + +static void put_refs(struct aa_listener *listener, struct aa_knotif *knotif) +{ + aa_put_listener(listener); + aa_put_knotif(knotif); +} + +static void get_refs(struct aa_listener *listener, struct aa_knotif *knotif) +{ + aa_get_listener(listener); + aa_get_knotif(knotif); +} + +static void __knotif_del_and_hold(struct aa_knotif *knotif) +{ + list_del_init(&knotif->list); + knotif->flags &= ~KNOTIF_ON_LIST; + /* keep list refcounts */ +} + +static void __list_append_held(struct list_head *lh, struct aa_knotif *knotif) +{ + AA_BUG(!lh); + AA_BUG(!knotif); + + list_add_tail_entry(knotif, lh, list); + knotif->flags |= KNOTIF_ON_LIST; +} + +static void __list_push_held(struct list_head *lh, struct aa_knotif *knotif) +{ + AA_BUG(!lh); + AA_BUG(!knotif); + + list_add_entry(knotif, lh, list); + knotif->flags |= KNOTIF_ON_LIST; +} + +static void __listener_add_knotif(struct aa_listener *listener, + struct aa_knotif *knotif) +{ + AA_BUG(!listener); + AA_BUG(!knotif); + lockdep_assert_held(&listener->lock); + + get_refs(listener, knotif); + __list_append_held(&listener->notifications, knotif); +} + +// drops refs +static void __listener_del_knotif(struct aa_listener *listener, + struct aa_knotif *knotif) +{ + AA_BUG(!listener); + AA_BUG(!knotif); + lockdep_assert_held(&listener->lock); + + list_del_init(&knotif->list); + if (knotif->flags & KNOTIF_ON_LIST) { + knotif->flags &= ~KNOTIF_ON_LIST; + put_refs(listener, knotif); + } +} + +void aa_free_listener_proxy(struct aa_listener_proxy *proxy) +{ + if (proxy) { + AA_BUG(!list_empty(&proxy->llist)); + AA_BUG(!list_empty(&proxy->nslist)); + + aa_put_ns(proxy->ns); + /* listener is owned by file, handled there */ + kfree_sensitive(proxy); + } +} + +static struct aa_listener_proxy *new_listener_proxy(struct aa_listener *listener, + struct aa_ns *ns) +{ + struct aa_listener_proxy *proxy; + + AA_BUG(!listener); + lockdep_assert_not_held(&listener->lock); + + proxy = kzalloc(sizeof(*proxy), GFP_KERNEL); + if (!proxy) + return NULL; + INIT_LIST_HEAD(&proxy->llist); + INIT_LIST_HEAD(&proxy->nslist); + + proxy->listener = listener; + if (ns) + ns = aa_get_ns(ns); + else + ns = aa_get_current_ns(); + proxy->ns = ns; + + spin_lock(&listener->lock); + list_add_tail_entry(proxy, &listener->ns_proxies, llist); + spin_unlock(&listener->lock); + + spin_lock(&ns->listener_lock); + list_add_tail_entry(proxy, &ns->listeners, nslist); + spin_unlock(&ns->listener_lock); + + return proxy; +} + + +bool aa_register_listener_proxy(struct aa_listener *listener, struct aa_ns *ns) +{ + struct aa_listener_proxy *proxy; + + AA_BUG(!listener); + + proxy = new_listener_proxy(listener, ns); + if (!proxy) + return false; + + return true; +} + +static void free_listener(struct aa_listener *listener) +{ + struct aa_listener_proxy *proxy; + struct aa_knotif *knotif; + + if (!listener) + return; + + wake_up_interruptible_poll(&listener->wait, EPOLLIN | EPOLLRDNORM); + + spin_lock(&listener->lock); + while (!list_empty(&listener->ns_proxies)) { + proxy = list_first_entry(&listener->ns_proxies, + struct aa_listener_proxy, + llist); + list_del_init(&proxy->llist); + spin_unlock(&listener->lock); + + spin_lock(&proxy->ns->listener_lock); + list_del_init(&proxy->nslist); + spin_unlock(&proxy->ns->listener_lock); + + aa_put_ns(proxy->ns); + kfree_sensitive(proxy); + + spin_lock(&listener->lock); + } + spin_unlock(&listener->lock); + + spin_lock(&listener->lock); + while (!list_empty(&listener->notifications)) { + knotif = list_first_entry(&listener->notifications, + struct aa_knotif, + list); + __listener_del_knotif(listener, knotif); + complete(&knotif->ready); + put_refs(listener, knotif); + } + spin_unlock(&listener->lock); + + spin_lock(&listener->lock); + while (!list_empty(&listener->pending)) { + knotif = list_first_entry(&listener->pending, + struct aa_knotif, + list); + __listener_del_knotif(listener, knotif); + complete(&knotif->ready); + put_refs(listener, knotif); + } + spin_unlock(&listener->lock); + + /* todo count on audit_data */ + aa_put_ns(listener->ns); + aa_put_dfa(listener->filter); + + kfree_sensitive(listener); +} + +void aa_listener_kref(struct kref *kref) +{ + struct aa_listener *l = container_of(kref, struct aa_listener, count); + + free_listener(l); +} + +struct aa_listener *aa_new_listener(struct aa_ns *ns, gfp_t gfp) +{ + struct aa_listener *listener = kzalloc(sizeof(*listener), gfp); + + if (!listener) + return NULL; + + kref_init(&listener->count); + spin_lock_init(&listener->lock); + init_waitqueue_head(&listener->wait); + INIT_LIST_HEAD(&listener->ns_proxies); + INIT_LIST_HEAD(&listener->notifications); + INIT_LIST_HEAD(&listener->pending); + kref_init(&listener->count); + + if (ns) + ns = aa_get_ns(ns); + else + ns = aa_get_current_ns(); + listener->ns = ns; + listener->last_id = 1; + + return listener; +} + +static struct aa_knotif *__aa_find_notif_pending(struct aa_listener *listener, + u64 id) +{ + struct aa_knotif *knotif; + + AA_BUG(!listener); + lockdep_assert_held(&listener->lock); + + list_for_each_entry(knotif, &listener->pending, list) { + if (knotif->id == id) + return knotif; + } + + return NULL; +} + +struct aa_knotif *__aa_find_notif(struct aa_listener *listener, u64 id) +{ + struct aa_knotif *knotif; + + AA_BUG(!listener); + lockdep_assert_held(&listener->lock); + + list_for_each_entry(knotif, &listener->notifications, list) { + if (knotif->id == id) + goto out; + } + + knotif = __aa_find_notif_pending(listener, id); +out: + + return knotif; +} + +// don't drop refcounts +struct aa_knotif *listener_pop_and_hold_knotif(struct aa_listener *listener) +{ + struct aa_knotif *knotif = NULL; + + spin_lock(&listener->lock); + if (!list_empty(&listener->notifications)) { + knotif = list_first_entry(&listener->notifications, typeof(*knotif), list); + __knotif_del_and_hold(knotif); + } + spin_unlock(&listener->lock); + + return knotif; +} + +// require refcounts held +void listener_push_held_knotif(struct aa_listener *listener, + struct aa_knotif *knotif) +{ + spin_lock(&listener->lock); + /* listener ref held from pop and hold */ + __list_push_held(&listener->notifications, knotif); + spin_unlock(&listener->lock); + wake_up_interruptible_poll(&listener->wait, EPOLLIN | EPOLLRDNORM); +} + +// require refcounts held +// list of knotifs waiting for response +void listener_append_held_user_pending(struct aa_listener *listener, + struct aa_knotif *knotif) +{ + spin_lock(&listener->lock); + __list_append_held(&listener->pending, knotif); + spin_unlock(&listener->lock); + //extraneous wakeup, called after reading notification + //wake_up_interruptible_poll(&listener->wait, EPOLLOUT | EPOLLWRNORM); +} + +// don't drop refcounts +struct aa_knotif *__del_and_hold_user_pending(struct aa_listener *listener, + u64 id) +{ + struct aa_knotif *knotif; + + AA_BUG(!listener); + lockdep_assert_held(&listener->lock); + + list_for_each_entry(knotif, &listener->pending, list) { + if (knotif->id == id) { + __knotif_del_and_hold(knotif); + return knotif; + } + } + + return NULL; +} + + +/***************** kernel dispatching notification ********************/ + +/* + * cancelled notification message due to non-timer wake-up vs. + * keep alive message + * cancel notification because ns removed? + * - proxy pins ns + * - ns can remove its list of proxies + * - and remove queued notifications + */ + +/* TODO: allow registering on multiple namespaces */ +static bool notification_match(struct aa_listener *listener, + struct aa_audit_node *ad) +{ + if (!(listener->mask & (1 << ad->data.type))) + return false; + + if (listener->filter) { + aa_state_t state; + unsigned int mask; + + AA_DEBUG(DEBUG_UPCALL, "using filter"); + if (!aa_ns_visible(listener->ns, labels_ns(ad->data.subj_label), + false)) + return false; + state = aa_dfa_next(listener->filter, DFA_START, ad->data.type); + state = aa_dfa_match(listener->filter, state, ad->data.subj_label->hname); + if (!state) + return false; + state = aa_dfa_null_transition(listener->filter, state); + state = aa_dfa_match_u16(listener->filter, state, ad->data.class); + mask = ACCEPT_TABLE(listener->filter)[state]; + if (ad->data.request & mask) + return true; + + /* allow for enhanced match conditions in the future + * if (mask & AA_MATCH_CONT) { + * // TODO: match extensions + * } + */ + return false; + } + AA_DEBUG(DEBUG_UPCALL, "matched type mask filter"); + return true; +} + +/* Add a notification to the listener queue and wake up listener??? */ +static void dispatch_notif(struct aa_listener *listener, + u16 ntype, + struct aa_knotif *knotif) +{ + AA_BUG(!listener); + AA_BUG(!knotif); + lockdep_assert_held(&listener->lock); + + AA_DEBUG_ON(knotif->id, DEBUG_UPCALL, + "id %lld: redispatching notification as new id %lld", + knotif->id, listener->last_id); + knotif->ntype = ntype; + knotif->id = ++listener->last_id; + knotif->flags = 0; + // only needed if syncrhonous notit + init_completion(&knotif->ready); + INIT_LIST_HEAD(&knotif->list); + __listener_add_knotif(listener, knotif); + AA_DEBUG(DEBUG_UPCALL, "id %lld: %s wake_up_interruptible", + knotif->id, __func__); + wake_up_interruptible_poll(&listener->wait, EPOLLIN | EPOLLRDNORM); +} + + +/* handle waiting for a user space reply to a notification + * Returns: <0 : error or -ERESTARTSYS if interrupted + * 0 : success + */ +static int handle_synchronous_notif(struct aa_listener *listener, + struct aa_knotif *knotif) +{ + long werr; + int err; + + if (knotif->ad->subj_label->flags & FLAG_INTERRUPTIBLE) + werr = wait_for_completion_interruptible_timeout(&knotif->ready, + msecs_to_jiffies(60000)); + else + /* do not use close to long jiffies so cast is safe */ + werr = (long) wait_for_completion_timeout(&knotif->ready, + msecs_to_jiffies(60000)); + /* time out OR interrupt */ + if (werr <= 0) { + /* ensure knotif is not on list because of early exit */ + spin_lock(&listener->lock); + // puts refs but still have calling refs + __listener_del_knotif(listener, knotif); + spin_unlock(&listener->lock); + if (werr == 0) { + AA_DEBUG(DEBUG_UPCALL, "id %lld: prompt timed out", + knotif->id); + //err = -1; // TODO: ???; + err = 0; + } else if (werr == -ERESTARTSYS) { + // interrupt fired syscall needs to be restarted + // instead of mediated + AA_DEBUG(DEBUG_UPCALL, "id %lld: prompt interrupted, error %ld", + knotif->id, werr); + err = -ERESTARTSYS; + } else { + AA_DEBUG(DEBUG_UPCALL, "id %lld: prompt errored out error %ld", + knotif->id, werr); + err = (int) werr; + } + /* time out is not considered an error and will fallback + * to regular mediation + */ + } else { + err = 0; + spin_lock(&listener->lock); + if (!list_empty(&knotif->list)) { + // puts refs but still have calling refs + __listener_del_knotif(listener, knotif); + AA_DEBUG(DEBUG_UPCALL, + "id %lld: bug prompt knotif still on listener list at notif completion", + knotif->id); + } + spin_unlock(&listener->lock); + } + + return err; +} + +// permissions changed in ad +int aa_do_notification(u16 ntype, struct aa_audit_node *node) +{ + struct aa_ns *ns = labels_ns(node->data.subj_label); + struct aa_listener_proxy *proxy; + struct aa_listener *listener; + struct aa_knotif *knotif; + int count = 0, err = 0; + + AA_BUG(!node); + AA_BUG(!ns); + + knotif = &node->knotif; + + /* TODO: make read side of list walk lockless */ + spin_lock(&ns->listener_lock); + list_for_each_entry(proxy, &ns->listeners, nslist) { + + AA_BUG(!proxy); + listener = aa_get_listener(proxy->listener); + AA_BUG(!listener); + spin_lock(&listener->lock); + if (!notification_match(listener, node)) { + spin_unlock(&listener->lock); + aa_put_listener(listener); + continue; + } + /* delvier notification - dispatch determines if we break */ + dispatch_notif(listener, ntype, knotif); // count); + spin_unlock(&listener->lock); + AA_DEBUG(DEBUG_UPCALL, "id %lld: found listener\n", + knotif->id); + + /* break to prompt */ + if (node->data.type == AUDIT_APPARMOR_USER) { + spin_unlock(&ns->listener_lock); + err = handle_synchronous_notif(listener, knotif); + aa_put_listener(listener); + return err; + } + count++; + aa_put_listener(listener); + } + spin_unlock(&ns->listener_lock); + AA_DEBUG(DEBUG_UPCALL, "id %lld: %d listener matches\n", + knotif->id, count); + + /* count == 0 is no match found. No change to audit params + * long term need to fold prompt perms into denied + **/ + return err; +} + +/******************** task responding to notification **********************/ + +// drop references +// complete anything pending on ready +static void __listener_complete_held_user_pending(struct aa_listener *listener, + struct aa_knotif *knotif) +{ + AA_BUG(!listener); + lockdep_assert_held(&listener->lock); + + __knotif_del_and_hold(knotif); + complete(&knotif->ready); + put_refs(listener, knotif); +} + +static void listener_complete_held_user_pending(struct aa_listener *listener, + struct aa_knotif *knotif) +{ + spin_lock(&listener->lock); + __listener_complete_held_user_pending(listener, knotif); + spin_unlock(&listener->lock); +} + +static bool response_is_valid_perm(struct apparmor_notif_resp_perm *reply, + struct aa_knotif *knotif, u16 size) +{ + if ((knotif->ad->denied) & ~(reply->allow | reply->deny)) { + AA_DEBUG(DEBUG_UPCALL, + "id %lld: response does not cover permission bits in the upcall request/reply 0x%x/0x%x deny/reply 0x%x/0x%x", + knotif->id, knotif->ad->request, reply->allow, knotif->ad->denied, + reply->deny); + return false; + } + return true; + /* TODO: this was disabled per snapd request, setup flag to do check + * // allow bits that were never requested + * if (reply->allow & ~knotif->ad->request) { + * AA_DEBUG(DEBUG_UPCALL, "response allows more than requested"); + * return false; + * } + * // denying perms not in either permission set in the original + * // notification + * if (reply->deny & ~(knotif->ad->request | knotif->ad->denied)) { + * AA_DEBUG(DEBUG_UPCALL, "response denies more than requested"); + * return false; + * } + */ +} + +static bool response_is_valid_name(struct apparmor_notif_resp_name *reply, + struct aa_knotif *knotif, u16 size) +{ + long i; + + if (size <= sizeof(*reply)) { + AA_DEBUG(DEBUG_UPCALL, + "id %lld: reply bad size %u < %ld", + knotif->id, size, sizeof(*reply)); + return -EMSGSIZE; + } + if (reply->name < sizeof(*reply)) { + /* inside of data declared fields */ + AA_DEBUG(DEBUG_UPCALL, + "id %lld: reply bad name offset in fields %u < %ld", + knotif->id, reply->name, sizeof(*reply)); + return -EINVAL; + } + if (reply->name > size) { + AA_DEBUG(DEBUG_UPCALL, + "id %lld: reply name pasted end of data size %u > %ld", + knotif->id, reply->name, sizeof(*reply)); + return -EINVAL; + } + /* currently supported flags */ + if ((reply->perm.base.flags != (URESPONSE_LOOKUP | URESPONSE_PROFILE)) || + (reply->perm.base.flags != (URESPONSE_TAILGLOB))) { + AA_DEBUG(DEBUG_UPCALL, + "id %lld: reply bad flags 0x%x expected 0x%x", + knotif->id, reply->perm.base.flags, + URESPONSE_LOOKUP | URESPONSE_PROFILE); + return -EINVAL; + } + + if ((reply->perm.base.flags == URESPONSE_TAILGLOB) && + !response_is_valid_perm(&reply->perm, knotif, size)) { + AA_DEBUG(DEBUG_UPCALL, + "id %lld: reply bad tail glob perms", + knotif->id); + return false; + } + + /* check name for terminating null */ + for (i = reply->name - sizeof(*reply); i < size - sizeof(*reply); i++) { + if (reply->data[i] == 0) + return true; + } + /* reached end of data without finding null */ + AA_DEBUG(DEBUG_UPCALL, + "id %lld: reply bad no terminating null on name", + knotif->id); + + return false; +} + +/* base checks userspace respnse to a notification is valid */ +static bool response_is_valid(union apparmor_notif_resp *reply, + struct aa_knotif *knotif, u16 size) +{ + if (reply->base.ntype == APPARMOR_NOTIF_RESP_PERM) + return response_is_valid_perm(&reply->perm, knotif, size); + else if (reply->base.ntype == APPARMOR_NOTIF_RESP_NAME) + return response_is_valid_name(&reply->name, knotif, size); + else + return false; + return false; +} + + +/* copy uresponse into knotif */ +static void knotif_update_from_uresp_perm(struct aa_knotif *knotif, + struct apparmor_notif_resp_perm *uresp) +{ + u16 flags; + + if (uresp) { + AA_DEBUG(DEBUG_UPCALL, + "notif %lld: response allow/reply 0x%x/0x%x, denied/reply 0x%x/0x%x, error %d/%d", + knotif->id, knotif->ad->request, uresp->allow, + knotif->ad->denied, uresp->deny, knotif->ad->error, + uresp->base.error); + + knotif->ad->denied = uresp->deny; + knotif->ad->request = (knotif->ad->request | uresp->allow) & + ~uresp->deny; + flags = uresp->base.flags; + if (!knotif->ad->denied) { + /* no more denial, clear the error*/ + knotif->ad->error = 0; + AA_DEBUG(DEBUG_UPCALL, + "notif %lld: response allowed, clearing error\n", + knotif->id); + } else { + AA_DEBUG(DEBUG_UPCALL, + "notif %lld: response denied returning error %d\n", + knotif->id, knotif->ad->error); + } + } else { + AA_DEBUG(DEBUG_UPCALL, + "id %lld: respons bad going with: allow 0x%x, denied 0x%x, error %d", + knotif->id, knotif->ad->request, knotif->ad->denied, + knotif->ad->error); + } + + if (!(flags & URESPONSE_NO_CACHE)) { + /* cache of response requested */ + struct aa_audit_node *node = container_of(knotif, + struct aa_audit_node, + knotif); + struct aa_audit_node *hit; + struct aa_profile *profile = labels_profile(node->data.subj_label); + + AA_DEBUG(DEBUG_UPCALL, "id %lld: inserting cache entry requ 0x%x denied 0x%x", + knotif->id, node->data.request, node->data.denied); + hit = aa_audit_cache_insert(&profile->learning_cache, + node); + AA_DEBUG(DEBUG_UPCALL, + "id %lld: (node %p, hit %p) cache insert %s: name %s node %s\n", + knotif->id, node, hit, hit != node ? "entry already exists" : "", + hit->data.name, node->data.name); + if (hit != node) { + AA_DEBUG(DEBUG_UPCALL, + "id %lld: updating existing cache entry", + knotif->id); + aa_audit_cache_update_ent(&profile->learning_cache, + hit, &node->data); + aa_put_audit_node(hit); + } else { + + AA_DEBUG(DEBUG_UPCALL, "inserted into cache"); + } + /* now to audit */ + } /* cache_response */ +} + + +void aa_free_ruleset(struct aa_ruleset *rules) +{ + if (!rules) + return; + aa_put_pdb(rules->policy); + aa_put_pdb(rules->file); + kfree_sensitive(rules); +} + +struct aa_ruleset *aa_new_ruleset(gfp_t gfp) +{ + struct aa_ruleset *rules = kzalloc(sizeof(*rules), gfp); + + INIT_LIST_HEAD(&rules->list); + + return rules; +} + +struct aa_ruleset *aa_clone_ruleset(struct aa_ruleset *rules) +{ + struct aa_ruleset *clone; + + clone = aa_new_ruleset(GFP_KERNEL); + if (!clone) + return NULL; + clone->size = rules->size; + clone->policy = aa_get_pdb(rules->policy); + clone->file = aa_get_pdb(rules->file); + clone->caps = rules->caps; + clone->rlimits = rules->rlimits; + + /* TODO: secmark */ + return clone; +} + +static long knotif_update_from_uresp_name(struct aa_knotif *knotif, + struct apparmor_notif_resp_name *reply, + u16 size) +{ + struct aa_ruleset *rules; + struct aa_profile *profile; + struct aa_ns *ns; + char *name, *glob; + struct aa_audit_node *clone; + struct aa_audit_node *node = container_of(knotif, + struct aa_audit_node, + knotif); + + ns = aa_get_current_ns(); + name = (char *) &reply->data[reply->name - sizeof(*reply)]; + + if (reply->perm.base.flags == (URESPONSE_LOOKUP | URESPONSE_PROFILE)) { + profile = aa_lookup_profile(ns, name); + if (!profile) { + aa_put_ns(ns); + return -ENOENT; + } + aa_put_ns(ns); + + rules = aa_clone_ruleset(list_first_entry(&profile->rules, + typeof(*rules), list)); + if (!rules) { + aa_put_profile(profile); + return -ENOMEM; + } + AA_DEBUG(DEBUG_UPCALL, + "id %lld: cloned profile '%s' rule set", knotif->id, + profile->base.hname); + aa_put_profile(profile); + + /* add list to profile rules TODO: improve locking*/ + profile = labels_profile(node->data.subj_label); + list_add_tail_entry(rules, &profile->rules, list); + } else if (reply->perm.base.flags == URESPONSE_TAILGLOB) { + // TODO: dedup with cache update in perm + struct aa_audit_node *node = container_of(knotif, + struct aa_audit_node, + knotif); + struct aa_audit_node *hit; + struct aa_profile *profile = labels_profile(node->data.subj_label); + + clone = aa_dup_audit_data(&node->data, GFP_KERNEL); + glob = kstrdup(name, GFP_KERNEL); + if (!name) + return -ENOMEM; + if (!clone) { + kfree(name); + return -ENOMEM; + } + kfree(clone->data.name); + clone->data.name = glob; + clone->data.flags = AUDIT_TAILGLOB_NAME; + clone->knotif.id = knotif->id; + clone->knotif.ntype = knotif->ntype; + node = clone; + knotif = &clone->knotif; + + // now add it to the cache + AA_DEBUG(DEBUG_UPCALL, + "notif %lld: response allow/reply 0x%x/0x%x, denied/reply 0x%x/0x%x, error %d/%d", + knotif->id, knotif->ad->request, reply->perm.allow, + knotif->ad->denied, reply->perm.deny, knotif->ad->error, + reply->base.error); + + knotif->ad->denied = reply->perm.deny; + knotif->ad->request = reply->perm.allow | reply->perm.deny; + + if (!knotif->ad->denied) { + /* no more denial, clear the error*/ + knotif->ad->error = 0; + AA_DEBUG(DEBUG_UPCALL, + "notif %lld: response allowed, clearing error\n", + knotif->id); + } else { + AA_DEBUG(DEBUG_UPCALL, + "notif %lld: response denied returning error %d\n", + knotif->id, knotif->ad->error); + } + + AA_DEBUG(DEBUG_UPCALL, "id %lld: inserting cache entry requ 0x%x denied 0x%x", + knotif->id, node->data.request, node->data.denied); + hit = aa_audit_cache_insert(&profile->learning_cache, + node); + AA_DEBUG(DEBUG_UPCALL, "id %lld: cache insert %s: name %s node %s\n", + knotif->id, hit != node ? "lost race" : "", + hit->data.name, node->data.name); + if (hit != node) { + AA_DEBUG(DEBUG_UPCALL, + "id %lld: updating existing cache entry", + knotif->id); + aa_audit_cache_update_ent(&profile->learning_cache, + hit, &node->data); + aa_put_audit_node(hit); + } else { + + AA_DEBUG(DEBUG_UPCALL, "inserted into cache"); + } + aa_put_audit_node(clone); + } + return size; +} + +/* handle userspace responding to a synchronous notification */ +long aa_listener_unotif_response(struct aa_listener *listener, + union apparmor_notif_resp *uresp, + u16 size) +{ + struct aa_knotif *knotif = NULL; + long ret; + + spin_lock(&listener->lock); + knotif = __del_and_hold_user_pending(listener, uresp->base.id); + if (!knotif) { + ret = -ENOENT; + AA_DEBUG(DEBUG_UPCALL, "could not find id %lld", + uresp->base.id); + goto out; + } + if (!response_is_valid(uresp, knotif, size)) { + ret = -EINVAL; + AA_DEBUG(DEBUG_UPCALL, "id %lld: response not valid", knotif->id); + __listener_complete_held_user_pending(listener, knotif); + goto out; + } + + if (uresp->perm.base.ntype == APPARMOR_NOTIF_RESP_PERM) { + knotif_update_from_uresp_perm(knotif, &uresp->perm); + } else if (uresp->perm.base.ntype == APPARMOR_NOTIF_RESP_NAME) { + size = knotif_update_from_uresp_name(knotif, &uresp->name, size); + } else { + AA_DEBUG(DEBUG_UPCALL, "id %lld: unknown response type", knotif->id); + size = -EINVAL; + } + ret = size; + + AA_DEBUG(DEBUG_UPCALL, "id %lld: completing notif", knotif->id); + __listener_complete_held_user_pending(listener, knotif); +out: + spin_unlock(&listener->lock); + + return ret; +} + +/******************** task reading notification to userspace ****************/ + +static long append_str(void __user *pos, long remaining, const char *str) +{ + long size; + + if (!str) + return 0; + size = strlen(str) + 1; + if (size > remaining) + return -EMSGSIZE; + if (copy_to_user(pos, str, size)) + return -EFAULT; + + return size; +} + +#define build_append_str(__BUF, __POS, __MAX, __STR, __FIELD, __SIZE) \ +({ \ + typeof(__SIZE) __tmp_size; \ + __FIELD = __POS - __BUF; \ + __tmp_size = append_str(__POS, max_size - (__POS - __BUF), __STR); \ + if (__tmp_size >= 0) { \ + __POS += __tmp_size; \ + __SIZE += __tmp_size; \ + } else { \ + __SIZE = __tmp_size; \ + } \ + (__tmp_size >= 0); \ +}) + +/* copy to userspace: notification data */ +static long build_v3_unotif(struct aa_knotif *knotif, void __user *buf, + u16 max_size) +{ + union apparmor_notif_all unotif = { }; + struct user_namespace *user_ns; + struct aa_profile *profile; + void __user *pos; + long size; + + AA_DEBUG(DEBUG_UPCALL, "building notif max size %d", max_size); + size = sizeof(unotif); + profile = labels_profile(knotif->ad->subj_label); + AA_BUG(profile == NULL); + if (size > max_size) + return -EMSGSIZE; + + user_ns = get_user_ns(current->nsproxy->uts_ns->user_ns); + + /* build response */ + unotif.common.len = size; + unotif.common.version = APPARMOR_NOTIFY_VERSION; + unotif.base.ntype = knotif->ntype; + unotif.base.id = knotif->id; + unotif.base.error = knotif->ad->error; + unotif.op.allow = knotif->ad->request & knotif->ad->denied; + unotif.op.deny = knotif->ad->denied; + AA_DEBUG(DEBUG_UPCALL, + "notif %lld: sent to user read request 0x%x, denied 0x%x, error %d", + knotif->id, knotif->ad->request, knotif->ad->denied, knotif->ad->error); + + if (knotif->ad->subjtsk != NULL) { + unotif.op.pid = task_pid_vnr(knotif->ad->subjtsk); + unotif.file.subj_uid = from_kuid(user_ns, task_uid(knotif->ad->subjtsk)); + } + unotif.op.class = knotif->ad->class; + unotif.file.obj_uid = from_kuid(user_ns, knotif->ad->fs.ouid); + + put_user_ns(user_ns); + + pos = buf + sizeof(unotif); + if (!build_append_str(buf, pos, max_size, profile->base.hname, + unotif.op.label, size)) + return size; + if (!build_append_str(buf, pos, max_size, knotif->ad->name, + unotif.file.name, size)) + return size; + + /* set size after appending strings */ + unotif.common.len = size; + /* now the struct, at the start of user mem */ + if (copy_to_user(buf, &unotif, sizeof(unotif))) + return -EFAULT; + + return pos - buf; +} + +// return < 0 == error +// 0 == repeat +// > 0 == built notification successfully +static long build_mediation_unotif(struct aa_listener *listener, + struct aa_knotif *knotif, + void __user *buf, u16 max_size) +{ + long ret; + + switch (knotif->ad->class) { + case AA_CLASS_FILE: + ret = build_v3_unotif(knotif, buf, max_size); + if (ret < 0) { + AA_DEBUG(DEBUG_UPCALL, + "id %lld: (error=%ld) failed to copy data to user reading size %ld, maxsize %d", + knotif->id, ret, + sizeof(union apparmor_notif_all), max_size); + goto out; + } + break; + default: + AA_BUG("unknown notification class"); + AA_DEBUG(DEBUG_UPCALL, "id %lld: unknown notification class", knotif->id); + /* skip and move onto the next notification */ + return 0; + } +out: + return ret; +} + +/* Handle the listener reading a notification into userspace */ +// TODO: output multiple messages in one recv +long aa_listener_unotif_recv(struct aa_listener *listener, void __user *buf, + u16 max_size) +{ + struct aa_knotif *knotif; + long ret; + + do { + knotif = listener_pop_and_hold_knotif(listener); + if (!knotif) { + return -ENOENT; + } + AA_DEBUG(DEBUG_UPCALL, "id %lld: removed notif from listener queue", + knotif->id); + + ret = build_mediation_unotif(listener, knotif, buf, max_size); + if (ret < 0) { + /* failed - drop notif and return error to reader */ + listener_complete_held_user_pending(listener, knotif); + return ret; + } else if (ret > 0) { + /* else notification copied */ + break; + } + /* unknown notification: drop and try next */ + listener_complete_held_user_pending(listener, knotif); + } while (ret == 0); + + /* success */ + if (knotif->ad->type == AUDIT_APPARMOR_USER) { + AA_DEBUG(DEBUG_UPCALL, "id %lld: adding notif to pending", knotif->id); + listener_append_held_user_pending(listener, knotif); + } else { + /* no one waiting on this notification drop it */ + AA_DEBUG(DEBUG_UPCALL, "id %lld: non-prompt audit notif delivered", knotif->id); + listener_complete_held_user_pending(listener, knotif); + } + + return ret; +} --- linux-azure-6.5.0.orig/security/apparmor/policy.c +++ linux-azure-6.5.0/security/apparmor/policy.c @@ -88,6 +88,11 @@ #include "include/resource.h" int unprivileged_userns_apparmor_policy = 1; +int unprivileged_userns_restricted = IS_ENABLED(CONFIG_SECURITY_APPARMOR_RESTRICT_USERNS); +int unprivileged_userns_restricted_force; +int unprivileged_userns_restricted_complain; +int aa_unprivileged_unconfined_restricted = 0; +int aa_unprivileged_uring_restricted; const char *const aa_profile_mode_names[] = { "enforce", @@ -98,6 +103,41 @@ }; +static void aa_free_pdb(struct aa_policydb *policy) +{ + if (policy) { + aa_put_dfa(policy->dfa); + if (policy->perms) + kvfree(policy->perms); + aa_free_str_table(&policy->trans); + } +} + +/** + * aa_pdb_free_kref - free aa_policydb by kref (called by aa_put_pdb) + * @kr: kref callback for freeing of a dfa (NOT NULL) + */ +void aa_pdb_free_kref(struct kref *kref) +{ + struct aa_policydb *pdb = container_of(kref, struct aa_policydb, count); + + aa_free_pdb(pdb); +} + + +struct aa_policydb *aa_alloc_pdb(gfp_t gfp) +{ + struct aa_policydb *pdb = kzalloc(sizeof(struct aa_policydb), gfp); + + if (!pdb) + return NULL; + + kref_init(&pdb->count); + + return pdb; +} + + /** * __add_profile - add a profiles to list and label tree * @list: list to add it to (NOT NULL) @@ -200,15 +240,15 @@ for (i = 0; i < attach->xattr_count; i++) kfree_sensitive(attach->xattrs[i]); kfree_sensitive(attach->xattrs); - aa_destroy_policydb(&attach->xmatch); + aa_put_pdb(attach->xmatch); } static void free_ruleset(struct aa_ruleset *rules) { int i; - aa_destroy_policydb(&rules->file); - aa_destroy_policydb(&rules->policy); + aa_put_pdb(rules->file); + aa_put_pdb(rules->policy); aa_free_cap_rules(&rules->caps); aa_free_rlimit_rules(&rules->rlimits); @@ -244,7 +284,7 @@ struct aa_ruleset *rule, *tmp; struct rhashtable *rht; - AA_DEBUG("%s(%p)\n", __func__, profile); + AA_DEBUG(DEBUG_POLICY, "%s(%p)\n", __func__, profile); if (!profile) return; @@ -255,8 +295,10 @@ aa_put_ns(profile->ns); kfree_sensitive(profile->rename); + kfree_sensitive(profile->disconnected); free_attachment(&profile->attach); + kfree_sensitive(profile->net_compat); /* * at this point there are no tasks that can have a reference @@ -278,6 +320,7 @@ kfree_sensitive(profile->hash); aa_put_loaddata(profile->rawdata); aa_label_destroy(&profile->label); + aa_audit_cache_destroy(&profile->learning_cache); kfree_sensitive(profile); } @@ -326,6 +369,8 @@ profile->label.flags |= FLAG_PROFILE; profile->label.vec[0] = profile; + aa_audit_cache_init(&profile->learning_cache); + /* refcount released by caller */ return profile; @@ -588,17 +633,8 @@ /* TODO: ideally we should inherit abi from parent */ profile->label.flags |= FLAG_NULL; rules = list_first_entry(&profile->rules, typeof(*rules), list); - rules->file.dfa = aa_get_dfa(nulldfa); - rules->file.perms = kcalloc(2, sizeof(struct aa_perms), GFP_KERNEL); - if (!rules->file.perms) - goto fail; - rules->file.size = 2; - rules->policy.dfa = aa_get_dfa(nulldfa); - rules->policy.perms = kcalloc(2, sizeof(struct aa_perms), GFP_KERNEL); - if (!rules->policy.perms) - goto fail; - rules->policy.size = 2; - + rules->file = aa_get_pdb(nullpdb); + rules->policy = aa_get_pdb(nullpdb); if (parent) { profile->path_flags = parent->path_flags; @@ -608,11 +644,6 @@ } return profile; - -fail: - aa_free_profile(profile); - - return NULL; } /** @@ -721,16 +752,17 @@ static void audit_cb(struct audit_buffer *ab, void *va) { struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); - if (aad(sa)->iface.ns) { + if (ad->iface.ns) { audit_log_format(ab, " ns="); - audit_log_untrustedstring(ab, aad(sa)->iface.ns); + audit_log_untrustedstring(ab, ad->iface.ns); } } /** * audit_policy - Do auditing of policy changes - * @label: label to check if it can manage policy + * @subj_label: label to check if it can manage policy * @op: policy operation being performed * @ns_name: name of namespace being manipulated * @name: name of profile being manipulated (NOT NULL) @@ -739,19 +771,19 @@ * * Returns: the error to be returned after audit is done */ -static int audit_policy(struct aa_label *label, const char *op, +static int audit_policy(struct aa_label *subj_label, const char *op, const char *ns_name, const char *name, const char *info, int error) { - DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, op); + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, op); - aad(&sa)->iface.ns = ns_name; - aad(&sa)->name = name; - aad(&sa)->info = info; - aad(&sa)->error = error; - aad(&sa)->label = label; + ad.iface.ns = ns_name; + ad.name = name; + ad.info = info; + ad.error = error; + ad.subj_label = subj_label; - aa_audit_msg(AUDIT_APPARMOR_STATUS, &sa, audit_cb); + aa_audit_msg(AUDIT_APPARMOR_STATUS, &ad, audit_cb); return error; } @@ -759,7 +791,8 @@ /* don't call out to other LSMs in the stack for apparmor policy admin * permissions */ -static int policy_ns_capable(struct aa_label *label, +static int policy_ns_capable(const struct cred *subj_cred, + struct aa_label *label, struct user_namespace *userns, int cap) { int err; @@ -767,23 +800,25 @@ /* check for MAC_ADMIN cap in cred */ err = cap_capable(current_cred(), userns, cap, CAP_OPT_NONE); if (!err) - err = aa_capable(label, cap, CAP_OPT_NONE); + err = aa_capable(subj_cred, label, cap, CAP_OPT_NONE); return err; } /** * aa_policy_view_capable - check if viewing policy in at @ns is allowed - * label: label that is trying to view policy in ns - * ns: namespace being viewed by @label (may be NULL if @label's ns) + * @subj_cred: cred of subject + * @label: label that is trying to view policy in ns + * @ns: namespace being viewed by @label (may be NULL if @label's ns) * Returns: true if viewing policy is allowed * * If @ns is NULL then the namespace being viewed is assumed to be the * tasks current namespace. */ -bool aa_policy_view_capable(struct aa_label *label, struct aa_ns *ns) +bool aa_policy_view_capable(const struct cred *subj_cred, + struct aa_label *label, struct aa_ns *ns) { - struct user_namespace *user_ns = current_user_ns(); + struct user_namespace *user_ns = subj_cred->user_ns; struct aa_ns *view_ns = labels_view(label); bool root_in_user_ns = uid_eq(current_euid(), make_kuid(user_ns, 0)) || in_egroup_p(make_kgid(user_ns, 0)); @@ -800,15 +835,17 @@ return response; } -bool aa_policy_admin_capable(struct aa_label *label, struct aa_ns *ns) +bool aa_policy_admin_capable(const struct cred *subj_cred, + struct aa_label *label, struct aa_ns *ns) { - struct user_namespace *user_ns = current_user_ns(); - bool capable = policy_ns_capable(label, user_ns, CAP_MAC_ADMIN) == 0; + struct user_namespace *user_ns = subj_cred->user_ns; + bool capable = policy_ns_capable(subj_cred, label, user_ns, + CAP_MAC_ADMIN) == 0; - AA_DEBUG("cap_mac_admin? %d\n", capable); - AA_DEBUG("policy locked? %d\n", aa_g_lock_policy); + AA_DEBUG(DEBUG_POLICY, "cap_mac_admin? %d\n", capable); + AA_DEBUG(DEBUG_POLICY, "policy locked? %d\n", aa_g_lock_policy); - return aa_policy_view_capable(label, ns) && capable && + return aa_policy_view_capable(subj_cred, label, ns) && capable && !aa_g_lock_policy; } @@ -818,7 +855,7 @@ bool res; label = __begin_current_label_crit_section(); - res = aa_policy_view_capable(label, ns); + res = aa_policy_view_capable(current_cred(), label, ns); __end_current_label_crit_section(label); return res; @@ -830,7 +867,7 @@ bool res; label = __begin_current_label_crit_section(); - res = aa_policy_admin_capable(label, ns); + res = aa_policy_admin_capable(current_cred(), label, ns); __end_current_label_crit_section(label); return res; @@ -838,12 +875,14 @@ /** * aa_may_manage_policy - can the current task manage policy + * @subj_cred: subject cred * @label: label to check if it can manage policy * @mask: contains the policy manipulation operation being done * * Returns: 0 if the task is allowed to manipulate policy else error */ -int aa_may_manage_policy(struct aa_label *label, struct aa_ns *ns, u32 mask) +int aa_may_manage_policy(const struct cred *subj_cred, struct aa_label *label, + struct aa_ns *ns, u32 mask) { const char *op; @@ -859,7 +898,7 @@ return audit_policy(label, op, NULL, NULL, "policy_locked", -EACCES); - if (!aa_policy_admin_capable(label, ns)) + if (!aa_policy_admin_capable(subj_cred, label, ns)) return audit_policy(label, op, NULL, NULL, "not policy admin", -EACCES); @@ -1188,7 +1227,8 @@ list_del_init(&ent->list); op = (!ent->old && !ent->rename) ? OP_PROF_LOAD : OP_PROF_REPL; - if (ent->old && ent->old->rawdata == ent->new->rawdata && + if (ent->old && ent->old->learning_cache.size == 0 && + ent->old->rawdata == ent->new->rawdata && ent->new->rawdata) { /* dedup actual profile replacement */ audit_policy(label, op, ns_name, ent->new->base.hname, --- linux-azure-6.5.0.orig/security/apparmor/policy_ns.c +++ linux-azure-6.5.0/security/apparmor/policy_ns.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "include/apparmor.h" #include "include/cred.h" @@ -107,7 +108,7 @@ struct aa_ns *ns; ns = kzalloc(sizeof(*ns), GFP_KERNEL); - AA_DEBUG("%s(%p)\n", __func__, ns); + AA_DEBUG(DEBUG_POLICY, "%s(%p)\n", __func__, ns); if (!ns) return NULL; if (!aa_policy_init(&ns->base, prefix, name, GFP_KERNEL)) @@ -117,6 +118,8 @@ INIT_LIST_HEAD(&ns->rawdata_list); mutex_init(&ns->lock); init_waitqueue_head(&ns->wait); + spin_lock_init(&ns->listener_lock); + INIT_LIST_HEAD(&ns->listeners); /* released by aa_free_ns() */ ns->unconfined = alloc_unconfined("unconfined"); --- linux-azure-6.5.0.orig/security/apparmor/policy_unpack.c +++ linux-azure-6.5.0/security/apparmor/policy_unpack.c @@ -34,17 +34,18 @@ static void audit_cb(struct audit_buffer *ab, void *va) { struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); - if (aad(sa)->iface.ns) { + if (ad->iface.ns) { audit_log_format(ab, " ns="); - audit_log_untrustedstring(ab, aad(sa)->iface.ns); + audit_log_untrustedstring(ab, ad->iface.ns); } - if (aad(sa)->name) { + if (ad->name) { audit_log_format(ab, " name="); - audit_log_untrustedstring(ab, aad(sa)->name); + audit_log_untrustedstring(ab, ad->name); } - if (aad(sa)->iface.pos) - audit_log_format(ab, " offset=%ld", aad(sa)->iface.pos); + if (ad->iface.pos) + audit_log_format(ab, " offset=%ld", ad->iface.pos); } /** @@ -63,18 +64,18 @@ int error) { struct aa_profile *profile = labels_profile(aa_current_raw_label()); - DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, NULL); + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_NONE, NULL); if (e) - aad(&sa)->iface.pos = e->pos - e->start; - aad(&sa)->iface.ns = ns_name; + ad.iface.pos = e->pos - e->start; + ad.iface.ns = ns_name; if (new) - aad(&sa)->name = new->base.hname; + ad.name = new->base.hname; else - aad(&sa)->name = name; - aad(&sa)->info = info; - aad(&sa)->error = error; + ad.name = name; + ad.info = info; + ad.error = error; - return aa_audit(AUDIT_APPARMOR_STATUS, profile, &sa, audit_cb); + return aa_audit(AUDIT_APPARMOR_STATUS, profile, &ad, audit_cb); } void __aa_loaddata_update(struct aa_loaddata *data, long revision) @@ -266,6 +267,19 @@ return false; } +VISIBLE_IF_KUNIT bool unpack_u16(struct aa_ext *e, u16 *data, const char *name) +{ + if (aa_unpack_nameX(e, AA_U16, name)) { + if (!aa_inbounds(e, sizeof(u16))) + return 0; + if (data) + *data = le16_to_cpu(get_unaligned((__le16 *) e->pos)); + e->pos += sizeof(u16); + return 1; + } + return 0; +} + VISIBLE_IF_KUNIT bool aa_unpack_u32(struct aa_ext *e, u32 *data, const char *name) { void *pos = e->pos; @@ -702,24 +716,29 @@ return -EPROTO; } -static int unpack_pdb(struct aa_ext *e, struct aa_policydb *policy, +static int unpack_pdb(struct aa_ext *e, struct aa_policydb **policy, bool required_dfa, bool required_trans, const char **info) { + struct aa_policydb *pdb; void *pos = e->pos; int i, flags, error = -EPROTO; ssize_t size; - size = unpack_perms_table(e, &policy->perms); + pdb = aa_alloc_pdb(GFP_KERNEL); + if (!pdb) + return -ENOMEM; + + size = unpack_perms_table(e, &pdb->perms); if (size < 0) { error = size; - policy->perms = NULL; + pdb->perms = NULL; *info = "failed to unpack - perms"; goto fail; } - policy->size = size; + pdb->size = size; - if (policy->perms) { + if (pdb->perms) { /* perms table present accept is index */ flags = TO_ACCEPT1_FLAG(YYTD_DATA32); } else { @@ -728,13 +747,13 @@ TO_ACCEPT2_FLAG(YYTD_DATA32); } - policy->dfa = unpack_dfa(e, flags); - if (IS_ERR(policy->dfa)) { - error = PTR_ERR(policy->dfa); - policy->dfa = NULL; + pdb->dfa = unpack_dfa(e, flags); + if (IS_ERR(pdb->dfa)) { + error = PTR_ERR(pdb->dfa); + pdb->dfa = NULL; *info = "failed to unpack - dfa"; goto fail; - } else if (!policy->dfa) { + } else if (!pdb->dfa) { if (required_dfa) { *info = "missing required dfa"; goto fail; @@ -748,18 +767,18 @@ * sadly start was given different names for file and policydb * but since it is optional we can try both */ - if (!aa_unpack_u32(e, &policy->start[0], "start")) + if (!aa_unpack_u32(e, &pdb->start[0], "start")) /* default start state */ - policy->start[0] = DFA_START; - if (!aa_unpack_u32(e, &policy->start[AA_CLASS_FILE], "dfa_start")) { + pdb->start[0] = DFA_START; + if (!aa_unpack_u32(e, &pdb->start[AA_CLASS_FILE], "dfa_start")) { /* default start state for xmatch and file dfa */ - policy->start[AA_CLASS_FILE] = DFA_START; + pdb->start[AA_CLASS_FILE] = DFA_START; } /* setup class index */ for (i = AA_CLASS_FILE + 1; i <= AA_CLASS_LAST; i++) { - policy->start[i] = aa_dfa_next(policy->dfa, policy->start[0], + pdb->start[i] = aa_dfa_next(pdb->dfa, pdb->start[0], i); } - if (!unpack_trans_table(e, &policy->trans) && required_trans) { + if (!unpack_trans_table(e, &pdb->trans) && required_trans) { *info = "failed to unpack profile transition table"; goto fail; } @@ -767,9 +786,11 @@ /* TODO: move compat mapping here, requires dfa merging first */ /* TODO: move verify here, it has to be done after compat mappings */ out: + *policy = pdb; return 0; fail: + aa_put_pdb(pdb); e->pos = pos; return error; } @@ -802,9 +823,10 @@ struct aa_profile *profile = NULL; const char *tmpname, *tmpns = NULL, *name = NULL; const char *info = "failed to unpack profile"; + u16 size = 0; size_t ns_len; struct rhashtable_params params = { 0 }; - char *key = NULL; + char *key = NULL, *disconnected = NULL; struct aa_data *data; int error = -EPROTO; kernel_cap_t tmpcap; @@ -853,15 +875,15 @@ } /* neither xmatch_len not xmatch_perms are optional if xmatch is set */ - if (profile->attach.xmatch.dfa) { + if (profile->attach.xmatch->dfa) { if (!aa_unpack_u32(e, &tmp, NULL)) { info = "missing xmatch len"; goto fail; } profile->attach.xmatch_len = tmp; - profile->attach.xmatch.start[AA_CLASS_XMATCH] = DFA_START; - if (!profile->attach.xmatch.perms) { - error = aa_compat_map_xmatch(&profile->attach.xmatch); + profile->attach.xmatch->start[AA_CLASS_XMATCH] = DFA_START; + if (!profile->attach.xmatch->perms) { + error = aa_compat_map_xmatch(profile->attach.xmatch); if (error) { info = "failed to convert xmatch permission table"; goto fail; @@ -870,7 +892,8 @@ } /* disconnected attachment string is optional */ - (void) aa_unpack_str(e, &profile->disconnected, "disconnected"); + (void) aa_unpack_strdup(e, &disconnected, "disconnected"); + profile->disconnected = disconnected; /* per profile debug flags (complain, audit) */ if (!aa_unpack_nameX(e, AA_STRUCT, "flags")) { @@ -886,6 +909,8 @@ profile->label.flags |= FLAG_DEBUG1; if (tmp & PACKED_FLAG_DEBUG2) profile->label.flags |= FLAG_DEBUG2; + if (tmp & PACKED_FLAG_INTERRUPTIBLE) + profile->label.flags |= FLAG_INTERRUPTIBLE; if (!aa_unpack_u32(e, &tmp, NULL)) goto fail; if (tmp == PACKED_MODE_COMPLAIN || (e->version & FORCE_COMPLAIN_FLAG)) { @@ -969,6 +994,45 @@ goto fail; } + if (aa_unpack_array(e, "net_allowed_af", &size) || + VERSION_LT(e->version, v8)) { + u16 i; + + profile->net_compat = kzalloc(sizeof(struct aa_net_compat), + GFP_KERNEL); + if (!profile->net_compat) { + info = "out of memory"; + goto fail; + } + for (i = 0; i < size; i++) { + /* discard extraneous rules that this kernel will + * never request + */ + if (i >= AF_MAX) { + u16 tmp; + + if (!unpack_u16(e, &tmp, NULL) || + !unpack_u16(e, &tmp, NULL) || + !unpack_u16(e, &tmp, NULL)) + goto fail; + continue; + } + if (!unpack_u16(e, &profile->net_compat->allow[i], NULL)) + goto fail; + if (!unpack_u16(e, &profile->net_compat->audit[i], NULL)) + goto fail; + if (!unpack_u16(e, &profile->net_compat->quiet[i], NULL)) + goto fail; + } + if (size && !aa_unpack_nameX(e, AA_ARRAYEND, NULL)) + goto fail; + if (VERSION_LT(e->version, v7)) { + /* pre v7 policy always allowed these */ + profile->net_compat->allow[AF_UNIX] = 0xffff; + profile->net_compat->allow[AF_NETLINK] = 0xffff; + } + } + if (aa_unpack_nameX(e, AA_STRUCT, "policydb")) { /* generic policy dfa - optional and may be NULL */ info = "failed to unpack policydb"; @@ -977,16 +1041,16 @@ if (error) goto fail; /* Fixup: drop when we get rid of start array */ - if (aa_dfa_next(rules->policy.dfa, rules->policy.start[0], + if (aa_dfa_next(rules->policy->dfa, rules->policy->start[0], AA_CLASS_FILE)) - rules->policy.start[AA_CLASS_FILE] = - aa_dfa_next(rules->policy.dfa, - rules->policy.start[0], + rules->policy->start[AA_CLASS_FILE] = + aa_dfa_next(rules->policy->dfa, + rules->policy->start[0], AA_CLASS_FILE); if (!aa_unpack_nameX(e, AA_STRUCTEND, NULL)) goto fail; - if (!rules->policy.perms) { - error = aa_compat_map_policy(&rules->policy, + if (!rules->policy->perms) { + error = aa_compat_map_policy(rules->policy, e->version); if (error) { info = "failed to remap policydb permission table"; @@ -994,44 +1058,25 @@ } } } else { - rules->policy.dfa = aa_get_dfa(nulldfa); - rules->policy.perms = kcalloc(2, sizeof(struct aa_perms), - GFP_KERNEL); - if (!rules->policy.perms) - goto fail; - rules->policy.size = 2; + rules->policy = aa_get_pdb(nullpdb); } /* get file rules */ error = unpack_pdb(e, &rules->file, false, true, &info); if (error) { goto fail; - } else if (rules->file.dfa) { - if (!rules->file.perms) { - error = aa_compat_map_file(&rules->file); + } else if (rules->file->dfa) { + if (!rules->file->perms) { + error = aa_compat_map_file(rules->file); if (error) { info = "failed to remap file permission table"; goto fail; } } - } else if (rules->policy.dfa && - rules->policy.start[AA_CLASS_FILE]) { - rules->file.dfa = aa_get_dfa(rules->policy.dfa); - rules->file.start[AA_CLASS_FILE] = rules->policy.start[AA_CLASS_FILE]; - rules->file.perms = kcalloc(rules->policy.size, - sizeof(struct aa_perms), - GFP_KERNEL); - if (!rules->file.perms) - goto fail; - memcpy(rules->file.perms, rules->policy.perms, - rules->policy.size * sizeof(struct aa_perms)); - rules->file.size = rules->policy.size; + } else if (rules->policy->dfa && + rules->policy->start[AA_CLASS_FILE]) { + rules->file = aa_get_pdb(rules->policy); } else { - rules->file.dfa = aa_get_dfa(nulldfa); - rules->file.perms = kcalloc(2, sizeof(struct aa_perms), - GFP_KERNEL); - if (!rules->file.perms) - goto fail; - rules->file.size = 2; + rules->file = aa_get_pdb(nullpdb); } error = -EPROTO; if (aa_unpack_nameX(e, AA_STRUCT, "data")) { @@ -1238,26 +1283,32 @@ if (!rules) return 0; - if ((rules->file.dfa && !verify_dfa_accept_index(rules->file.dfa, - rules->file.size)) || - (rules->policy.dfa && - !verify_dfa_accept_index(rules->policy.dfa, rules->policy.size))) { + if (rules->file->dfa && !verify_dfa_accept_index(rules->file->dfa, + rules->file->size)) { + audit_iface(profile, NULL, NULL, + "Unpack: file Invalid named transition", NULL, + -EPROTO); + return -EPROTO; + } + if (rules->policy->dfa && + !verify_dfa_accept_index(rules->policy->dfa, rules->policy->size)) { audit_iface(profile, NULL, NULL, - "Unpack: Invalid named transition", NULL, -EPROTO); + "Unpack: policy Invalid named transition", NULL, + -EPROTO); return -EPROTO; } - if (!verify_perms(&rules->file)) { + if (!verify_perms(rules->file)) { audit_iface(profile, NULL, NULL, "Unpack: Invalid perm index", NULL, -EPROTO); return -EPROTO; } - if (!verify_perms(&rules->policy)) { + if (!verify_perms(rules->policy)) { audit_iface(profile, NULL, NULL, "Unpack: Invalid perm index", NULL, -EPROTO); return -EPROTO; } - if (!verify_perms(&profile->attach.xmatch)) { + if (!verify_perms(profile->attach.xmatch)) { audit_iface(profile, NULL, NULL, "Unpack: Invalid perm index", NULL, -EPROTO); return -EPROTO; --- linux-azure-6.5.0.orig/security/apparmor/procattr.c +++ linux-azure-6.5.0/security/apparmor/procattr.c @@ -123,12 +123,14 @@ for (count = 0; (hat < end) && count < 16; ++count) { char *next = hat + strlen(hat) + 1; hats[count] = hat; - AA_DEBUG("%s: (pid %d) Magic 0x%llx count %d hat '%s'\n" + AA_DEBUG(DEBUG_DOMAIN, + "%s: (pid %d) Magic 0x%llx count %d hat '%s'\n" , __func__, current->pid, token, count, hat); hat = next; } } else - AA_DEBUG("%s: (pid %d) Magic 0x%llx count %d Hat '%s'\n", + AA_DEBUG(DEBUG_DOMAIN, + "%s: (pid %d) Magic 0x%llx count %d Hat '%s'\n", __func__, current->pid, token, count, ""); return aa_change_hat(hats, count, token, flags); --- linux-azure-6.5.0.orig/security/apparmor/resource.c +++ linux-azure-6.5.0/security/apparmor/resource.c @@ -30,18 +30,20 @@ static void audit_cb(struct audit_buffer *ab, void *va) { struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); audit_log_format(ab, " rlimit=%s value=%lu", - rlim_names[aad(sa)->rlim.rlim], aad(sa)->rlim.max); - if (aad(sa)->peer) { + rlim_names[ad->rlim.rlim], ad->rlim.max); + if (ad->peer) { audit_log_format(ab, " peer="); - aa_label_xaudit(ab, labels_ns(aad(sa)->label), aad(sa)->peer, + aa_label_xaudit(ab, labels_ns(ad->subj_label), ad->peer, FLAGS_NONE, GFP_ATOMIC); } } /** * audit_resource - audit setting resource limit + * @subj_cred: cred setting the resource * @profile: profile being enforced (NOT NULL) * @resource: rlimit being auditing * @value: value being set @@ -49,22 +51,24 @@ * @info: info being auditing * @error: error value * - * Returns: 0 or sa->error else other error code on failure + * Returns: 0 or ad->error else other error code on failure */ -static int audit_resource(struct aa_profile *profile, unsigned int resource, +static int audit_resource(const struct cred *subj_cred, + struct aa_profile *profile, unsigned int resource, unsigned long value, struct aa_label *peer, const char *info, int error) { - DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, AA_CLASS_RLIMITS, + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_RLIMITS, OP_SETRLIMIT); - aad(&sa)->rlim.rlim = resource; - aad(&sa)->rlim.max = value; - aad(&sa)->peer = peer; - aad(&sa)->info = info; - aad(&sa)->error = error; + ad.subj_cred = subj_cred; + ad.rlim.rlim = resource; + ad.rlim.max = value; + ad.peer = peer; + ad.info = info; + ad.error = error; - return aa_audit(AUDIT_APPARMOR_AUTO, profile, &sa, audit_cb); + return aa_audit(AUDIT_APPARMOR_AUTO, profile, &ad, audit_cb); } /** @@ -81,7 +85,8 @@ return rlim_map[resource]; } -static int profile_setrlimit(struct aa_profile *profile, unsigned int resource, +static int profile_setrlimit(const struct cred *subj_cred, + struct aa_profile *profile, unsigned int resource, struct rlimit *new_rlim) { struct aa_ruleset *rules = list_first_entry(&profile->rules, @@ -91,22 +96,24 @@ if (rules->rlimits.mask & (1 << resource) && new_rlim->rlim_max > rules->rlimits.limits[resource].rlim_max) e = -EACCES; - return audit_resource(profile, resource, new_rlim->rlim_max, NULL, NULL, - e); + return audit_resource(subj_cred, profile, resource, new_rlim->rlim_max, + NULL, NULL, e); } /** * aa_task_setrlimit - test permission to set an rlimit - * @label - label confining the task (NOT NULL) - * @task - task the resource is being set on - * @resource - the resource being set - * @new_rlim - the new resource limit (NOT NULL) + * @subj_cred: cred setting the limit + * @label: label confining the task (NOT NULL) + * @task: task the resource is being set on + * @resource: the resource being set + * @new_rlim: the new resource limit (NOT NULL) * * Control raising the processes hard limit. * * Returns: 0 or error code if setting resource failed */ -int aa_task_setrlimit(struct aa_label *label, struct task_struct *task, +int aa_task_setrlimit(const struct cred *subj_cred, struct aa_label *label, + struct task_struct *task, unsigned int resource, struct rlimit *new_rlim) { struct aa_profile *profile; @@ -125,14 +132,15 @@ */ if (label != peer && - aa_capable(label, CAP_SYS_RESOURCE, CAP_OPT_NOAUDIT) != 0) + aa_capable(subj_cred, label, CAP_SYS_RESOURCE, CAP_OPT_NOAUDIT) != 0) error = fn_for_each(label, profile, - audit_resource(profile, resource, + audit_resource(subj_cred, profile, resource, new_rlim->rlim_max, peer, "cap_sys_resource", -EACCES)); else error = fn_for_each_confined(label, profile, - profile_setrlimit(profile, resource, new_rlim)); + profile_setrlimit(subj_cred, profile, resource, + new_rlim)); aa_put_label(peer); return error; --- linux-azure-6.5.0.orig/security/apparmor/task.c +++ linux-azure-6.5.0/security/apparmor/task.c @@ -208,70 +208,75 @@ static void audit_ptrace_cb(struct audit_buffer *ab, void *va) { struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); - if (aad(sa)->request & AA_PTRACE_PERM_MASK) { + if (ad->request & AA_PTRACE_PERM_MASK) { audit_log_format(ab, " requested_mask=\"%s\"", - audit_ptrace_mask(aad(sa)->request)); + audit_ptrace_mask(ad->request)); - if (aad(sa)->denied & AA_PTRACE_PERM_MASK) { + if (ad->denied & AA_PTRACE_PERM_MASK) { audit_log_format(ab, " denied_mask=\"%s\"", - audit_ptrace_mask(aad(sa)->denied)); + audit_ptrace_mask(ad->denied)); } } audit_log_format(ab, " peer="); - aa_label_xaudit(ab, labels_ns(aad(sa)->label), aad(sa)->peer, + aa_label_xaudit(ab, labels_ns(ad->subj_label), ad->peer, FLAGS_NONE, GFP_ATOMIC); } /* assumes check for RULE_MEDIATES is already done */ /* TODO: conditionals */ -static int profile_ptrace_perm(struct aa_profile *profile, - struct aa_label *peer, u32 request, - struct common_audit_data *sa) +static int profile_ptrace_perm(const struct cred *cred, + struct aa_profile *profile, + struct aa_label *peer, u32 request, + struct apparmor_audit_data *ad) { struct aa_ruleset *rules = list_first_entry(&profile->rules, typeof(*rules), list); struct aa_perms perms = { }; - aad(sa)->peer = peer; + ad->subj_cred = cred; + ad->peer = peer; aa_profile_match_label(profile, rules, peer, AA_CLASS_PTRACE, request, &perms); aa_apply_modes_to_perms(profile, &perms); - return aa_check_perms(profile, &perms, request, sa, audit_ptrace_cb); + return aa_check_perms(profile, &perms, request, ad, audit_ptrace_cb); } -static int profile_tracee_perm(struct aa_profile *tracee, +static int profile_tracee_perm(const struct cred *cred, + struct aa_profile *tracee, struct aa_label *tracer, u32 request, - struct common_audit_data *sa) + struct apparmor_audit_data *ad) { if (profile_unconfined(tracee) || unconfined(tracer) || !ANY_RULE_MEDIATES(&tracee->rules, AA_CLASS_PTRACE)) return 0; - return profile_ptrace_perm(tracee, tracer, request, sa); + return profile_ptrace_perm(cred, tracee, tracer, request, ad); } -static int profile_tracer_perm(struct aa_profile *tracer, +static int profile_tracer_perm(const struct cred *cred, + struct aa_profile *tracer, struct aa_label *tracee, u32 request, - struct common_audit_data *sa) + struct apparmor_audit_data *ad) { if (profile_unconfined(tracer)) return 0; if (ANY_RULE_MEDIATES(&tracer->rules, AA_CLASS_PTRACE)) - return profile_ptrace_perm(tracer, tracee, request, sa); + return profile_ptrace_perm(cred, tracer, tracee, request, ad); /* profile uses the old style capability check for ptrace */ if (&tracer->label == tracee) return 0; - aad(sa)->label = &tracer->label; - aad(sa)->peer = tracee; - aad(sa)->request = 0; - aad(sa)->error = aa_capable(&tracer->label, CAP_SYS_PTRACE, - CAP_OPT_NONE); + ad->subj_label = &tracer->label; + ad->peer = tracee; + ad->request = 0; + ad->error = aa_capable(cred, &tracer->label, CAP_SYS_PTRACE, + CAP_OPT_NONE); - return aa_audit(AUDIT_APPARMOR_AUTO, tracer, sa, audit_ptrace_cb); + return aa_audit(AUDIT_APPARMOR_AUTO, tracer, ad, audit_ptrace_cb); } /** @@ -282,14 +287,72 @@ * * Returns: %0 else error code if permission denied or error */ -int aa_may_ptrace(struct aa_label *tracer, struct aa_label *tracee, +int aa_may_ptrace(const struct cred *tracer_cred, struct aa_label *tracer, + const struct cred *tracee_cred, struct aa_label *tracee, u32 request) { struct aa_profile *profile; u32 xrequest = request << PTRACE_PERM_SHIFT; - DEFINE_AUDIT_DATA(sa, LSM_AUDIT_DATA_NONE, AA_CLASS_PTRACE, OP_PTRACE); + DEFINE_AUDIT_DATA(ad, LSM_AUDIT_DATA_NONE, AA_CLASS_PTRACE, OP_PTRACE); return xcheck_labels(tracer, tracee, profile, - profile_tracer_perm(profile, tracee, request, &sa), - profile_tracee_perm(profile, tracer, xrequest, &sa)); + profile_tracer_perm(tracer_cred, profile, tracee, + request, &ad), + profile_tracee_perm(tracee_cred, profile, tracer, + xrequest, &ad)); +} + +/* call back to audit ptrace fields */ +static void audit_ns_cb(struct audit_buffer *ab, void *va) +{ + struct common_audit_data *sa = va; + struct apparmor_audit_data *ad = aad(sa); + + if (ad->request & AA_USERNS_CREATE) + audit_log_format(ab, " requested=\"userns_create\""); + + if (ad->denied & AA_USERNS_CREATE) + audit_log_format(ab, " denied=\"userns_create\""); +} + +int aa_profile_ns_perm(struct aa_profile *profile, + struct apparmor_audit_data *ad, + u32 request) +{ + struct aa_ruleset *rules = list_first_entry(&profile->rules, + typeof(*rules), list); + struct aa_perms perms = { }; + aa_state_t state; + + ad->request = request; + + + /* TODO: rework unconfined profile/dfa to mediate user ns, then + * we can drop the unconfined test + */ + state = RULE_MEDIATES(rules, ad->class); + if (!state) { + /* TODO: this gets replaced when the default unconfined + * profile dfa gets updated to handle this + */ + if (profile_unconfined(profile) && + profile == profiles_ns(profile)->unconfined) { + if (!unprivileged_userns_restricted || + ns_capable_noaudit(current_user_ns(), + CAP_SYS_ADMIN)) + return 0; + ad->info = "User namespace creation restricted"; + /* unconfined unprivileged user */ + /* don't just return: allow complain mode to override */ + } else if (!unprivileged_userns_restricted_force) { + return 0; + } + /* continue to mediation */ + } + perms = *aa_lookup_perms(rules->policy, state); + if (unprivileged_userns_restricted_complain) + perms.complain = ALL_PERMS_MASK; + + aa_apply_modes_to_perms(profile, &perms); + return aa_check_perms(profile, &perms, request, ad, audit_ns_cb); } --- linux-azure-6.5.0.orig/security/bpf/hooks.c +++ linux-azure-6.5.0/security/bpf/hooks.c @@ -5,6 +5,7 @@ */ #include #include +#include static struct security_hook_list bpf_lsm_hooks[] __ro_after_init = { #define LSM_HOOK(RET, DEFAULT, NAME, ...) \ @@ -15,9 +16,20 @@ LSM_HOOK_INIT(task_free, bpf_task_storage_free), }; +/* + * slot has to be LSMBLOB_NEEDED because some of the hooks + * supplied by this module require a slot. + */ +struct lsm_id bpf_lsmid __ro_after_init = { + .lsm = "bpf", + .id = LSM_ID_BPF, + .slot = LSMBLOB_NEEDED, +}; + static int __init bpf_lsm_init(void) { - security_add_hooks(bpf_lsm_hooks, ARRAY_SIZE(bpf_lsm_hooks), "bpf"); + security_add_hooks(bpf_lsm_hooks, ARRAY_SIZE(bpf_lsm_hooks), + &bpf_lsmid); pr_info("LSM support for eBPF active\n"); return 0; } --- linux-azure-6.5.0.orig/security/commoncap.c +++ linux-azure-6.5.0/security/commoncap.c @@ -25,6 +25,7 @@ #include #include #include +#include /* * If a non-root user executes a setuid-root binary in @@ -1439,6 +1440,11 @@ } #ifdef CONFIG_SECURITY +static struct lsm_id capability_lsmid __ro_after_init = { + .lsm = "capability", + .id = LSM_ID_CAPABILITY, + .slot = LSMBLOB_NOT_NEEDED, +}; static struct security_hook_list capability_hooks[] __ro_after_init = { LSM_HOOK_INIT(capable, cap_capable), @@ -1464,7 +1470,7 @@ static int __init capability_init(void) { security_add_hooks(capability_hooks, ARRAY_SIZE(capability_hooks), - "capability"); + &capability_lsmid); return 0; } --- linux-azure-6.5.0.orig/security/integrity/digsig.c +++ linux-azure-6.5.0/security/integrity/digsig.c @@ -200,7 +200,7 @@ rc = kernel_read_file_from_path(path, 0, &data, INT_MAX, NULL, READING_X509_CERTIFICATE); if (rc < 0) { - pr_err("Unable to open file: %s (%d)", path, rc); + pr_warn("Unable to open file: %s (%d)", path, rc); return rc; } size = rc; --- linux-azure-6.5.0.orig/security/integrity/iint.c +++ linux-azure-6.5.0/security/integrity/iint.c @@ -66,9 +66,32 @@ return iint; } -static void iint_free(struct integrity_iint_cache *iint) +#define IMA_MAX_NESTING (FILESYSTEM_MAX_STACK_DEPTH+1) + +/* + * It is not clear that IMA should be nested at all, but as long is it measures + * files both on overlayfs and on underlying fs, we need to annotate the iint + * mutex to avoid lockdep false positives related to IMA + overlayfs. + * See ovl_lockdep_annotate_inode_mutex_key() for more details. + */ +static inline void iint_lockdep_annotate(struct integrity_iint_cache *iint, + struct inode *inode) +{ +#ifdef CONFIG_LOCKDEP + static struct lock_class_key iint_mutex_key[IMA_MAX_NESTING]; + + int depth = inode->i_sb->s_stack_depth; + + if (WARN_ON_ONCE(depth < 0 || depth >= IMA_MAX_NESTING)) + depth = 0; + + lockdep_set_class(&iint->mutex, &iint_mutex_key[depth]); +#endif +} + +static void iint_init_always(struct integrity_iint_cache *iint, + struct inode *inode) { - kfree(iint->ima_hash); iint->ima_hash = NULL; iint->version = 0; iint->flags = 0UL; @@ -80,6 +103,14 @@ iint->ima_creds_status = INTEGRITY_UNKNOWN; iint->evm_status = INTEGRITY_UNKNOWN; iint->measured_pcrs = 0; + mutex_init(&iint->mutex); + iint_lockdep_annotate(iint, inode); +} + +static void iint_free(struct integrity_iint_cache *iint) +{ + kfree(iint->ima_hash); + mutex_destroy(&iint->mutex); kmem_cache_free(iint_cache, iint); } @@ -104,6 +135,8 @@ if (!iint) return NULL; + iint_init_always(iint, inode); + write_lock(&integrity_iint_lock); p = &integrity_iint_tree.rb_node; @@ -153,25 +186,18 @@ iint_free(iint); } -static void init_once(void *foo) +static void iint_init_once(void *foo) { struct integrity_iint_cache *iint = (struct integrity_iint_cache *) foo; memset(iint, 0, sizeof(*iint)); - iint->ima_file_status = INTEGRITY_UNKNOWN; - iint->ima_mmap_status = INTEGRITY_UNKNOWN; - iint->ima_bprm_status = INTEGRITY_UNKNOWN; - iint->ima_read_status = INTEGRITY_UNKNOWN; - iint->ima_creds_status = INTEGRITY_UNKNOWN; - iint->evm_status = INTEGRITY_UNKNOWN; - mutex_init(&iint->mutex); } static int __init integrity_iintcache_init(void) { iint_cache = kmem_cache_create("iint_cache", sizeof(struct integrity_iint_cache), - 0, SLAB_PANIC, init_once); + 0, SLAB_PANIC, iint_init_once); return 0; } DEFINE_LSM(integrity) = { --- linux-azure-6.5.0.orig/security/integrity/ima/Kconfig +++ linux-azure-6.5.0/security/integrity/ima/Kconfig @@ -29,9 +29,11 @@ to learn more about IMA. If unsure, say N. +if IMA + config IMA_KEXEC bool "Enable carrying the IMA measurement list across a soft boot" - depends on IMA && TCG_TPM && HAVE_IMA_KEXEC + depends on TCG_TPM && HAVE_IMA_KEXEC default n help TPM PCRs are only reset on a hard reboot. In order to validate @@ -43,7 +45,6 @@ config IMA_MEASURE_PCR_IDX int - depends on IMA range 8 14 default 10 help @@ -53,7 +54,7 @@ config IMA_LSM_RULES bool - depends on IMA && AUDIT && (SECURITY_SELINUX || SECURITY_SMACK || SECURITY_APPARMOR) + depends on AUDIT && (SECURITY_SELINUX || SECURITY_SMACK || SECURITY_APPARMOR) default y help Disabling this option will disregard LSM based policy rules. @@ -61,7 +62,6 @@ choice prompt "Default template" default IMA_NG_TEMPLATE - depends on IMA help Select the default IMA measurement template. @@ -80,14 +80,12 @@ config IMA_DEFAULT_TEMPLATE string - depends on IMA default "ima-ng" if IMA_NG_TEMPLATE default "ima-sig" if IMA_SIG_TEMPLATE choice prompt "Default integrity hash algorithm" default IMA_DEFAULT_HASH_SHA1 - depends on IMA help Select the default hash algorithm used for the measurement list, integrity appraisal and audit log. The compiled default @@ -117,7 +115,6 @@ config IMA_DEFAULT_HASH string - depends on IMA default "sha1" if IMA_DEFAULT_HASH_SHA1 default "sha256" if IMA_DEFAULT_HASH_SHA256 default "sha512" if IMA_DEFAULT_HASH_SHA512 @@ -126,7 +123,6 @@ config IMA_WRITE_POLICY bool "Enable multiple writes to the IMA policy" - depends on IMA default n help IMA policy can now be updated multiple times. The new rules get @@ -137,7 +133,6 @@ config IMA_READ_POLICY bool "Enable reading back the current IMA policy" - depends on IMA default y if IMA_WRITE_POLICY default n if !IMA_WRITE_POLICY help @@ -147,7 +142,6 @@ config IMA_APPRAISE bool "Appraise integrity measurements" - depends on IMA default n help This option enables local measurement integrity appraisal. @@ -248,18 +242,6 @@ The modsig keyword can be used in the IMA policy to allow a hook to accept such signatures. -config IMA_TRUSTED_KEYRING - bool "Require all keys on the .ima keyring be signed (deprecated)" - depends on IMA_APPRAISE && SYSTEM_TRUSTED_KEYRING - depends on INTEGRITY_ASYMMETRIC_KEYS - select INTEGRITY_TRUSTED_KEYRING - default y - help - This option requires that all keys added to the .ima - keyring be signed by a key on the system trusted keyring. - - This option is deprecated in favor of INTEGRITY_TRUSTED_KEYRING - config IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY bool "Permit keys validly signed by a built-in or secondary CA cert (EXPERIMENTAL)" depends on SYSTEM_TRUSTED_KEYRING @@ -280,7 +262,7 @@ config IMA_BLACKLIST_KEYRING bool "Create IMA machine owner blacklist keyrings (EXPERIMENTAL)" depends on SYSTEM_TRUSTED_KEYRING - depends on IMA_TRUSTED_KEYRING + depends on INTEGRITY_TRUSTED_KEYRING default n help This option creates an IMA blacklist keyring, which contains all @@ -290,7 +272,7 @@ config IMA_LOAD_X509 bool "Load X509 certificate onto the '.ima' trusted keyring" - depends on IMA_TRUSTED_KEYRING + depends on INTEGRITY_TRUSTED_KEYRING default n help File signature verification is based on the public keys @@ -315,7 +297,6 @@ config IMA_MEASURE_ASYMMETRIC_KEYS bool - depends on IMA depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y default y @@ -334,7 +315,8 @@ config IMA_DISABLE_HTABLE bool "Disable htable to allow measurement of duplicate records" - depends on IMA default n help This option disables htable to allow measurement of duplicate records. + +endif --- linux-azure-6.5.0.orig/security/integrity/ima/ima.h +++ linux-azure-6.5.0/security/integrity/ima/ima.h @@ -256,7 +256,7 @@ /* LIM API function definitions */ int ima_get_action(struct mnt_idmap *idmap, struct inode *inode, - const struct cred *cred, u32 secid, int mask, + const struct cred *cred, struct lsmblob *blob, int mask, enum ima_hooks func, int *pcr, struct ima_template_desc **template_desc, const char *func_data, unsigned int *allowed_algos); @@ -287,8 +287,8 @@ /* IMA policy related functions */ int ima_match_policy(struct mnt_idmap *idmap, struct inode *inode, - const struct cred *cred, u32 secid, enum ima_hooks func, - int mask, int flags, int *pcr, + const struct cred *cred, struct lsmblob *blob, + enum ima_hooks func, int mask, int flags, int *pcr, struct ima_template_desc **template_desc, const char *func_data, unsigned int *allowed_algos); void ima_init_policy(void); @@ -420,32 +420,6 @@ } #endif /* CONFIG_IMA_APPRAISE_MODSIG */ -/* LSM based policy rules require audit */ -#ifdef CONFIG_IMA_LSM_RULES - -#define ima_filter_rule_init security_audit_rule_init -#define ima_filter_rule_free security_audit_rule_free -#define ima_filter_rule_match security_audit_rule_match - -#else - -static inline int ima_filter_rule_init(u32 field, u32 op, char *rulestr, - void **lsmrule) -{ - return -EINVAL; -} - -static inline void ima_filter_rule_free(void *lsmrule) -{ -} - -static inline int ima_filter_rule_match(u32 secid, u32 field, u32 op, - void *lsmrule) -{ - return -EINVAL; -} -#endif /* CONFIG_IMA_LSM_RULES */ - #ifdef CONFIG_IMA_READ_POLICY #define POLICY_FILE_FLAGS (S_IWUSR | S_IRUSR) #else --- linux-azure-6.5.0.orig/security/integrity/ima/ima_api.c +++ linux-azure-6.5.0/security/integrity/ima/ima_api.c @@ -165,7 +165,7 @@ * @idmap: idmap of the mount the inode was found from * @inode: pointer to the inode associated with the object being validated * @cred: pointer to credentials structure to validate - * @secid: secid of the task being validated + * @blob: secid(s) of the task being validated * @mask: contains the permission mask (MAY_READ, MAY_WRITE, MAY_EXEC, * MAY_APPEND) * @func: caller identifier @@ -187,7 +187,7 @@ * */ int ima_get_action(struct mnt_idmap *idmap, struct inode *inode, - const struct cred *cred, u32 secid, int mask, + const struct cred *cred, struct lsmblob *blob, int mask, enum ima_hooks func, int *pcr, struct ima_template_desc **template_desc, const char *func_data, unsigned int *allowed_algos) @@ -196,7 +196,7 @@ flags &= ima_policy_flag; - return ima_match_policy(idmap, inode, cred, secid, func, mask, + return ima_match_policy(idmap, inode, cred, blob, func, mask, flags, pcr, template_desc, func_data, allowed_algos); } @@ -243,6 +243,7 @@ { const char *audit_cause = "failed"; struct inode *inode = file_inode(file); + struct inode *real_inode = d_real_inode(file_dentry(file)); const char *filename = file->f_path.dentry->d_name.name; struct ima_max_digest_data hash; struct kstat stat; @@ -302,6 +303,10 @@ iint->ima_hash = tmpbuf; memcpy(iint->ima_hash, &hash, length); iint->version = i_version; + if (real_inode != inode) { + iint->real_ino = real_inode->i_ino; + iint->real_dev = real_inode->i_sb->s_dev; + } /* Possibly temporary failure due to type of read (eg. O_DIRECT) */ if (!result) --- linux-azure-6.5.0.orig/security/integrity/ima/ima_appraise.c +++ linux-azure-6.5.0/security/integrity/ima/ima_appraise.c @@ -73,15 +73,16 @@ int ima_must_appraise(struct mnt_idmap *idmap, struct inode *inode, int mask, enum ima_hooks func) { - u32 secid; + struct lsmblob blob; if (!ima_appraise) return 0; - security_current_getsecid_subj(&secid); - return ima_match_policy(idmap, inode, current_cred(), secid, - func, mask, IMA_APPRAISE | IMA_HASH, NULL, - NULL, NULL, NULL); + security_current_getsecid_subj(&blob); + return ima_match_policy(idmap, inode, current_cred(), + &blob, func, mask, + IMA_APPRAISE | IMA_HASH, NULL, NULL, NULL, + NULL); } static int ima_fix_xattr(struct dentry *dentry, --- linux-azure-6.5.0.orig/security/integrity/ima/ima_fs.c +++ linux-azure-6.5.0/security/integrity/ima/ima_fs.c @@ -287,7 +287,7 @@ rc = kernel_read_file_from_path(path, 0, &data, INT_MAX, NULL, READING_POLICY); if (rc < 0) { - pr_err("Unable to open file: %s (%d)", path, rc); + pr_warn("Unable to open file: %s (%d)", path, rc); return rc; } size = rc; --- linux-azure-6.5.0.orig/security/integrity/ima/ima_main.c +++ linux-azure-6.5.0/security/integrity/ima/ima_main.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "ima.h" @@ -204,10 +205,10 @@ } static int process_measurement(struct file *file, const struct cred *cred, - u32 secid, char *buf, loff_t size, int mask, - enum ima_hooks func) + struct lsmblob *blob, char *buf, loff_t size, + int mask, enum ima_hooks func) { - struct inode *inode = file_inode(file); + struct inode *backing_inode, *inode = file_inode(file); struct integrity_iint_cache *iint = NULL; struct ima_template_desc *template_desc = NULL; char *pathbuf = NULL; @@ -229,7 +230,7 @@ * bitmask based on the appraise/audit/measurement policy. * Included is the appraise submask. */ - action = ima_get_action(file_mnt_idmap(file), inode, cred, secid, + action = ima_get_action(file_mnt_idmap(file), inode, cred, blob, mask, func, &pcr, &template_desc, NULL, &allowed_algos); violation_check = ((func == FILE_CHECK || func == MMAP_CHECK || @@ -284,6 +285,19 @@ iint->measured_pcrs = 0; } + /* Detect and re-evaluate changes made to the backing file. */ + backing_inode = d_real_inode(file_dentry(file)); + if (backing_inode != inode && + (action & IMA_DO_MASK) && (iint->flags & IMA_DONE_MASK)) { + if (!IS_I_VERSION(backing_inode) || + backing_inode->i_sb->s_dev != iint->real_dev || + backing_inode->i_ino != iint->real_ino || + !inode_eq_iversion(backing_inode, iint->version)) { + iint->flags &= ~IMA_DONE_MASK; + iint->measured_pcrs = 0; + } + } + /* Determine if already appraised/measured based on bitmask * (IMA_MEASURE, IMA_MEASURED, IMA_XXXX_APPRAISE, IMA_XXXX_APPRAISED, * IMA_AUDIT, IMA_AUDITED) @@ -416,23 +430,23 @@ int ima_file_mmap(struct file *file, unsigned long reqprot, unsigned long prot, unsigned long flags) { - u32 secid; + struct lsmblob blob; int ret; if (!file) return 0; - security_current_getsecid_subj(&secid); + security_current_getsecid_subj(&blob); if (reqprot & PROT_EXEC) { - ret = process_measurement(file, current_cred(), secid, NULL, + ret = process_measurement(file, current_cred(), &blob, NULL, 0, MAY_EXEC, MMAP_CHECK_REQPROT); if (ret) return ret; } if (prot & PROT_EXEC) - return process_measurement(file, current_cred(), secid, NULL, + return process_measurement(file, current_cred(), &blob, NULL, 0, MAY_EXEC, MMAP_CHECK); return 0; @@ -459,9 +473,9 @@ char *pathbuf = NULL; const char *pathname = NULL; struct inode *inode; + struct lsmblob blob; int result = 0; int action; - u32 secid; int pcr; /* Is mprotect making an mmap'ed file executable? */ @@ -469,13 +483,13 @@ !(prot & PROT_EXEC) || (vma->vm_flags & VM_EXEC)) return 0; - security_current_getsecid_subj(&secid); + security_current_getsecid_subj(&blob); inode = file_inode(vma->vm_file); action = ima_get_action(file_mnt_idmap(vma->vm_file), inode, - current_cred(), secid, MAY_EXEC, MMAP_CHECK, + current_cred(), &blob, MAY_EXEC, MMAP_CHECK, &pcr, &template, NULL, NULL); action |= ima_get_action(file_mnt_idmap(vma->vm_file), inode, - current_cred(), secid, MAY_EXEC, + current_cred(), &blob, MAY_EXEC, MMAP_CHECK_REQPROT, &pcr, &template, NULL, NULL); @@ -512,16 +526,16 @@ int ima_bprm_check(struct linux_binprm *bprm) { int ret; - u32 secid; + struct lsmblob blob; - security_current_getsecid_subj(&secid); - ret = process_measurement(bprm->file, current_cred(), secid, NULL, 0, - MAY_EXEC, BPRM_CHECK); + security_current_getsecid_subj(&blob); + ret = process_measurement(bprm->file, current_cred(), + &blob, NULL, 0, MAY_EXEC, BPRM_CHECK); if (ret) return ret; - security_cred_getsecid(bprm->cred, &secid); - return process_measurement(bprm->file, bprm->cred, secid, NULL, 0, + security_cred_getsecid(bprm->cred, &blob); + return process_measurement(bprm->file, bprm->cred, &blob, NULL, 0, MAY_EXEC, CREDS_CHECK); } @@ -537,10 +551,10 @@ */ int ima_file_check(struct file *file, int mask) { - u32 secid; + struct lsmblob blob; - security_current_getsecid_subj(&secid); - return process_measurement(file, current_cred(), secid, NULL, 0, + security_current_getsecid_subj(&blob); + return process_measurement(file, current_cred(), &blob, NULL, 0, mask & (MAY_READ | MAY_WRITE | MAY_EXEC | MAY_APPEND), FILE_CHECK); } @@ -741,7 +755,7 @@ bool contents) { enum ima_hooks func; - u32 secid; + struct lsmblob blob; /* * Do devices using pre-allocated memory run the risk of the @@ -761,9 +775,9 @@ /* Read entire file for all partial reads. */ func = read_idmap[read_id] ?: FILE_CHECK; - security_current_getsecid_subj(&secid); - return process_measurement(file, current_cred(), secid, NULL, - 0, MAY_READ, func); + security_current_getsecid_subj(&blob); + return process_measurement(file, current_cred(), &blob, NULL, 0, + MAY_READ, func); } const int read_idmap[READING_MAX_ID] = { @@ -791,7 +805,7 @@ enum kernel_read_file_id read_id) { enum ima_hooks func; - u32 secid; + struct lsmblob blob; /* permit signed certs */ if (!file && read_id == READING_X509_CERTIFICATE) @@ -804,8 +818,8 @@ } func = read_idmap[read_id] ?: FILE_CHECK; - security_current_getsecid_subj(&secid); - return process_measurement(file, current_cred(), secid, buf, size, + security_current_getsecid_subj(&blob); + return process_measurement(file, current_cred(), &blob, buf, size, MAY_READ, func); } @@ -931,7 +945,7 @@ int digest_hash_len = hash_digest_size[ima_hash_algo]; int violation = 0; int action = 0; - u32 secid; + struct lsmblob blob; if (digest && digest_len < digest_hash_len) return -EINVAL; @@ -954,9 +968,9 @@ * buffer measurements. */ if (func) { - security_current_getsecid_subj(&secid); + security_current_getsecid_subj(&blob); action = ima_get_action(idmap, inode, current_cred(), - secid, 0, func, &pcr, &template, + &blob, 0, func, &pcr, &template, func_data, NULL); if (!(action & IMA_MEASURE) && !digest) return -ENOENT; --- linux-azure-6.5.0.orig/security/integrity/ima/ima_policy.c +++ linux-azure-6.5.0/security/integrity/ima/ima_policy.c @@ -117,6 +117,8 @@ void *rule; /* LSM file metadata specific */ char *args_p; /* audit value */ int type; /* audit type */ + int rules_lsm; /* which LSM rule applies to */ + bool lsm_specific; /* true if lsm is specified */ } lsm[MAX_LSM_RULES]; char *fsname; struct ima_rule_opt_list *keyrings; /* Measure keys added to these keyrings */ @@ -309,6 +311,30 @@ } __setup("ima_appraise_tcb", default_appraise_policy_setup); +static int default_rules_lsm __ro_after_init = LSMBLOB_INVALID; + +static int __init ima_rules_lsm_init(char *str) +{ + const char *oldstr; + int newdrl; + + newdrl = lsm_name_to_slot(str); + if (newdrl >= 0) { + default_rules_lsm = newdrl; + return 1; + } + + oldstr = lsm_slot_to_name(default_rules_lsm); + if (oldstr) { + pr_err("default ima rule lsm \"%s\" not registered, continue using \"%s\"", + str, oldstr); + return 1; + } + + return 1; +} +__setup("ima_rules_lsm=", ima_rules_lsm_init); + static struct ima_rule_opt_list *ima_alloc_rule_opt_list(const substring_t *src) { struct ima_rule_opt_list *opt_list; @@ -380,7 +406,8 @@ int i; for (i = 0; i < MAX_LSM_RULES; i++) { - ima_filter_rule_free(entry->lsm[i].rule); + ima_filter_rule_free(entry->lsm[i].rule, + entry->lsm[i].rules_lsm); kfree(entry->lsm[i].args_p); } } @@ -425,7 +452,8 @@ ima_filter_rule_init(nentry->lsm[i].type, Audit_equal, nentry->lsm[i].args_p, - &nentry->lsm[i].rule); + &nentry->lsm[i].rule, + entry->lsm[i].rules_lsm); if (!nentry->lsm[i].rule) pr_warn("rule for LSM \'%s\' is undefined\n", nentry->lsm[i].args_p); @@ -451,7 +479,8 @@ * be owned by nentry. */ for (i = 0; i < MAX_LSM_RULES; i++) - ima_filter_rule_free(entry->lsm[i].rule); + ima_filter_rule_free(entry->lsm[i].rule, + entry->lsm[i].rules_lsm); kfree(entry); return 0; @@ -555,7 +584,7 @@ * @idmap: idmap of the mount the inode was found from * @inode: a pointer to an inode * @cred: a pointer to a credentials structure for user validation - * @secid: the secid of the task to be validated + * @blob: the secid(s) of the task to be validated * @func: LIM hook identifier * @mask: requested action (MAY_READ | MAY_WRITE | MAY_APPEND | MAY_EXEC) * @func_data: func specific data, may be NULL @@ -565,7 +594,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, struct mnt_idmap *idmap, struct inode *inode, const struct cred *cred, - u32 secid, enum ima_hooks func, int mask, + struct lsmblob *blob, enum ima_hooks func, int mask, const char *func_data) { int i; @@ -633,7 +662,7 @@ return false; for (i = 0; i < MAX_LSM_RULES; i++) { int rc = 0; - u32 osid; + struct lsmblob lsmdata; if (!lsm_rule->lsm[i].rule) { if (!lsm_rule->lsm[i].args_p) @@ -647,17 +676,21 @@ case LSM_OBJ_USER: case LSM_OBJ_ROLE: case LSM_OBJ_TYPE: - security_inode_getsecid(inode, &osid); - rc = ima_filter_rule_match(osid, lsm_rule->lsm[i].type, + security_inode_getsecid(inode, &lsmdata); + rc = ima_filter_rule_match(&lsmdata, + lsm_rule->lsm[i].type, Audit_equal, - lsm_rule->lsm[i].rule); + lsm_rule->lsm[i].rule, + lsm_rule->lsm[i].rules_lsm); break; case LSM_SUBJ_USER: case LSM_SUBJ_ROLE: case LSM_SUBJ_TYPE: - rc = ima_filter_rule_match(secid, lsm_rule->lsm[i].type, + rc = ima_filter_rule_match(blob, + lsm_rule->lsm[i].type, Audit_equal, - lsm_rule->lsm[i].rule); + lsm_rule->lsm[i].rule, + lsm_rule->lsm[i].rules_lsm); break; default: break; @@ -680,7 +713,8 @@ out: if (rule_reinitialized) { for (i = 0; i < MAX_LSM_RULES; i++) - ima_filter_rule_free(lsm_rule->lsm[i].rule); + ima_filter_rule_free(lsm_rule->lsm[i].rule, + lsm_rule->lsm[i].rules_lsm); kfree(lsm_rule); } return result; @@ -718,7 +752,7 @@ * @inode: pointer to an inode for which the policy decision is being made * @cred: pointer to a credentials structure for which the policy decision is * being made - * @secid: LSM secid of the task to be validated + * @blob: LSM secid(s) of the task to be validated * @func: IMA hook identifier * @mask: requested action (MAY_READ | MAY_WRITE | MAY_APPEND | MAY_EXEC) * @flags: IMA actions to consider (e.g. IMA_MEASURE | IMA_APPRAISE) @@ -735,8 +769,8 @@ * than writes so ima_match_policy() is classical RCU candidate. */ int ima_match_policy(struct mnt_idmap *idmap, struct inode *inode, - const struct cred *cred, u32 secid, enum ima_hooks func, - int mask, int flags, int *pcr, + const struct cred *cred, struct lsmblob *blob, + enum ima_hooks func, int mask, int flags, int *pcr, struct ima_template_desc **template_desc, const char *func_data, unsigned int *allowed_algos) { @@ -754,7 +788,7 @@ if (!(entry->action & actmask)) continue; - if (!ima_match_rules(entry, idmap, inode, cred, secid, + if (!ima_match_rules(entry, idmap, inode, cred, blob, func, mask, func_data)) continue; @@ -1073,7 +1107,7 @@ Opt_digest_type, Opt_appraise_type, Opt_appraise_flag, Opt_appraise_algos, Opt_permit_directio, Opt_pcr, Opt_template, Opt_keyrings, - Opt_label, Opt_err + Opt_lsm, Opt_label, Opt_err }; static const match_table_t policy_tokens = { @@ -1121,6 +1155,7 @@ {Opt_pcr, "pcr=%s"}, {Opt_template, "template=%s"}, {Opt_keyrings, "keyrings=%s"}, + {Opt_lsm, "lsm=%s"}, {Opt_label, "label=%s"}, {Opt_err, NULL} }; @@ -1140,7 +1175,8 @@ entry->lsm[lsm_rule].type = audit_type; result = ima_filter_rule_init(entry->lsm[lsm_rule].type, Audit_equal, entry->lsm[lsm_rule].args_p, - &entry->lsm[lsm_rule].rule); + &entry->lsm[lsm_rule].rule, + entry->lsm[lsm_rule].rules_lsm); if (!entry->lsm[lsm_rule].rule) { pr_warn("rule for LSM \'%s\' is undefined\n", entry->lsm[lsm_rule].args_p); @@ -1883,6 +1919,23 @@ &(template_desc->num_fields)); entry->template = template_desc; break; + case Opt_lsm: { + int i; + + result = lsm_name_to_slot(args[0].from); + if (result < 0) { + for (i = 0; i < MAX_LSM_RULES; i++) + entry->lsm[i].args_p = NULL; + result = -EINVAL; + break; + } + for (i = 0; i < MAX_LSM_RULES; i++) { + entry->lsm[i].rules_lsm = result; + entry->lsm[i].lsm_specific = true; + } + result = 0; + break; + } case Opt_err: ima_log_string(ab, "UNKNOWN", p); result = -EINVAL; @@ -1928,6 +1981,7 @@ struct ima_rule_entry *entry; ssize_t result, len; int audit_info = 0; + int i; p = strsep(&rule, "\n"); len = strlen(p) + 1; @@ -1945,6 +1999,11 @@ INIT_LIST_HEAD(&entry->list); + for (i = 0; i < MAX_LSM_RULES; i++) { + entry->lsm[i].rules_lsm = default_rules_lsm; + entry->lsm[i].lsm_specific = false; + } + result = ima_parse_rule(p, entry); if (result) { ima_free_rule(entry); @@ -2256,6 +2315,9 @@ entry->lsm[i].args_p); break; } + if (entry->lsm[i].lsm_specific) + seq_printf(m, pt(Opt_lsm), + lsm_slot_to_name(entry->lsm[i].rules_lsm)); seq_puts(m, " "); } } --- linux-azure-6.5.0.orig/security/integrity/integrity.h +++ linux-azure-6.5.0/security/integrity/integrity.h @@ -164,6 +164,8 @@ unsigned long flags; unsigned long measured_pcrs; unsigned long atomic_flags; + unsigned long real_ino; + dev_t real_dev; enum integrity_status ima_file_status:4; enum integrity_status ima_mmap_status:4; enum integrity_status ima_bprm_status:4; --- linux-azure-6.5.0.orig/security/integrity/platform_certs/keyring_handler.c +++ linux-azure-6.5.0/security/integrity/platform_certs/keyring_handler.c @@ -40,6 +40,7 @@ static __init void uefi_revocation_list_x509(const char *source, const void *data, size_t len) { + pr_info("Revoking X.509 certificate: %s\n", source); add_key_to_revocation_list(data, len); } --- linux-azure-6.5.0.orig/security/integrity/platform_certs/load_uefi.c +++ linux-azure-6.5.0/security/integrity/platform_certs/load_uefi.c @@ -74,7 +74,8 @@ return NULL; if (*status != EFI_BUFFER_TOO_SMALL) { - pr_err("Couldn't get size: 0x%lx\n", *status); + pr_err("Couldn't get size: %s (0x%lx)\n", + efi_status_to_str(*status), *status); return NULL; } @@ -85,7 +86,8 @@ *status = efi.get_variable(name, guid, NULL, &lsize, db); if (*status != EFI_SUCCESS) { kfree(db); - pr_err("Error reading db var: 0x%lx\n", *status); + pr_err("Error reading db var: %s (0x%lx)\n", + efi_status_to_str(*status), *status); return NULL; } @@ -94,17 +96,18 @@ } /* - * load_moklist_certs() - Load MokList certs + * load_moklist_certs() - Load Mok(X)List certs + * @load_db: Load MokListRT into db when true; MokListXRT into dbx when false * - * Load the certs contained in the UEFI MokListRT database into the - * platform trusted keyring. + * Load the certs contained in the UEFI MokList(X)RT database into the + * platform trusted/denied keyring. * * This routine checks the EFI MOK config table first. If and only if - * that fails, this routine uses the MokListRT ordinary UEFI variable. + * that fails, this routine uses the MokList(X)RT ordinary UEFI variable. * * Return: Status */ -static int __init load_moklist_certs(void) +static int __init load_moklist_certs(const bool load_db) { struct efi_mokvar_table_entry *mokvar_entry; efi_guid_t mok_var = EFI_SHIM_LOCK_GUID; @@ -112,41 +115,55 @@ unsigned long moksize; efi_status_t status; int rc; + const char *mokvar_name = "MokListRT"; + /* Should be const, but get_cert_list() doesn't have it as const yet */ + efi_char16_t *efivar_name = L"MokListRT"; + const char *parse_mokvar_name = "UEFI:MokListRT (MOKvar table)"; + const char *parse_efivar_name = "UEFI:MokListRT"; + efi_element_handler_t (*get_handler_for_guid)(const efi_guid_t *) = get_handler_for_db; + + if (!load_db) { + mokvar_name = "MokListXRT"; + efivar_name = L"MokListXRT"; + parse_mokvar_name = "UEFI:MokListXRT (MOKvar table)"; + parse_efivar_name = "UEFI:MokListXRT"; + get_handler_for_guid = get_handler_for_dbx; + } /* First try to load certs from the EFI MOKvar config table. * It's not an error if the MOKvar config table doesn't exist * or the MokListRT entry is not found in it. */ - mokvar_entry = efi_mokvar_entry_find("MokListRT"); + mokvar_entry = efi_mokvar_entry_find(mokvar_name); if (mokvar_entry) { - rc = parse_efi_signature_list("UEFI:MokListRT (MOKvar table)", + rc = parse_efi_signature_list(parse_mokvar_name, mokvar_entry->data, mokvar_entry->data_size, - get_handler_for_mok); + get_handler_for_guid); /* All done if that worked. */ if (!rc) return rc; - pr_err("Couldn't parse MokListRT signatures from EFI MOKvar config table: %d\n", - rc); + pr_err("Couldn't parse %s signatures from EFI MOKvar config table: %d\n", + mokvar_name, rc); } /* Get MokListRT. It might not exist, so it isn't an error * if we can't get it. */ - mok = get_cert_list(L"MokListRT", &mok_var, &moksize, &status); + mok = get_cert_list(efivar_name, &mok_var, &moksize, &status); if (mok) { - rc = parse_efi_signature_list("UEFI:MokListRT", - mok, moksize, get_handler_for_mok); + rc = parse_efi_signature_list(parse_efivar_name, + mok, moksize, get_handler_for_guid); kfree(mok); if (rc) - pr_err("Couldn't parse MokListRT signatures: %d\n", rc); + pr_err("Couldn't parse %s signatures: %d\n", mokvar_name, rc); return rc; } if (status == EFI_NOT_FOUND) - pr_debug("MokListRT variable wasn't found\n"); + pr_debug("%s variable wasn't found\n", mokvar_name); else - pr_info("Couldn't get UEFI MokListRT\n"); + pr_info("Couldn't get UEFI %s\n", mokvar_name); return 0; } @@ -160,9 +177,8 @@ static int __init load_uefi_certs(void) { efi_guid_t secure_var = EFI_IMAGE_SECURITY_DATABASE_GUID; - efi_guid_t mok_var = EFI_SHIM_LOCK_GUID; - void *db = NULL, *dbx = NULL, *mokx = NULL; - unsigned long dbsize = 0, dbxsize = 0, mokxsize = 0; + void *db = NULL, *dbx = NULL; + unsigned long dbsize = 0, dbxsize = 0; efi_status_t status; int rc = 0; const struct dmi_system_id *dmi_id; @@ -215,23 +231,15 @@ if (!arch_ima_get_secureboot()) return 0; - mokx = get_cert_list(L"MokListXRT", &mok_var, &mokxsize, &status); - if (!mokx) { - if (status == EFI_NOT_FOUND) - pr_debug("mokx variable wasn't found\n"); - else - pr_info("Couldn't get mokx list\n"); - } else { - rc = parse_efi_signature_list("UEFI:MokListXRT", - mokx, mokxsize, - get_handler_for_dbx); - if (rc) - pr_err("Couldn't parse mokx signatures %d\n", rc); - kfree(mokx); - } + /* Load the MokListXRT certs */ + rc = load_moklist_certs(false); + if (rc) + pr_err("Couldn't parse mokx signatures: %d\n", rc); /* Load the MokListRT certs */ - rc = load_moklist_certs(); + rc = load_moklist_certs(true); + if (rc) + pr_err("Couldn't parse mok signatures: %d\n", rc); return rc; } --- linux-azure-6.5.0.orig/security/keys/gc.c +++ linux-azure-6.5.0/security/keys/gc.c @@ -67,6 +67,19 @@ } /* + * Set the expiration time on a key. + */ +void key_set_expiry(struct key *key, time64_t expiry) +{ + key->expiry = expiry; + if (expiry != TIME64_MAX) { + if (!(key->type->flags & KEY_TYPE_INSTANT_REAP)) + expiry += key_gc_delay; + key_schedule_gc(expiry); + } +} + +/* * Schedule a dead links collection run. */ void key_schedule_gc_links(void) @@ -176,7 +189,6 @@ static u8 gc_state; /* Internal persistent state */ #define KEY_GC_REAP_AGAIN 0x01 /* - Need another cycle */ #define KEY_GC_REAPING_LINKS 0x02 /* - We need to reap links */ -#define KEY_GC_SET_TIMER 0x04 /* - We need to restart the timer */ #define KEY_GC_REAPING_DEAD_1 0x10 /* - We need to mark dead keys */ #define KEY_GC_REAPING_DEAD_2 0x20 /* - We need to reap dead key links */ #define KEY_GC_REAPING_DEAD_3 0x40 /* - We need to reap dead keys */ @@ -184,21 +196,17 @@ struct rb_node *cursor; struct key *key; - time64_t new_timer, limit; + time64_t new_timer, limit, expiry; kenter("[%lx,%x]", key_gc_flags, gc_state); limit = ktime_get_real_seconds(); - if (limit > key_gc_delay) - limit -= key_gc_delay; - else - limit = key_gc_delay; /* Work out what we're going to be doing in this pass */ gc_state &= KEY_GC_REAPING_DEAD_1 | KEY_GC_REAPING_DEAD_2; gc_state <<= 1; if (test_and_clear_bit(KEY_GC_KEY_EXPIRED, &key_gc_flags)) - gc_state |= KEY_GC_REAPING_LINKS | KEY_GC_SET_TIMER; + gc_state |= KEY_GC_REAPING_LINKS; if (test_and_clear_bit(KEY_GC_REAP_KEYTYPE, &key_gc_flags)) gc_state |= KEY_GC_REAPING_DEAD_1; @@ -233,8 +241,11 @@ } } - if (gc_state & KEY_GC_SET_TIMER) { - if (key->expiry > limit && key->expiry < new_timer) { + expiry = key->expiry; + if (expiry != TIME64_MAX) { + if (!(key->type->flags & KEY_TYPE_INSTANT_REAP)) + expiry += key_gc_delay; + if (expiry > limit && expiry < new_timer) { kdebug("will expire %x in %lld", key_serial(key), key->expiry - limit); new_timer = key->expiry; @@ -276,7 +287,7 @@ */ kdebug("pass complete"); - if (gc_state & KEY_GC_SET_TIMER && new_timer != (time64_t)TIME64_MAX) { + if (new_timer != TIME64_MAX) { new_timer += key_gc_delay; key_schedule_gc(new_timer); } --- linux-azure-6.5.0.orig/security/keys/internal.h +++ linux-azure-6.5.0/security/keys/internal.h @@ -174,6 +174,7 @@ extern void keyring_gc(struct key *keyring, time64_t limit); extern void keyring_restriction_gc(struct key *keyring, struct key_type *dead_type); +void key_set_expiry(struct key *key, time64_t expiry); extern void key_schedule_gc(time64_t gc_at); extern void key_schedule_gc_links(void); extern void key_gc_keytype(struct key_type *ktype); @@ -222,10 +223,18 @@ */ static inline bool key_is_dead(const struct key *key, time64_t limit) { + time64_t expiry = key->expiry; + + if (expiry != TIME64_MAX) { + if (!(key->type->flags & KEY_TYPE_INSTANT_REAP)) + expiry += key_gc_delay; + if (expiry <= limit) + return true; + } + return key->flags & ((1 << KEY_FLAG_DEAD) | (1 << KEY_FLAG_INVALIDATED)) || - (key->expiry > 0 && key->expiry <= limit) || key->domain_tag->removed; } --- linux-azure-6.5.0.orig/security/keys/key.c +++ linux-azure-6.5.0/security/keys/key.c @@ -294,6 +294,7 @@ key->uid = uid; key->gid = gid; key->perm = perm; + key->expiry = TIME64_MAX; key->restrict_link = restrict_link; key->last_used_at = ktime_get_real_seconds(); @@ -463,10 +464,7 @@ if (authkey) key_invalidate(authkey); - if (prep->expiry != TIME64_MAX) { - key->expiry = prep->expiry; - key_schedule_gc(prep->expiry + key_gc_delay); - } + key_set_expiry(key, prep->expiry); } } @@ -606,8 +604,7 @@ atomic_inc(&key->user->nikeys); mark_key_instantiated(key, -error); notify_key(key, NOTIFY_KEY_INSTANTIATED, -error); - key->expiry = ktime_get_real_seconds() + timeout; - key_schedule_gc(key->expiry + key_gc_delay); + key_set_expiry(key, ktime_get_real_seconds() + timeout); if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags)) awaken = 1; @@ -722,16 +719,14 @@ void key_set_timeout(struct key *key, unsigned timeout) { - time64_t expiry = 0; + time64_t expiry = TIME64_MAX; /* make the changes with the locks held to prevent races */ down_write(&key->sem); if (timeout > 0) expiry = ktime_get_real_seconds() + timeout; - - key->expiry = expiry; - key_schedule_gc(key->expiry + key_gc_delay); + key_set_expiry(key, expiry); up_write(&key->sem); } --- linux-azure-6.5.0.orig/security/keys/proc.c +++ linux-azure-6.5.0/security/keys/proc.c @@ -198,7 +198,7 @@ /* come up with a suitable timeout value */ expiry = READ_ONCE(key->expiry); - if (expiry == 0) { + if (expiry == TIME64_MAX) { memcpy(xbuf, "perm", 5); } else if (now >= expiry) { memcpy(xbuf, "expd", 5); --- linux-azure-6.5.0.orig/security/keys/trusted-keys/trusted_core.c +++ linux-azure-6.5.0/security/keys/trusted-keys/trusted_core.c @@ -44,13 +44,12 @@ #endif }; -DEFINE_STATIC_CALL_NULL(trusted_key_init, *trusted_key_sources[0].ops->init); DEFINE_STATIC_CALL_NULL(trusted_key_seal, *trusted_key_sources[0].ops->seal); DEFINE_STATIC_CALL_NULL(trusted_key_unseal, *trusted_key_sources[0].ops->unseal); DEFINE_STATIC_CALL_NULL(trusted_key_get_random, *trusted_key_sources[0].ops->get_random); -DEFINE_STATIC_CALL_NULL(trusted_key_exit, *trusted_key_sources[0].ops->exit); +static void (*trusted_key_exit)(void); static unsigned char migratable; enum { @@ -359,20 +358,17 @@ if (!get_random) get_random = kernel_get_random; - static_call_update(trusted_key_init, - trusted_key_sources[i].ops->init); - static_call_update(trusted_key_seal, - trusted_key_sources[i].ops->seal); - static_call_update(trusted_key_unseal, - trusted_key_sources[i].ops->unseal); - static_call_update(trusted_key_get_random, - get_random); - static_call_update(trusted_key_exit, - trusted_key_sources[i].ops->exit); - migratable = trusted_key_sources[i].ops->migratable; + ret = trusted_key_sources[i].ops->init(); + if (!ret) { + static_call_update(trusted_key_seal, trusted_key_sources[i].ops->seal); + static_call_update(trusted_key_unseal, trusted_key_sources[i].ops->unseal); + static_call_update(trusted_key_get_random, get_random); - ret = static_call(trusted_key_init)(); - if (!ret) + trusted_key_exit = trusted_key_sources[i].ops->exit; + migratable = trusted_key_sources[i].ops->migratable; + } + + if (!ret || ret != -ENODEV) break; } @@ -388,7 +384,8 @@ static void __exit cleanup_trusted(void) { - static_call_cond(trusted_key_exit)(); + if (trusted_key_exit) + (*trusted_key_exit)(); } late_initcall(init_trusted); --- linux-azure-6.5.0.orig/security/keys/trusted-keys/trusted_tee.c +++ linux-azure-6.5.0/security/keys/trusted-keys/trusted_tee.c @@ -65,24 +65,16 @@ int ret; struct tee_ioctl_invoke_arg inv_arg; struct tee_param param[4]; - struct tee_shm *reg_shm_in = NULL, *reg_shm_out = NULL; + struct tee_shm *reg_shm = NULL; memset(&inv_arg, 0, sizeof(inv_arg)); memset(¶m, 0, sizeof(param)); - reg_shm_in = tee_shm_register_kernel_buf(pvt_data.ctx, p->key, - p->key_len); - if (IS_ERR(reg_shm_in)) { - dev_err(pvt_data.dev, "key shm register failed\n"); - return PTR_ERR(reg_shm_in); - } - - reg_shm_out = tee_shm_register_kernel_buf(pvt_data.ctx, p->blob, - sizeof(p->blob)); - if (IS_ERR(reg_shm_out)) { - dev_err(pvt_data.dev, "blob shm register failed\n"); - ret = PTR_ERR(reg_shm_out); - goto out; + reg_shm = tee_shm_register_kernel_buf(pvt_data.ctx, p->key, + sizeof(p->key) + sizeof(p->blob)); + if (IS_ERR(reg_shm)) { + dev_err(pvt_data.dev, "shm register failed\n"); + return PTR_ERR(reg_shm); } inv_arg.func = TA_CMD_SEAL; @@ -90,13 +82,13 @@ inv_arg.num_params = 4; param[0].attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT; - param[0].u.memref.shm = reg_shm_in; + param[0].u.memref.shm = reg_shm; param[0].u.memref.size = p->key_len; param[0].u.memref.shm_offs = 0; param[1].attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT; - param[1].u.memref.shm = reg_shm_out; + param[1].u.memref.shm = reg_shm; param[1].u.memref.size = sizeof(p->blob); - param[1].u.memref.shm_offs = 0; + param[1].u.memref.shm_offs = sizeof(p->key); ret = tee_client_invoke_func(pvt_data.ctx, &inv_arg, param); if ((ret < 0) || (inv_arg.ret != 0)) { @@ -107,11 +99,7 @@ p->blob_len = param[1].u.memref.size; } -out: - if (reg_shm_out) - tee_shm_free(reg_shm_out); - if (reg_shm_in) - tee_shm_free(reg_shm_in); + tee_shm_free(reg_shm); return ret; } @@ -124,24 +112,16 @@ int ret; struct tee_ioctl_invoke_arg inv_arg; struct tee_param param[4]; - struct tee_shm *reg_shm_in = NULL, *reg_shm_out = NULL; + struct tee_shm *reg_shm = NULL; memset(&inv_arg, 0, sizeof(inv_arg)); memset(¶m, 0, sizeof(param)); - reg_shm_in = tee_shm_register_kernel_buf(pvt_data.ctx, p->blob, - p->blob_len); - if (IS_ERR(reg_shm_in)) { - dev_err(pvt_data.dev, "blob shm register failed\n"); - return PTR_ERR(reg_shm_in); - } - - reg_shm_out = tee_shm_register_kernel_buf(pvt_data.ctx, p->key, - sizeof(p->key)); - if (IS_ERR(reg_shm_out)) { - dev_err(pvt_data.dev, "key shm register failed\n"); - ret = PTR_ERR(reg_shm_out); - goto out; + reg_shm = tee_shm_register_kernel_buf(pvt_data.ctx, p->key, + sizeof(p->key) + sizeof(p->blob)); + if (IS_ERR(reg_shm)) { + dev_err(pvt_data.dev, "shm register failed\n"); + return PTR_ERR(reg_shm); } inv_arg.func = TA_CMD_UNSEAL; @@ -149,11 +129,11 @@ inv_arg.num_params = 4; param[0].attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_INPUT; - param[0].u.memref.shm = reg_shm_in; + param[0].u.memref.shm = reg_shm; param[0].u.memref.size = p->blob_len; - param[0].u.memref.shm_offs = 0; + param[0].u.memref.shm_offs = sizeof(p->key); param[1].attr = TEE_IOCTL_PARAM_ATTR_TYPE_MEMREF_OUTPUT; - param[1].u.memref.shm = reg_shm_out; + param[1].u.memref.shm = reg_shm; param[1].u.memref.size = sizeof(p->key); param[1].u.memref.shm_offs = 0; @@ -166,11 +146,7 @@ p->key_len = param[1].u.memref.size; } -out: - if (reg_shm_out) - tee_shm_free(reg_shm_out); - if (reg_shm_in) - tee_shm_free(reg_shm_in); + tee_shm_free(reg_shm); return ret; } --- linux-azure-6.5.0.orig/security/landlock/cred.c +++ linux-azure-6.5.0/security/landlock/cred.c @@ -42,5 +42,5 @@ __init void landlock_add_cred_hooks(void) { security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), - LANDLOCK_NAME); + &landlock_lsmid); } --- linux-azure-6.5.0.orig/security/landlock/fs.c +++ linux-azure-6.5.0/security/landlock/fs.c @@ -1307,5 +1307,5 @@ __init void landlock_add_fs_hooks(void) { security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), - LANDLOCK_NAME); + &landlock_lsmid); } --- linux-azure-6.5.0.orig/security/landlock/ptrace.c +++ linux-azure-6.5.0/security/landlock/ptrace.c @@ -116,5 +116,5 @@ __init void landlock_add_ptrace_hooks(void) { security_add_hooks(landlock_hooks, ARRAY_SIZE(landlock_hooks), - LANDLOCK_NAME); + &landlock_lsmid); } --- linux-azure-6.5.0.orig/security/landlock/setup.c +++ linux-azure-6.5.0/security/landlock/setup.c @@ -8,6 +8,7 @@ #include #include +#include #include "common.h" #include "cred.h" @@ -24,6 +25,12 @@ .lbs_superblock = sizeof(struct landlock_superblock_security), }; +struct lsm_id landlock_lsmid __ro_after_init = { + .lsm = LANDLOCK_NAME, + .id = LSM_ID_LANDLOCK, + .slot = LSMBLOB_NOT_NEEDED, +}; + static int __init landlock_init(void) { landlock_add_cred_hooks(); --- linux-azure-6.5.0.orig/security/landlock/setup.h +++ linux-azure-6.5.0/security/landlock/setup.h @@ -14,5 +14,6 @@ extern bool landlock_initialized; extern struct lsm_blob_sizes landlock_blob_sizes; +extern struct lsm_id landlock_lsmid; #endif /* _SECURITY_LANDLOCK_SETUP_H */ --- linux-azure-6.5.0.orig/security/loadpin/loadpin.c +++ linux-azure-6.5.0/security/loadpin/loadpin.c @@ -20,6 +20,7 @@ #include #include #include +#include #define VERITY_DIGEST_FILE_HEADER "# LOADPIN_TRUSTED_VERITY_ROOT_DIGESTS" @@ -208,6 +209,12 @@ return loadpin_check(NULL, (enum kernel_read_file_id) id); } +static struct lsm_id loadpin_lsmid __ro_after_init = { + .lsm = "loadpin", + .id = LSM_ID_LOADPIN, + .slot = LSMBLOB_NOT_NEEDED, +}; + static struct security_hook_list loadpin_hooks[] __ro_after_init = { LSM_HOOK_INIT(sb_free_security, loadpin_sb_free_security), LSM_HOOK_INIT(kernel_read_file, loadpin_read_file), @@ -259,7 +266,8 @@ if (!register_sysctl("kernel/loadpin", loadpin_sysctl_table)) pr_notice("sysctl registration failed!\n"); #endif - security_add_hooks(loadpin_hooks, ARRAY_SIZE(loadpin_hooks), "loadpin"); + security_add_hooks(loadpin_hooks, ARRAY_SIZE(loadpin_hooks), + &loadpin_lsmid); return 0; } --- linux-azure-6.5.0.orig/security/lockdown/Kconfig +++ linux-azure-6.5.0/security/lockdown/Kconfig @@ -16,6 +16,19 @@ subsystem is fully initialised. If enabled, lockdown will unconditionally be called before any other LSMs. +config LOCK_DOWN_IN_SECURE_BOOT + bool "Lock down the kernel in Secure Boot mode" + default n + depends on (EFI || S390 || PPC) && SECURITY_LOCKDOWN_LSM_EARLY + help + Secure Boot provides a mechanism for ensuring that the firmware will + only load signed bootloaders and kernels. Secure boot mode + determination is platform-specific; examples include EFI secure boot + and SIPL on s390. + + Enabling this option results in kernel lockdown being triggered if + booted under secure boot. + choice prompt "Kernel default lockdown mode" default LOCK_DOWN_KERNEL_FORCE_NONE --- linux-azure-6.5.0.orig/security/lockdown/lockdown.c +++ linux-azure-6.5.0/security/lockdown/lockdown.c @@ -13,6 +13,7 @@ #include #include #include +#include static enum lockdown_reason kernel_locked_down; @@ -73,6 +74,13 @@ static struct security_hook_list lockdown_hooks[] __ro_after_init = { LSM_HOOK_INIT(locked_down, lockdown_is_locked_down), + LSM_HOOK_INIT(lock_kernel_down, lock_kernel_down), +}; + +static struct lsm_id lockdown_lsmid __ro_after_init = { + .lsm = "lockdown", + .id = LSM_ID_LOCKDOWN, + .slot = LSMBLOB_NOT_NEEDED, }; static int __init lockdown_lsm_init(void) @@ -83,7 +91,7 @@ lock_kernel_down("Kernel configuration", LOCKDOWN_CONFIDENTIALITY_MAX); #endif security_add_hooks(lockdown_hooks, ARRAY_SIZE(lockdown_hooks), - "lockdown"); + &lockdown_lsmid); return 0; } --- linux-azure-6.5.0.orig/security/safesetid/lsm.c +++ linux-azure-6.5.0/security/safesetid/lsm.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "lsm.h" /* Flag indicating whether initialization completed */ @@ -261,6 +262,12 @@ return 0; } +static struct lsm_id safesetid_lsmid __ro_after_init = { + .lsm = "safesetid", + .id = LSM_ID_SAFESETID, + .slot = LSMBLOB_NOT_NEEDED, +}; + static struct security_hook_list safesetid_security_hooks[] = { LSM_HOOK_INIT(task_fix_setuid, safesetid_task_fix_setuid), LSM_HOOK_INIT(task_fix_setgid, safesetid_task_fix_setgid), @@ -271,7 +278,8 @@ static int __init safesetid_security_init(void) { security_add_hooks(safesetid_security_hooks, - ARRAY_SIZE(safesetid_security_hooks), "safesetid"); + ARRAY_SIZE(safesetid_security_hooks), + &safesetid_lsmid); /* Report that SafeSetID successfully initialized */ safesetid_initialized = 1; --- linux-azure-6.5.0.orig/security/security.c +++ linux-azure-6.5.0/security/security.c @@ -29,7 +29,10 @@ #include #include #include +#include +#include #include +#include #define MAX_LSM_EVM_XATTR 2 @@ -82,7 +85,16 @@ static struct kmem_cache *lsm_inode_cache; char *lsm_names; -static struct lsm_blob_sizes blob_sizes __ro_after_init; + +/* + * The task blob includes the "interface_lsm" slot used for + * chosing which module presents contexts. + * Using a long to avoid potential alignment issues with + * module assigned task blobs. + */ +static struct lsm_blob_sizes blob_sizes __ro_after_init = { + .lbs_task = sizeof(long), +}; /* Boot-time LSM user choice */ static __initdata const char *chosen_lsm_order; @@ -210,6 +222,7 @@ lsm_set_blob_size(&needed->lbs_inode, &blob_sizes.lbs_inode); lsm_set_blob_size(&needed->lbs_ipc, &blob_sizes.lbs_ipc); lsm_set_blob_size(&needed->lbs_msg_msg, &blob_sizes.lbs_msg_msg); + lsm_set_blob_size(&needed->lbs_sock, &blob_sizes.lbs_sock); lsm_set_blob_size(&needed->lbs_superblock, &blob_sizes.lbs_superblock); lsm_set_blob_size(&needed->lbs_task, &blob_sizes.lbs_task); } @@ -330,6 +343,12 @@ static int lsm_append(const char *new, char **result); +/* + * Current index to use while initializing the lsm id list. + */ +int lsm_id __ro_after_init; +struct lsm_id *lsm_idlist[LSMID_ENTRIES] __ro_after_init; + static void __init report_lsm_order(void) { struct lsm_info **lsm, *early; @@ -376,8 +395,10 @@ init_debug("inode blob size = %d\n", blob_sizes.lbs_inode); init_debug("ipc blob size = %d\n", blob_sizes.lbs_ipc); init_debug("msg_msg blob size = %d\n", blob_sizes.lbs_msg_msg); + init_debug("sock blob size = %d\n", blob_sizes.lbs_sock); init_debug("superblock blob size = %d\n", blob_sizes.lbs_superblock); init_debug("task blob size = %d\n", blob_sizes.lbs_task); + init_debug("lsmblob size = %zu\n", sizeof(struct lsmblob)); /* * Create any kmem_caches needed for blobs @@ -396,6 +417,7 @@ for (lsm = ordered_lsms; *lsm; lsm++) initialize_lsm(*lsm); + init_debug("lsm count = %d\n", lsm_id); kfree(ordered_lsms); } @@ -508,21 +530,98 @@ return 0; } +/* + * Current index to use while initializing the lsmblob secid list. + */ +static int lsm_slot __ro_after_init; + +#if LSMBLOB_ENTRIES > 0 +static struct lsm_id *lsm_slotlist[LSMBLOB_ENTRIES] __ro_after_init; + +/** + * lsm_name_to_slot - Report the slot number for a security module + * @name: name of the security module + * + * Look up the slot number for the named security module. + * Returns the slot number or LSMBLOB_INVALID if @name is not + * a registered security module name. + */ +int lsm_name_to_slot(char *name) +{ + int i; + + for (i = 0; i < lsm_slot; i++) + if (strcmp(lsm_slotlist[i]->lsm, name) == 0) + return i; + + return LSMBLOB_INVALID; +} + +/** + * lsm_slot_to_name - Get the name of the security module in a slot + * @slot: index into the interface LSM slot list. + * + * Provide the name of the security module associated with + * a interface LSM slot. + * + * If @slot is LSMBLOB_INVALID return the value + * for slot 0 if it has been set, otherwise NULL. + * + * Returns a pointer to the name string or NULL. + */ +const char *lsm_slot_to_name(int slot) +{ + if (slot == LSMBLOB_INVALID) + slot = 0; + else if (slot >= LSMBLOB_ENTRIES || slot < 0) + return NULL; + + if (lsm_slotlist[slot] == NULL) + return NULL; + return lsm_slotlist[slot]->lsm; +} +#endif /* LSMBLOB_ENTRIES > 0 */ + /** * security_add_hooks - Add a modules hooks to the hook lists. * @hooks: the hooks to add * @count: the number of hooks to add - * @lsm: the name of the security module + * @lsmid: the identification information for the security module * * Each LSM has to register its hooks with the infrastructure. + * If the LSM is using hooks that export secids allocate a slot + * for it in the lsmblob. */ void __init security_add_hooks(struct security_hook_list *hooks, int count, - const char *lsm) + struct lsm_id *lsmid) { int i; + /* + * A security module may call security_add_hooks() more + * than once. Landlock is one such case. + */ + if (lsm_id == 0 || lsm_idlist[lsm_id - 1] != lsmid) + lsm_idlist[lsm_id++] = lsmid; + + if (lsm_id > LSMID_ENTRIES) + panic("%s Too many LSMs registered.\n", __func__); + + WARN_ON(!lsmid->slot || !lsmid->id); + +#if LSMBLOB_ENTRIES > 0 + if (lsmid->slot == LSMBLOB_NEEDED) { + if (lsm_slot >= LSMBLOB_ENTRIES) + panic("%s Too many LSMs registered.\n", __func__); + lsm_slotlist[lsm_slot] = lsmid; + lsmid->slot = lsm_slot++; + init_debug("%s assigned lsmblob slot %d\n", lsmid->lsm, + lsmid->slot); + } +#endif /* LSMBLOB_ENTRIES > 0 */ + for (i = 0; i < count; i++) { - hooks[i].lsm = lsm; + hooks[i].lsmid = lsmid; hlist_add_tail_rcu(&hooks[i].list, hooks[i].head); } @@ -531,7 +630,7 @@ * and fix this up afterwards. */ if (slab_is_available()) { - if (lsm_append(lsm, &lsm_names) < 0) + if (lsm_append(lsmid->lsm, &lsm_names) < 0) panic("%s - Cannot get early memory.\n", __func__); } } @@ -645,6 +744,8 @@ */ static int lsm_task_alloc(struct task_struct *task) { + int *ilsm; + if (blob_sizes.lbs_task == 0) { task->security = NULL; return 0; @@ -653,6 +754,15 @@ task->security = kzalloc(blob_sizes.lbs_task, GFP_KERNEL); if (task->security == NULL) return -ENOMEM; + + /* + * The start of the task blob contains the "interface" LSM slot number. + * Start with it set to the invalid slot number, indicating that the + * default first registered LSM be displayed. + */ + ilsm = task->security; + *ilsm = LSMBLOB_INVALID; + return 0; } @@ -699,6 +809,28 @@ } /** + * lsm_sock_alloc - allocate a composite sock blob + * @sock: the sock that needs a blob + * @priority: allocation mode + * + * Allocate the sock blob for all the modules + * + * Returns 0, or -ENOMEM if memory can't be allocated. + */ +static int lsm_sock_alloc(struct sock *sock, gfp_t priority) +{ + if (blob_sizes.lbs_sock == 0) { + sock->sk_security = NULL; + return 0; + } + + sock->sk_security = kzalloc(blob_sizes.lbs_sock, priority); + if (sock->sk_security == NULL) + return -ENOMEM; + return 0; +} + +/** * lsm_early_task - during initialization allocate a composite task blob * @task: the task that needs a blob * @@ -798,6 +930,7 @@ { return call_int_hook(binder_set_context_mgr, 0, mgr); } +EXPORT_SYMBOL(security_binder_set_context_mgr); /** * security_binder_transaction() - Check if a binder transaction is allowed @@ -813,6 +946,7 @@ { return call_int_hook(binder_transaction, 0, from, to); } +EXPORT_SYMBOL(security_binder_transaction); /** * security_binder_transfer_binder() - Check if a binder transfer is allowed @@ -828,6 +962,7 @@ { return call_int_hook(binder_transfer_binder, 0, from, to); } +EXPORT_SYMBOL(security_binder_transfer_binder); /** * security_binder_transfer_file() - Check if a binder file xfer is allowed @@ -844,6 +979,7 @@ { return call_int_hook(binder_transfer_file, 0, from, to, file); } +EXPORT_SYMBOL(security_binder_transfer_file); /** * security_ptrace_access_check() - Check if tracing is allowed @@ -1139,6 +1275,20 @@ } /** + * security_fs_context_submount() - Initialise fc->security + * @fc: new filesystem context + * @reference: dentry reference for submount/remount + * + * Fill out the ->security field for a new fs_context. + * + * Return: Returns 0 on success or negative error code on failure. + */ +int security_fs_context_submount(struct fs_context *fc, struct super_block *reference) +{ + return call_int_hook(fs_context_submount, 0, fc, reference); +} + +/** * security_fs_context_dup() - Duplicate a fs_context LSM blob * @fc: destination filesystem context * @src_fc: source filesystem context @@ -1535,8 +1685,8 @@ */ int security_dentry_init_security(struct dentry *dentry, int mode, const struct qstr *name, - const char **xattr_name, void **ctx, - u32 *ctxlen) + const char **xattr_name, + struct lsmcontext *lsmctx) { struct security_hook_list *hp; int rc; @@ -1547,7 +1697,10 @@ hlist_for_each_entry(hp, &security_hook_heads.dentry_init_security, list) { rc = hp->hook.dentry_init_security(dentry, mode, name, - xattr_name, ctx, ctxlen); + xattr_name, + (void **)&lsmctx->context, + &lsmctx->len); + lsmctx->slot = hp->lsmid->slot; if (rc != LSM_RET_DEFAULT(dentry_init_security)) return rc; } @@ -2443,14 +2596,21 @@ /** * security_inode_getsecid() - Get an inode's secid * @inode: inode - * @secid: secid to return + * @blob: lsm blob to return * - * Get the secid associated with the node. In case of failure, @secid will be + * Get the lsm blo associated with the node. In case of failure, @blob will be * set to zero. */ -void security_inode_getsecid(struct inode *inode, u32 *secid) +void security_inode_getsecid(struct inode *inode, struct lsmblob *blob) { - call_void_hook(inode_getsecid, inode, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.inode_getsecid, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.inode_getsecid(inode, &blob->secid[hp->lsmid->slot]); + } } /** @@ -2827,14 +2987,26 @@ */ int security_task_alloc(struct task_struct *task, unsigned long clone_flags) { + int *oilsm = current->security; + int *nilsm; int rc = lsm_task_alloc(task); - if (rc) + if (unlikely(rc)) return rc; + rc = call_int_hook(task_alloc, 0, task, clone_flags); - if (unlikely(rc)) + if (unlikely(rc)) { security_task_free(task); - return rc; + return rc; + } + + if (oilsm) { + nilsm = task->security; + if (nilsm) + *nilsm = *oilsm; + } + + return 0; } /** @@ -2934,31 +3106,47 @@ /** * security_cred_getsecid() - Get the secid from a set of credentials * @c: credentials - * @secid: secid value + * @blob: lsm blob * * Retrieve the security identifier of the cred structure @c. In case of - * failure, @secid will be set to zero. + * failure, @blob will be set to zero. */ -void security_cred_getsecid(const struct cred *c, u32 *secid) +void security_cred_getsecid(const struct cred *c, struct lsmblob *blob) { - *secid = 0; - call_void_hook(cred_getsecid, c, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.cred_getsecid, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.cred_getsecid(c, &blob->secid[hp->lsmid->slot]); + } } EXPORT_SYMBOL(security_cred_getsecid); /** * security_kernel_act_as() - Set the kernel credentials to act as secid * @new: credentials - * @secid: secid + * @blob: lsm blob * * Set the credentials for a kernel service to act as (subjective context). * The current task must be the one that nominated @secid. * * Return: Returns 0 if successful. */ -int security_kernel_act_as(struct cred *new, u32 secid) +int security_kernel_act_as(struct cred *new, struct lsmblob *blob) { - return call_int_hook(kernel_act_as, 0, new, secid); + struct security_hook_list *hp; + int rc; + + hlist_for_each_entry(hp, &security_hook_heads.kernel_act_as, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + rc = hp->hook.kernel_act_as(new, blob->secid[hp->lsmid->slot]); + if (rc != 0) + return rc; + } + return 0; } /** @@ -3192,30 +3380,43 @@ /** * security_current_getsecid_subj() - Get the current task's subjective secid - * @secid: secid value + * @blob: lsm blob * * Retrieve the subjective security identifier of the current task and return - * it in @secid. In case of failure, @secid will be set to zero. + * it in @blob. In case of failure, @blob will be set to zero. */ -void security_current_getsecid_subj(u32 *secid) +void security_current_getsecid_subj(struct lsmblob *blob) { - *secid = 0; - call_void_hook(current_getsecid_subj, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.current_getsecid_subj, + list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.current_getsecid_subj(&blob->secid[hp->lsmid->slot]); + } } EXPORT_SYMBOL(security_current_getsecid_subj); /** * security_task_getsecid_obj() - Get a task's objective secid * @p: target task - * @secid: secid value + * @blob: lsm blob * * Retrieve the objective security identifier of the task_struct in @p and - * return it in @secid. In case of failure, @secid will be set to zero. + * return it in @blob. In case of failure, @blob will be set to zero. */ -void security_task_getsecid_obj(struct task_struct *p, u32 *secid) +void security_task_getsecid_obj(struct task_struct *p, struct lsmblob *blob) { - *secid = 0; - call_void_hook(task_getsecid_obj, p, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.task_getsecid_obj, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.task_getsecid_obj(p, &blob->secid[hp->lsmid->slot]); + } } EXPORT_SYMBOL(security_task_getsecid_obj); @@ -3373,7 +3574,9 @@ int security_task_prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) { + int *ilsm = current->security; int thisrc; + int slot; int rc = LSM_RET_DEFAULT(task_prctl); struct security_hook_list *hp; @@ -3385,6 +3588,28 @@ break; } } + + if (lsm_slot == 0) + return rc; + + switch (option) { + case PR_LSM_ATTR_SET: + if (rc && rc != LSM_RET_DEFAULT(task_prctl)) + return rc; + for (slot = 0; slot < lsm_slot; slot++) + if (lsm_slotlist[slot]->id == arg2) { + *ilsm = lsm_slotlist[slot]->slot; + return 0; + } + return -EINVAL; + case PR_LSM_ATTR_GET: + if (rc && rc != LSM_RET_DEFAULT(task_prctl)) + return rc; + if (*ilsm != LSMBLOB_INVALID) + return lsm_slotlist[*ilsm]->id; + return lsm_slotlist[0]->id; + } + return rc; } @@ -3431,15 +3656,21 @@ /** * security_ipc_getsecid() - Get the sysv ipc object's secid * @ipcp: ipc permission structure - * @secid: secid pointer + * @blob: lsm blob * - * Get the secid associated with the ipc object. In case of failure, @secid + * Get the lsm blob associated with the ipc object. In case of failure, @blob * will be set to zero. */ -void security_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid) +void security_ipc_getsecid(struct kern_ipc_perm *ipcp, struct lsmblob *blob) { - *secid = 0; - call_void_hook(ipc_getsecid, ipcp, secid); + struct security_hook_list *hp; + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.ipc_getsecid, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + hp->hook.ipc_getsecid(ipcp, &blob->secid[hp->lsmid->slot]); + } } /** @@ -3764,7 +3995,7 @@ /** * security_getprocattr() - Read an attribute for a task * @p: the task - * @lsm: LSM name + * @lsmid: LSM ID * @name: attribute name * @value: attribute value * @@ -3772,38 +4003,48 @@ * * Return: Returns the length of @value on success, a negative value otherwise. */ -int security_getprocattr(struct task_struct *p, const char *lsm, - const char *name, char **value) +int security_getprocattr(struct task_struct *p, int lsmid, const char *name, + char **value) { struct security_hook_list *hp; + int ilsm = lsm_task_ilsm(current); hlist_for_each_entry(hp, &security_hook_heads.getprocattr, list) { - if (lsm != NULL && strcmp(lsm, hp->lsm)) + if (lsmid != LSM_ID_INVALID && lsmid != hp->lsmid->id) continue; + if (lsmid == LSM_ID_INVALID && ilsm != LSMBLOB_INVALID && + ilsm != hp->lsmid->slot) + continue; + return hp->hook.getprocattr(p, name, value); } return LSM_RET_DEFAULT(getprocattr); } /** - * security_setprocattr() - Set an attribute for a task - * @lsm: LSM name - * @name: attribute name - * @value: attribute value - * @size: attribute value size - * - * Write (set) the current task's attribute @name to @value, size @size if - * allowed. + * security_setprocattr - Set process attributes for a task via /proc + * @lsmid: LSM ID of module involved + * @name: name of the attribute + * @value: value to set the attribute to + * @size: size of the value + * + * Set the process attribute for the specified security module + * to the specified value. Note that this can only be used to set + * the process attributes for the current, or "self" process. + * The /proc code has already done this check. * - * Return: Returns bytes written on success, a negative value otherwise. + * Returns 0 on success, an appropriate code otherwise. */ -int security_setprocattr(const char *lsm, const char *name, void *value, - size_t size) +int security_setprocattr(int lsmid, const char *name, void *value, size_t size) { struct security_hook_list *hp; + int ilsm = lsm_task_ilsm(current); hlist_for_each_entry(hp, &security_hook_heads.setprocattr, list) { - if (lsm != NULL && strcmp(lsm, hp->lsm)) + if (lsmid != LSM_ID_INVALID && lsmid != hp->lsmid->id) + continue; + if (lsmid == LSM_ID_INVALID && ilsm != LSMBLOB_INVALID && + ilsm != hp->lsmid->slot) continue; return hp->hook.setprocattr(name, value, size); } @@ -3843,31 +4084,56 @@ EXPORT_SYMBOL(security_ismaclabel); /** - * security_secid_to_secctx() - Convert a secid to a secctx - * @secid: secid - * @secdata: secctx - * @seclen: secctx length - * - * Convert secid to security context. If @secdata is NULL the length of the - * result will be returned in @seclen, but no @secdata will be returned. This - * does mean that the length could change between calls to check the length and - * the next call which actually allocates and returns the @secdata. - * - * Return: Return 0 on success, error on failure. + * security_secid_to_secctx - convert secid to secctx + * @blob: set of secids + * @cp: lsm context into which result is put + * @ilsm: which security module to report + * + * Translate secid information into a secctx string. + * Return a negative value on error. + * If cp is NULL return the length of the string. + * Otherwise, return 0. */ -int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) +int security_secid_to_secctx(struct lsmblob *blob, struct lsmcontext *cp, + int ilsm) { struct security_hook_list *hp; - int rc; + + if (cp) + memset(cp, 0, sizeof(*cp)); /* - * Currently, only one LSM can implement secid_to_secctx (i.e this - * LSM hook is not "stackable"). + * ilsm either is the slot number use for formatting + * or an instruction on which relative slot to use. */ + if (ilsm == LSMBLOB_DISPLAY) + ilsm = lsm_task_ilsm(current); + else if (ilsm == LSMBLOB_FIRST) + ilsm = LSMBLOB_INVALID; + else if (ilsm < 0) { + WARN_ONCE(true, "LSM: %s unknown interface LSM\n", __func__); + ilsm = LSMBLOB_INVALID; + } else if (ilsm >= lsm_slot) { + WARN_ONCE(true, "LSM: %s invalid interface LSM\n", __func__); + ilsm = LSMBLOB_INVALID; + } hlist_for_each_entry(hp, &security_hook_heads.secid_to_secctx, list) { - rc = hp->hook.secid_to_secctx(secid, secdata, seclen); - if (rc != LSM_RET_DEFAULT(secid_to_secctx)) - return rc; + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + if (ilsm == LSMBLOB_INVALID || ilsm == hp->lsmid->slot) { + if (!cp) { + int len; + int rc; + rc = hp->hook.secid_to_secctx( + blob->secid[hp->lsmid->slot], + NULL, &len); + return rc ? rc : len; + } + cp->slot = hp->lsmid->slot; + return hp->hook.secid_to_secctx( + blob->secid[hp->lsmid->slot], + &cp->context, &cp->len); + } } return LSM_RET_DEFAULT(secid_to_secctx); @@ -3878,29 +4144,47 @@ * security_secctx_to_secid() - Convert a secctx to a secid * @secdata: secctx * @seclen: length of secctx - * @secid: secid + * @blob: lsm blob * * Convert security context to secid. * * Return: Returns 0 on success, error on failure. */ -int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid) +int security_secctx_to_secid(const char *secdata, u32 seclen, + struct lsmblob *blob) { - *secid = 0; - return call_int_hook(secctx_to_secid, 0, secdata, seclen, secid); + struct security_hook_list *hp; + int ilsm = lsm_task_ilsm(current); + + lsmblob_init(blob, 0); + hlist_for_each_entry(hp, &security_hook_heads.secctx_to_secid, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + if (ilsm == LSMBLOB_INVALID || ilsm == hp->lsmid->slot) + return hp->hook.secctx_to_secid(secdata, seclen, + &blob->secid[hp->lsmid->slot]); + } + return 0; } EXPORT_SYMBOL(security_secctx_to_secid); /** * security_release_secctx() - Free a secctx buffer - * @secdata: secctx - * @seclen: length of secctx + * @cp: lsm context * * Release the security context. */ -void security_release_secctx(char *secdata, u32 seclen) +void security_release_secctx(struct lsmcontext *cp) { - call_void_hook(release_secctx, secdata, seclen); + struct security_hook_list *hp; + + hlist_for_each_entry(hp, &security_hook_heads.release_secctx, list) + if (cp->slot == hp->lsmid->slot) { + hp->hook.release_secctx(cp->context, cp->len); + break; + } + + memset(cp, 0, sizeof(*cp)); } EXPORT_SYMBOL(security_release_secctx); @@ -3963,17 +4247,25 @@ /** * security_inode_getsecctx() - Get the security label of an inode * @inode: inode - * @ctx: secctx - * @ctxlen: length of secctx + * @cp: lsm context * - * On success, returns 0 and fills out @ctx and @ctxlen with the security - * context for the given @inode. + * On success, returns 0 and fills out @cp with the security context for the + * given @inode. * * Return: Returns 0 on success, error on failure. */ -int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen) +int security_inode_getsecctx(struct inode *inode, struct lsmcontext *cp) { - return call_int_hook(inode_getsecctx, -EOPNOTSUPP, inode, ctx, ctxlen); + struct security_hook_list *hp; + + memset(cp, 0, sizeof(*cp)); + + hlist_for_each_entry(hp, &security_hook_heads.inode_getsecctx, list) { + cp->slot = hp->lsmid->slot; + return hp->hook.inode_getsecctx(inode, (void **)&cp->context, + &cp->len); + } + return -EOPNOTSUPP; } EXPORT_SYMBOL(security_inode_getsecctx); @@ -4330,8 +4622,15 @@ int security_socket_getpeersec_stream(struct socket *sock, sockptr_t optval, sockptr_t optlen, unsigned int len) { - return call_int_hook(socket_getpeersec_stream, -ENOPROTOOPT, sock, - optval, optlen, len); + int ilsm = lsm_task_ilsm(current); + struct security_hook_list *hp; + + hlist_for_each_entry(hp, &security_hook_heads.socket_getpeersec_stream, + list) + if (ilsm == LSMBLOB_INVALID || ilsm == hp->lsmid->slot) + return hp->hook.socket_getpeersec_stream(sock, optval, + optlen, len); + return -ENOPROTOOPT; } /** @@ -4351,8 +4650,23 @@ int security_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) { - return call_int_hook(socket_getpeersec_dgram, -ENOPROTOOPT, sock, - skb, secid); + struct security_hook_list *hp; + int rc = -ENOPROTOOPT; + + /* + * Only one security module should provide a real hook for + * this. A stub or bypass like is used in BPF should either + * (somehow) leave rc unaltered or return -ENOPROTOOPT. + */ + hlist_for_each_entry(hp, &security_hook_heads.socket_getpeersec_dgram, + list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + rc = hp->hook.socket_getpeersec_dgram(sock, skb, secid); + if (rc != -ENOPROTOOPT) + break; + } + return rc; } EXPORT_SYMBOL(security_socket_getpeersec_dgram); @@ -4369,7 +4683,14 @@ */ int security_sk_alloc(struct sock *sk, int family, gfp_t priority) { - return call_int_hook(sk_alloc_security, 0, sk, family, priority); + int rc = lsm_sock_alloc(sk, priority); + + if (unlikely(rc)) + return rc; + rc = call_int_hook(sk_alloc_security, 0, sk, family, priority); + if (unlikely(rc)) + security_sk_free(sk); + return rc; } /** @@ -4381,6 +4702,8 @@ void security_sk_free(struct sock *sk) { call_void_hook(sk_free_security, sk); + kfree(sk->sk_security); + sk->sk_security = NULL; } /** @@ -5016,16 +5339,34 @@ * @field: audit action * @op: rule operator * @rulestr: rule context - * @lsmrule: receive buffer for audit rule struct + * @lsmrule: receive audit lsm for audit rule struct * * Allocate and initialize an LSM audit rule structure. * * Return: Return 0 if @lsmrule has been successfully set, -EINVAL in case of * an invalid rule. */ -int security_audit_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule) +int security_audit_rule_init(u32 field, u32 op, char *rulestr, + struct audit_lsm_rules *lsmrules) { - return call_int_hook(audit_rule_init, 0, field, op, rulestr, lsmrule); + struct security_hook_list *hp; + bool one_is_good = false; + int rc = 0; + int trc; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_init, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + trc = hp->hook.audit_rule_init(field, op, rulestr, + &lsmrules->rule[hp->lsmid->slot]); + if (trc == 0) + one_is_good = true; + else + rc = trc; + } + if (one_is_good) + return 0; + return rc; } /** @@ -5049,14 +5390,22 @@ * Deallocate the LSM audit rule structure previously allocated by * audit_rule_init(). */ -void security_audit_rule_free(void *lsmrule) +void security_audit_rule_free(struct audit_lsm_rules *lsmrules) { - call_void_hook(audit_rule_free, lsmrule); + struct security_hook_list *hp; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_free, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + if (lsmrules->rule[hp->lsmid->slot] == NULL) + continue; + hp->hook.audit_rule_free(lsmrules->rule[hp->lsmid->slot]); + } } /** * security_audit_rule_match() - Check if a label matches an audit rule - * @secid: security label + * @blob: lsm security blob * @field: LSM audit field * @op: matching operator * @lsmrule: audit rule @@ -5067,12 +5416,71 @@ * Return: Returns 1 if secid matches the rule, 0 if it does not, -ERRNO on * failure. */ -int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule) +int security_audit_rule_match(struct lsmblob *blob, u32 field, u32 op, + struct audit_lsm_rules *lsmrules) { - return call_int_hook(audit_rule_match, 0, secid, field, op, lsmrule); + struct security_hook_list *hp; + int rc; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_match, list) { + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) + continue; + if (lsmrules->rule[hp->lsmid->slot] == NULL) + continue; + rc = hp->hook.audit_rule_match(blob->secid[hp->lsmid->slot], + field, op, + &lsmrules->rule[hp->lsmid->slot]); + if (rc) + return rc; + } + return 0; } #endif /* CONFIG_AUDIT */ +#ifdef CONFIG_IMA_LSM_RULES +/* + * The integrity subsystem uses the same hooks as + * the audit subsystem. + */ +int ima_filter_rule_init(u32 field, u32 op, char *rulestr, void **lsmrule, + int lsmslot) +{ + struct security_hook_list *hp; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_init, list) + if (hp->lsmid->slot == lsmslot) + return hp->hook.audit_rule_init(field, op, rulestr, + lsmrule); + + return 0; +} + +void ima_filter_rule_free(void *lsmrule, int lsmslot) +{ + struct security_hook_list *hp; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_free, list) { + if (hp->lsmid->slot == lsmslot) { + hp->hook.audit_rule_free(lsmrule); + return; + } + } +} + +int ima_filter_rule_match(struct lsmblob *blob, u32 field, u32 op, + void *lsmrule, int lsmslot) +{ + struct security_hook_list *hp; + + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_match, list) + if (hp->lsmid->slot == lsmslot) + return hp->hook.audit_rule_match(blob->secid[lsmslot], + field, op, lsmrule); + + return 0; +} +#endif /* CONFIG_IMA_LSM_RULES */ + #ifdef CONFIG_BPF_SYSCALL /** * security_bpf() - Check if the bpf syscall operation is allowed @@ -5184,6 +5592,12 @@ } EXPORT_SYMBOL(security_locked_down); +int security_lock_kernel_down(const char *where, enum lockdown_reason level) +{ + return call_int_hook(lock_kernel_down, 0, where, level); +} +EXPORT_SYMBOL(security_lock_kernel_down); + #ifdef CONFIG_PERF_EVENTS /** * security_perf_event_open() - Check if a perf event open is allowed --- linux-azure-6.5.0.orig/security/selinux/hooks.c +++ linux-azure-6.5.0/security/selinux/hooks.c @@ -92,6 +92,8 @@ #include #include #include +#include +#include #include "avc.h" #include "objsec.h" @@ -1633,8 +1635,6 @@ struct inode_security_struct *isec; u32 sid; - validate_creds(cred); - if (unlikely(IS_PRIVATE(inode))) return 0; @@ -2745,6 +2745,33 @@ FILESYSTEM__UNMOUNT, NULL); } +static int selinux_fs_context_submount(struct fs_context *fc, + struct super_block *reference) +{ + const struct superblock_security_struct *sbsec = selinux_superblock(reference); + struct selinux_mnt_opts *opts; + + /* + * Ensure that fc->security remains NULL when no options are set + * as expected by selinux_set_mnt_opts(). + */ + if (!(sbsec->flags & (FSCONTEXT_MNT|CONTEXT_MNT|DEFCONTEXT_MNT))) + return 0; + + opts = kzalloc(sizeof(*opts), GFP_KERNEL); + if (!opts) + return -ENOMEM; + + if (sbsec->flags & FSCONTEXT_MNT) + opts->fscontext_sid = sbsec->sid; + if (sbsec->flags & CONTEXT_MNT) + opts->context_sid = sbsec->mntpoint_sid; + if (sbsec->flags & DEFCONTEXT_MNT) + opts->defcontext_sid = sbsec->def_sid; + fc->security = opts; + return 0; +} + static int selinux_fs_context_dup(struct fs_context *fc, struct fs_context *src_fc) { @@ -3004,8 +3031,6 @@ struct inode_security_struct *isec; u32 sid; - validate_creds(cred); - ad.type = LSM_AUDIT_DATA_DENTRY; ad.u.dentry = dentry; sid = cred_sid(cred); @@ -3049,8 +3074,6 @@ if (!mask) return 0; - validate_creds(cred); - if (unlikely(IS_PRIVATE(inode))) return 0; @@ -4497,7 +4520,7 @@ static int sock_has_perm(struct sock *sk, u32 perms) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct common_audit_data ad; struct lsm_network_audit net = {0,}; @@ -4552,7 +4575,7 @@ isec->initialized = LABEL_INITIALIZED; if (sock->sk) { - sksec = sock->sk->sk_security; + sksec = selinux_sock(sock->sk); sksec->sclass = sclass; sksec->sid = sid; /* Allows detection of the first association on this socket */ @@ -4568,8 +4591,8 @@ static int selinux_socket_socketpair(struct socket *socka, struct socket *sockb) { - struct sk_security_struct *sksec_a = socka->sk->sk_security; - struct sk_security_struct *sksec_b = sockb->sk->sk_security; + struct sk_security_struct *sksec_a = selinux_sock(socka->sk); + struct sk_security_struct *sksec_b = selinux_sock(sockb->sk); sksec_a->peer_sid = sksec_b->sid; sksec_b->peer_sid = sksec_a->sid; @@ -4584,7 +4607,7 @@ static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen) { struct sock *sk = sock->sk; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); u16 family; int err; @@ -4717,7 +4740,7 @@ struct sockaddr *address, int addrlen) { struct sock *sk = sock->sk; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); int err; err = sock_has_perm(sk, SOCKET__CONNECT); @@ -4895,9 +4918,9 @@ struct sock *other, struct sock *newsk) { - struct sk_security_struct *sksec_sock = sock->sk_security; - struct sk_security_struct *sksec_other = other->sk_security; - struct sk_security_struct *sksec_new = newsk->sk_security; + struct sk_security_struct *sksec_sock = selinux_sock(sock); + struct sk_security_struct *sksec_other = selinux_sock(other); + struct sk_security_struct *sksec_new = selinux_sock(newsk); struct common_audit_data ad; struct lsm_network_audit net = {0,}; int err; @@ -4928,8 +4951,8 @@ static int selinux_socket_unix_may_send(struct socket *sock, struct socket *other) { - struct sk_security_struct *ssec = sock->sk->sk_security; - struct sk_security_struct *osec = other->sk->sk_security; + struct sk_security_struct *ssec = selinux_sock(sock->sk); + struct sk_security_struct *osec = selinux_sock(other->sk); struct common_audit_data ad; struct lsm_network_audit net = {0,}; @@ -4968,7 +4991,7 @@ u16 family) { int err = 0; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); u32 sk_sid = sksec->sid; struct common_audit_data ad; struct lsm_network_audit net = {0,}; @@ -5000,7 +5023,7 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) { int err; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); u16 family = sk->sk_family; u32 sk_sid = sksec->sid; struct common_audit_data ad; @@ -5073,7 +5096,7 @@ int err = 0; char *scontext = NULL; u32 scontext_len; - struct sk_security_struct *sksec = sock->sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sock->sk); u32 peer_sid = SECSID_NULL; if (sksec->sclass == SECCLASS_UNIX_STREAM_SOCKET || @@ -5131,34 +5154,27 @@ static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority) { - struct sk_security_struct *sksec; - - sksec = kzalloc(sizeof(*sksec), priority); - if (!sksec) - return -ENOMEM; + struct sk_security_struct *sksec = selinux_sock(sk); sksec->peer_sid = SECINITSID_UNLABELED; sksec->sid = SECINITSID_UNLABELED; sksec->sclass = SECCLASS_SOCKET; selinux_netlbl_sk_security_reset(sksec); - sk->sk_security = sksec; return 0; } static void selinux_sk_free_security(struct sock *sk) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); - sk->sk_security = NULL; selinux_netlbl_sk_security_free(sksec); - kfree(sksec); } static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk) { - struct sk_security_struct *sksec = sk->sk_security; - struct sk_security_struct *newsksec = newsk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); + struct sk_security_struct *newsksec = selinux_sock(newsk); newsksec->sid = sksec->sid; newsksec->peer_sid = sksec->peer_sid; @@ -5172,7 +5188,7 @@ if (!sk) *secid = SECINITSID_ANY_SOCKET; else { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); *secid = sksec->sid; } @@ -5182,7 +5198,7 @@ { struct inode_security_struct *isec = inode_security_novalidate(SOCK_INODE(parent)); - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 || sk->sk_family == PF_UNIX) @@ -5199,7 +5215,7 @@ { struct sock *sk = asoc->base.sk; u16 family = sk->sk_family; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct common_audit_data ad; struct lsm_network_audit net = {0,}; int err; @@ -5256,7 +5272,7 @@ static int selinux_sctp_assoc_request(struct sctp_association *asoc, struct sk_buff *skb) { - struct sk_security_struct *sksec = asoc->base.sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(asoc->base.sk); u32 conn_sid; int err; @@ -5289,7 +5305,7 @@ static int selinux_sctp_assoc_established(struct sctp_association *asoc, struct sk_buff *skb) { - struct sk_security_struct *sksec = asoc->base.sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(asoc->base.sk); if (!selinux_policycap_extsockclass()) return 0; @@ -5388,8 +5404,8 @@ static void selinux_sctp_sk_clone(struct sctp_association *asoc, struct sock *sk, struct sock *newsk) { - struct sk_security_struct *sksec = sk->sk_security; - struct sk_security_struct *newsksec = newsk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); + struct sk_security_struct *newsksec = selinux_sock(newsk); /* If policy does not support SECCLASS_SCTP_SOCKET then call * the non-sctp clone version. @@ -5421,7 +5437,7 @@ static int selinux_inet_conn_request(const struct sock *sk, struct sk_buff *skb, struct request_sock *req) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); int err; u16 family = req->rsk_ops->family; u32 connsid; @@ -5442,7 +5458,7 @@ static void selinux_inet_csk_clone(struct sock *newsk, const struct request_sock *req) { - struct sk_security_struct *newsksec = newsk->sk_security; + struct sk_security_struct *newsksec = selinux_sock(newsk); newsksec->sid = req->secid; newsksec->peer_sid = req->peer_secid; @@ -5459,7 +5475,7 @@ static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb) { u16 family = sk->sk_family; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); /* handle mapped IPv4 packets arriving via IPv6 sockets */ if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) @@ -5540,7 +5556,7 @@ static int selinux_tun_dev_attach(struct sock *sk, void *security) { struct tun_security_struct *tunsec = security; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); /* we don't currently perform any NetLabel based labeling here and it * isn't clear that we would want to do so anyway; while we could apply @@ -5666,7 +5682,7 @@ return NF_ACCEPT; /* standard practice, label using the parent socket */ - sksec = sk->sk_security; + sksec = selinux_sock(sk); sid = sksec->sid; } else sid = SECINITSID_KERNEL; @@ -5689,7 +5705,7 @@ sk = skb_to_full_sk(skb); if (sk == NULL) return NF_ACCEPT; - sksec = sk->sk_security; + sksec = selinux_sock(sk); ad.type = LSM_AUDIT_DATA_NET; ad.u.net = &net; @@ -5781,7 +5797,7 @@ u32 skb_sid; struct sk_security_struct *sksec; - sksec = sk->sk_security; + sksec = selinux_sock(sk); if (selinux_skb_peerlbl_sid(skb, family, &skb_sid)) return NF_DROP; /* At this point, if the returned skb peerlbl is SECSID_NULL @@ -5810,7 +5826,7 @@ } else { /* Locally generated packet, fetch the security label from the * associated socket. */ - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); peer_sid = sksec->sid; secmark_perm = PACKET__SEND; } @@ -5856,7 +5872,7 @@ unsigned int data_len = skb->len; unsigned char *data = skb->data; struct nlmsghdr *nlh; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); u16 sclass = sksec->sclass; u32 perm; @@ -6313,6 +6329,24 @@ return error; } +static int selinux_task_prctl(int option, unsigned long arg2, + unsigned long arg3, unsigned long arg4, + unsigned long arg5) +{ + u32 mysid = current_sid(); + + if (option != PR_LSM_ATTR_SET) + return -ENOSYS; + + /* + * For setting interface_lsm, we only perform a permission check; + * the actual update to the interface_lsm value is handled by the + * LSM framework. + */ + return avc_has_perm(mysid, mysid, SECCLASS_PROCESS2, + PROCESS2__SETINTERFACE_LSM, NULL); +} + static int selinux_setprocattr(const char *name, void *value, size_t size) { struct task_security_struct *tsec; @@ -6324,6 +6358,7 @@ /* * Basic control over ability to set these attributes at all. */ + if (!strcmp(name, "exec")) error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS, PROCESS__SETEXEC, NULL); @@ -6814,6 +6849,7 @@ .lbs_inode = sizeof(struct inode_security_struct), .lbs_ipc = sizeof(struct ipc_security_struct), .lbs_msg_msg = sizeof(struct msg_security_struct), + .lbs_sock = sizeof(struct sk_security_struct), .lbs_superblock = sizeof(struct superblock_security_struct), }; @@ -6929,6 +6965,14 @@ } #endif /* CONFIG_IO_URING */ +struct lsm_id selinux_lsmid __ro_after_init = { + .lsm = "selinux", + .id = LSM_ID_SELINUX, + .features = LSM_ATTR_CURRENT | LSM_ATTR_EXEC | LSM_ATTR_FSCREATE | + LSM_ATTR_KEYCREATE | LSM_ATTR_PREV | LSM_ATTR_SOCKCREATE, + .slot = LSMBLOB_NEEDED, +}; + /* * IMPORTANT NOTE: When adding new hooks, please be careful to keep this order: * 1. any hooks that don't belong to (2.) or (3.) below, @@ -6952,6 +6996,7 @@ LSM_HOOK_INIT(ptrace_access_check, selinux_ptrace_access_check), LSM_HOOK_INIT(ptrace_traceme, selinux_ptrace_traceme), + LSM_HOOK_INIT(task_prctl, selinux_task_prctl), LSM_HOOK_INIT(capget, selinux_capget), LSM_HOOK_INIT(capset, selinux_capset), LSM_HOOK_INIT(capable, selinux_capable), @@ -7182,6 +7227,7 @@ /* * PUT "CLONING" (ACCESSING + ALLOCATING) HOOKS HERE */ + LSM_HOOK_INIT(fs_context_submount, selinux_fs_context_submount), LSM_HOOK_INIT(fs_context_dup, selinux_fs_context_dup), LSM_HOOK_INIT(fs_context_parse_param, selinux_fs_context_parse_param), LSM_HOOK_INIT(sb_eat_lsm_opts, selinux_sb_eat_lsm_opts), @@ -7250,7 +7296,8 @@ hashtab_cache_init(); - security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), "selinux"); + security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), + &selinux_lsmid); if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET)) panic("SELinux: Unable to register AVC netcache callback\n"); --- linux-azure-6.5.0.orig/security/selinux/include/classmap.h +++ linux-azure-6.5.0/security/selinux/include/classmap.h @@ -53,7 +53,8 @@ "execmem", "execstack", "execheap", "setkeycreate", "setsockcreate", "getrlimit", NULL } }, { "process2", - { "nnp_transition", "nosuid_transition", NULL } }, + { "nnp_transition", "nosuid_transition", "setinterface_lsm", + NULL } }, { "system", { "ipc_info", "syslog_read", "syslog_mod", "syslog_console", "module_request", "module_load", NULL } }, --- linux-azure-6.5.0.orig/security/selinux/include/objsec.h +++ linux-azure-6.5.0/security/selinux/include/objsec.h @@ -194,4 +194,9 @@ return superblock->s_security + selinux_blob_sizes.lbs_superblock; } +static inline struct sk_security_struct *selinux_sock(const struct sock *sock) +{ + return sock->sk_security + selinux_blob_sizes.lbs_sock; +} + #endif /* _SELINUX_OBJSEC_H_ */ --- linux-azure-6.5.0.orig/security/selinux/include/security.h +++ linux-azure-6.5.0/security/selinux/include/security.h @@ -76,6 +76,7 @@ struct netlbl_lsm_secattr; extern int selinux_enabled_boot; +extern struct lsm_id selinux_lsmid; /* * type_datum properties --- linux-azure-6.5.0.orig/security/selinux/netlabel.c +++ linux-azure-6.5.0/security/selinux/netlabel.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -68,7 +69,7 @@ static struct netlbl_lsm_secattr *selinux_netlbl_sock_genattr(struct sock *sk) { int rc; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct netlbl_lsm_secattr *secattr; if (sksec->nlbl_secattr != NULL) @@ -100,14 +101,14 @@ const struct sock *sk, u32 sid) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct netlbl_lsm_secattr *secattr = sksec->nlbl_secattr; if (secattr == NULL) return NULL; if ((secattr->flags & NETLBL_SECATTR_SECID) && - (secattr->attr.secid == sid)) + (secattr->attr.lsmblob.secid[selinux_lsmid.slot] == sid)) return secattr; return NULL; @@ -239,7 +240,7 @@ * being labeled by it's parent socket, if it is just exit */ sk = skb_to_full_sk(skb); if (sk != NULL) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); if (sksec->nlbl_state != NLBL_REQSKB) return 0; @@ -276,7 +277,7 @@ { int rc; struct netlbl_lsm_secattr secattr; - struct sk_security_struct *sksec = asoc->base.sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(asoc->base.sk); struct sockaddr_in addr4; struct sockaddr_in6 addr6; @@ -355,7 +356,7 @@ */ void selinux_netlbl_inet_csk_clone(struct sock *sk, u16 family) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); if (family == PF_INET) sksec->nlbl_state = NLBL_LABELED; @@ -373,8 +374,8 @@ */ void selinux_netlbl_sctp_sk_clone(struct sock *sk, struct sock *newsk) { - struct sk_security_struct *sksec = sk->sk_security; - struct sk_security_struct *newsksec = newsk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); + struct sk_security_struct *newsksec = selinux_sock(newsk); newsksec->nlbl_state = sksec->nlbl_state; } @@ -392,7 +393,7 @@ int selinux_netlbl_socket_post_create(struct sock *sk, u16 family) { int rc; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct netlbl_lsm_secattr *secattr; if (family != PF_INET && family != PF_INET6) @@ -506,7 +507,7 @@ { int rc = 0; struct sock *sk = sock->sk; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct netlbl_lsm_secattr secattr; if (selinux_netlbl_option(level, optname) && @@ -544,7 +545,7 @@ struct sockaddr *addr) { int rc; - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); struct netlbl_lsm_secattr *secattr; /* connected sockets are allowed to disconnect when the address family @@ -583,7 +584,7 @@ int selinux_netlbl_socket_connect_locked(struct sock *sk, struct sockaddr *addr) { - struct sk_security_struct *sksec = sk->sk_security; + struct sk_security_struct *sksec = selinux_sock(sk); if (sksec->nlbl_state != NLBL_REQSKB && sksec->nlbl_state != NLBL_CONNLABELED) --- linux-azure-6.5.0.orig/security/selinux/ss/services.c +++ linux-azure-6.5.0/security/selinux/ss/services.c @@ -3827,7 +3827,7 @@ if (secattr->flags & NETLBL_SECATTR_CACHE) *sid = *(u32 *)secattr->cache->data; else if (secattr->flags & NETLBL_SECATTR_SECID) - *sid = secattr->attr.secid; + *sid = secattr->attr.lsmblob.secid[selinux_lsmid.slot]; else if (secattr->flags & NETLBL_SECATTR_MLS_LVL) { rc = -EIDRM; ctx = sidtab_search(sidtab, SECINITSID_NETMSG); @@ -3903,7 +3903,7 @@ if (secattr->domain == NULL) goto out; - secattr->attr.secid = sid; + secattr->attr.lsmblob.secid[selinux_lsmid.slot] = sid; secattr->flags |= NETLBL_SECATTR_DOMAIN_CPY | NETLBL_SECATTR_SECID; mls_export_netlbl_lvl(policydb, ctx, secattr); rc = mls_export_netlbl_cat(policydb, ctx, secattr); --- linux-azure-6.5.0.orig/security/smack/smack.h +++ linux-azure-6.5.0/security/smack/smack.h @@ -295,6 +295,7 @@ * Shared data. */ extern int smack_enabled __initdata; +extern struct lsm_id smack_lsmid; extern int smack_cipso_direct; extern int smack_cipso_mapped; extern struct smack_known *smack_net_ambient; @@ -355,6 +356,11 @@ return superblock->s_security + smack_blob_sizes.lbs_superblock; } +static inline struct socket_smack *smack_sock(const struct sock *sock) +{ + return sock->sk_security + smack_blob_sizes.lbs_sock; +} + /* * Is the directory transmuting? */ --- linux-azure-6.5.0.orig/security/smack/smack_access.c +++ linux-azure-6.5.0/security/smack/smack_access.c @@ -521,7 +521,7 @@ { int slen; - skp->smk_netlabel.attr.secid = skp->smk_secid; + skp->smk_netlabel.attr.lsmblob.secid[smack_lsmid.slot] = skp->smk_secid; skp->smk_netlabel.domain = skp->smk_known; skp->smk_netlabel.cache = netlbl_secattr_cache_alloc(GFP_ATOMIC); if (skp->smk_netlabel.cache != NULL) { --- linux-azure-6.5.0.orig/security/smack/smack_lsm.c +++ linux-azure-6.5.0/security/smack/smack_lsm.c @@ -43,6 +43,7 @@ #include #include #include +#include #include "smack.h" #define TRANS_TRUE "TRUE" @@ -615,6 +616,56 @@ } /** + * smack_fs_context_submount - Initialise security data for a filesystem context + * @fc: The filesystem context. + * @reference: reference superblock + * + * Returns 0 on success or -ENOMEM on error. + */ +static int smack_fs_context_submount(struct fs_context *fc, + struct super_block *reference) +{ + struct superblock_smack *sbsp; + struct smack_mnt_opts *ctx; + struct inode_smack *isp; + + ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + fc->security = ctx; + + sbsp = smack_superblock(reference); + isp = smack_inode(reference->s_root->d_inode); + + if (sbsp->smk_default) { + ctx->fsdefault = kstrdup(sbsp->smk_default->smk_known, GFP_KERNEL); + if (!ctx->fsdefault) + return -ENOMEM; + } + + if (sbsp->smk_floor) { + ctx->fsfloor = kstrdup(sbsp->smk_floor->smk_known, GFP_KERNEL); + if (!ctx->fsfloor) + return -ENOMEM; + } + + if (sbsp->smk_hat) { + ctx->fshat = kstrdup(sbsp->smk_hat->smk_known, GFP_KERNEL); + if (!ctx->fshat) + return -ENOMEM; + } + + if (isp->smk_flags & SMK_INODE_TRANSMUTE) { + if (sbsp->smk_root) { + ctx->fstransmute = kstrdup(sbsp->smk_root->smk_known, GFP_KERNEL); + if (!ctx->fstransmute) + return -ENOMEM; + } + } + return 0; +} + +/** * smack_fs_context_dup - Duplicate the security data on fs_context duplication * @fc: The new filesystem context. * @src_fc: The source filesystem context being duplicated. @@ -1502,7 +1553,7 @@ if (sock == NULL || sock->sk == NULL) return -EOPNOTSUPP; - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); if (strcmp(name, XATTR_SMACK_IPIN) == 0) isp = ssp->smk_in; @@ -1890,7 +1941,7 @@ if (inode->i_sb->s_magic == SOCKFS_MAGIC) { sock = SOCKET_I(inode); - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); tsp = smack_cred(current_cred()); /* * If the receiving process can't write to the @@ -2310,11 +2361,7 @@ static int smack_sk_alloc_security(struct sock *sk, int family, gfp_t gfp_flags) { struct smack_known *skp = smk_of_current(); - struct socket_smack *ssp; - - ssp = kzalloc(sizeof(struct socket_smack), gfp_flags); - if (ssp == NULL) - return -ENOMEM; + struct socket_smack *ssp = smack_sock(sk); /* * Sockets created by kernel threads receive web label. @@ -2328,11 +2375,10 @@ } ssp->smk_packet = NULL; - sk->sk_security = ssp; - return 0; } +#ifdef SMACK_IPV6_PORT_LABELING /** * smack_sk_free_security - Free a socket blob * @sk: the socket @@ -2341,7 +2387,6 @@ */ static void smack_sk_free_security(struct sock *sk) { -#ifdef SMACK_IPV6_PORT_LABELING struct smk_port_label *spp; if (sk->sk_family == PF_INET6) { @@ -2354,9 +2399,8 @@ } rcu_read_unlock(); } -#endif - kfree(sk->sk_security); } +#endif /** * smack_sk_clone_security - Copy security context @@ -2484,7 +2528,7 @@ */ static int smack_netlbl_add(struct sock *sk) { - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct smack_known *skp = ssp->smk_out; int rc; @@ -2516,7 +2560,7 @@ */ static void smack_netlbl_delete(struct sock *sk) { - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); /* * Take the label off the socket if one is set. @@ -2548,7 +2592,7 @@ struct smack_known *skp; int rc = 0; struct smack_known *hkp; - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct smk_audit_info ad; rcu_read_lock(); @@ -2621,7 +2665,7 @@ { struct sock *sk = sock->sk; struct sockaddr_in6 *addr6; - struct socket_smack *ssp = sock->sk->sk_security; + struct socket_smack *ssp = smack_sock(sock->sk); struct smk_port_label *spp; unsigned short port = 0; @@ -2709,7 +2753,7 @@ int act) { struct smk_port_label *spp; - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct smack_known *skp = NULL; unsigned short port; struct smack_known *object; @@ -2803,7 +2847,7 @@ if (sock == NULL || sock->sk == NULL) return -EOPNOTSUPP; - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); if (strcmp(name, XATTR_SMACK_IPIN) == 0) ssp->smk_in = skp; @@ -2851,7 +2895,7 @@ * Sockets created by kernel threads receive web label. */ if (unlikely(current->flags & PF_KTHREAD)) { - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); ssp->smk_in = &smack_known_web; ssp->smk_out = &smack_known_web; } @@ -2876,8 +2920,8 @@ static int smack_socket_socketpair(struct socket *socka, struct socket *sockb) { - struct socket_smack *asp = socka->sk->sk_security; - struct socket_smack *bsp = sockb->sk->sk_security; + struct socket_smack *asp = smack_sock(socka->sk); + struct socket_smack *bsp = smack_sock(sockb->sk); asp->smk_packet = bsp->smk_out; bsp->smk_packet = asp->smk_out; @@ -2940,7 +2984,7 @@ if (__is_defined(SMACK_IPV6_SECMARK_LABELING)) rsp = smack_ipv6host_label(sip); if (rsp != NULL) { - struct socket_smack *ssp = sock->sk->sk_security; + struct socket_smack *ssp = smack_sock(sock->sk); rc = smk_ipv6_check(ssp->smk_out, rsp, sip, SMK_CONNECTING); @@ -3671,9 +3715,9 @@ { struct smack_known *skp; struct smack_known *okp; - struct socket_smack *ssp = sock->sk_security; - struct socket_smack *osp = other->sk_security; - struct socket_smack *nsp = newsk->sk_security; + struct socket_smack *ssp = smack_sock(sock); + struct socket_smack *osp = smack_sock(other); + struct socket_smack *nsp = smack_sock(newsk); struct smk_audit_info ad; int rc = 0; #ifdef CONFIG_AUDIT @@ -3719,8 +3763,8 @@ */ static int smack_unix_may_send(struct socket *sock, struct socket *other) { - struct socket_smack *ssp = sock->sk->sk_security; - struct socket_smack *osp = other->sk->sk_security; + struct socket_smack *ssp = smack_sock(sock->sk); + struct socket_smack *osp = smack_sock(other->sk); struct smk_audit_info ad; int rc; @@ -3757,7 +3801,7 @@ struct sockaddr_in6 *sap = (struct sockaddr_in6 *) msg->msg_name; #endif #ifdef SMACK_IPV6_SECMARK_LABELING - struct socket_smack *ssp = sock->sk->sk_security; + struct socket_smack *ssp = smack_sock(sock->sk); struct smack_known *rsp; #endif int rc = 0; @@ -3816,11 +3860,12 @@ if ((sap->flags & NETLBL_SECATTR_CACHE) != 0) return (struct smack_known *)sap->cache->data; + /* + * Looks like a fallback, which gives us a secid. + */ if ((sap->flags & NETLBL_SECATTR_SECID) != 0) - /* - * Looks like a fallback, which gives us a secid. - */ - return smack_from_secid(sap->attr.secid); + return smack_from_secid( + sap->attr.lsmblob.secid[smack_lsmid.slot]); if ((sap->flags & NETLBL_SECATTR_MLS_LVL) != 0) { /* @@ -3969,7 +4014,7 @@ netlbl_secattr_init(&secattr); if (sk) - ssp = sk->sk_security; + ssp = smack_sock(sk); if (netlbl_skbuff_getattr(skb, family, &secattr) == 0) { skp = smack_from_secattr(&secattr, ssp); @@ -3991,7 +4036,7 @@ */ static int smack_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) { - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct smack_known *skp = NULL; int rc = 0; struct smk_audit_info ad; @@ -4095,7 +4140,7 @@ u32 slen = 1; int rc = 0; - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); if (ssp->smk_packet != NULL) { rcp = ssp->smk_packet->smk_known; slen = strlen(rcp) + 1; @@ -4145,7 +4190,7 @@ switch (family) { case PF_UNIX: - ssp = sock->sk->sk_security; + ssp = smack_sock(sock->sk); s = ssp->smk_out->smk_secid; break; case PF_INET: @@ -4194,7 +4239,7 @@ (sk->sk_family != PF_INET && sk->sk_family != PF_INET6)) return; - ssp = sk->sk_security; + ssp = smack_sock(sk); ssp->smk_in = skp; ssp->smk_out = skp; /* cssp->smk_packet is already set in smack_inet_csk_clone() */ @@ -4214,7 +4259,7 @@ { u16 family = sk->sk_family; struct smack_known *skp; - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct sockaddr_in addr; struct iphdr *hdr; struct smack_known *hskp; @@ -4300,7 +4345,7 @@ static void smack_inet_csk_clone(struct sock *sk, const struct request_sock *req) { - struct socket_smack *ssp = sk->sk_security; + struct socket_smack *ssp = smack_sock(sk); struct smack_known *skp; if (req->peer_secid != 0) { @@ -4868,14 +4913,23 @@ .lbs_inode = sizeof(struct inode_smack), .lbs_ipc = sizeof(struct smack_known *), .lbs_msg_msg = sizeof(struct smack_known *), + .lbs_sock = sizeof(struct socket_smack), .lbs_superblock = sizeof(struct superblock_smack), }; +struct lsm_id smack_lsmid __ro_after_init = { + .lsm = "smack", + .id = LSM_ID_SMACK, + .features = LSM_ATTR_CURRENT, + .slot = LSMBLOB_NEEDED, +}; + static struct security_hook_list smack_hooks[] __ro_after_init = { LSM_HOOK_INIT(ptrace_access_check, smack_ptrace_access_check), LSM_HOOK_INIT(ptrace_traceme, smack_ptrace_traceme), LSM_HOOK_INIT(syslog, smack_syslog), + LSM_HOOK_INIT(fs_context_submount, smack_fs_context_submount), LSM_HOOK_INIT(fs_context_dup, smack_fs_context_dup), LSM_HOOK_INIT(fs_context_parse_param, smack_fs_context_parse_param), @@ -4981,7 +5035,9 @@ LSM_HOOK_INIT(socket_getpeersec_stream, smack_socket_getpeersec_stream), LSM_HOOK_INIT(socket_getpeersec_dgram, smack_socket_getpeersec_dgram), LSM_HOOK_INIT(sk_alloc_security, smack_sk_alloc_security), +#ifdef SMACK_IPV6_PORT_LABELING LSM_HOOK_INIT(sk_free_security, smack_sk_free_security), +#endif LSM_HOOK_INIT(sk_clone_security, smack_sk_clone_security), LSM_HOOK_INIT(sock_graft, smack_sock_graft), LSM_HOOK_INIT(inet_conn_request, smack_inet_conn_request), @@ -5077,7 +5133,7 @@ /* * Register with LSM */ - security_add_hooks(smack_hooks, ARRAY_SIZE(smack_hooks), "smack"); + security_add_hooks(smack_hooks, ARRAY_SIZE(smack_hooks), &smack_lsmid); smack_enabled = 1; pr_info("Smack: Initializing.\n"); --- linux-azure-6.5.0.orig/security/smack/smack_netfilter.c +++ linux-azure-6.5.0/security/smack/smack_netfilter.c @@ -26,8 +26,8 @@ struct socket_smack *ssp; struct smack_known *skp; - if (sk && sk->sk_security) { - ssp = sk->sk_security; + if (sk) { + ssp = smack_sock(sk); skp = ssp->smk_out; skb->secmark = skp->smk_secid; } --- linux-azure-6.5.0.orig/security/smack/smackfs.c +++ linux-azure-6.5.0/security/smack/smackfs.c @@ -186,7 +186,7 @@ nap->loginuid = audit_get_loginuid(current); nap->sessionid = audit_get_sessionid(current); - nap->secid = skp->smk_secid; + nap->lsmblob.secid[smack_lsmid.slot] = skp->smk_secid; } /* @@ -896,7 +896,7 @@ } ret = sscanf(rule, "%d", &catlen); - if (ret != 1 || catlen > SMACK_CIPSO_MAXCATNUM) + if (ret != 1 || catlen < 0 || catlen > SMACK_CIPSO_MAXCATNUM) goto out; if (format == SMK_FIXED24_FMT && @@ -1155,6 +1155,7 @@ static ssize_t smk_write_net4addr(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { + struct lsmblob lsmblob; struct smk_net4addr *snp; struct sockaddr_in newname; char *smack; @@ -1285,10 +1286,13 @@ * this host so that incoming packets get labeled. * but only if we didn't get the special CIPSO option */ - if (rc == 0 && skp != NULL) + if (rc == 0 && skp != NULL) { + lsmblob_init(&lsmblob, 0); + lsmblob.secid[smack_lsmid.slot] = snp->smk_label->smk_secid; rc = netlbl_cfg_unlbl_static_add(&init_net, NULL, - &snp->smk_host, &snp->smk_mask, PF_INET, - snp->smk_label->smk_secid, &audit_info); + &snp->smk_host, &snp->smk_mask, PF_INET, &lsmblob, + &audit_info); + } if (rc == 0) rc = count; --- linux-azure-6.5.0.orig/security/tomoyo/tomoyo.c +++ linux-azure-6.5.0/security/tomoyo/tomoyo.c @@ -6,6 +6,7 @@ */ #include +#include #include "common.h" /** @@ -542,6 +543,12 @@ } } +static struct lsm_id tomoyo_lsmid __ro_after_init = { + .lsm = "tomoyo", + .id = LSM_ID_TOMOYO, + .slot = LSMBLOB_NOT_NEEDED, +}; + /* * tomoyo_security_ops is a "struct security_operations" which is used for * registering TOMOYO. @@ -595,7 +602,8 @@ struct tomoyo_task *s = tomoyo_task(current); /* register ourselves with the security framework */ - security_add_hooks(tomoyo_hooks, ARRAY_SIZE(tomoyo_hooks), "tomoyo"); + security_add_hooks(tomoyo_hooks, ARRAY_SIZE(tomoyo_hooks), + &tomoyo_lsmid); pr_info("TOMOYO Linux initialized\n"); s->domain_info = &tomoyo_kernel_domain; atomic_inc(&tomoyo_kernel_domain.users); --- linux-azure-6.5.0.orig/security/yama/yama_lsm.c +++ linux-azure-6.5.0/security/yama/yama_lsm.c @@ -18,6 +18,7 @@ #include #include #include +#include #define YAMA_SCOPE_DISABLED 0 #define YAMA_SCOPE_RELATIONAL 1 @@ -421,6 +422,12 @@ return rc; } +static struct lsm_id yama_lsmid __ro_after_init = { + .lsm = "yama", + .id = LSM_ID_YAMA, + .slot = LSMBLOB_NOT_NEEDED, +}; + static struct security_hook_list yama_hooks[] __ro_after_init = { LSM_HOOK_INIT(ptrace_access_check, yama_ptrace_access_check), LSM_HOOK_INIT(ptrace_traceme, yama_ptrace_traceme), @@ -471,7 +478,7 @@ static int __init yama_init(void) { pr_info("Yama: becoming mindful.\n"); - security_add_hooks(yama_hooks, ARRAY_SIZE(yama_hooks), "yama"); + security_add_hooks(yama_hooks, ARRAY_SIZE(yama_hooks), &yama_lsmid); yama_init_sysctl(); return 0; } --- linux-azure-6.5.0.orig/snapcraft.yaml +++ linux-azure-6.5.0/snapcraft.yaml @@ -0,0 +1,36 @@ +name: pc-kernel +version: null +version-script: | + . debian/debian.env + dpkg-parsechangelog -l $DEBIAN/changelog -S version +summary: The Ubuntu generic Linux kernel +description: This Ubuntu generic Linux kernel +grade: stable +confinement: strict +type: kernel + +parts: + kernel: + plugin: kernel + source: . + source-type: git + kconfigflavour: generic + kconfigs: + - CONFIG_DEBUG_INFO=n + override-build: | + cp debian/scripts/retpoline-extract-one \ + $SNAPCRAFT_PART_BUILD/scripts/ubuntu-retpoline-extract-one + snapcraftctl build + kernel-with-firmware: false + firmware: + plugin: nil + stage-packages: + - linux-firmware + organize: + lib/firmware: firmware + prime: + - -usr + - -lib + build-packages: + - cpio + - libssl-dev --- linux-azure-6.5.0.orig/sound/Kconfig +++ linux-azure-6.5.0/sound/Kconfig @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only menuconfig SOUND tristate "Sound card support" - depends on HAS_IOMEM + depends on HAS_IOMEM || UML help If you have a sound card in your computer, i.e. if it can say more than an occasional beep, say Y. --- linux-azure-6.5.0.orig/sound/core/info.c +++ linux-azure-6.5.0/sound/core/info.c @@ -56,7 +56,7 @@ }; static int snd_info_version_init(void); -static void snd_info_disconnect(struct snd_info_entry *entry); +static void snd_info_clear_entries(struct snd_info_entry *entry); /* @@ -569,11 +569,16 @@ { if (!card) return; - mutex_lock(&info_mutex); + proc_remove(card->proc_root_link); - card->proc_root_link = NULL; if (card->proc_root) - snd_info_disconnect(card->proc_root); + proc_remove(card->proc_root->p); + + mutex_lock(&info_mutex); + if (card->proc_root) + snd_info_clear_entries(card->proc_root); + card->proc_root_link = NULL; + card->proc_root = NULL; mutex_unlock(&info_mutex); } @@ -745,15 +750,14 @@ } EXPORT_SYMBOL(snd_info_create_card_entry); -static void snd_info_disconnect(struct snd_info_entry *entry) +static void snd_info_clear_entries(struct snd_info_entry *entry) { struct snd_info_entry *p; if (!entry->p) return; list_for_each_entry(p, &entry->children, list) - snd_info_disconnect(p); - proc_remove(entry->p); + snd_info_clear_entries(p); entry->p = NULL; } @@ -770,8 +774,9 @@ if (!entry) return; if (entry->p) { + proc_remove(entry->p); mutex_lock(&info_mutex); - snd_info_disconnect(entry); + snd_info_clear_entries(entry); mutex_unlock(&info_mutex); } --- linux-azure-6.5.0.orig/sound/core/pcm.c +++ linux-azure-6.5.0/sound/core/pcm.c @@ -253,6 +253,7 @@ STATE(DRAINING), STATE(PAUSED), STATE(SUSPENDED), + STATE(DISCONNECTED), }; static const char * const snd_pcm_access_names[] = { --- linux-azure-6.5.0.orig/sound/core/pcm_compat.c +++ linux-azure-6.5.0/sound/core/pcm_compat.c @@ -253,10 +253,14 @@ goto error; } - if (refine) + if (refine) { err = snd_pcm_hw_refine(substream, data); - else + if (err < 0) + goto error; + err = fixup_unreferenced_params(substream, data); + } else { err = snd_pcm_hw_params(substream, data); + } if (err < 0) goto error; if (copy_to_user(data32, data, sizeof(*data32)) || --- linux-azure-6.5.0.orig/sound/core/rawmidi.c +++ linux-azure-6.5.0/sound/core/rawmidi.c @@ -1770,7 +1770,7 @@ if (IS_ENABLED(CONFIG_SND_UMP)) snd_iprintf(buffer, "Type: %s\n", rawmidi_is_ump(rmidi) ? "UMP" : "Legacy"); - if (rmidi->ops->proc_read) + if (rmidi->ops && rmidi->ops->proc_read) rmidi->ops->proc_read(entry, buffer); mutex_lock(&rmidi->open_mutex); if (rmidi->info_flags & SNDRV_RAWMIDI_INFO_OUTPUT) { --- linux-azure-6.5.0.orig/sound/core/seq/seq_memory.c +++ linux-azure-6.5.0/sound/core/seq/seq_memory.c @@ -187,8 +187,13 @@ err = expand_var_event(event, 0, len, buf, in_kernel); if (err < 0) return err; - if (len != newlen) - memset(buf + len, 0, newlen - len); + if (len != newlen) { + if (in_kernel) + memset(buf + len, 0, newlen - len); + else if (clear_user((__force void __user *)buf + len, + newlen - len)) + return -EFAULT; + } return newlen; } EXPORT_SYMBOL(snd_seq_expand_var_event); --- linux-azure-6.5.0.orig/sound/core/seq/seq_ump_client.c +++ linux-azure-6.5.0/sound/core/seq/seq_ump_client.c @@ -207,7 +207,7 @@ SNDRV_SEQ_PORT_TYPE_PORT; port->midi_channels = 16; if (*group->name) - snprintf(port->name, sizeof(port->name), "Group %d (%s)", + snprintf(port->name, sizeof(port->name), "Group %d (%.53s)", group->group + 1, group->name); else sprintf(port->name, "Group %d", group->group + 1); @@ -416,6 +416,25 @@ snd_seq_kernel_client_put(cptr); } +/* set up client's group_filter bitmap */ +static void setup_client_group_filter(struct seq_ump_client *client) +{ + struct snd_seq_client *cptr; + unsigned int filter; + int p; + + cptr = snd_seq_kernel_client_get(client->seq_client); + if (!cptr) + return; + filter = ~(1U << 0); /* always allow groupless messages */ + for (p = 0; p < SNDRV_UMP_MAX_GROUPS; p++) { + if (client->groups[p].active) + filter &= ~(1U << (p + 1)); + } + cptr->group_filter = filter; + snd_seq_kernel_client_put(cptr); +} + /* UMP group change notification */ static void handle_group_notify(struct work_struct *work) { @@ -424,6 +443,7 @@ update_group_attrs(client); update_port_infos(client); + setup_client_group_filter(client); } /* UMP FB change notification */ @@ -492,6 +512,8 @@ goto error; } + setup_client_group_filter(client); + err = create_ump_endpoint_port(client); if (err < 0) goto error; --- linux-azure-6.5.0.orig/sound/core/seq/seq_ump_convert.c +++ linux-azure-6.5.0/sound/core/seq/seq_ump_convert.c @@ -1197,6 +1197,8 @@ struct snd_seq_event *event, int atomic, int hop) { + if (dest->group_filter & (1U << dest_port->ump_group)) + return 0; /* group filtered - skip the event */ if (event->type == SNDRV_SEQ_EVENT_SYSEX) return cvt_sysex_to_ump(dest, dest_port, event, atomic, hop); else if (snd_seq_client_is_midi2(dest)) --- linux-azure-6.5.0.orig/sound/core/ump.c +++ linux-azure-6.5.0/sound/core/ump.c @@ -984,7 +984,7 @@ { struct snd_ump_endpoint *ump = substream->rmidi->private_data; int dir = substream->stream; - int group = substream->number; + int group = ump->legacy_mapping[substream->number]; int err; mutex_lock(&ump->open_mutex); @@ -1016,7 +1016,7 @@ { struct snd_ump_endpoint *ump = substream->rmidi->private_data; int dir = substream->stream; - int group = substream->number; + int group = ump->legacy_mapping[substream->number]; mutex_lock(&ump->open_mutex); spin_lock_irq(&ump->legacy_locks[dir]); @@ -1123,21 +1123,62 @@ spin_unlock_irqrestore(&ump->legacy_locks[dir], flags); } +/* Fill ump->legacy_mapping[] for groups to be used for legacy rawmidi */ +static int fill_legacy_mapping(struct snd_ump_endpoint *ump) +{ + struct snd_ump_block *fb; + unsigned int group_maps = 0; + int i, num; + + if (ump->info.flags & SNDRV_UMP_EP_INFO_STATIC_BLOCKS) { + list_for_each_entry(fb, &ump->block_list, list) { + for (i = 0; i < fb->info.num_groups; i++) + group_maps |= 1U << (fb->info.first_group + i); + } + if (!group_maps) + ump_info(ump, "No UMP Group is found in FB\n"); + } + + /* use all groups for non-static case */ + if (!group_maps) + group_maps = (1U << SNDRV_UMP_MAX_GROUPS) - 1; + + num = 0; + for (i = 0; i < SNDRV_UMP_MAX_GROUPS; i++) + if (group_maps & (1U << i)) + ump->legacy_mapping[num++] = i; + + return num; +} + +static void fill_substream_names(struct snd_ump_endpoint *ump, + struct snd_rawmidi *rmidi, int dir) +{ + struct snd_rawmidi_substream *s; + + list_for_each_entry(s, &rmidi->streams[dir].substreams, list) + snprintf(s->name, sizeof(s->name), "Group %d (%.16s)", + ump->legacy_mapping[s->number] + 1, ump->info.name); +} + int snd_ump_attach_legacy_rawmidi(struct snd_ump_endpoint *ump, char *id, int device) { struct snd_rawmidi *rmidi; bool input, output; - int err; + int err, num; - ump->out_cvts = kcalloc(16, sizeof(*ump->out_cvts), GFP_KERNEL); + ump->out_cvts = kcalloc(SNDRV_UMP_MAX_GROUPS, + sizeof(*ump->out_cvts), GFP_KERNEL); if (!ump->out_cvts) return -ENOMEM; + num = fill_legacy_mapping(ump); + input = ump->core.info_flags & SNDRV_RAWMIDI_INFO_INPUT; output = ump->core.info_flags & SNDRV_RAWMIDI_INFO_OUTPUT; err = snd_rawmidi_new(ump->core.card, id, device, - output ? 16 : 0, input ? 16 : 0, + output ? num : 0, input ? num : 0, &rmidi); if (err < 0) { kfree(ump->out_cvts); @@ -1150,10 +1191,17 @@ if (output) snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, &snd_ump_legacy_output_ops); + snprintf(rmidi->name, sizeof(rmidi->name), "%.68s (MIDI 1.0)", + ump->info.name); rmidi->info_flags = ump->core.info_flags & ~SNDRV_RAWMIDI_INFO_UMP; rmidi->ops = &snd_ump_legacy_ops; rmidi->private_data = ump; ump->legacy_rmidi = rmidi; + if (input) + fill_substream_names(ump, rmidi, SNDRV_RAWMIDI_STREAM_INPUT); + if (output) + fill_substream_names(ump, rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT); + ump_dbg(ump, "Created a legacy rawmidi #%d (%s)\n", device, id); return 0; } --- linux-azure-6.5.0.orig/sound/hda/hdac_stream.c +++ linux-azure-6.5.0/sound/hda/hdac_stream.c @@ -354,8 +354,10 @@ struct hdac_stream *res = NULL; /* make a non-zero unique key for the substream */ - int key = (substream->pcm->device << 16) | (substream->number << 2) | - (substream->stream + 1); + int key = (substream->number << 2) | (substream->stream + 1); + + if (substream->pcm) + key |= (substream->pcm->device << 16); spin_lock_irq(&bus->reg_lock); list_for_each_entry(azx_dev, &bus->stream_list, list) { --- linux-azure-6.5.0.orig/sound/hda/intel-dsp-config.c +++ linux-azure-6.5.0/sound/hda/intel-dsp-config.c @@ -343,6 +343,12 @@ DMI_MATCH(DMI_SYS_VENDOR, "Google"), } }, + { + .ident = "Google firmware", + .matches = { + DMI_MATCH(DMI_BIOS_VERSION, "Google"), + } + }, {} } }, @@ -481,6 +487,14 @@ }, #endif +/* Lunar Lake */ +#if IS_ENABLED(CONFIG_SND_SOC_SOF_LUNARLAKE) + /* Lunarlake-P */ + { + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, + .device = PCI_DEVICE_ID_INTEL_HDA_LNL_P, + }, +#endif }; static const struct config_entry *snd_intel_dsp_find_config --- linux-azure-6.5.0.orig/sound/hda/intel-nhlt.c +++ linux-azure-6.5.0/sound/hda/intel-nhlt.c @@ -238,7 +238,7 @@ static struct nhlt_specific_cfg * nhlt_get_specific_cfg(struct device *dev, struct nhlt_fmt *fmt, u8 num_ch, - u32 rate, u8 vbps, u8 bps) + u32 rate, u8 vbps, u8 bps, bool ignore_vbps) { struct nhlt_fmt_cfg *cfg = fmt->fmt_config; struct wav_fmt *wfmt; @@ -255,8 +255,12 @@ dev_dbg(dev, "Endpoint format: ch=%d fmt=%d/%d rate=%d\n", wfmt->channels, _vbps, _bps, wfmt->samples_per_sec); + /* + * When looking for exact match of configuration ignore the vbps + * from NHLT table when ignore_vbps is true + */ if (wfmt->channels == num_ch && wfmt->samples_per_sec == rate && - vbps == _vbps && bps == _bps) + (ignore_vbps || vbps == _vbps) && bps == _bps) return &cfg->config; cfg = (struct nhlt_fmt_cfg *)(cfg->config.caps + cfg->config.size); @@ -289,6 +293,7 @@ { struct nhlt_specific_cfg *cfg; struct nhlt_endpoint *epnt; + bool ignore_vbps = false; struct nhlt_fmt *fmt; int i; @@ -298,7 +303,26 @@ dev_dbg(dev, "Looking for configuration:\n"); dev_dbg(dev, " vbus_id=%d link_type=%d dir=%d, dev_type=%d\n", bus_id, link_type, dir, dev_type); - dev_dbg(dev, " ch=%d fmt=%d/%d rate=%d\n", num_ch, vbps, bps, rate); + if (link_type == NHLT_LINK_DMIC && bps == 32 && (vbps == 24 || vbps == 32)) { + /* + * The DMIC hardware supports only one type of 32 bits sample + * size, which is 24 bit sampling on the MSB side and bits[1:0] + * are used for indicating the channel number. + * It has been observed that some NHLT tables have the vbps + * specified as 32 while some uses 24. + * The format these variations describe are identical, the + * hardware is configured and behaves the same way. + * Note: when the samples assumed to be vbps=32 then the 'noise' + * introduced by the lower two bits (channel number) have no + * real life implication on audio quality. + */ + dev_dbg(dev, + " ch=%d fmt=%d rate=%d (vbps is ignored for DMIC 32bit format)\n", + num_ch, bps, rate); + ignore_vbps = true; + } else { + dev_dbg(dev, " ch=%d fmt=%d/%d rate=%d\n", num_ch, vbps, bps, rate); + } dev_dbg(dev, "Endpoint count=%d\n", nhlt->endpoint_count); epnt = (struct nhlt_endpoint *)nhlt->desc; @@ -307,7 +331,8 @@ if (nhlt_check_ep_match(dev, epnt, bus_id, link_type, dir, dev_type)) { fmt = (struct nhlt_fmt *)(epnt->config.caps + epnt->config.size); - cfg = nhlt_get_specific_cfg(dev, fmt, num_ch, rate, vbps, bps); + cfg = nhlt_get_specific_cfg(dev, fmt, num_ch, rate, + vbps, bps, ignore_vbps); if (cfg) return cfg; } --- linux-azure-6.5.0.orig/sound/hda/intel-sdw-acpi.c +++ linux-azure-6.5.0/sound/hda/intel-sdw-acpi.c @@ -23,7 +23,7 @@ module_param_named(sdw_link_mask, ctrl_link_mask, int, 0444); MODULE_PARM_DESC(sdw_link_mask, "Intel link mask (one bit per link)"); -static bool is_link_enabled(struct fwnode_handle *fw_node, int i) +static bool is_link_enabled(struct fwnode_handle *fw_node, u8 idx) { struct fwnode_handle *link; char name[32]; @@ -31,7 +31,7 @@ /* Find master handle */ snprintf(name, sizeof(name), - "mipi-sdw-link-%d-subproperties", i); + "mipi-sdw-link-%hhu-subproperties", idx); link = fwnode_get_named_child_node(fw_node, name); if (!link) @@ -51,8 +51,8 @@ sdw_intel_scan_controller(struct sdw_intel_acpi_info *info) { struct acpi_device *adev = acpi_fetch_acpi_dev(info->handle); - int ret, i; - u8 count; + u8 count, i; + int ret; if (!adev) return -EINVAL; --- linux-azure-6.5.0.orig/sound/pci/ac97/ac97_codec.c +++ linux-azure-6.5.0/sound/pci/ac97/ac97_codec.c @@ -2069,10 +2069,9 @@ .dev_disconnect = snd_ac97_dev_disconnect, }; - if (!rac97) - return -EINVAL; - if (snd_BUG_ON(!bus || !template)) + if (snd_BUG_ON(!bus || !template || !rac97)) return -EINVAL; + *rac97 = NULL; if (snd_BUG_ON(template->num >= 4)) return -EINVAL; if (bus->codec[template->num]) --- linux-azure-6.5.0.orig/sound/pci/hda/Makefile +++ linux-azure-6.5.0/sound/pci/hda/Makefile @@ -28,7 +28,7 @@ snd-hda-codec-hdmi-objs := patch_hdmi.o hda_eld.o # side codecs -snd-hda-scodec-cs35l41-objs := cs35l41_hda.o +snd-hda-scodec-cs35l41-objs := cs35l41_hda.o cs35l41_hda_property.o snd-hda-scodec-cs35l41-i2c-objs := cs35l41_hda_i2c.o snd-hda-scodec-cs35l41-spi-objs := cs35l41_hda_spi.o snd-hda-cs-dsp-ctls-objs := hda_cs_dsp_ctl.o --- linux-azure-6.5.0.orig/sound/pci/hda/cs35l41_hda.c +++ linux-azure-6.5.0/sound/pci/hda/cs35l41_hda.c @@ -19,6 +19,7 @@ #include "hda_component.h" #include "cs35l41_hda.h" #include "hda_cs_dsp_ctl.h" +#include "cs35l41_hda_property.h" #define CS35L41_FIRMWARE_ROOT "cirrus/" #define CS35L41_PART "cs35l41" @@ -32,6 +33,9 @@ #define CAL_AMBIENT_DSP_CTL_NAME "CAL_AMBIENT" #define CAL_DSP_CTL_TYPE 5 #define CAL_DSP_CTL_ALG 205 +#define CS35L41_UUID "50d90cdc-3de4-4f18-b528-c7fe3b71f40d" +#define CS35L41_DSM_GET_MUTE 5 +#define CS35L41_NOTIFY_EVENT 0x91 static bool firmware_autostart = 1; module_param(firmware_autostart, bool, 0444); @@ -58,8 +62,6 @@ { CS35L41_DSP1_RX3_SRC, 0x00000018 }, // DSP1RX3 SRC = VMON { CS35L41_DSP1_RX4_SRC, 0x00000019 }, // DSP1RX4 SRC = IMON { CS35L41_DSP1_RX5_SRC, 0x00000020 }, // DSP1RX5 SRC = ERRVOL - { CS35L41_AMP_DIG_VOL_CTRL, 0x00008000 }, // AMP_HPF_PCM_EN = 1, AMP_VOL_PCM 0.0 dB - { CS35L41_AMP_GAIN_CTRL, 0x00000084 }, // AMP_GAIN_PCM 4.5 dB }; static const struct reg_sequence cs35l41_hda_config_dsp[] = { @@ -82,6 +84,14 @@ { CS35L41_DSP1_RX3_SRC, 0x00000018 }, // DSP1RX3 SRC = VMON { CS35L41_DSP1_RX4_SRC, 0x00000019 }, // DSP1RX4 SRC = IMON { CS35L41_DSP1_RX5_SRC, 0x00000029 }, // DSP1RX5 SRC = VBSTMON +}; + +static const struct reg_sequence cs35l41_hda_unmute[] = { + { CS35L41_AMP_DIG_VOL_CTRL, 0x00008000 }, // AMP_HPF_PCM_EN = 1, AMP_VOL_PCM 0.0 dB + { CS35L41_AMP_GAIN_CTRL, 0x00000084 }, // AMP_GAIN_PCM 4.5 dB +}; + +static const struct reg_sequence cs35l41_hda_unmute_dsp[] = { { CS35L41_AMP_DIG_VOL_CTRL, 0x00008000 }, // AMP_HPF_PCM_EN = 1, AMP_VOL_PCM 0.0 dB { CS35L41_AMP_GAIN_CTRL, 0x00000233 }, // AMP_GAIN_PCM = 17.5dB AMP_GAIN_PDM = 19.5dB }; @@ -178,10 +188,14 @@ cs35l41->speaker_id, "wmfw"); if (!ret) { /* try cirrus/part-dspN-fwtype-sub<-spkidN><-ampname>.bin */ - return cs35l41_request_firmware_file(cs35l41, coeff_firmware, coeff_filename, - CS35L41_FIRMWARE_ROOT, - cs35l41->acpi_subsystem_id, cs35l41->amp_name, - cs35l41->speaker_id, "bin"); + ret = cs35l41_request_firmware_file(cs35l41, coeff_firmware, coeff_filename, + CS35L41_FIRMWARE_ROOT, + cs35l41->acpi_subsystem_id, cs35l41->amp_name, + cs35l41->speaker_id, "bin"); + if (ret) + goto coeff_err; + + return 0; } /* try cirrus/part-dspN-fwtype-sub<-ampname>.wmfw */ @@ -190,10 +204,14 @@ cs35l41->amp_name, -1, "wmfw"); if (!ret) { /* try cirrus/part-dspN-fwtype-sub<-spkidN><-ampname>.bin */ - return cs35l41_request_firmware_file(cs35l41, coeff_firmware, coeff_filename, - CS35L41_FIRMWARE_ROOT, - cs35l41->acpi_subsystem_id, cs35l41->amp_name, - cs35l41->speaker_id, "bin"); + ret = cs35l41_request_firmware_file(cs35l41, coeff_firmware, coeff_filename, + CS35L41_FIRMWARE_ROOT, + cs35l41->acpi_subsystem_id, cs35l41->amp_name, + cs35l41->speaker_id, "bin"); + if (ret) + goto coeff_err; + + return 0; } /* try cirrus/part-dspN-fwtype-sub<-spkidN>.wmfw */ @@ -208,10 +226,14 @@ cs35l41->amp_name, cs35l41->speaker_id, "bin"); if (ret) /* try cirrus/part-dspN-fwtype-sub<-spkidN>.bin */ - return cs35l41_request_firmware_file(cs35l41, coeff_firmware, - coeff_filename, CS35L41_FIRMWARE_ROOT, - cs35l41->acpi_subsystem_id, NULL, - cs35l41->speaker_id, "bin"); + ret = cs35l41_request_firmware_file(cs35l41, coeff_firmware, + coeff_filename, CS35L41_FIRMWARE_ROOT, + cs35l41->acpi_subsystem_id, NULL, + cs35l41->speaker_id, "bin"); + if (ret) + goto coeff_err; + + return 0; } /* try cirrus/part-dspN-fwtype-sub.wmfw */ @@ -226,12 +248,50 @@ cs35l41->speaker_id, "bin"); if (ret) /* try cirrus/part-dspN-fwtype-sub<-spkidN>.bin */ - return cs35l41_request_firmware_file(cs35l41, coeff_firmware, - coeff_filename, CS35L41_FIRMWARE_ROOT, - cs35l41->acpi_subsystem_id, NULL, - cs35l41->speaker_id, "bin"); + ret = cs35l41_request_firmware_file(cs35l41, coeff_firmware, + coeff_filename, CS35L41_FIRMWARE_ROOT, + cs35l41->acpi_subsystem_id, NULL, + cs35l41->speaker_id, "bin"); + if (ret) + goto coeff_err; + } + + return ret; +coeff_err: + release_firmware(*wmfw_firmware); + kfree(*wmfw_filename); + return ret; +} + +static int cs35l41_fallback_firmware_file(struct cs35l41_hda *cs35l41, + const struct firmware **wmfw_firmware, + char **wmfw_filename, + const struct firmware **coeff_firmware, + char **coeff_filename) +{ + int ret; + + /* Handle fallback */ + dev_warn(cs35l41->dev, "Falling back to default firmware.\n"); + + /* fallback try cirrus/part-dspN-fwtype.wmfw */ + ret = cs35l41_request_firmware_file(cs35l41, wmfw_firmware, wmfw_filename, + CS35L41_FIRMWARE_ROOT, NULL, NULL, -1, "wmfw"); + if (ret) + goto err; + + /* fallback try cirrus/part-dspN-fwtype.bin */ + ret = cs35l41_request_firmware_file(cs35l41, coeff_firmware, coeff_filename, + CS35L41_FIRMWARE_ROOT, NULL, NULL, -1, "bin"); + if (ret) { + release_firmware(*wmfw_firmware); + kfree(*wmfw_filename); + goto err; } + return 0; +err: + dev_warn(cs35l41->dev, "Unable to find firmware and tuning\n"); return ret; } @@ -247,7 +307,6 @@ ret = cs35l41_request_firmware_files_spkid(cs35l41, wmfw_firmware, wmfw_filename, coeff_firmware, coeff_filename); goto out; - } /* try cirrus/part-dspN-fwtype-sub<-ampname>.wmfw */ @@ -260,6 +319,9 @@ CS35L41_FIRMWARE_ROOT, cs35l41->acpi_subsystem_id, cs35l41->amp_name, -1, "bin"); + if (ret) + goto coeff_err; + goto out; } @@ -279,32 +341,23 @@ CS35L41_FIRMWARE_ROOT, cs35l41->acpi_subsystem_id, NULL, -1, "bin"); + if (ret) + goto coeff_err; } out: - if (!ret) - return 0; + if (ret) + /* if all attempts at finding firmware fail, try fallback */ + goto fallback; - /* Handle fallback */ - dev_warn(cs35l41->dev, "Falling back to default firmware.\n"); + return 0; +coeff_err: release_firmware(*wmfw_firmware); kfree(*wmfw_filename); - - /* fallback try cirrus/part-dspN-fwtype.wmfw */ - ret = cs35l41_request_firmware_file(cs35l41, wmfw_firmware, wmfw_filename, - CS35L41_FIRMWARE_ROOT, NULL, NULL, -1, "wmfw"); - if (!ret) - /* fallback try cirrus/part-dspN-fwtype.bin */ - ret = cs35l41_request_firmware_file(cs35l41, coeff_firmware, coeff_filename, - CS35L41_FIRMWARE_ROOT, NULL, NULL, -1, "bin"); - - if (ret) { - release_firmware(*wmfw_firmware); - kfree(*wmfw_filename); - dev_warn(cs35l41->dev, "Unable to find firmware and tuning\n"); - } - return ret; +fallback: + return cs35l41_fallback_firmware_file(cs35l41, wmfw_firmware, wmfw_filename, + coeff_firmware, coeff_filename); } #if IS_ENABLED(CONFIG_EFI) @@ -483,73 +536,178 @@ cs35l41->irq_errors = 0; } -static void cs35l41_hda_playback_hook(struct device *dev, int action) +static void cs35l41_hda_play_start(struct device *dev) { struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); struct regmap *reg = cs35l41->regmap; - int ret = 0; - switch (action) { - case HDA_GEN_PCM_ACT_OPEN: - pm_runtime_get_sync(dev); - mutex_lock(&cs35l41->fw_mutex); - cs35l41->playback_started = true; - if (cs35l41->firmware_running) { - regmap_multi_reg_write(reg, cs35l41_hda_config_dsp, - ARRAY_SIZE(cs35l41_hda_config_dsp)); - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, - CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK, - 1 << CS35L41_VMON_EN_SHIFT | 1 << CS35L41_IMON_EN_SHIFT); - cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap, - CSPL_MBOX_CMD_RESUME); + dev_dbg(dev, "Play (Start)\n"); + + if (cs35l41->playback_started) { + dev_dbg(dev, "Playback already started."); + return; + } + + cs35l41->playback_started = true; + + if (cs35l41->firmware_running) { + regmap_multi_reg_write(reg, cs35l41_hda_config_dsp, + ARRAY_SIZE(cs35l41_hda_config_dsp)); + regmap_update_bits(reg, CS35L41_PWR_CTRL2, + CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK, + 1 << CS35L41_VMON_EN_SHIFT | 1 << CS35L41_IMON_EN_SHIFT); + cs35l41_set_cspl_mbox_cmd(cs35l41->dev, reg, CSPL_MBOX_CMD_RESUME); + } else { + regmap_multi_reg_write(reg, cs35l41_hda_config, ARRAY_SIZE(cs35l41_hda_config)); + } + regmap_update_bits(reg, CS35L41_PWR_CTRL2, CS35L41_AMP_EN_MASK, 1 << CS35L41_AMP_EN_SHIFT); + if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST) + regmap_write(reg, CS35L41_GPIO1_CTRL1, 0x00008001); + +} + +static void cs35l41_mute(struct device *dev, bool mute) +{ + struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); + struct regmap *reg = cs35l41->regmap; + + dev_dbg(dev, "Mute(%d:%d) Playback Started: %d\n", mute, cs35l41->mute_override, + cs35l41->playback_started); + + if (cs35l41->playback_started) { + if (mute || cs35l41->mute_override) { + dev_dbg(dev, "Muting\n"); + regmap_multi_reg_write(reg, cs35l41_hda_mute, ARRAY_SIZE(cs35l41_hda_mute)); } else { - regmap_multi_reg_write(reg, cs35l41_hda_config, - ARRAY_SIZE(cs35l41_hda_config)); + dev_dbg(dev, "Unmuting\n"); + if (cs35l41->firmware_running) { + regmap_multi_reg_write(reg, cs35l41_hda_unmute_dsp, + ARRAY_SIZE(cs35l41_hda_unmute_dsp)); + } else { + regmap_multi_reg_write(reg, cs35l41_hda_unmute, + ARRAY_SIZE(cs35l41_hda_unmute)); + } } - ret = regmap_update_bits(reg, CS35L41_PWR_CTRL2, - CS35L41_AMP_EN_MASK, 1 << CS35L41_AMP_EN_SHIFT); - if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST) - regmap_write(reg, CS35L41_GPIO1_CTRL1, 0x00008001); + } +} + +static void cs35l41_hda_play_done(struct device *dev) +{ + struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); + struct regmap *reg = cs35l41->regmap; + + dev_dbg(dev, "Play (Complete)\n"); + + cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 1, NULL, + cs35l41->firmware_running); + cs35l41_mute(dev, false); +} + +static void cs35l41_hda_pause_start(struct device *dev) +{ + struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); + struct regmap *reg = cs35l41->regmap; + + dev_dbg(dev, "Pause (Start)\n"); + + cs35l41_mute(dev, true); + cs35l41_global_enable(dev, reg, cs35l41->hw_cfg.bst_type, 0, NULL, + cs35l41->firmware_running); +} + +static void cs35l41_hda_pause_done(struct device *dev) +{ + struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); + struct regmap *reg = cs35l41->regmap; + + dev_dbg(dev, "Pause (Complete)\n"); + + regmap_update_bits(reg, CS35L41_PWR_CTRL2, CS35L41_AMP_EN_MASK, 0 << CS35L41_AMP_EN_SHIFT); + if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST) + regmap_write(reg, CS35L41_GPIO1_CTRL1, 0x00000001); + if (cs35l41->firmware_running) { + cs35l41_set_cspl_mbox_cmd(dev, reg, CSPL_MBOX_CMD_PAUSE); + regmap_update_bits(reg, CS35L41_PWR_CTRL2, + CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK, + 0 << CS35L41_VMON_EN_SHIFT | 0 << CS35L41_IMON_EN_SHIFT); + } + cs35l41_irq_release(cs35l41); + cs35l41->playback_started = false; +} + +static void cs35l41_hda_pre_playback_hook(struct device *dev, int action) +{ + struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); + + switch (action) { + case HDA_GEN_PCM_ACT_CLEANUP: + mutex_lock(&cs35l41->fw_mutex); + cs35l41_hda_pause_start(dev); mutex_unlock(&cs35l41->fw_mutex); break; + default: + break; + } +} +static void cs35l41_hda_playback_hook(struct device *dev, int action) +{ + struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); + + switch (action) { + case HDA_GEN_PCM_ACT_OPEN: + /* + * All amps must be resumed before we can start playing back. + * This ensures, for external boost, that all amps are in AMP_SAFE mode. + * Do this in HDA_GEN_PCM_ACT_OPEN, since this is run prior to any of the + * other actions. + */ + pm_runtime_get_sync(dev); + break; case HDA_GEN_PCM_ACT_PREPARE: mutex_lock(&cs35l41->fw_mutex); - ret = cs35l41_global_enable(reg, cs35l41->hw_cfg.bst_type, 1, NULL); + cs35l41_hda_play_start(dev); mutex_unlock(&cs35l41->fw_mutex); break; case HDA_GEN_PCM_ACT_CLEANUP: mutex_lock(&cs35l41->fw_mutex); - regmap_multi_reg_write(reg, cs35l41_hda_mute, ARRAY_SIZE(cs35l41_hda_mute)); - ret = cs35l41_global_enable(reg, cs35l41->hw_cfg.bst_type, 0, NULL); + cs35l41_hda_pause_done(dev); mutex_unlock(&cs35l41->fw_mutex); break; case HDA_GEN_PCM_ACT_CLOSE: mutex_lock(&cs35l41->fw_mutex); - ret = regmap_update_bits(reg, CS35L41_PWR_CTRL2, - CS35L41_AMP_EN_MASK, 0 << CS35L41_AMP_EN_SHIFT); - if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST) - regmap_write(reg, CS35L41_GPIO1_CTRL1, 0x00000001); - if (cs35l41->firmware_running) { - cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap, - CSPL_MBOX_CMD_PAUSE); - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, - CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK, - 0 << CS35L41_VMON_EN_SHIFT | 0 << CS35L41_IMON_EN_SHIFT); + if (!cs35l41->firmware_running && cs35l41->request_fw_load && + !cs35l41->fw_request_ongoing) { + dev_info(dev, "Requesting Firmware Load after HDA_GEN_PCM_ACT_CLOSE\n"); + cs35l41->fw_request_ongoing = true; + schedule_work(&cs35l41->fw_load_work); } - cs35l41_irq_release(cs35l41); - cs35l41->playback_started = false; mutex_unlock(&cs35l41->fw_mutex); + /* + * Playback must be finished for all amps before we start runtime suspend. + * This ensures no amps are playing back when we start putting them to sleep. + */ pm_runtime_mark_last_busy(dev); pm_runtime_put_autosuspend(dev); break; default: - dev_warn(cs35l41->dev, "Playback action not supported: %d\n", action); break; } +} - if (ret) - dev_err(cs35l41->dev, "Regmap access fail: %d\n", ret); +static void cs35l41_hda_post_playback_hook(struct device *dev, int action) +{ + struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); + + switch (action) { + case HDA_GEN_PCM_ACT_PREPARE: + mutex_lock(&cs35l41->fw_mutex); + cs35l41_hda_play_done(dev); + mutex_unlock(&cs35l41->fw_mutex); + break; + default: + break; + } } static int cs35l41_hda_channel_map(struct device *dev, unsigned int tx_num, unsigned int *tx_slot, @@ -572,21 +730,65 @@ rx_slot); } -static void cs35l41_ready_for_reset(struct cs35l41_hda *cs35l41) +int cs35l41_verify_id(struct cs35l41_hda *cs35l41, unsigned int *regid, unsigned int *reg_revid) +{ + unsigned int mtl_revid, chipid; + int ret; + + ret = regmap_read(cs35l41->regmap, CS35L41_DEVID, regid); + if (ret) { + dev_err_probe(cs35l41->dev, ret, "Get Device ID failed\n"); + return ret; + } + + ret = regmap_read(cs35l41->regmap, CS35L41_REVID, reg_revid); + if (ret) { + dev_err_probe(cs35l41->dev, ret, "Get Revision ID failed\n"); + return ret; + } + + mtl_revid = *reg_revid & CS35L41_MTLREVID_MASK; + + chipid = (mtl_revid % 2) ? CS35L41R_CHIP_ID : CS35L41_CHIP_ID; + if (*regid != chipid) { + dev_err(cs35l41->dev, "CS35L41 Device ID (%X). Expected ID %X\n", *regid, chipid); + return -ENODEV; + } + + return 0; +} + +static int cs35l41_ready_for_reset(struct cs35l41_hda *cs35l41) { mutex_lock(&cs35l41->fw_mutex); if (cs35l41->firmware_running) { + cs35l41->cs_dsp.running = false; + cs35l41->cs_dsp.booted = false; + cs35l41->firmware_running = false; + } + regcache_mark_dirty(cs35l41->regmap); + mutex_unlock(&cs35l41->fw_mutex); - regcache_cache_only(cs35l41->regmap, false); + return 0; +} - cs35l41_exit_hibernate(cs35l41->dev, cs35l41->regmap); - cs35l41_shutdown_dsp(cs35l41); - cs35l41_safe_reset(cs35l41->regmap, cs35l41->hw_cfg.bst_type); +static int cs35l41_system_suspend_prep(struct device *dev) +{ + struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); + + dev_dbg(cs35l41->dev, "System Suspend Prepare\n"); - regcache_cache_only(cs35l41->regmap, true); - regcache_mark_dirty(cs35l41->regmap); + if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST_NO_VSPK_SWITCH) { + dev_err_once(cs35l41->dev, "System Suspend not supported\n"); + return 0; /* don't block the whole system suspend */ } + + mutex_lock(&cs35l41->fw_mutex); + if (cs35l41->playback_started) + cs35l41_hda_pause_start(dev); mutex_unlock(&cs35l41->fw_mutex); + + return 0; } static int cs35l41_system_suspend(struct device *dev) @@ -601,17 +803,54 @@ return 0; /* don't block the whole system suspend */ } + mutex_lock(&cs35l41->fw_mutex); + if (cs35l41->playback_started) + cs35l41_hda_pause_done(dev); + mutex_unlock(&cs35l41->fw_mutex); + ret = pm_runtime_force_suspend(dev); - if (ret) + if (ret) { + dev_err(dev, "System Suspend Failed, unable to runtime suspend: %d\n", ret); return ret; + } /* Shutdown DSP before system suspend */ - cs35l41_ready_for_reset(cs35l41); + ret = cs35l41_ready_for_reset(cs35l41); + if (ret) + dev_err(dev, "System Suspend Failed, not ready for Reset: %d\n", ret); + + if (cs35l41->reset_gpio) { + dev_info(cs35l41->dev, "Asserting Reset\n"); + gpiod_set_value_cansleep(cs35l41->reset_gpio, 0); + usleep_range(2000, 2100); + } + + dev_dbg(cs35l41->dev, "System Suspended\n"); + + return ret; +} + +static int cs35l41_wait_boot_done(struct cs35l41_hda *cs35l41) +{ + unsigned int int_status; + int ret; + + ret = regmap_read_poll_timeout(cs35l41->regmap, CS35L41_IRQ1_STATUS4, int_status, + int_status & CS35L41_OTP_BOOT_DONE, 1000, 100000); + if (ret) { + dev_err(cs35l41->dev, "Failed waiting for OTP_BOOT_DONE\n"); + return ret; + } + + ret = regmap_read(cs35l41->regmap, CS35L41_IRQ1_STATUS3, &int_status); + if (ret || (int_status & CS35L41_OTP_BOOT_ERR)) { + dev_err(cs35l41->dev, "OTP Boot status %x error\n", + int_status & CS35L41_OTP_BOOT_ERR); + if (!ret) + ret = -EIO; + return ret; + } - /* - * Reset GPIO may be shared, so cannot reset here. - * However beyond this point, amps may be powered down. - */ return 0; } @@ -628,16 +867,33 @@ } if (cs35l41->reset_gpio) { + gpiod_set_value_cansleep(cs35l41->reset_gpio, 0); usleep_range(2000, 2100); gpiod_set_value_cansleep(cs35l41->reset_gpio, 1); } usleep_range(2000, 2100); + regcache_cache_only(cs35l41->regmap, false); + + regmap_write(cs35l41->regmap, CS35L41_SFT_RESET, CS35L41_SOFTWARE_RESET); + usleep_range(2000, 2100); + + ret = cs35l41_wait_boot_done(cs35l41); + if (ret) + return ret; + + regcache_cache_only(cs35l41->regmap, true); + ret = pm_runtime_force_resume(dev); + if (ret) { + dev_err(dev, "System Resume Failed: Unable to runtime resume: %d\n", ret); + return ret; + } mutex_lock(&cs35l41->fw_mutex); - if (!ret && cs35l41->request_fw_load && !cs35l41->fw_request_ongoing) { + + if (cs35l41->request_fw_load && !cs35l41->fw_request_ongoing) { cs35l41->fw_request_ongoing = true; schedule_work(&cs35l41->fw_load_work); } @@ -669,20 +925,6 @@ mutex_lock(&cs35l41->fw_mutex); - if (cs35l41->playback_started) { - regmap_multi_reg_write(cs35l41->regmap, cs35l41_hda_mute, - ARRAY_SIZE(cs35l41_hda_mute)); - cs35l41_global_enable(cs35l41->regmap, cs35l41->hw_cfg.bst_type, 0, NULL); - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, - CS35L41_AMP_EN_MASK, 0 << CS35L41_AMP_EN_SHIFT); - if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST) - regmap_write(cs35l41->regmap, CS35L41_GPIO1_CTRL1, 0x00000001); - regmap_update_bits(cs35l41->regmap, CS35L41_PWR_CTRL2, - CS35L41_VMON_EN_MASK | CS35L41_IMON_EN_MASK, - 0 << CS35L41_VMON_EN_SHIFT | 0 << CS35L41_IMON_EN_SHIFT); - cs35l41->playback_started = false; - } - if (cs35l41->firmware_running) { ret = cs35l41_enter_hibernate(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type); @@ -704,6 +946,7 @@ static int cs35l41_runtime_resume(struct device *dev) { struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); + unsigned int regid, reg_revid; int ret = 0; dev_dbg(cs35l41->dev, "Runtime Resume\n"); @@ -725,6 +968,10 @@ } } + ret = cs35l41_verify_id(cs35l41, ®id, ®_revid); + if (ret) + goto err; + /* Test key needs to be unlocked to allow the OTP settings to re-apply */ cs35l41_test_key_unlock(cs35l41->dev, cs35l41->regmap); ret = regcache_sync(cs35l41->regmap); @@ -737,6 +984,8 @@ if (cs35l41->hw_cfg.bst_type == CS35L41_EXT_BOOST) cs35l41_init_boost(cs35l41->dev, cs35l41->regmap, &cs35l41->hw_cfg); + dev_dbg(cs35l41->dev, "CS35L41 Resumed (%x), Revision: %02X\n", regid, reg_revid); + err: mutex_unlock(&cs35l41->fw_mutex); @@ -745,6 +994,7 @@ static int cs35l41_smart_amp(struct cs35l41_hda *cs35l41) { + unsigned int fw_status; __be32 halo_sts; int ret; @@ -778,7 +1028,29 @@ goto clean_dsp; } - cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap, CSPL_MBOX_CMD_PAUSE); + ret = regmap_read(cs35l41->regmap, CS35L41_DSP_MBOX_2, &fw_status); + if (ret < 0) { + dev_err(cs35l41->dev, + "Failed to read firmware status: %d\n", ret); + goto clean_dsp; + } + + switch (fw_status) { + case CSPL_MBOX_STS_RUNNING: + case CSPL_MBOX_STS_PAUSED: + break; + default: + dev_err(cs35l41->dev, "Firmware status is invalid: %u\n", + fw_status); + goto clean_dsp; + } + + ret = cs35l41_set_cspl_mbox_cmd(cs35l41->dev, cs35l41->regmap, CSPL_MBOX_CMD_PAUSE); + if (ret) { + dev_err(cs35l41->dev, "Error waiting for DSP to pause: %u\n", ret); + goto clean_dsp; + } + cs35l41->firmware_running = true; return 0; @@ -810,6 +1082,15 @@ return 0; } +static int cs35l41_mute_override_ctl_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct cs35l41_hda *cs35l41 = snd_kcontrol_chip(kcontrol); + + ucontrol->value.integer.value[0] = cs35l41->mute_override; + return 0; +} + static void cs35l41_fw_load_work(struct work_struct *work) { struct cs35l41_hda *cs35l41 = container_of(work, struct cs35l41_hda, fw_load_work); @@ -893,6 +1174,7 @@ { char fw_type_ctl_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; char fw_load_ctl_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; + char mute_override_ctl_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; struct snd_kcontrol_new fw_type_ctl = { .name = fw_type_ctl_name, .iface = SNDRV_CTL_ELEM_IFACE_CARD, @@ -907,12 +1189,21 @@ .get = cs35l41_fw_load_ctl_get, .put = cs35l41_fw_load_ctl_put, }; + struct snd_kcontrol_new mute_override_ctl = { + .name = mute_override_ctl_name, + .iface = SNDRV_CTL_ELEM_IFACE_CARD, + .info = snd_ctl_boolean_mono_info, + .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, + .get = cs35l41_mute_override_ctl_get, + }; int ret; scnprintf(fw_type_ctl_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN, "%s DSP1 Firmware Type", cs35l41->amp_name); scnprintf(fw_load_ctl_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN, "%s DSP1 Firmware Load", cs35l41->amp_name); + scnprintf(mute_override_ctl_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN, "%s Forced Mute Status", + cs35l41->amp_name); ret = snd_ctl_add(cs35l41->codec->card, snd_ctl_new1(&fw_type_ctl, cs35l41)); if (ret) { @@ -930,13 +1221,70 @@ dev_dbg(cs35l41->dev, "Added Control %s\n", fw_load_ctl.name); + ret = snd_ctl_add(cs35l41->codec->card, snd_ctl_new1(&mute_override_ctl, cs35l41)); + if (ret) { + dev_err(cs35l41->dev, "Failed to add KControl %s = %d\n", mute_override_ctl.name, + ret); + return ret; + } + + dev_dbg(cs35l41->dev, "Added Control %s\n", mute_override_ctl.name); + return 0; } +static bool cs35l41_dsm_supported(acpi_handle handle, unsigned int commands) +{ + guid_t guid; + + guid_parse(CS35L41_UUID, &guid); + + return acpi_check_dsm(handle, &guid, 0, BIT(commands)); +} + +static int cs35l41_get_acpi_mute_state(struct cs35l41_hda *cs35l41, acpi_handle handle) +{ + guid_t guid; + union acpi_object *ret; + int mute = -ENODEV; + + guid_parse(CS35L41_UUID, &guid); + + if (cs35l41_dsm_supported(handle, CS35L41_DSM_GET_MUTE)) { + ret = acpi_evaluate_dsm(handle, &guid, 0, CS35L41_DSM_GET_MUTE, NULL); + mute = *ret->buffer.pointer; + dev_dbg(cs35l41->dev, "CS35L41_DSM_GET_MUTE: %d\n", mute); + } + + dev_dbg(cs35l41->dev, "%s: %d\n", __func__, mute); + + return mute; +} + +static void cs35l41_acpi_device_notify(acpi_handle handle, u32 event, struct device *dev) +{ + struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); + int mute; + + if (event != CS35L41_NOTIFY_EVENT) + return; + + mute = cs35l41_get_acpi_mute_state(cs35l41, handle); + if (mute < 0) { + dev_warn(cs35l41->dev, "Unable to retrieve mute state: %d\n", mute); + return; + } + + dev_dbg(cs35l41->dev, "Requesting mute value: %d\n", mute); + cs35l41->mute_override = (mute > 0); + cs35l41_mute(cs35l41->dev, cs35l41->mute_override); +} + static int cs35l41_hda_bind(struct device *dev, struct device *master, void *master_data) { struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); struct hda_component *comps = master_data; + unsigned int sleep_flags; int ret = 0; if (!comps || cs35l41->index < 0 || cs35l41->index >= HDA_MAX_COMPONENTS) @@ -971,9 +1319,24 @@ ret = cs35l41_create_controls(cs35l41); comps->playback_hook = cs35l41_hda_playback_hook; + comps->pre_playback_hook = cs35l41_hda_pre_playback_hook; + comps->post_playback_hook = cs35l41_hda_post_playback_hook; + comps->acpi_notify = cs35l41_acpi_device_notify; + comps->adev = cs35l41->dacpi; + + comps->acpi_notifications_supported = cs35l41_dsm_supported(acpi_device_handle(comps->adev), + CS35L41_DSM_GET_MUTE); + + cs35l41->mute_override = cs35l41_get_acpi_mute_state(cs35l41, + acpi_device_handle(cs35l41->dacpi)) > 0; mutex_unlock(&cs35l41->fw_mutex); + sleep_flags = lock_system_sleep(); + if (!device_link_add(&comps->codec->core.dev, cs35l41->dev, DL_FLAG_STATELESS)) + dev_warn(dev, "Unable to create device link\n"); + unlock_system_sleep(sleep_flags); + pm_runtime_mark_last_busy(dev); pm_runtime_put_autosuspend(dev); @@ -984,9 +1347,14 @@ { struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); struct hda_component *comps = master_data; + unsigned int sleep_flags; - if (comps[cs35l41->index].dev == dev) + if (comps[cs35l41->index].dev == dev) { memset(&comps[cs35l41->index], 0, sizeof(*comps)); + sleep_flags = lock_system_sleep(); + device_link_remove(&comps->codec->core.dev, cs35l41->dev); + unlock_system_sleep(sleep_flags); + } } static const struct component_ops cs35l41_hda_comp_ops = { @@ -1156,8 +1524,7 @@ return cs35l41_hda_channel_map(cs35l41->dev, 0, NULL, 1, &hw_cfg->spk_pos); } -static int cs35l41_get_speaker_id(struct device *dev, int amp_index, - int num_amps, int fixed_gpio_id) +int cs35l41_get_speaker_id(struct device *dev, int amp_index, int num_amps, int fixed_gpio_id) { struct gpio_desc *speaker_id_desc; int speaker_id = -ENODEV; @@ -1211,49 +1578,6 @@ return speaker_id; } -/* - * Device CLSA010(0/1) doesn't have _DSD so a gpiod_get by the label reset won't work. - * And devices created by serial-multi-instantiate don't have their device struct - * pointing to the correct fwnode, so acpi_dev must be used here. - * And devm functions expect that the device requesting the resource has the correct - * fwnode. - */ -static int cs35l41_no_acpi_dsd(struct cs35l41_hda *cs35l41, struct device *physdev, int id, - const char *hid) -{ - struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg; - - /* check I2C address to assign the index */ - cs35l41->index = id == 0x40 ? 0 : 1; - cs35l41->channel_index = 0; - cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH); - cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2); - hw_cfg->spk_pos = cs35l41->index; - hw_cfg->gpio2.func = CS35L41_INTERRUPT; - hw_cfg->gpio2.valid = true; - hw_cfg->valid = true; - - if (strncmp(hid, "CLSA0100", 8) == 0) { - hw_cfg->bst_type = CS35L41_EXT_BOOST_NO_VSPK_SWITCH; - } else if (strncmp(hid, "CLSA0101", 8) == 0) { - hw_cfg->bst_type = CS35L41_EXT_BOOST; - hw_cfg->gpio1.func = CS35l41_VSPK_SWITCH; - hw_cfg->gpio1.valid = true; - } else { - /* - * Note: CLSA010(0/1) are special cases which use a slightly different design. - * All other HIDs e.g. CSC3551 require valid ACPI _DSD properties to be supported. - */ - dev_err(cs35l41->dev, "Error: ACPI _DSD Properties are missing for HID %s.\n", hid); - hw_cfg->valid = false; - hw_cfg->gpio1.valid = false; - hw_cfg->gpio2.valid = false; - return -EINVAL; - } - - return 0; -} - static int cs35l41_hda_read_acpi(struct cs35l41_hda *cs35l41, const char *hid, int id) { struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg; @@ -1271,20 +1595,25 @@ return -ENODEV; } + cs35l41->dacpi = adev; physdev = get_device(acpi_get_first_physical_node(adev)); - acpi_dev_put(adev); sub = acpi_get_subsystem_id(ACPI_HANDLE(physdev)); if (IS_ERR(sub)) sub = NULL; cs35l41->acpi_subsystem_id = sub; + ret = cs35l41_add_dsd_properties(cs35l41, physdev, id, hid); + if (!ret) { + dev_info(cs35l41->dev, "Using extra _DSD properties, bypassing _DSD in ACPI\n"); + goto put_physdev; + } + property = "cirrus,dev-index"; ret = device_property_count_u32(physdev, property); - if (ret <= 0) { - ret = cs35l41_no_acpi_dsd(cs35l41, physdev, id, hid); - goto err_put_physdev; - } + if (ret <= 0) + goto err; + if (ret > ARRAY_SIZE(values)) { ret = -EINVAL; goto err; @@ -1374,7 +1703,11 @@ err: dev_err(cs35l41->dev, "Failed property %s: %d\n", property, ret); -err_put_physdev: + hw_cfg->valid = false; + hw_cfg->gpio1.valid = false; + hw_cfg->gpio2.valid = false; + acpi_dev_put(cs35l41->dacpi); +put_physdev: put_device(physdev); return ret; @@ -1383,7 +1716,7 @@ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int irq, struct regmap *regmap) { - unsigned int int_sts, regid, reg_revid, mtl_revid, chipid, int_status; + unsigned int regid, reg_revid; struct cs35l41_hda *cs35l41; int ret; @@ -1417,47 +1750,22 @@ } } if (cs35l41->reset_gpio) { + gpiod_set_value_cansleep(cs35l41->reset_gpio, 0); usleep_range(2000, 2100); gpiod_set_value_cansleep(cs35l41->reset_gpio, 1); } usleep_range(2000, 2100); + regmap_write(cs35l41->regmap, CS35L41_SFT_RESET, CS35L41_SOFTWARE_RESET); + usleep_range(2000, 2100); - ret = regmap_read_poll_timeout(cs35l41->regmap, CS35L41_IRQ1_STATUS4, int_status, - int_status & CS35L41_OTP_BOOT_DONE, 1000, 100000); - if (ret) { - dev_err(cs35l41->dev, "Failed waiting for OTP_BOOT_DONE: %d\n", ret); - goto err; - } - - ret = regmap_read(cs35l41->regmap, CS35L41_IRQ1_STATUS3, &int_sts); - if (ret || (int_sts & CS35L41_OTP_BOOT_ERR)) { - dev_err(cs35l41->dev, "OTP Boot status %x error: %d\n", - int_sts & CS35L41_OTP_BOOT_ERR, ret); - ret = -EIO; - goto err; - } - - ret = regmap_read(cs35l41->regmap, CS35L41_DEVID, ®id); - if (ret) { - dev_err(cs35l41->dev, "Get Device ID failed: %d\n", ret); - goto err; - } - - ret = regmap_read(cs35l41->regmap, CS35L41_REVID, ®_revid); - if (ret) { - dev_err(cs35l41->dev, "Get Revision ID failed: %d\n", ret); + ret = cs35l41_wait_boot_done(cs35l41); + if (ret) goto err; - } - - mtl_revid = reg_revid & CS35L41_MTLREVID_MASK; - chipid = (mtl_revid % 2) ? CS35L41R_CHIP_ID : CS35L41_CHIP_ID; - if (regid != chipid) { - dev_err(cs35l41->dev, "CS35L41 Device ID (%X). Expected ID %X\n", regid, chipid); - ret = -ENODEV; + ret = cs35l41_verify_id(cs35l41, ®id, ®_revid); + if (ret) goto err; - } ret = cs35l41_test_key_unlock(cs35l41->dev, cs35l41->regmap); if (ret) @@ -1477,6 +1785,8 @@ if (ret) goto err; + cs35l41_mute(cs35l41->dev, true); + INIT_WORK(&cs35l41->fw_load_work, cs35l41_fw_load_work); mutex_init(&cs35l41->fw_mutex); @@ -1496,8 +1806,7 @@ ret = component_add(cs35l41->dev, &cs35l41_hda_comp_ops); if (ret) { dev_err(cs35l41->dev, "Register component failed: %d\n", ret); - pm_runtime_disable(cs35l41->dev); - goto err; + goto err_pm; } dev_info(cs35l41->dev, "Cirrus Logic CS35L41 (%x), Revision: %02X\n", regid, reg_revid); @@ -1505,6 +1814,7 @@ return 0; err_pm: + pm_runtime_dont_use_autosuspend(cs35l41->dev); pm_runtime_disable(cs35l41->dev); pm_runtime_put_noidle(cs35l41->dev); @@ -1512,6 +1822,7 @@ if (cs35l41_safe_reset(cs35l41->regmap, cs35l41->hw_cfg.bst_type)) gpiod_set_value_cansleep(cs35l41->reset_gpio, 0); gpiod_put(cs35l41->reset_gpio); + acpi_dev_put(cs35l41->dacpi); kfree(cs35l41->acpi_subsystem_id); return ret; @@ -1523,6 +1834,7 @@ struct cs35l41_hda *cs35l41 = dev_get_drvdata(dev); pm_runtime_get_sync(cs35l41->dev); + pm_runtime_dont_use_autosuspend(cs35l41->dev); pm_runtime_disable(cs35l41->dev); if (cs35l41->halo_initialized) @@ -1530,6 +1842,8 @@ component_del(cs35l41->dev, &cs35l41_hda_comp_ops); + acpi_dev_put(cs35l41->dacpi); + pm_runtime_put_noidle(cs35l41->dev); if (cs35l41_safe_reset(cs35l41->regmap, cs35l41->hw_cfg.bst_type)) @@ -1542,6 +1856,7 @@ const struct dev_pm_ops cs35l41_hda_pm_ops = { RUNTIME_PM_OPS(cs35l41_runtime_suspend, cs35l41_runtime_resume, cs35l41_runtime_idle) + .prepare = cs35l41_system_suspend_prep, SYSTEM_SLEEP_PM_OPS(cs35l41_system_suspend, cs35l41_system_resume) }; EXPORT_SYMBOL_NS_GPL(cs35l41_hda_pm_ops, SND_HDA_SCODEC_CS35L41); --- linux-azure-6.5.0.orig/sound/pci/hda/cs35l41_hda.h +++ linux-azure-6.5.0/sound/pci/hda/cs35l41_hda.h @@ -10,6 +10,7 @@ #ifndef __CS35L41_HDA_H__ #define __CS35L41_HDA_H__ +#include #include #include #include @@ -70,6 +71,8 @@ bool halo_initialized; bool playback_started; struct cs_dsp cs_dsp; + struct acpi_device *dacpi; + bool mute_override; }; enum halo_state { @@ -83,5 +86,6 @@ int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int irq, struct regmap *regmap); void cs35l41_hda_remove(struct device *dev); +int cs35l41_get_speaker_id(struct device *dev, int amp_index, int num_amps, int fixed_gpio_id); #endif /*__CS35L41_HDA_H__*/ --- linux-azure-6.5.0.orig/sound/pci/hda/cs35l41_hda_property.c +++ linux-azure-6.5.0/sound/pci/hda/cs35l41_hda_property.c @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// CS35L41 ALSA HDA Property driver +// +// Copyright 2023 Cirrus Logic, Inc. +// +// Author: Stefan Binding + +#include +#include +#include "cs35l41_hda_property.h" + +/* + * Device CLSA010(0/1) doesn't have _DSD so a gpiod_get by the label reset won't work. + * And devices created by serial-multi-instantiate don't have their device struct + * pointing to the correct fwnode, so acpi_dev must be used here. + * And devm functions expect that the device requesting the resource has the correct + * fwnode. + */ +static int lenovo_legion_no_acpi(struct cs35l41_hda *cs35l41, struct device *physdev, int id, + const char *hid) +{ + struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg; + + /* check I2C address to assign the index */ + cs35l41->index = id == 0x40 ? 0 : 1; + cs35l41->channel_index = 0; + cs35l41->reset_gpio = gpiod_get_index(physdev, NULL, 0, GPIOD_OUT_HIGH); + cs35l41->speaker_id = cs35l41_get_speaker_id(physdev, 0, 0, 2); + hw_cfg->spk_pos = cs35l41->index; + hw_cfg->gpio2.func = CS35L41_INTERRUPT; + hw_cfg->gpio2.valid = true; + hw_cfg->valid = true; + + if (strcmp(hid, "CLSA0100") == 0) { + hw_cfg->bst_type = CS35L41_EXT_BOOST_NO_VSPK_SWITCH; + } else if (strcmp(hid, "CLSA0101") == 0) { + hw_cfg->bst_type = CS35L41_EXT_BOOST; + hw_cfg->gpio1.func = CS35l41_VSPK_SWITCH; + hw_cfg->gpio1.valid = true; + } + + return 0; +} + +/* + * Device 103C89C6 does have _DSD, however it is setup to use the wrong boost type. + * We can override the _DSD to correct the boost type here. + * Since this laptop has valid ACPI, we do not need to handle cs-gpios, since that already exists + * in the ACPI. + */ +static int hp_vision_acpi_fix(struct cs35l41_hda *cs35l41, struct device *physdev, int id, + const char *hid) +{ + struct cs35l41_hw_cfg *hw_cfg = &cs35l41->hw_cfg; + + dev_info(cs35l41->dev, "Adding DSD properties for %s\n", cs35l41->acpi_subsystem_id); + + cs35l41->index = id; + cs35l41->channel_index = 0; + + /* + * This system has _DSD, it just contains an error, so we can still get the reset using + * the "reset" label. + */ + cs35l41->reset_gpio = fwnode_gpiod_get_index(acpi_fwnode_handle(cs35l41->dacpi), "reset", + cs35l41->index, GPIOD_OUT_LOW, + "cs35l41-reset"); + cs35l41->speaker_id = -ENOENT; + hw_cfg->spk_pos = cs35l41->index ? 0 : 1; // right:left + hw_cfg->gpio1.func = CS35L41_NOT_USED; + hw_cfg->gpio1.valid = true; + hw_cfg->gpio2.func = CS35L41_INTERRUPT; + hw_cfg->gpio2.valid = true; + hw_cfg->bst_type = CS35L41_INT_BOOST; + hw_cfg->bst_ind = 1000; + hw_cfg->bst_ipk = 4500; + hw_cfg->bst_cap = 24; + hw_cfg->valid = true; + + return 0; +} + +struct cs35l41_prop_model { + const char *hid; + const char *ssid; + int (*add_prop)(struct cs35l41_hda *cs35l41, struct device *physdev, int id, + const char *hid); +}; + +const struct cs35l41_prop_model cs35l41_prop_model_table[] = { + { "CLSA0100", NULL, lenovo_legion_no_acpi }, + { "CLSA0101", NULL, lenovo_legion_no_acpi }, + { "CSC3551", "103C89C6", hp_vision_acpi_fix }, + {} +}; + +int cs35l41_add_dsd_properties(struct cs35l41_hda *cs35l41, struct device *physdev, int id, + const char *hid) +{ + const struct cs35l41_prop_model *model; + + for (model = cs35l41_prop_model_table; model->hid; model++) { + if (!strcmp(model->hid, hid) && + (!model->ssid || + (cs35l41->acpi_subsystem_id && + !strcmp(model->ssid, cs35l41->acpi_subsystem_id)))) + return model->add_prop(cs35l41, physdev, id, hid); + } + + return -ENOENT; +} --- linux-azure-6.5.0.orig/sound/pci/hda/cs35l41_hda_property.h +++ linux-azure-6.5.0/sound/pci/hda/cs35l41_hda_property.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0 + * + * CS35L41 ALSA HDA Property driver + * + * Copyright 2023 Cirrus Logic, Inc. + * + * Author: Stefan Binding + */ + +#ifndef CS35L41_HDA_PROP_H +#define CS35L41_HDA_PROP_H + +#include +#include "cs35l41_hda.h" + +int cs35l41_add_dsd_properties(struct cs35l41_hda *cs35l41, struct device *physdev, int id, + const char *hid); +#endif /* CS35L41_HDA_PROP_H */ --- linux-azure-6.5.0.orig/sound/pci/hda/hda_component.h +++ linux-azure-6.5.0/sound/pci/hda/hda_component.h @@ -6,6 +6,7 @@ * Cirrus Logic International Semiconductor Ltd. */ +#include #include #define HDA_MAX_COMPONENTS 4 @@ -15,5 +16,10 @@ struct device *dev; char name[HDA_MAX_NAME_SIZE]; struct hda_codec *codec; + struct acpi_device *adev; + bool acpi_notifications_supported; + void (*acpi_notify)(acpi_handle handle, u32 event, struct device *dev); + void (*pre_playback_hook)(struct device *dev, int action); void (*playback_hook)(struct device *dev, int action); + void (*post_playback_hook)(struct device *dev, int action); }; --- linux-azure-6.5.0.orig/sound/pci/hda/hda_intel.c +++ linux-azure-6.5.0/sound/pci/hda/hda_intel.c @@ -2223,12 +2223,15 @@ SND_PCI_QUIRK(0x8086, 0x2068, "Intel NUC7i3BNB", 0), /* https://bugzilla.kernel.org/show_bug.cgi?id=198611 */ SND_PCI_QUIRK(0x17aa, 0x2227, "Lenovo X1 Carbon 3rd Gen", 0), + SND_PCI_QUIRK(0x17aa, 0x316e, "Lenovo ThinkCentre M70q", 0), /* https://bugzilla.redhat.com/show_bug.cgi?id=1689623 */ SND_PCI_QUIRK(0x17aa, 0x367b, "Lenovo IdeaCentre B550", 0), /* https://bugzilla.redhat.com/show_bug.cgi?id=1572975 */ SND_PCI_QUIRK(0x17aa, 0x36a7, "Lenovo C50 All in one", 0), /* https://bugs.launchpad.net/bugs/1821663 */ SND_PCI_QUIRK(0x1631, 0xe017, "Packard Bell NEC IMEDIA 5204", 0), + /* KONTRON SinglePC may cause a stall at runtime resume */ + SND_PCI_QUIRK(0x1734, 0x1232, "KONTRON SinglePC", 0), {} }; #endif /* CONFIG_PM */ --- linux-azure-6.5.0.orig/sound/pci/hda/patch_cs8409.c +++ linux-azure-6.5.0/sound/pci/hda/patch_cs8409.c @@ -888,7 +888,7 @@ /* Initialize CS42L42 companion codec */ cs8409_i2c_bulk_write(cs42l42, cs42l42->init_seq, cs42l42->init_seq_num); - usleep_range(30000, 35000); + msleep(CS42L42_INIT_TIMEOUT_MS); /* Clear interrupts, by reading interrupt status registers */ cs8409_i2c_bulk_read(cs42l42, irq_regs, ARRAY_SIZE(irq_regs)); @@ -1371,6 +1371,7 @@ spec->scodecs[CS8409_CODEC1] = &dolphin_cs42l42_1; spec->scodecs[CS8409_CODEC1]->codec = codec; spec->num_scodecs = 2; + spec->gen.suppress_vmaster = 1; codec->patch_ops = cs8409_dolphin_patch_ops; --- linux-azure-6.5.0.orig/sound/pci/hda/patch_cs8409.h +++ linux-azure-6.5.0/sound/pci/hda/patch_cs8409.h @@ -229,6 +229,7 @@ #define CS42L42_I2C_SLEEP_US (2000) #define CS42L42_PDN_TIMEOUT_US (250000) #define CS42L42_PDN_SLEEP_US (2000) +#define CS42L42_INIT_TIMEOUT_MS (45) #define CS42L42_FULL_SCALE_VOL_MASK (2) #define CS42L42_FULL_SCALE_VOL_0DB (1) #define CS42L42_FULL_SCALE_VOL_MINUS6DB (0) --- linux-azure-6.5.0.orig/sound/pci/hda/patch_hdmi.c +++ linux-azure-6.5.0/sound/pci/hda/patch_hdmi.c @@ -1993,7 +1993,10 @@ SND_PCI_QUIRK(0x103c, 0x871a, "HP", 1), SND_PCI_QUIRK(0x103c, 0x8711, "HP", 1), SND_PCI_QUIRK(0x103c, 0x8715, "HP", 1), + SND_PCI_QUIRK(0x1043, 0x86ae, "ASUS", 1), /* Z170 PRO */ + SND_PCI_QUIRK(0x1043, 0x86c7, "ASUS", 1), /* Z170M PLUS */ SND_PCI_QUIRK(0x1462, 0xec94, "MS-7C94", 1), + SND_PCI_QUIRK(0x8086, 0x2060, "Intel NUC5CPYB", 1), SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", 1), {} }; --- linux-azure-6.5.0.orig/sound/pci/hda/patch_realtek.c +++ linux-azure-6.5.0/sound/pci/hda/patch_realtek.c @@ -10,6 +10,7 @@ * Jonathan Woithe */ +#include #include #include #include @@ -1986,6 +1987,7 @@ ALC887_FIXUP_ASUS_AUDIO, ALC887_FIXUP_ASUS_HMIC, ALCS1200A_FIXUP_MIC_VREF, + ALC888VD_FIXUP_MIC_100VREF, }; static void alc889_fixup_coef(struct hda_codec *codec, @@ -2539,6 +2541,13 @@ {} } }, + [ALC888VD_FIXUP_MIC_100VREF] = { + .type = HDA_FIXUP_PINCTLS, + .v.pins = (const struct hda_pintbl[]) { + { 0x18, PIN_VREF100 }, /* headset mic */ + {} + } + }, }; static const struct snd_pci_quirk alc882_fixup_tbl[] = { @@ -2608,6 +2617,7 @@ SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF), SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD), + SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF), SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD), SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE), SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS), @@ -3255,6 +3265,7 @@ case 0x10ec0230: case 0x10ec0236: case 0x10ec0256: + case 0x10ec0257: case 0x19e58326: alc_write_coef_idx(codec, 0x48, 0x0); alc_update_coef_idx(codec, 0x49, 0x0045, 0x0); @@ -3284,6 +3295,7 @@ case 0x10ec0230: case 0x10ec0236: case 0x10ec0256: + case 0x10ec0257: case 0x19e58326: alc_write_coef_idx(codec, 0x48, 0xd011); alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045); @@ -4639,6 +4651,22 @@ } } +static void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec, + const struct hda_fixup *fix, + int action) +{ + struct alc_spec *spec = codec->spec; + + if (action == HDA_FIXUP_ACT_PRE_PROBE) { + spec->mute_led_polarity = 0; + spec->mute_led_coef.idx = 0x0b; + spec->mute_led_coef.mask = 3 << 2; + spec->mute_led_coef.on = 2 << 2; + spec->mute_led_coef.off = 1 << 2; + snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set); + } +} + /* turn on/off mic-mute LED per capture hook by coef bit */ static int coef_micmute_led_set(struct led_classdev *led_cdev, enum led_brightness brightness) @@ -6479,6 +6507,7 @@ case 0x10ec0236: case 0x10ec0255: case 0x10ec0256: + case 0x10ec0257: case 0x19e58326: alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */ alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15); @@ -6688,12 +6717,91 @@ } } +#ifdef CONFIG_ACPI +static void comp_acpi_device_notify(acpi_handle handle, u32 event, void *data) +{ + struct hda_codec *cdc = data; + struct alc_spec *spec = cdc->spec; + int i; + + codec_info(cdc, "ACPI Notification %d\n", event); + + for (i = 0; i < HDA_MAX_COMPONENTS; i++) { + if (spec->comps[i].dev && spec->comps[i].acpi_notify) + spec->comps[i].acpi_notify(acpi_device_handle(spec->comps[i].adev), event, + spec->comps[i].dev); + } +} + +static int comp_bind_acpi(struct device *dev) +{ + struct hda_codec *cdc = dev_to_hda_codec(dev); + struct alc_spec *spec = cdc->spec; + bool support_notifications = false; + struct acpi_device *adev; + int ret; + int i; + + adev = spec->comps[0].adev; + if (!acpi_device_handle(adev)) + return 0; + + for (i = 0; i < HDA_MAX_COMPONENTS; i++) + support_notifications = support_notifications || + spec->comps[i].acpi_notifications_supported; + + if (support_notifications) { + ret = acpi_install_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY, + comp_acpi_device_notify, cdc); + if (ret < 0) { + codec_warn(cdc, "Failed to install notify handler: %d\n", ret); + return 0; + } + + codec_dbg(cdc, "Notify handler installed\n"); + } + + return 0; +} + +static void comp_unbind_acpi(struct device *dev) +{ + struct hda_codec *cdc = dev_to_hda_codec(dev); + struct alc_spec *spec = cdc->spec; + struct acpi_device *adev; + int ret; + + adev = spec->comps[0].adev; + if (!acpi_device_handle(adev)) + return; + + ret = acpi_remove_notify_handler(adev->handle, ACPI_DEVICE_NOTIFY, + comp_acpi_device_notify); + if (ret < 0) + codec_warn(cdc, "Failed to uninstall notify handler: %d\n", ret); +} +#else +static int comp_bind_acpi(struct device *dev) +{ + return 0; +} + +static void comp_unbind_acpi(struct device *dev) +{ +} +#endif + static int comp_bind(struct device *dev) { struct hda_codec *cdc = dev_to_hda_codec(dev); struct alc_spec *spec = cdc->spec; + int ret; - return component_bind_all(dev, spec->comps); + ret = component_bind_all(dev, spec->comps); + if (ret) + return ret; + + return comp_bind_acpi(dev); } static void comp_unbind(struct device *dev) @@ -6701,6 +6809,7 @@ struct hda_codec *cdc = dev_to_hda_codec(dev); struct alc_spec *spec = cdc->spec; + comp_unbind_acpi(dev); component_unbind_all(dev, spec->comps); } @@ -6716,9 +6825,17 @@ int i; for (i = 0; i < HDA_MAX_COMPONENTS; i++) { - if (spec->comps[i].dev) + if (spec->comps[i].dev && spec->comps[i].pre_playback_hook) + spec->comps[i].pre_playback_hook(spec->comps[i].dev, action); + } + for (i = 0; i < HDA_MAX_COMPONENTS; i++) { + if (spec->comps[i].dev && spec->comps[i].playback_hook) spec->comps[i].playback_hook(spec->comps[i].dev, action); } + for (i = 0; i < HDA_MAX_COMPONENTS; i++) { + if (spec->comps[i].dev && spec->comps[i].post_playback_hook) + spec->comps[i].post_playback_hook(spec->comps[i].dev, action); + } } struct cs35l41_dev_name { @@ -6972,6 +7089,47 @@ } } +/* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */ +static void alc287_fixup_bind_dacs(struct hda_codec *codec, + const struct hda_fixup *fix, int action) +{ + struct alc_spec *spec = codec->spec; + static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */ + static const hda_nid_t preferred_pairs[] = { + 0x17, 0x02, 0x21, 0x03, 0 + }; + + if (action != HDA_FIXUP_ACT_PRE_PROBE) + return; + + snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn); + spec->gen.preferred_dacs = preferred_pairs; + spec->gen.auto_mute_via_amp = 1; + if (spec->gen.autocfg.speaker_pins[0] != 0x14) { + snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, + 0x0); /* Make sure 0x14 was disable */ + } +} +/* Fix none verb table of Headset Mic pin */ +static void alc_fixup_headset_mic(struct hda_codec *codec, + const struct hda_fixup *fix, int action) +{ + struct alc_spec *spec = codec->spec; + static const struct hda_pintbl pincfgs[] = { + { 0x19, 0x03a1103c }, + { } + }; + + switch (action) { + case HDA_FIXUP_ACT_PRE_PROBE: + snd_hda_apply_pincfgs(codec, pincfgs); + alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12); + spec->parse_flags |= HDA_PINCFG_HEADSET_MIC; + break; + } +} + + enum { ALC269_FIXUP_GPIO2, ALC269_FIXUP_SONY_VAIO, @@ -7042,6 +7200,7 @@ ALC290_FIXUP_SUBWOOFER_HSJACK, ALC269_FIXUP_THINKPAD_ACPI, ALC269_FIXUP_DMIC_THINKPAD_ACPI, + ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO, ALC255_FIXUP_ACER_MIC_NO_PRESENCE, ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, @@ -7136,8 +7295,10 @@ ALC256_FIXUP_ASUS_MIC_NO_PRESENCE, ALC299_FIXUP_PREDATOR_SPK, ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, + ALC289_FIXUP_DELL_SPK1, ALC289_FIXUP_DELL_SPK2, ALC289_FIXUP_DUAL_SPK, + ALC289_FIXUP_RTK_AMP_DUAL_SPK, ALC294_FIXUP_SPK2_TO_DAC1, ALC294_FIXUP_ASUS_DUAL_SPK, ALC285_FIXUP_THINKPAD_X1_GEN7, @@ -7231,6 +7392,13 @@ ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS, ALC236_FIXUP_DELL_DUAL_CODECS, ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI, + ALC245_FIXUP_HP_MUTE_LED_COEFBIT, + ALC245_FIXUP_HP_X360_MUTE_LEDS, + ALC287_FIXUP_THINKPAD_I2S_SPK, + ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD, + ALC2XX_FIXUP_HEADSET_MIC, + ALC289_FIXUP_DELL_CS35L41_SPI_2, + ALC294_FIXUP_CS35L41_I2C_2, }; /* A special fixup for Lenovo C940 and Yoga Duet 7; @@ -7384,6 +7552,14 @@ .type = HDA_FIXUP_FUNC, .v.func = alc269_fixup_pincfg_U7x7_headset_mic, }, + [ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl[]) { + { 0x18, 0x03a19020 }, /* headset mic */ + { 0x1b, 0x90170150 }, /* speaker */ + { } + }, + }, [ALC269_FIXUP_AMIC] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl[]) { @@ -8457,6 +8633,15 @@ .chained = true, .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE }, + [ALC289_FIXUP_DELL_SPK1] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl[]) { + { 0x14, 0x90170140 }, + { } + }, + .chained = true, + .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE + }, [ALC289_FIXUP_DELL_SPK2] = { .type = HDA_FIXUP_PINS, .v.pins = (const struct hda_pintbl[]) { @@ -8472,6 +8657,12 @@ .chained = true, .chain_id = ALC289_FIXUP_DELL_SPK2 }, + [ALC289_FIXUP_RTK_AMP_DUAL_SPK] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc285_fixup_speaker2_to_dac1, + .chained = true, + .chain_id = ALC289_FIXUP_DELL_SPK1 + }, [ALC294_FIXUP_SPK2_TO_DAC1] = { .type = HDA_FIXUP_FUNC, .v.func = alc285_fixup_speaker2_to_dac1, @@ -9309,6 +9500,40 @@ .chained = true, .chain_id = ALC269_FIXUP_THINKPAD_ACPI, }, + [ALC287_FIXUP_THINKPAD_I2S_SPK] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc287_fixup_bind_dacs, + }, + [ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc287_fixup_bind_dacs, + .chained = true, + .chain_id = ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI, + }, + [ALC245_FIXUP_HP_MUTE_LED_COEFBIT] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc245_fixup_hp_mute_led_coefbit, + }, + [ALC245_FIXUP_HP_X360_MUTE_LEDS] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc245_fixup_hp_mute_led_coefbit, + .chained = true, + .chain_id = ALC245_FIXUP_HP_GPIO_LED + }, + [ALC289_FIXUP_DELL_CS35L41_SPI_2] = { + .type = HDA_FIXUP_FUNC, + .v.func = cs35l41_fixup_spi_two, + .chained = true, + .chain_id = ALC289_FIXUP_DUAL_SPK + }, + [ALC2XX_FIXUP_HEADSET_MIC] = { + .type = HDA_FIXUP_FUNC, + .v.func = alc_fixup_headset_mic, + }, + [ALC294_FIXUP_CS35L41_I2C_2] = { + .type = HDA_FIXUP_FUNC, + .v.func = cs35l41_fixup_i2c_two, + }, }; static const struct snd_pci_quirk alc269_fixup_tbl[] = { @@ -9412,6 +9637,7 @@ SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK), SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS), SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS), + SND_PCI_QUIRK(0x1028, 0x0beb, "Dell XPS 15 9530 (2023)", ALC289_FIXUP_DELL_CS35L41_SPI_2), SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS), SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS), @@ -9419,13 +9645,15 @@ SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS), SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS), SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS), - SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC245_FIXUP_CS35L41_SPI_2), - SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC245_FIXUP_CS35L41_SPI_2), - SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC245_FIXUP_CS35L41_SPI_2), - SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC245_FIXUP_CS35L41_SPI_2), - SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC245_FIXUP_CS35L41_SPI_2), - SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC245_FIXUP_CS35L41_SPI_2), - SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC245_FIXUP_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1028, 0x0cc0, "Dell Oasis 13", ALC289_FIXUP_RTK_AMP_DUAL_SPK), + SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis 14", ALC289_FIXUP_RTK_AMP_DUAL_SPK), SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), @@ -9499,9 +9727,11 @@ SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3), SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3), + SND_PCI_QUIRK(0x103c, 0x84ae, "HP 15-db0403ng", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN), SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3), SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360), + SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT), SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT), SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED), @@ -9518,6 +9748,7 @@ SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT), SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED), + SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS), SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation", @@ -9551,12 +9782,14 @@ SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT), SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT), SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), + SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS), SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED), SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED), SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST), SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED), + SND_PCI_QUIRK(0x103c, 0x890e, "HP 255 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), @@ -9582,6 +9815,9 @@ SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), + SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), + SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT), SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST), SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED), @@ -9590,6 +9826,7 @@ SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8b2f, "HP 255 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2), SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), @@ -9623,12 +9860,17 @@ SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF), + SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED), + SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED), SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK), SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC), SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1043, 0x10d3, "ASUS K6500ZC", ALC294_FIXUP_ASUS_SPK), SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), @@ -9648,8 +9890,10 @@ SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603V", ALC285_FIXUP_ASUS_HEADSET_MIC), SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601V", ALC285_FIXUP_ASUS_HEADSET_MIC), SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A), + SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301V", ALC285_FIXUP_ASUS_HEADSET_MIC), SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK), + SND_PCI_QUIRK(0x1043, 0x1663, "ASUS GU603ZV", ALC285_FIXUP_ASUS_HEADSET_MIC), SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401), SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC), @@ -9658,6 +9902,7 @@ SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally RC71L_RC71L", ALC294_FIXUP_ASUS_ALLY), SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS), SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC), + SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS UM3504DA", ALC294_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC), SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE), SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401), @@ -9666,12 +9911,17 @@ SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC), + SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B), SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC), SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0x1043, 0x1c03, "ASUS UM3406HA", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), + SND_PCI_QUIRK(0x1043, 0x1c33, "ASUS UX5304MA", ALC245_FIXUP_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1043, 0x1c43, "ASUS UX8406MA", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401), SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS), SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JI", ALC285_FIXUP_ASUS_HEADSET_MIC), @@ -9680,15 +9930,20 @@ SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS ROG Strix G17 2023 (G713PV)", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401), SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE), - SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402", ALC245_FIXUP_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS UX3402VA", ALC245_FIXUP_CS35L41_SPI_2), + SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502), - SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM6702RA/RC", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS), SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS), SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401), + SND_PCI_QUIRK(0x1043, 0x1ee2, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2), SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401), SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401), SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2), + SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2), SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401), SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2), SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC245_FIXUP_CS35L41_SPI_2), @@ -9719,7 +9974,7 @@ SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), - SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC225_FIXUP_HEADSET_JACK), + SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK), SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE), SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC), SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP), @@ -9815,6 +10070,7 @@ SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS), + SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340), SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE), SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE), @@ -9853,14 +10109,14 @@ SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK), SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK), SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK), - SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI), - SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI), - SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI), - SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI), - SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI), - SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI), - SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI), - SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI), + SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), + SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), + SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), + SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), + SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), + SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), + SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), + SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD), SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION), @@ -9872,7 +10128,9 @@ SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC), SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340), + SND_PCI_QUIRK(0x17aa, 0x334b, "Lenovo ThinkCentre M70 Gen5", ALC283_FIXUP_HEADSET_MIC), SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), + SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN), SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS), SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS), SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7), @@ -9939,11 +10197,14 @@ SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC), SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC), SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC), + SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO), SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC), SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED), SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10), - SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC225_FIXUP_HEADSET_JACK), + SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC295_FIXUP_CHROME_BOOK), SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0xf111, 0x0005, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE), + SND_PCI_QUIRK(0xf111, 0x0006, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE), #if 0 /* Below is a quirk table taken from the old code. @@ -10424,6 +10685,10 @@ {0x17, 0x90170111}, {0x19, 0x03a11030}, {0x21, 0x03211020}), + SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK, + {0x17, 0x90170110}, + {0x19, 0x03a11030}, + {0x21, 0x03211020}), SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE, {0x12, 0x90a60130}, {0x17, 0x90170110}, @@ -10518,22 +10783,6 @@ {0x12, 0x90a60130}, {0x17, 0x90170110}, {0x21, 0x03211020}), - SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, - {0x14, 0x90170110}, - {0x21, 0x04211020}), - SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, - {0x14, 0x90170110}, - {0x21, 0x04211030}), - SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, - ALC295_STANDARD_PINS, - {0x17, 0x21014020}, - {0x18, 0x21a19030}), - SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, - ALC295_STANDARD_PINS, - {0x17, 0x21014040}, - {0x18, 0x21a19050}), - SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, - ALC295_STANDARD_PINS), SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, ALC298_STANDARD_PINS, {0x17, 0x90170110}), @@ -10577,6 +10826,9 @@ SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, {0x19, 0x40000000}, {0x1b, 0x40000000}), + SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, + {0x19, 0x40000000}, + {0x1b, 0x40000000}), SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, {0x19, 0x40000000}, {0x1a, 0x40000000}), @@ -10586,6 +10838,8 @@ SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, {0x19, 0x40000000}, {0x1a, 0x40000000}), + SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC, + {0x19, 0x40000000}), {} }; @@ -11872,6 +12126,7 @@ SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN), SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN), SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN), + SND_PCI_QUIRK(0x17aa, 0x3364, "Lenovo ThinkCentre M90 Gen5", ALC897_FIXUP_HEADSET_MIC_PIN), SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2), SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), --- linux-azure-6.5.0.orig/sound/soc/amd/yc/acp6x-mach.c +++ linux-azure-6.5.0/sound/soc/amd/yc/acp6x-mach.c @@ -217,12 +217,40 @@ .driver_data = &acp6x_card, .matches = { DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "82TL"), + } + }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "82QF"), + } + }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), DMI_MATCH(DMI_PRODUCT_NAME, "82V2"), } }, { .driver_data = &acp6x_card, .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "82YM"), + } + }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "82UG"), + } + }, + { + .driver_data = &acp6x_card, + .matches = { DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), DMI_MATCH(DMI_PRODUCT_NAME, "UM5302TA"), } @@ -258,6 +286,27 @@ { .driver_data = &acp6x_card, .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_PRODUCT_NAME, "E1504FA"), + } + }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_PRODUCT_NAME, "E1504FA"), + } + }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "Micro-Star International Co., Ltd."), + DMI_MATCH(DMI_PRODUCT_NAME, "Bravo 15 B7ED"), + } + }, + { + .driver_data = &acp6x_card, + .matches = { DMI_MATCH(DMI_BOARD_VENDOR, "Alienware"), DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17 R5 AMD"), } @@ -328,6 +377,20 @@ { .driver_data = &acp6x_card, .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "HP"), + DMI_MATCH(DMI_BOARD_NAME, "8A3E"), + } + }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "HP"), + DMI_MATCH(DMI_BOARD_NAME, "8B2F"), + } + }, + { + .driver_data = &acp6x_card, + .matches = { DMI_MATCH(DMI_BOARD_VENDOR, "MECHREVO"), DMI_MATCH(DMI_BOARD_NAME, "MRID6"), } @@ -339,6 +402,13 @@ DMI_MATCH(DMI_PRODUCT_VERSION, "pang12"), } }, + { + .driver_data = &acp6x_card, + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "System76"), + DMI_MATCH(DMI_PRODUCT_VERSION, "pang13"), + } + }, {} }; --- linux-azure-6.5.0.orig/sound/soc/codecs/Kconfig +++ linux-azure-6.5.0/sound/soc/codecs/Kconfig @@ -1708,6 +1708,7 @@ config SND_SOC_STAC9766 tristate depends on SND_SOC_AC97_BUS + select REGMAP_AC97 config SND_SOC_STI_SAS tristate "codec Audio support for STI SAS codec" --- linux-azure-6.5.0.orig/sound/soc/codecs/cs35l41-lib.c +++ linux-azure-6.5.0/sound/soc/codecs/cs35l41-lib.c @@ -74,6 +74,7 @@ case CS35L41_FABID: case CS35L41_RELID: case CS35L41_OTPID: + case CS35L41_SFT_RESET: case CS35L41_TEST_KEY_CTL: case CS35L41_USER_KEY_CTL: case CS35L41_OTP_CTRL0: @@ -1080,28 +1081,32 @@ { 0x00000040, 0x00000033 }, }; -static const struct reg_sequence cs35l41_active_to_safe[] = { +static const struct reg_sequence cs35l41_active_to_safe_start[] = { { 0x00000040, 0x00000055 }, { 0x00000040, 0x000000AA }, { 0x00007438, 0x00585941 }, { CS35L41_PWR_CTRL1, 0x00000000 }, - { 0x0000742C, 0x00000009, 3000 }, + { 0x0000742C, 0x00000009 }, +}; + +static const struct reg_sequence cs35l41_active_to_safe_end[] = { { 0x00007438, 0x00580941 }, { 0x00000040, 0x000000CC }, { 0x00000040, 0x00000033 }, }; -static const struct reg_sequence cs35l41_safe_to_active[] = { +static const struct reg_sequence cs35l41_safe_to_active_start[] = { { 0x00000040, 0x00000055 }, { 0x00000040, 0x000000AA }, { 0x0000742C, 0x0000000F }, { 0x0000742C, 0x00000079 }, { 0x00007438, 0x00585941 }, - { CS35L41_PWR_CTRL1, 0x00000001, 3000 }, // GLOBAL_EN = 1 + { CS35L41_PWR_CTRL1, 0x00000001 }, // GLOBAL_EN = 1 +}; + +static const struct reg_sequence cs35l41_safe_to_active_en_spk[] = { { 0x0000742C, 0x000000F9 }, { 0x00007438, 0x00580941 }, - { 0x00000040, 0x000000CC }, - { 0x00000040, 0x00000033 }, }; static const struct reg_sequence cs35l41_reset_to_safe[] = { @@ -1188,11 +1193,12 @@ } EXPORT_SYMBOL_GPL(cs35l41_safe_reset); -int cs35l41_global_enable(struct regmap *regmap, enum cs35l41_boost_type b_type, int enable, - struct completion *pll_lock) +int cs35l41_global_enable(struct device *dev, struct regmap *regmap, enum cs35l41_boost_type b_type, + int enable, struct completion *pll_lock, bool firmware_running) { int ret; - unsigned int gpio1_func, pad_control, pwr_ctrl1, pwr_ctrl3; + unsigned int gpio1_func, pad_control, pwr_ctrl1, pwr_ctrl3, int_status, pup_pdn_mask; + unsigned int pwr_ctl1_val; struct reg_sequence cs35l41_mdsync_down_seq[] = { {CS35L41_PWR_CTRL3, 0}, {CS35L41_GPIO_PAD_CONTROL, 0}, @@ -1204,6 +1210,20 @@ {CS35L41_PWR_CTRL1, 0x00000001, 3000}, }; + pup_pdn_mask = enable ? CS35L41_PUP_DONE_MASK : CS35L41_PDN_DONE_MASK; + + ret = regmap_read(regmap, CS35L41_PWR_CTRL1, &pwr_ctl1_val); + if (ret) + return ret; + + if ((pwr_ctl1_val & CS35L41_GLOBAL_EN_MASK) && enable) { + dev_dbg(dev, "Cannot set Global Enable - already set.\n"); + return 0; + } else if (!(pwr_ctl1_val & CS35L41_GLOBAL_EN_MASK) && !enable) { + dev_dbg(dev, "Cannot unset Global Enable - not set.\n"); + return 0; + } + switch (b_type) { case CS35L41_SHD_BOOST_ACTV: case CS35L41_SHD_BOOST_PASS: @@ -1224,7 +1244,7 @@ cs35l41_mdsync_down_seq[2].def = pwr_ctrl1; ret = regmap_multi_reg_write(regmap, cs35l41_mdsync_down_seq, ARRAY_SIZE(cs35l41_mdsync_down_seq)); - if (!enable) + if (ret || !enable) break; if (!pll_lock) @@ -1240,20 +1260,85 @@ ret = regmap_multi_reg_write(regmap, cs35l41_mdsync_up_seq, ARRAY_SIZE(cs35l41_mdsync_up_seq)); } + + ret = regmap_read_poll_timeout(regmap, CS35L41_IRQ1_STATUS1, + int_status, int_status & pup_pdn_mask, + 1000, 100000); + if (ret) + dev_err(dev, "Enable(%d) failed: %d\n", enable, ret); + + // Clear PUP/PDN status + regmap_write(regmap, CS35L41_IRQ1_STATUS1, pup_pdn_mask); break; case CS35L41_INT_BOOST: ret = regmap_update_bits(regmap, CS35L41_PWR_CTRL1, CS35L41_GLOBAL_EN_MASK, enable << CS35L41_GLOBAL_EN_SHIFT); - usleep_range(3000, 3100); + if (ret) { + dev_err(dev, "CS35L41_PWR_CTRL1 set failed: %d\n", ret); + return ret; + } + + ret = regmap_read_poll_timeout(regmap, CS35L41_IRQ1_STATUS1, + int_status, int_status & pup_pdn_mask, + 1000, 100000); + if (ret) + dev_err(dev, "Enable(%d) failed: %d\n", enable, ret); + + /* Clear PUP/PDN status */ + regmap_write(regmap, CS35L41_IRQ1_STATUS1, pup_pdn_mask); break; case CS35L41_EXT_BOOST: case CS35L41_EXT_BOOST_NO_VSPK_SWITCH: - if (enable) - ret = regmap_multi_reg_write(regmap, cs35l41_safe_to_active, - ARRAY_SIZE(cs35l41_safe_to_active)); - else - ret = regmap_multi_reg_write(regmap, cs35l41_active_to_safe, - ARRAY_SIZE(cs35l41_active_to_safe)); + if (enable) { + /* Test Key is unlocked here */ + ret = regmap_multi_reg_write(regmap, cs35l41_safe_to_active_start, + ARRAY_SIZE(cs35l41_safe_to_active_start)); + if (ret) + return ret; + + ret = regmap_read_poll_timeout(regmap, CS35L41_IRQ1_STATUS1, int_status, + int_status & CS35L41_PUP_DONE_MASK, 1000, 100000); + if (ret) { + dev_err(dev, "Failed waiting for CS35L41_PUP_DONE_MASK: %d\n", ret); + /* Lock the test key, it was unlocked during the multi_reg_write */ + cs35l41_test_key_lock(dev, regmap); + return ret; + } + regmap_write(regmap, CS35L41_IRQ1_STATUS1, CS35L41_PUP_DONE_MASK); + + if (firmware_running) + ret = cs35l41_set_cspl_mbox_cmd(dev, regmap, + CSPL_MBOX_CMD_SPK_OUT_ENABLE); + else + ret = regmap_multi_reg_write(regmap, cs35l41_safe_to_active_en_spk, + ARRAY_SIZE(cs35l41_safe_to_active_en_spk)); + + /* Lock the test key, it was unlocked during the multi_reg_write */ + cs35l41_test_key_lock(dev, regmap); + } else { + /* Test Key is unlocked here */ + ret = regmap_multi_reg_write(regmap, cs35l41_active_to_safe_start, + ARRAY_SIZE(cs35l41_active_to_safe_start)); + if (ret) { + /* Lock the test key, it was unlocked during the multi_reg_write */ + cs35l41_test_key_lock(dev, regmap); + return ret; + } + + ret = regmap_read_poll_timeout(regmap, CS35L41_IRQ1_STATUS1, int_status, + int_status & CS35L41_PDN_DONE_MASK, 1000, 100000); + if (ret) { + dev_err(dev, "Failed waiting for CS35L41_PDN_DONE_MASK: %d\n", ret); + /* Lock the test key, it was unlocked during the multi_reg_write */ + cs35l41_test_key_lock(dev, regmap); + return ret; + } + regmap_write(regmap, CS35L41_IRQ1_STATUS1, CS35L41_PDN_DONE_MASK); + + /* Test Key is locked here */ + ret = regmap_multi_reg_write(regmap, cs35l41_active_to_safe_end, + ARRAY_SIZE(cs35l41_active_to_safe_end)); + } break; default: ret = -EINVAL; @@ -1344,6 +1429,8 @@ return (sts == CSPL_MBOX_STS_RUNNING); case CSPL_MBOX_CMD_STOP_PRE_REINIT: return (sts == CSPL_MBOX_STS_RDY_FOR_REINIT); + case CSPL_MBOX_CMD_SPK_OUT_ENABLE: + return (sts == CSPL_MBOX_STS_RUNNING); default: return false; } @@ -1373,6 +1460,11 @@ continue; } + if (sts == CSPL_MBOX_STS_ERROR || sts == CSPL_MBOX_STS_ERROR2) { + dev_err(dev, "CSPL Error Detected\n"); + return -EINVAL; + } + if (!cs35l41_check_cspl_mbox_sts(cmd, sts)) dev_dbg(dev, "[%u] cmd %u returned invalid sts %u", i, cmd, sts); else --- linux-azure-6.5.0.orig/sound/soc/codecs/cs35l41.c +++ linux-azure-6.5.0/sound/soc/codecs/cs35l41.c @@ -386,10 +386,18 @@ struct cs35l41_private *cs35l41 = data; unsigned int status[4] = { 0, 0, 0, 0 }; unsigned int masks[4] = { 0, 0, 0, 0 }; - int ret = IRQ_NONE; unsigned int i; + int ret; - pm_runtime_get_sync(cs35l41->dev); + ret = pm_runtime_resume_and_get(cs35l41->dev); + if (ret < 0) { + dev_err(cs35l41->dev, + "pm_runtime_resume_and_get failed in %s: %d\n", + __func__, ret); + return IRQ_NONE; + } + + ret = IRQ_NONE; for (i = 0; i < ARRAY_SIZE(status); i++) { regmap_read(cs35l41->regmap, @@ -491,7 +499,6 @@ { struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); struct cs35l41_private *cs35l41 = snd_soc_component_get_drvdata(component); - unsigned int val; int ret = 0; switch (event) { @@ -500,21 +507,12 @@ cs35l41_pup_patch, ARRAY_SIZE(cs35l41_pup_patch)); - cs35l41_global_enable(cs35l41->regmap, cs35l41->hw_cfg.bst_type, 1, - &cs35l41->pll_lock); + ret = cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type, + 1, &cs35l41->pll_lock, cs35l41->dsp.cs_dsp.running); break; case SND_SOC_DAPM_POST_PMD: - cs35l41_global_enable(cs35l41->regmap, cs35l41->hw_cfg.bst_type, 0, - &cs35l41->pll_lock); - - ret = regmap_read_poll_timeout(cs35l41->regmap, CS35L41_IRQ1_STATUS1, - val, val & CS35L41_PDN_DONE_MASK, - 1000, 100000); - if (ret) - dev_warn(cs35l41->dev, "PDN failed: %d\n", ret); - - regmap_write(cs35l41->regmap, CS35L41_IRQ1_STATUS1, - CS35L41_PDN_DONE_MASK); + ret = cs35l41_global_enable(cs35l41->dev, cs35l41->regmap, cs35l41->hw_cfg.bst_type, + 0, &cs35l41->pll_lock, cs35l41->dsp.cs_dsp.running); regmap_multi_reg_write_bypassed(cs35l41->regmap, cs35l41_pdn_patch, @@ -1283,6 +1281,8 @@ regmap_update_bits(cs35l41->regmap, CS35L41_IRQ1_MASK3, CS35L41_INT3_PLL_LOCK_MASK, 0 << CS35L41_INT3_PLL_LOCK_SHIFT); + init_completion(&cs35l41->pll_lock); + ret = devm_request_threaded_irq(cs35l41->dev, cs35l41->irq, NULL, cs35l41_irq, IRQF_ONESHOT | IRQF_SHARED | irq_pol, "cs35l41", cs35l41); @@ -1305,8 +1305,6 @@ if (ret < 0) goto err; - init_completion(&cs35l41->pll_lock); - pm_runtime_set_autosuspend_delay(cs35l41->dev, 3000); pm_runtime_use_autosuspend(cs35l41->dev); pm_runtime_mark_last_busy(cs35l41->dev); @@ -1330,6 +1328,7 @@ return 0; err_pm: + pm_runtime_dont_use_autosuspend(cs35l41->dev); pm_runtime_disable(cs35l41->dev); pm_runtime_put_noidle(cs35l41->dev); @@ -1346,6 +1345,7 @@ void cs35l41_remove(struct cs35l41_private *cs35l41) { pm_runtime_get_sync(cs35l41->dev); + pm_runtime_dont_use_autosuspend(cs35l41->dev); pm_runtime_disable(cs35l41->dev); regmap_write(cs35l41->regmap, CS35L41_IRQ1_MASK1, 0xFFFFFFFF); --- linux-azure-6.5.0.orig/sound/soc/codecs/cs35l45-i2c.c +++ linux-azure-6.5.0/sound/soc/codecs/cs35l45-i2c.c @@ -62,7 +62,7 @@ .driver = { .name = "cs35l45", .of_match_table = cs35l45_of_match, - .pm = &cs35l45_pm_ops, + .pm = pm_ptr(&cs35l45_pm_ops), }, .id_table = cs35l45_id_i2c, .probe = cs35l45_i2c_probe, --- linux-azure-6.5.0.orig/sound/soc/codecs/cs35l45-spi.c +++ linux-azure-6.5.0/sound/soc/codecs/cs35l45-spi.c @@ -64,7 +64,7 @@ .driver = { .name = "cs35l45", .of_match_table = cs35l45_of_match, - .pm = &cs35l45_pm_ops, + .pm = pm_ptr(&cs35l45_pm_ops), }, .id_table = cs35l45_id_spi, .probe = cs35l45_spi_probe, --- linux-azure-6.5.0.orig/sound/soc/codecs/cs35l45.c +++ linux-azure-6.5.0/sound/soc/codecs/cs35l45.c @@ -775,6 +775,8 @@ cs35l45_setup_hibernate(cs35l45); + regmap_set_bits(cs35l45->regmap, CS35L45_IRQ1_MASK_2, CS35L45_DSP_VIRT2_MBOX_MASK); + // Don't wait for ACK since bus activity would wake the device regmap_write(cs35l45->regmap, CS35L45_DSP_VIRT1_MBOX_1, CSPL_MBOX_CMD_HIBERNATE); @@ -795,6 +797,8 @@ CSPL_MBOX_CMD_OUT_OF_HIBERNATE); if (!ret) { dev_dbg(cs35l45->dev, "Wake success at cycle: %d\n", j); + regmap_clear_bits(cs35l45->regmap, CS35L45_IRQ1_MASK_2, + CS35L45_DSP_VIRT2_MBOX_MASK); return 0; } usleep_range(100, 200); @@ -810,7 +814,7 @@ return -ETIMEDOUT; } -static int __maybe_unused cs35l45_runtime_suspend(struct device *dev) +static int cs35l45_runtime_suspend(struct device *dev) { struct cs35l45_private *cs35l45 = dev_get_drvdata(dev); @@ -827,7 +831,7 @@ return 0; } -static int __maybe_unused cs35l45_runtime_resume(struct device *dev) +static int cs35l45_runtime_resume(struct device *dev) { struct cs35l45_private *cs35l45 = dev_get_drvdata(dev); int ret; @@ -854,6 +858,46 @@ return ret; } +static int cs35l45_sys_suspend(struct device *dev) +{ + struct cs35l45_private *cs35l45 = dev_get_drvdata(dev); + + dev_dbg(cs35l45->dev, "System suspend, disabling IRQ\n"); + disable_irq(cs35l45->irq); + + return 0; +} + +static int cs35l45_sys_suspend_noirq(struct device *dev) +{ + struct cs35l45_private *cs35l45 = dev_get_drvdata(dev); + + dev_dbg(cs35l45->dev, "Late system suspend, reenabling IRQ\n"); + enable_irq(cs35l45->irq); + + return 0; +} + +static int cs35l45_sys_resume_noirq(struct device *dev) +{ + struct cs35l45_private *cs35l45 = dev_get_drvdata(dev); + + dev_dbg(cs35l45->dev, "Early system resume, disabling IRQ\n"); + disable_irq(cs35l45->irq); + + return 0; +} + +static int cs35l45_sys_resume(struct device *dev) +{ + struct cs35l45_private *cs35l45 = dev_get_drvdata(dev); + + dev_dbg(cs35l45->dev, "System resume, reenabling IRQ\n"); + enable_irq(cs35l45->irq); + + return 0; +} + static int cs35l45_apply_property_config(struct cs35l45_private *cs35l45) { struct device_node *node = cs35l45->dev->of_node; @@ -1288,10 +1332,12 @@ } EXPORT_SYMBOL_NS_GPL(cs35l45_remove, SND_SOC_CS35L45); -const struct dev_pm_ops cs35l45_pm_ops = { - SET_RUNTIME_PM_OPS(cs35l45_runtime_suspend, cs35l45_runtime_resume, NULL) +EXPORT_GPL_DEV_PM_OPS(cs35l45_pm_ops) = { + RUNTIME_PM_OPS(cs35l45_runtime_suspend, cs35l45_runtime_resume, NULL) + + SYSTEM_SLEEP_PM_OPS(cs35l45_sys_suspend, cs35l45_sys_resume) + NOIRQ_SYSTEM_SLEEP_PM_OPS(cs35l45_sys_suspend_noirq, cs35l45_sys_resume_noirq) }; -EXPORT_SYMBOL_NS_GPL(cs35l45_pm_ops, SND_SOC_CS35L45); MODULE_DESCRIPTION("ASoC CS35L45 driver"); MODULE_AUTHOR("James Schulman, Cirrus Logic Inc, "); --- linux-azure-6.5.0.orig/sound/soc/codecs/cs35l56-i2c.c +++ linux-azure-6.5.0/sound/soc/codecs/cs35l56-i2c.c @@ -27,7 +27,6 @@ return -ENOMEM; cs35l56->dev = dev; - cs35l56->can_hibernate = true; i2c_set_clientdata(client, cs35l56); cs35l56->regmap = devm_regmap_init_i2c(client, regmap_config); --- linux-azure-6.5.0.orig/sound/soc/codecs/cs35l56.c +++ linux-azure-6.5.0/sound/soc/codecs/cs35l56.c @@ -879,7 +879,7 @@ mutex_lock(&cs35l56->irq_lock); - init_completion(&cs35l56->init_completion); + reinit_completion(&cs35l56->init_completion); cs35l56_system_reset(cs35l56); @@ -1594,6 +1594,7 @@ flush_workqueue(cs35l56->dsp_wq); destroy_workqueue(cs35l56->dsp_wq); + pm_runtime_dont_use_autosuspend(cs35l56->dev); pm_runtime_suspend(cs35l56->dev); pm_runtime_disable(cs35l56->dev); --- linux-azure-6.5.0.orig/sound/soc/codecs/cs42l42-sdw.c +++ linux-azure-6.5.0/sound/soc/codecs/cs42l42-sdw.c @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -344,6 +345,16 @@ switch (status) { case SDW_SLAVE_ATTACHED: dev_dbg(cs42l42->dev, "ATTACHED\n"); + + /* + * The SoundWire core can report stale ATTACH notifications + * if we hard-reset CS42L42 in probe() but it had already been + * enumerated. Reject the ATTACH if we haven't yet seen an + * UNATTACH report for the device being in reset. + */ + if (cs42l42->sdw_waiting_first_unattach) + break; + /* * Initialise codec, this only needs to be done once. * When resuming from suspend, resume callback will handle re-init of codec, @@ -354,6 +365,16 @@ break; case SDW_SLAVE_UNATTACHED: dev_dbg(cs42l42->dev, "UNATTACHED\n"); + + if (cs42l42->sdw_waiting_first_unattach) { + /* + * SoundWire core has seen that CS42L42 is not on + * the bus so release RESET and wait for ATTACH. + */ + cs42l42->sdw_waiting_first_unattach = false; + gpiod_set_value_cansleep(cs42l42->reset_gpio, 1); + } + break; default: break; --- linux-azure-6.5.0.orig/sound/soc/codecs/cs42l42.c +++ linux-azure-6.5.0/sound/soc/codecs/cs42l42.c @@ -2320,7 +2320,26 @@ if (cs42l42->reset_gpio) { dev_dbg(cs42l42->dev, "Found reset GPIO\n"); - gpiod_set_value_cansleep(cs42l42->reset_gpio, 1); + + /* + * ACPI can override the default GPIO state we requested + * so ensure that we start with RESET low. + */ + gpiod_set_value_cansleep(cs42l42->reset_gpio, 0); + + /* Ensure minimum reset pulse width */ + usleep_range(10, 500); + + /* + * On SoundWire keep the chip in reset until we get an UNATTACH + * notification from the SoundWire core. This acts as a + * synchronization point to reject stale ATTACH notifications + * if the chip was already enumerated before we reset it. + */ + if (cs42l42->sdw_peripheral) + cs42l42->sdw_waiting_first_unattach = true; + else + gpiod_set_value_cansleep(cs42l42->reset_gpio, 1); } usleep_range(CS42L42_BOOT_TIME_US, CS42L42_BOOT_TIME_US * 2); --- linux-azure-6.5.0.orig/sound/soc/codecs/cs42l42.h +++ linux-azure-6.5.0/sound/soc/codecs/cs42l42.h @@ -53,6 +53,7 @@ u8 stream_use; bool hp_adc_up_pending; bool suspended; + bool sdw_waiting_first_unattach; bool init_done; }; --- linux-azure-6.5.0.orig/sound/soc/codecs/cs43130.c +++ linux-azure-6.5.0/sound/soc/codecs/cs43130.c @@ -579,7 +579,7 @@ break; case SND_SOC_DAIFMT_LEFT_J: hi_size = bitwidth_sclk; - frm_delay = 2; + frm_delay = 0; frm_phase = 1; break; case SND_SOC_DAIFMT_DSP_A: @@ -1683,7 +1683,7 @@ return cs43130_show_dc(dev, buf, HP_RIGHT); } -static u16 const cs43130_ac_freq[CS43130_AC_FREQ] = { +static const u16 cs43130_ac_freq[CS43130_AC_FREQ] = { 24, 43, 93, @@ -2363,7 +2363,7 @@ .use_single_write = true, }; -static u16 const cs43130_dc_threshold[CS43130_DC_THRESHOLD] = { +static const u16 cs43130_dc_threshold[CS43130_DC_THRESHOLD] = { 50, 120, }; --- linux-azure-6.5.0.orig/sound/soc/codecs/cs43130.h +++ linux-azure-6.5.0/sound/soc/codecs/cs43130.h @@ -381,88 +381,88 @@ /* frm_size = 16 */ static const struct cs43130_clk_gen cs43130_16_clk_gen[] = { - { 22579200, 32000, .v = { 441, 10, }, }, - { 22579200, 44100, .v = { 32, 1, }, }, - { 22579200, 48000, .v = { 147, 5, }, }, - { 22579200, 88200, .v = { 16, 1, }, }, - { 22579200, 96000, .v = { 147, 10, }, }, - { 22579200, 176400, .v = { 8, 1, }, }, - { 22579200, 192000, .v = { 147, 20, }, }, - { 22579200, 352800, .v = { 4, 1, }, }, - { 22579200, 384000, .v = { 147, 40, }, }, - { 24576000, 32000, .v = { 48, 1, }, }, - { 24576000, 44100, .v = { 5120, 147, }, }, - { 24576000, 48000, .v = { 32, 1, }, }, - { 24576000, 88200, .v = { 2560, 147, }, }, - { 24576000, 96000, .v = { 16, 1, }, }, - { 24576000, 176400, .v = { 1280, 147, }, }, - { 24576000, 192000, .v = { 8, 1, }, }, - { 24576000, 352800, .v = { 640, 147, }, }, - { 24576000, 384000, .v = { 4, 1, }, }, + { 22579200, 32000, .v = { 10, 441, }, }, + { 22579200, 44100, .v = { 1, 32, }, }, + { 22579200, 48000, .v = { 5, 147, }, }, + { 22579200, 88200, .v = { 1, 16, }, }, + { 22579200, 96000, .v = { 10, 147, }, }, + { 22579200, 176400, .v = { 1, 8, }, }, + { 22579200, 192000, .v = { 20, 147, }, }, + { 22579200, 352800, .v = { 1, 4, }, }, + { 22579200, 384000, .v = { 40, 147, }, }, + { 24576000, 32000, .v = { 1, 48, }, }, + { 24576000, 44100, .v = { 147, 5120, }, }, + { 24576000, 48000, .v = { 1, 32, }, }, + { 24576000, 88200, .v = { 147, 2560, }, }, + { 24576000, 96000, .v = { 1, 16, }, }, + { 24576000, 176400, .v = { 147, 1280, }, }, + { 24576000, 192000, .v = { 1, 8, }, }, + { 24576000, 352800, .v = { 147, 640, }, }, + { 24576000, 384000, .v = { 1, 4, }, }, }; /* frm_size = 32 */ static const struct cs43130_clk_gen cs43130_32_clk_gen[] = { - { 22579200, 32000, .v = { 441, 20, }, }, - { 22579200, 44100, .v = { 16, 1, }, }, - { 22579200, 48000, .v = { 147, 10, }, }, - { 22579200, 88200, .v = { 8, 1, }, }, - { 22579200, 96000, .v = { 147, 20, }, }, - { 22579200, 176400, .v = { 4, 1, }, }, - { 22579200, 192000, .v = { 147, 40, }, }, - { 22579200, 352800, .v = { 2, 1, }, }, - { 22579200, 384000, .v = { 147, 80, }, }, - { 24576000, 32000, .v = { 24, 1, }, }, - { 24576000, 44100, .v = { 2560, 147, }, }, - { 24576000, 48000, .v = { 16, 1, }, }, - { 24576000, 88200, .v = { 1280, 147, }, }, - { 24576000, 96000, .v = { 8, 1, }, }, - { 24576000, 176400, .v = { 640, 147, }, }, - { 24576000, 192000, .v = { 4, 1, }, }, - { 24576000, 352800, .v = { 320, 147, }, }, - { 24576000, 384000, .v = { 2, 1, }, }, + { 22579200, 32000, .v = { 20, 441, }, }, + { 22579200, 44100, .v = { 1, 16, }, }, + { 22579200, 48000, .v = { 10, 147, }, }, + { 22579200, 88200, .v = { 1, 8, }, }, + { 22579200, 96000, .v = { 20, 147, }, }, + { 22579200, 176400, .v = { 1, 4, }, }, + { 22579200, 192000, .v = { 40, 147, }, }, + { 22579200, 352800, .v = { 1, 2, }, }, + { 22579200, 384000, .v = { 80, 147, }, }, + { 24576000, 32000, .v = { 1, 24, }, }, + { 24576000, 44100, .v = { 147, 2560, }, }, + { 24576000, 48000, .v = { 1, 16, }, }, + { 24576000, 88200, .v = { 147, 1280, }, }, + { 24576000, 96000, .v = { 1, 8, }, }, + { 24576000, 176400, .v = { 147, 640, }, }, + { 24576000, 192000, .v = { 1, 4, }, }, + { 24576000, 352800, .v = { 147, 320, }, }, + { 24576000, 384000, .v = { 1, 2, }, }, }; /* frm_size = 48 */ static const struct cs43130_clk_gen cs43130_48_clk_gen[] = { - { 22579200, 32000, .v = { 147, 100, }, }, - { 22579200, 44100, .v = { 32, 3, }, }, - { 22579200, 48000, .v = { 49, 5, }, }, - { 22579200, 88200, .v = { 16, 3, }, }, - { 22579200, 96000, .v = { 49, 10, }, }, - { 22579200, 176400, .v = { 8, 3, }, }, - { 22579200, 192000, .v = { 49, 20, }, }, - { 22579200, 352800, .v = { 4, 3, }, }, - { 22579200, 384000, .v = { 49, 40, }, }, - { 24576000, 32000, .v = { 16, 1, }, }, - { 24576000, 44100, .v = { 5120, 441, }, }, - { 24576000, 48000, .v = { 32, 3, }, }, - { 24576000, 88200, .v = { 2560, 441, }, }, - { 24576000, 96000, .v = { 16, 3, }, }, - { 24576000, 176400, .v = { 1280, 441, }, }, - { 24576000, 192000, .v = { 8, 3, }, }, - { 24576000, 352800, .v = { 640, 441, }, }, - { 24576000, 384000, .v = { 4, 3, }, }, + { 22579200, 32000, .v = { 100, 147, }, }, + { 22579200, 44100, .v = { 3, 32, }, }, + { 22579200, 48000, .v = { 5, 49, }, }, + { 22579200, 88200, .v = { 3, 16, }, }, + { 22579200, 96000, .v = { 10, 49, }, }, + { 22579200, 176400, .v = { 3, 8, }, }, + { 22579200, 192000, .v = { 20, 49, }, }, + { 22579200, 352800, .v = { 3, 4, }, }, + { 22579200, 384000, .v = { 40, 49, }, }, + { 24576000, 32000, .v = { 1, 16, }, }, + { 24576000, 44100, .v = { 441, 5120, }, }, + { 24576000, 48000, .v = { 3, 32, }, }, + { 24576000, 88200, .v = { 441, 2560, }, }, + { 24576000, 96000, .v = { 3, 16, }, }, + { 24576000, 176400, .v = { 441, 1280, }, }, + { 24576000, 192000, .v = { 3, 8, }, }, + { 24576000, 352800, .v = { 441, 640, }, }, + { 24576000, 384000, .v = { 3, 4, }, }, }; /* frm_size = 64 */ static const struct cs43130_clk_gen cs43130_64_clk_gen[] = { - { 22579200, 32000, .v = { 441, 40, }, }, - { 22579200, 44100, .v = { 8, 1, }, }, - { 22579200, 48000, .v = { 147, 20, }, }, - { 22579200, 88200, .v = { 4, 1, }, }, - { 22579200, 96000, .v = { 147, 40, }, }, - { 22579200, 176400, .v = { 2, 1, }, }, - { 22579200, 192000, .v = { 147, 80, }, }, + { 22579200, 32000, .v = { 40, 441, }, }, + { 22579200, 44100, .v = { 1, 8, }, }, + { 22579200, 48000, .v = { 20, 147, }, }, + { 22579200, 88200, .v = { 1, 4, }, }, + { 22579200, 96000, .v = { 40, 147, }, }, + { 22579200, 176400, .v = { 1, 2, }, }, + { 22579200, 192000, .v = { 80, 147, }, }, { 22579200, 352800, .v = { 1, 1, }, }, - { 24576000, 32000, .v = { 12, 1, }, }, - { 24576000, 44100, .v = { 1280, 147, }, }, - { 24576000, 48000, .v = { 8, 1, }, }, - { 24576000, 88200, .v = { 640, 147, }, }, - { 24576000, 96000, .v = { 4, 1, }, }, - { 24576000, 176400, .v = { 320, 147, }, }, - { 24576000, 192000, .v = { 2, 1, }, }, - { 24576000, 352800, .v = { 160, 147, }, }, + { 24576000, 32000, .v = { 1, 12, }, }, + { 24576000, 44100, .v = { 147, 1280, }, }, + { 24576000, 48000, .v = { 1, 8, }, }, + { 24576000, 88200, .v = { 147, 640, }, }, + { 24576000, 96000, .v = { 1, 4, }, }, + { 24576000, 176400, .v = { 147, 320, }, }, + { 24576000, 192000, .v = { 1, 2, }, }, + { 24576000, 352800, .v = { 147, 160, }, }, { 24576000, 384000, .v = { 1, 1, }, }, }; --- linux-azure-6.5.0.orig/sound/soc/codecs/da7219-aad.c +++ linux-azure-6.5.0/sound/soc/codecs/da7219-aad.c @@ -59,9 +59,6 @@ bool micbias_up = false; int retries = 0; - /* Disable ground switch */ - snd_soc_component_update_bits(component, 0xFB, 0x01, 0x00); - /* Drive headphones/lineout */ snd_soc_component_update_bits(component, DA7219_HP_L_CTRL, DA7219_HP_L_AMP_OE_MASK, @@ -155,9 +152,6 @@ tonegen_freq_hptest = cpu_to_le16(DA7219_AAD_HPTEST_RAMP_FREQ_INT_OSC); } - /* Disable ground switch */ - snd_soc_component_update_bits(component, 0xFB, 0x01, 0x00); - /* Ensure gain ramping at fastest rate */ gain_ramp_ctrl = snd_soc_component_read(component, DA7219_GAIN_RAMP_CTRL); snd_soc_component_write(component, DA7219_GAIN_RAMP_CTRL, DA7219_GAIN_RAMP_RATE_X8); @@ -421,6 +415,11 @@ * handle a removal, and we can check at the end of * hptest if we have a valid result or not. */ + + cancel_delayed_work_sync(&da7219_aad->jack_det_work); + /* Disable ground switch */ + snd_soc_component_update_bits(component, 0xFB, 0x01, 0x00); + if (statusa & DA7219_JACK_TYPE_STS_MASK) { report |= SND_JACK_HEADSET; mask |= SND_JACK_HEADSET | SND_JACK_LINEOUT; @@ -697,7 +696,7 @@ aad_pdata->mic_det_thr = da7219_aad_fw_mic_det_thr(dev, fw_val32); else - aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_500_OHMS; + aad_pdata->mic_det_thr = DA7219_AAD_MIC_DET_THR_200_OHMS; if (fwnode_property_read_u32(aad_np, "dlg,jack-ins-deb", &fw_val32) >= 0) aad_pdata->jack_ins_deb = --- linux-azure-6.5.0.orig/sound/soc/codecs/hdac_hda.c +++ linux-azure-6.5.0/sound/soc/codecs/hdac_hda.c @@ -124,6 +124,9 @@ .sig_bits = 24, }, }, +}; + +static struct snd_soc_dai_driver hdac_hda_hdmi_dais[] = { { .id = HDAC_HDMI_0_DAI_ID, .name = "intel-hdmi-hifi1", @@ -578,8 +581,16 @@ .endianness = 1, }; +static const struct snd_soc_component_driver hdac_hda_hdmi_codec = { + .probe = hdac_hda_codec_probe, + .remove = hdac_hda_codec_remove, + .idle_bias_on = false, + .endianness = 1, +}; + static int hdac_hda_dev_probe(struct hdac_device *hdev) { + struct hdac_hda_priv *hda_pvt = dev_get_drvdata(&hdev->dev); struct hdac_ext_link *hlink; int ret; @@ -592,9 +603,15 @@ snd_hdac_ext_bus_link_get(hdev->bus, hlink); /* ASoC specific initialization */ - ret = devm_snd_soc_register_component(&hdev->dev, - &hdac_hda_codec, hdac_hda_dais, - ARRAY_SIZE(hdac_hda_dais)); + if (hda_pvt->need_display_power) + ret = devm_snd_soc_register_component(&hdev->dev, + &hdac_hda_hdmi_codec, hdac_hda_hdmi_dais, + ARRAY_SIZE(hdac_hda_hdmi_dais)); + else + ret = devm_snd_soc_register_component(&hdev->dev, + &hdac_hda_codec, hdac_hda_dais, + ARRAY_SIZE(hdac_hda_dais)); + if (ret < 0) { dev_err(&hdev->dev, "failed to register HDA codec %d\n", ret); return ret; --- linux-azure-6.5.0.orig/sound/soc/codecs/hdmi-codec.c +++ linux-azure-6.5.0/sound/soc/codecs/hdmi-codec.c @@ -531,7 +531,10 @@ hp->sample_rate = sample_rate; hp->channels = channels; - hcp->chmap_idx = idx; + if (pcm_audio) + hcp->chmap_idx = ca_id; + else + hcp->chmap_idx = HDMI_CODEC_CHMAP_IDX_UNKNOWN; return 0; } @@ -865,8 +868,9 @@ static void hdmi_codec_jack_report(struct hdmi_codec_priv *hcp, unsigned int jack_status) { - if (hcp->jack && jack_status != hcp->jack_status) { - snd_soc_jack_report(hcp->jack, jack_status, SND_JACK_LINEOUT); + if (jack_status != hcp->jack_status) { + if (hcp->jack) + snd_soc_jack_report(hcp->jack, jack_status, SND_JACK_LINEOUT); hcp->jack_status = jack_status; } } @@ -892,18 +896,20 @@ void *data) { struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component); - int ret = -ENOTSUPP; if (hcp->hcd.ops->hook_plugged_cb) { hcp->jack = jack; - ret = hcp->hcd.ops->hook_plugged_cb(component->dev->parent, - hcp->hcd.data, - plugged_cb, - component->dev); - if (ret) - hcp->jack = NULL; + + /* + * Report the initial jack status which may have been provided + * by the parent hdmi driver while the hpd hook was registered. + */ + snd_soc_jack_report(jack, hcp->jack_status, SND_JACK_LINEOUT); + + return 0; } - return ret; + + return -ENOTSUPP; } static int hdmi_dai_spdif_probe(struct snd_soc_dai *dai) @@ -979,6 +985,21 @@ return ret; } +static int hdmi_probe(struct snd_soc_component *component) +{ + struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component); + int ret = 0; + + if (hcp->hcd.ops->hook_plugged_cb) { + ret = hcp->hcd.ops->hook_plugged_cb(component->dev->parent, + hcp->hcd.data, + plugged_cb, + component->dev); + } + + return ret; +} + static void hdmi_remove(struct snd_soc_component *component) { struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component); @@ -989,6 +1010,7 @@ } static const struct snd_soc_component_driver hdmi_driver = { + .probe = hdmi_probe, .remove = hdmi_remove, .dapm_widgets = hdmi_widgets, .num_dapm_widgets = ARRAY_SIZE(hdmi_widgets), --- linux-azure-6.5.0.orig/sound/soc/codecs/lpass-tx-macro.c +++ linux-azure-6.5.0/sound/soc/codecs/lpass-tx-macro.c @@ -2021,6 +2021,11 @@ tx->dev = dev; + /* Set active_decimator default value */ + tx->active_decimator[TX_MACRO_AIF1_CAP] = -1; + tx->active_decimator[TX_MACRO_AIF2_CAP] = -1; + tx->active_decimator[TX_MACRO_AIF3_CAP] = -1; + /* set MCLK and NPL rates */ clk_set_rate(tx->mclk, MCLK_FREQ); clk_set_rate(tx->npl, MCLK_FREQ); --- linux-azure-6.5.0.orig/sound/soc/codecs/lpass-wsa-macro.c +++ linux-azure-6.5.0/sound/soc/codecs/lpass-wsa-macro.c @@ -1685,6 +1685,9 @@ boost_path_cfg1 = CDC_WSA_RX1_RX_PATH_CFG1; reg = CDC_WSA_RX1_RX_PATH_CTL; reg_mix = CDC_WSA_RX1_RX_PATH_MIX_CTL; + } else { + dev_warn(component->dev, "Incorrect widget name in the driver\n"); + return -EINVAL; } switch (event) { --- linux-azure-6.5.0.orig/sound/soc/codecs/nau8822.c +++ linux-azure-6.5.0/sound/soc/codecs/nau8822.c @@ -184,6 +184,7 @@ struct soc_bytes_ext *params = (void *)kcontrol->private_value; int i, reg; u16 reg_val, *val; + __be16 tmp; val = (u16 *)ucontrol->value.bytes.data; reg = NAU8822_REG_EQ1; @@ -192,8 +193,8 @@ /* conversion of 16-bit integers between native CPU format * and big endian format */ - reg_val = cpu_to_be16(reg_val); - memcpy(val + i, ®_val, sizeof(reg_val)); + tmp = cpu_to_be16(reg_val); + memcpy(val + i, &tmp, sizeof(tmp)); } return 0; @@ -216,6 +217,7 @@ void *data; u16 *val, value; int i, reg, ret; + __be16 *tmp; data = kmemdup(ucontrol->value.bytes.data, params->max, GFP_KERNEL | GFP_DMA); @@ -228,7 +230,8 @@ /* conversion of 16-bit integers between native CPU format * and big endian format */ - value = be16_to_cpu(*(val + i)); + tmp = (__be16 *)(val + i); + value = be16_to_cpup(tmp); ret = snd_soc_component_write(component, reg + i, value); if (ret) { dev_err(component->dev, --- linux-azure-6.5.0.orig/sound/soc/codecs/rt5640.c +++ linux-azure-6.5.0/sound/soc/codecs/rt5640.c @@ -2404,13 +2404,11 @@ struct rt5640_priv *rt5640 = data; int delay = 0; - if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER) { - cancel_delayed_work_sync(&rt5640->jack_work); + if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER) delay = 100; - } if (rt5640->jack) - queue_delayed_work(system_long_wq, &rt5640->jack_work, delay); + mod_delayed_work(system_long_wq, &rt5640->jack_work, delay); return IRQ_HANDLED; } @@ -2566,12 +2564,11 @@ if (jack_data && jack_data->use_platform_clock) rt5640->use_platform_clock = jack_data->use_platform_clock; - ret = devm_request_threaded_irq(component->dev, rt5640->irq, - NULL, rt5640_irq, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, - "rt5640", rt5640); + ret = request_irq(rt5640->irq, rt5640_irq, + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "rt5640", rt5640); if (ret) { - dev_warn(component->dev, "Failed to reguest IRQ %d: %d\n", rt5640->irq, ret); + dev_warn(component->dev, "Failed to request IRQ %d: %d\n", rt5640->irq, ret); rt5640_disable_jack_detect(component); return; } @@ -2622,14 +2619,14 @@ rt5640->jack = jack; - ret = devm_request_threaded_irq(component->dev, rt5640->irq, - NULL, rt5640_irq, IRQF_TRIGGER_RISING | IRQF_ONESHOT, - "rt5640", rt5640); + ret = request_irq(rt5640->irq, rt5640_irq, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, "rt5640", rt5640); if (ret) { - dev_warn(component->dev, "Failed to reguest IRQ %d: %d\n", rt5640->irq, ret); - rt5640->irq = -ENXIO; + dev_warn(component->dev, "Failed to request IRQ %d: %d\n", rt5640->irq, ret); + rt5640->jack = NULL; return; } + rt5640->irq_requested = true; /* sync initial jack state */ queue_delayed_work(system_long_wq, &rt5640->jack_work, 0); @@ -2802,12 +2799,12 @@ { struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); - if (rt5640->irq) { + if (rt5640->jack) { /* disable jack interrupts during system suspend */ disable_irq(rt5640->irq); + rt5640_cancel_work(rt5640); } - rt5640_cancel_work(rt5640); snd_soc_component_force_bias_level(component, SND_SOC_BIAS_OFF); rt5640_reset(component); regcache_cache_only(rt5640->regmap, true); @@ -2830,9 +2827,6 @@ regcache_cache_only(rt5640->regmap, false); regcache_sync(rt5640->regmap); - if (rt5640->irq) - enable_irq(rt5640->irq); - if (rt5640->jack) { if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER) { snd_soc_component_update_bits(component, @@ -2860,6 +2854,7 @@ } } + enable_irq(rt5640->irq); queue_delayed_work(system_long_wq, &rt5640->jack_work, 0); } --- linux-azure-6.5.0.orig/sound/soc/codecs/rt5645.c +++ linux-azure-6.5.0/sound/soc/codecs/rt5645.c @@ -448,6 +448,7 @@ struct regulator_bulk_data supplies[ARRAY_SIZE(rt5645_supply_names)]; struct rt5645_eq_param_s *eq_param; struct timer_list btn_check_timer; + struct mutex jd_mutex; int codec_type; int sysclk; @@ -3189,6 +3190,8 @@ rt5645_enable_push_button_irq(component, true); } } else { + if (rt5645->en_button_func) + rt5645_enable_push_button_irq(component, false); snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); snd_soc_dapm_sync(dapm); rt5645->jack_type = SND_JACK_HEADPHONE; @@ -3251,6 +3254,8 @@ RT5645_GP1_PIN_IRQ, RT5645_GP1_PIN_IRQ); regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL1, RT5645_DIG_GATE_CTRL, RT5645_DIG_GATE_CTRL); + regmap_update_bits(rt5645->regmap, RT5645_DEPOP_M1, + RT5645_HP_CB_MASK, RT5645_HP_CB_PU); } rt5645_irq(0, rt5645); @@ -3267,6 +3272,8 @@ if (!rt5645->component) return; + mutex_lock(&rt5645->jd_mutex); + switch (rt5645->pdata.jd_mode) { case 0: /* Not using rt5645 JD */ if (rt5645->gpiod_hp_det) { @@ -3293,7 +3300,7 @@ if (!val && (rt5645->jack_type == 0)) { /* jack in */ report = rt5645_jack_detect(rt5645->component, 1); - } else if (!val && rt5645->jack_type != 0) { + } else if (!val && rt5645->jack_type == SND_JACK_HEADSET) { /* for push button and jack out */ btn_type = 0; if (snd_soc_component_read(rt5645->component, RT5645_INT_IRQ_ST) & 0x4) { @@ -3349,6 +3356,8 @@ rt5645_jack_detect(rt5645->component, 0); } + mutex_unlock(&rt5645->jd_mutex); + snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE); snd_soc_jack_report(rt5645->mic_jack, report, SND_JACK_MICROPHONE); if (rt5645->en_button_func) @@ -4121,6 +4130,7 @@ } timer_setup(&rt5645->btn_check_timer, rt5645_btn_check_callback, 0); + mutex_init(&rt5645->jd_mutex); INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work); INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work); --- linux-azure-6.5.0.orig/sound/soc/codecs/tas2780.c +++ linux-azure-6.5.0/sound/soc/codecs/tas2780.c @@ -39,7 +39,7 @@ usleep_range(2000, 2050); } - snd_soc_component_write(tas2780->component, TAS2780_SW_RST, + ret = snd_soc_component_write(tas2780->component, TAS2780_SW_RST, TAS2780_RST); if (ret) dev_err(tas2780->dev, "%s:errCode:0x%x Reset error!\n", --- linux-azure-6.5.0.orig/sound/soc/codecs/tas2781-fmwlib.c +++ linux-azure-6.5.0/sound/soc/codecs/tas2781-fmwlib.c @@ -2219,11 +2219,11 @@ goto out; } - conf = &(tas_fmw->configs[cfg_no]); for (i = 0, prog_status = 0; i < tas_priv->ndev; i++) { if (cfg_info[rca_conf_no]->active_dev & (1 << i)) { - if (tas_priv->tasdevice[i].cur_prog != prm_no - || tas_priv->force_fwload_status) { + if (prm_no >= 0 + && (tas_priv->tasdevice[i].cur_prog != prm_no + || tas_priv->force_fwload_status)) { tas_priv->tasdevice[i].cur_conf = -1; tas_priv->tasdevice[i].is_loading = true; prog_status++; @@ -2258,7 +2258,8 @@ } for (i = 0, status = 0; i < tas_priv->ndev; i++) { - if (tas_priv->tasdevice[i].cur_conf != cfg_no + if (cfg_no >= 0 + && tas_priv->tasdevice[i].cur_conf != cfg_no && (cfg_info[rca_conf_no]->active_dev & (1 << i)) && (tas_priv->tasdevice[i].is_loaderr == false)) { status++; @@ -2268,6 +2269,7 @@ } if (status) { + conf = &(tas_fmw->configs[cfg_no]); status = 0; tasdevice_load_data(tas_priv, &(conf->dev_data)); for (i = 0; i < tas_priv->ndev; i++) { @@ -2311,7 +2313,7 @@ } for (i = 0, prog_status = 0; i < tas_priv->ndev; i++) { - if (tas_priv->tasdevice[i].cur_prog != prm_no) { + if (prm_no >= 0 && tas_priv->tasdevice[i].cur_prog != prm_no) { tas_priv->tasdevice[i].cur_conf = -1; tas_priv->tasdevice[i].is_loading = true; prog_status++; @@ -2356,7 +2358,7 @@ } for (i = 0, prog_status = 0; i < tas_priv->ndev; i++) { - if (tas_priv->tasdevice[i].cur_prog != prm_no) { + if (prm_no >= 0 && tas_priv->tasdevice[i].cur_prog != prm_no) { tas_priv->tasdevice[i].cur_conf = -1; tas_priv->tasdevice[i].is_loading = true; prog_status++; --- linux-azure-6.5.0.orig/sound/soc/codecs/tlv320adc3xxx.c +++ linux-azure-6.5.0/sound/soc/codecs/tlv320adc3xxx.c @@ -293,7 +293,7 @@ #define ADC3XXX_BYPASS_RPGA 0x80 /* MICBIAS control bits */ -#define ADC3XXX_MICBIAS_MASK 0x2 +#define ADC3XXX_MICBIAS_MASK 0x3 #define ADC3XXX_MICBIAS1_SHIFT 5 #define ADC3XXX_MICBIAS2_SHIFT 3 @@ -1099,7 +1099,7 @@ unsigned int val; if (!of_property_read_u32(np, propname, &val)) { - if (val >= ADC3XXX_MICBIAS_AVDD) { + if (val > ADC3XXX_MICBIAS_AVDD) { dev_err(dev, "Invalid property value for '%s'\n", propname); return -EINVAL; } --- linux-azure-6.5.0.orig/sound/soc/codecs/wcd938x-sdw.c +++ linux-azure-6.5.0/sound/soc/codecs/wcd938x-sdw.c @@ -1278,7 +1278,31 @@ pm_runtime_set_active(dev); pm_runtime_enable(dev); - return component_add(dev, &wcd938x_sdw_component_ops); + ret = component_add(dev, &wcd938x_sdw_component_ops); + if (ret) + goto err_disable_rpm; + + return 0; + +err_disable_rpm: + pm_runtime_disable(dev); + pm_runtime_set_suspended(dev); + pm_runtime_dont_use_autosuspend(dev); + + return ret; +} + +static int wcd9380_remove(struct sdw_slave *pdev) +{ + struct device *dev = &pdev->dev; + + component_del(dev, &wcd938x_sdw_component_ops); + + pm_runtime_disable(dev); + pm_runtime_set_suspended(dev); + pm_runtime_dont_use_autosuspend(dev); + + return 0; } static const struct sdw_device_id wcd9380_slave_id[] = { @@ -1320,6 +1344,7 @@ static struct sdw_driver wcd9380_codec_driver = { .probe = wcd9380_probe, + .remove = wcd9380_remove, .ops = &wcd9380_slave_ops, .id_table = wcd9380_slave_id, .driver = { --- linux-azure-6.5.0.orig/sound/soc/codecs/wcd938x.c +++ linux-azure-6.5.0/sound/soc/codecs/wcd938x.c @@ -3325,8 +3325,10 @@ return dev_err_probe(dev, ret, "Failed to get supplies\n"); ret = regulator_bulk_enable(WCD938X_MAX_SUPPLY, wcd938x->supplies); - if (ret) + if (ret) { + regulator_bulk_free(WCD938X_MAX_SUPPLY, wcd938x->supplies); return dev_err_probe(dev, ret, "Failed to enable supplies\n"); + } wcd938x_dt_parse_micbias_info(dev, wcd938x); @@ -3435,7 +3437,8 @@ wcd938x->rxdev = wcd938x_sdw_device_get(wcd938x->rxnode); if (!wcd938x->rxdev) { dev_err(dev, "could not find slave with matching of node\n"); - return -EINVAL; + ret = -EINVAL; + goto err_unbind; } wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev); wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x; @@ -3443,46 +3446,47 @@ wcd938x->txdev = wcd938x_sdw_device_get(wcd938x->txnode); if (!wcd938x->txdev) { dev_err(dev, "could not find txslave with matching of node\n"); - return -EINVAL; + ret = -EINVAL; + goto err_put_rxdev; } wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev); wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x; wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev); - if (!wcd938x->tx_sdw_dev) { - dev_err(dev, "could not get txslave with matching of dev\n"); - return -EINVAL; - } /* As TX is main CSR reg interface, which should not be suspended first. * expicilty add the dependency link */ if (!device_link_add(wcd938x->rxdev, wcd938x->txdev, DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME)) { dev_err(dev, "could not devlink tx and rx\n"); - return -EINVAL; + ret = -EINVAL; + goto err_put_txdev; } if (!device_link_add(dev, wcd938x->txdev, DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME)) { dev_err(dev, "could not devlink wcd and tx\n"); - return -EINVAL; + ret = -EINVAL; + goto err_remove_rxtx_link; } if (!device_link_add(dev, wcd938x->rxdev, DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME)) { dev_err(dev, "could not devlink wcd and rx\n"); - return -EINVAL; + ret = -EINVAL; + goto err_remove_tx_link; } wcd938x->regmap = dev_get_regmap(&wcd938x->tx_sdw_dev->dev, NULL); if (!wcd938x->regmap) { dev_err(dev, "could not get TX device regmap\n"); - return -EINVAL; + ret = -EINVAL; + goto err_remove_rx_link; } ret = wcd938x_irq_init(wcd938x, dev); if (ret) { dev_err(dev, "%s: IRQ init failed: %d\n", __func__, ret); - return ret; + goto err_remove_rx_link; } wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq; @@ -3491,27 +3495,45 @@ ret = wcd938x_set_micbias_data(wcd938x); if (ret < 0) { dev_err(dev, "%s: bad micbias pdata\n", __func__); - return ret; + goto err_remove_rx_link; } ret = snd_soc_register_component(dev, &soc_codec_dev_wcd938x, wcd938x_dais, ARRAY_SIZE(wcd938x_dais)); - if (ret) + if (ret) { dev_err(dev, "%s: Codec registration failed\n", __func__); + goto err_remove_rx_link; + } - return ret; + return 0; +err_remove_rx_link: + device_link_remove(dev, wcd938x->rxdev); +err_remove_tx_link: + device_link_remove(dev, wcd938x->txdev); +err_remove_rxtx_link: + device_link_remove(wcd938x->rxdev, wcd938x->txdev); +err_put_txdev: + put_device(wcd938x->txdev); +err_put_rxdev: + put_device(wcd938x->rxdev); +err_unbind: + component_unbind_all(dev, wcd938x); + + return ret; } static void wcd938x_unbind(struct device *dev) { struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); + snd_soc_unregister_component(dev); device_link_remove(dev, wcd938x->txdev); device_link_remove(dev, wcd938x->rxdev); device_link_remove(wcd938x->rxdev, wcd938x->txdev); - snd_soc_unregister_component(dev); + put_device(wcd938x->txdev); + put_device(wcd938x->rxdev); component_unbind_all(dev, wcd938x); } @@ -3572,13 +3594,13 @@ ret = wcd938x_add_slave_components(wcd938x, dev, &match); if (ret) - return ret; + goto err_disable_regulators; wcd938x_reset(wcd938x); ret = component_master_add_with_match(dev, &wcd938x_comp_ops, match); if (ret) - return ret; + goto err_disable_regulators; pm_runtime_set_autosuspend_delay(dev, 1000); pm_runtime_use_autosuspend(dev); @@ -3588,11 +3610,27 @@ pm_runtime_idle(dev); return 0; + +err_disable_regulators: + regulator_bulk_disable(WCD938X_MAX_SUPPLY, wcd938x->supplies); + regulator_bulk_free(WCD938X_MAX_SUPPLY, wcd938x->supplies); + + return ret; } static void wcd938x_remove(struct platform_device *pdev) { - component_master_del(&pdev->dev, &wcd938x_comp_ops); + struct device *dev = &pdev->dev; + struct wcd938x_priv *wcd938x = dev_get_drvdata(dev); + + component_master_del(dev, &wcd938x_comp_ops); + + pm_runtime_disable(dev); + pm_runtime_set_suspended(dev); + pm_runtime_dont_use_autosuspend(dev); + + regulator_bulk_disable(WCD938X_MAX_SUPPLY, wcd938x->supplies); + regulator_bulk_free(WCD938X_MAX_SUPPLY, wcd938x->supplies); } #if defined(CONFIG_OF) --- linux-azure-6.5.0.orig/sound/soc/codecs/wm8974.c +++ linux-azure-6.5.0/sound/soc/codecs/wm8974.c @@ -186,7 +186,7 @@ /* Boost mixer */ static const struct snd_kcontrol_new wm8974_boost_mixer[] = { -SOC_DAPM_SINGLE("Aux Switch", WM8974_INPPGA, 6, 1, 1), +SOC_DAPM_SINGLE("PGA Switch", WM8974_INPPGA, 6, 1, 1), }; /* Input PGA */ @@ -246,8 +246,8 @@ /* Boost Mixer */ {"ADC", NULL, "Boost Mixer"}, - {"Boost Mixer", "Aux Switch", "Aux Input"}, - {"Boost Mixer", NULL, "Input PGA"}, + {"Boost Mixer", NULL, "Aux Input"}, + {"Boost Mixer", "PGA Switch", "Input PGA"}, {"Boost Mixer", NULL, "MICP"}, /* Input PGA */ --- linux-azure-6.5.0.orig/sound/soc/codecs/wm_adsp.c +++ linux-azure-6.5.0/sound/soc/codecs/wm_adsp.c @@ -687,7 +687,10 @@ struct wm_coeff_ctl *ctl; int ret; + mutex_lock(&dsp->cs_dsp.pwr_lock); ret = cs_dsp_coeff_write_ctrl(cs_ctl, 0, buf, len); + mutex_unlock(&dsp->cs_dsp.pwr_lock); + if (ret < 0) return ret; @@ -703,8 +706,14 @@ int wm_adsp_read_ctl(struct wm_adsp *dsp, const char *name, int type, unsigned int alg, void *buf, size_t len) { - return cs_dsp_coeff_read_ctrl(cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg), - 0, buf, len); + int ret; + + mutex_lock(&dsp->cs_dsp.pwr_lock); + ret = cs_dsp_coeff_read_ctrl(cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg), + 0, buf, len); + mutex_unlock(&dsp->cs_dsp.pwr_lock); + + return ret; } EXPORT_SYMBOL_GPL(wm_adsp_read_ctl); @@ -1434,12 +1443,12 @@ ret = wm_adsp_buffer_read(buf, caps->region_defs[i].base_offset, ®ion->base_addr); if (ret < 0) - return ret; + goto err; ret = wm_adsp_buffer_read(buf, caps->region_defs[i].size_offset, &offset); if (ret < 0) - return ret; + goto err; region->cumulative_size = offset; @@ -1450,6 +1459,10 @@ } return 0; + +err: + kfree(buf->regions); + return ret; } static void wm_adsp_buffer_clear(struct wm_adsp_compr_buf *buf) --- linux-azure-6.5.0.orig/sound/soc/codecs/wsa883x.c +++ linux-azure-6.5.0/sound/soc/codecs/wsa883x.c @@ -1203,9 +1203,6 @@ break; } - snd_soc_component_write_field(component, WSA883X_DRE_CTL_1, - WSA883X_DRE_GAIN_EN_MASK, - WSA883X_DRE_GAIN_FROM_CSR); if (wsa883x->port_enable[WSA883X_PORT_COMP]) snd_soc_component_write_field(component, WSA883X_DRE_CTL_0, WSA883X_DRE_OFFSET_MASK, @@ -1218,9 +1215,6 @@ snd_soc_component_write_field(component, WSA883X_PDM_WD_CTL, WSA883X_PDM_EN_MASK, WSA883X_PDM_ENABLE); - snd_soc_component_write_field(component, WSA883X_PA_FSM_CTL, - WSA883X_GLOBAL_PA_EN_MASK, - WSA883X_GLOBAL_PA_ENABLE); break; case SND_SOC_DAPM_PRE_PMD: @@ -1346,6 +1340,7 @@ .hw_free = wsa883x_hw_free, .mute_stream = wsa883x_digital_mute, .set_stream = wsa883x_set_sdw_stream, + .mute_unmute_on_trigger = true, }; static struct snd_soc_dai_driver wsa883x_dais[] = { --- linux-azure-6.5.0.orig/sound/soc/fsl/fsl-asoc-card.c +++ linux-azure-6.5.0/sound/soc/fsl/fsl-asoc-card.c @@ -41,6 +41,7 @@ /** * struct codec_priv - CODEC private data + * @mclk: Main clock of the CODEC * @mclk_freq: Clock rate of MCLK * @free_freq: Clock rate of MCLK for hw_free() * @mclk_id: MCLK (or main clock) id for set_sysclk() @@ -52,8 +53,8 @@ unsigned long mclk_freq; unsigned long free_freq; u32 mclk_id; - u32 fll_id; - u32 pll_id; + int fll_id; + int pll_id; }; /** @@ -206,7 +207,7 @@ } /* Specific configuration for PLL */ - if (codec_priv->pll_id && codec_priv->fll_id) { + if (codec_priv->pll_id >= 0 && codec_priv->fll_id >= 0) { if (priv->sample_format == SNDRV_PCM_FORMAT_S24_LE) pll_out = priv->sample_rate * 384; else @@ -248,7 +249,7 @@ priv->streams &= ~BIT(substream->stream); - if (!priv->streams && codec_priv->pll_id && codec_priv->fll_id) { + if (!priv->streams && codec_priv->pll_id >= 0 && codec_priv->fll_id >= 0) { /* Force freq to be free_freq to avoid error message in codec */ ret = snd_soc_dai_set_sysclk(asoc_rtd_to_codec(rtd, 0), codec_priv->mclk_id, @@ -621,6 +622,10 @@ priv->card.dapm_routes = audio_map; priv->card.num_dapm_routes = ARRAY_SIZE(audio_map); priv->card.driver_name = DRIVER_NAME; + + priv->codec_priv.fll_id = -1; + priv->codec_priv.pll_id = -1; + /* Diversify the card configurations */ if (of_device_is_compatible(np, "fsl,imx-audio-cs42888")) { codec_dai_name = "cs42888"; --- linux-azure-6.5.0.orig/sound/soc/fsl/fsl_easrc.c +++ linux-azure-6.5.0/sound/soc/fsl/fsl_easrc.c @@ -1966,17 +1966,21 @@ &fsl_easrc_dai, 1); if (ret) { dev_err(dev, "failed to register ASoC DAI\n"); - return ret; + goto err_pm_disable; } ret = devm_snd_soc_register_component(dev, &fsl_asrc_component, NULL, 0); if (ret) { dev_err(&pdev->dev, "failed to register ASoC platform\n"); - return ret; + goto err_pm_disable; } return 0; + +err_pm_disable: + pm_runtime_disable(&pdev->dev); + return ret; } static void fsl_easrc_remove(struct platform_device *pdev) --- linux-azure-6.5.0.orig/sound/soc/fsl/fsl_qmc_audio.c +++ linux-azure-6.5.0/sound/soc/fsl/fsl_qmc_audio.c @@ -372,8 +372,8 @@ struct snd_mask *f_old = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); unsigned int channels = params_channels(params); unsigned int slot_width; + snd_pcm_format_t format; struct snd_mask f_new; - unsigned int i; if (!channels || channels > nb_ts) { dev_err(qmc_dai->dev, "channels %u not supported\n", @@ -384,10 +384,10 @@ slot_width = (nb_ts / channels) * 8; snd_mask_none(&f_new); - for (i = 0; i <= SNDRV_PCM_FORMAT_LAST; i++) { - if (snd_mask_test(f_old, i)) { - if (snd_pcm_format_physical_width(i) <= slot_width) - snd_mask_set(&f_new, i); + pcm_for_each_format(format) { + if (snd_mask_test_format(f_old, format)) { + if (snd_pcm_format_physical_width(format) <= slot_width) + snd_mask_set_format(&f_new, format); } } @@ -551,26 +551,26 @@ static u64 qmc_audio_formats(u8 nb_ts) { - u64 formats; - unsigned int chan_width; unsigned int format_width; - int i; + unsigned int chan_width; + snd_pcm_format_t format; + u64 formats_mask; if (!nb_ts) return 0; - formats = 0; + formats_mask = 0; chan_width = nb_ts * 8; - for (i = 0; i <= SNDRV_PCM_FORMAT_LAST; i++) { + pcm_for_each_format(format) { /* * Support format other than little-endian (ie big-endian or * without endianness such as 8bit formats) */ - if (snd_pcm_format_little_endian(i) == 1) + if (snd_pcm_format_little_endian(format) == 1) continue; /* Support physical width multiple of 8bit */ - format_width = snd_pcm_format_physical_width(i); + format_width = snd_pcm_format_physical_width(format); if (format_width == 0 || format_width % 8) continue; @@ -581,9 +581,9 @@ if (format_width > chan_width || chan_width % format_width) continue; - formats |= (1ULL << i); + formats_mask |= pcm_format_to_bits(format); } - return formats; + return formats_mask; } static int qmc_audio_dai_parse(struct qmc_audio *qmc_audio, struct device_node *np, --- linux-azure-6.5.0.orig/sound/soc/fsl/fsl_rpmsg.c +++ linux-azure-6.5.0/sound/soc/fsl/fsl_rpmsg.c @@ -231,7 +231,7 @@ ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component, &fsl_rpmsg_dai, 1); if (ret) - return ret; + goto err_pm_disable; rpmsg->card_pdev = platform_device_register_data(&pdev->dev, "imx-audio-rpmsg", @@ -241,16 +241,22 @@ if (IS_ERR(rpmsg->card_pdev)) { dev_err(&pdev->dev, "failed to register rpmsg card\n"); ret = PTR_ERR(rpmsg->card_pdev); - return ret; + goto err_pm_disable; } return 0; + +err_pm_disable: + pm_runtime_disable(&pdev->dev); + return ret; } static void fsl_rpmsg_remove(struct platform_device *pdev) { struct fsl_rpmsg *rpmsg = platform_get_drvdata(pdev); + pm_runtime_disable(&pdev->dev); + if (rpmsg->card_pdev) platform_device_unregister(rpmsg->card_pdev); } --- linux-azure-6.5.0.orig/sound/soc/fsl/fsl_sai.c +++ linux-azure-6.5.0/sound/soc/fsl/fsl_sai.c @@ -674,6 +674,20 @@ FSL_SAI_CR3_TRCE_MASK, FSL_SAI_CR3_TRCE((dl_cfg[dl_cfg_idx].mask[tx] & trce_mask))); + /* + * When the TERE and FSD_MSTR enabled before configuring the word width + * There will be no frame sync clock issue, because word width impact + * the generation of frame sync clock. + * + * TERE enabled earlier only for i.MX8MP case for the hardware limitation, + * We need to disable FSD_MSTR before configuring word width, then enable + * FSD_MSTR bit for this specific case. + */ + if (sai->soc_data->mclk_with_tere && sai->mclk_direction_output && + !sai->is_consumer_mode) + regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs), + FSL_SAI_CR4_FSD_MSTR, 0); + regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs), FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK | FSL_SAI_CR4_CHMOD_MASK, @@ -681,6 +695,13 @@ regmap_update_bits(sai->regmap, FSL_SAI_xCR5(tx, ofs), FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK | FSL_SAI_CR5_FBT_MASK, val_cr5); + + /* Enable FSD_MSTR after configuring word width */ + if (sai->soc_data->mclk_with_tere && sai->mclk_direction_output && + !sai->is_consumer_mode) + regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs), + FSL_SAI_CR4_FSD_MSTR, FSL_SAI_CR4_FSD_MSTR); + regmap_write(sai->regmap, FSL_SAI_xMR(tx), ~0UL - ((1 << min(channels, slots)) - 1)); @@ -694,6 +715,9 @@ bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; unsigned int ofs = sai->soc_data->reg_offset; + /* Clear xMR to avoid channel swap with mclk_with_tere enabled case */ + regmap_write(sai->regmap, FSL_SAI_xMR(tx), 0); + regmap_update_bits(sai->regmap, FSL_SAI_xCR3(tx, ofs), FSL_SAI_CR3_TRCE_MASK, 0); @@ -710,10 +734,15 @@ { unsigned int ofs = sai->soc_data->reg_offset; bool tx = dir == TX; - u32 xcsr, count = 100; + u32 xcsr, count = 100, mask; + + if (sai->soc_data->mclk_with_tere && sai->mclk_direction_output) + mask = FSL_SAI_CSR_TERE; + else + mask = FSL_SAI_CSR_TERE | FSL_SAI_CSR_BCE; regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs), - FSL_SAI_CSR_TERE | FSL_SAI_CSR_BCE, 0); + mask, 0); /* TERE will remain set till the end of current frame */ do { --- linux-azure-6.5.0.orig/sound/soc/fsl/fsl_xcvr.c +++ linux-azure-6.5.0/sound/soc/fsl/fsl_xcvr.c @@ -358,7 +358,7 @@ struct device *dev = &xcvr->pdev->dev; int ret; - freq = xcvr->soc_data->spdif_only ? freq / 10 : freq; + freq = xcvr->soc_data->spdif_only ? freq / 5 : freq; clk_disable_unprepare(xcvr->phy_clk); ret = clk_set_rate(xcvr->phy_clk, freq); if (ret < 0) { @@ -409,11 +409,21 @@ bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; u32 m_ctl = 0, v_ctl = 0; u32 r = substream->runtime->rate, ch = substream->runtime->channels; - u32 fout = 32 * r * ch * 10 * 2; + u32 fout = 32 * r * ch * 10; int ret = 0; switch (xcvr->mode) { case FSL_XCVR_MODE_SPDIF: + if (xcvr->soc_data->spdif_only && tx) { + ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_TX_DPTH_CTRL_SET, + FSL_XCVR_TX_DPTH_CTRL_BYPASS_FEM, + FSL_XCVR_TX_DPTH_CTRL_BYPASS_FEM); + if (ret < 0) { + dev_err(dai->dev, "Failed to set bypass fem: %d\n", ret); + return ret; + } + } + fallthrough; case FSL_XCVR_MODE_ARC: if (tx) { ret = fsl_xcvr_en_aud_pll(xcvr, fout); --- linux-azure-6.5.0.orig/sound/soc/fsl/imx-audmix.c +++ linux-azure-6.5.0/sound/soc/fsl/imx-audmix.c @@ -315,7 +315,7 @@ if (IS_ERR(priv->cpu_mclk)) { ret = PTR_ERR(priv->cpu_mclk); dev_err(&cpu_pdev->dev, "failed to get DAI mclk1: %d\n", ret); - return -EINVAL; + return ret; } priv->audmix_pdev = audmix_pdev; --- linux-azure-6.5.0.orig/sound/soc/fsl/imx-pcm-rpmsg.c +++ linux-azure-6.5.0/sound/soc/fsl/imx-pcm-rpmsg.c @@ -19,6 +19,7 @@ static struct snd_pcm_hardware imx_rpmsg_pcm_hardware = { .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | + SNDRV_PCM_INFO_BATCH | SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_NO_PERIOD_WAKEUP | --- linux-azure-6.5.0.orig/sound/soc/fsl/imx-rpmsg.c +++ linux-azure-6.5.0/sound/soc/fsl/imx-rpmsg.c @@ -89,6 +89,14 @@ SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBC_CFC; + /* + * i.MX rpmsg sound cards work on codec slave mode. MCLK will be + * disabled by CPU DAI driver in hw_free(). Some codec requires MCLK + * present at power up/down sequence. So need to set ignore_pmdown_time + * to power down codec immediately before MCLK is turned off. + */ + data->dai.ignore_pmdown_time = 1; + /* Optional codec node */ ret = of_parse_phandle_with_fixed_args(np, "audio-codec", 0, 0, &args); if (ret) { --- linux-azure-6.5.0.orig/sound/soc/fsl/mpc5200_dma.c +++ linux-azure-6.5.0/sound/soc/fsl/mpc5200_dma.c @@ -100,6 +100,9 @@ /** * psc_dma_trigger: start and stop the DMA transfer. + * @component: triggered component + * @substream: triggered substream + * @cmd: triggered command * * This function is called by ALSA to start, stop, pause, and resume the DMA * transfer of data. --- linux-azure-6.5.0.orig/sound/soc/generic/simple-card-utils.c +++ linux-azure-6.5.0/sound/soc/generic/simple-card-utils.c @@ -310,7 +310,8 @@ if (fixed_sysclk % props->mclk_fs) { dev_err(rtd->dev, "fixed sysclk %u not divisible by mclk_fs %u\n", fixed_sysclk, props->mclk_fs); - return -EINVAL; + ret = -EINVAL; + goto codec_err; } ret = snd_pcm_hw_constraint_minmax(substream->runtime, SNDRV_PCM_HW_PARAM_RATE, fixed_rate, fixed_rate); --- linux-azure-6.5.0.orig/sound/soc/generic/simple-card.c +++ linux-azure-6.5.0/sound/soc/generic/simple-card.c @@ -701,10 +701,12 @@ struct snd_soc_dai_link *dai_link = priv->dai_link; struct simple_dai_props *dai_props = priv->dai_props; + ret = -EINVAL; + cinfo = dev->platform_data; if (!cinfo) { dev_err(dev, "no info for asoc-simple-card\n"); - return -EINVAL; + goto err; } if (!cinfo->name || @@ -713,7 +715,7 @@ !cinfo->platform || !cinfo->cpu_dai.name) { dev_err(dev, "insufficient asoc_simple_card_info settings\n"); - return -EINVAL; + goto err; } cpus = dai_link->cpus; --- linux-azure-6.5.0.orig/sound/soc/intel/avs/boards/hdaudio.c +++ linux-azure-6.5.0/sound/soc/intel/avs/boards/hdaudio.c @@ -55,6 +55,9 @@ return -ENOMEM; dl[i].codecs->name = devm_kstrdup(dev, cname, GFP_KERNEL); + if (!dl[i].codecs->name) + return -ENOMEM; + dl[i].codecs->dai_name = pcm->name; dl[i].num_codecs = 1; dl[i].num_cpus = 1; --- linux-azure-6.5.0.orig/sound/soc/intel/boards/bytcr_rt5640.c +++ linux-azure-6.5.0/sound/soc/intel/boards/bytcr_rt5640.c @@ -83,6 +83,7 @@ #define BYT_RT5640_HSMIC2_ON_IN1 BIT(27) #define BYT_RT5640_JD_HP_ELITEP_1000G2 BIT(28) #define BYT_RT5640_USE_AMCR0F28 BIT(29) +#define BYT_RT5640_SWAPPED_SPEAKERS BIT(30) #define BYTCR_INPUT_DEFAULTS \ (BYT_RT5640_IN3_MAP | \ @@ -157,6 +158,8 @@ dev_info(dev, "quirk MONO_SPEAKER enabled\n"); if (byt_rt5640_quirk & BYT_RT5640_NO_SPEAKERS) dev_info(dev, "quirk NO_SPEAKERS enabled\n"); + if (byt_rt5640_quirk & BYT_RT5640_SWAPPED_SPEAKERS) + dev_info(dev, "quirk SWAPPED_SPEAKERS enabled\n"); if (byt_rt5640_quirk & BYT_RT5640_LINEOUT) dev_info(dev, "quirk LINEOUT enabled\n"); if (byt_rt5640_quirk & BYT_RT5640_LINEOUT_AS_HP2) @@ -894,6 +897,19 @@ BYT_RT5640_SSP0_AIF1 | BYT_RT5640_MCLK_EN), }, + { + /* Medion Lifetab S10346 */ + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), + DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), + /* Above strings are much too generic, also match on BIOS date */ + DMI_MATCH(DMI_BIOS_DATE, "10/22/2015"), + }, + .driver_data = (void *)(BYTCR_INPUT_DEFAULTS | + BYT_RT5640_SWAPPED_SPEAKERS | + BYT_RT5640_SSP0_AIF1 | + BYT_RT5640_MCLK_EN), + }, { /* Mele PCG03 Mini PC */ .matches = { DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Mini PC"), @@ -1619,11 +1635,11 @@ const char *platform_name; struct acpi_device *adev; struct device *codec_dev; + const char *cfg_spk; bool sof_parent; int ret_val = 0; int dai_index = 0; - int i, cfg_spk; - int aif; + int i, aif; is_bytcr = false; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); @@ -1783,13 +1799,16 @@ } if (byt_rt5640_quirk & BYT_RT5640_NO_SPEAKERS) { - cfg_spk = 0; + cfg_spk = "0"; spk_type = "none"; } else if (byt_rt5640_quirk & BYT_RT5640_MONO_SPEAKER) { - cfg_spk = 1; + cfg_spk = "1"; spk_type = "mono"; + } else if (byt_rt5640_quirk & BYT_RT5640_SWAPPED_SPEAKERS) { + cfg_spk = "swapped"; + spk_type = "swapped"; } else { - cfg_spk = 2; + cfg_spk = "2"; spk_type = "stereo"; } @@ -1804,7 +1823,7 @@ headset2_string = " cfg-hs2:in1"; snprintf(byt_rt5640_components, sizeof(byt_rt5640_components), - "cfg-spk:%d cfg-mic:%s aif:%d%s%s", cfg_spk, + "cfg-spk:%s cfg-mic:%s aif:%d%s%s", cfg_spk, map_name[BYT_RT5640_MAP(byt_rt5640_quirk)], aif, lineout_string, headset2_string); byt_rt5640_card.components = byt_rt5640_components; --- linux-azure-6.5.0.orig/sound/soc/intel/boards/skl_hda_dsp_generic.c +++ linux-azure-6.5.0/sound/soc/intel/boards/skl_hda_dsp_generic.c @@ -154,6 +154,8 @@ card->dapm_widgets = skl_hda_widgets; card->num_dapm_widgets = ARRAY_SIZE(skl_hda_widgets); if (!ctx->idisp_codec) { + card->dapm_routes = &skl_hda_map[IDISP_ROUTE_COUNT]; + num_route -= IDISP_ROUTE_COUNT; for (i = 0; i < IDISP_DAI_COUNT; i++) { skl_hda_be_dai_links[i].codecs = &asoc_dummy_dlc; skl_hda_be_dai_links[i].num_codecs = 1; --- linux-azure-6.5.0.orig/sound/soc/intel/boards/sof_es8336.c +++ linux-azure-6.5.0/sound/soc/intel/boards/sof_es8336.c @@ -798,6 +798,16 @@ SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK | SOF_ES8336_JD_INVERTED), }, + { + .name = "mtl_es83x6_c1_h02", + .driver_data = (kernel_ulong_t)(SOF_ES8336_SSP_CODEC(1) | + SOF_NO_OF_HDMI_CAPTURE_SSP(2) | + SOF_HDMI_CAPTURE_1_SSP(0) | + SOF_HDMI_CAPTURE_2_SSP(2) | + SOF_SSP_HDMI_CAPTURE_PRESENT | + SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK | + SOF_ES8336_JD_INVERTED), + }, { } }; MODULE_DEVICE_TABLE(platform, board_ids); --- linux-azure-6.5.0.orig/sound/soc/intel/boards/sof_sdw.c +++ linux-azure-6.5.0/sound/soc/intel/boards/sof_sdw.c @@ -370,6 +370,16 @@ .callback = sof_sdw_quirk_cb, .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"), + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0B14"), + }, + /* No Jack */ + .driver_data = (void *)SOF_SDW_TGL_HDMI, + }, + + { + .callback = sof_sdw_quirk_cb, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"), DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0B29"), }, .driver_data = (void *)(SOF_SDW_TGL_HDMI | @@ -388,6 +398,16 @@ { .callback = sof_sdw_quirk_cb, .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc"), + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "0B14"), + }, + /* No Jack */ + .driver_data = (void *)SOF_SDW_TGL_HDMI, + }, + + { + .callback = sof_sdw_quirk_cb, + .matches = { DMI_MATCH(DMI_SYS_VENDOR, "HP"), DMI_MATCH(DMI_PRODUCT_NAME, "OMEN by HP Gaming Laptop 16-k0xxx"), }, @@ -467,7 +487,9 @@ DMI_MATCH(DMI_SYS_VENDOR, "Google"), DMI_MATCH(DMI_PRODUCT_NAME, "Rex"), }, - .driver_data = (void *)(SOF_SDW_PCH_DMIC), + .driver_data = (void *)(SOF_SDW_PCH_DMIC | + SOF_BT_OFFLOAD_SSP(1) | + SOF_SSP_BT_OFFLOAD_PRESENT), }, /* LunarLake devices */ { --- linux-azure-6.5.0.orig/sound/soc/intel/boards/sof_sdw_rt712_sdca.c +++ linux-azure-6.5.0/sound/soc/intel/boards/sof_sdw_rt712_sdca.c @@ -80,10 +80,12 @@ static int rt712_sdca_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_card *card = rtd->card; + struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0); + struct snd_soc_component *component = codec_dai->component; card->components = devm_kasprintf(card->dev, GFP_KERNEL, - "%s mic:rt712-sdca-dmic", - card->components); + "%s mic:%s", + card->components, component->name_prefix); if (!card->components) return -ENOMEM; --- linux-azure-6.5.0.orig/sound/soc/intel/boards/sof_sdw_rt_sdca_jack_common.c +++ linux-azure-6.5.0/sound/soc/intel/boards/sof_sdw_rt_sdca_jack_common.c @@ -58,6 +58,11 @@ { "rt712 MIC2", NULL, "Headset Mic" }, }; +static const struct snd_soc_dapm_route rt713_sdca_map[] = { + { "Headphone", NULL, "rt713 HP" }, + { "rt713 MIC2", NULL, "Headset Mic" }, +}; + static const struct snd_kcontrol_new rt_sdca_jack_controls[] = { SOC_DAPM_PIN_SWITCH("Headphone"), SOC_DAPM_PIN_SWITCH("Headset Mic"), @@ -109,6 +114,9 @@ } else if (strstr(component->name_prefix, "rt712")) { ret = snd_soc_dapm_add_routes(&card->dapm, rt712_sdca_map, ARRAY_SIZE(rt712_sdca_map)); + } else if (strstr(component->name_prefix, "rt713")) { + ret = snd_soc_dapm_add_routes(&card->dapm, rt713_sdca_map, + ARRAY_SIZE(rt713_sdca_map)); } else { dev_err(card->dev, "%s is not supported\n", component->name_prefix); return -EINVAL; --- linux-azure-6.5.0.orig/sound/soc/intel/common/soc-acpi-intel-adl-match.c +++ linux-azure-6.5.0/sound/soc/intel/common/soc-acpi-intel-adl-match.c @@ -649,18 +649,18 @@ .sof_tplg_filename = "sof-adl-rt1316-l2-mono-rt714-l3.tplg", }, { - .link_mask = 0x3, /* rt1316 on link1 & rt714 on link0 */ - .links = adl_sdw_rt1316_link1_rt714_link0, - .drv_name = "sof_sdw", - .sof_tplg_filename = "sof-adl-rt1316-l1-mono-rt714-l0.tplg", - }, - { .link_mask = 0x7, /* rt714 on link0 & two rt1316s on link1 and link2 */ .links = adl_sdw_rt1316_link12_rt714_link0, .drv_name = "sof_sdw", .sof_tplg_filename = "sof-adl-rt1316-l12-rt714-l0.tplg", }, { + .link_mask = 0x3, /* rt1316 on link1 & rt714 on link0 */ + .links = adl_sdw_rt1316_link1_rt714_link0, + .drv_name = "sof_sdw", + .sof_tplg_filename = "sof-adl-rt1316-l1-mono-rt714-l0.tplg", + }, + { .link_mask = 0x5, /* 2 active links required */ .links = adl_sdw_rt1316_link2_rt714_link0, .drv_name = "sof_sdw", --- linux-azure-6.5.0.orig/sound/soc/intel/common/soc-acpi-intel-cht-match.c +++ linux-azure-6.5.0/sound/soc/intel/common/soc-acpi-intel-cht-match.c @@ -75,6 +75,39 @@ return arg; } +/* + * The Lenovo Yoga Tab 3 Pro YT3-X90, with Android factory OS has a buggy DSDT + * with the coded not being listed at all. + */ +static const struct dmi_system_id lenovo_yoga_tab3_x90[] = { + { + /* Lenovo Yoga Tab 3 Pro YT3-X90, codec missing from DSDT */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "CHERRYVIEW D1 PLATFORM"), + DMI_MATCH(DMI_PRODUCT_VERSION, "Blade3-10A-001"), + }, + }, + { } +}; + +static struct snd_soc_acpi_mach cht_lenovo_yoga_tab3_x90_mach = { + .id = "10WM5102", + .drv_name = "bytcr_wm5102", + .fw_filename = "intel/fw_sst_22a8.bin", + .board = "bytcr_wm5102", + .sof_tplg_filename = "sof-cht-wm5102.tplg", +}; + +static struct snd_soc_acpi_mach *lenovo_yt3_x90_quirk(void *arg) +{ + if (dmi_check_system(lenovo_yoga_tab3_x90)) + return &cht_lenovo_yoga_tab3_x90_mach; + + /* Skip wildcard match snd_soc_acpi_intel_cherrytrail_machines[] entry */ + return NULL; +} + static const struct snd_soc_acpi_codecs rt5640_comp_ids = { .num_codecs = 2, .codecs = { "10EC5640", "10EC3276" }, @@ -175,6 +208,16 @@ .drv_name = "sof_pcm512x", .sof_tplg_filename = "sof-cht-src-50khz-pcm512x.tplg", }, + /* + * Special case for the Lenovo Yoga Tab 3 Pro YT3-X90 where the DSDT + * misses the codec. Match on the SST id instead, lenovo_yt3_x90_quirk() + * will return a YT3 specific mach or NULL when called on other hw, + * skipping this entry. + */ + { + .id = "808622A8", + .machine_quirk = lenovo_yt3_x90_quirk, + }, #if IS_ENABLED(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH) /* --- linux-azure-6.5.0.orig/sound/soc/intel/common/soc-acpi-intel-mtl-match.c +++ linux-azure-6.5.0/sound/soc/intel/common/soc-acpi-intel-mtl-match.c @@ -30,6 +30,16 @@ .codecs = {"10EC5682", "RTL5682"}, }; +static const struct snd_soc_acpi_codecs mtl_lt6911_hdmi = { + .num_codecs = 1, + .codecs = {"INTC10B0"} +}; + +static const struct snd_soc_acpi_codecs mtl_essx_83x6 = { + .num_codecs = 3, + .codecs = { "ESSX8316", "ESSX8326", "ESSX8336"}, +}; + struct snd_soc_acpi_mach snd_soc_acpi_intel_mtl_machines[] = { { .comp_ids = &mtl_rt5682_rt5682s_hp, @@ -46,12 +56,27 @@ .sof_tplg_filename = "sof-mtl-max98360a-rt5682.tplg", }, { + .comp_ids = &mtl_essx_83x6, + .drv_name = "mtl_es83x6_c1_h02", + .machine_quirk = snd_soc_acpi_codec_list, + .quirk_data = &mtl_lt6911_hdmi, + .sof_tplg_filename = "sof-mtl-es83x6-ssp1-hdmi-ssp02.tplg", + }, + { .comp_ids = &mtl_rt5682_rt5682s_hp, .drv_name = "mtl_rt1019_rt5682", .machine_quirk = snd_soc_acpi_codec_list, .quirk_data = &mtl_rt1019p_amp, .sof_tplg_filename = "sof-mtl-rt1019-rt5682.tplg", }, + { + .comp_ids = &mtl_essx_83x6, + .drv_name = "sof-essx8336", + .sof_tplg_filename = "sof-mtl-es8336", /* the tplg suffix is added at run time */ + .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER | + SND_SOC_ACPI_TPLG_INTEL_SSP_MSB | + SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER, + }, {}, }; EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_mtl_machines); @@ -119,6 +144,24 @@ } }; +static const struct snd_soc_acpi_adr_device rt713_0_single_adr[] = { + { + .adr = 0x000031025D071301ull, + .num_endpoints = 1, + .endpoints = &single_endpoint, + .name_prefix = "rt713" + } +}; + +static const struct snd_soc_acpi_adr_device rt1713_3_single_adr[] = { + { + .adr = 0x000331025D171301ull, + .num_endpoints = 1, + .endpoints = &single_endpoint, + .name_prefix = "rt713-dmic" + } +}; + static const struct snd_soc_acpi_adr_device mx8373_0_adr[] = { { .adr = 0x000023019F837300ull, @@ -161,6 +204,51 @@ } }; +static const struct snd_soc_acpi_adr_device rt1316_1_group2_adr[] = { + { + .adr = 0x000131025D131601ull, + .num_endpoints = 1, + .endpoints = &spk_l_endpoint, + .name_prefix = "rt1316-1" + } +}; + +static const struct snd_soc_acpi_adr_device rt1316_2_group2_adr[] = { + { + .adr = 0x000230025D131601ull, + .num_endpoints = 1, + .endpoints = &spk_r_endpoint, + .name_prefix = "rt1316-2" + } +}; + +static const struct snd_soc_acpi_adr_device rt1318_1_group1_adr[] = { + { + .adr = 0x000130025D131801ull, + .num_endpoints = 1, + .endpoints = &spk_l_endpoint, + .name_prefix = "rt1318-1" + } +}; + +static const struct snd_soc_acpi_adr_device rt1318_2_group1_adr[] = { + { + .adr = 0x000232025D131801ull, + .num_endpoints = 1, + .endpoints = &spk_r_endpoint, + .name_prefix = "rt1318-2" + } +}; + +static const struct snd_soc_acpi_adr_device rt714_0_adr[] = { + { + .adr = 0x000030025D071401ull, + .num_endpoints = 1, + .endpoints = &single_endpoint, + .name_prefix = "rt714" + } +}; + static const struct snd_soc_acpi_adr_device rt714_1_adr[] = { { .adr = 0x000130025D071401ull, @@ -232,6 +320,68 @@ {} }; +static const struct snd_soc_acpi_link_adr mtl_sdw_rt1318_l12_rt714_l0[] = { + { + .mask = BIT(1), + .num_adr = ARRAY_SIZE(rt1318_1_group1_adr), + .adr_d = rt1318_1_group1_adr, + }, + { + .mask = BIT(2), + .num_adr = ARRAY_SIZE(rt1318_2_group1_adr), + .adr_d = rt1318_2_group1_adr, + }, + { + .mask = BIT(0), + .num_adr = ARRAY_SIZE(rt714_0_adr), + .adr_d = rt714_0_adr, + }, + {} +}; + +static const struct snd_soc_acpi_link_adr mtl_rt713_l0_rt1316_l12_rt1713_l3[] = { + { + .mask = BIT(0), + .num_adr = ARRAY_SIZE(rt713_0_single_adr), + .adr_d = rt713_0_single_adr, + }, + { + .mask = BIT(1), + .num_adr = ARRAY_SIZE(rt1316_1_group2_adr), + .adr_d = rt1316_1_group2_adr, + }, + { + .mask = BIT(2), + .num_adr = ARRAY_SIZE(rt1316_2_group2_adr), + .adr_d = rt1316_2_group2_adr, + }, + { + .mask = BIT(3), + .num_adr = ARRAY_SIZE(rt1713_3_single_adr), + .adr_d = rt1713_3_single_adr, + }, + {} +}; + +static const struct snd_soc_acpi_link_adr mtl_rt713_l0_rt1316_l12[] = { + { + .mask = BIT(0), + .num_adr = ARRAY_SIZE(rt713_0_single_adr), + .adr_d = rt713_0_single_adr, + }, + { + .mask = BIT(1), + .num_adr = ARRAY_SIZE(rt1316_1_group2_adr), + .adr_d = rt1316_1_group2_adr, + }, + { + .mask = BIT(2), + .num_adr = ARRAY_SIZE(rt1316_2_group2_adr), + .adr_d = rt1316_2_group2_adr, + }, + {} +}; + static const struct snd_soc_acpi_adr_device mx8363_2_adr[] = { { .adr = 0x000230019F836300ull, @@ -293,12 +443,30 @@ .sof_tplg_filename = "sof-mtl-rt715-rt711-rt1308-mono.tplg", }, { + .link_mask = GENMASK(3, 0), + .links = mtl_rt713_l0_rt1316_l12_rt1713_l3, + .drv_name = "sof_sdw", + .sof_tplg_filename = "sof-mtl-rt713-l0-rt1316-l12-rt1713-l3.tplg", + }, + { + .link_mask = GENMASK(2, 0), + .links = mtl_rt713_l0_rt1316_l12, + .drv_name = "sof_sdw", + .sof_tplg_filename = "sof-mtl-rt713-l0-rt1316-l12.tplg", + }, + { .link_mask = BIT(3) | BIT(0), .links = mtl_712_only, .drv_name = "sof_sdw", .sof_tplg_filename = "sof-mtl-rt712-l0-rt1712-l3.tplg", }, { + .link_mask = GENMASK(2, 0), + .links = mtl_sdw_rt1318_l12_rt714_l0, + .drv_name = "sof_sdw", + .sof_tplg_filename = "sof-mtl-rt1318-l12-rt714-l0.tplg" + }, + { .link_mask = GENMASK(3, 0), .links = mtl_3_in_1_sdca, .drv_name = "sof_sdw", --- linux-azure-6.5.0.orig/sound/soc/intel/common/soc-acpi-intel-rpl-match.c +++ linux-azure-6.5.0/sound/soc/intel/common/soc-acpi-intel-rpl-match.c @@ -246,6 +246,25 @@ {} }; +static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1316_link12[] = { + { + .mask = BIT(0), + .num_adr = ARRAY_SIZE(rt711_sdca_0_adr), + .adr_d = rt711_sdca_0_adr, + }, + { + .mask = BIT(1), + .num_adr = ARRAY_SIZE(rt1316_1_group1_adr), + .adr_d = rt1316_1_group1_adr, + }, + { + .mask = BIT(2), + .num_adr = ARRAY_SIZE(rt1316_2_group1_adr), + .adr_d = rt1316_2_group1_adr, + }, + {} +}; + static const struct snd_soc_acpi_link_adr rpl_sdw_rt711_link0_rt1318_link12_rt714_link3[] = { { .mask = BIT(0), @@ -390,6 +409,12 @@ .sof_tplg_filename = "sof-rpl-rt711-l0-rt1318-l12-rt714-l3.tplg", }, { + .link_mask = 0x7, /* rt711 on link0 & two rt1316s on link1 and link2 */ + .links = rpl_sdw_rt711_link0_rt1316_link12, + .drv_name = "sof_sdw", + .sof_tplg_filename = "sof-rpl-rt711-l0-rt1316-l12.tplg", + }, + { .link_mask = 0x7, /* rt711 on link0 & two rt1318s on link1 and link2 */ .links = rpl_sdw_rt711_link0_rt1318_link12, .drv_name = "sof_sdw", --- linux-azure-6.5.0.orig/sound/soc/intel/skylake/skl-pcm.c +++ linux-azure-6.5.0/sound/soc/intel/skylake/skl-pcm.c @@ -251,8 +251,10 @@ snd_pcm_set_sync(substream); mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream); - if (!mconfig) + if (!mconfig) { + kfree(dma_params); return -EINVAL; + } skl_tplg_d0i3_get(skl, mconfig->d0i3_caps); @@ -1470,6 +1472,7 @@ dais = krealloc(skl->dais, sizeof(skl_fe_dai) + sizeof(skl_platform_dai), GFP_KERNEL); if (!dais) { + kfree(skl->dais); ret = -ENOMEM; goto err; } @@ -1482,8 +1485,10 @@ ret = devm_snd_soc_register_component(dev, &skl_component, skl->dais, num_dais); - if (ret) + if (ret) { + kfree(skl->dais); dev_err(dev, "soc component registration failed %d\n", ret); + } err: return ret; } --- linux-azure-6.5.0.orig/sound/soc/intel/skylake/skl-sst-ipc.c +++ linux-azure-6.5.0/sound/soc/intel/skylake/skl-sst-ipc.c @@ -1003,8 +1003,10 @@ reply.size = (reply.header >> 32) & IPC_DATA_OFFSET_SZ_MASK; buf = krealloc(reply.data, reply.size, GFP_KERNEL); - if (!buf) + if (!buf) { + kfree(reply.data); return -ENOMEM; + } *payload = buf; *bytes = reply.size; --- linux-azure-6.5.0.orig/sound/soc/intel/skylake/skl-sst-utils.c +++ linux-azure-6.5.0/sound/soc/intel/skylake/skl-sst-utils.c @@ -299,6 +299,7 @@ module->instance_id = devm_kzalloc(ctx->dev, size, GFP_KERNEL); if (!module->instance_id) { ret = -ENOMEM; + kfree(module); goto free_uuid_list; } --- linux-azure-6.5.0.orig/sound/soc/loongson/loongson_card.c +++ linux-azure-6.5.0/sound/soc/loongson/loongson_card.c @@ -208,7 +208,7 @@ .driver = { .name = "loongson-asoc-card", .pm = &snd_soc_pm_ops, - .of_match_table = of_match_ptr(loongson_asoc_dt_ids), + .of_match_table = loongson_asoc_dt_ids, }, }; module_platform_driver(loongson_audio_driver); --- linux-azure-6.5.0.orig/sound/soc/mediatek/mt8186/mt8186-dai-adda.c +++ linux-azure-6.5.0/sound/soc/mediatek/mt8186/mt8186-dai-adda.c @@ -499,7 +499,7 @@ SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_SUPPLY_S("AUD_PAD_TOP", SUPPLY_SEQ_ADDA_AUD_PAD_TOP, - 0, 0, 0, + AFE_AUD_PAD_TOP, RG_RX_FIFO_ON_SFT, 0, mtk_adda_pad_top_event, SND_SOC_DAPM_PRE_PMU), SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG, --- linux-azure-6.5.0.orig/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c +++ linux-azure-6.5.0/sound/soc/mediatek/mt8186/mt8186-mt6366-rt1019-rt5682s.c @@ -1179,7 +1179,7 @@ playback_codec = of_get_child_by_name(pdev->dev.of_node, "playback-codecs"); if (!playback_codec) { ret = -EINVAL; - dev_err_probe(&pdev->dev, ret, "Property 'speaker-codecs' missing or invalid\n"); + dev_err_probe(&pdev->dev, ret, "Property 'playback-codecs' missing or invalid\n"); goto err_playback_codec; } @@ -1193,7 +1193,7 @@ for_each_card_prelinks(card, i, dai_link) { ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3"); if (ret) { - dev_err_probe(&pdev->dev, ret, "%s set speaker_codec fail\n", + dev_err_probe(&pdev->dev, ret, "%s set playback_codec fail\n", dai_link->name); goto err_probe; } --- linux-azure-6.5.0.orig/sound/soc/mediatek/mt8188/mt8188-mt6359.c +++ linux-azure-6.5.0/sound/soc/mediatek/mt8188/mt8188-mt6359.c @@ -246,6 +246,11 @@ SND_SOC_DAPM_MIC("Headset Mic", NULL), SND_SOC_DAPM_SINK("HDMI"), SND_SOC_DAPM_SINK("DP"), + + /* dynamic pinctrl */ + SND_SOC_DAPM_PINCTRL("ETDM_SPK_PIN", "aud_etdm_spk_on", "aud_etdm_spk_off"), + SND_SOC_DAPM_PINCTRL("ETDM_HP_PIN", "aud_etdm_hp_on", "aud_etdm_hp_off"), + SND_SOC_DAPM_PINCTRL("MTKAIF_PIN", "aud_mtkaif_on", "aud_mtkaif_off"), }; static const struct snd_kcontrol_new mt8188_mt6359_controls[] = { @@ -267,6 +272,7 @@ snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME); struct snd_soc_component *cmpnt_codec = asoc_rtd_to_codec(rtd, 0)->component; + struct snd_soc_dapm_widget *pin_w = NULL, *w; struct mtk_base_afe *afe; struct mt8188_afe_private *afe_priv; struct mtkaif_param *param; @@ -306,6 +312,18 @@ return 0; } + for_each_card_widgets(rtd->card, w) { + if (!strcmp(w->name, "MTKAIF_PIN")) { + pin_w = w; + break; + } + } + + if (pin_w) + dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_PRE_PMU); + else + dev_dbg(afe->dev, "%s(), no pinmux widget, please check if default on\n", __func__); + pm_runtime_get_sync(afe->dev); mt6359_mtkaif_calibration_enable(cmpnt_codec); @@ -403,6 +421,9 @@ for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++) param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i]; + if (pin_w) + dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_POST_PMD); + dev_dbg(afe->dev, "%s(), end, calibration ok %d\n", __func__, param->mtkaif_calibration_ok); --- linux-azure-6.5.0.orig/sound/soc/meson/axg-spdifin.c +++ linux-azure-6.5.0/sound/soc/meson/axg-spdifin.c @@ -112,34 +112,6 @@ return 0; } -static int axg_spdifin_startup(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct axg_spdifin *priv = snd_soc_dai_get_drvdata(dai); - int ret; - - ret = clk_prepare_enable(priv->refclk); - if (ret) { - dev_err(dai->dev, - "failed to enable spdifin reference clock\n"); - return ret; - } - - regmap_update_bits(priv->map, SPDIFIN_CTRL0, SPDIFIN_CTRL0_EN, - SPDIFIN_CTRL0_EN); - - return 0; -} - -static void axg_spdifin_shutdown(struct snd_pcm_substream *substream, - struct snd_soc_dai *dai) -{ - struct axg_spdifin *priv = snd_soc_dai_get_drvdata(dai); - - regmap_update_bits(priv->map, SPDIFIN_CTRL0, SPDIFIN_CTRL0_EN, 0); - clk_disable_unprepare(priv->refclk); -} - static void axg_spdifin_write_mode_param(struct regmap *map, int mode, unsigned int val, unsigned int num_per_reg, @@ -251,25 +223,38 @@ ret = axg_spdifin_sample_mode_config(dai, priv); if (ret) { dev_err(dai->dev, "mode configuration failed\n"); - clk_disable_unprepare(priv->pclk); - return ret; + goto pclk_err; } + ret = clk_prepare_enable(priv->refclk); + if (ret) { + dev_err(dai->dev, + "failed to enable spdifin reference clock\n"); + goto pclk_err; + } + + regmap_update_bits(priv->map, SPDIFIN_CTRL0, SPDIFIN_CTRL0_EN, + SPDIFIN_CTRL0_EN); + return 0; + +pclk_err: + clk_disable_unprepare(priv->pclk); + return ret; } static int axg_spdifin_dai_remove(struct snd_soc_dai *dai) { struct axg_spdifin *priv = snd_soc_dai_get_drvdata(dai); + regmap_update_bits(priv->map, SPDIFIN_CTRL0, SPDIFIN_CTRL0_EN, 0); + clk_disable_unprepare(priv->refclk); clk_disable_unprepare(priv->pclk); return 0; } static const struct snd_soc_dai_ops axg_spdifin_ops = { .prepare = axg_spdifin_prepare, - .startup = axg_spdifin_startup, - .shutdown = axg_spdifin_shutdown, }; static int axg_spdifin_iec958_info(struct snd_kcontrol *kcontrol, --- linux-azure-6.5.0.orig/sound/soc/meson/g12a-toacodec.c +++ linux-azure-6.5.0/sound/soc/meson/g12a-toacodec.c @@ -71,6 +71,9 @@ struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; unsigned int mux, reg; + if (ucontrol->value.enumerated.item[0] >= e->items) + return -EINVAL; + mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]); regmap_field_read(priv->field_dat_sel, ®); @@ -101,7 +104,7 @@ snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL); - return 0; + return 1; } static SOC_ENUM_SINGLE_DECL(g12a_toacodec_mux_enum, TOACODEC_CTRL0, --- linux-azure-6.5.0.orig/sound/soc/meson/g12a-tohdmitx.c +++ linux-azure-6.5.0/sound/soc/meson/g12a-tohdmitx.c @@ -45,6 +45,9 @@ struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; unsigned int mux, changed; + if (ucontrol->value.enumerated.item[0] >= e->items) + return -EINVAL; + mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]); changed = snd_soc_component_test_bits(component, e->reg, CTRL0_I2S_DAT_SEL, @@ -93,6 +96,9 @@ struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; unsigned int mux, changed; + if (ucontrol->value.enumerated.item[0] >= e->items) + return -EINVAL; + mux = snd_soc_enum_item_to_val(e, ucontrol->value.enumerated.item[0]); changed = snd_soc_component_test_bits(component, TOHDMITX_CTRL0, CTRL0_SPDIF_SEL, @@ -112,7 +118,7 @@ snd_soc_dapm_mux_update_power(dapm, kcontrol, mux, e, NULL); - return 0; + return 1; } static SOC_ENUM_SINGLE_DECL(g12a_tohdmitx_spdif_mux_enum, TOHDMITX_CTRL0, --- linux-azure-6.5.0.orig/sound/soc/pxa/pxa-ssp.c +++ linux-azure-6.5.0/sound/soc/pxa/pxa-ssp.c @@ -779,7 +779,7 @@ if (IS_ERR(priv->extclk)) { ret = PTR_ERR(priv->extclk); if (ret == -EPROBE_DEFER) - return ret; + goto err_priv; priv->extclk = NULL; } --- linux-azure-6.5.0.orig/sound/soc/qcom/sc8280xp.c +++ linux-azure-6.5.0/sound/soc/qcom/sc8280xp.c @@ -27,6 +27,23 @@ static int sc8280xp_snd_init(struct snd_soc_pcm_runtime *rtd) { struct sc8280xp_snd_data *data = snd_soc_card_get_drvdata(rtd->card); + struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); + struct snd_soc_card *card = rtd->card; + + switch (cpu_dai->id) { + case WSA_CODEC_DMA_RX_0: + case WSA_CODEC_DMA_RX_1: + /* + * set limit of 0dB on Digital Volume for Speakers, + * this can prevent damage of speakers to some extent without + * active speaker protection + */ + snd_soc_limit_volume(card, "WSA_RX0 Digital Volume", 84); + snd_soc_limit_volume(card, "WSA_RX1 Digital Volume", 84); + break; + default: + break; + } return qcom_snd_wcd_jack_setup(rtd, &data->jack, &data->jack_setup); } --- linux-azure-6.5.0.orig/sound/soc/soc-component.c +++ linux-azure-6.5.0/sound/soc/soc-component.c @@ -242,6 +242,7 @@ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; struct snd_kcontrol *kctl; + /* When updating, change also snd_soc_dapm_widget_name_cmp() */ if (component->name_prefix) snprintf(name, ARRAY_SIZE(name), "%s %s", component->name_prefix, ctl); else --- linux-azure-6.5.0.orig/sound/soc/soc-compress.c +++ linux-azure-6.5.0/sound/soc/soc-compress.c @@ -193,6 +193,7 @@ snd_soc_dai_compr_shutdown(cpu_dai, cstream, 1); out: dpcm_path_put(&list); + snd_soc_dpcm_mutex_unlock(fe); be_err: fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; snd_soc_card_mutex_unlock(fe->card); --- linux-azure-6.5.0.orig/sound/soc/soc-core.c +++ linux-azure-6.5.0/sound/soc/soc-core.c @@ -1259,7 +1259,7 @@ snd_soc_runtime_get_dai_fmt(rtd); ret = snd_soc_runtime_set_dai_fmt(rtd, dai_link->dai_fmt); if (ret) - return ret; + goto err; /* add DPCM sysfs entries */ soc_dpcm_debugfs_add(rtd); @@ -1284,17 +1284,26 @@ /* create compress_device if possible */ ret = snd_soc_dai_compress_new(cpu_dai, rtd, num); if (ret != -ENOTSUPP) - return ret; + goto err; /* create the pcm */ ret = soc_new_pcm(rtd, num); if (ret < 0) { dev_err(card->dev, "ASoC: can't create pcm %s :%d\n", dai_link->stream_name, ret); - return ret; + goto err; } - return snd_soc_pcm_dai_new(rtd); + ret = snd_soc_pcm_dai_new(rtd); + if (ret < 0) + goto err; + + rtd->initialized = true; + + return 0; +err: + snd_soc_link_exit(rtd); + return ret; } static void soc_set_name_prefix(struct snd_soc_card *card, @@ -1892,7 +1901,8 @@ /* release machine specific resources */ for_each_card_rtds(card, rtd) - snd_soc_link_exit(rtd); + if (rtd->initialized) + snd_soc_link_exit(rtd); /* remove and free each DAI */ soc_remove_link_dais(card); soc_remove_link_components(card); --- linux-azure-6.5.0.orig/sound/soc/soc-dai.c +++ linux-azure-6.5.0/sound/soc/soc-dai.c @@ -641,6 +641,10 @@ ret = soc_dai_trigger(dai, substream, cmd); if (ret < 0) break; + + if (dai->driver->ops && dai->driver->ops->mute_unmute_on_trigger) + snd_soc_dai_digital_mute(dai, 0, substream->stream); + soc_dai_mark_push(dai, substream, trigger); } break; @@ -651,6 +655,9 @@ if (rollback && !soc_dai_mark_match(dai, substream, trigger)) continue; + if (dai->driver->ops && dai->driver->ops->mute_unmute_on_trigger) + snd_soc_dai_digital_mute(dai, 1, substream->stream); + r = soc_dai_trigger(dai, substream, cmd); if (r < 0) ret = r; /* use last ret */ --- linux-azure-6.5.0.orig/sound/soc/soc-dapm.c +++ linux-azure-6.5.0/sound/soc/soc-dapm.c @@ -2726,6 +2726,18 @@ } EXPORT_SYMBOL_GPL(snd_soc_dapm_update_dai); +int snd_soc_dapm_widget_name_cmp(struct snd_soc_dapm_widget *widget, const char *s) +{ + struct snd_soc_component *component = snd_soc_dapm_to_component(widget->dapm); + const char *wname = widget->name; + + if (component->name_prefix) + wname += strlen(component->name_prefix) + 1; /* plus space */ + + return strcmp(wname, s); +} +EXPORT_SYMBOL_GPL(snd_soc_dapm_widget_name_cmp); + /* * dapm_update_widget_flags() - Re-compute widget sink and source flags * @w: The widget for which to update the flags @@ -3656,7 +3668,7 @@ dapm_pinctrl_event(w, NULL, SND_SOC_DAPM_POST_PMD); break; case snd_soc_dapm_clock_supply: - w->clk = devm_clk_get(dapm->dev, w->name); + w->clk = devm_clk_get(dapm->dev, widget->name); if (IS_ERR(w->clk)) { ret = PTR_ERR(w->clk); goto request_failed; --- linux-azure-6.5.0.orig/sound/soc/soc-ops.c +++ linux-azure-6.5.0/sound/soc/soc-ops.c @@ -661,7 +661,7 @@ kctl = snd_soc_card_get_kcontrol(card, name); if (kctl) { struct soc_mixer_control *mc = (struct soc_mixer_control *)kctl->private_value; - if (max <= mc->max) { + if (max <= mc->max - mc->min) { mc->platform_max = max; ret = 0; } --- linux-azure-6.5.0.orig/sound/soc/soc-pcm.c +++ linux-azure-6.5.0/sound/soc/soc-pcm.c @@ -698,14 +698,12 @@ if (!rollback) { snd_soc_runtime_deactivate(rtd, substream->stream); - /* clear the corresponding DAIs parameters when going to be inactive */ - for_each_rtd_dais(rtd, i, dai) { - if (snd_soc_dai_active(dai) == 0) - soc_pcm_set_dai_params(dai, NULL); - if (snd_soc_dai_stream_active(dai, substream->stream) == 0) - snd_soc_dai_digital_mute(dai, 1, substream->stream); - } + /* Make sure DAI parameters cleared if the DAI becomes inactive */ + for_each_rtd_dais(rtd, i, dai) + if (snd_soc_dai_active(dai) == 0 && + (dai->rate || dai->channels || dai->sample_bits)) + soc_pcm_set_dai_params(dai, NULL); } for_each_rtd_dais(rtd, i, dai) @@ -898,8 +896,10 @@ snd_soc_dapm_stream_event(rtd, substream->stream, SND_SOC_DAPM_STREAM_START); - for_each_rtd_dais(rtd, i, dai) - snd_soc_dai_digital_mute(dai, 0, substream->stream); + for_each_rtd_dais(rtd, i, dai) { + if (dai->driver->ops && !dai->driver->ops->mute_unmute_on_trigger) + snd_soc_dai_digital_mute(dai, 0, substream->stream); + } out: return soc_pcm_ret(rtd, ret); @@ -936,6 +936,17 @@ snd_soc_dpcm_mutex_assert_held(rtd); + /* clear the corresponding DAIs parameters when going to be inactive */ + for_each_rtd_dais(rtd, i, dai) { + if (snd_soc_dai_active(dai) == 1) + soc_pcm_set_dai_params(dai, NULL); + + if (snd_soc_dai_stream_active(dai, substream->stream) == 1) { + if (dai->driver->ops && !dai->driver->ops->mute_unmute_on_trigger) + snd_soc_dai_digital_mute(dai, 1, substream->stream); + } + } + /* run the stream event */ snd_soc_dapm_stream_stop(rtd, substream->stream); --- linux-azure-6.5.0.orig/sound/soc/soc-utils.c +++ linux-azure-6.5.0/sound/soc/soc-utils.c @@ -217,6 +217,7 @@ return 1; return 0; } +EXPORT_SYMBOL_GPL(snd_soc_dai_is_dummy); int snd_soc_component_is_dummy(struct snd_soc_component *component) { --- linux-azure-6.5.0.orig/sound/soc/sof/amd/acp-ipc.c +++ linux-azure-6.5.0/sound/soc/sof/amd/acp-ipc.c @@ -168,6 +168,8 @@ if ((status & SOF_IPC_PANIC_MAGIC_MASK) == SOF_IPC_PANIC_MAGIC) { snd_sof_dsp_panic(sdev, sdev->dsp_box.offset + sizeof(status), true); + status = 0; + acp_mailbox_write(sdev, sdev->dsp_box.offset, &status, sizeof(status)); return IRQ_HANDLED; } snd_sof_ipc_msgs_rx(sdev); @@ -197,6 +199,8 @@ acp_mailbox_read(sdev, sdev->debug_box.offset, &status, sizeof(u32)); if ((status & SOF_IPC_PANIC_MAGIC_MASK) == SOF_IPC_PANIC_MAGIC) { snd_sof_dsp_panic(sdev, sdev->dsp_oops_offset, true); + status = 0; + acp_mailbox_write(sdev, sdev->debug_box.offset, &status, sizeof(status)); return IRQ_HANDLED; } --- linux-azure-6.5.0.orig/sound/soc/sof/amd/acp.c +++ linux-azure-6.5.0/sound/soc/sof/amd/acp.c @@ -355,9 +355,9 @@ unsigned int val; val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET); - if (val) { - val |= ACP_DSP_TO_HOST_IRQ; - snd_sof_dsp_write(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET, val); + if (val & ACP_DSP_TO_HOST_IRQ) { + snd_sof_dsp_write(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET, + ACP_DSP_TO_HOST_IRQ); return IRQ_WAKE_THREAD; } --- linux-azure-6.5.0.orig/sound/soc/sof/amd/pci-rmb.c +++ linux-azure-6.5.0/sound/soc/sof/amd/pci-rmb.c @@ -34,7 +34,6 @@ .dsp_intr_base = ACP6X_DSP_SW_INTR_BASE, .sram_pte_offset = ACP6X_SRAM_PTE_OFFSET, .hw_semaphore_offset = ACP6X_AXI2DAGB_SEM_0, - .acp_clkmux_sel = ACP6X_CLKMUX_SEL, .fusion_dsp_offset = ACP6X_DSP_FUSION_RUNSTALL, }; --- linux-azure-6.5.0.orig/sound/soc/sof/core.c +++ linux-azure-6.5.0/sound/soc/sof/core.c @@ -459,9 +459,10 @@ struct snd_sof_dev *sdev = dev_get_drvdata(dev); struct snd_sof_pdata *pdata = sdev->pdata; int ret; + bool aborted = false; if (IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)) - cancel_work_sync(&sdev->probe_work); + aborted = cancel_work_sync(&sdev->probe_work); /* * Unregister any registered client device first before IPC and debugfs @@ -486,10 +487,12 @@ snd_sof_ipc_free(sdev); snd_sof_free_debug(sdev); snd_sof_remove(sdev); + sof_ops_free(sdev); + } else if (aborted) { + /* probe_work never ran */ + sof_ops_free(sdev); } - sof_ops_free(sdev); - /* release firmware */ snd_sof_fw_unload(sdev); --- linux-azure-6.5.0.orig/sound/soc/sof/intel/hda-codec.c +++ linux-azure-6.5.0/sound/soc/sof/intel/hda-codec.c @@ -54,8 +54,16 @@ static int hda_codec_load_module(struct hda_codec *codec) { - int ret = request_codec_module(codec); + int ret; + + ret = snd_hdac_device_register(&codec->core); + if (ret) { + dev_err(&codec->core.dev, "failed to register hdac device\n"); + put_device(&codec->core.dev); + return ret; + } + ret = request_codec_module(codec); if (ret <= 0) { codec->probe_id = HDA_CODEC_ID_GENERIC; ret = request_codec_module(codec); @@ -116,7 +124,6 @@ static struct hda_codec *hda_codec_device_init(struct hdac_bus *bus, int addr, int type) { struct hda_codec *codec; - int ret; codec = snd_hda_codec_device_init(to_hda_bus(bus), addr, "ehdaudio%dD%d", bus->idx, addr); if (IS_ERR(codec)) { @@ -126,13 +133,6 @@ codec->core.type = type; - ret = snd_hdac_device_register(&codec->core); - if (ret) { - dev_err(bus->dev, "failed to register hdac device\n"); - put_device(&codec->core.dev); - return ERR_PTR(ret); - } - return codec; } --- linux-azure-6.5.0.orig/sound/soc/sof/intel/hda-mlink.c +++ linux-azure-6.5.0/sound/soc/sof/intel/hda-mlink.c @@ -331,14 +331,14 @@ return !!(val & cmdsync_mask); } -static void hdaml_link_set_lsdiid(u32 __iomem *lsdiid, int dev_num) +static void hdaml_link_set_lsdiid(u16 __iomem *lsdiid, int dev_num) { - u32 val; + u16 val; - val = readl(lsdiid); + val = readw(lsdiid); val |= BIT(dev_num); - writel(val, lsdiid); + writew(val, lsdiid); } static void hdaml_shim_map_stream_ch(u16 __iomem *pcmsycm, int lchan, int hchan, @@ -781,6 +781,8 @@ { struct hdac_ext2_link *h2link; u16 __iomem *pcmsycm; + int hchan; + int lchan; u16 val; h2link = find_ext2_link(bus, true, AZX_REG_ML_LEPTR_ID_SDW); @@ -791,9 +793,17 @@ h2link->instance_offset * sublink + AZX_REG_SDW_SHIM_PCMSyCM(y); + if (channel_mask) { + hchan = __fls(channel_mask); + lchan = __ffs(channel_mask); + } else { + hchan = 0; + lchan = 0; + } + mutex_lock(&h2link->eml_lock); - hdaml_shim_map_stream_ch(pcmsycm, 0, hweight32(channel_mask), + hdaml_shim_map_stream_ch(pcmsycm, lchan, hchan, stream_id, dir); mutex_unlock(&h2link->eml_lock); --- linux-azure-6.5.0.orig/sound/soc/sof/intel/mtl.c +++ linux-azure-6.5.0/sound/soc/sof/intel/mtl.c @@ -460,7 +460,7 @@ /* step 3: wait for IPC DONE bit from ROM */ ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR, chip->ipc_ack, status, ((status & chip->ipc_ack_mask) == chip->ipc_ack_mask), - HDA_DSP_REG_POLL_INTERVAL_US, MTL_DSP_PURGE_TIMEOUT_US); + HDA_DSP_REG_POLL_INTERVAL_US, HDA_DSP_INIT_TIMEOUT_US); if (ret < 0) { if (hda->boot_iteration == HDA_FW_BOOT_ATTEMPTS) dev_err(sdev->dev, "timeout waiting for purge IPC done\n"); --- linux-azure-6.5.0.orig/sound/soc/sof/intel/mtl.h +++ linux-azure-6.5.0/sound/soc/sof/intel/mtl.h @@ -62,7 +62,6 @@ #define MTL_DSP_IRQSTS_IPC BIT(0) #define MTL_DSP_IRQSTS_SDW BIT(6) -#define MTL_DSP_PURGE_TIMEOUT_US 20000000 /* 20s */ #define MTL_DSP_REG_POLL_INTERVAL_US 10 /* 10 us */ /* Memory windows */ --- linux-azure-6.5.0.orig/sound/soc/sof/ipc3-topology.c +++ linux-azure-6.5.0/sound/soc/sof/ipc3-topology.c @@ -493,6 +493,7 @@ static int sof_ipc3_widget_setup_comp_pipeline(struct snd_sof_widget *swidget) { struct snd_soc_component *scomp = swidget->scomp; + struct snd_sof_pipeline *spipe = swidget->spipe; struct sof_ipc_pipe_new *pipeline; struct snd_sof_widget *comp_swidget; int ret; @@ -545,6 +546,7 @@ swidget->dynamic_pipeline_widget); swidget->core = pipeline->core; + spipe->core_mask |= BIT(pipeline->core); return 0; --- linux-azure-6.5.0.orig/sound/soc/sof/ipc4-control.c +++ linux-azure-6.5.0/sound/soc/sof/ipc4-control.c @@ -89,7 +89,7 @@ struct sof_ipc4_control_data *cdata = scontrol->ipc_control_data; struct sof_ipc4_gain *gain = swidget->private; struct sof_ipc4_msg *msg = &cdata->msg; - struct sof_ipc4_gain_data data; + struct sof_ipc4_gain_params params; bool all_channels_equal = true; u32 value; int ret, i; @@ -109,20 +109,20 @@ */ for (i = 0; i < scontrol->num_channels; i++) { if (all_channels_equal) { - data.channels = SOF_IPC4_GAIN_ALL_CHANNELS_MASK; - data.init_val = cdata->chanv[0].value; + params.channels = SOF_IPC4_GAIN_ALL_CHANNELS_MASK; + params.init_val = cdata->chanv[0].value; } else { - data.channels = cdata->chanv[i].channel; - data.init_val = cdata->chanv[i].value; + params.channels = cdata->chanv[i].channel; + params.init_val = cdata->chanv[i].value; } /* set curve type and duration from topology */ - data.curve_duration_l = gain->data.curve_duration_l; - data.curve_duration_h = gain->data.curve_duration_h; - data.curve_type = gain->data.curve_type; + params.curve_duration_l = gain->data.params.curve_duration_l; + params.curve_duration_h = gain->data.params.curve_duration_h; + params.curve_type = gain->data.params.curve_type; - msg->data_ptr = &data; - msg->data_size = sizeof(data); + msg->data_ptr = ¶ms; + msg->data_size = sizeof(params); ret = sof_ipc4_set_get_kcontrol_data(scontrol, true, lock); msg->data_ptr = NULL; --- linux-azure-6.5.0.orig/sound/soc/sof/ipc4-topology.c +++ linux-azure-6.5.0/sound/soc/sof/ipc4-topology.c @@ -17,6 +17,19 @@ #include "ipc4-topology.h" #include "ops.h" +/* + * The ignore_cpc flag can be used to ignore the CPC value for all modules by + * using 0 instead. + * The CPC is sent to the firmware along with the SOF_IPC4_MOD_INIT_INSTANCE + * message and it is used for clock scaling. + * 0 as CPC value will instruct the firmware to use maximum frequency, thus + * deactivating the clock scaling. + */ +static bool ignore_cpc; +module_param_named(ipc4_ignore_cpc, ignore_cpc, bool, 0444); +MODULE_PARM_DESC(ipc4_ignore_cpc, + "Ignore CPC values. This option will disable clock scaling in firmware."); + #define SOF_IPC4_GAIN_PARAM_ID 0 #define SOF_IPC4_TPLG_ABI_SIZE 6 #define SOF_IPC4_CHAIN_DMA_BUF_SIZE_MS 2 @@ -115,18 +128,18 @@ static const struct sof_topology_token gain_tokens[] = { {SOF_TKN_GAIN_RAMP_TYPE, SND_SOC_TPLG_TUPLE_TYPE_WORD, - get_token_u32, offsetof(struct sof_ipc4_gain_data, curve_type)}, + get_token_u32, offsetof(struct sof_ipc4_gain_params, curve_type)}, {SOF_TKN_GAIN_RAMP_DURATION, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, - offsetof(struct sof_ipc4_gain_data, curve_duration_l)}, + offsetof(struct sof_ipc4_gain_params, curve_duration_l)}, {SOF_TKN_GAIN_VAL, SND_SOC_TPLG_TUPLE_TYPE_WORD, - get_token_u32, offsetof(struct sof_ipc4_gain_data, init_val)}, + get_token_u32, offsetof(struct sof_ipc4_gain_params, init_val)}, }; /* SRC */ static const struct sof_topology_token src_tokens[] = { {SOF_TKN_SRC_RATE_OUT, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32, - offsetof(struct sof_ipc4_src, sink_rate)}, + offsetof(struct sof_ipc4_src_data, sink_rate)}, }; static const struct sof_token_info ipc4_token_list[SOF_TOKEN_COUNT] = { @@ -218,7 +231,7 @@ ret = sof_update_ipc_object(scomp, available_fmt, SOF_AUDIO_FMT_NUM_TOKENS, swidget->tuples, - swidget->num_tuples, sizeof(available_fmt), 1); + swidget->num_tuples, sizeof(*available_fmt), 1); if (ret) { dev_err(scomp->dev, "Failed to parse audio format token count\n"); return ret; @@ -641,6 +654,7 @@ { struct snd_soc_component *scomp = swidget->scomp; struct sof_ipc4_pipeline *pipeline; + struct snd_sof_pipeline *spipe = swidget->spipe; int ret; pipeline = kzalloc(sizeof(*pipeline), GFP_KERNEL); @@ -655,6 +669,7 @@ } swidget->core = pipeline->core_id; + spipe->core_mask |= BIT(pipeline->core_id); if (pipeline->use_chain_dma) { dev_dbg(scomp->dev, "Set up chain DMA for %s\n", swidget->widget->name); @@ -706,15 +721,15 @@ swidget->private = gain; - gain->data.channels = SOF_IPC4_GAIN_ALL_CHANNELS_MASK; - gain->data.init_val = SOF_IPC4_VOL_ZERO_DB; + gain->data.params.channels = SOF_IPC4_GAIN_ALL_CHANNELS_MASK; + gain->data.params.init_val = SOF_IPC4_VOL_ZERO_DB; - ret = sof_ipc4_get_audio_fmt(scomp, swidget, &gain->available_fmt, &gain->base_config); + ret = sof_ipc4_get_audio_fmt(scomp, swidget, &gain->available_fmt, &gain->data.base_config); if (ret) goto err; - ret = sof_update_ipc_object(scomp, &gain->data, SOF_GAIN_TOKENS, swidget->tuples, - swidget->num_tuples, sizeof(gain->data), 1); + ret = sof_update_ipc_object(scomp, &gain->data.params, SOF_GAIN_TOKENS, + swidget->tuples, swidget->num_tuples, sizeof(gain->data), 1); if (ret) { dev_err(scomp->dev, "Parsing gain tokens failed\n"); goto err; @@ -722,8 +737,8 @@ dev_dbg(scomp->dev, "pga widget %s: ramp type: %d, ramp duration %d, initial gain value: %#x\n", - swidget->widget->name, gain->data.curve_type, gain->data.curve_duration_l, - gain->data.init_val); + swidget->widget->name, gain->data.params.curve_type, + gain->data.params.curve_duration_l, gain->data.params.init_val); ret = sof_ipc4_widget_setup_msg(swidget, &gain->msg); if (ret) @@ -785,6 +800,7 @@ static int sof_ipc4_widget_setup_comp_src(struct snd_sof_widget *swidget) { struct snd_soc_component *scomp = swidget->scomp; + struct snd_sof_pipeline *spipe = swidget->spipe; struct sof_ipc4_src *src; int ret; @@ -796,18 +812,21 @@ swidget->private = src; - ret = sof_ipc4_get_audio_fmt(scomp, swidget, &src->available_fmt, &src->base_config); + ret = sof_ipc4_get_audio_fmt(scomp, swidget, &src->available_fmt, + &src->data.base_config); if (ret) goto err; - ret = sof_update_ipc_object(scomp, src, SOF_SRC_TOKENS, swidget->tuples, + ret = sof_update_ipc_object(scomp, &src->data, SOF_SRC_TOKENS, swidget->tuples, swidget->num_tuples, sizeof(*src), 1); if (ret) { dev_err(scomp->dev, "Parsing SRC tokens failed\n"); goto err; } - dev_dbg(scomp->dev, "SRC sink rate %d\n", src->sink_rate); + spipe->core_mask |= BIT(swidget->core); + + dev_dbg(scomp->dev, "SRC sink rate %d\n", src->data.sink_rate); ret = sof_ipc4_widget_setup_msg(swidget, &src->msg); if (ret) @@ -852,6 +871,7 @@ { struct snd_soc_component *scomp = swidget->scomp; struct sof_ipc4_fw_module *fw_module; + struct snd_sof_pipeline *spipe = swidget->spipe; struct sof_ipc4_process *process; void *cfg; int ret; @@ -882,7 +902,8 @@ if (process->init_config == SOF_IPC4_MODULE_INIT_CONFIG_TYPE_BASE_CFG_WITH_EXT) { struct sof_ipc4_base_module_cfg_ext *base_cfg_ext; u32 ext_size = struct_size(base_cfg_ext, pin_formats, - swidget->num_input_pins + swidget->num_output_pins); + size_add(swidget->num_input_pins, + swidget->num_output_pins)); base_cfg_ext = kzalloc(ext_size, GFP_KERNEL); if (!base_cfg_ext) { @@ -907,6 +928,9 @@ sof_ipc4_widget_update_kcontrol_module_id(swidget); + /* set pipeline core mask to keep track of the core the module is scheduled to run on */ + spipe->core_mask |= BIT(swidget->core); + return 0; free_base_cfg_ext: kfree(process->base_config_ext); @@ -970,9 +994,16 @@ /* Update base_config->cpc from the module manifest */ sof_ipc4_update_cpc_from_manifest(sdev, fw_module, base_config); - dev_dbg(sdev->dev, "%s: ibs / obs / cpc: %u / %u / %u\n", - swidget->widget->name, base_config->ibs, base_config->obs, - base_config->cpc); + if (ignore_cpc) { + dev_dbg(sdev->dev, "%s: ibs / obs: %u / %u, forcing cpc to 0 from %u\n", + swidget->widget->name, base_config->ibs, base_config->obs, + base_config->cpc); + base_config->cpc = 0; + } else { + dev_dbg(sdev->dev, "%s: ibs / obs / cpc: %u / %u / %u\n", + swidget->widget->name, base_config->ibs, base_config->obs, + base_config->cpc); + } } static int sof_ipc4_widget_assign_instance_id(struct snd_sof_dev *sdev, @@ -1762,7 +1793,7 @@ u32 out_ref_rate, out_ref_channels, out_ref_valid_bits; int ret; - ret = sof_ipc4_init_input_audio_fmt(sdev, swidget, &gain->base_config, + ret = sof_ipc4_init_input_audio_fmt(sdev, swidget, &gain->data.base_config, pipeline_params, available_fmt); if (ret < 0) return ret; @@ -1772,7 +1803,7 @@ out_ref_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_fmt->fmt_cfg); out_ref_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_fmt->fmt_cfg); - ret = sof_ipc4_init_output_audio_fmt(sdev, &gain->base_config, available_fmt, + ret = sof_ipc4_init_output_audio_fmt(sdev, &gain->data.base_config, available_fmt, out_ref_rate, out_ref_channels, out_ref_valid_bits); if (ret < 0) { dev_err(sdev->dev, "Failed to initialize output format for %s", @@ -1781,7 +1812,7 @@ } /* update pipeline memory usage */ - sof_ipc4_update_resource_usage(sdev, swidget, &gain->base_config); + sof_ipc4_update_resource_usage(sdev, swidget, &gain->data.base_config); return 0; } @@ -1837,7 +1868,7 @@ struct snd_interval *rate; int ret; - ret = sof_ipc4_init_input_audio_fmt(sdev, swidget, &src->base_config, + ret = sof_ipc4_init_input_audio_fmt(sdev, swidget, &src->data.base_config, pipeline_params, available_fmt); if (ret < 0) return ret; @@ -1847,7 +1878,7 @@ out_ref_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_fmt->fmt_cfg); out_ref_valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_fmt->fmt_cfg); - ret = sof_ipc4_init_output_audio_fmt(sdev, &src->base_config, available_fmt, + ret = sof_ipc4_init_output_audio_fmt(sdev, &src->data.base_config, available_fmt, out_ref_rate, out_ref_channels, out_ref_valid_bits); if (ret < 0) { dev_err(sdev->dev, "Failed to initialize output format for %s", @@ -1855,11 +1886,11 @@ } /* update pipeline memory usage */ - sof_ipc4_update_resource_usage(sdev, swidget, &src->base_config); + sof_ipc4_update_resource_usage(sdev, swidget, &src->data.base_config); /* update pipeline_params for sink widgets */ rate = hw_param_interval(pipeline_params, SNDRV_PCM_HW_PARAM_RATE); - rate->min = src->sink_rate; + rate->min = src->data.sink_rate; rate->max = rate->min; return 0; @@ -2196,9 +2227,8 @@ { struct sof_ipc4_gain *gain = swidget->private; - ipc_size = sizeof(struct sof_ipc4_base_module_cfg) + - sizeof(struct sof_ipc4_gain_data); - ipc_data = gain; + ipc_size = sizeof(gain->data); + ipc_data = &gain->data; msg = &gain->msg; break; @@ -2217,8 +2247,8 @@ { struct sof_ipc4_src *src = swidget->private; - ipc_size = sizeof(struct sof_ipc4_base_module_cfg) + sizeof(src->sink_rate); - ipc_data = src; + ipc_size = sizeof(src->data); + ipc_data = &src->data; msg = &src->msg; break; --- linux-azure-6.5.0.orig/sound/soc/sof/ipc4-topology.h +++ linux-azure-6.5.0/sound/soc/sof/ipc4-topology.h @@ -344,7 +344,7 @@ }; /** - * struct sof_ipc4_gain_data - IPC gain blob + * struct sof_ipc4_gain_params - IPC gain parameters * @channels: Channels * @init_val: Initial value * @curve_type: Curve type @@ -352,24 +352,32 @@ * @curve_duration_l: Curve duration low part * @curve_duration_h: Curve duration high part */ -struct sof_ipc4_gain_data { +struct sof_ipc4_gain_params { uint32_t channels; uint32_t init_val; uint32_t curve_type; uint32_t reserved; uint32_t curve_duration_l; uint32_t curve_duration_h; -} __aligned(8); +} __packed __aligned(4); /** - * struct sof_ipc4_gain - gain config data + * struct sof_ipc4_gain_data - IPC gain init blob * @base_config: IPC base config data + * @params: Initial parameters for the gain module + */ +struct sof_ipc4_gain_data { + struct sof_ipc4_base_module_cfg base_config; + struct sof_ipc4_gain_params params; +} __packed __aligned(4); + +/** + * struct sof_ipc4_gain - gain config data * @data: IPC gain blob * @available_fmt: Available audio format * @msg: message structure for gain */ struct sof_ipc4_gain { - struct sof_ipc4_base_module_cfg base_config; struct sof_ipc4_gain_data data; struct sof_ipc4_available_audio_format available_fmt; struct sof_ipc4_msg msg; @@ -387,16 +395,24 @@ struct sof_ipc4_msg msg; }; -/** - * struct sof_ipc4_src SRC config data +/* + * struct sof_ipc4_src_data - IPC data for SRC * @base_config: IPC base config data * @sink_rate: Output rate for sink module + */ +struct sof_ipc4_src_data { + struct sof_ipc4_base_module_cfg base_config; + uint32_t sink_rate; +} __packed __aligned(4); + +/** + * struct sof_ipc4_src - SRC config data + * @data: IPC base config data * @available_fmt: Available audio format * @msg: IPC4 message struct containing header and data info */ struct sof_ipc4_src { - struct sof_ipc4_base_module_cfg base_config; - uint32_t sink_rate; + struct sof_ipc4_src_data data; struct sof_ipc4_available_audio_format available_fmt; struct sof_ipc4_msg msg; }; --- linux-azure-6.5.0.orig/sound/soc/sof/ipc4.c +++ linux-azure-6.5.0/sound/soc/sof/ipc4.c @@ -614,6 +614,9 @@ case SOF_IPC4_NOTIFY_LOG_BUFFER_STATUS: sof_ipc4_mtrace_update_pos(sdev, SOF_IPC4_LOG_CORE_GET(ipc4_msg->primary)); break; + case SOF_IPC4_NOTIFY_EXCEPTION_CAUGHT: + snd_sof_dsp_panic(sdev, 0, true); + break; default: dev_dbg(sdev->dev, "Unhandled DSP message: %#x|%#x\n", ipc4_msg->primary, ipc4_msg->extension); --- linux-azure-6.5.0.orig/sound/soc/sof/sof-audio.c +++ linux-azure-6.5.0/sound/soc/sof/sof-audio.c @@ -46,6 +46,7 @@ struct snd_sof_widget *swidget) { const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg); + struct snd_sof_pipeline *spipe = swidget->spipe; struct snd_sof_widget *pipe_widget; int err = 0; int ret; @@ -87,15 +88,22 @@ } /* - * disable widget core. continue to route setup status and complete flag - * even if this fails and return the appropriate error + * decrement ref count for cores associated with all modules in the pipeline and clear + * the complete flag */ - ret = snd_sof_dsp_core_put(sdev, swidget->core); - if (ret < 0) { - dev_err(sdev->dev, "error: failed to disable target core: %d for widget %s\n", - swidget->core, swidget->widget->name); - if (!err) - err = ret; + if (swidget->id == snd_soc_dapm_scheduler) { + int i; + + for_each_set_bit(i, &spipe->core_mask, sdev->num_cores) { + ret = snd_sof_dsp_core_put(sdev, i); + if (ret < 0) { + dev_err(sdev->dev, "failed to disable target core: %d for pipeline %s\n", + i, swidget->widget->name); + if (!err) + err = ret; + } + } + swidget->spipe->complete = 0; } /* @@ -108,10 +116,6 @@ err = ret; } - /* clear pipeline complete */ - if (swidget->id == snd_soc_dapm_scheduler) - swidget->spipe->complete = 0; - if (!err) dev_dbg(sdev->dev, "widget %s freed\n", swidget->widget->name); @@ -134,8 +138,10 @@ struct snd_sof_widget *swidget) { const struct sof_ipc_tplg_ops *tplg_ops = sof_ipc_get_ops(sdev, tplg); + struct snd_sof_pipeline *spipe = swidget->spipe; bool use_count_decremented = false; int ret; + int i; /* skip if there is no private data */ if (!swidget->private) @@ -166,19 +172,23 @@ goto use_count_dec; } - /* enable widget core */ - ret = snd_sof_dsp_core_get(sdev, swidget->core); - if (ret < 0) { - dev_err(sdev->dev, "error: failed to enable target core for widget %s\n", - swidget->widget->name); - goto pipe_widget_free; + /* update ref count for cores associated with all modules in the pipeline */ + if (swidget->id == snd_soc_dapm_scheduler) { + for_each_set_bit(i, &spipe->core_mask, sdev->num_cores) { + ret = snd_sof_dsp_core_get(sdev, i); + if (ret < 0) { + dev_err(sdev->dev, "failed to enable target core %d for pipeline %s\n", + i, swidget->widget->name); + goto pipe_widget_free; + } + } } /* setup widget in the DSP */ if (tplg_ops && tplg_ops->widget_setup) { ret = tplg_ops->widget_setup(sdev, swidget); if (ret < 0) - goto core_put; + goto pipe_widget_free; } /* send config for DAI components */ @@ -208,14 +218,22 @@ return 0; widget_free: - /* widget use_count and core ref_count will both be decremented by sof_widget_free() */ + /* widget use_count will be decremented by sof_widget_free() */ sof_widget_free_unlocked(sdev, swidget); use_count_decremented = true; -core_put: - snd_sof_dsp_core_put(sdev, swidget->core); pipe_widget_free: - if (swidget->id != snd_soc_dapm_scheduler) + if (swidget->id != snd_soc_dapm_scheduler) { sof_widget_free_unlocked(sdev, swidget->spipe->pipe_widget); + } else { + int j; + + /* decrement ref count for all cores that were updated previously */ + for_each_set_bit(j, &spipe->core_mask, sdev->num_cores) { + if (j >= i) + break; + snd_sof_dsp_core_put(sdev, j); + } + } use_count_dec: if (!use_count_decremented) swidget->use_count--; @@ -1031,6 +1049,13 @@ mach = snd_sof_machine_select(sdev); if (mach) { sof_pdata->machine = mach; + + if (sof_pdata->subsystem_id_set) { + mach->mach_params.subsystem_vendor = sof_pdata->subsystem_vendor; + mach->mach_params.subsystem_device = sof_pdata->subsystem_device; + mach->mach_params.subsystem_id_set = true; + } + snd_sof_set_mach_params(mach, sdev); return 0; } --- linux-azure-6.5.0.orig/sound/soc/sof/sof-audio.h +++ linux-azure-6.5.0/sound/soc/sof/sof-audio.h @@ -480,6 +480,7 @@ * @paused_count: Count of number of PCM's that have started and have currently paused this pipeline * @complete: flag used to indicate that pipeline set up is complete. + * @core_mask: Mask containing target cores for all modules in the pipeline * @list: List item in sdev pipeline_list */ struct snd_sof_pipeline { @@ -487,6 +488,7 @@ int started_count; int paused_count; int complete; + unsigned long core_mask; struct list_head list; }; --- linux-azure-6.5.0.orig/sound/soc/sof/sof-pci-dev.c +++ linux-azure-6.5.0/sound/soc/sof/sof-pci-dev.c @@ -145,6 +145,13 @@ DMI_MATCH(DMI_PRODUCT_FAMILY, "Google"), } }, + { + .ident = "Google firmware", + .callback = chromebook_use_community_key, + .matches = { + DMI_MATCH(DMI_BIOS_VERSION, "Google"), + } + }, {}, }; @@ -214,6 +221,14 @@ return ret; sof_pdata->name = pci_name(pci); + + /* PCI defines a vendor ID of 0xFFFF as invalid. */ + if (pci->subsystem_vendor != 0xFFFF) { + sof_pdata->subsystem_vendor = pci->subsystem_vendor; + sof_pdata->subsystem_device = pci->subsystem_device; + sof_pdata->subsystem_id_set = true; + } + sof_pdata->desc = desc; sof_pdata->dev = dev; --- linux-azure-6.5.0.orig/sound/soc/sof/topology.c +++ linux-azure-6.5.0/sound/soc/sof/topology.c @@ -1117,10 +1117,11 @@ { struct snd_soc_card *card = scomp->card; struct snd_soc_pcm_runtime *rtd; + const char *sname = w->sname; struct snd_soc_dai *cpu_dai; int i, stream; - if (!w->sname) + if (!sname) return; if (w->id == snd_soc_dapm_dai_out) @@ -1133,7 +1134,7 @@ list_for_each_entry(rtd, &card->rtd_list, list) { /* does stream match DAI link ? */ if (!rtd->dai_link->stream_name || - strcmp(w->sname, rtd->dai_link->stream_name)) + strcmp(sname, rtd->dai_link->stream_name)) continue; for_each_rtd_cpu_dais(rtd, i, cpu_dai) @@ -1713,8 +1714,10 @@ /* perform pcm set op */ if (ipc_pcm_ops && ipc_pcm_ops->pcm_setup) { ret = ipc_pcm_ops->pcm_setup(sdev, spcm); - if (ret < 0) + if (ret < 0) { + kfree(spcm); return ret; + } } dai_drv->dobj.private = spcm; --- linux-azure-6.5.0.orig/sound/soc/tegra/tegra210_sfc.c +++ linux-azure-6.5.0/sound/soc/tegra/tegra210_sfc.c @@ -2,7 +2,7 @@ // // tegra210_sfc.c - Tegra210 SFC driver // -// Copyright (c) 2021 NVIDIA CORPORATION. All rights reserved. +// Copyright (c) 2021-2023 NVIDIA CORPORATION. All rights reserved. #include #include @@ -42,6 +42,7 @@ 32000, 44100, 48000, + 64000, 88200, 96000, 176400, @@ -2857,6 +2858,7 @@ coef_8to32, coef_8to44, coef_8to48, + UNSUPP_CONV, coef_8to88, coef_8to96, UNSUPP_CONV, @@ -2872,6 +2874,7 @@ coef_11to32, coef_11to44, coef_11to48, + UNSUPP_CONV, coef_11to88, coef_11to96, UNSUPP_CONV, @@ -2887,6 +2890,7 @@ coef_16to32, coef_16to44, coef_16to48, + UNSUPP_CONV, coef_16to88, coef_16to96, coef_16to176, @@ -2902,6 +2906,7 @@ coef_22to32, coef_22to44, coef_22to48, + UNSUPP_CONV, coef_22to88, coef_22to96, coef_22to176, @@ -2917,6 +2922,7 @@ coef_24to32, coef_24to44, coef_24to48, + UNSUPP_CONV, coef_24to88, coef_24to96, coef_24to176, @@ -2932,6 +2938,7 @@ BYPASS_CONV, coef_32to44, coef_32to48, + UNSUPP_CONV, coef_32to88, coef_32to96, coef_32to176, @@ -2947,6 +2954,7 @@ coef_44to32, BYPASS_CONV, coef_44to48, + UNSUPP_CONV, coef_44to88, coef_44to96, coef_44to176, @@ -2962,11 +2970,28 @@ coef_48to32, coef_48to44, BYPASS_CONV, + UNSUPP_CONV, coef_48to88, coef_48to96, coef_48to176, coef_48to192, }, + /* Convertions from 64 kHz */ + { + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + UNSUPP_CONV, + }, /* Convertions from 88.2 kHz */ { coef_88to8, @@ -2977,6 +3002,7 @@ coef_88to32, coef_88to44, coef_88to48, + UNSUPP_CONV, BYPASS_CONV, coef_88to96, coef_88to176, @@ -2991,6 +3017,7 @@ coef_96to32, coef_96to44, coef_96to48, + UNSUPP_CONV, coef_96to88, BYPASS_CONV, coef_96to176, @@ -3006,6 +3033,7 @@ coef_176to32, coef_176to44, coef_176to48, + UNSUPP_CONV, coef_176to88, coef_176to96, BYPASS_CONV, @@ -3021,6 +3049,7 @@ coef_192to32, coef_192to44, coef_192to48, + UNSUPP_CONV, coef_192to88, coef_192to96, coef_192to176, --- linux-azure-6.5.0.orig/sound/soc/tegra/tegra210_sfc.h +++ linux-azure-6.5.0/sound/soc/tegra/tegra210_sfc.h @@ -2,7 +2,7 @@ /* * tegra210_sfc.h - Definitions for Tegra210 SFC driver * - * Copyright (c) 2021 NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2021-2023 NVIDIA CORPORATION. All rights reserved. * */ @@ -47,7 +47,7 @@ #define TEGRA210_SFC_EN_SHIFT 0 #define TEGRA210_SFC_EN (1 << TEGRA210_SFC_EN_SHIFT) -#define TEGRA210_SFC_NUM_RATES 12 +#define TEGRA210_SFC_NUM_RATES 13 /* Fields in TEGRA210_SFC_COEF_RAM */ #define TEGRA210_SFC_COEF_RAM_EN BIT(0) --- linux-azure-6.5.0.orig/sound/soc/tegra/tegra_audio_graph_card.c +++ linux-azure-6.5.0/sound/soc/tegra/tegra_audio_graph_card.c @@ -10,6 +10,7 @@ #include #include #include +#include #define MAX_PLLA_OUT0_DIV 128 @@ -44,6 +45,21 @@ unsigned int plla_out0_rates[NUM_RATE_TYPE]; }; +static bool need_clk_update(struct snd_soc_dai *dai) +{ + if (snd_soc_dai_is_dummy(dai) || + !dai->driver->ops || + !dai->driver->name) + return false; + + if (strstr(dai->driver->name, "I2S") || + strstr(dai->driver->name, "DMIC") || + strstr(dai->driver->name, "DSPK")) + return true; + + return false; +} + /* Setup PLL clock as per the given sample rate */ static int tegra_audio_graph_update_pll(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params) @@ -140,19 +156,7 @@ struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0); int err; - /* - * This gets called for each DAI link (FE or BE) when DPCM is used. - * We may not want to update PLLA rate for each call. So PLLA update - * must be restricted to external I/O links (I2S, DMIC or DSPK) since - * they actually depend on it. I/O modules update their clocks in - * hw_param() of their respective component driver and PLLA rate - * update here helps them to derive appropriate rates. - * - * TODO: When more HW accelerators get added (like sample rate - * converter, volume gain controller etc., which don't really - * depend on PLLA) we need a better way to filter here. - */ - if (cpu_dai->driver->ops && rtd->dai_link->no_pcm) { + if (need_clk_update(cpu_dai)) { err = tegra_audio_graph_update_pll(substream, params); if (err) return err; --- linux-azure-6.5.0.orig/sound/soc/ti/ams-delta.c +++ linux-azure-6.5.0/sound/soc/ti/ams-delta.c @@ -303,7 +303,7 @@ static void cx81801_close(struct tty_struct *tty) { struct snd_soc_component *component = tty->disc_data; - struct snd_soc_dapm_context *dapm = &component->card->dapm; + struct snd_soc_dapm_context *dapm; del_timer_sync(&cx81801_timer); @@ -315,6 +315,8 @@ v253_ops.close(tty); + dapm = &component->card->dapm; + /* Revert back to default audio input/output constellation */ snd_soc_dapm_mutex_lock(dapm); --- linux-azure-6.5.0.orig/sound/soc/ti/omap-mcbsp.c +++ linux-azure-6.5.0/sound/soc/ti/omap-mcbsp.c @@ -74,14 +74,16 @@ return -EINVAL; } - pm_runtime_put_sync(mcbsp->dev); + if (mcbsp->active) + pm_runtime_put_sync(mcbsp->dev); r = clk_set_parent(mcbsp->fclk, fck_src); if (r) dev_err(mcbsp->dev, "CLKS: could not clk_set_parent() to %s\n", src); - pm_runtime_get_sync(mcbsp->dev); + if (mcbsp->active) + pm_runtime_get_sync(mcbsp->dev); clk_put(fck_src); --- linux-azure-6.5.0.orig/sound/usb/midi2.c +++ linux-azure-6.5.0/sound/usb/midi2.c @@ -265,7 +265,7 @@ if (!ep) return; - for (i = 0; i < ep->num_urbs; ++i) { + for (i = 0; i < NUM_URBS; ++i) { ctx = &ep->urbs[i]; if (!ctx->urb) break; @@ -279,6 +279,7 @@ } /* allocate URBs for an EP */ +/* the callers should handle allocation errors via free_midi_urbs() */ static int alloc_midi_urbs(struct snd_usb_midi2_endpoint *ep) { struct snd_usb_midi2_urb *ctx; @@ -351,8 +352,10 @@ return -EIO; if (ep->direction == STR_OUT) { err = alloc_midi_urbs(ep); - if (err) + if (err) { + free_midi_urbs(ep); return err; + } } return 0; } @@ -990,7 +993,7 @@ } } - return attach_legacy_rawmidi(umidi); + return 0; } /* is the given interface for MIDI 2.0? */ @@ -1059,12 +1062,6 @@ usb_string(dev, dev->descriptor.iSerialNumber, ump->info.product_id, sizeof(ump->info.product_id)); -#if IS_ENABLED(CONFIG_SND_UMP_LEGACY_RAWMIDI) - if (ump->legacy_rmidi && !*ump->legacy_rmidi->name) - snprintf(ump->legacy_rmidi->name, - sizeof(ump->legacy_rmidi->name), - "%s (MIDI 1.0)", ump->info.name); -#endif } } @@ -1157,6 +1154,13 @@ } set_fallback_rawmidi_names(umidi); + + err = attach_legacy_rawmidi(umidi); + if (err < 0) { + usb_audio_err(chip, "Failed to create legacy rawmidi\n"); + goto error; + } + return 0; error: --- linux-azure-6.5.0.orig/sound/usb/mixer.c +++ linux-azure-6.5.0/sound/usb/mixer.c @@ -1204,6 +1204,13 @@ cval->res = 16; } break; + case USB_ID(0x1bcf, 0x2283): /* NexiGo N930AF FHD Webcam */ + if (!strcmp(kctl->id.name, "Mic Capture Volume")) { + usb_audio_info(chip, + "set resolution quirk: cval->res = 16\n"); + cval->res = 16; + } + break; } } --- linux-azure-6.5.0.orig/sound/usb/mixer_quirks.c +++ linux-azure-6.5.0/sound/usb/mixer_quirks.c @@ -2978,6 +2978,7 @@ #define SND_DJM_850_IDX 0x2 #define SND_DJM_900NXS2_IDX 0x3 #define SND_DJM_750MK2_IDX 0x4 +#define SND_DJM_450_IDX 0x5 #define SND_DJM_CTL(_name, suffix, _default_value, _windex) { \ @@ -3108,6 +3109,31 @@ }; +// DJM-450 +static const u16 snd_djm_opts_450_cap1[] = { + 0x0103, 0x0100, 0x0106, 0x0107, 0x0108, 0x0109, 0x010d, 0x010a }; + +static const u16 snd_djm_opts_450_cap2[] = { + 0x0203, 0x0200, 0x0206, 0x0207, 0x0208, 0x0209, 0x020d, 0x020a }; + +static const u16 snd_djm_opts_450_cap3[] = { + 0x030a, 0x0311, 0x0312, 0x0307, 0x0308, 0x0309, 0x030d }; + +static const u16 snd_djm_opts_450_pb1[] = { 0x0100, 0x0101, 0x0104 }; +static const u16 snd_djm_opts_450_pb2[] = { 0x0200, 0x0201, 0x0204 }; +static const u16 snd_djm_opts_450_pb3[] = { 0x0300, 0x0301, 0x0304 }; + +static const struct snd_djm_ctl snd_djm_ctls_450[] = { + SND_DJM_CTL("Capture Level", cap_level, 0, SND_DJM_WINDEX_CAPLVL), + SND_DJM_CTL("Ch1 Input", 450_cap1, 2, SND_DJM_WINDEX_CAP), + SND_DJM_CTL("Ch2 Input", 450_cap2, 2, SND_DJM_WINDEX_CAP), + SND_DJM_CTL("Ch3 Input", 450_cap3, 0, SND_DJM_WINDEX_CAP), + SND_DJM_CTL("Ch1 Output", 450_pb1, 0, SND_DJM_WINDEX_PB), + SND_DJM_CTL("Ch2 Output", 450_pb2, 1, SND_DJM_WINDEX_PB), + SND_DJM_CTL("Ch3 Output", 450_pb3, 2, SND_DJM_WINDEX_PB) +}; + + // DJM-750 static const u16 snd_djm_opts_750_cap1[] = { 0x0101, 0x0103, 0x0106, 0x0107, 0x0108, 0x0109, 0x010a, 0x010f }; @@ -3203,6 +3229,7 @@ [SND_DJM_850_IDX] = SND_DJM_DEVICE(850), [SND_DJM_900NXS2_IDX] = SND_DJM_DEVICE(900nxs2), [SND_DJM_750MK2_IDX] = SND_DJM_DEVICE(750mk2), + [SND_DJM_450_IDX] = SND_DJM_DEVICE(450), }; @@ -3449,6 +3476,9 @@ case USB_ID(0x2b73, 0x0017): /* Pioneer DJ DJM-250MK2 */ err = snd_djm_controls_create(mixer, SND_DJM_250MK2_IDX); break; + case USB_ID(0x2b73, 0x0013): /* Pioneer DJ DJM-450 */ + err = snd_djm_controls_create(mixer, SND_DJM_450_IDX); + break; case USB_ID(0x08e4, 0x017f): /* Pioneer DJ DJM-750 */ err = snd_djm_controls_create(mixer, SND_DJM_750_IDX); break; --- linux-azure-6.5.0.orig/sound/usb/quirks.c +++ linux-azure-6.5.0/sound/usb/quirks.c @@ -1387,7 +1387,7 @@ static int snd_usb_motu_m_series_boot_quirk(struct usb_device *dev) { - msleep(2000); + msleep(4000); return 0; } @@ -1630,7 +1630,7 @@ unsigned int id) { switch (id) { - case USB_ID(0x07fd, 0x0008): /* MOTU M Series */ + case USB_ID(0x07fd, 0x0008): /* MOTU M Series, 1st hardware version */ return snd_usb_motu_m_series_boot_quirk(dev); } @@ -1994,7 +1994,11 @@ /* mic works only when ep packet size is set to wMaxPacketSize */ fp->attributes |= UAC_EP_CS_ATTR_FILL_MAX; break; - + case USB_ID(0x3511, 0x2b1e): /* Opencomm2 UC USB Bluetooth dongle */ + /* mic works only when ep pitch control is not set */ + if (stream == SNDRV_PCM_STREAM_CAPTURE) + fp->attributes &= ~UAC_EP_CS_ATTR_PITCH_CONTROL; + break; } } @@ -2173,6 +2177,8 @@ QUIRK_FLAG_FIXED_RATE), DEVICE_FLG(0x0ecb, 0x2069, /* JBL Quantum810 Wireless */ QUIRK_FLAG_FIXED_RATE), + DEVICE_FLG(0x1bcf, 0x2283, /* NexiGo N930AF FHD Webcam */ + QUIRK_FLAG_GET_SAMPLE_RATE), /* Vendor matches */ VENDOR_FLG(0x045e, /* MS Lifecam */ @@ -2214,6 +2220,8 @@ QUIRK_FLAG_DSD_RAW), VENDOR_FLG(0x2ab6, /* T+A devices */ QUIRK_FLAG_DSD_RAW), + VENDOR_FLG(0x2afd, /* McIntosh Laboratory, Inc. */ + QUIRK_FLAG_DSD_RAW), VENDOR_FLG(0x2d87, /* Cayin device */ QUIRK_FLAG_DSD_RAW), VENDOR_FLG(0x3336, /* HEM devices */ --- linux-azure-6.5.0.orig/sound/usb/stream.c +++ linux-azure-6.5.0/sound/usb/stream.c @@ -1093,6 +1093,7 @@ int i, altno, err, stream; struct audioformat *fp = NULL; struct snd_usb_power_domain *pd = NULL; + bool set_iface_first; int num, protocol; dev = chip->dev; @@ -1223,11 +1224,19 @@ return err; } + set_iface_first = false; + if (protocol == UAC_VERSION_1 || + (chip->quirk_flags & QUIRK_FLAG_SET_IFACE_FIRST)) + set_iface_first = true; + /* try to set the interface... */ usb_set_interface(chip->dev, iface_no, 0); + if (set_iface_first) + usb_set_interface(chip->dev, iface_no, altno); snd_usb_init_pitch(chip, fp); snd_usb_init_sample_rate(chip, fp, fp->rate_max); - usb_set_interface(chip->dev, iface_no, altno); + if (!set_iface_first) + usb_set_interface(chip->dev, iface_no, altno); } return 0; } --- linux-azure-6.5.0.orig/tools/arch/parisc/include/uapi/asm/errno.h +++ linux-azure-6.5.0/tools/arch/parisc/include/uapi/asm/errno.h @@ -75,7 +75,6 @@ /* We now return you to your regularly scheduled HPUX. */ -#define ENOSYM 215 /* symbol does not exist in executable */ #define ENOTSOCK 216 /* Socket operation on non-socket */ #define EDESTADDRREQ 217 /* Destination address required */ #define EMSGSIZE 218 /* Message too long */ @@ -101,7 +100,6 @@ #define ETIMEDOUT 238 /* Connection timed out */ #define ECONNREFUSED 239 /* Connection refused */ #define EREFUSED ECONNREFUSED /* for HP's NFS apparently */ -#define EREMOTERELEASE 240 /* Remote peer released connection */ #define EHOSTDOWN 241 /* Host is down */ #define EHOSTUNREACH 242 /* No route to host */ --- linux-azure-6.5.0.orig/tools/bpf/bpftool/gen.c +++ linux-azure-6.5.0/tools/bpf/bpftool/gen.c @@ -1209,7 +1209,7 @@ codegen("\ \n\ \n\ - s->data = (void *)%2$s__elf_bytes(&s->data_sz); \n\ + s->data = %1$s__elf_bytes(&s->data_sz); \n\ \n\ obj->skeleton = s; \n\ return 0; \n\ @@ -1218,12 +1218,12 @@ return err; \n\ } \n\ \n\ - static inline const void *%2$s__elf_bytes(size_t *sz) \n\ + static inline const void *%1$s__elf_bytes(size_t *sz) \n\ { \n\ - *sz = %1$d; \n\ - return (const void *)\"\\ \n\ - " - , file_sz, obj_name); + static const char data[] __attribute__((__aligned__(8))) = \"\\\n\ + ", + obj_name + ); /* embed contents of BPF object file */ print_hex(obj_data, file_sz); @@ -1231,6 +1231,9 @@ codegen("\ \n\ \"; \n\ + \n\ + *sz = sizeof(data) - 1; \n\ + return (const void *)data; \n\ } \n\ \n\ #ifdef __cplusplus \n\ --- linux-azure-6.5.0.orig/tools/bpf/bpftool/skeleton/pid_iter.bpf.c +++ linux-azure-6.5.0/tools/bpf/bpftool/skeleton/pid_iter.bpf.c @@ -15,6 +15,19 @@ BPF_OBJ_BTF, }; +struct bpf_perf_link___local { + struct bpf_link link; + struct file *perf_file; +} __attribute__((preserve_access_index)); + +struct perf_event___local { + u64 bpf_cookie; +} __attribute__((preserve_access_index)); + +enum bpf_link_type___local { + BPF_LINK_TYPE_PERF_EVENT___local = 7, +}; + extern const void bpf_link_fops __ksym; extern const void bpf_map_fops __ksym; extern const void bpf_prog_fops __ksym; @@ -41,10 +54,10 @@ /* could be used only with BPF_LINK_TYPE_PERF_EVENT links */ static __u64 get_bpf_cookie(struct bpf_link *link) { - struct bpf_perf_link *perf_link; - struct perf_event *event; + struct bpf_perf_link___local *perf_link; + struct perf_event___local *event; - perf_link = container_of(link, struct bpf_perf_link, link); + perf_link = container_of(link, struct bpf_perf_link___local, link); event = BPF_CORE_READ(perf_link, perf_file, private_data); return BPF_CORE_READ(event, bpf_cookie); } @@ -84,10 +97,13 @@ e.pid = task->tgid; e.id = get_obj_id(file->private_data, obj_type); - if (obj_type == BPF_OBJ_LINK) { + if (obj_type == BPF_OBJ_LINK && + bpf_core_enum_value_exists(enum bpf_link_type___local, + BPF_LINK_TYPE_PERF_EVENT___local)) { struct bpf_link *link = (struct bpf_link *) file->private_data; - if (BPF_CORE_READ(link, type) == BPF_LINK_TYPE_PERF_EVENT) { + if (link->type == bpf_core_enum_value(enum bpf_link_type___local, + BPF_LINK_TYPE_PERF_EVENT___local)) { e.has_bpf_cookie = true; e.bpf_cookie = get_bpf_cookie(link); } --- linux-azure-6.5.0.orig/tools/bpf/bpftool/skeleton/profiler.bpf.c +++ linux-azure-6.5.0/tools/bpf/bpftool/skeleton/profiler.bpf.c @@ -4,6 +4,12 @@ #include #include +struct bpf_perf_event_value___local { + __u64 counter; + __u64 enabled; + __u64 running; +} __attribute__((preserve_access_index)); + /* map of perf event fds, num_cpu * num_metric entries */ struct { __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); @@ -15,14 +21,14 @@ struct { __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(struct bpf_perf_event_value)); + __uint(value_size, sizeof(struct bpf_perf_event_value___local)); } fentry_readings SEC(".maps"); /* accumulated readings */ struct { __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(struct bpf_perf_event_value)); + __uint(value_size, sizeof(struct bpf_perf_event_value___local)); } accum_readings SEC(".maps"); /* sample counts, one per cpu */ @@ -39,7 +45,7 @@ SEC("fentry/XXX") int BPF_PROG(fentry_XXX) { - struct bpf_perf_event_value *ptrs[MAX_NUM_MATRICS]; + struct bpf_perf_event_value___local *ptrs[MAX_NUM_MATRICS]; u32 key = bpf_get_smp_processor_id(); u32 i; @@ -53,10 +59,10 @@ } for (i = 0; i < num_metric && i < MAX_NUM_MATRICS; i++) { - struct bpf_perf_event_value reading; + struct bpf_perf_event_value___local reading; int err; - err = bpf_perf_event_read_value(&events, key, &reading, + err = bpf_perf_event_read_value(&events, key, (void *)&reading, sizeof(reading)); if (err) return 0; @@ -68,14 +74,14 @@ } static inline void -fexit_update_maps(u32 id, struct bpf_perf_event_value *after) +fexit_update_maps(u32 id, struct bpf_perf_event_value___local *after) { - struct bpf_perf_event_value *before, diff; + struct bpf_perf_event_value___local *before, diff; before = bpf_map_lookup_elem(&fentry_readings, &id); /* only account samples with a valid fentry_reading */ if (before && before->counter) { - struct bpf_perf_event_value *accum; + struct bpf_perf_event_value___local *accum; diff.counter = after->counter - before->counter; diff.enabled = after->enabled - before->enabled; @@ -93,7 +99,7 @@ SEC("fexit/XXX") int BPF_PROG(fexit_XXX) { - struct bpf_perf_event_value readings[MAX_NUM_MATRICS]; + struct bpf_perf_event_value___local readings[MAX_NUM_MATRICS]; u32 cpu = bpf_get_smp_processor_id(); u32 i, zero = 0; int err; @@ -102,7 +108,8 @@ /* read all events before updating the maps, to reduce error */ for (i = 0; i < num_metric && i < MAX_NUM_MATRICS; i++) { err = bpf_perf_event_read_value(&events, cpu + i * num_cpu, - readings + i, sizeof(*readings)); + (void *)(readings + i), + sizeof(*readings)); if (err) return 0; } --- linux-azure-6.5.0.orig/tools/build/Makefile.build +++ linux-azure-6.5.0/tools/build/Makefile.build @@ -117,6 +117,16 @@ $(call rule_mkdir) $(call if_changed_dep,cc_s_c) +# bison and flex files are generated in the OUTPUT directory +# so it needs a separate rule to depend on them properly +$(OUTPUT)%-bison.o: $(OUTPUT)%-bison.c FORCE + $(call rule_mkdir) + $(call if_changed_dep,$(host)cc_o_c) + +$(OUTPUT)%-flex.o: $(OUTPUT)%-flex.c FORCE + $(call rule_mkdir) + $(call if_changed_dep,$(host)cc_o_c) + # Gather build data: # obj-y - list of build objects # subdir-y - list of directories to nest --- linux-azure-6.5.0.orig/tools/hv/hv_kvp_daemon.8 +++ linux-azure-6.5.0/tools/hv/hv_kvp_daemon.8 @@ -0,0 +1,26 @@ +.\" This page Copyright (C) 2012 Andy Whitcroft +.\" Distributed under the GPL v2 or later. +.TH HV_KVP_DAEMON 8 +.SH NAME +hv_kvp_daemon \- Hyper-V Key Value Pair daemon +.SH SYNOPSIS +.ft B +.B hv_kvp_daemon +.br +.SH DESCRIPTION +\fBhv_kvp_daemon\fP +is the userspace component of the Hyper-V key value pair functionality, +communicating via a netlink socket with the kernel HV-KVP driver. +This pairing allows the Hyper-V host to pass configuration information +(such as IP addresses) to the guest and allows the host to obtain guest +version information. + +.SH FILES +.ta +.nf +/var/opt/hyperv/.kvp_pool_* +.fi + +.SH AUTHORS +.nf +Written by K. Y. Srinivasan --- linux-azure-6.5.0.orig/tools/hv/lsvmbus +++ linux-azure-6.5.0/tools/hv/lsvmbus @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # SPDX-License-Identifier: GPL-2.0 import os --- linux-azure-6.5.0.orig/tools/hv/lsvmbus.8 +++ linux-azure-6.5.0/tools/hv/lsvmbus.8 @@ -0,0 +1,23 @@ +.\" This page Copyright (C) 2016 Andy Whitcroft +.\" Distributed under the GPL v2 or later. +.TH LSVMBUS 8 +.SH NAME +lsvmbus \- List Hyper-V VMBus devices +.SH SYNOPSIS +.ft B +.B lsvmbus [-vv] +.br +.SH DESCRIPTION +\fBlsvmbus\fP +displays devices attached to the Hyper-V VMBus. +.SH OPTIONS +.\" +.TP +.B -v +With -v more information is printed including the VMBus Rel_ID, class ID, +Rel_ID, and which channel is bound to which virtual processor. Use -vv +for additional detail including the Device_ID and the sysfs path. +.\" +.SH AUTHORS +.nf +Written by Dexuan Cui --- linux-azure-6.5.0.orig/tools/iio/iio_generic_buffer.c +++ linux-azure-6.5.0/tools/iio/iio_generic_buffer.c @@ -51,12 +51,15 @@ * Has the side effect of filling the channels[i].location values used * in processing the buffer output. **/ -static int size_from_channelarray(struct iio_channel_info *channels, int num_channels) +static unsigned int size_from_channelarray(struct iio_channel_info *channels, int num_channels) { - int bytes = 0; - int i = 0; + unsigned int bytes = 0; + int i = 0, max = 0; + unsigned int misalignment; while (i < num_channels) { + if (channels[i].bytes > max) + max = channels[i].bytes; if (bytes % channels[i].bytes == 0) channels[i].location = bytes; else @@ -66,6 +69,14 @@ bytes = channels[i].location + channels[i].bytes; i++; } + /* + * We want the data in next sample to also be properly aligned so + * we'll add padding at the end if needed. Adding padding only + * works for channel data which size is 2^n bytes. + */ + misalignment = bytes % max; + if (misalignment) + bytes += max - misalignment; return bytes; } @@ -348,7 +359,7 @@ ssize_t read_size; int dev_num = -1, trig_num = -1; char *buffer_access = NULL; - int scan_size; + unsigned int scan_size; int noevents = 0; int notrigger = 0; char *dummy; @@ -674,7 +685,16 @@ } scan_size = size_from_channelarray(channels, num_channels); - data = malloc(scan_size * buf_len); + + size_t total_buf_len = scan_size * buf_len; + + if (scan_size > 0 && total_buf_len / scan_size != buf_len) { + ret = -EFAULT; + perror("Integer overflow happened when calculate scan_size * buf_len"); + goto error; + } + + data = malloc(total_buf_len); if (!data) { ret = -ENOMEM; goto error; --- linux-azure-6.5.0.orig/tools/include/linux/btf_ids.h +++ linux-azure-6.5.0/tools/include/linux/btf_ids.h @@ -38,7 +38,7 @@ ____BTF_ID(symbol) #define __ID(prefix) \ - __PASTE(prefix, __COUNTER__) + __PASTE(__PASTE(prefix, __COUNTER__), __LINE__) /* * The BTF_ID defines unique symbol for each ID pointing --- linux-azure-6.5.0.orig/tools/include/linux/mm.h +++ linux-azure-6.5.0/tools/include/linux/mm.h @@ -11,8 +11,6 @@ #define PHYS_ADDR_MAX (~(phys_addr_t)0) -#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1) -#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask)) #define ALIGN(x, a) __ALIGN_KERNEL((x), (a)) #define ALIGN_DOWN(x, a) __ALIGN_KERNEL((x) - ((a) - 1), (a)) @@ -29,7 +27,7 @@ return __va(address); } -void reserve_bootmem_region(phys_addr_t start, phys_addr_t end); +void reserve_bootmem_region(phys_addr_t start, phys_addr_t end, int nid); static inline void totalram_pages_inc(void) { --- linux-azure-6.5.0.orig/tools/include/linux/rwsem.h +++ linux-azure-6.5.0/tools/include/linux/rwsem.h @@ -0,0 +1,40 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +#ifndef _TOOLS__RWSEM_H +#define _TOOLS__RWSEM_H + +#include + +struct rw_semaphore { + pthread_rwlock_t lock; +}; + +static inline int init_rwsem(struct rw_semaphore *sem) +{ + return pthread_rwlock_init(&sem->lock, NULL); +} + +static inline int exit_rwsem(struct rw_semaphore *sem) +{ + return pthread_rwlock_destroy(&sem->lock); +} + +static inline int down_read(struct rw_semaphore *sem) +{ + return pthread_rwlock_rdlock(&sem->lock); +} + +static inline int up_read(struct rw_semaphore *sem) +{ + return pthread_rwlock_unlock(&sem->lock); +} + +static inline int down_write(struct rw_semaphore *sem) +{ + return pthread_rwlock_wrlock(&sem->lock); +} + +static inline int up_write(struct rw_semaphore *sem) +{ + return pthread_rwlock_unlock(&sem->lock); +} +#endif /* _TOOLS_RWSEM_H */ --- linux-azure-6.5.0.orig/tools/include/linux/seq_file.h +++ linux-azure-6.5.0/tools/include/linux/seq_file.h @@ -1,4 +1,6 @@ #ifndef _TOOLS_INCLUDE_LINUX_SEQ_FILE_H #define _TOOLS_INCLUDE_LINUX_SEQ_FILE_H +struct seq_file; + #endif /* _TOOLS_INCLUDE_LINUX_SEQ_FILE_H */ --- linux-azure-6.5.0.orig/tools/include/nolibc/arch-aarch64.h +++ linux-azure-6.5.0/tools/include/nolibc/arch-aarch64.h @@ -175,7 +175,7 @@ const unsigned long *_auxv __attribute__((weak)); /* startup code */ -void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) __no_stack_protector _start(void) +void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void) { __asm__ volatile ( #ifdef _NOLIBC_STACKPROTECTOR --- linux-azure-6.5.0.orig/tools/include/nolibc/arch-arm.h +++ linux-azure-6.5.0/tools/include/nolibc/arch-arm.h @@ -225,7 +225,7 @@ const unsigned long *_auxv __attribute__((weak)); /* startup code */ -void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) __no_stack_protector _start(void) +void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void) { __asm__ volatile ( #ifdef _NOLIBC_STACKPROTECTOR --- linux-azure-6.5.0.orig/tools/include/nolibc/arch-i386.h +++ linux-azure-6.5.0/tools/include/nolibc/arch-i386.h @@ -190,7 +190,7 @@ * 2) The deepest stack frame should be set to zero * */ -void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) __no_stack_protector _start(void) +void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void) { __asm__ volatile ( #ifdef _NOLIBC_STACKPROTECTOR --- linux-azure-6.5.0.orig/tools/include/nolibc/arch-loongarch.h +++ linux-azure-6.5.0/tools/include/nolibc/arch-loongarch.h @@ -172,7 +172,7 @@ #endif /* startup code */ -void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) __no_stack_protector _start(void) +void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void) { __asm__ volatile ( #ifdef _NOLIBC_STACKPROTECTOR --- linux-azure-6.5.0.orig/tools/include/nolibc/arch-mips.h +++ linux-azure-6.5.0/tools/include/nolibc/arch-mips.h @@ -182,7 +182,7 @@ const unsigned long *_auxv __attribute__((weak)); /* startup code, note that it's called __start on MIPS */ -void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) __no_stack_protector __start(void) +void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector __start(void) { __asm__ volatile ( /*".set nomips16\n"*/ --- linux-azure-6.5.0.orig/tools/include/nolibc/arch-riscv.h +++ linux-azure-6.5.0/tools/include/nolibc/arch-riscv.h @@ -180,7 +180,7 @@ const unsigned long *_auxv __attribute__((weak)); /* startup code */ -void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) __no_stack_protector _start(void) +void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void) { __asm__ volatile ( ".option push\n" --- linux-azure-6.5.0.orig/tools/include/nolibc/arch-s390.h +++ linux-azure-6.5.0/tools/include/nolibc/arch-s390.h @@ -166,7 +166,7 @@ const unsigned long *_auxv __attribute__((weak)); /* startup code */ -void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) __no_stack_protector _start(void) +void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void) { __asm__ volatile ( "lg %r2,0(%r15)\n" /* argument count */ --- linux-azure-6.5.0.orig/tools/include/nolibc/arch-x86_64.h +++ linux-azure-6.5.0/tools/include/nolibc/arch-x86_64.h @@ -190,7 +190,7 @@ * 2) The deepest stack frame should be zero (the %rbp). * */ -void __attribute__((weak,noreturn,optimize("omit-frame-pointer"))) __no_stack_protector _start(void) +void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void) { __asm__ volatile ( #ifdef _NOLIBC_STACKPROTECTOR --- linux-azure-6.5.0.orig/tools/include/uapi/linux/bpf.h +++ linux-azure-6.5.0/tools/include/uapi/linux/bpf.h @@ -1897,7 +1897,9 @@ * performed again, if the helper is used in combination with * direct packet access. * Return - * 0 on success, or a negative error in case of failure. + * 0 on success, or a negative error in case of failure. Positive + * error indicates a potential drop or congestion in the target + * device. The particular positive error codes are not defined. * * u64 bpf_get_current_pid_tgid(void) * Description --- linux-azure-6.5.0.orig/tools/include/uapi/linux/prctl.h +++ linux-azure-6.5.0/tools/include/uapi/linux/prctl.h @@ -283,7 +283,8 @@ /* Memory deny write / execute */ #define PR_SET_MDWE 65 -# define PR_MDWE_REFUSE_EXEC_GAIN 1 +# define PR_MDWE_REFUSE_EXEC_GAIN (1UL << 0) +# define PR_MDWE_NO_INHERIT (1UL << 1) #define PR_GET_MDWE 66 --- linux-azure-6.5.0.orig/tools/lib/bpf/libbpf.c +++ linux-azure-6.5.0/tools/lib/bpf/libbpf.c @@ -1975,9 +1975,9 @@ return -ENAMETOOLONG; /* gzopen also accepts uncompressed files. */ - file = gzopen(buf, "r"); + file = gzopen(buf, "re"); if (!file) - file = gzopen("/proc/config.gz", "r"); + file = gzopen("/proc/config.gz", "re"); if (!file) { pr_warn("failed to open system Kconfig\n"); @@ -6157,7 +6157,11 @@ if (main_prog == subprog) return 0; relos = libbpf_reallocarray(main_prog->reloc_desc, new_cnt, sizeof(*relos)); - if (!relos) + /* if new count is zero, reallocarray can return a valid NULL result; + * in this case the previous pointer will be freed, so we *have to* + * reassign old pointer to the new value (even if it's NULL) + */ + if (!relos && new_cnt) return -ENOMEM; if (subprog->nr_reloc) memcpy(relos + main_prog->nr_reloc, subprog->reloc_desc, @@ -8352,6 +8356,7 @@ bpf_object__elf_finish(obj); bpf_object_unload(obj); btf__free(obj->btf); + btf__free(obj->btf_vmlinux); btf_ext__free(obj->btf_ext); for (i = 0; i < obj->nr_maps; i++) @@ -8528,7 +8533,8 @@ return -EBUSY; insns = libbpf_reallocarray(prog->insns, new_insn_cnt, sizeof(*insns)); - if (!insns) { + /* NULL is a valid return from reallocarray if the new count is zero */ + if (!insns && new_insn_cnt) { pr_warn("prog '%s': failed to realloc prog code\n", prog->name); return -ENOMEM; } @@ -8558,13 +8564,31 @@ return prog->type; } +static size_t custom_sec_def_cnt; +static struct bpf_sec_def *custom_sec_defs; +static struct bpf_sec_def custom_fallback_def; +static bool has_custom_fallback_def; +static int last_custom_sec_def_handler_id; + int bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) { if (prog->obj->loaded) return libbpf_err(-EBUSY); + /* if type is not changed, do nothing */ + if (prog->type == type) + return 0; + prog->type = type; - prog->sec_def = NULL; + + /* If a program type was changed, we need to reset associated SEC() + * handler, as it will be invalid now. The only exception is a generic + * fallback handler, which by definition is program type-agnostic and + * is a catch-all custom handler, optionally set by the application, + * so should be able to handle any type of BPF program. + */ + if (prog->sec_def != &custom_fallback_def) + prog->sec_def = NULL; return 0; } @@ -8740,13 +8764,6 @@ SEC_DEF("netfilter", NETFILTER, BPF_NETFILTER, SEC_NONE), }; -static size_t custom_sec_def_cnt; -static struct bpf_sec_def *custom_sec_defs; -static struct bpf_sec_def custom_fallback_def; -static bool has_custom_fallback_def; - -static int last_custom_sec_def_handler_id; - int libbpf_register_prog_handler(const char *sec, enum bpf_prog_type prog_type, enum bpf_attach_type exp_attach_type, @@ -8826,7 +8843,11 @@ /* try to shrink the array, but it's ok if we couldn't */ sec_defs = libbpf_reallocarray(custom_sec_defs, custom_sec_def_cnt, sizeof(*sec_defs)); - if (sec_defs) + /* if new count is zero, reallocarray can return a valid NULL result; + * in this case the previous pointer will be freed, so we *have to* + * reassign old pointer to the new value (even if it's NULL) + */ + if (sec_defs || custom_sec_def_cnt == 0) custom_sec_defs = sec_defs; return 0; --- linux-azure-6.5.0.orig/tools/lib/bpf/usdt.c +++ linux-azure-6.5.0/tools/lib/bpf/usdt.c @@ -852,8 +852,11 @@ * system is so exhausted on memory, it's the least of user's * concerns, probably. * So just do our best here to return those IDs to usdt_manager. + * Another edge case when we can legitimately get NULL is when + * new_cnt is zero, which can happen in some edge cases, so we + * need to be careful about that. */ - if (new_free_ids) { + if (new_free_ids || new_cnt == 0) { memcpy(new_free_ids + man->free_spec_cnt, usdt_link->spec_ids, usdt_link->spec_cnt * sizeof(*usdt_link->spec_ids)); man->free_spec_ids = new_free_ids; --- linux-azure-6.5.0.orig/tools/lib/perf/include/internal/rc_check.h +++ linux-azure-6.5.0/tools/lib/perf/include/internal/rc_check.h @@ -9,8 +9,12 @@ * Enable reference count checking implicitly with leak checking, which is * integrated into address sanitizer. */ -#if defined(LEAK_SANITIZER) || defined(ADDRESS_SANITIZER) +#if defined(__SANITIZE_ADDRESS__) || defined(LEAK_SANITIZER) || defined(ADDRESS_SANITIZER) #define REFCNT_CHECKING 1 +#elif defined(__has_feature) +#if __has_feature(address_sanitizer) || __has_feature(leak_sanitizer) +#define REFCNT_CHECKING 1 +#endif #endif /* --- linux-azure-6.5.0.orig/tools/mm/Makefile +++ linux-azure-6.5.0/tools/mm/Makefile @@ -8,8 +8,8 @@ LIB_DIR = ../lib/api LIBS = $(LIB_DIR)/libapi.a -CFLAGS += -Wall -Wextra -I../lib/ -LDFLAGS += $(LIBS) +CFLAGS += -Wall -Wextra -I../lib/ -pthread +LDFLAGS += $(LIBS) -pthread all: $(TARGETS) --- linux-azure-6.5.0.orig/tools/objtool/check.c +++ linux-azure-6.5.0/tools/objtool/check.c @@ -4333,7 +4333,8 @@ continue; } - if (insn_func(dest) && insn_func(dest) == insn_func(insn)) { + if (insn_func(dest) && insn_func(insn) && + insn_func(dest)->pfunc == insn_func(insn)->pfunc) { /* * Anything from->to self is either _THIS_IP_ or * IRET-to-self. --- linux-azure-6.5.0.orig/tools/objtool/noreturns.h +++ linux-azure-6.5.0/tools/objtool/noreturns.h @@ -6,7 +6,6 @@ * * Yes, this is unfortunate. A better solution is in the works. */ -NORETURN(__invalid_creds) NORETURN(__kunit_abort) NORETURN(__module_put_and_kthread_exit) NORETURN(__reiserfs_panic) --- linux-azure-6.5.0.orig/tools/objtool/objtool.c +++ linux-azure-6.5.0/tools/objtool/objtool.c @@ -146,7 +146,5 @@ exec_cmd_init("objtool", UNUSED, UNUSED, UNUSED); pager_init(UNUSED); - objtool_run(argc, argv); - - return 0; + return objtool_run(argc, argv); } --- linux-azure-6.5.0.orig/tools/perf/Documentation/perf-dlfilter.txt +++ linux-azure-6.5.0/tools/perf/Documentation/perf-dlfilter.txt @@ -64,6 +64,12 @@ If implemented, 'filter_description' should return a one-line description of the filter, and optionally a longer description. +Do not assume the 'sample' argument is valid (dereferenceable) +after 'filter_event' and 'filter_event_early' return. + +Do not assume data referenced by pointers in struct perf_dlfilter_sample +is valid (dereferenceable) after 'filter_event' and 'filter_event_early' return. + The perf_dlfilter_sample structure ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -150,7 +156,8 @@ const char *(*srcline)(void *ctx, __u32 *line_number); struct perf_event_attr *(*attr)(void *ctx); __s32 (*object_code)(void *ctx, __u64 ip, void *buf, __u32 len); - void *(*reserved[120])(void *); + void (*al_cleanup)(void *ctx, struct perf_dlfilter_al *al); + void *(*reserved[119])(void *); }; ---- @@ -161,7 +168,8 @@ 'args' returns arguments from --dlarg options. 'resolve_address' provides information about 'address'. al->size must be set -before calling. Returns 0 on success, -1 otherwise. +before calling. Returns 0 on success, -1 otherwise. Call al_cleanup() (if present, +see below) when 'al' data is no longer needed. 'insn' returns instruction bytes and length. @@ -171,6 +179,12 @@ 'object_code' reads object code and returns the number of bytes read. +'al_cleanup' must be called (if present, so check perf_dlfilter_fns.al_cleanup != NULL) +after resolve_address() to free any associated resources. + +Do not assume pointers obtained via perf_dlfilter_fns are valid (dereferenceable) +after 'filter_event' and 'filter_event_early' return. + The perf_dlfilter_al structure ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -197,9 +211,13 @@ /* Below members are only populated by resolve_ip() */ __u8 filtered; /* true if this sample event will be filtered out */ const char *comm; + void *priv; /* Private data. Do not change */ }; ---- +Do not assume data referenced by pointers in struct perf_dlfilter_al +is valid (dereferenceable) after 'filter_event' and 'filter_event_early' return. + perf_dlfilter_sample flags ~~~~~~~~~~~~~~~~~~~~~~~~~~ --- linux-azure-6.5.0.orig/tools/perf/Documentation/perf-kwork.txt +++ linux-azure-6.5.0/tools/perf/Documentation/perf-kwork.txt @@ -8,7 +8,7 @@ SYNOPSIS -------- [verse] -'perf kwork' {record} +'perf kwork' {record|report|latency|timehist} DESCRIPTION ----------- --- linux-azure-6.5.0.orig/tools/perf/Makefile.config +++ linux-azure-6.5.0/tools/perf/Makefile.config @@ -896,6 +896,11 @@ endif endif +ifdef HAVE_NO_LIBBFD + feature-libbfd := 0 + $(info libbfd overidden OFF) +else + ifdef BUILD_NONDISTRO ifeq ($(feature-libbfd), 1) EXTLIBS += -lbfd -lopcodes @@ -932,6 +937,8 @@ endif endif +endif + ifndef NO_DEMANGLE $(call feature_check,cxa-demangle) ifeq ($(feature-cxa-demangle), 1) --- linux-azure-6.5.0.orig/tools/perf/Makefile.perf +++ linux-azure-6.5.0/tools/perf/Makefile.perf @@ -69,6 +69,10 @@ # Define NO_LIBDW_DWARF_UNWIND if you do not want libdw support # for dwarf backtrace post unwind. # +# Define NO_LIBTRACEEVENT=1 if you don't want libtraceevent to be linked, +# this will remove multiple features and tools, such as 'perf trace', +# that need it to read tracefs event format files, etc. +# # Define NO_PERF_READ_VDSO32 if you do not want to build perf-read-vdso32 # for reading the 32-bit compatibility VDSO in 64-bit mode # @@ -381,7 +385,7 @@ PROGRAMS += $(OUTPUT)$(LIBJVMTI) endif -DLFILTERS := dlfilter-test-api-v0.so dlfilter-show-cycles.so +DLFILTERS := dlfilter-test-api-v0.so dlfilter-test-api-v2.so dlfilter-show-cycles.so DLFILTERS := $(patsubst %,$(OUTPUT)dlfilters/%,$(DLFILTERS)) # what 'all' will build and 'install' will install, in perfexecdir --- linux-azure-6.5.0.orig/tools/perf/arch/arm64/util/mem-events.c +++ linux-azure-6.5.0/tools/perf/arch/arm64/util/mem-events.c @@ -20,7 +20,7 @@ return &perf_mem_events[i]; } -char *perf_mem_events__name(int i, char *pmu_name __maybe_unused) +const char *perf_mem_events__name(int i, const char *pmu_name __maybe_unused) { struct perf_mem_event *e = perf_mem_events__ptr(i); --- linux-azure-6.5.0.orig/tools/perf/arch/powerpc/util/mem-events.c +++ linux-azure-6.5.0/tools/perf/arch/powerpc/util/mem-events.c @@ -3,10 +3,10 @@ #include "mem-events.h" /* PowerPC does not support 'ldlat' parameter. */ -char *perf_mem_events__name(int i, char *pmu_name __maybe_unused) +const char *perf_mem_events__name(int i, const char *pmu_name __maybe_unused) { if (i == PERF_MEM_EVENTS__LOAD) - return (char *) "cpu/mem-loads/"; + return "cpu/mem-loads/"; - return (char *) "cpu/mem-stores/"; + return "cpu/mem-stores/"; } --- linux-azure-6.5.0.orig/tools/perf/arch/x86/util/mem-events.c +++ linux-azure-6.5.0/tools/perf/arch/x86/util/mem-events.c @@ -52,7 +52,7 @@ return leader->core.attr.config == MEM_LOADS_AUX; } -char *perf_mem_events__name(int i, char *pmu_name) +const char *perf_mem_events__name(int i, const char *pmu_name) { struct perf_mem_event *e = perf_mem_events__ptr(i); @@ -65,7 +65,7 @@ if (!pmu_name) { mem_loads_name__init = true; - pmu_name = (char *)"cpu"; + pmu_name = "cpu"; } if (perf_pmus__have_event(pmu_name, "mem-loads-aux")) { @@ -82,12 +82,12 @@ if (i == PERF_MEM_EVENTS__STORE) { if (!pmu_name) - pmu_name = (char *)"cpu"; + pmu_name = "cpu"; scnprintf(mem_stores_name, sizeof(mem_stores_name), e->name, pmu_name); return mem_stores_name; } - return (char *)e->name; + return e->name; } --- linux-azure-6.5.0.orig/tools/perf/arch/x86/util/pmu.c +++ linux-azure-6.5.0/tools/perf/arch/x86/util/pmu.c @@ -126,7 +126,7 @@ return ret; } -static char *__pmu_find_real_name(const char *name) +static const char *__pmu_find_real_name(const char *name) { struct pmu_alias *pmu_alias; @@ -135,10 +135,10 @@ return pmu_alias->name; } - return (char *)name; + return name; } -char *pmu_find_real_name(const char *name) +const char *pmu_find_real_name(const char *name) { if (cached_list) return __pmu_find_real_name(name); @@ -149,7 +149,7 @@ return __pmu_find_real_name(name); } -static char *__pmu_find_alias_name(const char *name) +static const char *__pmu_find_alias_name(const char *name) { struct pmu_alias *pmu_alias; @@ -160,7 +160,7 @@ return NULL; } -char *pmu_find_alias_name(const char *name) +const char *pmu_find_alias_name(const char *name) { if (cached_list) return __pmu_find_alias_name(name); --- linux-azure-6.5.0.orig/tools/perf/builtin-kwork.c +++ linux-azure-6.5.0/tools/perf/builtin-kwork.c @@ -406,12 +406,14 @@ work = work_findnew(&class->work_root, &key, &kwork->cmp_id); if (work == NULL) { - free(atom); + atom_free(atom); return -1; } - if (!profile_event_match(kwork, work, sample)) + if (!profile_event_match(kwork, work, sample)) { + atom_free(atom); return 0; + } if (dst_type < KWORK_TRACE_MAX) { dst_atom = list_last_entry_or_null(&work->atom_list[dst_type], @@ -1692,9 +1694,10 @@ static struct perf_kwork kwork = { .class_list = LIST_HEAD_INIT(kwork.class_list), .tool = { - .mmap = perf_event__process_mmap, - .mmap2 = perf_event__process_mmap2, - .sample = perf_kwork__process_tracepoint_sample, + .mmap = perf_event__process_mmap, + .mmap2 = perf_event__process_mmap2, + .sample = perf_kwork__process_tracepoint_sample, + .ordered_events = true, }, .atom_page_list = LIST_HEAD_INIT(kwork.atom_page_list), .sort_list = LIST_HEAD_INIT(kwork.sort_list), --- linux-azure-6.5.0.orig/tools/perf/builtin-list.c +++ linux-azure-6.5.0/tools/perf/builtin-list.c @@ -502,7 +502,7 @@ ret = -1; goto out; } - default_ps.pmu_glob = pmu->name; + default_ps.pmu_glob = strdup(pmu->name); } } print_cb.print_start(ps); --- linux-azure-6.5.0.orig/tools/perf/builtin-lock.c +++ linux-azure-6.5.0/tools/perf/builtin-lock.c @@ -524,6 +524,7 @@ struct map *kmap; struct symbol *sym; u64 ip; + const char *arch = perf_env__arch(machine->env); if (list_empty(&callstack_filters)) return true; @@ -531,7 +532,21 @@ for (int i = 0; i < max_stack_depth; i++) { struct callstack_filter *filter; - if (!callstack || !callstack[i]) + /* + * In powerpc, the callchain saved by kernel always includes + * first three entries as the NIP (next instruction pointer), + * LR (link register), and the contents of LR save area in the + * second stack frame. In certain scenarios its possible to have + * invalid kernel instruction addresses in either LR or the second + * stack frame's LR. In that case, kernel will store that address as + * zero. + * + * The below check will continue to look into callstack, + * incase first or second callstack index entry has 0 + * address for powerpc. + */ + if (!callstack || (!callstack[i] && (strcmp(arch, "powerpc") || + (i != 1 && i != 2)))) break; ip = callstack[i]; @@ -2052,6 +2067,7 @@ if (IS_ERR(session)) { pr_err("Initializing perf session failed\n"); err = PTR_ERR(session); + session = NULL; goto out_delete; } --- linux-azure-6.5.0.orig/tools/perf/builtin-script.c +++ linux-azure-6.5.0/tools/perf/builtin-script.c @@ -2199,6 +2199,17 @@ if (PRINT_FIELD(RETIRE_LAT)) fprintf(fp, "%16" PRIu16, sample->retire_lat); + if (PRINT_FIELD(CGROUP)) { + const char *cgrp_name; + struct cgroup *cgrp = cgroup__find(machine->env, + sample->cgroup); + if (cgrp != NULL) + cgrp_name = cgrp->name; + else + cgrp_name = "unknown"; + fprintf(fp, " %s", cgrp_name); + } + if (PRINT_FIELD(IP)) { struct callchain_cursor *cursor = NULL; @@ -2243,17 +2254,6 @@ if (PRINT_FIELD(CODE_PAGE_SIZE)) fprintf(fp, " %s", get_page_size_name(sample->code_page_size, str)); - if (PRINT_FIELD(CGROUP)) { - const char *cgrp_name; - struct cgroup *cgrp = cgroup__find(machine->env, - sample->cgroup); - if (cgrp != NULL) - cgrp_name = cgrp->name; - else - cgrp_name = "unknown"; - fprintf(fp, " %s", cgrp_name); - } - perf_sample__fprintf_ipc(sample, attr, fp); fprintf(fp, "\n"); --- linux-azure-6.5.0.orig/tools/perf/builtin-stat.c +++ linux-azure-6.5.0/tools/perf/builtin-stat.c @@ -1622,7 +1622,7 @@ * taking the highest cpu number to be the size of * the aggregation translate cpumap. */ - if (evsel_list->core.user_requested_cpus) + if (!perf_cpu_map__empty(evsel_list->core.user_requested_cpus)) nr = perf_cpu_map__max(evsel_list->core.user_requested_cpus).cpu; else nr = 0; --- linux-azure-6.5.0.orig/tools/perf/builtin-top.c +++ linux-azure-6.5.0/tools/perf/builtin-top.c @@ -1805,6 +1805,7 @@ top.session = perf_session__new(NULL, NULL); if (IS_ERR(top.session)) { status = PTR_ERR(top.session); + top.session = NULL; goto out_delete_evlist; } --- linux-azure-6.5.0.orig/tools/perf/builtin-trace.c +++ linux-azure-6.5.0/tools/perf/builtin-trace.c @@ -3136,13 +3136,8 @@ struct evsel *evsel; evlist__for_each_entry(evlist, evsel) { - struct evsel_trace *et = evsel->priv; - - if (!et || !evsel->tp_format || strcmp(evsel->tp_format->system, "syscalls")) - continue; - - zfree(&et->fmt); - free(et); + evsel_trace__delete(evsel->priv); + evsel->priv = NULL; } } --- linux-azure-6.5.0.orig/tools/perf/dlfilters/dlfilter-test-api-v2.c +++ linux-azure-6.5.0/tools/perf/dlfilters/dlfilter-test-api-v2.c @@ -0,0 +1,377 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Test v2 API for perf --dlfilter shared object + * Copyright (c) 2023, Intel Corporation. + */ +#include +#include +#include +#include + +/* + * Copy v2 API instead of including current API + */ +#include +#include + +/* + * The following macro can be used to determine if this header defines + * perf_dlfilter_sample machine_pid and vcpu. + */ +#define PERF_DLFILTER_HAS_MACHINE_PID + +/* Definitions for perf_dlfilter_sample flags */ +enum { + PERF_DLFILTER_FLAG_BRANCH = 1ULL << 0, + PERF_DLFILTER_FLAG_CALL = 1ULL << 1, + PERF_DLFILTER_FLAG_RETURN = 1ULL << 2, + PERF_DLFILTER_FLAG_CONDITIONAL = 1ULL << 3, + PERF_DLFILTER_FLAG_SYSCALLRET = 1ULL << 4, + PERF_DLFILTER_FLAG_ASYNC = 1ULL << 5, + PERF_DLFILTER_FLAG_INTERRUPT = 1ULL << 6, + PERF_DLFILTER_FLAG_TX_ABORT = 1ULL << 7, + PERF_DLFILTER_FLAG_TRACE_BEGIN = 1ULL << 8, + PERF_DLFILTER_FLAG_TRACE_END = 1ULL << 9, + PERF_DLFILTER_FLAG_IN_TX = 1ULL << 10, + PERF_DLFILTER_FLAG_VMENTRY = 1ULL << 11, + PERF_DLFILTER_FLAG_VMEXIT = 1ULL << 12, +}; + +/* + * perf sample event information (as per perf script and ) + */ +struct perf_dlfilter_sample { + __u32 size; /* Size of this structure (for compatibility checking) */ + __u16 ins_lat; /* Refer PERF_SAMPLE_WEIGHT_TYPE in */ + __u16 p_stage_cyc; /* Refer PERF_SAMPLE_WEIGHT_TYPE in */ + __u64 ip; + __s32 pid; + __s32 tid; + __u64 time; + __u64 addr; + __u64 id; + __u64 stream_id; + __u64 period; + __u64 weight; /* Refer PERF_SAMPLE_WEIGHT_TYPE in */ + __u64 transaction; /* Refer PERF_SAMPLE_TRANSACTION in */ + __u64 insn_cnt; /* For instructions-per-cycle (IPC) */ + __u64 cyc_cnt; /* For instructions-per-cycle (IPC) */ + __s32 cpu; + __u32 flags; /* Refer PERF_DLFILTER_FLAG_* above */ + __u64 data_src; /* Refer PERF_SAMPLE_DATA_SRC in */ + __u64 phys_addr; /* Refer PERF_SAMPLE_PHYS_ADDR in */ + __u64 data_page_size; /* Refer PERF_SAMPLE_DATA_PAGE_SIZE in */ + __u64 code_page_size; /* Refer PERF_SAMPLE_CODE_PAGE_SIZE in */ + __u64 cgroup; /* Refer PERF_SAMPLE_CGROUP in */ + __u8 cpumode; /* Refer CPUMODE_MASK etc in */ + __u8 addr_correlates_sym; /* True => resolve_addr() can be called */ + __u16 misc; /* Refer perf_event_header in */ + __u32 raw_size; /* Refer PERF_SAMPLE_RAW in */ + const void *raw_data; /* Refer PERF_SAMPLE_RAW in */ + __u64 brstack_nr; /* Number of brstack entries */ + const struct perf_branch_entry *brstack; /* Refer */ + __u64 raw_callchain_nr; /* Number of raw_callchain entries */ + const __u64 *raw_callchain; /* Refer */ + const char *event; + __s32 machine_pid; + __s32 vcpu; +}; + +/* + * Address location (as per perf script) + */ +struct perf_dlfilter_al { + __u32 size; /* Size of this structure (for compatibility checking) */ + __u32 symoff; + const char *sym; + __u64 addr; /* Mapped address (from dso) */ + __u64 sym_start; + __u64 sym_end; + const char *dso; + __u8 sym_binding; /* STB_LOCAL, STB_GLOBAL or STB_WEAK, refer */ + __u8 is_64_bit; /* Only valid if dso is not NULL */ + __u8 is_kernel_ip; /* True if in kernel space */ + __u32 buildid_size; + __u8 *buildid; + /* Below members are only populated by resolve_ip() */ + __u8 filtered; /* True if this sample event will be filtered out */ + const char *comm; + void *priv; /* Private data (v2 API) */ +}; + +struct perf_dlfilter_fns { + /* Return information about ip */ + const struct perf_dlfilter_al *(*resolve_ip)(void *ctx); + /* Return information about addr (if addr_correlates_sym) */ + const struct perf_dlfilter_al *(*resolve_addr)(void *ctx); + /* Return arguments from --dlarg option */ + char **(*args)(void *ctx, int *dlargc); + /* + * Return information about address (al->size must be set before + * calling). Returns 0 on success, -1 otherwise. Call al_cleanup() + * when 'al' data is no longer needed. + */ + __s32 (*resolve_address)(void *ctx, __u64 address, struct perf_dlfilter_al *al); + /* Return instruction bytes and length */ + const __u8 *(*insn)(void *ctx, __u32 *length); + /* Return source file name and line number */ + const char *(*srcline)(void *ctx, __u32 *line_number); + /* Return perf_event_attr, refer */ + struct perf_event_attr *(*attr)(void *ctx); + /* Read object code, return numbers of bytes read */ + __s32 (*object_code)(void *ctx, __u64 ip, void *buf, __u32 len); + /* + * If present (i.e. must check al_cleanup != NULL), call after + * resolve_address() to free any associated resources. (v2 API) + */ + void (*al_cleanup)(void *ctx, struct perf_dlfilter_al *al); + /* Reserved */ + void *(*reserved[119])(void *); +}; + +struct perf_dlfilter_fns perf_dlfilter_fns; + +static int verbose; + +#define pr_debug(fmt, ...) do { \ + if (verbose > 0) \ + fprintf(stderr, fmt, ##__VA_ARGS__); \ + } while (0) + +static int test_fail(const char *msg) +{ + pr_debug("%s\n", msg); + return -1; +} + +#define CHECK(x) do { \ + if (!(x)) \ + return test_fail("Check '" #x "' failed\n"); \ + } while (0) + +struct filter_data { + __u64 ip; + __u64 addr; + int do_early; + int early_filter_cnt; + int filter_cnt; +}; + +static struct filter_data *filt_dat; + +int start(void **data, void *ctx) +{ + int dlargc; + char **dlargv; + struct filter_data *d; + static bool called; + + verbose = 1; + + CHECK(!filt_dat && !called); + called = true; + + d = calloc(1, sizeof(*d)); + if (!d) + test_fail("Failed to allocate memory"); + filt_dat = d; + *data = d; + + dlargv = perf_dlfilter_fns.args(ctx, &dlargc); + + CHECK(dlargc == 6); + CHECK(!strcmp(dlargv[0], "first")); + verbose = strtol(dlargv[1], NULL, 0); + d->ip = strtoull(dlargv[2], NULL, 0); + d->addr = strtoull(dlargv[3], NULL, 0); + d->do_early = strtol(dlargv[4], NULL, 0); + CHECK(!strcmp(dlargv[5], "last")); + + pr_debug("%s API\n", __func__); + + return 0; +} + +#define CHECK_SAMPLE(x) do { \ + if (sample->x != expected.x) \ + return test_fail("'" #x "' not expected value\n"); \ + } while (0) + +static int check_sample(struct filter_data *d, const struct perf_dlfilter_sample *sample) +{ + struct perf_dlfilter_sample expected = { + .ip = d->ip, + .pid = 12345, + .tid = 12346, + .time = 1234567890, + .addr = d->addr, + .id = 99, + .stream_id = 101, + .period = 543212345, + .cpu = 31, + .cpumode = PERF_RECORD_MISC_USER, + .addr_correlates_sym = 1, + .misc = PERF_RECORD_MISC_USER, + }; + + CHECK(sample->size >= sizeof(struct perf_dlfilter_sample)); + + CHECK_SAMPLE(ip); + CHECK_SAMPLE(pid); + CHECK_SAMPLE(tid); + CHECK_SAMPLE(time); + CHECK_SAMPLE(addr); + CHECK_SAMPLE(id); + CHECK_SAMPLE(stream_id); + CHECK_SAMPLE(period); + CHECK_SAMPLE(cpu); + CHECK_SAMPLE(cpumode); + CHECK_SAMPLE(addr_correlates_sym); + CHECK_SAMPLE(misc); + + CHECK(!sample->raw_data); + CHECK_SAMPLE(brstack_nr); + CHECK(!sample->brstack); + CHECK_SAMPLE(raw_callchain_nr); + CHECK(!sample->raw_callchain); + +#define EVENT_NAME "branches:" + CHECK(!strncmp(sample->event, EVENT_NAME, strlen(EVENT_NAME))); + + return 0; +} + +static int check_al(void *ctx) +{ + const struct perf_dlfilter_al *al; + + al = perf_dlfilter_fns.resolve_ip(ctx); + if (!al) + return test_fail("resolve_ip() failed"); + + CHECK(al->sym && !strcmp("foo", al->sym)); + CHECK(!al->symoff); + + return 0; +} + +static int check_addr_al(void *ctx) +{ + const struct perf_dlfilter_al *addr_al; + + addr_al = perf_dlfilter_fns.resolve_addr(ctx); + if (!addr_al) + return test_fail("resolve_addr() failed"); + + CHECK(addr_al->sym && !strcmp("bar", addr_al->sym)); + CHECK(!addr_al->symoff); + + return 0; +} + +static int check_address_al(void *ctx, const struct perf_dlfilter_sample *sample) +{ + struct perf_dlfilter_al address_al; + const struct perf_dlfilter_al *al; + + al = perf_dlfilter_fns.resolve_ip(ctx); + if (!al) + return test_fail("resolve_ip() failed"); + + address_al.size = sizeof(address_al); + if (perf_dlfilter_fns.resolve_address(ctx, sample->ip, &address_al)) + return test_fail("resolve_address() failed"); + + CHECK(address_al.sym && al->sym); + CHECK(!strcmp(address_al.sym, al->sym)); + CHECK(address_al.addr == al->addr); + CHECK(address_al.sym_start == al->sym_start); + CHECK(address_al.sym_end == al->sym_end); + CHECK(address_al.dso && al->dso); + CHECK(!strcmp(address_al.dso, al->dso)); + + /* al_cleanup() is v2 API so may not be present */ + if (perf_dlfilter_fns.al_cleanup) + perf_dlfilter_fns.al_cleanup(ctx, &address_al); + + return 0; +} + +static int check_attr(void *ctx) +{ + struct perf_event_attr *attr = perf_dlfilter_fns.attr(ctx); + + CHECK(attr); + CHECK(attr->type == PERF_TYPE_HARDWARE); + CHECK(attr->config == PERF_COUNT_HW_BRANCH_INSTRUCTIONS); + + return 0; +} + +static int do_checks(void *data, const struct perf_dlfilter_sample *sample, void *ctx, bool early) +{ + struct filter_data *d = data; + + CHECK(data && filt_dat == data); + + if (early) { + CHECK(!d->early_filter_cnt); + d->early_filter_cnt += 1; + } else { + CHECK(!d->filter_cnt); + CHECK(d->early_filter_cnt); + CHECK(d->do_early != 2); + d->filter_cnt += 1; + } + + if (check_sample(data, sample)) + return -1; + + if (check_attr(ctx)) + return -1; + + if (early && !d->do_early) + return 0; + + if (check_al(ctx) || check_addr_al(ctx) || check_address_al(ctx, sample)) + return -1; + + if (early) + return d->do_early == 2; + + return 1; +} + +int filter_event_early(void *data, const struct perf_dlfilter_sample *sample, void *ctx) +{ + pr_debug("%s API\n", __func__); + + return do_checks(data, sample, ctx, true); +} + +int filter_event(void *data, const struct perf_dlfilter_sample *sample, void *ctx) +{ + pr_debug("%s API\n", __func__); + + return do_checks(data, sample, ctx, false); +} + +int stop(void *data, void *ctx) +{ + static bool called; + + pr_debug("%s API\n", __func__); + + CHECK(data && filt_dat == data && !called); + called = true; + + free(data); + filt_dat = NULL; + return 0; +} + +const char *filter_description(const char **long_description) +{ + *long_description = "Filter used by the 'dlfilter C API' perf test"; + return "dlfilter to test v2 C API"; +} --- linux-azure-6.5.0.orig/tools/perf/examples/bpf/augmented_raw_syscalls.c +++ linux-azure-6.5.0/tools/perf/examples/bpf/augmented_raw_syscalls.c @@ -147,7 +147,7 @@ unsigned int augmented_arg__read_str(struct augmented_arg *augmented_arg, const void *arg, unsigned int arg_len) { unsigned int augmented_len = sizeof(*augmented_arg); - int string_len = bpf_probe_read_str(&augmented_arg->value, arg_len, arg); + int string_len = bpf_probe_read_user_str(&augmented_arg->value, arg_len, arg); augmented_arg->size = augmented_arg->err = 0; /* @@ -196,7 +196,7 @@ if (socklen > sizeof(augmented_args->saddr)) socklen = sizeof(augmented_args->saddr); - bpf_probe_read(&augmented_args->saddr, socklen, sockaddr_arg); + bpf_probe_read_user(&augmented_args->saddr, socklen, sockaddr_arg); return augmented__output(args, augmented_args, len + socklen); } @@ -215,7 +215,7 @@ if (socklen > sizeof(augmented_args->saddr)) socklen = sizeof(augmented_args->saddr); - bpf_probe_read(&augmented_args->saddr, socklen, sockaddr_arg); + bpf_probe_read_user(&augmented_args->saddr, socklen, sockaddr_arg); return augmented__output(args, augmented_args, len + socklen); } @@ -305,7 +305,7 @@ if (augmented_args == NULL) goto failure; - if (bpf_probe_read(&augmented_args->__data, sizeof(*attr), attr) < 0) + if (bpf_probe_read_user(&augmented_args->__data, sizeof(*attr), attr) < 0) goto failure; attr_read = (const struct perf_event_attr_size *)augmented_args->__data; @@ -319,7 +319,7 @@ goto failure; // Now that we read attr->size and tested it against the size limits, read it completely - if (bpf_probe_read(&augmented_args->__data, size, attr) < 0) + if (bpf_probe_read_user(&augmented_args->__data, size, attr) < 0) goto failure; return augmented__output(args, augmented_args, len + size); @@ -341,7 +341,7 @@ if (size > sizeof(augmented_args->__data)) goto failure; - bpf_probe_read(&augmented_args->__data, size, rqtp_arg); + bpf_probe_read_user(&augmented_args->__data, size, rqtp_arg); return augmented__output(args, augmented_args, len + size); failure: @@ -380,7 +380,7 @@ if (augmented_args == NULL) return 1; - bpf_probe_read(&augmented_args->args, sizeof(augmented_args->args), args); + bpf_probe_read_kernel(&augmented_args->args, sizeof(augmented_args->args), args); /* * Jump to syscall specific augmenter, even if the default one, @@ -401,7 +401,7 @@ if (pid_filter__has(&pids_filtered, getpid())) return 0; - bpf_probe_read(&exit_args, sizeof(exit_args), args); + bpf_probe_read_kernel(&exit_args, sizeof(exit_args), args); /* * Jump to syscall specific return augmenter, even if the default one, * "!raw_syscalls:unaugmented" that will just return 1 to return the --- linux-azure-6.5.0.orig/tools/perf/include/perf/perf_dlfilter.h +++ linux-azure-6.5.0/tools/perf/include/perf/perf_dlfilter.h @@ -91,6 +91,7 @@ /* Below members are only populated by resolve_ip() */ __u8 filtered; /* True if this sample event will be filtered out */ const char *comm; + void *priv; /* Private data. Do not change */ }; struct perf_dlfilter_fns { @@ -102,7 +103,8 @@ char **(*args)(void *ctx, int *dlargc); /* * Return information about address (al->size must be set before - * calling). Returns 0 on success, -1 otherwise. + * calling). Returns 0 on success, -1 otherwise. Call al_cleanup() + * when 'al' data is no longer needed. */ __s32 (*resolve_address)(void *ctx, __u64 address, struct perf_dlfilter_al *al); /* Return instruction bytes and length */ @@ -113,8 +115,13 @@ struct perf_event_attr *(*attr)(void *ctx); /* Read object code, return numbers of bytes read */ __s32 (*object_code)(void *ctx, __u64 ip, void *buf, __u32 len); + /* + * If present (i.e. must check al_cleanup != NULL), call after + * resolve_address() to free any associated resources. + */ + void (*al_cleanup)(void *ctx, struct perf_dlfilter_al *al); /* Reserved */ - void *(*reserved[120])(void *); + void *(*reserved[119])(void *); }; /* --- linux-azure-6.5.0.orig/tools/perf/pmu-events/Build +++ linux-azure-6.5.0/tools/perf/pmu-events/Build @@ -35,3 +35,9 @@ $(call rule_mkdir) $(Q)$(call echo-cmd,gen)$(PYTHON) $(JEVENTS_PY) $(JEVENTS_ARCH) $(JEVENTS_MODEL) pmu-events/arch $@ endif + +# pmu-events.c file is generated in the OUTPUT directory so it needs a +# separate rule to depend on it properly +$(OUTPUT)pmu-events/pmu-events.o: $(PMU_EVENTS_C) + $(call rule_mkdir) + $(call if_changed_dep,cc_o_c) --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/arm64/ampere/ampereone/cache.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/arm64/ampere/ampereone/cache.json @@ -93,9 +93,6 @@ "ArchStdEvent": "L1D_CACHE_LMISS_RD" }, { - "ArchStdEvent": "L1D_CACHE_LMISS" - }, - { "ArchStdEvent": "L1I_CACHE_LMISS" }, { --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/powerpc/power10/cache.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/powerpc/power10/cache.json @@ -1,53 +1,8 @@ [ { - "EventCode": "0x1003C", - "EventName": "PM_EXEC_STALL_DMISS_L2L3", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from either the local L2 or local L3." - }, - { - "EventCode": "0x1E054", - "EventName": "PM_EXEC_STALL_DMISS_L21_L31", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from another core's L2 or L3 on the same chip." - }, - { - "EventCode": "0x34054", - "EventName": "PM_EXEC_STALL_DMISS_L2L3_NOCONFLICT", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from the local L2 or local L3, without a dispatch conflict." - }, - { - "EventCode": "0x34056", - "EventName": "PM_EXEC_STALL_LOAD_FINISH", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was finishing a load after its data was reloaded from a data source beyond the local L1; cycles in which the LSU was processing an L1-hit; cycles in which the NTF instruction merged with another load in the LMQ; cycles in which the NTF instruction is waiting for a data reload for a load miss, but the data comes back with a non-NTF instruction." - }, - { - "EventCode": "0x3006C", - "EventName": "PM_RUN_CYC_SMT2_MODE", - "BriefDescription": "Cycles when this thread's run latch is set and the core is in SMT2 mode." - }, - { "EventCode": "0x300F4", "EventName": "PM_RUN_INST_CMPL_CONC", - "BriefDescription": "PowerPC instructions completed by this thread when all threads in the core had the run-latch set." - }, - { - "EventCode": "0x4C016", - "EventName": "PM_EXEC_STALL_DMISS_L2L3_CONFLICT", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from the local L2 or local L3, with a dispatch conflict." - }, - { - "EventCode": "0x4D014", - "EventName": "PM_EXEC_STALL_LOAD", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a load instruction executing in the Load Store Unit." - }, - { - "EventCode": "0x4D016", - "EventName": "PM_EXEC_STALL_PTESYNC", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a PTESYNC instruction executing in the Load Store Unit." - }, - { - "EventCode": "0x401EA", - "EventName": "PM_THRESH_EXC_128", - "BriefDescription": "Threshold counter exceeded a value of 128." + "BriefDescription": "PowerPC instruction completed by this thread when all threads in the core had the run-latch set." }, { "EventCode": "0x400F6", --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/powerpc/power10/floating_point.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/powerpc/power10/floating_point.json @@ -1,7 +1,67 @@ [ { - "EventCode": "0x4016E", - "EventName": "PM_THRESH_NOT_MET", - "BriefDescription": "Threshold counter did not meet threshold." + "EventCode": "0x100F4", + "EventName": "PM_FLOP_CMPL", + "BriefDescription": "Floating Point Operations Completed. Includes any type. It counts once for each 1, 2, 4 or 8 flop instruction. Use PM_1|2|4|8_FLOP_CMPL events to count flops." + }, + { + "EventCode": "0x45050", + "EventName": "PM_1FLOP_CMPL", + "BriefDescription": "One floating point instruction completed (fadd, fmul, fsub, fcmp, fsel, fabs, fnabs, fres, fsqrte, fneg)." + }, + { + "EventCode": "0x45052", + "EventName": "PM_4FLOP_CMPL", + "BriefDescription": "Four floating point instruction completed (fadd, fmul, fsub, fcmp, fsel, fabs, fnabs, fres, fsqrte, fneg)." + }, + { + "EventCode": "0x45054", + "EventName": "PM_FMA_CMPL", + "BriefDescription": "Two floating point instruction completed (FMA class of instructions: fmadd, fnmadd, fmsub, fnmsub). Scalar instructions only." + }, + { + "EventCode": "0x45056", + "EventName": "PM_SCALAR_FLOP_CMPL", + "BriefDescription": "Scalar floating point instruction completed." + }, + { + "EventCode": "0x4505A", + "EventName": "PM_SP_FLOP_CMPL", + "BriefDescription": "Single Precision floating point instruction completed." + }, + { + "EventCode": "0x4505C", + "EventName": "PM_MATH_FLOP_CMPL", + "BriefDescription": "Math floating point instruction completed." + }, + { + "EventCode": "0x4D052", + "EventName": "PM_2FLOP_CMPL", + "BriefDescription": "Double Precision vector version of fmul, fsub, fcmp, fsel, fabs, fnabs, fres, fsqrte, fneg completed." + }, + { + "EventCode": "0x4D054", + "EventName": "PM_8FLOP_CMPL", + "BriefDescription": "Four Double Precision vector instruction completed." + }, + { + "EventCode": "0x4D056", + "EventName": "PM_NON_FMA_FLOP_CMPL", + "BriefDescription": "Non FMA instruction completed." + }, + { + "EventCode": "0x4D058", + "EventName": "PM_VECTOR_FLOP_CMPL", + "BriefDescription": "Vector floating point instruction completed." + }, + { + "EventCode": "0x4D05A", + "EventName": "PM_NON_MATH_FLOP_CMPL", + "BriefDescription": "Non Math instruction completed." + }, + { + "EventCode": "0x4D05C", + "EventName": "PM_DPP_FLOP_CMPL", + "BriefDescription": "Double-Precision or Quad-Precision instruction completed." } ] --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/powerpc/power10/frontend.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/powerpc/power10/frontend.json @@ -1,65 +1,10 @@ [ { - "EventCode": "0x10004", - "EventName": "PM_EXEC_STALL_TRANSLATION", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline suffered a TLB miss or ERAT miss and waited for it to resolve." - }, - { - "EventCode": "0x10006", - "EventName": "PM_DISP_STALL_HELD_OTHER_CYC", - "BriefDescription": "Cycles in which the NTC instruction is held at dispatch for any other reason." - }, - { - "EventCode": "0x10010", - "EventName": "PM_PMC4_OVERFLOW", - "BriefDescription": "The event selected for PMC4 caused the event counter to overflow." - }, - { - "EventCode": "0x10020", - "EventName": "PM_PMC4_REWIND", - "BriefDescription": "The speculative event selected for PMC4 rewinds and the counter for PMC4 is not charged." - }, - { - "EventCode": "0x10038", - "EventName": "PM_DISP_STALL_TRANSLATION", - "BriefDescription": "Cycles when dispatch was stalled for this thread because the MMU was handling a translation miss." - }, - { - "EventCode": "0x1003A", - "EventName": "PM_DISP_STALL_BR_MPRED_IC_L2", - "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from the local L2 after suffering a branch mispredict." - }, - { - "EventCode": "0x1D05E", - "EventName": "PM_DISP_STALL_HELD_HALT_CYC", - "BriefDescription": "Cycles in which the NTC instruction is held at dispatch because of power management." - }, - { - "EventCode": "0x1E050", - "EventName": "PM_DISP_STALL_HELD_STF_MAPPER_CYC", - "BriefDescription": "Cycles in which the NTC instruction is held at dispatch because the STF mapper/SRB was full. Includes GPR (count, link, tar), VSR, VMR, FPR." - }, - { "EventCode": "0x1F054", "EventName": "PM_DTLB_HIT", "BriefDescription": "The PTE required by the instruction was resident in the TLB (data TLB access). When MMCR1[16]=0 this event counts only demand hits. When MMCR1[16]=1 this event includes demand and prefetch. Applies to both HPT and RPT." }, { - "EventCode": "0x10064", - "EventName": "PM_DISP_STALL_IC_L2", - "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from the local L2." - }, - { - "EventCode": "0x101E8", - "EventName": "PM_THRESH_EXC_256", - "BriefDescription": "Threshold counter exceeded a count of 256." - }, - { - "EventCode": "0x101EC", - "EventName": "PM_THRESH_MET", - "BriefDescription": "Threshold exceeded." - }, - { "EventCode": "0x100F2", "EventName": "PM_1PLUS_PPC_CMPL", "BriefDescription": "Cycles in which at least one instruction is completed by this thread." @@ -67,57 +12,7 @@ { "EventCode": "0x100F6", "EventName": "PM_IERAT_MISS", - "BriefDescription": "IERAT Reloaded to satisfy an IERAT miss. All page sizes are counted by this event." - }, - { - "EventCode": "0x100F8", - "EventName": "PM_DISP_STALL_CYC", - "BriefDescription": "Cycles the ICT has no itags assigned to this thread (no instructions were dispatched during these cycles)." - }, - { - "EventCode": "0x20006", - "EventName": "PM_DISP_STALL_HELD_ISSQ_FULL_CYC", - "BriefDescription": "Cycles in which the NTC instruction is held at dispatch due to Issue queue full. Includes issue queue and branch queue." - }, - { - "EventCode": "0x20114", - "EventName": "PM_MRK_L2_RC_DISP", - "BriefDescription": "Marked instruction RC dispatched in L2." - }, - { - "EventCode": "0x2C010", - "EventName": "PM_EXEC_STALL_LSU", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was executing in the Load Store Unit. This does not include simple fixed point instructions." - }, - { - "EventCode": "0x2C016", - "EventName": "PM_DISP_STALL_IERAT_ONLY_MISS", - "BriefDescription": "Cycles when dispatch was stalled while waiting to resolve an instruction ERAT miss." - }, - { - "EventCode": "0x2C01E", - "EventName": "PM_DISP_STALL_BR_MPRED_IC_L3", - "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from the local L3 after suffering a branch mispredict." - }, - { - "EventCode": "0x2D01A", - "EventName": "PM_DISP_STALL_IC_MISS", - "BriefDescription": "Cycles when dispatch was stalled for this thread due to an Icache Miss." - }, - { - "EventCode": "0x2E018", - "EventName": "PM_DISP_STALL_FETCH", - "BriefDescription": "Cycles when dispatch was stalled for this thread because Fetch was being held." - }, - { - "EventCode": "0x2E01A", - "EventName": "PM_DISP_STALL_HELD_XVFC_MAPPER_CYC", - "BriefDescription": "Cycles in which the NTC instruction is held at dispatch because the XVFC mapper/SRB was full." - }, - { - "EventCode": "0x2C142", - "EventName": "PM_MRK_XFER_FROM_SRC_PMC2", - "BriefDescription": "For a marked data transfer instruction, the processor's L1 data cache was reloaded from the source specified in MMCR3[15:27]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." + "BriefDescription": "IERAT Reloaded to satisfy an IERAT miss. All page sizes are counted by this event. This event only counts instruction demand access." }, { "EventCode": "0x24050", @@ -135,11 +30,6 @@ "BriefDescription": "Branch Taken instruction completed." }, { - "EventCode": "0x30004", - "EventName": "PM_DISP_STALL_FLUSH", - "BriefDescription": "Cycles when dispatch was stalled because of a flush that happened to an instruction(s) that was not yet NTC. PM_EXEC_STALL_NTC_FLUSH only includes instructions that were flushed after becoming NTC." - }, - { "EventCode": "0x3000A", "EventName": "PM_DISP_STALL_ITLB_MISS", "BriefDescription": "Cycles when dispatch was stalled while waiting to resolve an instruction TLB miss." @@ -150,59 +40,19 @@ "BriefDescription": "The instruction that was next to complete (oldest in the pipeline) did not complete because it suffered a flush." }, { - "EventCode": "0x30014", - "EventName": "PM_EXEC_STALL_STORE", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a store instruction executing in the Load Store Unit." - }, - { - "EventCode": "0x30018", - "EventName": "PM_DISP_STALL_HELD_SCOREBOARD_CYC", - "BriefDescription": "Cycles in which the NTC instruction is held at dispatch while waiting on the Scoreboard. This event combines VSCR and FPSCR together." - }, - { - "EventCode": "0x30026", - "EventName": "PM_EXEC_STALL_STORE_MISS", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a store whose cache line was not resident in the L1 and was waiting for allocation of the missing line into the L1." - }, - { - "EventCode": "0x3012A", - "EventName": "PM_MRK_L2_RC_DONE", - "BriefDescription": "L2 RC machine completed the transaction for the marked instruction." - }, - { "EventCode": "0x3F046", "EventName": "PM_ITLB_HIT_1G", "BriefDescription": "Instruction TLB hit (IERAT reload) page size 1G, which implies Radix Page Table translation is in use. When MMCR1[17]=0 this event counts only for demand misses. When MMCR1[17]=1 this event includes demand misses and prefetches." }, { - "EventCode": "0x34058", - "EventName": "PM_DISP_STALL_BR_MPRED_ICMISS", - "BriefDescription": "Cycles when dispatch was stalled after a mispredicted branch resulted in an instruction cache miss." - }, - { - "EventCode": "0x3D05C", - "EventName": "PM_DISP_STALL_HELD_RENAME_CYC", - "BriefDescription": "Cycles in which the NTC instruction is held at dispatch because the mapper/SRB was full. Includes GPR (count, link, tar), VSR, VMR, FPR and XVFC." - }, - { - "EventCode": "0x3E052", - "EventName": "PM_DISP_STALL_IC_L3", - "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from the local L3." - }, - { "EventCode": "0x3E054", "EventName": "PM_LD_MISS_L1", - "BriefDescription": "Load Missed L1, counted at execution time (can be greater than loads finished). LMQ merges are not included in this count. i.e. if a load instruction misses on an address that is already allocated on the LMQ, this event will not increment for that load). Note that this count is per slice, so if a load spans multiple slices this event will increment multiple times for a single load." - }, - { - "EventCode": "0x301EA", - "EventName": "PM_THRESH_EXC_1024", - "BriefDescription": "Threshold counter exceeded a value of 1024." + "BriefDescription": "Load missed L1, counted at finish time. LMQ merges are not included in this count. i.e. if a load instruction misses on an address that is already allocated on the LMQ, this event will not increment for that load). Note that this count is per slice, so if a load spans multiple slices this event will increment multiple times for a single load." }, { "EventCode": "0x300FA", "EventName": "PM_INST_FROM_L3MISS", - "BriefDescription": "The processor's instruction cache was reloaded from a source other than the local core's L1, L2, or L3 due to a demand miss." + "BriefDescription": "The processor's instruction cache was reloaded from beyond the local core's L3 due to a demand miss." }, { "EventCode": "0x40006", @@ -210,38 +60,8 @@ "BriefDescription": "Cycles in which an instruction or group of instructions were cancelled after being issued. This event increments once per occurrence, regardless of how many instructions are included in the issue group." }, { - "EventCode": "0x40116", - "EventName": "PM_MRK_LARX_FIN", - "BriefDescription": "Marked load and reserve instruction (LARX) finished. LARX and STCX are instructions used to acquire a lock." - }, - { - "EventCode": "0x4C010", - "EventName": "PM_DISP_STALL_BR_MPRED_IC_L3MISS", - "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from sources beyond the local L3 after suffering a mispredicted branch." - }, - { - "EventCode": "0x4D01E", - "EventName": "PM_DISP_STALL_BR_MPRED", - "BriefDescription": "Cycles when dispatch was stalled for this thread due to a mispredicted branch." - }, - { - "EventCode": "0x4E010", - "EventName": "PM_DISP_STALL_IC_L3MISS", - "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from any source beyond the local L3." - }, - { - "EventCode": "0x4E01A", - "EventName": "PM_DISP_STALL_HELD_CYC", - "BriefDescription": "Cycles in which the NTC instruction is held at dispatch for any reason." - }, - { - "EventCode": "0x4003C", - "EventName": "PM_DISP_STALL_HELD_SYNC_CYC", - "BriefDescription": "Cycles in which the NTC instruction is held at dispatch because of a synchronizing instruction that requires the ICT to be empty before dispatch." - }, - { "EventCode": "0x44056", "EventName": "PM_VECTOR_ST_CMPL", - "BriefDescription": "Vector store instructions completed." + "BriefDescription": "Vector store instruction completed." } ] --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/powerpc/power10/marked.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/powerpc/power10/marked.json @@ -1,15 +1,30 @@ [ { - "EventCode": "0x1002C", - "EventName": "PM_LD_PREFETCH_CACHE_LINE_MISS", - "BriefDescription": "The L1 cache was reloaded with a line that fulfills a prefetch request." - }, - { "EventCode": "0x10132", "EventName": "PM_MRK_INST_ISSUED", "BriefDescription": "Marked instruction issued. Note that stores always get issued twice, the address gets issued to the LSU and the data gets issued to the VSU. Also, issues can sometimes get killed/cancelled and cause multiple sequential issues for the same instruction." }, { + "EventCode": "0x10134", + "EventName": "PM_MRK_ST_DONE_L2", + "BriefDescription": "Marked store completed in L2." + }, + { + "EventCode": "0x1C142", + "EventName": "PM_MRK_XFER_FROM_SRC_PMC1", + "BriefDescription": "For a marked data transfer instruction, the processor's L1 data cache was reloaded from the source specified in MMCR3[0:12]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." + }, + { + "EventCode": "0x1C144", + "EventName": "PM_MRK_XFER_FROM_SRC_CYC_PMC1", + "BriefDescription": "Cycles taken for a marked demand miss to reload a line from the source specified in MMCR3[0:12]." + }, + { + "EventCode": "0x1F150", + "EventName": "PM_MRK_ST_L2_CYC", + "BriefDescription": "Cycles from L2 RC dispatch to L2 RC completion." + }, + { "EventCode": "0x101E0", "EventName": "PM_MRK_INST_DISP", "BriefDescription": "The thread has dispatched a randomly sampled marked instruction." @@ -20,14 +35,39 @@ "BriefDescription": "Marked Branch Taken instruction completed." }, { - "EventCode": "0x20112", - "EventName": "PM_MRK_NTF_FIN", - "BriefDescription": "The marked instruction became the oldest in the pipeline before it finished. It excludes instructions that finish at dispatch." + "EventCode": "0x101E4", + "EventName": "PM_MRK_L1_ICACHE_MISS", + "BriefDescription": "Marked instruction suffered an instruction cache miss." + }, + { + "EventCode": "0x101EA", + "EventName": "PM_MRK_L1_RELOAD_VALID", + "BriefDescription": "Marked demand reload." + }, + { + "EventCode": "0x20114", + "EventName": "PM_MRK_L2_RC_DISP", + "BriefDescription": "Marked instruction RC dispatched in L2." }, { - "EventCode": "0x2C01C", - "EventName": "PM_EXEC_STALL_DMISS_OFF_CHIP", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from a remote chip." + "EventCode": "0x2011C", + "EventName": "PM_MRK_NTF_CYC", + "BriefDescription": "Cycles in which the marked instruction is the oldest in the pipeline (next-to-finish or next-to-complete)." + }, + { + "EventCode": "0x20130", + "EventName": "PM_MRK_INST_DECODED", + "BriefDescription": "An instruction was marked at decode time. Random Instruction Sampling (RIS) only." + }, + { + "EventCode": "0x20132", + "EventName": "PM_MRK_DFU_ISSUE", + "BriefDescription": "The marked instruction was a decimal floating point operation issued to the VSU. Measured at issue time." + }, + { + "EventCode": "0x20134", + "EventName": "PM_MRK_FXU_ISSUE", + "BriefDescription": "The marked instruction was a fixed point operation issued to the VSU. Measured at issue time." }, { "EventCode": "0x20138", @@ -40,6 +80,16 @@ "BriefDescription": "Marked Branch instruction finished." }, { + "EventCode": "0x2013C", + "EventName": "PM_MRK_FX_LSU_FIN", + "BriefDescription": "The marked instruction was simple fixed point that was issued to the store unit. Measured at finish time." + }, + { + "EventCode": "0x2C142", + "EventName": "PM_MRK_XFER_FROM_SRC_PMC2", + "BriefDescription": "For a marked data transfer instruction, the processor's L1 data cache was reloaded from the source specified in MMCR3[15:27]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." + }, + { "EventCode": "0x2C144", "EventName": "PM_MRK_XFER_FROM_SRC_CYC_PMC2", "BriefDescription": "Cycles taken for a marked demand miss to reload a line from the source specified in MMCR3[15:27]." @@ -60,19 +110,49 @@ "BriefDescription": "A marked branch completed. All branches are included." }, { - "EventCode": "0x200FD", - "EventName": "PM_L1_ICACHE_MISS", - "BriefDescription": "Demand iCache Miss." + "EventCode": "0x2D154", + "EventName": "PM_MRK_DERAT_MISS_64K", + "BriefDescription": "Data ERAT Miss (Data TLB Access) page size 64K for a marked instruction. When MMCR1[16]=0 this event counts only DERAT reloads for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." + }, + { + "EventCode": "0x201E0", + "EventName": "PM_MRK_DATA_FROM_MEMORY", + "BriefDescription": "The processor's data cache was reloaded from local, remote, or distant memory due to a demand miss for a marked load." + }, + { + "EventCode": "0x201E2", + "EventName": "PM_MRK_LD_MISS_L1", + "BriefDescription": "Marked demand data load miss counted at finish time." }, { - "EventCode": "0x30130", - "EventName": "PM_MRK_INST_FIN", - "BriefDescription": "marked instruction finished. Excludes instructions that finish at dispatch. Note that stores always finish twice since the address gets issued to the LSU and the data gets issued to the VSU." + "EventCode": "0x201E4", + "EventName": "PM_MRK_DATA_FROM_L3MISS", + "BriefDescription": "The processor's data cache was reloaded from a source other than the local core's L1, L2, or L3 due to a demand miss for a marked load." + }, + { + "EventCode": "0x3012A", + "EventName": "PM_MRK_L2_RC_DONE", + "BriefDescription": "L2 RC machine completed the transaction for the marked instruction." + }, + { + "EventCode": "0x30132", + "EventName": "PM_MRK_VSU_FIN", + "BriefDescription": "VSU marked instruction finished. Excludes simple FX instructions issued to the Store Unit." }, { "EventCode": "0x34146", "EventName": "PM_MRK_LD_CMPL", - "BriefDescription": "Marked loads completed." + "BriefDescription": "Marked load instruction completed." + }, + { + "EventCode": "0x3C142", + "EventName": "PM_MRK_XFER_FROM_SRC_PMC3", + "BriefDescription": "For a marked data transfer instruction, the processor's L1 data cache was reloaded from the source specified in MMCR3[30:42]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." + }, + { + "EventCode": "0x3C144", + "EventName": "PM_MRK_XFER_FROM_SRC_CYC_PMC3", + "BriefDescription": "Cycles taken for a marked demand miss to reload a line from the source specified in MMCR3[30:42]." }, { "EventCode": "0x3E158", @@ -82,12 +162,22 @@ { "EventCode": "0x3E15A", "EventName": "PM_MRK_ST_FIN", - "BriefDescription": "The marked instruction was a store of any kind." + "BriefDescription": "Marked store instruction finished." }, { - "EventCode": "0x30068", - "EventName": "PM_L1_ICACHE_RELOADED_PREF", - "BriefDescription": "Counts all Icache prefetch reloads ( includes demand turned into prefetch)." + "EventCode": "0x3F150", + "EventName": "PM_MRK_ST_DRAIN_CYC", + "BriefDescription": "Cycles in which the marked store drained from the core to the L2." + }, + { + "EventCode": "0x30162", + "EventName": "PM_MRK_ISSUE_DEPENDENT_LOAD", + "BriefDescription": "The marked instruction was dependent on a load. It is eligible for issue kill." + }, + { + "EventCode": "0x301E2", + "EventName": "PM_MRK_ST_CMPL", + "BriefDescription": "Marked store completed and sent to nest. Note that this count excludes cache-inhibited stores." }, { "EventCode": "0x301E4", @@ -95,48 +185,58 @@ "BriefDescription": "Marked Branch Mispredicted. Includes direction and target." }, { - "EventCode": "0x300F6", - "EventName": "PM_LD_DEMAND_MISS_L1", - "BriefDescription": "The L1 cache was reloaded with a line that fulfills a demand miss request. Counted at reload time, before finish." + "EventCode": "0x40116", + "EventName": "PM_MRK_LARX_FIN", + "BriefDescription": "Marked load and reserve instruction (LARX) finished. LARX and STCX are instructions used to acquire a lock." + }, + { + "EventCode": "0x40132", + "EventName": "PM_MRK_LSU_FIN", + "BriefDescription": "LSU marked instruction finish." }, { - "EventCode": "0x300FE", - "EventName": "PM_DATA_FROM_L3MISS", - "BriefDescription": "The processor's data cache was reloaded from a source other than the local core's L1, L2, or L3 due to a demand miss." + "EventCode": "0x44146", + "EventName": "PM_MRK_STCX_CORE_CYC", + "BriefDescription": "Cycles spent in the core portion of a marked STCX instruction. It starts counting when the instruction is decoded and stops counting when it drains into the L2." }, { - "EventCode": "0x40012", - "EventName": "PM_L1_ICACHE_RELOADED_ALL", - "BriefDescription": "Counts all Icache reloads includes demand, prefetch, prefetch turned into demand and demand turned into prefetch." + "EventCode": "0x4C142", + "EventName": "PM_MRK_XFER_FROM_SRC_PMC4", + "BriefDescription": "For a marked data transfer instruction, the processor's L1 data cache was reloaded from the source specified in MMCR3[45:57]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." }, { - "EventCode": "0x40134", - "EventName": "PM_MRK_INST_TIMEO", - "BriefDescription": "Marked instruction finish timeout (instruction was lost)." + "EventCode": "0x4C144", + "EventName": "PM_MRK_XFER_FROM_SRC_CYC_PMC4", + "BriefDescription": "Cycles taken for a marked demand miss to reload a line from the source specified in MMCR3[45:57]." }, { - "EventCode": "0x4505A", - "EventName": "PM_SP_FLOP_CMPL", - "BriefDescription": "Single Precision floating point instructions completed." + "EventCode": "0x4C15E", + "EventName": "PM_MRK_DTLB_MISS_64K", + "BriefDescription": "Marked Data TLB reload (after a miss) page size 64K. When MMCR1[16]=0 this event counts only for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." }, { - "EventCode": "0x4D058", - "EventName": "PM_VECTOR_FLOP_CMPL", - "BriefDescription": "Vector floating point instructions completed." + "EventCode": "0x4E15E", + "EventName": "PM_MRK_INST_FLUSHED", + "BriefDescription": "The marked instruction was flushed." }, { - "EventCode": "0x4D05A", - "EventName": "PM_NON_MATH_FLOP_CMPL", - "BriefDescription": "Non Math instructions completed." + "EventCode": "0x40164", + "EventName": "PM_MRK_DERAT_MISS_2M", + "BriefDescription": "Data ERAT Miss (Data TLB Access) page size 2M for a marked instruction. When MMCR1[16]=0 this event counts only DERAT reloads for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." }, { "EventCode": "0x401E0", "EventName": "PM_MRK_INST_CMPL", - "BriefDescription": "marked instruction completed." + "BriefDescription": "Marked instruction completed." + }, + { + "EventCode": "0x401E6", + "EventName": "PM_MRK_INST_FROM_L3MISS", + "BriefDescription": "The processor's instruction cache was reloaded from beyond the local core's L3 due to a demand miss for a marked instruction." }, { - "EventCode": "0x400FE", - "EventName": "PM_DATA_FROM_MEMORY", - "BriefDescription": "The processor's data cache was reloaded from local, remote, or distant memory due to a demand miss." + "EventCode": "0x401E8", + "EventName": "PM_MRK_DATA_FROM_L2MISS", + "BriefDescription": "The processor's L1 data cache was reloaded from a source beyond the local core's L2 due to a demand miss for a marked instruction." } ] --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/powerpc/power10/memory.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/powerpc/power10/memory.json @@ -1,25 +1,10 @@ [ { - "EventCode": "0x1000A", - "EventName": "PM_PMC3_REWIND", - "BriefDescription": "The speculative event selected for PMC3 rewinds and the counter for PMC3 is not charged." - }, - { "EventCode": "0x1C040", "EventName": "PM_XFER_FROM_SRC_PMC1", "BriefDescription": "The processor's L1 data cache was reloaded from the source specified in MMCR3[0:12]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." }, { - "EventCode": "0x1C142", - "EventName": "PM_MRK_XFER_FROM_SRC_PMC1", - "BriefDescription": "For a marked data transfer instruction, the processor's L1 data cache was reloaded from the source specified in MMCR3[0:12]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." - }, - { - "EventCode": "0x1C144", - "EventName": "PM_MRK_XFER_FROM_SRC_CYC_PMC1", - "BriefDescription": "Cycles taken for a marked demand miss to reload a line from the source specified in MMCR3[0:12]." - }, - { "EventCode": "0x1C056", "EventName": "PM_DERAT_MISS_4K", "BriefDescription": "Data ERAT Miss (Data TLB Access) page size 4K. When MMCR1[16]=0 this event counts only DERAT reloads for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." @@ -35,24 +20,9 @@ "BriefDescription": "Data TLB reload (after a miss) page size 2M. Implies radix translation was used. When MMCR1[16]=0 this event counts only for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." }, { - "EventCode": "0x1E056", - "EventName": "PM_EXEC_STALL_STORE_PIPE", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was executing in the store unit. This does not include cycles spent handling store misses, PTESYNC instructions or TLBIE instructions." - }, - { - "EventCode": "0x1F150", - "EventName": "PM_MRK_ST_L2_CYC", - "BriefDescription": "Cycles from L2 RC dispatch to L2 RC completion." - }, - { "EventCode": "0x10062", "EventName": "PM_LD_L3MISS_PEND_CYC", - "BriefDescription": "Cycles L3 miss was pending for this thread." - }, - { - "EventCode": "0x20010", - "EventName": "PM_PMC1_OVERFLOW", - "BriefDescription": "The event selected for PMC1 caused the event counter to overflow." + "BriefDescription": "Cycles in which an L3 miss was pending for this thread." }, { "EventCode": "0x2001A", @@ -80,36 +50,16 @@ "BriefDescription": "Data TLB reload (after a miss) page size 4K. When MMCR1[16]=0 this event counts only for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." }, { - "EventCode": "0x2D154", - "EventName": "PM_MRK_DERAT_MISS_64K", - "BriefDescription": "Data ERAT Miss (Data TLB Access) page size 64K for a marked instruction. When MMCR1[16]=0 this event counts only DERAT reloads for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." - }, - { "EventCode": "0x200F6", "EventName": "PM_DERAT_MISS", "BriefDescription": "DERAT Reloaded to satisfy a DERAT miss. All page sizes are counted by this event. When MMCR1[16]=0 this event counts only DERAT reloads for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." }, { - "EventCode": "0x30016", - "EventName": "PM_EXEC_STALL_DERAT_DTLB_MISS", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline suffered a TLB miss and waited for it resolve." - }, - { "EventCode": "0x3C040", "EventName": "PM_XFER_FROM_SRC_PMC3", "BriefDescription": "The processor's L1 data cache was reloaded from the source specified in MMCR3[30:42]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." }, { - "EventCode": "0x3C142", - "EventName": "PM_MRK_XFER_FROM_SRC_PMC3", - "BriefDescription": "For a marked data transfer instruction, the processor's L1 data cache was reloaded from the source specified in MMCR3[30:42]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." - }, - { - "EventCode": "0x3C144", - "EventName": "PM_MRK_XFER_FROM_SRC_CYC_PMC3", - "BriefDescription": "Cycles taken for a marked demand miss to reload a line from the source specified in MMCR3[30:42]." - }, - { "EventCode": "0x3C054", "EventName": "PM_DERAT_MISS_16M", "BriefDescription": "Data ERAT Miss (Data TLB Access) page size 16M. When MMCR1[16]=0 this event counts only DERAT reloads for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." @@ -125,24 +75,14 @@ "BriefDescription": "Load and reserve instruction (LARX) finished. LARX and STCX are instructions used to acquire a lock." }, { - "EventCode": "0x301E2", - "EventName": "PM_MRK_ST_CMPL", - "BriefDescription": "Marked store completed and sent to nest. Note that this count excludes cache-inhibited stores." - }, - { "EventCode": "0x300FC", "EventName": "PM_DTLB_MISS", - "BriefDescription": "The DPTEG required for the load/store instruction in execution was missing from the TLB. It includes pages of all sizes for demand and prefetch activity." - }, - { - "EventCode": "0x4D02C", - "EventName": "PM_PMC1_REWIND", - "BriefDescription": "The speculative event selected for PMC1 rewinds and the counter for PMC1 is not charged." + "BriefDescription": "The DPTEG required for the load/store instruction in execution was missing from the TLB. This event only counts for demand misses." }, { "EventCode": "0x4003E", "EventName": "PM_LD_CMPL", - "BriefDescription": "Loads completed." + "BriefDescription": "Load instruction completed." }, { "EventCode": "0x4C040", @@ -150,16 +90,6 @@ "BriefDescription": "The processor's L1 data cache was reloaded from the source specified in MMCR3[45:57]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." }, { - "EventCode": "0x4C142", - "EventName": "PM_MRK_XFER_FROM_SRC_PMC4", - "BriefDescription": "For a marked data transfer instruction, the processor's L1 data cache was reloaded from the source specified in MMCR3[45:57]. If MMCR1[16|17] is 0 (default), this count includes only lines that were reloaded to satisfy a demand miss. If MMCR1[16|17] is 1, this count includes both demand misses and prefetch reloads." - }, - { - "EventCode": "0x4C144", - "EventName": "PM_MRK_XFER_FROM_SRC_CYC_PMC4", - "BriefDescription": "Cycles taken for a marked demand miss to reload a line from the source specified in MMCR3[45:57]." - }, - { "EventCode": "0x4C056", "EventName": "PM_DTLB_MISS_16M", "BriefDescription": "Data TLB reload (after a miss) page size 16M. When MMCR1[16]=0 this event counts only for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." @@ -168,20 +98,5 @@ "EventCode": "0x4C05A", "EventName": "PM_DTLB_MISS_1G", "BriefDescription": "Data TLB reload (after a miss) page size 1G. Implies radix translation was used. When MMCR1[16]=0 this event counts only for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." - }, - { - "EventCode": "0x4C15E", - "EventName": "PM_MRK_DTLB_MISS_64K", - "BriefDescription": "Marked Data TLB reload (after a miss) page size 64K. When MMCR1[16]=0 this event counts only for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." - }, - { - "EventCode": "0x4D056", - "EventName": "PM_NON_FMA_FLOP_CMPL", - "BriefDescription": "Non FMA instruction completed." - }, - { - "EventCode": "0x40164", - "EventName": "PM_MRK_DERAT_MISS_2M", - "BriefDescription": "Data ERAT Miss (Data TLB Access) page size 2M for a marked instruction. When MMCR1[16]=0 this event counts only DERAT reloads for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." } ] --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/powerpc/power10/metrics.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/powerpc/power10/metrics.json @@ -16,133 +16,133 @@ "BriefDescription": "Average cycles per completed instruction when dispatch was stalled for any reason", "MetricExpr": "PM_DISP_STALL_CYC / PM_RUN_INST_CMPL", "MetricGroup": "CPI;CPI_STALL_RATIO", - "MetricName": "DISPATCHED_CPI" + "MetricName": "DISPATCH_STALL_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled because there was a flush", "MetricExpr": "PM_DISP_STALL_FLUSH / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_FLUSH_CPI" + "MetricName": "DISPATCH_STALL_FLUSH_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled because the MMU was handling a translation miss", "MetricExpr": "PM_DISP_STALL_TRANSLATION / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_TRANSLATION_CPI" + "MetricName": "DISPATCH_STALL_TRANSLATION_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled waiting to resolve an instruction ERAT miss", "MetricExpr": "PM_DISP_STALL_IERAT_ONLY_MISS / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_IERAT_ONLY_MISS_CPI" + "MetricName": "DISPATCH_STALL_IERAT_ONLY_MISS_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled waiting to resolve an instruction TLB miss", "MetricExpr": "PM_DISP_STALL_ITLB_MISS / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_ITLB_MISS_CPI" + "MetricName": "DISPATCH_STALL_ITLB_MISS_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled due to an icache miss", "MetricExpr": "PM_DISP_STALL_IC_MISS / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_IC_MISS_CPI" + "MetricName": "DISPATCH_STALL_IC_MISS_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled while the instruction was fetched from the local L2", "MetricExpr": "PM_DISP_STALL_IC_L2 / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_IC_L2_CPI" + "MetricName": "DISPATCH_STALL_IC_L2_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled while the instruction was fetched from the local L3", "MetricExpr": "PM_DISP_STALL_IC_L3 / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_IC_L3_CPI" + "MetricName": "DISPATCH_STALL_IC_L3_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled while the instruction was fetched from any source beyond the local L3", "MetricExpr": "PM_DISP_STALL_IC_L3MISS / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_IC_L3MISS_CPI" + "MetricName": "DISPATCH_STALL_IC_L3MISS_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled due to an icache miss after a branch mispredict", "MetricExpr": "PM_DISP_STALL_BR_MPRED_ICMISS / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_BR_MPRED_ICMISS_CPI" + "MetricName": "DISPATCH_STALL_BR_MPRED_ICMISS_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled while instruction was fetched from the local L2 after suffering a branch mispredict", "MetricExpr": "PM_DISP_STALL_BR_MPRED_IC_L2 / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_BR_MPRED_IC_L2_CPI" + "MetricName": "DISPATCH_STALL_BR_MPRED_IC_L2_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled while instruction was fetched from the local L3 after suffering a branch mispredict", "MetricExpr": "PM_DISP_STALL_BR_MPRED_IC_L3 / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_BR_MPRED_IC_L3_CPI" + "MetricName": "DISPATCH_STALL_BR_MPRED_IC_L3_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled while instruction was fetched from any source beyond the local L3 after suffering a branch mispredict", "MetricExpr": "PM_DISP_STALL_BR_MPRED_IC_L3MISS / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_BR_MPRED_IC_L3MISS_CPI" + "MetricName": "DISPATCH_STALL_BR_MPRED_IC_L3MISS_CPI" }, { "BriefDescription": "Average cycles per completed instruction when dispatch was stalled due to a branch mispredict", "MetricExpr": "PM_DISP_STALL_BR_MPRED / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_BR_MPRED_CPI" + "MetricName": "DISPATCH_STALL_BR_MPRED_CPI" }, { "BriefDescription": "Average cycles per completed instruction when the NTC instruction was held at dispatch for any reason", "MetricExpr": "PM_DISP_STALL_HELD_CYC / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_HELD_CPI" + "MetricName": "DISPATCH_STALL_HELD_CPI" }, { "BriefDescription": "Average cycles per completed instruction when the NTC instruction was held at dispatch because of a synchronizing instruction that requires the ICT to be empty before dispatch", "MetricExpr": "PM_DISP_STALL_HELD_SYNC_CYC / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISP_HELD_STALL_SYNC_CPI" + "MetricName": "DISPATCH_STALL_HELD_SYNC_CPI" }, { "BriefDescription": "Average cycles per completed instruction when the NTC instruction was held at dispatch while waiting on the scoreboard", "MetricExpr": "PM_DISP_STALL_HELD_SCOREBOARD_CYC / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISP_HELD_STALL_SCOREBOARD_CPI" + "MetricName": "DISPATCH_STALL_HELD_SCOREBOARD_CPI" }, { "BriefDescription": "Average cycles per completed instruction when the NTC instruction was held at dispatch due to issue queue full", "MetricExpr": "PM_DISP_STALL_HELD_ISSQ_FULL_CYC / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISP_HELD_STALL_ISSQ_FULL_CPI" + "MetricName": "DISPATCH_STALL_HELD_ISSQ_FULL_CPI" }, { "BriefDescription": "Average cycles per completed instruction when the NTC instruction was held at dispatch because the mapper/SRB was full", "MetricExpr": "PM_DISP_STALL_HELD_RENAME_CYC / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_HELD_RENAME_CPI" + "MetricName": "DISPATCH_STALL_HELD_RENAME_CPI" }, { "BriefDescription": "Average cycles per completed instruction when the NTC instruction was held at dispatch because the STF mapper/SRB was full", "MetricExpr": "PM_DISP_STALL_HELD_STF_MAPPER_CYC / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_HELD_STF_MAPPER_CPI" + "MetricName": "DISPATCH_STALL_HELD_STF_MAPPER_CPI" }, { "BriefDescription": "Average cycles per completed instruction when the NTC instruction was held at dispatch because the XVFC mapper/SRB was full", "MetricExpr": "PM_DISP_STALL_HELD_XVFC_MAPPER_CYC / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_HELD_XVFC_MAPPER_CPI" + "MetricName": "DISPATCH_STALL_HELD_XVFC_MAPPER_CPI" }, { "BriefDescription": "Average cycles per completed instruction when the NTC instruction was held at dispatch for any other reason", "MetricExpr": "PM_DISP_STALL_HELD_OTHER_CYC / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_HELD_OTHER_CPI" + "MetricName": "DISPATCH_STALL_HELD_OTHER_CPI" }, { "BriefDescription": "Average cycles per completed instruction when the NTC instruction has been dispatched but not issued for any reason", @@ -352,13 +352,13 @@ "BriefDescription": "Average cycles per completed instruction when dispatch was stalled because fetch was being held, so there was nothing in the pipeline for this thread", "MetricExpr": "PM_DISP_STALL_FETCH / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_FETCH_CPI" + "MetricName": "DISPATCH_STALL_FETCH_CPI" }, { "BriefDescription": "Average cycles per completed instruction when the NTC instruction was held at dispatch because of power management", "MetricExpr": "PM_DISP_STALL_HELD_HALT_CYC / PM_RUN_INST_CMPL", "MetricGroup": "CPI", - "MetricName": "DISPATCHED_HELD_HALT_CPI" + "MetricName": "DISPATCH_STALL_HELD_HALT_CPI" }, { "BriefDescription": "Percentage of flushes per completed instruction", @@ -454,12 +454,6 @@ "MetricName": "LOADS_PER_INST" }, { - "BriefDescription": "Average number of finished stores per completed instruction", - "MetricExpr": "PM_ST_FIN / PM_RUN_INST_CMPL", - "MetricGroup": "General", - "MetricName": "STORES_PER_INST" - }, - { "BriefDescription": "Percentage of demand loads that reloaded from beyond the L2 per completed instruction", "MetricExpr": "PM_DATA_FROM_L2MISS / PM_RUN_INST_CMPL * 100", "MetricGroup": "dL1_Reloads", @@ -566,7 +560,7 @@ "BriefDescription": "Average number of STCX instructions finshed per completed instruction", "MetricExpr": "PM_STCX_FIN / PM_RUN_INST_CMPL", "MetricGroup": "General", - "MetricName": "STXC_PER_INST" + "MetricName": "STCX_PER_INST" }, { "BriefDescription": "Average number of LARX instructions finshed per completed instruction", --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/powerpc/power10/others.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/powerpc/power10/others.json @@ -1,28 +1,13 @@ [ { - "EventCode": "0x10016", - "EventName": "PM_VSU0_ISSUE", - "BriefDescription": "VSU instructions issued to VSU pipe 0." - }, - { - "EventCode": "0x1001C", - "EventName": "PM_ULTRAVISOR_INST_CMPL", - "BriefDescription": "PowerPC instructions that completed while the thread was in ultravisor state." - }, - { - "EventCode": "0x100F0", - "EventName": "PM_CYC", - "BriefDescription": "Processor cycles." - }, - { - "EventCode": "0x10134", - "EventName": "PM_MRK_ST_DONE_L2", - "BriefDescription": "Marked stores completed in L2 (RC machine done)." + "EventCode": "0x1002C", + "EventName": "PM_LD_PREFETCH_CACHE_LINE_MISS", + "BriefDescription": "The L1 cache was reloaded with a line that fulfills a prefetch request." }, { "EventCode": "0x1505E", "EventName": "PM_LD_HIT_L1", - "BriefDescription": "Loads that finished without experiencing an L1 miss." + "BriefDescription": "Load finished without experiencing an L1 miss." }, { "EventCode": "0x1F056", @@ -30,49 +15,19 @@ "BriefDescription": "Cycles in which Superslice 0 dispatches either 1 or 2 instructions." }, { - "EventCode": "0x1F15C", - "EventName": "PM_MRK_STCX_L2_CYC", - "BriefDescription": "Cycles spent in the nest portion of a marked Stcx instruction. It starts counting when the operation starts to drain to the L2 and it stops counting when the instruction retires from the Instruction Completion Table (ICT) in the Instruction Sequencing Unit (ISU)." - }, - { "EventCode": "0x10066", "EventName": "PM_ADJUNCT_CYC", "BriefDescription": "Cycles in which the thread is in Adjunct state. MSR[S HV PR] bits = 011." }, { - "EventCode": "0x101E4", - "EventName": "PM_MRK_L1_ICACHE_MISS", - "BriefDescription": "Marked Instruction suffered an icache Miss." - }, - { - "EventCode": "0x101EA", - "EventName": "PM_MRK_L1_RELOAD_VALID", - "BriefDescription": "Marked demand reload." - }, - { - "EventCode": "0x100F4", - "EventName": "PM_FLOP_CMPL", - "BriefDescription": "Floating Point Operations Completed. Includes any type. It counts once for each 1, 2, 4 or 8 flop instruction. Use PM_1|2|4|8_FLOP_CMPL events to count flops." - }, - { - "EventCode": "0x100FA", - "EventName": "PM_RUN_LATCH_ANY_THREAD_CYC", - "BriefDescription": "Cycles when at least one thread has the run latch set." - }, - { "EventCode": "0x100FC", "EventName": "PM_LD_REF_L1", "BriefDescription": "All L1 D cache load references counted at finish, gated by reject. In P9 and earlier this event counted only cacheable loads but in P10 both cacheable and non-cacheable loads are included." }, { - "EventCode": "0x2000C", - "EventName": "PM_RUN_LATCH_ALL_THREADS_CYC", - "BriefDescription": "Cycles when the run latch is set for all threads." - }, - { "EventCode": "0x2E010", "EventName": "PM_ADJUNCT_INST_CMPL", - "BriefDescription": "PowerPC instructions that completed while the thread is in Adjunct state." + "BriefDescription": "PowerPC instruction completed while the thread was in Adjunct state." }, { "EventCode": "0x2E014", @@ -80,26 +35,6 @@ "BriefDescription": "Conditional store instruction (STCX) finished. LARX and STCX are instructions used to acquire a lock." }, { - "EventCode": "0x20130", - "EventName": "PM_MRK_INST_DECODED", - "BriefDescription": "An instruction was marked at decode time. Random Instruction Sampling (RIS) only." - }, - { - "EventCode": "0x20132", - "EventName": "PM_MRK_DFU_ISSUE", - "BriefDescription": "The marked instruction was a decimal floating point operation issued to the VSU. Measured at issue time." - }, - { - "EventCode": "0x20134", - "EventName": "PM_MRK_FXU_ISSUE", - "BriefDescription": "The marked instruction was a fixed point operation issued to the VSU. Measured at issue time." - }, - { - "EventCode": "0x2505C", - "EventName": "PM_VSU_ISSUE", - "BriefDescription": "At least one VSU instruction was issued to one of the VSU pipes. Up to 4 per cycle. Includes fixed point operations." - }, - { "EventCode": "0x2F054", "EventName": "PM_DISP_SS1_2_INSTR_CYC", "BriefDescription": "Cycles in which Superslice 1 dispatches either 1 or 2 instructions." @@ -110,39 +45,14 @@ "BriefDescription": "Cycles in which Superslice 1 dispatches either 3 or 4 instructions." }, { - "EventCode": "0x2006C", - "EventName": "PM_RUN_CYC_SMT4_MODE", - "BriefDescription": "Cycles when this thread's run latch is set and the core is in SMT4 mode." - }, - { - "EventCode": "0x201E0", - "EventName": "PM_MRK_DATA_FROM_MEMORY", - "BriefDescription": "The processor's data cache was reloaded from local, remote, or distant memory due to a demand miss for a marked load." - }, - { - "EventCode": "0x201E4", - "EventName": "PM_MRK_DATA_FROM_L3MISS", - "BriefDescription": "The processor's data cache was reloaded from a source other than the local core's L1, L2, or L3 due to a demand miss for a marked load." - }, - { - "EventCode": "0x201E8", - "EventName": "PM_THRESH_EXC_512", - "BriefDescription": "Threshold counter exceeded a value of 512." - }, - { "EventCode": "0x200F2", "EventName": "PM_INST_DISP", - "BriefDescription": "PowerPC instructions dispatched." - }, - { - "EventCode": "0x30132", - "EventName": "PM_MRK_VSU_FIN", - "BriefDescription": "VSU marked instructions finished. Excludes simple FX instructions issued to the Store Unit." + "BriefDescription": "PowerPC instruction dispatched." }, { - "EventCode": "0x30038", - "EventName": "PM_EXEC_STALL_DMISS_LMEM", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from the local memory, local OpenCapp cache, or local OpenCapp memory." + "EventCode": "0x200FD", + "EventName": "PM_L1_ICACHE_MISS", + "BriefDescription": "Demand instruction cache miss." }, { "EventCode": "0x3F04A", @@ -152,12 +62,7 @@ { "EventCode": "0x3405A", "EventName": "PM_PRIVILEGED_INST_CMPL", - "BriefDescription": "PowerPC Instructions that completed while the thread is in Privileged state." - }, - { - "EventCode": "0x3F150", - "EventName": "PM_MRK_ST_DRAIN_CYC", - "BriefDescription": "cycles to drain st from core to L2." + "BriefDescription": "PowerPC instruction completed while the thread was in Privileged state." }, { "EventCode": "0x3F054", @@ -170,74 +75,29 @@ "BriefDescription": "Cycles in which Superslice 0 dispatches either 5, 6, 7 or 8 instructions." }, { - "EventCode": "0x30162", - "EventName": "PM_MRK_ISSUE_DEPENDENT_LOAD", - "BriefDescription": "The marked instruction was dependent on a load. It is eligible for issue kill." - }, - { - "EventCode": "0x40114", - "EventName": "PM_MRK_START_PROBE_NOP_DISP", - "BriefDescription": "Marked Start probe nop dispatched. Instruction AND R0,R0,R0." - }, - { - "EventCode": "0x4001C", - "EventName": "PM_VSU_FIN", - "BriefDescription": "VSU instructions finished." - }, - { - "EventCode": "0x4C01A", - "EventName": "PM_EXEC_STALL_DMISS_OFF_NODE", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from a distant chip." - }, - { - "EventCode": "0x4D012", - "EventName": "PM_PMC3_SAVED", - "BriefDescription": "The conditions for the speculative event selected for PMC3 are met and PMC3 is charged." + "EventCode": "0x30068", + "EventName": "PM_L1_ICACHE_RELOADED_PREF", + "BriefDescription": "Counts all instruction cache prefetch reloads (includes demand turned into prefetch)." }, { - "EventCode": "0x4D022", - "EventName": "PM_HYPERVISOR_INST_CMPL", - "BriefDescription": "PowerPC instructions that completed while the thread is in hypervisor state." + "EventCode": "0x300F6", + "EventName": "PM_LD_DEMAND_MISS_L1", + "BriefDescription": "The L1 cache was reloaded with a line that fulfills a demand miss request. Counted at reload time, before finish." }, { - "EventCode": "0x4D026", - "EventName": "PM_ULTRAVISOR_CYC", - "BriefDescription": "Cycles when the thread is in Ultravisor state. MSR[S HV PR]=110." + "EventCode": "0x300FE", + "EventName": "PM_DATA_FROM_L3MISS", + "BriefDescription": "The processor's data cache was reloaded from a source other than the local core's L1, L2, or L3 due to a demand miss." }, { - "EventCode": "0x4D028", - "EventName": "PM_PRIVILEGED_CYC", - "BriefDescription": "Cycles when the thread is in Privileged state. MSR[S HV PR]=x00." - }, - { - "EventCode": "0x40030", - "EventName": "PM_INST_FIN", - "BriefDescription": "Instructions finished." - }, - { - "EventCode": "0x44146", - "EventName": "PM_MRK_STCX_CORE_CYC", - "BriefDescription": "Cycles spent in the core portion of a marked Stcx instruction. It starts counting when the instruction is decoded and stops counting when it drains into the L2." + "EventCode": "0x40012", + "EventName": "PM_L1_ICACHE_RELOADED_ALL", + "BriefDescription": "Counts all instruction cache reloads includes demand, prefetch, prefetch turned into demand and demand turned into prefetch." }, { "EventCode": "0x44054", "EventName": "PM_VECTOR_LD_CMPL", - "BriefDescription": "Vector load instructions completed." - }, - { - "EventCode": "0x45054", - "EventName": "PM_FMA_CMPL", - "BriefDescription": "Two floating point instructions completed (FMA class of instructions: fmadd, fnmadd, fmsub, fnmsub). Scalar instructions only." - }, - { - "EventCode": "0x45056", - "EventName": "PM_SCALAR_FLOP_CMPL", - "BriefDescription": "Scalar floating point instructions completed." - }, - { - "EventCode": "0x4505C", - "EventName": "PM_MATH_FLOP_CMPL", - "BriefDescription": "Math floating point instructions completed." + "BriefDescription": "Vector load instruction completed." }, { "EventCode": "0x4D05E", @@ -245,28 +105,13 @@ "BriefDescription": "A branch completed. All branches are included." }, { - "EventCode": "0x4E15E", - "EventName": "PM_MRK_INST_FLUSHED", - "BriefDescription": "The marked instruction was flushed." - }, - { - "EventCode": "0x401E6", - "EventName": "PM_MRK_INST_FROM_L3MISS", - "BriefDescription": "The processor's instruction cache was reloaded from a source other than the local core's L1, L2, or L3 due to a demand miss for a marked instruction." - }, - { - "EventCode": "0x401E8", - "EventName": "PM_MRK_DATA_FROM_L2MISS", - "BriefDescription": "The processor's data cache was reloaded from a source other than the local core's L1 or L2 due to a demand miss for a marked load." - }, - { "EventCode": "0x400F0", "EventName": "PM_LD_DEMAND_MISS_L1_FIN", - "BriefDescription": "Load Missed L1, counted at finish time." + "BriefDescription": "Load missed L1, counted at finish time." }, { - "EventCode": "0x500FA", - "EventName": "PM_RUN_INST_CMPL", - "BriefDescription": "Completed PowerPC instructions gated by the run latch." + "EventCode": "0x400FE", + "EventName": "PM_DATA_FROM_MEMORY", + "BriefDescription": "The processor's data cache was reloaded from local, remote, or distant memory due to a demand miss." } ] --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/powerpc/power10/pipeline.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/powerpc/power10/pipeline.json @@ -1,8 +1,13 @@ [ { - "EventCode": "0x100FE", - "EventName": "PM_INST_CMPL", - "BriefDescription": "PowerPC instructions completed." + "EventCode": "0x10004", + "EventName": "PM_EXEC_STALL_TRANSLATION", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline suffered a TLB miss or ERAT miss and waited for it to resolve." + }, + { + "EventCode": "0x10006", + "EventName": "PM_DISP_STALL_HELD_OTHER_CYC", + "BriefDescription": "Cycles in which the next-to-complete (NTC) instruction is held at dispatch for any other reason." }, { "EventCode": "0x1000C", @@ -12,7 +17,7 @@ { "EventCode": "0x1000E", "EventName": "PM_MMA_ISSUED", - "BriefDescription": "MMA instructions issued." + "BriefDescription": "MMA instruction issued." }, { "EventCode": "0x10012", @@ -30,14 +35,19 @@ "BriefDescription": "Cycles in which an instruction reload is pending to satisfy a demand miss." }, { - "EventCode": "0x10022", - "EventName": "PM_PMC2_SAVED", - "BriefDescription": "The conditions for the speculative event selected for PMC2 are met and PMC2 is charged." + "EventCode": "0x10038", + "EventName": "PM_DISP_STALL_TRANSLATION", + "BriefDescription": "Cycles when dispatch was stalled for this thread because the MMU was handling a translation miss." }, { - "EventCode": "0x10024", - "EventName": "PM_PMC5_OVERFLOW", - "BriefDescription": "The event selected for PMC5 caused the event counter to overflow." + "EventCode": "0x1003A", + "EventName": "PM_DISP_STALL_BR_MPRED_IC_L2", + "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from the local L2 after suffering a branch mispredict." + }, + { + "EventCode": "0x1003C", + "EventName": "PM_EXEC_STALL_DMISS_L2L3", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from either the local L2 or local L3." }, { "EventCode": "0x10058", @@ -55,11 +65,36 @@ "BriefDescription": "Data ERAT Miss (Data TLB Access) page size 2M. Implies radix translation. When MMCR1[16]=0 this event counts only DERAT reloads for demand misses. When MMCR1[16]=1 this event includes demand misses and prefetches." }, { + "EventCode": "0x1D05E", + "EventName": "PM_DISP_STALL_HELD_HALT_CYC", + "BriefDescription": "Cycles in which the next-to-complete (NTC) instruction is held at dispatch because of power management." + }, + { + "EventCode": "0x1E050", + "EventName": "PM_DISP_STALL_HELD_STF_MAPPER_CYC", + "BriefDescription": "Cycles in which the next-to-complete (NTC) instruction is held at dispatch because the STF mapper/SRB was full. Includes GPR (count, link, tar), VSR, VMR, FPR." + }, + { + "EventCode": "0x1E054", + "EventName": "PM_EXEC_STALL_DMISS_L21_L31", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from another core's L2 or L3 on the same chip." + }, + { + "EventCode": "0x1E056", + "EventName": "PM_EXEC_STALL_STORE_PIPE", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was executing in the store unit. This does not include cycles spent handling store misses, PTESYNC instructions or TLBIE instructions." + }, + { "EventCode": "0x1E05A", "EventName": "PM_CMPL_STALL_LWSYNC", "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a lwsync waiting to complete." }, { + "EventCode": "0x10064", + "EventName": "PM_DISP_STALL_IC_L2", + "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from the local L2." + }, + { "EventCode": "0x10068", "EventName": "PM_BR_FIN", "BriefDescription": "A branch instruction finished. Includes predicted/mispredicted/unconditional." @@ -70,9 +105,9 @@ "BriefDescription": "Simple fixed point instruction issued to the store unit. Measured at finish time." }, { - "EventCode": "0x1006C", - "EventName": "PM_RUN_CYC_ST_MODE", - "BriefDescription": "Cycles when the run latch is set and the core is in ST mode." + "EventCode": "0x100F8", + "EventName": "PM_DISP_STALL_CYC", + "BriefDescription": "Cycles the ICT has no itags assigned to this thread (no instructions were dispatched during these cycles)." }, { "EventCode": "0x20004", @@ -80,9 +115,9 @@ "BriefDescription": "Cycles in which the oldest instruction in the pipeline was dispatched but not issued yet." }, { - "EventCode": "0x2000A", - "EventName": "PM_HYPERVISOR_CYC", - "BriefDescription": "Cycles when the thread is in Hypervisor state. MSR[S HV PR]=010." + "EventCode": "0x20006", + "EventName": "PM_DISP_STALL_HELD_ISSQ_FULL_CYC", + "BriefDescription": "Cycles in which the next-to-complete (NTC) instruction is held at dispatch due to Issue queue full. Includes issue queue and branch queue." }, { "EventCode": "0x2000E", @@ -90,24 +125,59 @@ "BriefDescription": "LSU Finished an internal operation in LD1 port." }, { + "EventCode": "0x2C010", + "EventName": "PM_EXEC_STALL_LSU", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was executing in the Load Store Unit. This does not include simple fixed point instructions." + }, + { "EventCode": "0x2C014", "EventName": "PM_CMPL_STALL_SPECIAL", "BriefDescription": "Cycles in which the oldest instruction in the pipeline required special handling before completing." }, { + "EventCode": "0x2C016", + "EventName": "PM_DISP_STALL_IERAT_ONLY_MISS", + "BriefDescription": "Cycles when dispatch was stalled while waiting to resolve an instruction ERAT miss." + }, + { "EventCode": "0x2C018", "EventName": "PM_EXEC_STALL_DMISS_L3MISS", "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from a source beyond the local L2 or local L3." }, { + "EventCode": "0x2C01C", + "EventName": "PM_EXEC_STALL_DMISS_OFF_CHIP", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from a remote chip." + }, + { + "EventCode": "0x2C01E", + "EventName": "PM_DISP_STALL_BR_MPRED_IC_L3", + "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from the local L3 after suffering a branch mispredict." + }, + { "EventCode": "0x2D010", "EventName": "PM_LSU_ST1_FIN", "BriefDescription": "LSU Finished an internal operation in ST1 port." }, { + "EventCode": "0x10016", + "EventName": "PM_VSU0_ISSUE", + "BriefDescription": "VSU instruction issued to VSU pipe 0." + }, + { "EventCode": "0x2D012", "EventName": "PM_VSU1_ISSUE", - "BriefDescription": "VSU instructions issued to VSU pipe 1." + "BriefDescription": "VSU instruction issued to VSU pipe 1." + }, + { + "EventCode": "0x2505C", + "EventName": "PM_VSU_ISSUE", + "BriefDescription": "At least one VSU instruction was issued to one of the VSU pipes. Up to 4 per cycle. Includes fixed point operations." + }, + { + "EventCode": "0x4001C", + "EventName": "PM_VSU_FIN", + "BriefDescription": "VSU instruction finished." }, { "EventCode": "0x2D018", @@ -115,19 +185,34 @@ "BriefDescription": "Cycles in which the oldest instruction in the pipeline was executing in the VSU (includes FXU, VSU, CRU)." }, { + "EventCode": "0x2D01A", + "EventName": "PM_DISP_STALL_IC_MISS", + "BriefDescription": "Cycles when dispatch was stalled for this thread due to an instruction cache miss." + }, + { "EventCode": "0x2D01C", "EventName": "PM_CMPL_STALL_STCX", "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a stcx waiting for resolution from the nest before completing." }, { - "EventCode": "0x2E01E", - "EventName": "PM_EXEC_STALL_NTC_FLUSH", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was executing in any unit before it was flushed. Note that if the flush of the oldest instruction happens after finish, the cycles from dispatch to issue will be included in PM_DISP_STALL and the cycles from issue to finish will be included in PM_EXEC_STALL and its corresponding children. This event will also count cycles when the previous NTF instruction is still completing and the new NTF instruction is stalled at dispatch." + "EventCode": "0x2E018", + "EventName": "PM_DISP_STALL_FETCH", + "BriefDescription": "Cycles when dispatch was stalled for this thread because Fetch was being held." + }, + { + "EventCode": "0x2E01A", + "EventName": "PM_DISP_STALL_HELD_XVFC_MAPPER_CYC", + "BriefDescription": "Cycles in which the next-to-complete (NTC) instruction is held at dispatch because the XVFC mapper/SRB was full." }, { - "EventCode": "0x2013C", - "EventName": "PM_MRK_FX_LSU_FIN", - "BriefDescription": "The marked instruction was simple fixed point that was issued to the store unit. Measured at finish time." + "EventCode": "0x2E01C", + "EventName": "PM_EXEC_STALL_TLBIE", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a TLBIE instruction executing in the Load Store Unit." + }, + { + "EventCode": "0x2E01E", + "EventName": "PM_EXEC_STALL_NTC_FLUSH", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was executing in any unit before it was flushed. Note that if the flush of the oldest instruction happens after finish, the cycles from dispatch to issue will be included in PM_DISP_STALL and the cycles from issue to finish will be included in PM_EXEC_STALL and its corresponding children. This event will also count cycles when the previous next-to-finish (NTF) instruction is still completing and the new NTF instruction is stalled at dispatch." }, { "EventCode": "0x2405A", @@ -135,14 +220,9 @@ "BriefDescription": "Cycles in which the oldest instruction in the pipeline (NTC) finishes. Note that instructions can finish out of order, therefore not all the instructions that finish have a Next-to-complete status." }, { - "EventCode": "0x201E2", - "EventName": "PM_MRK_LD_MISS_L1", - "BriefDescription": "Marked DL1 Demand Miss counted at finish time." - }, - { - "EventCode": "0x200F4", - "EventName": "PM_RUN_CYC", - "BriefDescription": "Processor cycles gated by the run latch." + "EventCode": "0x30004", + "EventName": "PM_DISP_STALL_FLUSH", + "BriefDescription": "Cycles when dispatch was stalled because of a flush that happened to an instruction(s) that was not yet next-to-complete (NTC). PM_EXEC_STALL_NTC_FLUSH only includes instructions that were flushed after becoming NTC." }, { "EventCode": "0x30008", @@ -150,29 +230,34 @@ "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting to finish in one of the execution units (BRU, LSU, VSU). Only cycles between issue and finish are counted in this category." }, { - "EventCode": "0x3001A", - "EventName": "PM_LSU_ST2_FIN", - "BriefDescription": "LSU Finished an internal operation in ST2 port." + "EventCode": "0x30014", + "EventName": "PM_EXEC_STALL_STORE", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a store instruction executing in the Load Store Unit." }, { - "EventCode": "0x30020", - "EventName": "PM_PMC2_REWIND", - "BriefDescription": "The speculative event selected for PMC2 rewinds and the counter for PMC2 is not charged." + "EventCode": "0x30016", + "EventName": "PM_EXEC_STALL_DERAT_DTLB_MISS", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline suffered a TLB miss and waited for it resolve." }, { - "EventCode": "0x30022", - "EventName": "PM_PMC4_SAVED", - "BriefDescription": "The conditions for the speculative event selected for PMC4 are met and PMC4 is charged." + "EventCode": "0x30018", + "EventName": "PM_DISP_STALL_HELD_SCOREBOARD_CYC", + "BriefDescription": "Cycles in which the next-to-complete (NTC) instruction is held at dispatch while waiting on the Scoreboard. This event combines VSCR and FPSCR together." + }, + { + "EventCode": "0x3001A", + "EventName": "PM_LSU_ST2_FIN", + "BriefDescription": "LSU Finished an internal operation in ST2 port." }, { - "EventCode": "0x30024", - "EventName": "PM_PMC6_OVERFLOW", - "BriefDescription": "The event selected for PMC6 caused the event counter to overflow." + "EventCode": "0x30026", + "EventName": "PM_EXEC_STALL_STORE_MISS", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a store whose cache line was not resident in the L1 and was waiting for allocation of the missing line into the L1." }, { "EventCode": "0x30028", "EventName": "PM_CMPL_STALL_MEM_ECC", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for the non-speculative finish of either a stcx waiting for its result or a load waiting for non-critical sectors of data and ECC." + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for the non-speculative finish of either a STCX waiting for its result or a load waiting for non-critical sectors of data and ECC." }, { "EventCode": "0x30036", @@ -180,6 +265,11 @@ "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a simple fixed point instruction executing in the Load Store Unit." }, { + "EventCode": "0x30038", + "EventName": "PM_EXEC_STALL_DMISS_LMEM", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from the local memory, local OpenCAPI cache, or local OpenCAPI memory." + }, + { "EventCode": "0x3003A", "EventName": "PM_CMPL_STALL_EXCEPTION", "BriefDescription": "Cycles in which the oldest instruction in the pipeline was not allowed to complete because it was interrupted by ANY exception, which has to be serviced before the instruction can complete." @@ -187,17 +277,37 @@ { "EventCode": "0x3F044", "EventName": "PM_VSU2_ISSUE", - "BriefDescription": "VSU instructions issued to VSU pipe 2." + "BriefDescription": "VSU instruction issued to VSU pipe 2." }, { "EventCode": "0x30058", "EventName": "PM_TLBIE_FIN", - "BriefDescription": "TLBIE instructions finished in the LSU. Two TLBIEs can finish each cycle. All will be counted." + "BriefDescription": "TLBIE instruction finished in the LSU. Two TLBIEs can finish each cycle. All will be counted." + }, + { + "EventCode": "0x34054", + "EventName": "PM_EXEC_STALL_DMISS_L2L3_NOCONFLICT", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from the local L2 or local L3, without a dispatch conflict." + }, + { + "EventCode": "0x34056", + "EventName": "PM_EXEC_STALL_LOAD_FINISH", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was finishing a load after its data was reloaded from a data source beyond the local L1; cycles in which the LSU was processing an L1-hit; cycles in which the next-to-finish (NTF) instruction merged with another load in the LMQ; cycles in which the NTF instruction is waiting for a data reload for a load miss, but the data comes back with a non-NTF instruction." + }, + { + "EventCode": "0x34058", + "EventName": "PM_DISP_STALL_BR_MPRED_ICMISS", + "BriefDescription": "Cycles when dispatch was stalled after a mispredicted branch resulted in an instruction cache miss." + }, + { + "EventCode": "0x3D05C", + "EventName": "PM_DISP_STALL_HELD_RENAME_CYC", + "BriefDescription": "Cycles in which the next-to-complete (NTC) instruction is held at dispatch because the mapper/SRB was full. Includes GPR (count, link, tar), VSR, VMR, FPR and XVFC." }, { - "EventCode": "0x3D058", - "EventName": "PM_SCALAR_FSQRT_FDIV_ISSUE", - "BriefDescription": "Scalar versions of four floating point operations: fdiv,fsqrt (xvdivdp, xvdivsp, xvsqrtdp, xvsqrtsp)." + "EventCode": "0x3E052", + "EventName": "PM_DISP_STALL_IC_L3", + "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from the local L3." }, { "EventCode": "0x30066", @@ -215,9 +325,9 @@ "BriefDescription": "Cycles in which both instructions in the ICT entry pair show as finished. These are the cycles between finish and completion for the oldest pair of instructions in the pipeline." }, { - "EventCode": "0x40010", - "EventName": "PM_PMC3_OVERFLOW", - "BriefDescription": "The event selected for PMC3 caused the event counter to overflow." + "EventCode": "0x4C010", + "EventName": "PM_DISP_STALL_BR_MPRED_IC_L3MISS", + "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from sources beyond the local L3 after suffering a mispredicted branch." }, { "EventCode": "0x4C012", @@ -225,16 +335,36 @@ "BriefDescription": "Cycles in which the oldest instruction in the pipeline suffered an ERAT miss and waited for it resolve." }, { + "EventCode": "0x4C016", + "EventName": "PM_EXEC_STALL_DMISS_L2L3_CONFLICT", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from the local L2 or local L3, with a dispatch conflict." + }, + { "EventCode": "0x4C018", "EventName": "PM_CMPL_STALL", "BriefDescription": "Cycles in which the oldest instruction in the pipeline cannot complete because the thread was blocked for any reason." }, { + "EventCode": "0x4C01A", + "EventName": "PM_EXEC_STALL_DMISS_OFF_NODE", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was waiting for a load miss to resolve from a distant chip." + }, + { "EventCode": "0x4C01E", "EventName": "PM_LSU_ST3_FIN", "BriefDescription": "LSU Finished an internal operation in ST3 port." }, { + "EventCode": "0x4D014", + "EventName": "PM_EXEC_STALL_LOAD", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a load instruction executing in the Load Store Unit." + }, + { + "EventCode": "0x4D016", + "EventName": "PM_EXEC_STALL_PTESYNC", + "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a PTESYNC instruction executing in the Load Store Unit." + }, + { "EventCode": "0x4D018", "EventName": "PM_EXEC_STALL_BRU", "BriefDescription": "Cycles in which the oldest instruction in the pipeline was executing in the Branch unit." @@ -250,9 +380,24 @@ "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a TLBIEL instruction executing in the Load Store Unit. TLBIEL instructions have lower overhead than TLBIE instructions because they don't get set to the nest." }, { + "EventCode": "0x4D01E", + "EventName": "PM_DISP_STALL_BR_MPRED", + "BriefDescription": "Cycles when dispatch was stalled for this thread due to a mispredicted branch." + }, + { + "EventCode": "0x4E010", + "EventName": "PM_DISP_STALL_IC_L3MISS", + "BriefDescription": "Cycles when dispatch was stalled while the instruction was fetched from any source beyond the local L3." + }, + { "EventCode": "0x4E012", "EventName": "PM_EXEC_STALL_UNKNOWN", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline completed without an ntf_type pulse. The ntf_pulse was missed by the ISU because the NTF finishes and completions came too close together." + "BriefDescription": "Cycles in which the oldest instruction in the pipeline completed without an ntf_type pulse. The ntf_pulse was missed by the ISU because the next-to-finish (NTF) instruction finishes and completions came too close together." + }, + { + "EventCode": "0x4E01A", + "EventName": "PM_DISP_STALL_HELD_CYC", + "BriefDescription": "Cycles in which the next-to-complete (NTC) instruction is held at dispatch for any reason." }, { "EventCode": "0x4D020", @@ -260,24 +405,14 @@ "BriefDescription": "VSU instruction was issued to VSU pipe 3." }, { - "EventCode": "0x40132", - "EventName": "PM_MRK_LSU_FIN", - "BriefDescription": "LSU marked instruction finish." + "EventCode": "0x4003C", + "EventName": "PM_DISP_STALL_HELD_SYNC_CYC", + "BriefDescription": "Cycles in which the next-to-complete (NTC) instruction is held at dispatch because of a synchronizing instruction that requires the ICT to be empty before dispatch." }, { "EventCode": "0x45058", "EventName": "PM_IC_MISS_CMPL", - "BriefDescription": "Non-speculative icache miss, counted at completion." - }, - { - "EventCode": "0x4D050", - "EventName": "PM_VSU_NON_FLOP_CMPL", - "BriefDescription": "Non-floating point VSU instructions completed." - }, - { - "EventCode": "0x4D052", - "EventName": "PM_2FLOP_CMPL", - "BriefDescription": "Double Precision vector version of fmul, fsub, fcmp, fsel, fabs, fnabs, fres, fsqrte, fneg completed." + "BriefDescription": "Non-speculative instruction cache miss, counted at completion." }, { "EventCode": "0x400F2", --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/powerpc/power10/pmc.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/powerpc/power10/pmc.json @@ -1,22 +1,197 @@ [ { + "EventCode": "0x100FE", + "EventName": "PM_INST_CMPL", + "BriefDescription": "PowerPC instruction completed." + }, + { + "EventCode": "0x1000A", + "EventName": "PM_PMC3_REWIND", + "BriefDescription": "The speculative event selected for PMC3 rewinds and the counter for PMC3 is not charged." + }, + { + "EventCode": "0x10010", + "EventName": "PM_PMC4_OVERFLOW", + "BriefDescription": "The event selected for PMC4 caused the event counter to overflow." + }, + { + "EventCode": "0x1001C", + "EventName": "PM_ULTRAVISOR_INST_CMPL", + "BriefDescription": "PowerPC instruction completed while the thread was in ultravisor state." + }, + { + "EventCode": "0x100F0", + "EventName": "PM_CYC", + "BriefDescription": "Processor cycles." + }, + { + "EventCode": "0x10020", + "EventName": "PM_PMC4_REWIND", + "BriefDescription": "The speculative event selected for PMC4 rewinds and the counter for PMC4 is not charged." + }, + { + "EventCode": "0x10022", + "EventName": "PM_PMC2_SAVED", + "BriefDescription": "The conditions for the speculative event selected for PMC2 are met and PMC2 is charged." + }, + { + "EventCode": "0x10024", + "EventName": "PM_PMC5_OVERFLOW", + "BriefDescription": "The event selected for PMC5 caused the event counter to overflow." + }, + { + "EventCode": "0x1F15E", + "EventName": "PM_MRK_START_PROBE_NOP_CMPL", + "BriefDescription": "Marked Start probe nop (AND R0,R0,R0) completed." + }, + { + "EventCode": "0x1006C", + "EventName": "PM_RUN_CYC_ST_MODE", + "BriefDescription": "Cycles when the run latch is set and the core is in ST mode." + }, + { + "EventCode": "0x101E8", + "EventName": "PM_THRESH_EXC_256", + "BriefDescription": "Threshold counter exceeded a count of 256." + }, + { + "EventCode": "0x101EC", + "EventName": "PM_THRESH_MET", + "BriefDescription": "Threshold exceeded." + }, + { + "EventCode": "0x100FA", + "EventName": "PM_RUN_LATCH_ANY_THREAD_CYC", + "BriefDescription": "Cycles when at least one thread has the run latch set." + }, + { + "EventCode": "0x2000A", + "EventName": "PM_HYPERVISOR_CYC", + "BriefDescription": "Cycles when the thread is in Hypervisor state. MSR[S HV PR]=010." + }, + { + "EventCode": "0x2000C", + "EventName": "PM_RUN_LATCH_ALL_THREADS_CYC", + "BriefDescription": "Cycles when the run latch is set for all threads." + }, + { + "EventCode": "0x20010", + "EventName": "PM_PMC1_OVERFLOW", + "BriefDescription": "The event selected for PMC1 caused the event counter to overflow." + }, + { + "EventCode": "0x2006C", + "EventName": "PM_RUN_CYC_SMT4_MODE", + "BriefDescription": "Cycles when this thread's run latch is set and the core is in SMT4 mode." + }, + { + "EventCode": "0x201E6", + "EventName": "PM_THRESH_EXC_32", + "BriefDescription": "Threshold counter exceeded a value of 32." + }, + { + "EventCode": "0x201E8", + "EventName": "PM_THRESH_EXC_512", + "BriefDescription": "Threshold counter exceeded a value of 512." + }, + { + "EventCode": "0x200F4", + "EventName": "PM_RUN_CYC", + "BriefDescription": "Processor cycles gated by the run latch." + }, + { + "EventCode": "0x30010", + "EventName": "PM_PMC2_OVERFLOW", + "BriefDescription": "The event selected for PMC2 caused the event counter to overflow." + }, + { + "EventCode": "0x30020", + "EventName": "PM_PMC2_REWIND", + "BriefDescription": "The speculative event selected for PMC2 rewinds and the counter for PMC2 is not charged." + }, + { + "EventCode": "0x30022", + "EventName": "PM_PMC4_SAVED", + "BriefDescription": "The conditions for the speculative event selected for PMC4 are met and PMC4 is charged." + }, + { + "EventCode": "0x30024", + "EventName": "PM_PMC6_OVERFLOW", + "BriefDescription": "The event selected for PMC6 caused the event counter to overflow." + }, + { + "EventCode": "0x3006C", + "EventName": "PM_RUN_CYC_SMT2_MODE", + "BriefDescription": "Cycles when this thread's run latch is set and the core is in SMT2 mode." + }, + { "EventCode": "0x301E8", "EventName": "PM_THRESH_EXC_64", "BriefDescription": "Threshold counter exceeded a value of 64." }, { - "EventCode": "0x45050", - "EventName": "PM_1FLOP_CMPL", - "BriefDescription": "One floating point instruction completed (fadd, fmul, fsub, fcmp, fsel, fabs, fnabs, fres, fsqrte, fneg)." + "EventCode": "0x301EA", + "EventName": "PM_THRESH_EXC_1024", + "BriefDescription": "Threshold counter exceeded a value of 1024." + }, + { + "EventCode": "0x40010", + "EventName": "PM_PMC3_OVERFLOW", + "BriefDescription": "The event selected for PMC3 caused the event counter to overflow." + }, + { + "EventCode": "0x40114", + "EventName": "PM_MRK_START_PROBE_NOP_DISP", + "BriefDescription": "Marked Start probe nop dispatched. Instruction AND R0,R0,R0." + }, + { + "EventCode": "0x4D010", + "EventName": "PM_PMC1_SAVED", + "BriefDescription": "The conditions for the speculative event selected for PMC1 are met and PMC1 is charged." + }, + { + "EventCode": "0x4D012", + "EventName": "PM_PMC3_SAVED", + "BriefDescription": "The conditions for the speculative event selected for PMC3 are met and PMC3 is charged." + }, + { + "EventCode": "0x4D022", + "EventName": "PM_HYPERVISOR_INST_CMPL", + "BriefDescription": "PowerPC instruction completed while the thread was in hypervisor state." + }, + { + "EventCode": "0x4D026", + "EventName": "PM_ULTRAVISOR_CYC", + "BriefDescription": "Cycles when the thread is in Ultravisor state. MSR[S HV PR]=110." + }, + { + "EventCode": "0x4D028", + "EventName": "PM_PRIVILEGED_CYC", + "BriefDescription": "Cycles when the thread is in Privileged state. MSR[S HV PR]=x00." + }, + { + "EventCode": "0x4D02C", + "EventName": "PM_PMC1_REWIND", + "BriefDescription": "The speculative event selected for PMC1 rewinds and the counter for PMC1 is not charged." + }, + { + "EventCode": "0x40030", + "EventName": "PM_INST_FIN", + "BriefDescription": "Instruction finished." + }, + { + "EventCode": "0x40134", + "EventName": "PM_MRK_INST_TIMEO", + "BriefDescription": "Marked instruction finish timeout (instruction was lost)." }, { - "EventCode": "0x45052", - "EventName": "PM_4FLOP_CMPL", - "BriefDescription": "Four floating point instructions completed (fadd, fmul, fsub, fcmp, fsel, fabs, fnabs, fres, fsqrte, fneg)." + "EventCode": "0x401EA", + "EventName": "PM_THRESH_EXC_128", + "BriefDescription": "Threshold counter exceeded a value of 128." }, { - "EventCode": "0x4D054", - "EventName": "PM_8FLOP_CMPL", - "BriefDescription": "Four Double Precision vector instructions completed." + "EventCode": "0x500FA", + "EventName": "PM_RUN_INST_CMPL", + "BriefDescription": "PowerPC instruction completed while the run latch is set." } ] --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/powerpc/power10/translation.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/powerpc/power10/translation.json @@ -1,35 +1,10 @@ [ { - "EventCode": "0x1F15E", - "EventName": "PM_MRK_START_PROBE_NOP_CMPL", - "BriefDescription": "Marked Start probe nop (AND R0,R0,R0) completed." - }, - { - "EventCode": "0x20016", - "EventName": "PM_ST_FIN", - "BriefDescription": "Store finish count. Includes speculative activity." - }, - { "EventCode": "0x20018", "EventName": "PM_ST_FWD", "BriefDescription": "Store forwards that finished." }, { - "EventCode": "0x2011C", - "EventName": "PM_MRK_NTF_CYC", - "BriefDescription": "Cycles during which the marked instruction is the oldest in the pipeline (NTF or NTC)." - }, - { - "EventCode": "0x2E01C", - "EventName": "PM_EXEC_STALL_TLBIE", - "BriefDescription": "Cycles in which the oldest instruction in the pipeline was a TLBIE instruction executing in the Load Store Unit." - }, - { - "EventCode": "0x201E6", - "EventName": "PM_THRESH_EXC_32", - "BriefDescription": "Threshold counter exceeded a value of 32." - }, - { "EventCode": "0x200F0", "EventName": "PM_ST_CMPL", "BriefDescription": "Stores completed from S2Q (2nd-level store queue). This event includes regular stores, stcx and cache inhibited stores. The following operations are excluded (pteupdate, snoop tlbie complete, store atomics, miso, load atomic payloads, tlbie, tlbsync, slbieg, isync, msgsnd, slbiag, cpabort, copy, tcheck, tend, stsync, dcbst, icbi, dcbf, hwsync, lwsync, ptesync, eieio, msgsync)." @@ -37,21 +12,6 @@ { "EventCode": "0x200FE", "EventName": "PM_DATA_FROM_L2MISS", - "BriefDescription": "The processor's data cache was reloaded from a source other than the local core's L1 or L2 due to a demand miss." - }, - { - "EventCode": "0x30010", - "EventName": "PM_PMC2_OVERFLOW", - "BriefDescription": "The event selected for PMC2 caused the event counter to overflow." - }, - { - "EventCode": "0x4D010", - "EventName": "PM_PMC1_SAVED", - "BriefDescription": "The conditions for the speculative event selected for PMC1 are met and PMC1 is charged." - }, - { - "EventCode": "0x4D05C", - "EventName": "PM_DPP_FLOP_CMPL", - "BriefDescription": "Double-Precision or Quad-Precision instructions completed." + "BriefDescription": "The processor's L1 data cache was reloaded from a source beyond the local core's L2 due to a demand miss." } ] --- linux-azure-6.5.0.orig/tools/perf/pmu-events/arch/x86/broadwellde/bdwde-metrics.json +++ linux-azure-6.5.0/tools/perf/pmu-events/arch/x86/broadwellde/bdwde-metrics.json @@ -49,6 +49,12 @@ "ScaleUnit": "100%" }, { + "BriefDescription": "Uncore frequency per die [GHZ]", + "MetricExpr": "tma_info_system_socket_clks / #num_dies / duration_time / 1e9", + "MetricGroup": "SoC", + "MetricName": "UNCORE_FREQ" + }, + { "BriefDescription": "Percentage of cycles spent in System Management Interrupts.", "MetricExpr": "((msr@aperf@ - cycles) / msr@aperf@ if msr@smi@ > 0 else 0)", "MetricGroup": "smi", @@ -652,7 +658,7 @@ }, { "BriefDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]", - "MetricExpr": "64 * (arb@event\\=0x81\\,umask\\=0x1@ + arb@event\\=0x84\\,umask\\=0x1@) / 1e6 / duration_time / 1e3", + "MetricExpr": "64 * (UNC_M_CAS_COUNT.RD + UNC_M_CAS_COUNT.WR) / 1e9 / duration_time", "MetricGroup": "HPC;Mem;MemoryBW;SoC;tma_issueBW", "MetricName": "tma_info_system_dram_bw_use", "PublicDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]. Related metrics: tma_fb_full, tma_mem_bandwidth, tma_sq_full" @@ -691,6 +697,12 @@ "MetricName": "tma_info_system_smt_2t_utilization" }, { + "BriefDescription": "Socket actual clocks when any core is active on that socket", + "MetricExpr": "cbox_0@event\\=0x0@", + "MetricGroup": "SoC", + "MetricName": "tma_info_system_socket_clks" + }, + { "BriefDescription": "Average Frequency Utilization relative nominal frequency", "MetricExpr": "tma_info_thread_clks / CPU_CLK_UNHALTED.REF_TSC", "MetricGroup": "Power", --- linux-azure-6.5.0.orig/tools/perf/pmu-events/jevents.py +++ linux-azure-6.5.0/tools/perf/pmu-events/jevents.py @@ -999,7 +999,7 @@ _args = ap.parse_args() _args.output_file.write(""" -#include "pmu-events/pmu-events.h" +#include #include "util/header.h" #include "util/pmu.h" #include --- linux-azure-6.5.0.orig/tools/perf/tests/dlfilter-test.c +++ linux-azure-6.5.0/tools/perf/tests/dlfilter-test.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 /* * Test dlfilter C API. A perf.data file is synthesized and then processed - * by perf script with a dlfilter named dlfilter-test-api-v0.so. Also a C file + * by perf script with dlfilters named dlfilter-test-api-v*.so. Also a C file * is compiled to provide a dso to match the synthesized perf.data file. */ @@ -37,6 +37,8 @@ #define MAP_START 0x400000 +#define DLFILTER_TEST_NAME_MAX 128 + struct test_data { struct perf_tool tool; struct machine *machine; @@ -45,6 +47,8 @@ u64 bar; u64 ip; u64 addr; + char name[DLFILTER_TEST_NAME_MAX]; + char desc[DLFILTER_TEST_NAME_MAX]; char perf[PATH_MAX]; char perf_data_file_name[PATH_MAX]; char c_file_name[PATH_MAX]; @@ -215,7 +219,7 @@ return err ? -1 : 0; } -static int get_dlfilters_path(char *buf, size_t sz) +static int get_dlfilters_path(const char *name, char *buf, size_t sz) { char perf[PATH_MAX]; char path[PATH_MAX]; @@ -224,12 +228,12 @@ perf_exe(perf, sizeof(perf)); perf_path = dirname(perf); - snprintf(path, sizeof(path), "%s/dlfilters/dlfilter-test-api-v0.so", perf_path); + snprintf(path, sizeof(path), "%s/dlfilters/%s", perf_path, name); if (access(path, R_OK)) { exec_path = get_argv_exec_path(); if (!exec_path) return -1; - snprintf(path, sizeof(path), "%s/dlfilters/dlfilter-test-api-v0.so", exec_path); + snprintf(path, sizeof(path), "%s/dlfilters/%s", exec_path, name); free(exec_path); if (access(path, R_OK)) return -1; @@ -244,9 +248,9 @@ char *desc = NULL; int ret; - if (get_filter_desc(td->dlfilters, "dlfilter-test-api-v0.so", &desc, &long_desc) && + if (get_filter_desc(td->dlfilters, td->name, &desc, &long_desc) && long_desc && !strcmp(long_desc, "Filter used by the 'dlfilter C API' perf test") && - desc && !strcmp(desc, "dlfilter to test v0 C API")) + desc && !strcmp(desc, td->desc)) ret = 0; else ret = -1; @@ -284,7 +288,7 @@ static int do_run_perf_script(struct test_data *td, int do_early) { return system_cmd("%s script -i %s " - "--dlfilter %s/dlfilter-test-api-v0.so " + "--dlfilter %s/%s " "--dlarg first " "--dlarg %d " "--dlarg %" PRIu64 " " @@ -292,7 +296,7 @@ "--dlarg %d " "--dlarg last", td->perf, td->perf_data_file_name, td->dlfilters, - verbose, td->ip, td->addr, do_early); + td->name, verbose, td->ip, td->addr, do_early); } static int run_perf_script(struct test_data *td) @@ -321,7 +325,7 @@ u64 id = 99; int err; - if (get_dlfilters_path(td->dlfilters, PATH_MAX)) + if (get_dlfilters_path(td->name, td->dlfilters, PATH_MAX)) return test_result("dlfilters not found", TEST_SKIP); if (check_filter_desc(td)) @@ -399,14 +403,18 @@ } } -static int test__dlfilter(struct test_suite *test __maybe_unused, int subtest __maybe_unused) +static int test__dlfilter_ver(int ver) { struct test_data td = {.fd = -1}; int pid = getpid(); int err; + pr_debug("\n-- Testing version %d API --\n", ver); + perf_exe(td.perf, sizeof(td.perf)); + snprintf(td.name, sizeof(td.name), "dlfilter-test-api-v%d.so", ver); + snprintf(td.desc, sizeof(td.desc), "dlfilter to test v%d C API", ver); snprintf(td.perf_data_file_name, PATH_MAX, "/tmp/dlfilter-test-%u-perf-data", pid); snprintf(td.c_file_name, PATH_MAX, "/tmp/dlfilter-test-%u-prog.c", pid); snprintf(td.prog_file_name, PATH_MAX, "/tmp/dlfilter-test-%u-prog", pid); @@ -416,4 +424,14 @@ return err; } +static int test__dlfilter(struct test_suite *test __maybe_unused, int subtest __maybe_unused) +{ + int err = test__dlfilter_ver(0); + + if (err) + return err; + /* No test for version 1 */ + return test__dlfilter_ver(2); +} + DEFINE_SUITE("dlfilter C API", dlfilter); --- linux-azure-6.5.0.orig/tools/perf/tests/pmu-events.c +++ linux-azure-6.5.0/tools/perf/tests/pmu-events.c @@ -508,7 +508,7 @@ } /* Verify aliases are as expected */ -static int __test_core_pmu_event_aliases(char *pmu_name, int *count) +static int __test_core_pmu_event_aliases(const char *pmu_name, int *count) { struct perf_pmu_test_event const **test_event_table; struct perf_pmu *pmu; @@ -635,7 +635,7 @@ static struct perf_pmu_test_pmu test_pmus[] = { { .pmu = { - .name = (char *)"hisi_sccl1_ddrc2", + .name = "hisi_sccl1_ddrc2", .is_uncore = 1, }, .aliases = { @@ -644,7 +644,7 @@ }, { .pmu = { - .name = (char *)"uncore_cbox_0", + .name = "uncore_cbox_0", .is_uncore = 1, }, .aliases = { @@ -655,7 +655,7 @@ }, { .pmu = { - .name = (char *)"hisi_sccl3_l3c7", + .name = "hisi_sccl3_l3c7", .is_uncore = 1, }, .aliases = { @@ -664,7 +664,7 @@ }, { .pmu = { - .name = (char *)"uncore_imc_free_running_0", + .name = "uncore_imc_free_running_0", .is_uncore = 1, }, .aliases = { @@ -673,7 +673,7 @@ }, { .pmu = { - .name = (char *)"uncore_imc_0", + .name = "uncore_imc_0", .is_uncore = 1, }, .aliases = { @@ -682,7 +682,7 @@ }, { .pmu = { - .name = (char *)"uncore_sys_ddr_pmu0", + .name = "uncore_sys_ddr_pmu0", .is_uncore = 1, .id = (char *)"v8", }, @@ -692,7 +692,7 @@ }, { .pmu = { - .name = (char *)"uncore_sys_ccn_pmu4", + .name = "uncore_sys_ccn_pmu4", .is_uncore = 1, .id = (char *)"0x01", }, --- linux-azure-6.5.0.orig/tools/perf/tests/shell/stat_bpf_counters.sh +++ linux-azure-6.5.0/tools/perf/tests/shell/stat_bpf_counters.sh @@ -22,10 +22,10 @@ } # skip if --bpf-counters is not supported -if ! perf stat --bpf-counters true > /dev/null 2>&1; then +if ! perf stat -e cycles --bpf-counters true > /dev/null 2>&1; then if [ "$1" = "-v" ]; then echo "Skipping: --bpf-counters not supported" - perf --no-pager stat --bpf-counters true || true + perf --no-pager stat -e cycles --bpf-counters true || true fi exit 2 fi --- linux-azure-6.5.0.orig/tools/perf/tests/shell/stat_bpf_counters_cgrp.sh +++ linux-azure-6.5.0/tools/perf/tests/shell/stat_bpf_counters_cgrp.sh @@ -25,22 +25,22 @@ find_cgroups() { # try usual systemd slices first - if [ -d /sys/fs/cgroup/system.slice -a -d /sys/fs/cgroup/user.slice ]; then + if [ -d /sys/fs/cgroup/system.slice ] && [ -d /sys/fs/cgroup/user.slice ]; then test_cgroups="system.slice,user.slice" return fi # try root and self cgroups - local self_cgrp=$(grep perf_event /proc/self/cgroup | cut -d: -f3) - if [ -z ${self_cgrp} ]; then + find_cgroups_self_cgrp=$(grep perf_event /proc/self/cgroup | cut -d: -f3) + if [ -z ${find_cgroups_self_cgrp} ]; then # cgroup v2 doesn't specify perf_event - self_cgrp=$(grep ^0: /proc/self/cgroup | cut -d: -f3) + find_cgroups_self_cgrp=$(grep ^0: /proc/self/cgroup | cut -d: -f3) fi - if [ -z ${self_cgrp} ]; then + if [ -z ${find_cgroups_self_cgrp} ]; then test_cgroups="/" else - test_cgroups="/,${self_cgrp}" + test_cgroups="/,${find_cgroups_self_cgrp}" fi } @@ -48,13 +48,11 @@ # Just check if it runs without failure and has non-zero results. check_system_wide_counted() { - local output - - output=$(perf stat -a --bpf-counters --for-each-cgroup ${test_cgroups} -e cpu-clock -x, sleep 1 2>&1) - if echo ${output} | grep -q -F "&1) + if echo ${check_system_wide_counted_output} | grep -q -F "&1) - if echo ${output} | grep -q -F "&1) + if echo ${check_cpu_list_counted_output} | grep -q -F "has_children; } -static bool hist_browser__he_selection_unfolded(struct hist_browser *browser) -{ - return browser->he_selection ? browser->he_selection->unfolded : false; -} - static bool hist_browser__selection_unfolded(struct hist_browser *browser) { struct hist_entry *he = browser->he_selection; @@ -584,8 +579,8 @@ return n; } -static void __hist_entry__set_folding(struct hist_entry *he, - struct hist_browser *hb, bool unfold) +static void hist_entry__set_folding(struct hist_entry *he, + struct hist_browser *hb, bool unfold) { hist_entry__init_have_children(he); he->unfolded = unfold ? he->has_children : false; @@ -603,34 +598,12 @@ he->nr_rows = 0; } -static void hist_entry__set_folding(struct hist_entry *he, - struct hist_browser *browser, bool unfold) -{ - double percent; - - percent = hist_entry__get_percent_limit(he); - if (he->filtered || percent < browser->min_pcnt) - return; - - __hist_entry__set_folding(he, browser, unfold); - - if (!he->depth || unfold) - browser->nr_hierarchy_entries++; - if (he->leaf) - browser->nr_callchain_rows += he->nr_rows; - else if (unfold && !hist_entry__has_hierarchy_children(he, browser->min_pcnt)) { - browser->nr_hierarchy_entries++; - he->has_no_entry = true; - he->nr_rows = 1; - } else - he->has_no_entry = false; -} - static void __hist_browser__set_folding(struct hist_browser *browser, bool unfold) { struct rb_node *nd; struct hist_entry *he; + double percent; nd = rb_first_cached(&browser->hists->entries); while (nd) { @@ -640,6 +613,21 @@ nd = __rb_hierarchy_next(nd, HMD_FORCE_CHILD); hist_entry__set_folding(he, browser, unfold); + + percent = hist_entry__get_percent_limit(he); + if (he->filtered || percent < browser->min_pcnt) + continue; + + if (!he->depth || unfold) + browser->nr_hierarchy_entries++; + if (he->leaf) + browser->nr_callchain_rows += he->nr_rows; + else if (unfold && !hist_entry__has_hierarchy_children(he, browser->min_pcnt)) { + browser->nr_hierarchy_entries++; + he->has_no_entry = true; + he->nr_rows = 1; + } else + he->has_no_entry = false; } } @@ -659,8 +647,10 @@ if (!browser->he_selection) return; - hist_entry__set_folding(browser->he_selection, browser, unfold); - browser->b.nr_entries = hist_browser__nr_entries(browser); + if (unfold == browser->he_selection->unfolded) + return; + + hist_browser__toggle_fold(browser); } static void ui_browser__warn_lost_events(struct ui_browser *browser) @@ -732,8 +722,8 @@ hist_browser__set_folding(browser, true); break; case 'e': - /* Expand the selected entry. */ - hist_browser__set_folding_selected(browser, !hist_browser__he_selection_unfolded(browser)); + /* Toggle expand/collapse the selected entry. */ + hist_browser__toggle_fold(browser); break; case 'H': browser->show_headers = !browser->show_headers; @@ -1779,7 +1769,7 @@ hists_browser__scnprintf_hierarchy_headers(browser, headers, sizeof(headers)); - ui_browser__gotorc(&browser->b, 0, 0); + ui_browser__gotorc_title(&browser->b, 0, 0); ui_browser__set_color(&browser->b, HE_COLORSET_ROOT); ui_browser__write_nstring(&browser->b, headers, browser->b.width + 1); } --- linux-azure-6.5.0.orig/tools/perf/util/Build +++ linux-azure-6.5.0/tools/perf/util/Build @@ -301,6 +301,12 @@ else bison_flags += -w endif + +BISON_LT_381 := $(shell expr $(shell $(BISON) --version | grep bison | sed -e 's/.\+ \([0-9]\+\).\([0-9]\+\).\([0-9]\+\)/\1\2\3/g') \< 381) +ifeq ($(BISON_LT_381),1) + bison_flags += -DYYNOMEM=YYABORT +endif + CFLAGS_parse-events-bison.o += $(bison_flags) CFLAGS_pmu-bison.o += -DYYLTYPE_IS_TRIVIAL=0 $(bison_flags) CFLAGS_expr-bison.o += -DYYLTYPE_IS_TRIVIAL=0 $(bison_flags) --- linux-azure-6.5.0.orig/tools/perf/util/annotate.c +++ linux-azure-6.5.0/tools/perf/util/annotate.c @@ -1846,8 +1846,11 @@ perf_exe(tpath, sizeof(tpath)); bfdf = bfd_openr(tpath, NULL); - assert(bfdf); - assert(bfd_check_format(bfdf, bfd_object)); + if (bfdf == NULL) + abort(); + + if (!bfd_check_format(bfdf, bfd_object)) + abort(); s = open_memstream(&buf, &buf_size); if (!s) { @@ -1895,7 +1898,8 @@ #else disassemble = disassembler(bfdf); #endif - assert(disassemble); + if (disassemble == NULL) + abort(); fflush(s); do { --- linux-azure-6.5.0.orig/tools/perf/util/bpf-filter.c +++ linux-azure-6.5.0/tools/perf/util/bpf-filter.c @@ -9,8 +9,8 @@ #include "util/evsel.h" #include "util/bpf-filter.h" -#include "util/bpf-filter-flex.h" -#include "util/bpf-filter-bison.h" +#include +#include #include "bpf_skel/sample-filter.h" #include "bpf_skel/sample_filter.skel.h" @@ -62,6 +62,16 @@ if (evsel->core.attr.sample_type & expr->sample_flags) return 0; + if (expr->op == PBF_OP_GROUP_BEGIN) { + struct perf_bpf_filter_expr *group; + + list_for_each_entry(group, &expr->groups, list) { + if (check_sample_flags(evsel, group) < 0) + return -1; + } + return 0; + } + info = get_sample_info(expr->sample_flags); if (info == NULL) { pr_err("Error: %s event does not have sample flags %lx\n", --- linux-azure-6.5.0.orig/tools/perf/util/bpf_off_cpu.c +++ linux-azure-6.5.0/tools/perf/util/bpf_off_cpu.c @@ -98,7 +98,7 @@ /* v5.18 kernel added prev_state arg, so it needs to check the signature */ static void check_sched_switch_args(void) { - const struct btf *btf = bpf_object__btf(skel->obj); + const struct btf *btf = btf__load_vmlinux_btf(); const struct btf_type *t1, *t2, *t3; u32 type_id; @@ -116,7 +116,8 @@ return; t3 = btf__type_by_id(btf, t2->type); - if (t3 && btf_is_func_proto(t3) && btf_vlen(t3) == 4) { + /* btf_trace func proto has one more argument for the context */ + if (t3 && btf_is_func_proto(t3) && btf_vlen(t3) == 5) { /* new format: pass prev_state as 4th arg */ skel->rodata->has_prev_state = true; } --- linux-azure-6.5.0.orig/tools/perf/util/dlfilter.c +++ linux-azure-6.5.0/tools/perf/util/dlfilter.c @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include "debug.h" #include "event.h" @@ -63,6 +65,7 @@ d_al->addr = al->addr; d_al->comm = NULL; d_al->filtered = 0; + d_al->priv = NULL; } static struct addr_location *get_al(struct dlfilter *d) @@ -151,6 +154,11 @@ return d->dlargv; } +static bool has_priv(struct perf_dlfilter_al *d_al_p) +{ + return d_al_p->size >= offsetof(struct perf_dlfilter_al, priv) + sizeof(d_al_p->priv); +} + static __s32 dlfilter__resolve_address(void *ctx, __u64 address, struct perf_dlfilter_al *d_al_p) { struct dlfilter *d = (struct dlfilter *)ctx; @@ -166,6 +174,7 @@ if (!thread) return -1; + addr_location__init(&al); thread__find_symbol_fb(thread, d->sample->cpumode, address, &al); al_to_d_al(&al, &d_al); @@ -176,9 +185,29 @@ memcpy(d_al_p, &d_al, min((size_t)sz, sizeof(d_al))); d_al_p->size = sz; + if (has_priv(d_al_p)) + d_al_p->priv = memdup(&al, sizeof(al)); + return 0; } +static void dlfilter__al_cleanup(void *ctx __maybe_unused, struct perf_dlfilter_al *d_al_p) +{ + struct addr_location *al; + + /* Ensure backward compatibility */ + if (!has_priv(d_al_p) || !d_al_p->priv) + return; + + al = d_al_p->priv; + + d_al_p->priv = NULL; + + addr_location__exit(al); + + free(al); +} + static const __u8 *dlfilter__insn(void *ctx, __u32 *len) { struct dlfilter *d = (struct dlfilter *)ctx; @@ -251,13 +280,21 @@ return &d->evsel->core.attr; } +static __s32 code_read(__u64 ip, struct map *map, struct machine *machine, void *buf, __u32 len) +{ + u64 offset = map__map_ip(map, ip); + + if (ip + len >= map__end(map)) + len = map__end(map) - ip; + + return dso__data_read_offset(map__dso(map), machine, offset, buf, len); +} + static __s32 dlfilter__object_code(void *ctx, __u64 ip, void *buf, __u32 len) { struct dlfilter *d = (struct dlfilter *)ctx; struct addr_location *al; struct addr_location a; - struct map *map; - u64 offset; __s32 ret; if (!d->ctx_valid) @@ -267,27 +304,17 @@ if (!al) return -1; - map = al->map; - - if (map && ip >= map__start(map) && ip < map__end(map) && + if (al->map && ip >= map__start(al->map) && ip < map__end(al->map) && machine__kernel_ip(d->machine, ip) == machine__kernel_ip(d->machine, d->sample->ip)) - goto have_map; + return code_read(ip, al->map, d->machine, buf, len); addr_location__init(&a); + thread__find_map_fb(al->thread, d->sample->cpumode, ip, &a); - if (!a.map) { - ret = -1; - goto out; - } + ret = a.map ? code_read(ip, a.map, d->machine, buf, len) : -1; - map = a.map; -have_map: - offset = map__map_ip(map, ip); - if (ip + len >= map__end(map)) - len = map__end(map) - ip; - ret = dso__data_read_offset(map__dso(map), d->machine, offset, buf, len); -out: addr_location__exit(&a); + return ret; } @@ -296,6 +323,7 @@ .resolve_addr = dlfilter__resolve_addr, .args = dlfilter__args, .resolve_address = dlfilter__resolve_address, + .al_cleanup = dlfilter__al_cleanup, .insn = dlfilter__insn, .srcline = dlfilter__srcline, .attr = dlfilter__attr, --- linux-azure-6.5.0.orig/tools/perf/util/env.c +++ linux-azure-6.5.0/tools/perf/util/env.c @@ -324,11 +324,9 @@ u32 pmu_num = 0; struct strbuf sb; - while ((pmu = perf_pmus__scan(pmu))) { - if (!pmu->name) - continue; + while ((pmu = perf_pmus__scan(pmu))) pmu_num++; - } + if (!pmu_num) { pr_debug("pmu mappings not available\n"); return -ENOENT; @@ -339,8 +337,6 @@ return -ENOMEM; while ((pmu = perf_pmus__scan(pmu))) { - if (!pmu->name) - continue; if (strbuf_addf(&sb, "%u:%s", pmu->type, pmu->name) < 0) goto error; /* include a NULL character at the end */ --- linux-azure-6.5.0.orig/tools/perf/util/evlist.c +++ linux-azure-6.5.0/tools/perf/util/evlist.c @@ -251,6 +251,9 @@ .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_DUMMY, .size = sizeof(attr), /* to capture ABI version */ + /* Avoid frequency mode for dummy events to avoid associated timers. */ + .freq = 0, + .sample_period = 1, }; return evsel__new_idx(&attr, evlist->core.nr_entries); @@ -277,8 +280,6 @@ evsel->core.attr.exclude_kernel = 1; evsel->core.attr.exclude_guest = 1; evsel->core.attr.exclude_hv = 1; - evsel->core.attr.freq = 0; - evsel->core.attr.sample_period = 1; evsel->core.system_wide = system_wide; evsel->no_aux_samples = true; evsel->name = strdup("dummy:u"); --- linux-azure-6.5.0.orig/tools/perf/util/expr.c +++ linux-azure-6.5.0/tools/perf/util/expr.c @@ -10,8 +10,8 @@ #include "debug.h" #include "evlist.h" #include "expr.h" -#include "expr-bison.h" -#include "expr-flex.h" +#include +#include #include "util/hashmap.h" #include "smt.h" #include "tsc.h" --- linux-azure-6.5.0.orig/tools/perf/util/header.c +++ linux-azure-6.5.0/tools/perf/util/header.c @@ -746,20 +746,14 @@ * Do a first pass to count number of pmu to avoid lseek so this * works in pipe mode as well. */ - while ((pmu = perf_pmus__scan(pmu))) { - if (!pmu->name) - continue; + while ((pmu = perf_pmus__scan(pmu))) pmu_num++; - } ret = do_write(ff, &pmu_num, sizeof(pmu_num)); if (ret < 0) return ret; while ((pmu = perf_pmus__scan(pmu))) { - if (!pmu->name) - continue; - ret = do_write(ff, &pmu->type, sizeof(pmu->type)); if (ret < 0) return ret; @@ -1605,8 +1599,15 @@ int ret; while ((pmu = perf_pmus__scan(pmu))) { - if (!pmu->name || !strcmp(pmu->name, "cpu") || - perf_pmu__caps_parse(pmu) <= 0) + if (!strcmp(pmu->name, "cpu")) { + /* + * The "cpu" PMU is special and covered by + * HEADER_CPU_PMU_CAPS. Note, core PMUs are + * counted/written here for ARM, s390 and Intel hybrid. + */ + continue; + } + if (perf_pmu__caps_parse(pmu) <= 0) continue; nr_pmu++; } @@ -1619,23 +1620,17 @@ return 0; /* - * Write hybrid pmu caps first to maintain compatibility with - * older perf tool. + * Note older perf tools assume core PMUs come first, this is a property + * of perf_pmus__scan. */ - if (perf_pmus__num_core_pmus() > 1) { - pmu = NULL; - while ((pmu = perf_pmus__scan_core(pmu))) { - ret = __write_pmu_caps(ff, pmu, true); - if (ret < 0) - return ret; - } - } - pmu = NULL; while ((pmu = perf_pmus__scan(pmu))) { - if (pmu->is_core || !pmu->nr_caps) + if (!strcmp(pmu->name, "cpu")) { + /* Skip as above. */ + continue; + } + if (perf_pmu__caps_parse(pmu) <= 0) continue; - ret = __write_pmu_caps(ff, pmu, true); if (ret < 0) return ret; @@ -4381,7 +4376,8 @@ union perf_event *event, struct evlist **pevlist) { - u32 i, ids, n_ids; + u32 i, n_ids; + u64 *ids; struct evsel *evsel; struct evlist *evlist = *pevlist; @@ -4397,9 +4393,8 @@ evlist__add(evlist, evsel); - ids = event->header.size; - ids -= (void *)&event->attr.id - (void *)event; - n_ids = ids / sizeof(u64); + n_ids = event->header.size - sizeof(event->header) - event->attr.attr.size; + n_ids = n_ids / sizeof(u64); /* * We don't have the cpu and thread maps on the header, so * for allocating the perf_sample_id table we fake 1 cpu and @@ -4408,8 +4403,9 @@ if (perf_evsel__alloc_id(&evsel->core, 1, n_ids)) return -ENOMEM; + ids = (void *)&event->attr.attr + event->attr.attr.size; for (i = 0; i < n_ids; i++) { - perf_evlist__id_add(&evlist->core, &evsel->core, 0, i, event->attr.id[i]); + perf_evlist__id_add(&evlist->core, &evsel->core, 0, i, ids[i]); } return 0; --- linux-azure-6.5.0.orig/tools/perf/util/hist.c +++ linux-azure-6.5.0/tools/perf/util/hist.c @@ -2676,8 +2676,6 @@ /* If we have branch cycles always annotate them. */ if (bs && bs->nr && entries[0].flags.cycles) { - int i; - bi = sample__resolve_bstack(sample, al); if (bi) { struct addr_map_symbol *prev = NULL; @@ -2692,7 +2690,7 @@ * Note that perf stores branches reversed from * program order! */ - for (i = bs->nr - 1; i >= 0; i--) { + for (int i = bs->nr - 1; i >= 0; i--) { addr_map_symbol__account_cycles(&bi[i].from, nonany_branch_mode ? NULL : prev, bi[i].flags.cycles); @@ -2701,6 +2699,12 @@ if (total_cycles) *total_cycles += bi[i].flags.cycles; } + for (unsigned int i = 0; i < bs->nr; i++) { + map__put(bi[i].to.ms.map); + maps__put(bi[i].to.ms.maps); + map__put(bi[i].from.ms.map); + maps__put(bi[i].from.ms.maps); + } free(bi); } } --- linux-azure-6.5.0.orig/tools/perf/util/intel-pt.c +++ linux-azure-6.5.0/tools/perf/util/intel-pt.c @@ -1512,9 +1512,11 @@ } else if (ptq->state->flags & INTEL_PT_ASYNC) { if (!ptq->state->to_ip) ptq->flags = PERF_IP_FLAG_BRANCH | + PERF_IP_FLAG_ASYNC | PERF_IP_FLAG_TRACE_END; else if (ptq->state->from_nr && !ptq->state->to_nr) ptq->flags = PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | + PERF_IP_FLAG_ASYNC | PERF_IP_FLAG_VMEXIT; else ptq->flags = PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_CALL | --- linux-azure-6.5.0.orig/tools/perf/util/machine.c +++ linux-azure-6.5.0/tools/perf/util/machine.c @@ -2622,16 +2622,18 @@ save_lbr_cursor_node(thread, cursor, i); } - /* Add LBR ip from first entries.to */ - ip = entries[0].to; - flags = &entries[0].flags; - *branch_from = entries[0].from; - err = add_callchain_ip(thread, cursor, parent, - root_al, &cpumode, ip, - true, flags, NULL, - *branch_from); - if (err) - return err; + if (lbr_nr > 0) { + /* Add LBR ip from first entries.to */ + ip = entries[0].to; + flags = &entries[0].flags; + *branch_from = entries[0].from; + err = add_callchain_ip(thread, cursor, parent, + root_al, &cpumode, ip, + true, flags, NULL, + *branch_from); + if (err) + return err; + } return 0; } --- linux-azure-6.5.0.orig/tools/perf/util/mem-events.c +++ linux-azure-6.5.0/tools/perf/util/mem-events.c @@ -37,7 +37,7 @@ return &perf_mem_events[i]; } -char * __weak perf_mem_events__name(int i, char *pmu_name __maybe_unused) +const char * __weak perf_mem_events__name(int i, const char *pmu_name __maybe_unused) { struct perf_mem_event *e = perf_mem_events__ptr(i); @@ -53,7 +53,7 @@ return mem_loads_name; } - return (char *)e->name; + return e->name; } __weak bool is_mem_loads_aux_event(struct evsel *leader __maybe_unused) @@ -185,8 +185,6 @@ { int i = *argv_nr, k = 0; struct perf_mem_event *e; - struct perf_pmu *pmu; - char *s; for (int j = 0; j < PERF_MEM_EVENTS__MAX; j++) { e = perf_mem_events__ptr(j); @@ -203,21 +201,24 @@ rec_argv[i++] = "-e"; rec_argv[i++] = perf_mem_events__name(j, NULL); } else { + struct perf_pmu *pmu = NULL; + if (!e->supported) { perf_mem_events__print_unsupport_hybrid(e, j); return -1; } while ((pmu = perf_pmus__scan(pmu)) != NULL) { + const char *s = perf_mem_events__name(j, pmu->name); + rec_argv[i++] = "-e"; - s = perf_mem_events__name(j, pmu->name); if (s) { - s = strdup(s); - if (!s) + char *copy = strdup(s); + if (!copy) return -1; - rec_argv[i++] = s; - rec_tmp[k++] = s; + rec_argv[i++] = copy; + rec_tmp[k++] = copy; } } } --- linux-azure-6.5.0.orig/tools/perf/util/mem-events.h +++ linux-azure-6.5.0/tools/perf/util/mem-events.h @@ -38,7 +38,7 @@ int perf_mem_events__parse(const char *str); int perf_mem_events__init(void); -char *perf_mem_events__name(int i, char *pmu_name); +const char *perf_mem_events__name(int i, const char *pmu_name); struct perf_mem_event *perf_mem_events__ptr(int i); bool is_mem_loads_aux_event(struct evsel *leader); --- linux-azure-6.5.0.orig/tools/perf/util/metricgroup.c +++ linux-azure-6.5.0/tools/perf/util/metricgroup.c @@ -225,7 +225,7 @@ m->pmu = pm->pmu ?: "cpu"; m->metric_name = pm->metric_name; - m->default_metricgroup_name = pm->default_metricgroup_name; + m->default_metricgroup_name = pm->default_metricgroup_name ?: ""; m->modifier = NULL; if (modifier) { m->modifier = strdup(modifier); --- linux-azure-6.5.0.orig/tools/perf/util/parse-events.c +++ linux-azure-6.5.0/tools/perf/util/parse-events.c @@ -18,8 +18,8 @@ #include "debug.h" #include #include -#include "parse-events-bison.h" -#include "parse-events-flex.h" +#include +#include #include "pmu.h" #include "pmus.h" #include "asm/bug.h" @@ -271,7 +271,7 @@ evsel->core.is_pmu_core = pmu ? pmu->is_core : false; evsel->auto_merge_stats = auto_merge_stats; evsel->pmu = pmu; - evsel->pmu_name = pmu && pmu->name ? strdup(pmu->name) : NULL; + evsel->pmu_name = pmu ? strdup(pmu->name) : NULL; if (name) evsel->name = strdup(name); @@ -446,9 +446,6 @@ if (parse_state->pmu_filter == NULL) return false; - if (pmu->name == NULL) - return true; - return strcmp(parse_state->pmu_filter, pmu->name) != 0; } @@ -793,13 +790,7 @@ parse_events_error__handle(parse_state->error, idx, strdup(errbuf), - strdup( -"Hint:\tValid config terms:\n" -" \tmap:[].value=[value]\n" -" \tmap:[].event=[event]\n" -"\n" -" \twhere is something like [0,3...5] or [all]\n" -" \t(add -v to see detail)")); + NULL); return err; } } @@ -1557,7 +1548,7 @@ } int parse_events_add_pmu(struct parse_events_state *parse_state, - struct list_head *list, char *name, + struct list_head *list, const char *name, struct list_head *head_config, bool auto_merge_stats) { --- linux-azure-6.5.0.orig/tools/perf/util/parse-events.h +++ linux-azure-6.5.0/tools/perf/util/parse-events.h @@ -190,7 +190,7 @@ u64 addr, char *type, u64 len, struct list_head *head_config); int parse_events_add_pmu(struct parse_events_state *parse_state, - struct list_head *list, char *name, + struct list_head *list, const char *name, struct list_head *head_config, bool auto_merge_stats); --- linux-azure-6.5.0.orig/tools/perf/util/parse-events.l +++ linux-azure-6.5.0/tools/perf/util/parse-events.l @@ -175,7 +175,6 @@ %x mem %s config %x event -%x array group [^,{}/]*[{][^}]*[}][^,{}/]* event_pmu [^,{}/]+[/][^/]*[/][^,{}/]* @@ -251,14 +250,6 @@ } } -{ -"]" { BEGIN(config); return ']'; } -{num_dec} { return value(yyscanner, 10); } -{num_hex} { return value(yyscanner, 16); } -, { return ','; } -"\.\.\." { return PE_ARRAY_RANGE; } -} - { /* * Please update config_term_names when new static term is added. @@ -302,8 +293,6 @@ {lc_type}-{lc_op_result} { return lc_str(yyscanner, _parse_state); } {lc_type}-{lc_op_result}-{lc_op_result} { return lc_str(yyscanner, _parse_state); } {name_minus} { return str(yyscanner, PE_NAME); } -\[all\] { return PE_ARRAY_ALL; } -"[" { BEGIN(array); return '['; } @{drv_cfg_term} { return drv_str(yyscanner, PE_DRV_CFG_TERM); } } --- linux-azure-6.5.0.orig/tools/perf/util/parse-events.y +++ linux-azure-6.5.0/tools/perf/util/parse-events.y @@ -22,10 +22,11 @@ void parse_events_error(YYLTYPE *loc, void *parse_state, void *scanner, char const *msg); -#define ABORT_ON(val) \ +#define PE_ABORT(val) \ do { \ - if (val) \ - YYABORT; \ + if (val == -ENOMEM) \ + YYNOMEM; \ + YYABORT; \ } while (0) static struct list_head* alloc_list(void) @@ -63,8 +64,6 @@ %token PE_LEGACY_CACHE %token PE_PREFIX_MEM PE_PREFIX_RAW PE_PREFIX_GROUP %token PE_ERROR -%token PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE -%token PE_ARRAY_ALL PE_ARRAY_RANGE %token PE_DRV_CFG_TERM %token PE_TERM_HW %type PE_VALUE @@ -81,9 +80,8 @@ %type PE_MODIFIER_EVENT %type PE_MODIFIER_BP %type PE_EVENT_NAME -%type PE_KERNEL_PMU_EVENT PE_PMU_EVENT_FAKE %type PE_DRV_CFG_TERM -%type name_or_raw name_or_legacy +%type name_or_raw %destructor { free ($$); } %type event_term %destructor { parse_events_term__delete ($$); } @@ -110,10 +108,6 @@ %destructor { free_list_evsel ($$); } %type tracepoint_name %destructor { free ($$.sys); free ($$.event); } -%type array -%type array_term -%type array_terms -%destructor { free ($$.ranges); } %type PE_TERM_HW %destructor { free ($$.str); } @@ -128,7 +122,6 @@ char *sys; char *event; } tracepoint_name; - struct parse_events_array array; struct hardware_term { char *str; u64 num; @@ -285,40 +278,41 @@ PE_NAME opt_pmu_config { struct parse_events_state *parse_state = _parse_state; - struct parse_events_error *error = parse_state->error; struct list_head *list = NULL, *orig_terms = NULL, *terms= NULL; char *pattern = NULL; -#define CLEANUP_YYABORT \ +#define CLEANUP \ do { \ parse_events_terms__delete($2); \ parse_events_terms__delete(orig_terms); \ free(list); \ free($1); \ free(pattern); \ - YYABORT; \ } while(0) - if (parse_events_copy_term_list($2, &orig_terms)) - CLEANUP_YYABORT; - - if (error) - error->idx = @1.first_column; + if (parse_events_copy_term_list($2, &orig_terms)) { + CLEANUP; + YYNOMEM; + } list = alloc_list(); - if (!list) - CLEANUP_YYABORT; + if (!list) { + CLEANUP; + YYNOMEM; + } /* Attempt to add to list assuming $1 is a PMU name. */ if (parse_events_add_pmu(parse_state, list, $1, $2, /*auto_merge_stats=*/false)) { struct perf_pmu *pmu = NULL; int ok = 0; /* Failure to add, try wildcard expansion of $1 as a PMU name. */ - if (asprintf(&pattern, "%s*", $1) < 0) - CLEANUP_YYABORT; + if (asprintf(&pattern, "%s*", $1) < 0) { + CLEANUP; + YYNOMEM; + } while ((pmu = perf_pmus__scan(pmu)) != NULL) { - char *name = pmu->name; + const char *name = pmu->name; if (parse_events__filter_pmu(parse_state, pmu)) continue; @@ -330,8 +324,10 @@ !perf_pmu__match(pattern, pmu->alias_name, $1)) { bool auto_merge_stats = perf_pmu__auto_merge_stats(pmu); - if (parse_events_copy_term_list(orig_terms, &terms)) - CLEANUP_YYABORT; + if (parse_events_copy_term_list(orig_terms, &terms)) { + CLEANUP; + YYNOMEM; + } if (!parse_events_add_pmu(parse_state, list, pmu->name, terms, auto_merge_stats)) { ok++; @@ -347,27 +343,23 @@ ok = !parse_events_multi_pmu_add(parse_state, $1, $2, &list); $2 = NULL; } - if (!ok) - CLEANUP_YYABORT; - } - parse_events_terms__delete($2); - parse_events_terms__delete(orig_terms); - free(pattern); - free($1); - $$ = list; -#undef CLEANUP_YYABORT -} -| -PE_KERNEL_PMU_EVENT sep_dc -{ - struct list_head *list; - int err; + if (!ok) { + struct parse_events_error *error = parse_state->error; + char *help; - err = parse_events_multi_pmu_add(_parse_state, $1, NULL, &list); - free($1); - if (err < 0) - YYABORT; + if (asprintf(&help, "Unabled to find PMU or event on a PMU of '%s'", $1) < 0) + help = NULL; + parse_events_error__handle(error, @1.first_column, + strdup("Bad event or PMU"), + help); + CLEANUP; + YYABORT; + } + } $$ = list; + list = NULL; + CLEANUP; +#undef CLEANUP } | PE_NAME sep_dc @@ -376,60 +368,18 @@ int err; err = parse_events_multi_pmu_add(_parse_state, $1, NULL, &list); - free($1); - if (err < 0) - YYABORT; - $$ = list; -} -| -PE_KERNEL_PMU_EVENT opt_pmu_config -{ - struct list_head *list; - int err; - - /* frees $2 */ - err = parse_events_multi_pmu_add(_parse_state, $1, $2, &list); - free($1); - if (err < 0) - YYABORT; - $$ = list; -} -| -PE_PMU_EVENT_FAKE sep_dc -{ - struct list_head *list; - int err; - - list = alloc_list(); - if (!list) - YYABORT; - - err = parse_events_add_pmu(_parse_state, list, $1, /*head_config=*/NULL, - /*auto_merge_stats=*/false); - free($1); if (err < 0) { - free(list); - YYABORT; - } - $$ = list; -} -| -PE_PMU_EVENT_FAKE opt_pmu_config -{ - struct list_head *list; - int err; - - list = alloc_list(); - if (!list) - YYABORT; + struct parse_events_state *parse_state = _parse_state; + struct parse_events_error *error = parse_state->error; + char *help; - err = parse_events_add_pmu(_parse_state, list, $1, $2, /*auto_merge_stats=*/false); - free($1); - parse_events_terms__delete($2); - if (err < 0) { - free(list); - YYABORT; + if (asprintf(&help, "Unabled to find PMU or event on a PMU of '%s'", $1) < 0) + help = NULL; + parse_events_error__handle(error, @1.first_column, strdup("Bad event name"), help); + free($1); + PE_ABORT(err); } + free($1); $$ = list; } @@ -448,12 +398,13 @@ bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE); list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; err = parse_events_add_numeric(_parse_state, list, type, config, $3, wildcard); parse_events_terms__delete($3); if (err) { free_list_evsel(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -464,21 +415,28 @@ int type = $1 >> 16; int config = $1 & 255; bool wildcard = (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_HW_CACHE); + int err; list = alloc_list(); - ABORT_ON(!list); - ABORT_ON(parse_events_add_numeric(_parse_state, list, type, config, - /*head_config=*/NULL, wildcard)); + if (!list) + YYNOMEM; + err = parse_events_add_numeric(_parse_state, list, type, config, /*head_config=*/NULL, wildcard); + if (err) + PE_ABORT(err); $$ = list; } | PE_VALUE_SYM_TOOL sep_slash_slash_dc { struct list_head *list; + int err; list = alloc_list(); - ABORT_ON(!list); - ABORT_ON(parse_events_add_tool(_parse_state, list, $1)); + if (!list) + YYNOMEM; + err = parse_events_add_tool(_parse_state, list, $1); + if (err) + YYNOMEM; $$ = list; } @@ -490,14 +448,16 @@ int err; list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; + err = parse_events_add_cache(list, &parse_state->idx, $1, parse_state, $2); parse_events_terms__delete($2); free($1); if (err) { free_list_evsel(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -509,14 +469,16 @@ int err; list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; + err = parse_events_add_breakpoint(_parse_state, list, $2, $6, $4, $7); parse_events_terms__delete($7); free($6); if (err) { free(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -527,13 +489,15 @@ int err; list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; + err = parse_events_add_breakpoint(_parse_state, list, $2, NULL, $4, $5); parse_events_terms__delete($5); if (err) { free(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -544,14 +508,16 @@ int err; list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; + err = parse_events_add_breakpoint(_parse_state, list, $2, $4, 0, $5); parse_events_terms__delete($5); free($4); if (err) { free(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -562,13 +528,14 @@ int err; list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; err = parse_events_add_breakpoint(_parse_state, list, $2, NULL, 0, $3); parse_events_terms__delete($3); if (err) { free(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -582,7 +549,8 @@ int err; list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; if (error) error->idx = @1.first_column; @@ -594,7 +562,7 @@ free($1.event); if (err) { free(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -614,13 +582,14 @@ int err; list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; err = parse_events_add_numeric(_parse_state, list, (u32)$1, $3, $4, /*wildcard=*/false); parse_events_terms__delete($4); if (err) { free(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -633,17 +602,20 @@ u64 num; list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; errno = 0; num = strtoull($1 + 1, NULL, 16); - ABORT_ON(errno); + /* Given the lexer will only give [a-fA-F0-9]+ a failure here should be impossible. */ + if (errno) + YYABORT; free($1); err = parse_events_add_numeric(_parse_state, list, PERF_TYPE_RAW, num, $2, /*wildcard=*/false); parse_events_terms__delete($2); if (err) { free(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -656,13 +628,14 @@ int err; list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; err = parse_events_load_bpf(parse_state, list, $1, false, $2); parse_events_terms__delete($2); free($1); if (err) { free(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -673,12 +646,13 @@ int err; list = alloc_list(); - ABORT_ON(!list); + if (!list) + YYNOMEM; err = parse_events_load_bpf(_parse_state, list, $1, true, $2); parse_events_terms__delete($2); if (err) { free(list); - YYABORT; + PE_ABORT(err); } $$ = list; } @@ -738,7 +712,8 @@ struct list_head *head = malloc(sizeof(*head)); struct parse_events_term *term = $1; - ABORT_ON(!head); + if (!head) + YYNOMEM; INIT_LIST_HEAD(head); list_add_tail(&term->list, head); $$ = head; @@ -746,30 +721,29 @@ name_or_raw: PE_RAW | PE_NAME | PE_LEGACY_CACHE -name_or_legacy: PE_NAME | PE_LEGACY_CACHE - event_term: PE_RAW { struct parse_events_term *term; + int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_RAW, + strdup("raw"), $1, &@1, &@1); - if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_RAW, - strdup("raw"), $1, &@1, &@1)) { + if (err) { free($1); - YYABORT; + PE_ABORT(err); } $$ = term; } | -name_or_raw '=' name_or_legacy +name_or_raw '=' name_or_raw { struct parse_events_term *term; + int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, $1, $3, &@1, &@3); - if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, $3, &@1, &@3)) { + if (err) { free($1); free($3); - YYABORT; + PE_ABORT(err); } $$ = term; } @@ -777,11 +751,12 @@ name_or_raw '=' PE_VALUE { struct parse_events_term *term; + int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1, $3, false, &@1, &@3); - if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, $3, false, &@1, &@3)) { + if (err) { free($1); - YYABORT; + PE_ABORT(err); } $$ = term; } @@ -789,12 +764,13 @@ name_or_raw '=' PE_TERM_HW { struct parse_events_term *term; + int err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1, $3.str, &@1, &@3); - if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, $3.str, &@1, &@3)) { + if (err) { free($1); free($3.str); - YYABORT; + PE_ABORT(err); } $$ = term; } @@ -802,11 +778,12 @@ PE_LEGACY_CACHE { struct parse_events_term *term; + int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE, + $1, 1, true, &@1, NULL); - if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_LEGACY_CACHE, - $1, 1, true, &@1, NULL)) { + if (err) { free($1); - YYABORT; + PE_ABORT(err); } $$ = term; } @@ -814,11 +791,12 @@ PE_NAME { struct parse_events_term *term; + int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, + $1, 1, true, &@1, NULL); - if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, 1, true, &@1, NULL)) { + if (err) { free($1); - YYABORT; + PE_ABORT(err); } $$ = term; } @@ -826,22 +804,24 @@ PE_TERM_HW { struct parse_events_term *term; + int err = parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_HARDWARE, + $1.str, $1.num & 255, false, &@1, NULL); - if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_HARDWARE, - $1.str, $1.num & 255, false, &@1, NULL)) { + if (err) { free($1.str); - YYABORT; + PE_ABORT(err); } $$ = term; } | -PE_TERM '=' name_or_legacy +PE_TERM '=' name_or_raw { struct parse_events_term *term; + int err = parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3); - if (parse_events_term__str(&term, (int)$1, NULL, $3, &@1, &@3)) { + if (err) { free($3); - YYABORT; + PE_ABORT(err); } $$ = term; } @@ -849,10 +829,11 @@ PE_TERM '=' PE_TERM_HW { struct parse_events_term *term; + int err = parse_events_term__str(&term, (int)$1, NULL, $3.str, &@1, &@3); - if (parse_events_term__str(&term, (int)$1, NULL, $3.str, &@1, &@3)) { + if (err) { free($3.str); - YYABORT; + PE_ABORT(err); } $$ = term; } @@ -860,53 +841,33 @@ PE_TERM '=' PE_TERM { struct parse_events_term *term; + int err = parse_events_term__term(&term, (int)$1, (int)$3, &@1, &@3); + + if (err) + PE_ABORT(err); - ABORT_ON(parse_events_term__term(&term, (int)$1, (int)$3, &@1, &@3)); $$ = term; } | PE_TERM '=' PE_VALUE { struct parse_events_term *term; + int err = parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, &@3); - ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, $3, false, &@1, &@3)); - $$ = term; -} -| -PE_TERM -{ - struct parse_events_term *term; + if (err) + PE_ABORT(err); - ABORT_ON(parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NULL)); $$ = term; } | -name_or_raw array '=' name_or_legacy +PE_TERM { struct parse_events_term *term; + int err = parse_events_term__num(&term, (int)$1, NULL, 1, true, &@1, NULL); - if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, $4, &@1, &@4)) { - free($1); - free($4); - free($2.ranges); - YYABORT; - } - term->array = $2; - $$ = term; -} -| -name_or_raw array '=' PE_VALUE -{ - struct parse_events_term *term; + if (err) + PE_ABORT(err); - if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER, - $1, $4, false, &@1, &@4)) { - free($1); - free($2.ranges); - YYABORT; - } - term->array = $2; $$ = term; } | @@ -914,73 +875,19 @@ { struct parse_events_term *term; char *config = strdup($1); + int err; - ABORT_ON(!config); - if (parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG, - config, $1, &@1, NULL)) { + if (!config) + YYNOMEM; + err = parse_events_term__str(&term, PARSE_EVENTS__TERM_TYPE_DRV_CFG, config, $1, &@1, NULL); + if (err) { free($1); free(config); - YYABORT; + PE_ABORT(err); } $$ = term; } -array: -'[' array_terms ']' -{ - $$ = $2; -} -| -PE_ARRAY_ALL -{ - $$.nr_ranges = 0; - $$.ranges = NULL; -} - -array_terms: -array_terms ',' array_term -{ - struct parse_events_array new_array; - - new_array.nr_ranges = $1.nr_ranges + $3.nr_ranges; - new_array.ranges = realloc($1.ranges, - sizeof(new_array.ranges[0]) * - new_array.nr_ranges); - ABORT_ON(!new_array.ranges); - memcpy(&new_array.ranges[$1.nr_ranges], $3.ranges, - $3.nr_ranges * sizeof(new_array.ranges[0])); - free($3.ranges); - $$ = new_array; -} -| -array_term - -array_term: -PE_VALUE -{ - struct parse_events_array array; - - array.nr_ranges = 1; - array.ranges = malloc(sizeof(array.ranges[0])); - ABORT_ON(!array.ranges); - array.ranges[0].start = $1; - array.ranges[0].length = 1; - $$ = array; -} -| -PE_VALUE PE_ARRAY_RANGE PE_VALUE -{ - struct parse_events_array array; - - ABORT_ON($3 < $1); - array.nr_ranges = 1; - array.ranges = malloc(sizeof(array.ranges[0])); - ABORT_ON(!array.ranges); - array.ranges[0].start = $1; - array.ranges[0].length = $3 - $1 + 1; - $$ = array; -} - sep_dc: ':' | sep_slash_slash_dc: '/' '/' | ':' | --- linux-azure-6.5.0.orig/tools/perf/util/pmu.c +++ linux-azure-6.5.0/tools/perf/util/pmu.c @@ -19,8 +19,8 @@ #include "evsel.h" #include "pmu.h" #include "pmus.h" -#include "pmu-bison.h" -#include "pmu-flex.h" +#include +#include #include "parse-events.h" #include "print-events.h" #include "header.h" @@ -29,7 +29,9 @@ #include "fncache.h" #include "util/evsel_config.h" -struct perf_pmu perf_pmu__fake; +struct perf_pmu perf_pmu__fake = { + .name = "fake", +}; /** * struct perf_pmu_format - Values from a format file read from @@ -840,13 +842,13 @@ return NULL; } -char * __weak +const char * __weak pmu_find_real_name(const char *name) { - return (char *)name; + return name; } -char * __weak +const char * __weak pmu_find_alias_name(const char *name __maybe_unused) { return NULL; @@ -866,8 +868,8 @@ LIST_HEAD(format); LIST_HEAD(aliases); __u32 type; - char *name = pmu_find_real_name(lookup_name); - char *alias_name; + const char *name = pmu_find_real_name(lookup_name); + const char *alias_name; /* * The pmu data we store & need consists of the pmu @@ -1710,7 +1712,7 @@ name ?: "N/A", buf, config_name, config); } -int perf_pmu__match(char *pattern, char *name, char *tok) +int perf_pmu__match(const char *pattern, const char *name, const char *tok) { if (!name) return -1; --- linux-azure-6.5.0.orig/tools/perf/util/pmu.h +++ linux-azure-6.5.0/tools/perf/util/pmu.h @@ -39,7 +39,7 @@ */ struct perf_pmu { /** @name: The name of the PMU such as "cpu". */ - char *name; + const char *name; /** * @alias_name: Optional alternate name for the PMU determined in * architecture specific code. @@ -275,10 +275,10 @@ const char *config_name); void perf_pmu__warn_invalid_formats(struct perf_pmu *pmu); -int perf_pmu__match(char *pattern, char *name, char *tok); +int perf_pmu__match(const char *pattern, const char *name, const char *tok); -char *pmu_find_real_name(const char *name); -char *pmu_find_alias_name(const char *name); +const char *pmu_find_real_name(const char *name); +const char *pmu_find_alias_name(const char *name); double perf_pmu__cpu_slots_per_cycle(void); int perf_pmu__event_source_devices_scnprintf(char *pathname, size_t size); int perf_pmu__pathname_scnprintf(char *buf, size_t size, --- linux-azure-6.5.0.orig/tools/power/acpi/Makefile.rules +++ linux-azure-6.5.0/tools/power/acpi/Makefile.rules @@ -9,7 +9,7 @@ toolobjs := $(addprefix $(objdir),$(TOOL_OBJS)) $(OUTPUT)$(TOOL): $(toolobjs) FORCE $(ECHO) " LD " $(subst $(OUTPUT),,$@) - $(QUIET) $(LD) $(CFLAGS) $(toolobjs) $(LDFLAGS) -L$(OUTPUT) -o $@ + $(QUIET_LINK)$(CC) $(CFLAGS) $(toolobjs) $(LDFLAGS) -L$(OUTPUT) -o $@ $(ECHO) " STRIP " $(subst $(OUTPUT),,$@) $(QUIET) $(STRIPCMD) $@ --- linux-azure-6.5.0.orig/tools/power/cpupower/man/cpupower-powercap-info.1 +++ linux-azure-6.5.0/tools/power/cpupower/man/cpupower-powercap-info.1 @@ -17,7 +17,7 @@ .SH "DOCUMENTATION" kernel sources: -Documentation/power/powercap/powercap.txt +Documentation/power/powercap/powercap.rst .SH "SEE ALSO" --- linux-azure-6.5.0.orig/tools/power/pm-graph/sleepgraph.py +++ linux-azure-6.5.0/tools/power/pm-graph/sleepgraph.py @@ -4151,7 +4151,7 @@ elif(re.match('Enabling non-boot CPUs .*', msg)): # start of first cpu resume cpu_start = ktime - elif(re.match('smpboot: CPU (?P[0-9]*) is now offline', msg)) \ + elif(re.match('smpboot: CPU (?P[0-9]*) is now offline', msg) \ or re.match('psci: CPU(?P[0-9]*) killed.*', msg)): # end of a cpu suspend, start of the next m = re.match('smpboot: CPU (?P[0-9]*) is now offline', msg) --- linux-azure-6.5.0.orig/tools/power/x86/turbostat/turbostat.c +++ linux-azure-6.5.0/tools/power/x86/turbostat/turbostat.c @@ -2180,7 +2180,7 @@ if ((DO_BIC(BIC_CPU_c6) || soft_c1_residency_display(BIC_CPU_c6)) && !do_knl_cstates) { if (get_msr(cpu, MSR_CORE_C6_RESIDENCY, &c->c6)) return -7; - } else if (do_knl_cstates || soft_c1_residency_display(BIC_CPU_c6)) { + } else if (do_knl_cstates && soft_c1_residency_display(BIC_CPU_c6)) { if (get_msr(cpu, MSR_KNL_CORE_C6_RESIDENCY, &c->c6)) return -7; } @@ -5790,6 +5790,7 @@ rapl_probe(family, model); perf_limit_reasons_probe(family, model); automatic_cstate_conversion_probe(family, model); + prewake_cstate_probe(family, model); check_tcc_offset(model_orig); --- linux-azure-6.5.0.orig/tools/testing/cxl/Kbuild +++ linux-azure-6.5.0/tools/testing/cxl/Kbuild @@ -62,5 +62,6 @@ cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o cxl_core-y += config_check.o cxl_core-y += cxl_core_test.o +cxl_core-y += cxl_core_exports.o obj-m += test/ --- linux-azure-6.5.0.orig/tools/testing/cxl/cxl_core_exports.c +++ linux-azure-6.5.0/tools/testing/cxl/cxl_core_exports.c @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright(c) 2022 Intel Corporation. All rights reserved. */ + +#include "cxl.h" + +/* Exporting of cxl_core symbols that are only used by cxl_test */ +EXPORT_SYMBOL_NS_GPL(cxl_num_decoders_committed, CXL); --- linux-azure-6.5.0.orig/tools/testing/cxl/test/cxl.c +++ linux-azure-6.5.0/tools/testing/cxl/test/cxl.c @@ -669,10 +669,11 @@ return 0; dev_dbg(&port->dev, "%s commit\n", dev_name(&cxld->dev)); - if (port->commit_end + 1 != id) { + if (cxl_num_decoders_committed(port) != id) { dev_dbg(&port->dev, "%s: out of order commit, expected decoder%d.%d\n", - dev_name(&cxld->dev), port->id, port->commit_end + 1); + dev_name(&cxld->dev), port->id, + cxl_num_decoders_committed(port)); return -EBUSY; } @@ -831,7 +832,7 @@ cxld->interleave_ways = 2; else cxld->interleave_ways = 1; - cxld->interleave_granularity = 256; + cxld->interleave_granularity = 4096; cxld->hpa_range = (struct range) { .start = base, .end = base + size - 1, --- linux-azure-6.5.0.orig/tools/testing/cxl/test/mem.c +++ linux-azure-6.5.0/tools/testing/cxl/test/mem.c @@ -1450,11 +1450,11 @@ mdata->mes.mds = mds; cxl_mock_add_event_logs(&mdata->mes); - cxlmd = devm_cxl_add_memdev(cxlds); + cxlmd = devm_cxl_add_memdev(&pdev->dev, cxlds); if (IS_ERR(cxlmd)) return PTR_ERR(cxlmd); - rc = cxl_memdev_setup_fw_upload(mds); + rc = devm_cxl_setup_fw_upload(&pdev->dev, mds); if (rc) return rc; --- linux-azure-6.5.0.orig/tools/testing/memblock/internal.h +++ linux-azure-6.5.0/tools/testing/memblock/internal.h @@ -20,4 +20,8 @@ { } +static inline void accept_memory(phys_addr_t start, phys_addr_t end) +{ +} + #endif --- linux-azure-6.5.0.orig/tools/testing/memblock/mmzone.c +++ linux-azure-6.5.0/tools/testing/memblock/mmzone.c @@ -11,7 +11,7 @@ return NULL; } -void reserve_bootmem_region(phys_addr_t start, phys_addr_t end) +void reserve_bootmem_region(phys_addr_t start, phys_addr_t end, int nid) { } --- linux-azure-6.5.0.orig/tools/testing/memblock/tests/basic_api.c +++ linux-azure-6.5.0/tools/testing/memblock/tests/basic_api.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later +#include "basic_api.h" #include #include -#include "basic_api.h" #define EXPECTED_MEMBLOCK_REGIONS 128 #define FUNC_ADD "memblock_add" --- linux-azure-6.5.0.orig/tools/testing/memblock/tests/common.h +++ linux-azure-6.5.0/tools/testing/memblock/tests/common.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include --- linux-azure-6.5.0.orig/tools/testing/radix-tree/multiorder.c +++ linux-azure-6.5.0/tools/testing/radix-tree/multiorder.c @@ -159,7 +159,7 @@ item_kill_tree(xa); } -bool stop_iteration = false; +bool stop_iteration; static void *creator_func(void *ptr) { @@ -201,6 +201,7 @@ pthread_t worker_thread[num_threads]; int i; + stop_iteration = false; pthread_create(&worker_thread[0], NULL, &creator_func, xa); for (i = 1; i < num_threads; i++) pthread_create(&worker_thread[i], NULL, &iterator_func, xa); @@ -211,6 +212,61 @@ item_kill_tree(xa); } +static void *load_creator(void *ptr) +{ + /* 'order' is set up to ensure we have sibling entries */ + unsigned int order; + struct radix_tree_root *tree = ptr; + int i; + + rcu_register_thread(); + item_insert_order(tree, 3 << RADIX_TREE_MAP_SHIFT, 0); + item_insert_order(tree, 2 << RADIX_TREE_MAP_SHIFT, 0); + for (i = 0; i < 10000; i++) { + for (order = 1; order < RADIX_TREE_MAP_SHIFT; order++) { + unsigned long index = (3 << RADIX_TREE_MAP_SHIFT) - + (1 << order); + item_insert_order(tree, index, order); + item_delete_rcu(tree, index); + } + } + rcu_unregister_thread(); + + stop_iteration = true; + return NULL; +} + +static void *load_worker(void *ptr) +{ + unsigned long index = (3 << RADIX_TREE_MAP_SHIFT) - 1; + + rcu_register_thread(); + while (!stop_iteration) { + struct item *item = xa_load(ptr, index); + assert(!xa_is_internal(item)); + } + rcu_unregister_thread(); + + return NULL; +} + +static void load_race(struct xarray *xa) +{ + const int num_threads = sysconf(_SC_NPROCESSORS_ONLN) * 4; + pthread_t worker_thread[num_threads]; + int i; + + stop_iteration = false; + pthread_create(&worker_thread[0], NULL, &load_creator, xa); + for (i = 1; i < num_threads; i++) + pthread_create(&worker_thread[i], NULL, &load_worker, xa); + + for (i = 0; i < num_threads; i++) + pthread_join(worker_thread[i], NULL); + + item_kill_tree(xa); +} + static DEFINE_XARRAY(array); void multiorder_checks(void) @@ -218,12 +274,20 @@ multiorder_iteration(&array); multiorder_tagged_iteration(&array); multiorder_iteration_race(&array); + load_race(&array); radix_tree_cpu_dead(0); } -int __weak main(void) +int __weak main(int argc, char **argv) { + int opt; + + while ((opt = getopt(argc, argv, "ls:v")) != -1) { + if (opt == 'v') + test_verbose++; + } + rcu_register_thread(); radix_tree_init(); multiorder_checks(); --- linux-azure-6.5.0.orig/tools/testing/selftests/Makefile +++ linux-azure-6.5.0/tools/testing/selftests/Makefile @@ -146,12 +146,10 @@ abs_objtree := $(realpath $(abs_objtree)) BUILD := $(abs_objtree)/kselftest KHDR_INCLUDES := -isystem ${abs_objtree}/usr/include - KHDR_DIR := ${abs_objtree}/usr/include else BUILD := $(CURDIR) abs_srctree := $(shell cd $(top_srcdir) && pwd) KHDR_INCLUDES := -isystem ${abs_srctree}/usr/include - KHDR_DIR := ${abs_srctree}/usr/include DEFAULT_INSTALL_HDR_PATH := 1 endif @@ -165,7 +163,7 @@ # all isn't the first target in the file. .DEFAULT_GOAL := all -all: kernel_header_files +all: @ret=1; \ for TARGET in $(TARGETS); do \ BUILD_TARGET=$$BUILD/$$TARGET; \ @@ -176,23 +174,6 @@ ret=$$((ret * $$?)); \ done; exit $$ret; -kernel_header_files: - @ls $(KHDR_DIR)/linux/*.h >/dev/null 2>/dev/null; \ - if [ $$? -ne 0 ]; then \ - RED='\033[1;31m'; \ - NOCOLOR='\033[0m'; \ - echo; \ - echo -e "$${RED}error$${NOCOLOR}: missing kernel header files."; \ - echo "Please run this and try again:"; \ - echo; \ - echo " cd $(top_srcdir)"; \ - echo " make headers"; \ - echo; \ - exit 1; \ - fi - -.PHONY: kernel_header_files - run_tests: all @for TARGET in $(TARGETS); do \ BUILD_TARGET=$$BUILD/$$TARGET; \ --- linux-azure-6.5.0.orig/tools/testing/selftests/alsa/mixer-test.c +++ linux-azure-6.5.0/tools/testing/selftests/alsa/mixer-test.c @@ -138,7 +138,7 @@ err = snd_ctl_elem_info(card_data->handle, ctl_data->info); if (err < 0) { - ksft_print_msg("%s getting info for %d\n", + ksft_print_msg("%s getting info for %s\n", snd_strerror(err), ctl_data->name); } --- linux-azure-6.5.0.orig/tools/testing/selftests/arm64/fp/za-fork.c +++ linux-azure-6.5.0/tools/testing/selftests/arm64/fp/za-fork.c @@ -85,7 +85,7 @@ */ ret = open("/proc/sys/abi/sme_default_vector_length", O_RDONLY, 0); if (ret >= 0) { - ksft_test_result(fork_test(), "fork_test"); + ksft_test_result(fork_test(), "fork_test\n"); } else { ksft_print_msg("SME not supported\n"); --- linux-azure-6.5.0.orig/tools/testing/selftests/arm64/signal/testcases/zt_regs.c +++ linux-azure-6.5.0/tools/testing/selftests/arm64/signal/testcases/zt_regs.c @@ -65,6 +65,7 @@ if (memcmp(zeros, (char *)zt + ZT_SIG_REGS_OFFSET, ZT_SIG_REGS_SIZE(zt->nregs)) != 0) { fprintf(stderr, "ZT data invalid\n"); + free(zeros); return 1; } --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/Makefile +++ linux-azure-6.5.0/tools/testing/selftests/bpf/Makefile @@ -358,7 +358,8 @@ -I$(abspath $(OUTPUT)/../usr/include) CLANG_CFLAGS = $(CLANG_SYS_INCLUDES) \ - -Wno-compare-distinct-pointer-types + -Wno-compare-distinct-pointer-types \ + -Wno-incompatible-pointer-types $(OUTPUT)/test_l4lb_noinline.o: BPF_CFLAGS += -fno-inline $(OUTPUT)/test_xdp_noinline.o: BPF_CFLAGS += -fno-inline --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/benchs/run_bench_rename.sh +++ linux-azure-6.5.0/tools/testing/selftests/bpf/benchs/run_bench_rename.sh @@ -2,7 +2,7 @@ set -eufo pipefail -for i in base kprobe kretprobe rawtp fentry fexit fmodret +for i in base kprobe kretprobe rawtp fentry fexit do summary=$(sudo ./bench -w2 -d5 -a rename-$i | tail -n1 | cut -d'(' -f1 | cut -d' ' -f3-) printf "%-10s: %s\n" $i "$summary" --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/config.x86_64 +++ linux-azure-6.5.0/tools/testing/selftests/bpf/config.x86_64 @@ -51,7 +51,6 @@ CONFIG_CRYPTO_XXHASH=y CONFIG_DCB=y CONFIG_DEBUG_ATOMIC_SLEEP=y -CONFIG_DEBUG_CREDENTIALS=y CONFIG_DEBUG_INFO_BTF=y CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y CONFIG_DEBUG_MEMORY_INIT=y --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/prog_tests/bpf_nf.c +++ linux-azure-6.5.0/tools/testing/selftests/bpf/prog_tests/bpf_nf.c @@ -123,12 +123,13 @@ ASSERT_EQ(skel->data->test_snat_addr, 0, "Test for source natting"); ASSERT_EQ(skel->data->test_dnat_addr, 0, "Test for destination natting"); end: - if (srv_client_fd != -1) - close(srv_client_fd); if (client_fd != -1) close(client_fd); + if (srv_client_fd != -1) + close(srv_client_fd); if (srv_fd != -1) close(srv_fd); + snprintf(cmd, sizeof(cmd), iptables, "-D"); system(cmd); test_bpf_nf__destroy(skel); --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/prog_tests/bpf_obj_pinning.c +++ linux-azure-6.5.0/tools/testing/selftests/bpf/prog_tests/bpf_obj_pinning.c @@ -8,6 +8,7 @@ #include #include #include +#include "bpf/libbpf_internal.h" static inline int sys_fsopen(const char *fsname, unsigned flags) { @@ -155,7 +156,7 @@ ASSERT_OK(err, "obj_pin"); /* cleanup */ - if (pin_opts.path_fd >= 0) + if (path_kind == PATH_FD_REL && pin_opts.path_fd >= 0) close(pin_opts.path_fd); if (old_cwd[0]) ASSERT_OK(chdir(old_cwd), "restore_cwd"); @@ -220,7 +221,7 @@ goto cleanup; /* cleanup */ - if (get_opts.path_fd >= 0) + if (path_kind == PATH_FD_REL && get_opts.path_fd >= 0) close(get_opts.path_fd); if (old_cwd[0]) ASSERT_OK(chdir(old_cwd), "restore_cwd"); --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/prog_tests/kfunc_call.c +++ linux-azure-6.5.0/tools/testing/selftests/bpf/prog_tests/kfunc_call.c @@ -173,8 +173,8 @@ case tc_test: topts.data_in = &pkt_v4; topts.data_size_in = sizeof(pkt_v4); - break; topts.repeat = 1; + break; } skel = kfunc_call_fail__open_opts(&opts); --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/prog_tests/module_fentry_shadow.c +++ linux-azure-6.5.0/tools/testing/selftests/bpf/prog_tests/module_fentry_shadow.c @@ -61,6 +61,11 @@ int link_fd[2] = {}; __s32 btf_id[2] = {}; + if (!env.has_testmod) { + test__skip(); + return; + } + LIBBPF_OPTS(bpf_prog_load_opts, load_opts, .expected_attach_type = BPF_TRACE_FENTRY, ); --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/prog_tests/sockmap_helpers.h +++ linux-azure-6.5.0/tools/testing/selftests/bpf/prog_tests/sockmap_helpers.h @@ -179,6 +179,32 @@ __ret; \ }) +static inline int poll_connect(int fd, unsigned int timeout_sec) +{ + struct timeval timeout = { .tv_sec = timeout_sec }; + fd_set wfds; + int r, eval; + socklen_t esize = sizeof(eval); + + FD_ZERO(&wfds); + FD_SET(fd, &wfds); + + r = select(fd + 1, NULL, &wfds, NULL, &timeout); + if (r == 0) + errno = ETIME; + if (r != 1) + return -1; + + if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &eval, &esize) < 0) + return -1; + if (eval != 0) { + errno = eval; + return -1; + } + + return 0; +} + static inline int poll_read(int fd, unsigned int timeout_sec) { struct timeval timeout = { .tv_sec = timeout_sec }; --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c +++ linux-azure-6.5.0/tools/testing/selftests/bpf/prog_tests/sockmap_listen.c @@ -1452,11 +1452,18 @@ if (p < 0) goto close_cli; + if (poll_connect(c, IO_TIMEOUT_SEC) < 0) { + FAIL_ERRNO("poll_connect"); + goto close_acc; + } + *v0 = p; *v1 = c; return 0; +close_acc: + close(p); close_cli: close(c); close_srv: --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/prog_tests/tailcalls.c +++ linux-azure-6.5.0/tools/testing/selftests/bpf/prog_tests/tailcalls.c @@ -271,11 +271,11 @@ data_map = bpf_object__find_map_by_name(obj, "tailcall.bss"); if (CHECK_FAIL(!data_map || !bpf_map__is_internal(data_map))) - return; + goto out; data_fd = bpf_map__fd(data_map); - if (CHECK_FAIL(map_fd < 0)) - return; + if (CHECK_FAIL(data_fd < 0)) + goto out; i = 0; err = bpf_map_lookup_elem(data_fd, &i, &val); @@ -352,11 +352,11 @@ data_map = bpf_object__find_map_by_name(obj, "tailcall.bss"); if (CHECK_FAIL(!data_map || !bpf_map__is_internal(data_map))) - return; + goto out; data_fd = bpf_map__fd(data_map); - if (CHECK_FAIL(map_fd < 0)) - return; + if (CHECK_FAIL(data_fd < 0)) + goto out; for (i = 0; i < bpf_map__max_entries(prog_array); i++) { snprintf(prog_name, sizeof(prog_name), "classifier_%d", i); @@ -442,11 +442,11 @@ data_map = bpf_object__find_map_by_name(obj, "tailcall.bss"); if (CHECK_FAIL(!data_map || !bpf_map__is_internal(data_map))) - return; + goto out; data_fd = bpf_map__fd(data_map); - if (CHECK_FAIL(map_fd < 0)) - return; + if (CHECK_FAIL(data_fd < 0)) + goto out; for (i = 0; i < bpf_map__max_entries(prog_array); i++) { snprintf(prog_name, sizeof(prog_name), "classifier_%d", i); @@ -631,11 +631,11 @@ data_map = bpf_object__find_map_by_name(obj, "tailcall.bss"); if (CHECK_FAIL(!data_map || !bpf_map__is_internal(data_map))) - return; + goto out; data_fd = bpf_map__fd(data_map); - if (CHECK_FAIL(map_fd < 0)) - return; + if (CHECK_FAIL(data_fd < 0)) + goto out; i = 0; err = bpf_map_lookup_elem(data_fd, &i, &val); @@ -805,11 +805,11 @@ data_map = bpf_object__find_map_by_name(obj, "tailcall.bss"); if (CHECK_FAIL(!data_map || !bpf_map__is_internal(data_map))) - return; + goto out; data_fd = bpf_map__fd(data_map); - if (CHECK_FAIL(map_fd < 0)) - return; + if (CHECK_FAIL(data_fd < 0)) + goto out; i = 0; val.noise = noise; @@ -872,7 +872,7 @@ ASSERT_EQ(topts.retval, 0, "tailcall retval"); data_fd = bpf_map__fd(obj->maps.bss); - if (!ASSERT_GE(map_fd, 0, "bss map fd")) + if (!ASSERT_GE(data_fd, 0, "bss map fd")) goto out; i = 0; --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/progs/bpf_loop_bench.c +++ linux-azure-6.5.0/tools/testing/selftests/bpf/progs/bpf_loop_bench.c @@ -15,13 +15,16 @@ return 0; } +static int outer_loop(__u32 index, void *data) +{ + bpf_loop(nr_loops, empty_callback, NULL, 0); + __sync_add_and_fetch(&hits, nr_loops); + return 0; +} + SEC("fentry/" SYS_PREFIX "sys_getpgid") int benchmark(void *ctx) { - for (int i = 0; i < 1000; i++) { - bpf_loop(nr_loops, empty_callback, NULL, 0); - - __sync_add_and_fetch(&hits, nr_loops); - } + bpf_loop(1000, outer_loop, NULL, 0); return 0; } --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/progs/profiler.inc.h +++ linux-azure-6.5.0/tools/testing/selftests/bpf/progs/profiler.inc.h @@ -62,11 +62,11 @@ #define READ_ENVIRON_FROM_EXEC (bpf_config.read_environ_from_exec) #define ENABLE_CGROUP_V1_RESOLVER (bpf_config.enable_cgroup_v1_resolver) -struct kernfs_iattrs___52 { +struct _kernfs_iattrs___52 { struct iattr ia_iattr; }; -struct kernfs_node___52 { +struct _kernfs_node___52 { union /* kernfs_node_id */ { struct { u32 ino; @@ -232,7 +232,7 @@ static ino_t get_inode_from_kernfs(struct kernfs_node* node) { - struct kernfs_node___52* node52 = (void*)node; + struct _kernfs_node___52* node52 = (void*)node; if (bpf_core_field_exists(node52->id.ino)) { barrier_var(node52); @@ -287,13 +287,13 @@ cgroup_data->cgroup_proc_mtime = BPF_CORE_READ(proc_kernfs, iattr, ia_mtime.tv_nsec); } else { - struct kernfs_iattrs___52* root_iattr = - (struct kernfs_iattrs___52*)BPF_CORE_READ(root_kernfs, iattr); + struct _kernfs_iattrs___52* root_iattr = + (struct _kernfs_iattrs___52*)BPF_CORE_READ(root_kernfs, iattr); cgroup_data->cgroup_root_mtime = BPF_CORE_READ(root_iattr, ia_iattr.ia_mtime.tv_nsec); - struct kernfs_iattrs___52* proc_iattr = - (struct kernfs_iattrs___52*)BPF_CORE_READ(proc_kernfs, iattr); + struct _kernfs_iattrs___52* proc_iattr = + (struct _kernfs_iattrs___52*)BPF_CORE_READ(proc_kernfs, iattr); cgroup_data->cgroup_proc_mtime = BPF_CORE_READ(proc_iattr, ia_iattr.ia_mtime.tv_nsec); } --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/progs/test_cls_redirect.h +++ linux-azure-6.5.0/tools/testing/selftests/bpf/progs/test_cls_redirect.h @@ -12,6 +12,15 @@ #include #include +/* offsetof() is used in static asserts, and the libbpf-redefined CO-RE + * friendly version breaks compilation for older clang versions <= 15 + * when invoked in a static assert. Restore original here. + */ +#ifdef offsetof +#undef offsetof +#define offsetof(type, member) __builtin_offsetof(type, member) +#endif + struct gre_base_hdr { uint16_t flags; uint16_t protocol; --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/test_verifier.c +++ linux-azure-6.5.0/tools/testing/selftests/bpf/test_verifier.c @@ -1880,7 +1880,7 @@ } } - get_unpriv_disabled(); + unpriv_disabled = get_unpriv_disabled(); if (unpriv && unpriv_disabled) { printf("Cannot run as unprivileged user with sysctl %s.\n", UNPRIV_SYSCTL); --- linux-azure-6.5.0.orig/tools/testing/selftests/bpf/verifier/ld_imm64.c +++ linux-azure-6.5.0/tools/testing/selftests/bpf/verifier/ld_imm64.c @@ -9,8 +9,8 @@ BPF_MOV64_IMM(BPF_REG_0, 2), BPF_EXIT_INSN(), }, - .errstr = "invalid BPF_LD_IMM insn", - .errstr_unpriv = "R1 pointer comparison", + .errstr = "jump into the middle of ldimm64 insn 1", + .errstr_unpriv = "jump into the middle of ldimm64 insn 1", .result = REJECT, }, { @@ -23,8 +23,8 @@ BPF_LD_IMM64(BPF_REG_0, 1), BPF_EXIT_INSN(), }, - .errstr = "invalid BPF_LD_IMM insn", - .errstr_unpriv = "R1 pointer comparison", + .errstr = "jump into the middle of ldimm64 insn 1", + .errstr_unpriv = "jump into the middle of ldimm64 insn 1", .result = REJECT, }, { --- linux-azure-6.5.0.orig/tools/testing/selftests/clone3/clone3.c +++ linux-azure-6.5.0/tools/testing/selftests/clone3/clone3.c @@ -196,7 +196,12 @@ CLONE3_ARGS_NO_TEST); /* Do a clone3() in a new time namespace */ - test_clone3(CLONE_NEWTIME, 0, 0, CLONE3_ARGS_NO_TEST); + if (access("/proc/self/ns/time", F_OK) == 0) { + test_clone3(CLONE_NEWTIME, 0, 0, CLONE3_ARGS_NO_TEST); + } else { + ksft_print_msg("Time namespaces are not supported\n"); + ksft_test_result_skip("Skipping clone3() with CLONE_NEWTIME\n"); + } /* Do a clone3() with exit signal (SIGCHLD) in flags */ test_clone3(SIGCHLD, 0, -EINVAL, CLONE3_ARGS_NO_TEST); --- linux-azure-6.5.0.orig/tools/testing/selftests/drivers/net/bonding/bond-arp-interval-causes-panic.sh +++ linux-azure-6.5.0/tools/testing/selftests/drivers/net/bonding/bond-arp-interval-causes-panic.sh @@ -33,16 +33,16 @@ ip link set dev link1_1 netns client down name eth0 ip netns exec client ip link add dev bond0 down type bond mode 1 \ miimon 100 all_slaves_active 1 -ip netns exec client ip link set dev eth0 down master bond0 +ip netns exec client ip link set dev eth0 master bond0 ip netns exec client ip link set dev bond0 up ip netns exec client ip addr add ${client_ip4}/24 dev bond0 ip netns exec client ping -c 5 $server_ip4 >/dev/null -ip netns exec client ip link set dev eth0 down nomaster +ip netns exec client ip link set dev eth0 nomaster ip netns exec client ip link set dev bond0 down ip netns exec client ip link set dev bond0 type bond mode 0 \ arp_interval 1000 arp_ip_target "+${server_ip4}" -ip netns exec client ip link set dev eth0 down master bond0 +ip netns exec client ip link set dev eth0 master bond0 ip netns exec client ip link set dev bond0 up ip netns exec client ping -c 5 $server_ip4 >/dev/null --- linux-azure-6.5.0.orig/tools/testing/selftests/efivarfs/create-read.c +++ linux-azure-6.5.0/tools/testing/selftests/efivarfs/create-read.c @@ -32,8 +32,10 @@ rc = read(fd, buf, sizeof(buf)); if (rc != 0) { fprintf(stderr, "Reading a new var should return EOF\n"); + close(fd); return EXIT_FAILURE; } + close(fd); return EXIT_SUCCESS; } --- linux-azure-6.5.0.orig/tools/testing/selftests/ftrace/ftracetest +++ linux-azure-6.5.0/tools/testing/selftests/ftrace/ftracetest @@ -31,6 +31,9 @@ # kselftest skip code is 4 err_skip=4 +# umount required +UMOUNT_DIR="" + # cgroup RT scheduling prevents chrt commands from succeeding, which # induces failures in test wakeup tests. Disable for the duration of # the tests. @@ -45,6 +48,9 @@ cleanup() { echo $sched_rt_runtime_orig > $sched_rt_runtime + if [ -n "${UMOUNT_DIR}" ]; then + umount ${UMOUNT_DIR} ||: + fi } errexit() { # message @@ -160,11 +166,13 @@ mount -t tracefs nodev /sys/kernel/tracing || errexit "Failed to mount /sys/kernel/tracing" TRACING_DIR="/sys/kernel/tracing" + UMOUNT_DIR=${TRACING_DIR} # If debugfs exists, then so does /sys/kernel/debug elif [ -d "/sys/kernel/debug" ]; then mount -t debugfs nodev /sys/kernel/debug || errexit "Failed to mount /sys/kernel/debug" TRACING_DIR="/sys/kernel/debug/tracing" + UMOUNT_DIR=${TRACING_DIR} else err_ret=$err_skip errexit "debugfs and tracefs are not configured in this kernel" --- linux-azure-6.5.0.orig/tools/testing/selftests/ftrace/test.d/instances/instance-event.tc +++ linux-azure-6.5.0/tools/testing/selftests/ftrace/test.d/instances/instance-event.tc @@ -39,7 +39,7 @@ instance_set() { while :; do - echo 1 > foo/events/sched/sched_switch + echo 1 > foo/events/sched/sched_switch/enable done 2> /dev/null } --- linux-azure-6.5.0.orig/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_non_uniq_symbol.tc +++ linux-azure-6.5.0/tools/testing/selftests/ftrace/test.d/kprobe/kprobe_non_uniq_symbol.tc @@ -0,0 +1,13 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# description: Test failure of registering kprobe on non unique symbol +# requires: kprobe_events + +SYMBOL='name_show' + +# We skip this test on kernel where SYMBOL is unique or does not exist. +if [ "$(grep -c -E "[[:alnum:]]+ t ${SYMBOL}" /proc/kallsyms)" -le '1' ]; then + exit_unsupported +fi + +! echo "p:test_non_unique ${SYMBOL}" > kprobe_events --- linux-azure-6.5.0.orig/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-dynstring.tc +++ linux-azure-6.5.0/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-dynstring.tc @@ -1,7 +1,7 @@ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # description: event trigger - test inter-event histogram trigger trace action with dynamic string param -# requires: set_event synthetic_events events/sched/sched_process_exec/hist "char name[]' >> synthetic_events":README ping:program +# requires: set_event synthetic_events events/sched/sched_process_exec/hist "' >> synthetic_events":README ping:program fail() { #msg echo $1 --- linux-azure-6.5.0.orig/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic_event_syntax_errors.tc +++ linux-azure-6.5.0/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic_event_syntax_errors.tc @@ -1,7 +1,7 @@ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # description: event trigger - test synthetic_events syntax parser errors -# requires: synthetic_events error_log "char name[]' >> synthetic_events":README +# requires: synthetic_events error_log "' >> synthetic_events":README check_error() { # command-with-error-pos-by-^ ftrace_errlog_check 'synthetic_events' "$1" 'synthetic_events' --- linux-azure-6.5.0.orig/tools/testing/selftests/ftrace/test.d/trigger/trigger-trace-marker-snapshot.tc +++ linux-azure-6.5.0/tools/testing/selftests/ftrace/test.d/trigger/trigger-trace-marker-snapshot.tc @@ -14,12 +14,12 @@ x=$2 cat $file | while read line; do - comment=`echo $line | sed -e 's/^#//'` + comment=`echo "$line" | sed -e 's/^#//'` if [ "$line" != "$comment" ]; then continue fi echo "testing $line for >$x<" - match=`echo $line | sed -e "s/>$x$x$x< in it" fi --- linux-azure-6.5.0.orig/tools/testing/selftests/futex/functional/futex_wait_timeout.c +++ linux-azure-6.5.0/tools/testing/selftests/futex/functional/futex_wait_timeout.c @@ -24,6 +24,7 @@ static long timeout_ns = 100000; /* 100us default timeout */ static futex_t futex_pi; +static pthread_barrier_t barrier; void usage(char *prog) { @@ -48,6 +49,8 @@ if (ret != 0) error("futex_lock_pi failed\n", ret); + pthread_barrier_wait(&barrier); + /* Blocks forever */ ret = futex_wait(&lock, 0, NULL, 0); error("futex_wait failed\n", ret); @@ -130,6 +133,7 @@ basename(argv[0])); ksft_print_msg("\tArguments: timeout=%ldns\n", timeout_ns); + pthread_barrier_init(&barrier, NULL, 2); pthread_create(&thread, NULL, get_pi_lock, NULL); /* initialize relative timeout */ @@ -163,6 +167,9 @@ res = futex_wait_requeue_pi(&f1, f1, &futex_pi, &to, 0); test_timeout(res, &ret, "futex_wait_requeue_pi monotonic", ETIMEDOUT); + /* Wait until the other thread calls futex_lock_pi() */ + pthread_barrier_wait(&barrier); + pthread_barrier_destroy(&barrier); /* * FUTEX_LOCK_PI with CLOCK_REALTIME * Due to historical reasons, FUTEX_LOCK_PI supports only realtime --- linux-azure-6.5.0.orig/tools/testing/selftests/hid/config.common +++ linux-azure-6.5.0/tools/testing/selftests/hid/config.common @@ -46,7 +46,6 @@ CONFIG_CRYPTO_XXHASH=y CONFIG_DCB=y CONFIG_DEBUG_ATOMIC_SLEEP=y -CONFIG_DEBUG_CREDENTIALS=y CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y CONFIG_DEBUG_MEMORY_INIT=y CONFIG_DEFAULT_FQ_CODEL=y --- linux-azure-6.5.0.orig/tools/testing/selftests/kselftest/runner.sh +++ linux-azure-6.5.0/tools/testing/selftests/kselftest/runner.sh @@ -35,8 +35,9 @@ tap_timeout() { # Make sure tests will time out if utility is available. - if [ -x /usr/bin/timeout ] ; then - /usr/bin/timeout --foreground "$kselftest_timeout" $1 + if [ -x /usr/bin/timeout ] && [ $kselftest_timeout -gt 0 ] ; then + /usr/bin/timeout --foreground "$kselftest_timeout" \ + /usr/bin/timeout "$kselftest_timeout" $1 else $1 fi --- linux-azure-6.5.0.orig/tools/testing/selftests/kselftest_deps.sh +++ linux-azure-6.5.0/tools/testing/selftests/kselftest_deps.sh @@ -46,11 +46,11 @@ print_targets=0 while getopts "p" arg; do - case $arg in - p) + case $arg in + p) print_targets=1 shift;; - esac + esac done if [ $# -eq 0 ] @@ -92,6 +92,10 @@ # Get all TARGETS from selftests Makefile targets=$(grep -E "^TARGETS +|^TARGETS =" Makefile | cut -d "=" -f2) +# Initially, in LDLIBS related lines, the dep checker needs +# to ignore lines containing the following strings: +filter="\$(VAR_LDLIBS)\|pkg-config\|PKG_CONFIG\|IOURING_EXTRA_LIBS" + # Single test case if [ $# -eq 2 ] then @@ -100,6 +104,8 @@ l1_test $test l2_test $test l3_test $test + l4_test $test + l5_test $test print_results $1 $2 exit $? @@ -113,7 +119,7 @@ # Append space at the end of the list to append more tests. l1_tests=$(grep -r --include=Makefile "^LDLIBS" | \ - grep -v "VAR_LDLIBS" | awk -F: '{print $1}') + grep -v "$filter" | awk -F: '{print $1}' | uniq) # Level 2: LDLIBS set dynamically. # @@ -126,7 +132,7 @@ # Append space at the end of the list to append more tests. l2_tests=$(grep -r --include=Makefile ": LDLIBS" | \ - grep -v "VAR_LDLIBS" | awk -F: '{print $1}') + grep -v "$filter" | awk -F: '{print $1}' | uniq) # Level 3 # memfd and others use pkg-config to find mount and fuse libs @@ -138,11 +144,32 @@ # VAR_LDLIBS := $(shell pkg-config fuse --libs 2>/dev/null) l3_tests=$(grep -r --include=Makefile "^VAR_LDLIBS" | \ - grep -v "pkg-config" | awk -F: '{print $1}') + grep -v "pkg-config\|PKG_CONFIG" | awk -F: '{print $1}' | uniq) -#echo $l1_tests -#echo $l2_1_tests -#echo $l3_tests +# Level 4 +# some tests may fall back to default using `|| echo -l` +# if pkg-config doesn't find the libs, instead of using VAR_LDLIBS +# as per level 3 checks. +# e.g: +# netfilter/Makefile +# LDLIBS += $(shell $(HOSTPKG_CONFIG) --libs libmnl 2>/dev/null || echo -lmnl) +l4_tests=$(grep -r --include=Makefile "^LDLIBS" | \ + grep "pkg-config\|PKG_CONFIG" | awk -F: '{print $1}' | uniq) + +# Level 5 +# some tests may use IOURING_EXTRA_LIBS to add extra libs to LDLIBS, +# which in turn may be defined in a sub-Makefile +# e.g.: +# mm/Makefile +# $(OUTPUT)/gup_longterm: LDLIBS += $(IOURING_EXTRA_LIBS) +l5_tests=$(grep -r --include=Makefile "LDLIBS +=.*\$(IOURING_EXTRA_LIBS)" | \ + awk -F: '{print $1}' | uniq) + +#echo l1_tests $l1_tests +#echo l2_tests $l2_tests +#echo l3_tests $l3_tests +#echo l4_tests $l4_tests +#echo l5_tests $l5_tests all_tests print_results $1 $2 @@ -164,24 +191,32 @@ for test in $l3_tests; do l3_test $test done + + for test in $l4_tests; do + l4_test $test + done + + for test in $l5_tests; do + l5_test $test + done } # Use same parsing used for l1_tests and pick libraries this time. l1_test() { test_libs=$(grep --include=Makefile "^LDLIBS" $test | \ - grep -v "VAR_LDLIBS" | \ + grep -v "$filter" | \ sed -e 's/\:/ /' | \ sed -e 's/+/ /' | cut -d "=" -f 2) check_libs $test $test_libs } -# Use same parsing used for l2__tests and pick libraries this time. +# Use same parsing used for l2_tests and pick libraries this time. l2_test() { test_libs=$(grep --include=Makefile ": LDLIBS" $test | \ - grep -v "VAR_LDLIBS" | \ + grep -v "$filter" | \ sed -e 's/\:/ /' | sed -e 's/+/ /' | \ cut -d "=" -f 2) @@ -196,6 +231,24 @@ check_libs $test $test_libs } + +l4_test() +{ + test_libs=$(grep --include=Makefile "^VAR_LDLIBS\|^LDLIBS" $test | \ + grep "\(pkg-config\|PKG_CONFIG\).*|| echo " | \ + sed -e 's/.*|| echo //' | sed -e 's/)$//') + + check_libs $test $test_libs +} + +l5_test() +{ + tests=$(find $(dirname "$test") -type f -name "*.mk") + test_libs=$(grep "^IOURING_EXTRA_LIBS +\?=" $tests | \ + cut -d "=" -f 2) + + check_libs $test $test_libs +} check_libs() { --- linux-azure-6.5.0.orig/tools/testing/selftests/kselftest_harness.h +++ linux-azure-6.5.0/tools/testing/selftests/kselftest_harness.h @@ -938,7 +938,11 @@ fprintf(TH_LOG_STREAM, "# %s: Test terminated by timeout\n", t->name); } else if (WIFEXITED(status)) { - if (t->termsig != -1) { + if (WEXITSTATUS(status) == 255) { + /* SKIP */ + t->passed = 1; + t->skip = 1; + } else if (t->termsig != -1) { t->passed = 0; fprintf(TH_LOG_STREAM, "# %s: Test exited normally instead of by signal (code: %d)\n", @@ -950,11 +954,6 @@ case 0: t->passed = 1; break; - /* SKIP */ - case 255: - t->passed = 1; - t->skip = 1; - break; /* Other failure, assume step report. */ default: t->passed = 0; --- linux-azure-6.5.0.orig/tools/testing/selftests/kvm/Makefile +++ linux-azure-6.5.0/tools/testing/selftests/kvm/Makefile @@ -166,6 +166,7 @@ TEST_GEN_PROGS_s390x += s390x/sync_regs_test TEST_GEN_PROGS_s390x += s390x/tprot TEST_GEN_PROGS_s390x += s390x/cmma_test +TEST_GEN_PROGS_s390x += s390x/debug_test TEST_GEN_PROGS_s390x += demand_paging_test TEST_GEN_PROGS_s390x += dirty_log_test TEST_GEN_PROGS_s390x += kvm_create_max_vcpus --- linux-azure-6.5.0.orig/tools/testing/selftests/kvm/s390x/debug_test.c +++ linux-azure-6.5.0/tools/testing/selftests/kvm/s390x/debug_test.c @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Test KVM debugging features. */ +#include "kvm_util.h" +#include "test_util.h" + +#include + +#define __LC_SVC_NEW_PSW 0x1c0 +#define __LC_PGM_NEW_PSW 0x1d0 +#define ICPT_INSTRUCTION 0x04 +#define IPA0_DIAG 0x8300 +#define PGM_SPECIFICATION 0x06 + +/* Common code for testing single-stepping interruptions. */ +extern char int_handler[]; +asm("int_handler:\n" + "j .\n"); + +static struct kvm_vm *test_step_int_1(struct kvm_vcpu **vcpu, void *guest_code, + size_t new_psw_off, uint64_t *new_psw) +{ + struct kvm_guest_debug debug = {}; + struct kvm_regs regs; + struct kvm_vm *vm; + char *lowcore; + + vm = vm_create_with_one_vcpu(vcpu, guest_code); + lowcore = addr_gpa2hva(vm, 0); + new_psw[0] = (*vcpu)->run->psw_mask; + new_psw[1] = (uint64_t)int_handler; + memcpy(lowcore + new_psw_off, new_psw, 16); + vcpu_regs_get(*vcpu, ®s); + regs.gprs[2] = -1; + vcpu_regs_set(*vcpu, ®s); + debug.control = KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_SINGLESTEP; + vcpu_guest_debug_set(*vcpu, &debug); + vcpu_run(*vcpu); + + return vm; +} + +static void test_step_int(void *guest_code, size_t new_psw_off) +{ + struct kvm_vcpu *vcpu; + uint64_t new_psw[2]; + struct kvm_vm *vm; + + vm = test_step_int_1(&vcpu, guest_code, new_psw_off, new_psw); + TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_DEBUG); + TEST_ASSERT_EQ(vcpu->run->psw_mask, new_psw[0]); + TEST_ASSERT_EQ(vcpu->run->psw_addr, new_psw[1]); + kvm_vm_free(vm); +} + +/* Test single-stepping "boring" program interruptions. */ +extern char test_step_pgm_guest_code[]; +asm("test_step_pgm_guest_code:\n" + ".insn rr,0x1d00,%r1,%r0 /* dr %r1,%r0 */\n" + "j .\n"); + +static void test_step_pgm(void) +{ + test_step_int(test_step_pgm_guest_code, __LC_PGM_NEW_PSW); +} + +/* + * Test single-stepping program interruptions caused by DIAG. + * Userspace emulation must not interfere with single-stepping. + */ +extern char test_step_pgm_diag_guest_code[]; +asm("test_step_pgm_diag_guest_code:\n" + "diag %r0,%r0,0\n" + "j .\n"); + +static void test_step_pgm_diag(void) +{ + struct kvm_s390_irq irq = { + .type = KVM_S390_PROGRAM_INT, + .u.pgm.code = PGM_SPECIFICATION, + }; + struct kvm_vcpu *vcpu; + uint64_t new_psw[2]; + struct kvm_vm *vm; + + vm = test_step_int_1(&vcpu, test_step_pgm_diag_guest_code, + __LC_PGM_NEW_PSW, new_psw); + TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_S390_SIEIC); + TEST_ASSERT_EQ(vcpu->run->s390_sieic.icptcode, ICPT_INSTRUCTION); + TEST_ASSERT_EQ(vcpu->run->s390_sieic.ipa & 0xff00, IPA0_DIAG); + vcpu_ioctl(vcpu, KVM_S390_IRQ, &irq); + vcpu_run(vcpu); + TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_DEBUG); + TEST_ASSERT_EQ(vcpu->run->psw_mask, new_psw[0]); + TEST_ASSERT_EQ(vcpu->run->psw_addr, new_psw[1]); + kvm_vm_free(vm); +} + +/* + * Test single-stepping program interruptions caused by ISKE. + * CPUSTAT_KSS handling must not interfere with single-stepping. + */ +extern char test_step_pgm_iske_guest_code[]; +asm("test_step_pgm_iske_guest_code:\n" + "iske %r2,%r2\n" + "j .\n"); + +static void test_step_pgm_iske(void) +{ + test_step_int(test_step_pgm_iske_guest_code, __LC_PGM_NEW_PSW); +} + +/* + * Test single-stepping program interruptions caused by LCTL. + * KVM emulation must not interfere with single-stepping. + */ +extern char test_step_pgm_lctl_guest_code[]; +asm("test_step_pgm_lctl_guest_code:\n" + "lctl %c0,%c0,1\n" + "j .\n"); + +static void test_step_pgm_lctl(void) +{ + test_step_int(test_step_pgm_lctl_guest_code, __LC_PGM_NEW_PSW); +} + +/* Test single-stepping supervisor-call interruptions. */ +extern char test_step_svc_guest_code[]; +asm("test_step_svc_guest_code:\n" + "svc 0\n" + "j .\n"); + +static void test_step_svc(void) +{ + test_step_int(test_step_svc_guest_code, __LC_SVC_NEW_PSW); +} + +/* Run all tests above. */ +static struct testdef { + const char *name; + void (*test)(void); +} testlist[] = { + { "single-step pgm", test_step_pgm }, + { "single-step pgm caused by diag", test_step_pgm_diag }, + { "single-step pgm caused by iske", test_step_pgm_iske }, + { "single-step pgm caused by lctl", test_step_pgm_lctl }, + { "single-step svc", test_step_svc }, +}; + +int main(int argc, char *argv[]) +{ + int idx; + + ksft_print_header(); + ksft_set_plan(ARRAY_SIZE(testlist)); + for (idx = 0; idx < ARRAY_SIZE(testlist); idx++) { + testlist[idx].test(); + ksft_test_result_pass("%s\n", testlist[idx].name); + } + ksft_finished(); +} --- linux-azure-6.5.0.orig/tools/testing/selftests/landlock/fs_test.c +++ linux-azure-6.5.0/tools/testing/selftests/landlock/fs_test.c @@ -113,7 +113,7 @@ { char str[32]; int len; - bool res; + bool res = true; FILE *const inf = fopen("/proc/filesystems", "r"); /* @@ -125,14 +125,16 @@ /* filesystem can be null for bind mounts. */ if (!filesystem) - return true; + goto out; len = snprintf(str, sizeof(str), "nodev\t%s\n", filesystem); if (len >= sizeof(str)) /* Ignores too-long filesystem names. */ - return true; + goto out; res = fgrep(inf, str); + +out: fclose(inf); return res; } --- linux-azure-6.5.0.orig/tools/testing/selftests/lib.mk +++ linux-azure-6.5.0/tools/testing/selftests/lib.mk @@ -44,26 +44,10 @@ selfdir = $(realpath $(dir $(filter %/lib.mk,$(MAKEFILE_LIST)))) top_srcdir = $(selfdir)/../../.. -ifeq ("$(origin O)", "command line") - KBUILD_OUTPUT := $(O) +ifeq ($(KHDR_INCLUDES),) +KHDR_INCLUDES := -isystem $(top_srcdir)/usr/include endif -ifneq ($(KBUILD_OUTPUT),) - # Make's built-in functions such as $(abspath ...), $(realpath ...) cannot - # expand a shell special character '~'. We use a somewhat tedious way here. - abs_objtree := $(shell cd $(top_srcdir) && mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) && pwd) - $(if $(abs_objtree),, \ - $(error failed to create output directory "$(KBUILD_OUTPUT)")) - # $(realpath ...) resolves symlinks - abs_objtree := $(realpath $(abs_objtree)) - KHDR_DIR := ${abs_objtree}/usr/include -else - abs_srctree := $(shell cd $(top_srcdir) && pwd) - KHDR_DIR := ${abs_srctree}/usr/include -endif - -KHDR_INCLUDES := -isystem $(KHDR_DIR) - # The following are built by lib.mk common compile rules. # TEST_CUSTOM_PROGS should be used by tests that require # custom build rule and prevent common build rule use. @@ -74,25 +58,7 @@ TEST_GEN_PROGS_EXTENDED := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_PROGS_EXTENDED)) TEST_GEN_FILES := $(patsubst %,$(OUTPUT)/%,$(TEST_GEN_FILES)) -all: kernel_header_files $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) \ - $(TEST_GEN_FILES) - -kernel_header_files: - @ls $(KHDR_DIR)/linux/*.h >/dev/null 2>/dev/null; \ - if [ $$? -ne 0 ]; then \ - RED='\033[1;31m'; \ - NOCOLOR='\033[0m'; \ - echo; \ - echo -e "$${RED}error$${NOCOLOR}: missing kernel header files."; \ - echo "Please run this and try again:"; \ - echo; \ - echo " cd $(top_srcdir)"; \ - echo " make headers"; \ - echo; \ - exit 1; \ - fi - -.PHONY: kernel_header_files +all: $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) define RUN_TESTS BASE_DIR="$(selfdir)"; \ @@ -106,7 +72,7 @@ run_tests: all ifdef building_out_of_srctree @if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then \ - rsync -aLq $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT); \ + rsync -aq --copy-unsafe-links $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(OUTPUT); \ fi @if [ "X$(TEST_PROGS)" != "X" ]; then \ $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) \ @@ -120,7 +86,7 @@ define INSTALL_SINGLE_RULE $(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH)) - $(if $(INSTALL_LIST),rsync -aL $(INSTALL_LIST) $(INSTALL_PATH)/) + $(if $(INSTALL_LIST),rsync -a --copy-unsafe-links $(INSTALL_LIST) $(INSTALL_PATH)/) endef define INSTALL_RULE --- linux-azure-6.5.0.orig/tools/testing/selftests/lkdtm/config +++ linux-azure-6.5.0/tools/testing/selftests/lkdtm/config @@ -9,7 +9,6 @@ CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y CONFIG_UBSAN=y CONFIG_UBSAN_BOUNDS=y -CONFIG_UBSAN_TRAP=y CONFIG_STACKPROTECTOR_STRONG=y CONFIG_SLUB_DEBUG=y CONFIG_SLUB_DEBUG_ON=y --- linux-azure-6.5.0.orig/tools/testing/selftests/lkdtm/tests.txt +++ linux-azure-6.5.0/tools/testing/selftests/lkdtm/tests.txt @@ -7,7 +7,7 @@ #EXHAUST_STACK Corrupts memory on failure #CORRUPT_STACK Crashes entire system on success #CORRUPT_STACK_STRONG Crashes entire system on success -ARRAY_BOUNDS +ARRAY_BOUNDS call trace:|UBSAN: array-index-out-of-bounds CORRUPT_LIST_ADD list_add corruption CORRUPT_LIST_DEL list_del corruption STACK_GUARD_PAGE_LEADING --- linux-azure-6.5.0.orig/tools/testing/selftests/memfd/memfd_test.c +++ linux-azure-6.5.0/tools/testing/selftests/memfd/memfd_test.c @@ -1145,8 +1145,25 @@ printf("%s sysctl 2\n", memfd_str); sysctl_assert_write("2"); - mfd_fail_new("kern_memfd_sysctl_2", - MFD_CLOEXEC | MFD_ALLOW_SEALING); + mfd_fail_new("kern_memfd_sysctl_2_exec", + MFD_EXEC | MFD_CLOEXEC | MFD_ALLOW_SEALING); + + fd = mfd_assert_new("kern_memfd_sysctl_2_dfl", + mfd_def_size, + MFD_CLOEXEC | MFD_ALLOW_SEALING); + mfd_assert_mode(fd, 0666); + mfd_assert_has_seals(fd, F_SEAL_EXEC); + mfd_fail_chmod(fd, 0777); + close(fd); + + fd = mfd_assert_new("kern_memfd_sysctl_2_noexec_seal", + mfd_def_size, + MFD_NOEXEC_SEAL | MFD_CLOEXEC | MFD_ALLOW_SEALING); + mfd_assert_mode(fd, 0666); + mfd_assert_has_seals(fd, F_SEAL_EXEC); + mfd_fail_chmod(fd, 0777); + close(fd); + sysctl_fail_write("0"); sysctl_fail_write("1"); } @@ -1202,7 +1219,24 @@ static void join_newpid_thread(pid_t pid) { - waitpid(pid, NULL, 0); + int wstatus; + + if (waitpid(pid, &wstatus, 0) < 0) { + printf("newpid thread: waitpid() failed: %m\n"); + abort(); + } + + if (WIFEXITED(wstatus) && WEXITSTATUS(wstatus) != 0) { + printf("newpid thread: exited with non-zero error code %d\n", + WEXITSTATUS(wstatus)); + abort(); + } + + if (WIFSIGNALED(wstatus)) { + printf("newpid thread: killed by signal %d\n", + WTERMSIG(wstatus)); + abort(); + } } /* --- linux-azure-6.5.0.orig/tools/testing/selftests/memory-hotplug/settings +++ linux-azure-6.5.0/tools/testing/selftests/memory-hotplug/settings @@ -0,0 +1 @@ +timeout=600 --- linux-azure-6.5.0.orig/tools/testing/selftests/mm/charge_reserved_hugetlb.sh +++ linux-azure-6.5.0/tools/testing/selftests/mm/charge_reserved_hugetlb.sh @@ -25,7 +25,7 @@ fi if [[ $cgroup2 ]]; then - cgroup_path=$(mount -t cgroup2 | head -1 | awk -e '{print $3}') + cgroup_path=$(mount -t cgroup2 | head -1 | awk '{print $3}') if [[ -z "$cgroup_path" ]]; then cgroup_path=/dev/cgroup/memory mount -t cgroup2 none $cgroup_path @@ -33,7 +33,7 @@ fi echo "+hugetlb" >$cgroup_path/cgroup.subtree_control else - cgroup_path=$(mount -t cgroup | grep ",hugetlb" | awk -e '{print $3}') + cgroup_path=$(mount -t cgroup | grep ",hugetlb" | awk '{print $3}') if [[ -z "$cgroup_path" ]]; then cgroup_path=/dev/cgroup/memory mount -t cgroup memory,hugetlb $cgroup_path --- linux-azure-6.5.0.orig/tools/testing/selftests/mm/cow.c +++ linux-azure-6.5.0/tools/testing/selftests/mm/cow.c @@ -1680,6 +1680,8 @@ { int err; + ksft_print_header(); + pagesize = getpagesize(); thpsize = read_pmd_pagesize(); if (thpsize) @@ -1689,7 +1691,6 @@ ARRAY_SIZE(hugetlbsizes)); detect_huge_zeropage(); - ksft_print_header(); ksft_set_plan(ARRAY_SIZE(anon_test_cases) * tests_per_anon_test_case() + ARRAY_SIZE(anon_thp_test_cases) * tests_per_anon_thp_test_case() + ARRAY_SIZE(non_anon_test_cases) * tests_per_non_anon_test_case()); --- linux-azure-6.5.0.orig/tools/testing/selftests/mm/hugetlb_reparenting_test.sh +++ linux-azure-6.5.0/tools/testing/selftests/mm/hugetlb_reparenting_test.sh @@ -20,7 +20,7 @@ if [[ $cgroup2 ]]; then - CGROUP_ROOT=$(mount -t cgroup2 | head -1 | awk -e '{print $3}') + CGROUP_ROOT=$(mount -t cgroup2 | head -1 | awk '{print $3}') if [[ -z "$CGROUP_ROOT" ]]; then CGROUP_ROOT=/dev/cgroup/memory mount -t cgroup2 none $CGROUP_ROOT @@ -28,7 +28,7 @@ fi echo "+hugetlb +memory" >$CGROUP_ROOT/cgroup.subtree_control else - CGROUP_ROOT=$(mount -t cgroup | grep ",hugetlb" | awk -e '{print $3}') + CGROUP_ROOT=$(mount -t cgroup | grep ",hugetlb" | awk '{print $3}') if [[ -z "$CGROUP_ROOT" ]]; then CGROUP_ROOT=/dev/cgroup/memory mount -t cgroup memory,hugetlb $CGROUP_ROOT --- linux-azure-6.5.0.orig/tools/testing/selftests/mm/mdwe_test.c +++ linux-azure-6.5.0/tools/testing/selftests/mm/mdwe_test.c @@ -168,13 +168,10 @@ self->p = mmap(NULL, self->size, PROT_READ, self->flags, 0, 0); ASSERT_NE(self->p, MAP_FAILED); - p = mmap(self->p + self->size, self->size, PROT_READ | PROT_EXEC, + /* MAP_FIXED unmaps the existing page before mapping which is allowed */ + p = mmap(self->p, self->size, PROT_READ | PROT_EXEC, self->flags | MAP_FIXED, 0, 0); - if (variant->enabled) { - EXPECT_EQ(p, MAP_FAILED); - } else { - EXPECT_EQ(p, self->p); - } + EXPECT_EQ(p, self->p); } TEST_F(mdwe, arm64_BTI) --- linux-azure-6.5.0.orig/tools/testing/selftests/mm/memfd_secret.c +++ linux-azure-6.5.0/tools/testing/selftests/mm/memfd_secret.c @@ -62,6 +62,9 @@ char *mem; len = mlock_limit_cur; + if (len % page_size != 0) + len = (len/page_size) * page_size; + mem = mmap(NULL, len, prot, mode, fd, 0); if (mem == MAP_FAILED) { fail("unable to mmap secret memory\n"); --- linux-azure-6.5.0.orig/tools/testing/selftests/mm/mremap_dontunmap.c +++ linux-azure-6.5.0/tools/testing/selftests/mm/mremap_dontunmap.c @@ -7,6 +7,7 @@ */ #define _GNU_SOURCE #include +#include #include #include #include --- linux-azure-6.5.0.orig/tools/testing/selftests/net/af_unix/diag_uid.c +++ linux-azure-6.5.0/tools/testing/selftests/net/af_unix/diag_uid.c @@ -148,7 +148,6 @@ .msg_iov = &iov, .msg_iovlen = 1 }; - struct unix_diag_req *udr; struct nlmsghdr *nlh; int ret; --- linux-azure-6.5.0.orig/tools/testing/selftests/net/bind_wildcard.c +++ linux-azure-6.5.0/tools/testing/selftests/net/bind_wildcard.c @@ -100,7 +100,7 @@ TEST_F(bind_wildcard, v4_v6) { bind_sockets(_metadata, self, - (struct sockaddr *)&self->addr4, sizeof(self->addr6), + (struct sockaddr *)&self->addr4, sizeof(self->addr4), (struct sockaddr *)&self->addr6, sizeof(self->addr6)); } --- linux-azure-6.5.0.orig/tools/testing/selftests/net/cmsg_sender.c +++ linux-azure-6.5.0/tools/testing/selftests/net/cmsg_sender.c @@ -416,9 +416,9 @@ { struct addrinfo hints, *ai; struct iovec iov[1]; + unsigned char *buf; struct msghdr msg; char cbuf[1024]; - char *buf; int err; int fd; --- linux-azure-6.5.0.orig/tools/testing/selftests/net/fib_rule_tests.sh +++ linux-azure-6.5.0/tools/testing/selftests/net/fib_rule_tests.sh @@ -92,6 +92,8 @@ $IP address add $DEV_ADDR/24 dev dummy0 $IP -6 address add $DEV_ADDR6/64 dev dummy0 + ip netns exec testns sysctl -w net.ipv4.ip_forward=1 + set +e } --- linux-azure-6.5.0.orig/tools/testing/selftests/net/ipsec.c +++ linux-azure-6.5.0/tools/testing/selftests/net/ipsec.c @@ -2263,7 +2263,7 @@ int main(int argc, char **argv) { - unsigned int nr_process = 1; + long nr_process = 1; int route_sock = -1, ret = KSFT_SKIP; int test_desc_fd[2]; uint32_t route_seq; @@ -2284,7 +2284,7 @@ exit_usage(argv); } - if (nr_process > MAX_PROCESSES || !nr_process) { + if (nr_process > MAX_PROCESSES || nr_process < 1) { printk("nr_process should be between [1; %u]", MAX_PROCESSES); exit_usage(argv); --- linux-azure-6.5.0.orig/tools/testing/selftests/net/mptcp/mptcp_connect.c +++ linux-azure-6.5.0/tools/testing/selftests/net/mptcp/mptcp_connect.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -1125,15 +1126,11 @@ static void init_rng(void) { - int fd = open("/dev/urandom", O_RDONLY); unsigned int foo; - if (fd > 0) { - int ret = read(fd, &foo, sizeof(foo)); - - if (ret < 0) - srand(fd + foo); - close(fd); + if (getrandom(&foo, sizeof(foo), 0) == -1) { + perror("getrandom"); + exit(1); } srand(foo); --- linux-azure-6.5.0.orig/tools/testing/selftests/net/mptcp/mptcp_inq.c +++ linux-azure-6.5.0/tools/testing/selftests/net/mptcp/mptcp_inq.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -519,15 +520,11 @@ static void init_rng(void) { - int fd = open("/dev/urandom", O_RDONLY); unsigned int foo; - if (fd > 0) { - int ret = read(fd, &foo, sizeof(foo)); - - if (ret < 0) - srand(fd + foo); - close(fd); + if (getrandom(&foo, sizeof(foo), 0) == -1) { + perror("getrandom"); + exit(1); } srand(foo); --- linux-azure-6.5.0.orig/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ linux-azure-6.5.0/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -1383,7 +1383,9 @@ count=$(get_counter ${ns_tx} "MPTcpExtMPRstTx") if [ -z "$count" ]; then echo -n "[skip]" - elif [ $count -lt $rst_tx ]; then + # accept more rst than expected except if we don't expect any + elif { [ $rst_tx -ne 0 ] && [ $count -lt $rst_tx ]; } || + { [ $rst_tx -eq 0 ] && [ $count -ne 0 ]; }; then echo "[fail] got $count MP_RST[s] TX expected $rst_tx" fail_test else @@ -1394,7 +1396,9 @@ count=$(get_counter ${ns_rx} "MPTcpExtMPRstRx") if [ -z "$count" ]; then echo -n "[skip]" - elif [ "$count" -lt "$rst_rx" ]; then + # accept more rst than expected except if we don't expect any + elif { [ $rst_rx -ne 0 ] && [ $count -lt $rst_rx ]; } || + { [ $rst_rx -eq 0 ] && [ $count -ne 0 ]; }; then echo "[fail] got $count MP_RST[s] RX expected $rst_rx" fail_test else @@ -2282,6 +2286,7 @@ chk_join_nr 1 1 1 chk_rm_tx_nr 1 chk_rm_nr 1 1 + chk_rst_nr 0 0 fi # multiple subflows, remove @@ -2294,6 +2299,7 @@ run_tests $ns1 $ns2 10.0.1.1 slow chk_join_nr 2 2 2 chk_rm_nr 2 2 + chk_rst_nr 0 0 fi # single address, remove @@ -2306,6 +2312,7 @@ chk_join_nr 1 1 1 chk_add_nr 1 1 chk_rm_nr 1 1 invert + chk_rst_nr 0 0 fi # subflow and signal, remove @@ -2319,6 +2326,7 @@ chk_join_nr 2 2 2 chk_add_nr 1 1 chk_rm_nr 1 1 + chk_rst_nr 0 0 fi # subflows and signal, remove @@ -2333,6 +2341,7 @@ chk_join_nr 3 3 3 chk_add_nr 1 1 chk_rm_nr 2 2 + chk_rst_nr 0 0 fi # addresses remove @@ -2347,6 +2356,7 @@ chk_join_nr 3 3 3 chk_add_nr 3 3 chk_rm_nr 3 3 invert + chk_rst_nr 0 0 fi # invalid addresses remove @@ -2361,6 +2371,7 @@ chk_join_nr 1 1 1 chk_add_nr 3 3 chk_rm_nr 3 1 invert + chk_rst_nr 0 0 fi # subflows and signal, flush @@ -2375,6 +2386,7 @@ chk_join_nr 3 3 3 chk_add_nr 1 1 chk_rm_nr 1 3 invert simult + chk_rst_nr 0 0 fi # subflows flush @@ -2394,6 +2406,7 @@ else chk_rm_nr 3 3 fi + chk_rst_nr 0 0 fi # addresses flush @@ -2408,6 +2421,7 @@ chk_join_nr 3 3 3 chk_add_nr 3 3 chk_rm_nr 3 3 invert simult + chk_rst_nr 0 0 fi # invalid addresses flush @@ -2422,6 +2436,7 @@ chk_join_nr 1 1 1 chk_add_nr 3 3 chk_rm_nr 3 1 invert + chk_rst_nr 0 0 fi # remove id 0 subflow @@ -2433,6 +2448,7 @@ run_tests $ns1 $ns2 10.0.1.1 slow chk_join_nr 1 1 1 chk_rm_nr 1 1 + chk_rst_nr 0 0 fi # remove id 0 address @@ -2445,6 +2461,7 @@ chk_join_nr 1 1 1 chk_add_nr 1 1 chk_rm_nr 1 1 invert + chk_rst_nr 0 0 invert fi } @@ -2727,7 +2744,7 @@ fi if reset "mpc backup" && - continue_if mptcp_lib_kallsyms_doesnt_have "mptcp_subflow_send_ack$"; then + continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup run_tests $ns1 $ns2 10.0.1.1 slow chk_join_nr 0 0 0 @@ -2735,7 +2752,7 @@ fi if reset "mpc backup both sides" && - continue_if mptcp_lib_kallsyms_doesnt_have "mptcp_subflow_send_ack$"; then + continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then pm_nl_add_endpoint $ns1 10.0.1.1 flags subflow,backup pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow,backup run_tests $ns1 $ns2 10.0.1.1 slow @@ -2744,7 +2761,7 @@ fi if reset "mpc switch to backup" && - continue_if mptcp_lib_kallsyms_doesnt_have "mptcp_subflow_send_ack$"; then + continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow sflags=backup \ run_tests $ns1 $ns2 10.0.1.1 slow @@ -2753,7 +2770,7 @@ fi if reset "mpc switch to backup both sides" && - continue_if mptcp_lib_kallsyms_doesnt_have "mptcp_subflow_send_ack$"; then + continue_if mptcp_lib_kallsyms_doesnt_have "T mptcp_subflow_send_ack$"; then pm_nl_add_endpoint $ns1 10.0.1.1 flags subflow pm_nl_add_endpoint $ns2 10.0.1.2 flags subflow sflags=backup \ @@ -3190,7 +3207,7 @@ if reset_check_counter "fastclose server test" "MPTcpExtMPFastcloseRx"; then test_linkfail=1024 addr_nr_ns2=fastclose_server \ run_tests $ns1 $ns2 10.0.1.1 - chk_join_nr 0 0 0 + chk_join_nr 0 0 0 0 0 0 1 chk_fclose_nr 1 1 invert chk_rst_nr 1 1 fi @@ -3242,6 +3259,7 @@ local addr=$1 local id=$2 local tk sp da dp + local cnt_addr cnt_sf tk=$(grep "type:1," "$evts_ns1" | sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q') @@ -3251,11 +3269,13 @@ sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q') dp=$(grep "type:10" "$evts_ns1" | sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q') + cnt_addr=$(rm_addr_count ${ns1}) + cnt_sf=$(rm_sf_count ${ns1}) ip netns exec $ns1 ./pm_nl_ctl rem token $tk id $id ip netns exec $ns1 ./pm_nl_ctl dsf lip "::ffff:$addr" \ lport $sp rip $da rport $dp token $tk - wait_rm_addr $ns1 1 - wait_rm_sf $ns1 1 + wait_rm_addr $ns1 "${cnt_addr}" + wait_rm_sf $ns1 "${cnt_sf}" } userspace_pm_add_sf() @@ -3277,17 +3297,20 @@ local addr=$1 local id=$2 local tk da dp sp + local cnt_addr cnt_sf tk=$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns2") da=$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evts_ns2") dp=$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns2") sp=$(grep "type:10" "$evts_ns2" | sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q') + cnt_addr=$(rm_addr_count ${ns2}) + cnt_sf=$(rm_sf_count ${ns2}) ip netns exec $ns2 ./pm_nl_ctl rem token $tk id $id ip netns exec $ns2 ./pm_nl_ctl dsf lip $addr lport $sp \ rip $da rport $dp token $tk - wait_rm_addr $ns2 1 - wait_rm_sf $ns2 1 + wait_rm_addr $ns2 "${cnt_addr}" + wait_rm_sf $ns2 "${cnt_sf}" } userspace_tests() --- linux-azure-6.5.0.orig/tools/testing/selftests/net/openvswitch/openvswitch.sh +++ linux-azure-6.5.0/tools/testing/selftests/net/openvswitch/openvswitch.sh @@ -3,6 +3,8 @@ # # OVS kernel module self tests +trap ovs_exit_sig EXIT TERM INT ERR + # Kselftest framework requirement - SKIP code is 4. ksft_skip=4 @@ -202,7 +204,7 @@ fi if python3 ovs-dpctl.py -h 2>&1 | \ - grep "Need to install the python" >/dev/null 2>&1; then + grep -E "Need to (install|upgrade) the python" >/dev/null 2>&1; then stdbuf -o0 printf "TEST: %-60s [PYLIB]\n" "${tdesc}" return $ksft_skip fi --- linux-azure-6.5.0.orig/tools/testing/selftests/net/openvswitch/ovs-dpctl.py +++ linux-azure-6.5.0/tools/testing/selftests/net/openvswitch/ovs-dpctl.py @@ -25,8 +25,10 @@ from pyroute2.netlink import nlmsg_atoms from pyroute2.netlink.exceptions import NetlinkError from pyroute2.netlink.generic import GenericNetlinkSocket + import pyroute2 + except ModuleNotFoundError: - print("Need to install the python pyroute2 package.") + print("Need to install the python pyroute2 package >= 0.6.") sys.exit(0) @@ -732,12 +734,14 @@ "src", lambda x: str(ipaddress.IPv4Address(x)), int, + convert_ipv4, ), ( "dst", "dst", - lambda x: str(ipaddress.IPv6Address(x)), + lambda x: str(ipaddress.IPv4Address(x)), int, + convert_ipv4, ), ("tp_src", "tp_src", "%d", int), ("tp_dst", "tp_dst", "%d", int), @@ -1457,6 +1461,12 @@ nlmsg_atoms.ovskey = ovskey nlmsg_atoms.ovsactions = ovsactions + # version check for pyroute2 + prverscheck = pyroute2.__version__.split(".") + if int(prverscheck[0]) == 0 and int(prverscheck[1]) < 6: + print("Need to upgrade the python pyroute2 package to >= 0.6.") + sys.exit(0) + parser = argparse.ArgumentParser() parser.add_argument( "-v", --- linux-azure-6.5.0.orig/tools/testing/selftests/net/pmtu.sh +++ linux-azure-6.5.0/tools/testing/selftests/net/pmtu.sh @@ -2048,7 +2048,7 @@ case $ret in 0) all_skipped=false - [ $exitcode=$ksft_skip ] && exitcode=0 + [ $exitcode -eq $ksft_skip ] && exitcode=0 ;; $ksft_skip) [ $all_skipped = true ] && exitcode=$ksft_skip --- linux-azure-6.5.0.orig/tools/testing/selftests/net/settings +++ linux-azure-6.5.0/tools/testing/selftests/net/settings @@ -1 +1 @@ -timeout=1500 +timeout=0 --- linux-azure-6.5.0.orig/tools/testing/selftests/net/socket.c +++ linux-azure-6.5.0/tools/testing/selftests/net/socket.c @@ -6,6 +6,7 @@ #include #include #include +#include #include "../kselftest.h" @@ -26,7 +27,10 @@ }; static struct socket_testcase tests[] = { - { AF_MAX, 0, 0, -EAFNOSUPPORT, 0 }, + /* libc might have a smaller value of AF_MAX than the kernel + * actually supports, so use INT_MAX instead. + */ + { INT_MAX, 0, 0, -EAFNOSUPPORT, 0 }, { AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 1 }, { AF_INET, SOCK_DGRAM, IPPROTO_TCP, -EPROTONOSUPPORT, 1 }, { AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, 1 }, --- linux-azure-6.5.0.orig/tools/testing/selftests/net/tls.c +++ linux-azure-6.5.0/tools/testing/selftests/net/tls.c @@ -379,64 +379,6 @@ EXPECT_EQ(recv(self->cfd, buf, st.st_size, MSG_WAITALL), st.st_size); } -static void chunked_sendfile(struct __test_metadata *_metadata, - struct _test_data_tls *self, - uint16_t chunk_size, - uint16_t extra_payload_size) -{ - char buf[TLS_PAYLOAD_MAX_LEN]; - uint16_t test_payload_size; - int size = 0; - int ret; - char filename[] = "/tmp/mytemp.XXXXXX"; - int fd = mkstemp(filename); - off_t offset = 0; - - unlink(filename); - ASSERT_GE(fd, 0); - EXPECT_GE(chunk_size, 1); - test_payload_size = chunk_size + extra_payload_size; - ASSERT_GE(TLS_PAYLOAD_MAX_LEN, test_payload_size); - memset(buf, 1, test_payload_size); - size = write(fd, buf, test_payload_size); - EXPECT_EQ(size, test_payload_size); - fsync(fd); - - while (size > 0) { - ret = sendfile(self->fd, fd, &offset, chunk_size); - EXPECT_GE(ret, 0); - size -= ret; - } - - EXPECT_EQ(recv(self->cfd, buf, test_payload_size, MSG_WAITALL), - test_payload_size); - - close(fd); -} - -TEST_F(tls, multi_chunk_sendfile) -{ - chunked_sendfile(_metadata, self, 4096, 4096); - chunked_sendfile(_metadata, self, 4096, 0); - chunked_sendfile(_metadata, self, 4096, 1); - chunked_sendfile(_metadata, self, 4096, 2048); - chunked_sendfile(_metadata, self, 8192, 2048); - chunked_sendfile(_metadata, self, 4096, 8192); - chunked_sendfile(_metadata, self, 8192, 4096); - chunked_sendfile(_metadata, self, 12288, 1024); - chunked_sendfile(_metadata, self, 12288, 2000); - chunked_sendfile(_metadata, self, 15360, 100); - chunked_sendfile(_metadata, self, 15360, 300); - chunked_sendfile(_metadata, self, 1, 4096); - chunked_sendfile(_metadata, self, 2048, 4096); - chunked_sendfile(_metadata, self, 2048, 8192); - chunked_sendfile(_metadata, self, 4096, 8192); - chunked_sendfile(_metadata, self, 1024, 12288); - chunked_sendfile(_metadata, self, 2000, 12288); - chunked_sendfile(_metadata, self, 100, 15360); - chunked_sendfile(_metadata, self, 300, 15360); -} - TEST_F(tls, recv_max) { unsigned int send_len = TLS_PAYLOAD_MAX_LEN; @@ -552,11 +494,11 @@ msg.msg_iov = &vec; msg.msg_iovlen = 1; - EXPECT_EQ(sendmsg(self->cfd, &msg, 0), send_len); + EXPECT_EQ(sendmsg(self->fd, &msg, 0), send_len); } while (recvs++ < sends) { - EXPECT_NE(recv(self->fd, mem, send_len, 0), -1); + EXPECT_NE(recv(self->cfd, mem, send_len, 0), -1); } free(mem); @@ -585,9 +527,9 @@ msg.msg_iov = vec; msg.msg_iovlen = iov_len; - EXPECT_EQ(sendmsg(self->cfd, &msg, 0), total_len); + EXPECT_EQ(sendmsg(self->fd, &msg, 0), total_len); buf = malloc(total_len); - EXPECT_NE(recv(self->fd, buf, total_len, 0), -1); + EXPECT_NE(recv(self->cfd, buf, total_len, 0), -1); for (i = 0; i < iov_len; i++) { EXPECT_EQ(memcmp(test_strs[i], buf + len_cmp, strlen(test_strs[i])), --- linux-azure-6.5.0.orig/tools/testing/selftests/netfilter/Makefile +++ linux-azure-6.5.0/tools/testing/selftests/netfilter/Makefile @@ -6,13 +6,14 @@ nft_concat_range.sh nft_conntrack_helper.sh \ nft_queue.sh nft_meta.sh nf_nat_edemux.sh \ ipip-conntrack-mtu.sh conntrack_tcp_unreplied.sh \ - conntrack_vrf.sh nft_synproxy.sh rpath.sh + conntrack_vrf.sh nft_synproxy.sh rpath.sh nft_audit.sh \ + conntrack_sctp_collision.sh xt_string.sh HOSTPKG_CONFIG := pkg-config CFLAGS += $(shell $(HOSTPKG_CONFIG) --cflags libmnl 2>/dev/null) LDLIBS += $(shell $(HOSTPKG_CONFIG) --libs libmnl 2>/dev/null || echo -lmnl) -TEST_GEN_FILES = nf-queue connect_close +TEST_GEN_FILES = nf-queue connect_close audit_logread sctp_collision include ../lib.mk --- linux-azure-6.5.0.orig/tools/testing/selftests/netfilter/audit_logread.c +++ linux-azure-6.5.0/tools/testing/selftests/netfilter/audit_logread.c @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: GPL-2.0 + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int fd; + +#define MAX_AUDIT_MESSAGE_LENGTH 8970 +struct audit_message { + struct nlmsghdr nlh; + union { + struct audit_status s; + char data[MAX_AUDIT_MESSAGE_LENGTH]; + } u; +}; + +int audit_recv(int fd, struct audit_message *rep) +{ + struct sockaddr_nl addr; + socklen_t addrlen = sizeof(addr); + int ret; + + do { + ret = recvfrom(fd, rep, sizeof(*rep), 0, + (struct sockaddr *)&addr, &addrlen); + } while (ret < 0 && errno == EINTR); + + if (ret < 0 || + addrlen != sizeof(addr) || + addr.nl_pid != 0 || + rep->nlh.nlmsg_type == NLMSG_ERROR) /* short-cut for now */ + return -1; + + return ret; +} + +int audit_send(int fd, uint16_t type, uint32_t key, uint32_t val) +{ + static int seq = 0; + struct audit_message msg = { + .nlh = { + .nlmsg_len = NLMSG_SPACE(sizeof(msg.u.s)), + .nlmsg_type = type, + .nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK, + .nlmsg_seq = ++seq, + }, + .u.s = { + .mask = key, + .enabled = key == AUDIT_STATUS_ENABLED ? val : 0, + .pid = key == AUDIT_STATUS_PID ? val : 0, + } + }; + struct sockaddr_nl addr = { + .nl_family = AF_NETLINK, + }; + int ret; + + do { + ret = sendto(fd, &msg, msg.nlh.nlmsg_len, 0, + (struct sockaddr *)&addr, sizeof(addr)); + } while (ret < 0 && errno == EINTR); + + if (ret != (int)msg.nlh.nlmsg_len) + return -1; + return 0; +} + +int audit_set(int fd, uint32_t key, uint32_t val) +{ + struct audit_message rep = { 0 }; + int ret; + + ret = audit_send(fd, AUDIT_SET, key, val); + if (ret) + return ret; + + ret = audit_recv(fd, &rep); + if (ret < 0) + return ret; + return 0; +} + +int readlog(int fd) +{ + struct audit_message rep = { 0 }; + int ret = audit_recv(fd, &rep); + const char *sep = ""; + char *k, *v; + + if (ret < 0) + return ret; + + if (rep.nlh.nlmsg_type != AUDIT_NETFILTER_CFG) + return 0; + + /* skip the initial "audit(...): " part */ + strtok(rep.u.data, " "); + + while ((k = strtok(NULL, "="))) { + v = strtok(NULL, " "); + + /* these vary and/or are uninteresting, ignore */ + if (!strcmp(k, "pid") || + !strcmp(k, "comm") || + !strcmp(k, "subj")) + continue; + + /* strip the varying sequence number */ + if (!strcmp(k, "table")) + *strchrnul(v, ':') = '\0'; + + printf("%s%s=%s", sep, k, v); + sep = " "; + } + if (*sep) { + printf("\n"); + fflush(stdout); + } + return 0; +} + +void cleanup(int sig) +{ + audit_set(fd, AUDIT_STATUS_ENABLED, 0); + close(fd); + if (sig) + exit(0); +} + +int main(int argc, char **argv) +{ + struct sigaction act = { + .sa_handler = cleanup, + }; + + fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_AUDIT); + if (fd < 0) { + perror("Can't open netlink socket"); + return -1; + } + + if (sigaction(SIGTERM, &act, NULL) < 0 || + sigaction(SIGINT, &act, NULL) < 0) { + perror("Can't set signal handler"); + close(fd); + return -1; + } + + audit_set(fd, AUDIT_STATUS_ENABLED, 1); + audit_set(fd, AUDIT_STATUS_PID, getpid()); + + while (1) + readlog(fd); +} --- linux-azure-6.5.0.orig/tools/testing/selftests/netfilter/config +++ linux-azure-6.5.0/tools/testing/selftests/netfilter/config @@ -6,3 +6,4 @@ CONFIG_NFT_MASQ=m CONFIG_NFT_FLOW_OFFLOAD=m CONFIG_NF_CT_NETLINK=m +CONFIG_AUDIT=y --- linux-azure-6.5.0.orig/tools/testing/selftests/netfilter/conntrack_sctp_collision.sh +++ linux-azure-6.5.0/tools/testing/selftests/netfilter/conntrack_sctp_collision.sh @@ -0,0 +1,89 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Testing For SCTP COLLISION SCENARIO as Below: +# +# 14:35:47.655279 IP CLIENT_IP.PORT > SERVER_IP.PORT: sctp (1) [INIT] [init tag: 2017837359] +# 14:35:48.353250 IP SERVER_IP.PORT > CLIENT_IP.PORT: sctp (1) [INIT] [init tag: 1187206187] +# 14:35:48.353275 IP CLIENT_IP.PORT > SERVER_IP.PORT: sctp (1) [INIT ACK] [init tag: 2017837359] +# 14:35:48.353283 IP SERVER_IP.PORT > CLIENT_IP.PORT: sctp (1) [COOKIE ECHO] +# 14:35:48.353977 IP CLIENT_IP.PORT > SERVER_IP.PORT: sctp (1) [COOKIE ACK] +# 14:35:48.855335 IP SERVER_IP.PORT > CLIENT_IP.PORT: sctp (1) [INIT ACK] [init tag: 164579970] +# +# TOPO: SERVER_NS (link0)<--->(link1) ROUTER_NS (link2)<--->(link3) CLIENT_NS + +CLIENT_NS=$(mktemp -u client-XXXXXXXX) +CLIENT_IP="198.51.200.1" +CLIENT_PORT=1234 + +SERVER_NS=$(mktemp -u server-XXXXXXXX) +SERVER_IP="198.51.100.1" +SERVER_PORT=1234 + +ROUTER_NS=$(mktemp -u router-XXXXXXXX) +CLIENT_GW="198.51.200.2" +SERVER_GW="198.51.100.2" + +# setup the topo +setup() { + ip net add $CLIENT_NS + ip net add $SERVER_NS + ip net add $ROUTER_NS + ip -n $SERVER_NS link add link0 type veth peer name link1 netns $ROUTER_NS + ip -n $CLIENT_NS link add link3 type veth peer name link2 netns $ROUTER_NS + + ip -n $SERVER_NS link set link0 up + ip -n $SERVER_NS addr add $SERVER_IP/24 dev link0 + ip -n $SERVER_NS route add $CLIENT_IP dev link0 via $SERVER_GW + + ip -n $ROUTER_NS link set link1 up + ip -n $ROUTER_NS link set link2 up + ip -n $ROUTER_NS addr add $SERVER_GW/24 dev link1 + ip -n $ROUTER_NS addr add $CLIENT_GW/24 dev link2 + ip net exec $ROUTER_NS sysctl -wq net.ipv4.ip_forward=1 + + ip -n $CLIENT_NS link set link3 up + ip -n $CLIENT_NS addr add $CLIENT_IP/24 dev link3 + ip -n $CLIENT_NS route add $SERVER_IP dev link3 via $CLIENT_GW + + # simulate the delay on OVS upcall by setting up a delay for INIT_ACK with + # tc on $SERVER_NS side + tc -n $SERVER_NS qdisc add dev link0 root handle 1: htb + tc -n $SERVER_NS class add dev link0 parent 1: classid 1:1 htb rate 100mbit + tc -n $SERVER_NS filter add dev link0 parent 1: protocol ip u32 match ip protocol 132 \ + 0xff match u8 2 0xff at 32 flowid 1:1 + tc -n $SERVER_NS qdisc add dev link0 parent 1:1 handle 10: netem delay 1200ms + + # simulate the ctstate check on OVS nf_conntrack + ip net exec $ROUTER_NS iptables -A FORWARD -m state --state INVALID,UNTRACKED -j DROP + ip net exec $ROUTER_NS iptables -A INPUT -p sctp -j DROP + + # use a smaller number for assoc's max_retrans to reproduce the issue + modprobe sctp + ip net exec $CLIENT_NS sysctl -wq net.sctp.association_max_retrans=3 +} + +cleanup() { + ip net exec $CLIENT_NS pkill sctp_collision 2>&1 >/dev/null + ip net exec $SERVER_NS pkill sctp_collision 2>&1 >/dev/null + ip net del "$CLIENT_NS" + ip net del "$SERVER_NS" + ip net del "$ROUTER_NS" +} + +do_test() { + ip net exec $SERVER_NS ./sctp_collision server \ + $SERVER_IP $SERVER_PORT $CLIENT_IP $CLIENT_PORT & + ip net exec $CLIENT_NS ./sctp_collision client \ + $CLIENT_IP $CLIENT_PORT $SERVER_IP $SERVER_PORT +} + +# NOTE: one way to work around the issue is set a smaller hb_interval +# ip net exec $CLIENT_NS sysctl -wq net.sctp.hb_interval=3500 + +# run the test case +trap cleanup EXIT +setup && \ +echo "Test for SCTP Collision in nf_conntrack:" && \ +do_test && echo "PASS!" +exit $? --- linux-azure-6.5.0.orig/tools/testing/selftests/netfilter/nft_audit.sh +++ linux-azure-6.5.0/tools/testing/selftests/netfilter/nft_audit.sh @@ -0,0 +1,245 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 +# +# Check that audit logs generated for nft commands are as expected. + +SKIP_RC=4 +RC=0 + +nft --version >/dev/null 2>&1 || { + echo "SKIP: missing nft tool" + exit $SKIP_RC +} + +# Run everything in a separate network namespace +[ "${1}" != "run" ] && { unshare -n "${0}" run; exit $?; } + +# give other scripts a chance to finish - audit_logread sees all activity +sleep 1 + +logfile=$(mktemp) +rulefile=$(mktemp) +echo "logging into $logfile" +./audit_logread >"$logfile" & +logread_pid=$! +trap 'kill $logread_pid; rm -f $logfile $rulefile' EXIT +exec 3<"$logfile" + +do_test() { # (cmd, log) + echo -n "testing for cmd: $1 ... " + cat <&3 >/dev/null + $1 >/dev/null || exit 1 + sleep 0.1 + res=$(diff -a -u <(echo "$2") - <&3) + [ $? -eq 0 ] && { echo "OK"; return; } + echo "FAIL" + grep -v '^\(---\|+++\|@@\)' <<< "$res" + ((RC--)) +} + +nft flush ruleset + +# adding tables, chains and rules + +for table in t1 t2; do + do_test "nft add table $table" \ + "table=$table family=2 entries=1 op=nft_register_table" + + do_test "nft add chain $table c1" \ + "table=$table family=2 entries=1 op=nft_register_chain" + + do_test "nft add chain $table c2; add chain $table c3" \ + "table=$table family=2 entries=2 op=nft_register_chain" + + cmd="add rule $table c1 counter" + + do_test "nft $cmd" \ + "table=$table family=2 entries=1 op=nft_register_rule" + + do_test "nft $cmd; $cmd" \ + "table=$table family=2 entries=2 op=nft_register_rule" + + cmd="" + sep="" + for chain in c2 c3; do + for i in {1..3}; do + cmd+="$sep add rule $table $chain counter" + sep=";" + done + done + do_test "nft $cmd" \ + "table=$table family=2 entries=6 op=nft_register_rule" +done + +for ((i = 0; i < 500; i++)); do + echo "add rule t2 c3 counter accept comment \"rule $i\"" +done >$rulefile +do_test "nft -f $rulefile" \ +'table=t2 family=2 entries=500 op=nft_register_rule' + +# adding sets and elements + +settype='type inet_service; counter' +setelem='{ 22, 80, 443 }' +setblock="{ $settype; elements = $setelem; }" +do_test "nft add set t1 s $setblock" \ +"table=t1 family=2 entries=4 op=nft_register_set" + +do_test "nft add set t1 s2 $setblock; add set t1 s3 { $settype; }" \ +"table=t1 family=2 entries=5 op=nft_register_set" + +do_test "nft add element t1 s3 $setelem" \ +"table=t1 family=2 entries=3 op=nft_register_setelem" + +# adding counters + +do_test 'nft add counter t1 c1' \ +'table=t1 family=2 entries=1 op=nft_register_obj' + +do_test 'nft add counter t2 c1; add counter t2 c2' \ +'table=t2 family=2 entries=2 op=nft_register_obj' + +for ((i = 3; i <= 500; i++)); do + echo "add counter t2 c$i" +done >$rulefile +do_test "nft -f $rulefile" \ +'table=t2 family=2 entries=498 op=nft_register_obj' + +# adding/updating quotas + +do_test 'nft add quota t1 q1 { 10 bytes }' \ +'table=t1 family=2 entries=1 op=nft_register_obj' + +do_test 'nft add quota t2 q1 { 10 bytes }; add quota t2 q2 { 10 bytes }' \ +'table=t2 family=2 entries=2 op=nft_register_obj' + +for ((i = 3; i <= 500; i++)); do + echo "add quota t2 q$i { 10 bytes }" +done >$rulefile +do_test "nft -f $rulefile" \ +'table=t2 family=2 entries=498 op=nft_register_obj' + +# changing the quota value triggers obj update path +do_test 'nft add quota t1 q1 { 20 bytes }' \ +'table=t1 family=2 entries=1 op=nft_register_obj' + +# resetting rules + +do_test 'nft reset rules t1 c2' \ +'table=t1 family=2 entries=3 op=nft_reset_rule' + +do_test 'nft reset rules table t1' \ +'table=t1 family=2 entries=3 op=nft_reset_rule +table=t1 family=2 entries=3 op=nft_reset_rule +table=t1 family=2 entries=3 op=nft_reset_rule' + +do_test 'nft reset rules t2 c3' \ +'table=t2 family=2 entries=189 op=nft_reset_rule +table=t2 family=2 entries=188 op=nft_reset_rule +table=t2 family=2 entries=126 op=nft_reset_rule' + +do_test 'nft reset rules t2' \ +'table=t2 family=2 entries=3 op=nft_reset_rule +table=t2 family=2 entries=3 op=nft_reset_rule +table=t2 family=2 entries=186 op=nft_reset_rule +table=t2 family=2 entries=188 op=nft_reset_rule +table=t2 family=2 entries=129 op=nft_reset_rule' + +do_test 'nft reset rules' \ +'table=t1 family=2 entries=3 op=nft_reset_rule +table=t1 family=2 entries=3 op=nft_reset_rule +table=t1 family=2 entries=3 op=nft_reset_rule +table=t2 family=2 entries=3 op=nft_reset_rule +table=t2 family=2 entries=3 op=nft_reset_rule +table=t2 family=2 entries=180 op=nft_reset_rule +table=t2 family=2 entries=188 op=nft_reset_rule +table=t2 family=2 entries=135 op=nft_reset_rule' + +# resetting sets and elements + +elem=(22 ,80 ,443) +relem="" +for i in {1..3}; do + relem+="${elem[((i - 1))]}" + do_test "nft reset element t1 s { $relem }" \ + "table=t1 family=2 entries=$i op=nft_reset_setelem" +done + +do_test 'nft reset set t1 s' \ +'table=t1 family=2 entries=3 op=nft_reset_setelem' + +# resetting counters + +do_test 'nft reset counter t1 c1' \ +'table=t1 family=2 entries=1 op=nft_reset_obj' + +do_test 'nft reset counters t1' \ +'table=t1 family=2 entries=1 op=nft_reset_obj' + +do_test 'nft reset counters t2' \ +'table=t2 family=2 entries=342 op=nft_reset_obj +table=t2 family=2 entries=158 op=nft_reset_obj' + +do_test 'nft reset counters' \ +'table=t1 family=2 entries=1 op=nft_reset_obj +table=t2 family=2 entries=341 op=nft_reset_obj +table=t2 family=2 entries=159 op=nft_reset_obj' + +# resetting quotas + +do_test 'nft reset quota t1 q1' \ +'table=t1 family=2 entries=1 op=nft_reset_obj' + +do_test 'nft reset quotas t1' \ +'table=t1 family=2 entries=1 op=nft_reset_obj' + +do_test 'nft reset quotas t2' \ +'table=t2 family=2 entries=315 op=nft_reset_obj +table=t2 family=2 entries=185 op=nft_reset_obj' + +do_test 'nft reset quotas' \ +'table=t1 family=2 entries=1 op=nft_reset_obj +table=t2 family=2 entries=314 op=nft_reset_obj +table=t2 family=2 entries=186 op=nft_reset_obj' + +# deleting rules + +readarray -t handles < <(nft -a list chain t1 c1 | \ + sed -n 's/.*counter.* handle \(.*\)$/\1/p') + +do_test "nft delete rule t1 c1 handle ${handles[0]}" \ +'table=t1 family=2 entries=1 op=nft_unregister_rule' + +cmd='delete rule t1 c1 handle' +do_test "nft $cmd ${handles[1]}; $cmd ${handles[2]}" \ +'table=t1 family=2 entries=2 op=nft_unregister_rule' + +do_test 'nft flush chain t1 c2' \ +'table=t1 family=2 entries=3 op=nft_unregister_rule' + +do_test 'nft flush table t2' \ +'table=t2 family=2 entries=509 op=nft_unregister_rule' + +# deleting chains + +do_test 'nft delete chain t2 c2' \ +'table=t2 family=2 entries=1 op=nft_unregister_chain' + +# deleting sets and elements + +do_test 'nft delete element t1 s { 22 }' \ +'table=t1 family=2 entries=1 op=nft_unregister_setelem' + +do_test 'nft delete element t1 s { 80, 443 }' \ +'table=t1 family=2 entries=2 op=nft_unregister_setelem' + +do_test 'nft flush set t1 s2' \ +'table=t1 family=2 entries=3 op=nft_unregister_setelem' + +do_test 'nft delete set t1 s2' \ +'table=t1 family=2 entries=1 op=nft_unregister_set' + +do_test 'nft delete set t1 s3' \ +'table=t1 family=2 entries=1 op=nft_unregister_set' + +exit $RC --- linux-azure-6.5.0.orig/tools/testing/selftests/netfilter/sctp_collision.c +++ linux-azure-6.5.0/tools/testing/selftests/netfilter/sctp_collision.c @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + struct sockaddr_in saddr = {}, daddr = {}; + int sd, ret, len = sizeof(daddr); + struct timeval tv = {25, 0}; + char buf[] = "hello"; + + if (argc != 6 || (strcmp(argv[1], "server") && strcmp(argv[1], "client"))) { + printf("%s \n", + argv[0]); + return -1; + } + + sd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP); + if (sd < 0) { + printf("Failed to create sd\n"); + return -1; + } + + saddr.sin_family = AF_INET; + saddr.sin_addr.s_addr = inet_addr(argv[2]); + saddr.sin_port = htons(atoi(argv[3])); + + ret = bind(sd, (struct sockaddr *)&saddr, sizeof(saddr)); + if (ret < 0) { + printf("Failed to bind to address\n"); + goto out; + } + + ret = listen(sd, 5); + if (ret < 0) { + printf("Failed to listen on port\n"); + goto out; + } + + daddr.sin_family = AF_INET; + daddr.sin_addr.s_addr = inet_addr(argv[4]); + daddr.sin_port = htons(atoi(argv[5])); + + /* make test shorter than 25s */ + ret = setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + if (ret < 0) { + printf("Failed to setsockopt SO_RCVTIMEO\n"); + goto out; + } + + if (!strcmp(argv[1], "server")) { + sleep(1); /* wait a bit for client's INIT */ + ret = connect(sd, (struct sockaddr *)&daddr, len); + if (ret < 0) { + printf("Failed to connect to peer\n"); + goto out; + } + ret = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr *)&daddr, &len); + if (ret < 0) { + printf("Failed to recv msg %d\n", ret); + goto out; + } + ret = sendto(sd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&daddr, len); + if (ret < 0) { + printf("Failed to send msg %d\n", ret); + goto out; + } + printf("Server: sent! %d\n", ret); + } + + if (!strcmp(argv[1], "client")) { + usleep(300000); /* wait a bit for server's listening */ + ret = connect(sd, (struct sockaddr *)&daddr, len); + if (ret < 0) { + printf("Failed to connect to peer\n"); + goto out; + } + sleep(1); /* wait a bit for server's delayed INIT_ACK to reproduce the issue */ + ret = sendto(sd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&daddr, len); + if (ret < 0) { + printf("Failed to send msg %d\n", ret); + goto out; + } + ret = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr *)&daddr, &len); + if (ret < 0) { + printf("Failed to recv msg %d\n", ret); + goto out; + } + printf("Client: rcvd! %d\n", ret); + } + ret = 0; +out: + close(sd); + return ret; +} --- linux-azure-6.5.0.orig/tools/testing/selftests/netfilter/xt_string.sh +++ linux-azure-6.5.0/tools/testing/selftests/netfilter/xt_string.sh @@ -0,0 +1,128 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +# return code to signal skipped test +ksft_skip=4 +rc=0 + +if ! iptables --version >/dev/null 2>&1; then + echo "SKIP: Test needs iptables" + exit $ksft_skip +fi +if ! ip -V >/dev/null 2>&1; then + echo "SKIP: Test needs iproute2" + exit $ksft_skip +fi +if ! nc -h >/dev/null 2>&1; then + echo "SKIP: Test needs netcat" + exit $ksft_skip +fi + +pattern="foo bar baz" +patlen=11 +hdrlen=$((20 + 8)) # IPv4 + UDP +ns="ns-$(mktemp -u XXXXXXXX)" +trap 'ip netns del $ns' EXIT +ip netns add "$ns" +ip -net "$ns" link add d0 type dummy +ip -net "$ns" link set d0 up +ip -net "$ns" addr add 10.1.2.1/24 dev d0 + +#ip netns exec "$ns" tcpdump -npXi d0 & +#tcpdump_pid=$! +#trap 'kill $tcpdump_pid; ip netns del $ns' EXIT + +add_rule() { # (alg, from, to) + ip netns exec "$ns" \ + iptables -A OUTPUT -o d0 -m string \ + --string "$pattern" --algo $1 --from $2 --to $3 +} +showrules() { # () + ip netns exec "$ns" iptables -v -S OUTPUT | grep '^-A' +} +zerorules() { + ip netns exec "$ns" iptables -Z OUTPUT +} +countrule() { # (pattern) + showrules | grep -c -- "$*" +} +send() { # (offset) + ( for ((i = 0; i < $1 - $hdrlen; i++)); do + printf " " + done + printf "$pattern" + ) | ip netns exec "$ns" nc -w 1 -u 10.1.2.2 27374 +} + +add_rule bm 1000 1500 +add_rule bm 1400 1600 +add_rule kmp 1000 1500 +add_rule kmp 1400 1600 + +zerorules +send 0 +send $((1000 - $patlen)) +if [ $(countrule -c 0 0) -ne 4 ]; then + echo "FAIL: rules match data before --from" + showrules + ((rc--)) +fi + +zerorules +send 1000 +send $((1400 - $patlen)) +if [ $(countrule -c 2) -ne 2 ]; then + echo "FAIL: only two rules should match at low offset" + showrules + ((rc--)) +fi + +zerorules +send $((1500 - $patlen)) +if [ $(countrule -c 1) -ne 4 ]; then + echo "FAIL: all rules should match at end of packet" + showrules + ((rc--)) +fi + +zerorules +send 1495 +if [ $(countrule -c 1) -ne 1 ]; then + echo "FAIL: only kmp with proper --to should match pattern spanning fragments" + showrules + ((rc--)) +fi + +zerorules +send 1500 +if [ $(countrule -c 1) -ne 2 ]; then + echo "FAIL: two rules should match pattern at start of second fragment" + showrules + ((rc--)) +fi + +zerorules +send $((1600 - $patlen)) +if [ $(countrule -c 1) -ne 2 ]; then + echo "FAIL: two rules should match pattern at end of largest --to" + showrules + ((rc--)) +fi + +zerorules +send $((1600 - $patlen + 1)) +if [ $(countrule -c 1) -ne 0 ]; then + echo "FAIL: no rules should match pattern extending largest --to" + showrules + ((rc--)) +fi + +zerorules +send 1600 +if [ $(countrule -c 1) -ne 0 ]; then + echo "FAIL: no rule should match pattern past largest --to" + showrules + ((rc--)) +fi + +exit $rc --- linux-azure-6.5.0.orig/tools/testing/selftests/nolibc/nolibc-test.c +++ linux-azure-6.5.0/tools/testing/selftests/nolibc/nolibc-test.c @@ -769,7 +769,6 @@ lseek(fd, 0, SEEK_SET); r = read(fd, buf, sizeof(buf) - 1); - buf[r] = '\0'; fclose(memfile); @@ -779,6 +778,7 @@ return 1; } + buf[r] = '\0'; llen += printf(" \"%s\" = \"%s\"", expected, buf); ret = strncmp(expected, buf, c); @@ -939,6 +939,35 @@ { 0 } }; +int is_setting_valid(char *test) +{ + int idx, len, test_len, valid = 0; + char delimiter; + + if (!test) + return valid; + + test_len = strlen(test); + + for (idx = 0; test_names[idx].name; idx++) { + len = strlen(test_names[idx].name); + if (test_len < len) + continue; + + if (strncmp(test, test_names[idx].name, len) != 0) + continue; + + delimiter = test[len]; + if (delimiter != ':' && delimiter != ',' && delimiter != '\0') + continue; + + valid = 1; + break; + } + + return valid; +} + int main(int argc, char **argv, char **envp) { int min = 0; @@ -964,10 +993,10 @@ * syscall:5-15[:.*],stdlib:8-10 */ test = argv[1]; - if (!test) + if (!is_setting_valid(test)) test = getenv("NOLIBC_TEST"); - if (test) { + if (is_setting_valid(test)) { char *comma, *colon, *dash, *value; do { --- linux-azure-6.5.0.orig/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c +++ linux-azure-6.5.0/tools/testing/selftests/pidfd/pidfd_fdinfo_test.c @@ -62,7 +62,7 @@ break; case PIDFD_PASS: - ksft_test_result_pass("%s test: Passed\n"); + ksft_test_result_pass("%s test: Passed\n", test_name); break; default: --- linux-azure-6.5.0.orig/tools/testing/selftests/pidfd/pidfd_test.c +++ linux-azure-6.5.0/tools/testing/selftests/pidfd/pidfd_test.c @@ -381,13 +381,13 @@ static void *test_pidfd_poll_exec_thread(void *priv) { - ksft_print_msg("Child Thread: starting. pid %d tid %d ; and sleeping\n", + ksft_print_msg("Child Thread: starting. pid %d tid %ld ; and sleeping\n", getpid(), syscall(SYS_gettid)); ksft_print_msg("Child Thread: doing exec of sleep\n"); execl("/bin/sleep", "sleep", str(CHILD_THREAD_MIN_WAIT), (char *)NULL); - ksft_print_msg("Child Thread: DONE. pid %d tid %d\n", + ksft_print_msg("Child Thread: DONE. pid %d tid %ld\n", getpid(), syscall(SYS_gettid)); return NULL; } @@ -427,7 +427,7 @@ { pthread_t t1; - ksft_print_msg("Child (pidfd): starting. pid %d tid %d\n", getpid(), + ksft_print_msg("Child (pidfd): starting. pid %d tid %ld\n", getpid(), syscall(SYS_gettid)); pthread_create(&t1, NULL, test_pidfd_poll_exec_thread, NULL); /* @@ -480,10 +480,10 @@ static void *test_pidfd_poll_leader_exit_thread(void *priv) { - ksft_print_msg("Child Thread: starting. pid %d tid %d ; and sleeping\n", + ksft_print_msg("Child Thread: starting. pid %d tid %ld ; and sleeping\n", getpid(), syscall(SYS_gettid)); sleep(CHILD_THREAD_MIN_WAIT); - ksft_print_msg("Child Thread: DONE. pid %d tid %d\n", getpid(), syscall(SYS_gettid)); + ksft_print_msg("Child Thread: DONE. pid %d tid %ld\n", getpid(), syscall(SYS_gettid)); return NULL; } @@ -492,7 +492,7 @@ { pthread_t t1, t2; - ksft_print_msg("Child: starting. pid %d tid %d\n", getpid(), syscall(SYS_gettid)); + ksft_print_msg("Child: starting. pid %d tid %ld\n", getpid(), syscall(SYS_gettid)); pthread_create(&t1, NULL, test_pidfd_poll_leader_exit_thread, NULL); pthread_create(&t2, NULL, test_pidfd_poll_leader_exit_thread, NULL); --- linux-azure-6.5.0.orig/tools/testing/selftests/powerpc/Makefile +++ linux-azure-6.5.0/tools/testing/selftests/powerpc/Makefile @@ -59,12 +59,11 @@ done; endef -override define EMIT_TESTS +emit_tests: +@for TARGET in $(SUB_DIRS); do \ BUILD_TARGET=$(OUTPUT)/$$TARGET; \ - $(MAKE) OUTPUT=$$BUILD_TARGET -s -C $$TARGET emit_tests;\ + $(MAKE) OUTPUT=$$BUILD_TARGET -s -C $$TARGET $@;\ done; -endef override define CLEAN +@for TARGET in $(SUB_DIRS); do \ @@ -77,4 +76,4 @@ tags: find . -name '*.c' -o -name '*.h' | xargs ctags -.PHONY: tags $(SUB_DIRS) +.PHONY: tags $(SUB_DIRS) emit_tests --- linux-azure-6.5.0.orig/tools/testing/selftests/powerpc/pmu/Makefile +++ linux-azure-6.5.0/tools/testing/selftests/powerpc/pmu/Makefile @@ -30,13 +30,14 @@ +TARGET=event_code_tests; BUILD_TARGET=$$OUTPUT/$$TARGET; $(MAKE) OUTPUT=$$BUILD_TARGET -C $$TARGET run_tests endef -DEFAULT_EMIT_TESTS := $(EMIT_TESTS) -override define EMIT_TESTS - $(DEFAULT_EMIT_TESTS) +emit_tests: + for TEST in $(TEST_GEN_PROGS); do \ + BASENAME_TEST=`basename $$TEST`; \ + echo "$(COLLECTION):$$BASENAME_TEST"; \ + done +TARGET=ebb; BUILD_TARGET=$$OUTPUT/$$TARGET; $(MAKE) OUTPUT=$$BUILD_TARGET -s -C $$TARGET emit_tests +TARGET=sampling_tests; BUILD_TARGET=$$OUTPUT/$$TARGET; $(MAKE) OUTPUT=$$BUILD_TARGET -s -C $$TARGET emit_tests +TARGET=event_code_tests; BUILD_TARGET=$$OUTPUT/$$TARGET; $(MAKE) OUTPUT=$$BUILD_TARGET -s -C $$TARGET emit_tests -endef DEFAULT_INSTALL_RULE := $(INSTALL_RULE) override define INSTALL_RULE @@ -64,4 +65,4 @@ event_code_tests: TARGET=$@; BUILD_TARGET=$$OUTPUT/$$TARGET; mkdir -p $$BUILD_TARGET; $(MAKE) OUTPUT=$$BUILD_TARGET -k -C $$TARGET all -.PHONY: all run_tests ebb sampling_tests event_code_tests +.PHONY: all run_tests ebb sampling_tests event_code_tests emit_tests --- linux-azure-6.5.0.orig/tools/testing/selftests/powerpc/ptrace/Makefile +++ linux-azure-6.5.0/tools/testing/selftests/powerpc/ptrace/Makefile @@ -33,7 +33,7 @@ $(TESTS_64): CFLAGS += -m64 $(TM_TESTS): CFLAGS += -I../tm -mhtm -CFLAGS += $(KHDR_INCLUDES) -fno-pie +CFLAGS += $(KHDR_INCLUDES) -fno-pie -Wno-error=deprecated $(OUTPUT)/ptrace-gpr: ptrace-gpr.S $(OUTPUT)/ptrace-pkey $(OUTPUT)/core-pkey: LDLIBS += -pthread --- linux-azure-6.5.0.orig/tools/testing/selftests/resctrl/Makefile +++ linux-azure-6.5.0/tools/testing/selftests/resctrl/Makefile @@ -1,10 +1,10 @@ # SPDX-License-Identifier: GPL-2.0 -CFLAGS = -g -Wall -O2 -D_FORTIFY_SOURCE=2 +CFLAGS = -g -Wall -O2 -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE CFLAGS += $(KHDR_INCLUDES) TEST_GEN_PROGS := resctrl_tests include ../lib.mk -$(OUTPUT)/resctrl_tests: $(wildcard *.c) +$(OUTPUT)/resctrl_tests: $(wildcard *.[ch]) --- linux-azure-6.5.0.orig/tools/testing/selftests/resctrl/cache.c +++ linux-azure-6.5.0/tools/testing/selftests/resctrl/cache.c @@ -87,21 +87,19 @@ static int get_llc_perf(unsigned long *llc_perf_miss) { __u64 total_misses; + int ret; /* Stop counters after one span to get miss rate */ ioctl(fd_lm, PERF_EVENT_IOC_DISABLE, 0); - if (read(fd_lm, &rf_cqm, sizeof(struct read_format)) == -1) { + ret = read(fd_lm, &rf_cqm, sizeof(struct read_format)); + if (ret == -1) { perror("Could not get llc misses through perf"); - return -1; } total_misses = rf_cqm.values[0].value; - - close(fd_lm); - *llc_perf_miss = total_misses; return 0; @@ -253,19 +251,25 @@ memflush, operation, resctrl_val)) { fprintf(stderr, "Error-running fill buffer\n"); ret = -1; - break; + goto pe_close; } sleep(1); ret = measure_cache_vals(param, bm_pid); if (ret) - break; + goto pe_close; + + close(fd_lm); } else { break; } } return ret; + +pe_close: + close(fd_lm); + return ret; } /* --- linux-azure-6.5.0.orig/tools/testing/selftests/resctrl/cmt_test.c +++ linux-azure-6.5.0/tools/testing/selftests/resctrl/cmt_test.c @@ -90,9 +90,6 @@ if (ret) return ret; - if (!validate_resctrl_feature_request(CMT_STR)) - return -1; - ret = get_cbm_mask("L3", cbm_mask); if (ret) return ret; --- linux-azure-6.5.0.orig/tools/testing/selftests/resctrl/fill_buf.c +++ linux-azure-6.5.0/tools/testing/selftests/resctrl/fill_buf.c @@ -177,12 +177,13 @@ else ret = fill_cache_write(start_ptr, end_ptr, resctrl_val); + free(startptr); + if (ret) { printf("\n Error in fill cache read/write...\n"); return -1; } - free(startptr); return 0; } --- linux-azure-6.5.0.orig/tools/testing/selftests/resctrl/mba_test.c +++ linux-azure-6.5.0/tools/testing/selftests/resctrl/mba_test.c @@ -12,7 +12,7 @@ #define RESULT_FILE_NAME "result_mba" #define NUM_OF_RUNS 5 -#define MAX_DIFF_PERCENT 5 +#define MAX_DIFF_PERCENT 8 #define ALLOCATION_MAX 100 #define ALLOCATION_MIN 10 #define ALLOCATION_STEP 10 --- linux-azure-6.5.0.orig/tools/testing/selftests/resctrl/mbm_test.c +++ linux-azure-6.5.0/tools/testing/selftests/resctrl/mbm_test.c @@ -11,7 +11,7 @@ #include "resctrl.h" #define RESULT_FILE_NAME "result_mbm" -#define MAX_DIFF_PERCENT 5 +#define MAX_DIFF_PERCENT 8 #define NUM_OF_RUNS 5 static int --- linux-azure-6.5.0.orig/tools/testing/selftests/resctrl/resctrl.h +++ linux-azure-6.5.0/tools/testing/selftests/resctrl/resctrl.h @@ -1,5 +1,4 @@ /* SPDX-License-Identifier: GPL-2.0 */ -#define _GNU_SOURCE #ifndef RESCTRL_H #define RESCTRL_H #include @@ -43,6 +42,7 @@ do { \ perror(err_msg); \ kill(ppid, SIGKILL); \ + umount_resctrlfs(); \ exit(EXIT_FAILURE); \ } while (0) --- linux-azure-6.5.0.orig/tools/testing/selftests/resctrl/resctrl_tests.c +++ linux-azure-6.5.0/tools/testing/selftests/resctrl/resctrl_tests.c @@ -224,9 +224,14 @@ return ksft_exit_skip("Not running as root. Skipping...\n"); if (has_ben) { + if (argc - ben_ind >= BENCHMARK_ARGS) + ksft_exit_fail_msg("Too long benchmark command.\n"); + /* Extract benchmark command from command line. */ for (i = ben_ind; i < argc; i++) { benchmark_cmd[i - ben_ind] = benchmark_cmd_area[i]; + if (strlen(argv[i]) >= BENCHMARK_ARG_SIZE) + ksft_exit_fail_msg("Too long benchmark command argument.\n"); sprintf(benchmark_cmd[i - ben_ind], "%s", argv[i]); } benchmark_cmd[ben_count] = NULL; --- linux-azure-6.5.0.orig/tools/testing/selftests/resctrl/resctrl_val.c +++ linux-azure-6.5.0/tools/testing/selftests/resctrl/resctrl_val.c @@ -482,7 +482,7 @@ */ int signal_handler_register(void) { - struct sigaction sigact; + struct sigaction sigact = {}; int ret = 0; sigact.sa_sigaction = ctrlc_handler; @@ -504,7 +504,7 @@ */ void signal_handler_unregister(void) { - struct sigaction sigact; + struct sigaction sigact = {}; sigact.sa_handler = SIG_DFL; sigemptyset(&sigact.sa_mask); --- linux-azure-6.5.0.orig/tools/testing/selftests/seccomp/seccomp_bpf.c +++ linux-azure-6.5.0/tools/testing/selftests/seccomp/seccomp_bpf.c @@ -4043,18 +4043,17 @@ /* There may be arbitrary already-open fds at test start. */ memfd = memfd_create("test", 0); ASSERT_GE(memfd, 0); - nextfd = memfd + 1; ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); ASSERT_EQ(0, ret) { TH_LOG("Kernel does not support PR_SET_NO_NEW_PRIVS!"); } - /* fd: 4 */ /* Check that the basic notification machinery works */ listener = user_notif_syscall(__NR_getppid, SECCOMP_FILTER_FLAG_NEW_LISTENER); - ASSERT_EQ(listener, nextfd++); + ASSERT_GE(listener, 0); + nextfd = listener + 1; pid = fork(); ASSERT_GE(pid, 0); --- linux-azure-6.5.0.orig/tools/testing/selftests/seccomp/settings +++ linux-azure-6.5.0/tools/testing/selftests/seccomp/settings @@ -1 +1 @@ -timeout=120 +timeout=300 --- linux-azure-6.5.0.orig/tools/testing/selftests/tdx/tdx_guest_test.c +++ linux-azure-6.5.0/tools/testing/selftests/tdx/tdx_guest_test.c @@ -17,7 +17,7 @@ #define TDX_GUEST_DEVNAME "/dev/tdx_guest" #define HEX_DUMP_SIZE 8 -#define DEBUG 0 +#define DEBUG 1 /** * struct tdreport_type - Type header of TDREPORT_STRUCT. --- linux-azure-6.5.0.orig/tools/testing/selftests/timers/rtcpie.c +++ linux-azure-6.5.0/tools/testing/selftests/timers/rtcpie.c @@ -111,11 +111,11 @@ timersub(&end, &start, &diff); if (diff.tv_sec > 0 || diff.tv_usec > ((1000000L / tmp) * 1.10)) { - fprintf(stderr, "\nPIE delta error: %ld.%06ld should be close to 0.%06ld\n", + fprintf(stderr, "\nUbuntu Testing Force Pass LP #1814234: PIE delta error: %ld.%06ld should be close to 0.%06ld\n", diff.tv_sec, diff.tv_usec, (1000000L / tmp)); fflush(stdout); - exit(-1); + break; // LP: #1814234 } fprintf(stderr, " %d",i); --- linux-azure-6.5.0.orig/tools/testing/selftests/x86/lam.c +++ linux-azure-6.5.0/tools/testing/selftests/x86/lam.c @@ -573,7 +573,7 @@ char path[PATH_MAX] = {0}; /* get current process path */ - if (readlink("/proc/self/exe", path, PATH_MAX) <= 0) + if (readlink("/proc/self/exe", path, PATH_MAX - 1) <= 0) return 1; int file_fd = open(path, O_RDONLY); @@ -680,14 +680,14 @@ perror("Fork failed."); ret = 1; } else if (pid == 0) { - char path[PATH_MAX]; + char path[PATH_MAX] = {0}; /* Set LAM mode in parent process */ if (set_lam(lam) != 0) return 1; /* Get current binary's path and the binary was run by execve */ - if (readlink("/proc/self/exe", path, PATH_MAX) <= 0) + if (readlink("/proc/self/exe", path, PATH_MAX - 1) <= 0) exit(-1); /* run binary to get LAM mode and return to parent process */ --- linux-azure-6.5.0.orig/tools/testing/vsock/vsock_test.c +++ linux-azure-6.5.0/tools/testing/vsock/vsock_test.c @@ -285,11 +285,12 @@ } #define SOCK_BUF_SIZE (2 * 1024 * 1024) -#define MAX_MSG_SIZE (32 * 1024) +#define MAX_MSG_PAGES 4 static void test_seqpacket_msg_bounds_client(const struct test_opts *opts) { unsigned long curr_hash; + size_t max_msg_size; int page_size; int msg_count; int fd; @@ -305,7 +306,8 @@ curr_hash = 0; page_size = getpagesize(); - msg_count = SOCK_BUF_SIZE / MAX_MSG_SIZE; + max_msg_size = MAX_MSG_PAGES * page_size; + msg_count = SOCK_BUF_SIZE / max_msg_size; for (int i = 0; i < msg_count; i++) { ssize_t send_size; @@ -316,7 +318,7 @@ /* Use "small" buffers and "big" buffers. */ if (i & 1) buf_size = page_size + - (rand() % (MAX_MSG_SIZE - page_size)); + (rand() % (max_msg_size - page_size)); else buf_size = 1 + (rand() % page_size); @@ -372,7 +374,6 @@ unsigned long remote_hash; unsigned long curr_hash; int fd; - char buf[MAX_MSG_SIZE]; struct msghdr msg = {0}; struct iovec iov = {0}; @@ -400,8 +401,13 @@ control_writeln("SRVREADY"); /* Wait, until peer sends whole data. */ control_expectln("SENDDONE"); - iov.iov_base = buf; - iov.iov_len = sizeof(buf); + iov.iov_len = MAX_MSG_PAGES * getpagesize(); + iov.iov_base = malloc(iov.iov_len); + if (!iov.iov_base) { + perror("malloc"); + exit(EXIT_FAILURE); + } + msg.msg_iov = &iov; msg.msg_iovlen = 1; @@ -426,6 +432,7 @@ curr_hash += hash_djb2(msg.msg_iov[0].iov_base, recv_size); } + free(iov.iov_base); close(fd); remote_hash = control_readulong(); --- linux-azure-6.5.0.orig/tools/tracing/rtla/src/timerlat_aa.c +++ linux-azure-6.5.0/tools/tracing/rtla/src/timerlat_aa.c @@ -159,6 +159,7 @@ taa_data->thread_nmi_sum = 0; taa_data->thread_irq_sum = 0; taa_data->thread_softirq_sum = 0; + taa_data->thread_thread_sum = 0; taa_data->thread_blocking_duration = 0; taa_data->timer_irq_start_time = 0; taa_data->timer_irq_duration = 0; @@ -337,7 +338,23 @@ taa_data->timer_irq_start_time = start; taa_data->timer_irq_duration = duration; - taa_data->timer_irq_start_delay = taa_data->timer_irq_start_time - expected_start; + /* + * We are dealing with two different clock sources: the + * external clock source that timerlat uses as a reference + * and the clock used by the tracer. There are also two + * moments: the time reading the clock and the timer in + * which the event is placed in the buffer (the trace + * event timestamp). If the processor is slow or there + * is some hardware noise, the difference between the + * timestamp and the external clock read can be longer + * than the IRQ handler delay, resulting in a negative + * time. If so, set IRQ start delay as 0. In the end, + * it is less relevant than the noise. + */ + if (expected_start < taa_data->timer_irq_start_time) + taa_data->timer_irq_start_delay = taa_data->timer_irq_start_time - expected_start; + else + taa_data->timer_irq_start_delay = 0; /* * not exit from idle. @@ -528,7 +545,7 @@ static void timerlat_thread_analysis(struct timerlat_aa_data *taa_data, int cpu, int irq_thresh, int thread_thresh) { - unsigned long long exp_irq_ts; + long long exp_irq_ts; int total; int irq; @@ -545,12 +562,15 @@ /* * Expected IRQ arrival time using the trace clock as the base. + * + * TODO: Add a list of previous IRQ, and then run the list backwards. */ exp_irq_ts = taa_data->timer_irq_start_time - taa_data->timer_irq_start_delay; - - if (exp_irq_ts < taa_data->prev_irq_timstamp + taa_data->prev_irq_duration) - printf(" Previous IRQ interference: \t\t up to %9.2f us\n", - ns_to_usf(taa_data->prev_irq_duration)); + if (exp_irq_ts < taa_data->prev_irq_timstamp + taa_data->prev_irq_duration) { + if (taa_data->prev_irq_timstamp < taa_data->timer_irq_start_time) + printf(" Previous IRQ interference: \t\t up to %9.2f us\n", + ns_to_usf(taa_data->prev_irq_duration)); + } /* * The delay that the IRQ suffered before starting. --- linux-azure-6.5.0.orig/tools/tracing/rtla/src/timerlat_u.c +++ linux-azure-6.5.0/tools/tracing/rtla/src/timerlat_u.c @@ -45,7 +45,7 @@ retval = sched_setaffinity(gettid(), sizeof(set), &set); if (retval == -1) { - err_msg("Error setting user thread affinity\n"); + debug_msg("Error setting user thread affinity %d, is the CPU online?\n", cpu); exit(1); } @@ -193,7 +193,9 @@ procs_count--; } } - break; + + if (!procs_count) + break; } sleep(1); --- linux-azure-6.5.0.orig/tools/tracing/rtla/src/utils.c +++ linux-azure-6.5.0/tools/tracing/rtla/src/utils.c @@ -538,7 +538,7 @@ { char mount_point[MAX_PATH]; char type[100]; - int found; + int found = 0; FILE *fp; fp = fopen("/proc/mounts", "r"); --- linux-azure-6.5.0.orig/tools/usb/usbip/configure.ac +++ linux-azure-6.5.0/tools/usb/usbip/configure.ac @@ -18,7 +18,7 @@ # Silent build for automake >= 1.11 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) -AC_SUBST([EXTRA_CFLAGS], ["-Wall -Werror -Wextra -std=gnu99"]) +AC_SUBST([EXTRA_CFLAGS], ["-Wall -Werror -Wextra -Wno-address-of-packed-member -std=gnu99"]) # Checks for programs. AC_PROG_CC --- linux-azure-6.5.0.orig/ubuntu/Kconfig +++ linux-azure-6.5.0/ubuntu/Kconfig @@ -0,0 +1,24 @@ +menu "Ubuntu Supplied Third-Party Device Drivers" + + +config UBUNTU_ODM_DRIVERS + def_bool $(success,$(srctree)/debian/scripts/misc/arch-has-odm-enabled.sh $(DEB_ARCH)) + help + Turn on support for Ubuntu ODM supplied drivers + +# +# NOTE: to allow drivers to be added and removed without causing merge +# collisions you should add new entries in the middle of the six lines +# of ## at the bottom of the list. Always add three lines of ## above +# your new entry and maintain the six lines below. +# + +## +## +## +source "ubuntu/ubuntu-host/Kconfig" +## +## +## + +endmenu --- linux-azure-6.5.0.orig/ubuntu/Makefile +++ linux-azure-6.5.0/ubuntu/Makefile @@ -0,0 +1,18 @@ +# +# Makefile for the Linux kernel ubuntu supplied third-party device drivers. +# + +# +# NOTE: to allow drivers to be added and removed without causing merge +# collisions you should add new entries in the middle of the six lines +# of ## at the bottom of the list. Always add three lines of ## above +# your new entry and maintain the six lines below. +# + +## +## +## +obj-$(CONFIG_UBUNTU_HOST) += ubuntu-host/ +## +## +## --- linux-azure-6.5.0.orig/ubuntu/hio/Makefile +++ linux-azure-6.5.0/ubuntu/hio/Makefile @@ -0,0 +1,69 @@ +ifneq ($(KERNELRELEASE),) +# hio-y := hio_main.o +# obj-$(CONFIG_HIO_DRIVER) += hio.o + obj-m += hio.o +else + +KVER= +ifeq ($(KVER),) + KVER=$(shell uname -r) +endif + +PDIR= +ifeq ($(PDIR),) + PDIR=extra +endif + +PREFIX= + +MODDIR=/lib/modules/$(KVER)/$(PDIR)/hio/ +MOD=hio.ko + +ifeq ($(KVER),2.6.32-300.3.1.el6uek.x86_64) + FLAGS += -DSSD_QUEUE_PBIO +endif +ifeq ($(KVER),2.6.32-220.el6.x86_64) + FLAGS += -DSSD_QUEUE_PBIO +endif +ifeq ($(KVER),2.6.32-358.el6.x86_64) + FLAGS += -DSSD_QUEUE_PBIO +endif +ifeq ($(KVER),2.6.32-358.23.2.el6.x86_64) + FLAGS += -DSSD_QUEUE_PBIO +endif +ifeq ($(KVER),3.0.58-0.6.6-xen) + FLAGS += -DSSD_QUEUE_PBIO +endif +ifeq ($(KVER),3.2.0-4-amd64) + FLAGS += -DSSD_BIOVEC_PHYS_MERGEABLE_FIXED +endif +ifeq ($(KVER),2.6.39-400.209.1.el5uek) #Oracle Linux Server release 5.10 + FLAGS += -DSSD_BIOVEC_PHYS_MERGEABLE_FIXED +endif +ifeq ($(KVER),2.6.39-400.215.10.el5uek) #Oracle Linux Server release 5.11 + FLAGS += -DSSD_BIOVEC_PHYS_MERGEABLE_FIXED +endif +ifeq ($(KVER),2.6.39-200.24.1.el6uek.x86_64) #Oracle Linux Server release 6.3 + FLAGS += -DSSD_BIOVEC_PHYS_MERGEABLE_FIXED +endif +ifeq ($(KVER),2.6.39-400.17.1.el6uek.x86_64) #Oracle Linux Server release 6.4 + FLAGS += -DSSD_BIOVEC_PHYS_MERGEABLE_FIXED +endif + + +KERNELDIR ?= /lib/modules/$(KVER)/build +PWD := $(shell pwd) + +default: + $(MAKE) -C $(KERNELDIR) M=$(PWD) EXTRA_CFLAGS="$(FLAGS)" modules +clean: + rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* + +install: default + mkdir -p $(PREFIX)/$(MODDIR) + install -m 444 $(MOD) $(PREFIX)/$(MODDIR) + @if [ "$(PREFIX)" = "" ]; then /sbin/depmod -a ;\ + else echo " *** Run 'depmod -a' to update the module database.";\ + fi +endif + --- linux-azure-6.5.0.orig/ubuntu/hio/hio.c +++ linux-azure-6.5.0/ubuntu/hio/hio.c @@ -0,0 +1,12527 @@ +/* +* Huawei SSD device driver +* Copyright (c) 2016, Huawei Technologies Co., Ltd. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms and conditions of the GNU General Public License, +* version 2, as published by the Free Software Foundation. +* +* This program is distributed in the hope it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +*/ + +#ifndef LINUX_VERSION_CODE +#include +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)) +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* HDIO_GETGEO */ +#include +#include +#include +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)) +#include +#endif +#include +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,2,0)) +#include +#include +#else +#include +#endif +#include +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)) +#include +#endif + +/* driver */ +#define MODULE_NAME "hio" +#define DRIVER_VERSION "2.1.0.23" +#define DRIVER_VERSION_LEN 16 + +#define SSD_FW_MIN 0x1 + +#define SSD_DEV_NAME MODULE_NAME +#define SSD_DEV_NAME_LEN 16 +#define SSD_CDEV_NAME "c"SSD_DEV_NAME +#define SSD_SDEV_NAME "s"SSD_DEV_NAME + + +#define SSD_CMAJOR 0 +#define SSD_MAJOR 0 +#define SSD_MAJOR_SL 0 +#define SSD_MINORS 16 + +#define SSD_MAX_DEV 702 +#define SSD_ALPHABET_NUM 26 + +#define hio_info(f, arg...) printk(KERN_INFO MODULE_NAME"info: " f , ## arg) +#define hio_note(f, arg...) printk(KERN_NOTICE MODULE_NAME"note: " f , ## arg) +#define hio_warn(f, arg...) printk(KERN_WARNING MODULE_NAME"warn: " f , ## arg) +#define hio_err(f, arg...) printk(KERN_ERR MODULE_NAME"err: " f , ## arg) + +/* slave port */ +#define SSD_SLAVE_PORT_DEVID 0x000a + +/* int mode */ + +/* 2.6.9 msi affinity bug, should turn msi & msi-x off */ +//#define SSD_MSI +#define SSD_ESCAPE_IRQ + +//#define SSD_MSIX +#ifndef MODULE +#define SSD_MSIX +#endif +#define SSD_MSIX_VEC 8 +#ifdef SSD_MSIX +#undef SSD_MSI +//#undef SSD_ESCAPE_IRQ +#define SSD_MSIX_AFFINITY_FORCE +#endif + +#define SSD_TRIM + +/* Over temperature protect */ +#define SSD_OT_PROTECT + +#ifdef SSD_QUEUE_PBIO +#define BIO_SSD_PBIO 20 +#endif + +/* debug */ +//#define SSD_DEBUG_ERR + +/* cmd timer */ +#define SSD_CMD_TIMEOUT (60*HZ) + +/* i2c & smbus */ +#define SSD_SPI_TIMEOUT (5*HZ) +#define SSD_I2C_TIMEOUT (5*HZ) + +#define SSD_I2C_MAX_DATA (127) +#define SSD_SMBUS_BLOCK_MAX (32) +#define SSD_SMBUS_DATA_MAX (SSD_SMBUS_BLOCK_MAX + 2) + +/* wait for init */ +#define SSD_INIT_WAIT (1000) //1s +#define SSD_CONTROLLER_WAIT (20*1000/SSD_INIT_WAIT) //20s +#define SSD_INIT_MAX_WAIT (500*1000/SSD_INIT_WAIT) //500s +#define SSD_INIT_MAX_WAIT_V3_2 (1400*1000/SSD_INIT_WAIT) //1400s +#define SSD_RAM_INIT_MAX_WAIT (10*1000/SSD_INIT_WAIT) //10s +#define SSD_CH_INFO_MAX_WAIT (10*1000/SSD_INIT_WAIT) //10s + +/* blkdev busy wait */ +#define SSD_DEV_BUSY_WAIT 1000 //ms +#define SSD_DEV_BUSY_MAX_WAIT (8*1000/SSD_DEV_BUSY_WAIT) //8s + +/* smbus retry */ +#define SSD_SMBUS_RETRY_INTERVAL (5) //ms +#define SSD_SMBUS_RETRY_MAX (1000/SSD_SMBUS_RETRY_INTERVAL) + +#define SSD_BM_RETRY_MAX 7 + +/* bm routine interval */ +#define SSD_BM_CAP_LEARNING_DELAY (10*60*1000) + +/* routine interval */ +#define SSD_ROUTINE_INTERVAL (10*1000) //10s +#define SSD_HWMON_ROUTINE_TICK (60*1000/SSD_ROUTINE_INTERVAL) +#define SSD_CAPMON_ROUTINE_TICK ((3600*1000/SSD_ROUTINE_INTERVAL)*24*30) +#define SSD_CAPMON2_ROUTINE_TICK (10*60*1000/SSD_ROUTINE_INTERVAL) //fault recover + +/* dma align */ +#define SSD_DMA_ALIGN (16) + +/* some hw defalut */ +#define SSD_LOG_MAX_SZ 4096 + +#define SSD_NAND_OOB_SZ 1024 +#define SSD_NAND_ID_SZ 8 +#define SSD_NAND_ID_BUFF_SZ 1024 +#define SSD_NAND_MAX_CE 2 + +#define SSD_BBT_RESERVED 8 + +#define SSD_ECC_MAX_FLIP (64+1) + +#define SSD_RAM_ALIGN 16 + + +#define SSD_RELOAD_FLAG 0x3333CCCC +#define SSD_RELOAD_FW 0xAA5555AA +#define SSD_RESET_NOINIT 0xAA5555AA +#define SSD_RESET 0x55AAAA55 +#define SSD_RESET_FULL 0x5A +//#define SSD_RESET_WAIT 1000 //1s +//#define SSD_RESET_MAX_WAIT (200*1000/SSD_RESET_WAIT) //200s + + +/* reverion 1 */ +#define SSD_PROTOCOL_V1 0x0 + +#define SSD_ROM_SIZE (16*1024*1024) +#define SSD_ROM_BLK_SIZE (256*1024) +#define SSD_ROM_PAGE_SIZE (256) +#define SSD_ROM_NR_BRIDGE_FW 2 +#define SSD_ROM_NR_CTRL_FW 2 +#define SSD_ROM_BRIDGE_FW_BASE 0 +#define SSD_ROM_BRIDGE_FW_SIZE (2*1024*1024) +#define SSD_ROM_CTRL_FW_BASE (SSD_ROM_NR_BRIDGE_FW*SSD_ROM_BRIDGE_FW_SIZE) +#define SSD_ROM_CTRL_FW_SIZE (5*1024*1024) +#define SSD_ROM_LABEL_BASE (SSD_ROM_CTRL_FW_BASE+SSD_ROM_CTRL_FW_SIZE*SSD_ROM_NR_CTRL_FW) +#define SSD_ROM_VP_BASE (SSD_ROM_LABEL_BASE+SSD_ROM_BLK_SIZE) + +/* reverion 3 */ +#define SSD_PROTOCOL_V3 0x3000000 +#define SSD_PROTOCOL_V3_1_1 0x3010001 +#define SSD_PROTOCOL_V3_1_3 0x3010003 +#define SSD_PROTOCOL_V3_2 0x3020000 +#define SSD_PROTOCOL_V3_2_1 0x3020001 /* <4KB improved */ +#define SSD_PROTOCOL_V3_2_2 0x3020002 /* ot protect */ +#define SSD_PROTOCOL_V3_2_4 0x3020004 + + +#define SSD_PV3_ROM_NR_BM_FW 1 +#define SSD_PV3_ROM_BM_FW_SZ (64*1024*8) + +#define SSD_ROM_LOG_SZ (64*1024*4) + +#define SSD_ROM_NR_SMART_MAX 2 +#define SSD_PV3_ROM_NR_SMART SSD_ROM_NR_SMART_MAX +#define SSD_PV3_ROM_SMART_SZ (64*1024) + +/* reverion 3.2 */ +#define SSD_PV3_2_ROM_LOG_SZ (64*1024*80) /* 5MB */ +#define SSD_PV3_2_ROM_SEC_SZ (256*1024) /* 256KB */ + + +/* register */ +#define SSD_REQ_FIFO_REG 0x0000 +#define SSD_RESP_FIFO_REG 0x0008 //0x0010 +#define SSD_RESP_PTR_REG 0x0010 //0x0018 +#define SSD_INTR_INTERVAL_REG 0x0018 +#define SSD_READY_REG 0x001C +#define SSD_BRIDGE_TEST_REG 0x0020 +#define SSD_STRIPE_SIZE_REG 0x0028 +#define SSD_CTRL_VER_REG 0x0030 //controller +#define SSD_BRIDGE_VER_REG 0x0034 //bridge +#define SSD_PCB_VER_REG 0x0038 +#define SSD_BURN_FLAG_REG 0x0040 +#define SSD_BRIDGE_INFO_REG 0x0044 + +#define SSD_WL_VAL_REG 0x0048 //32-bit + +#define SSD_BB_INFO_REG 0x004C + +#define SSD_ECC_TEST_REG 0x0050 //test only +#define SSD_ERASE_TEST_REG 0x0058 //test only +#define SSD_WRITE_TEST_REG 0x0060 //test only + +#define SSD_RESET_REG 0x0068 +#define SSD_RELOAD_FW_REG 0x0070 + +#define SSD_RESERVED_BLKS_REG 0x0074 +#define SSD_VALID_PAGES_REG 0x0078 +#define SSD_CH_INFO_REG 0x007C + +#define SSD_CTRL_TEST_REG_SZ 0x8 +#define SSD_CTRL_TEST_REG0 0x0080 +#define SSD_CTRL_TEST_REG1 0x0088 +#define SSD_CTRL_TEST_REG2 0x0090 +#define SSD_CTRL_TEST_REG3 0x0098 +#define SSD_CTRL_TEST_REG4 0x00A0 +#define SSD_CTRL_TEST_REG5 0x00A8 +#define SSD_CTRL_TEST_REG6 0x00B0 +#define SSD_CTRL_TEST_REG7 0x00B8 + +#define SSD_FLASH_INFO_REG0 0x00C0 +#define SSD_FLASH_INFO_REG1 0x00C8 +#define SSD_FLASH_INFO_REG2 0x00D0 +#define SSD_FLASH_INFO_REG3 0x00D8 +#define SSD_FLASH_INFO_REG4 0x00E0 +#define SSD_FLASH_INFO_REG5 0x00E8 +#define SSD_FLASH_INFO_REG6 0x00F0 +#define SSD_FLASH_INFO_REG7 0x00F8 + +#define SSD_RESP_INFO_REG 0x01B8 +#define SSD_NAND_BUFF_BASE 0x01BC //for nand write + +#define SSD_CHIP_INFO_REG_SZ 0x10 +#define SSD_CHIP_INFO_REG0 0x0100 //128 bit +#define SSD_CHIP_INFO_REG1 0x0110 +#define SSD_CHIP_INFO_REG2 0x0120 +#define SSD_CHIP_INFO_REG3 0x0130 +#define SSD_CHIP_INFO_REG4 0x0140 +#define SSD_CHIP_INFO_REG5 0x0150 +#define SSD_CHIP_INFO_REG6 0x0160 +#define SSD_CHIP_INFO_REG7 0x0170 + +#define SSD_RAM_INFO_REG 0x01C4 + +#define SSD_BBT_BASE_REG 0x01C8 +#define SSD_ECT_BASE_REG 0x01CC + +#define SSD_CLEAR_INTR_REG 0x01F0 + +#define SSD_INIT_STATE_REG_SZ 0x8 +#define SSD_INIT_STATE_REG0 0x0200 +#define SSD_INIT_STATE_REG1 0x0208 +#define SSD_INIT_STATE_REG2 0x0210 +#define SSD_INIT_STATE_REG3 0x0218 +#define SSD_INIT_STATE_REG4 0x0220 +#define SSD_INIT_STATE_REG5 0x0228 +#define SSD_INIT_STATE_REG6 0x0230 +#define SSD_INIT_STATE_REG7 0x0238 + +#define SSD_ROM_INFO_REG 0x0600 +#define SSD_ROM_BRIDGE_FW_INFO_REG 0x0604 +#define SSD_ROM_CTRL_FW_INFO_REG 0x0608 +#define SSD_ROM_VP_INFO_REG 0x060C + +#define SSD_LOG_INFO_REG 0x0610 +#define SSD_LED_REG 0x0614 +#define SSD_MSG_BASE_REG 0x06F8 + +/*spi reg */ +#define SSD_SPI_REG_CMD 0x0180 +#define SSD_SPI_REG_CMD_HI 0x0184 +#define SSD_SPI_REG_WDATA 0x0188 +#define SSD_SPI_REG_ID 0x0190 +#define SSD_SPI_REG_STATUS 0x0198 +#define SSD_SPI_REG_RDATA 0x01A0 +#define SSD_SPI_REG_READY 0x01A8 + +/* i2c register */ +#define SSD_I2C_CTRL_REG 0x06F0 +#define SSD_I2C_RDATA_REG 0x06F4 + +/* temperature reg */ +#define SSD_BRIGE_TEMP_REG 0x0618 + +#define SSD_CTRL_TEMP_REG0 0x0700 +#define SSD_CTRL_TEMP_REG1 0x0708 +#define SSD_CTRL_TEMP_REG2 0x0710 +#define SSD_CTRL_TEMP_REG3 0x0718 +#define SSD_CTRL_TEMP_REG4 0x0720 +#define SSD_CTRL_TEMP_REG5 0x0728 +#define SSD_CTRL_TEMP_REG6 0x0730 +#define SSD_CTRL_TEMP_REG7 0x0738 + +/* reversion 3 reg */ +#define SSD_PROTOCOL_VER_REG 0x01B4 + +#define SSD_FLUSH_TIMEOUT_REG 0x02A4 +#define SSD_BM_FAULT_REG 0x0660 + +#define SSD_PV3_RAM_STATUS_REG_SZ 0x4 +#define SSD_PV3_RAM_STATUS_REG0 0x0260 +#define SSD_PV3_RAM_STATUS_REG1 0x0264 +#define SSD_PV3_RAM_STATUS_REG2 0x0268 +#define SSD_PV3_RAM_STATUS_REG3 0x026C +#define SSD_PV3_RAM_STATUS_REG4 0x0270 +#define SSD_PV3_RAM_STATUS_REG5 0x0274 +#define SSD_PV3_RAM_STATUS_REG6 0x0278 +#define SSD_PV3_RAM_STATUS_REG7 0x027C + +#define SSD_PV3_CHIP_INFO_REG_SZ 0x40 +#define SSD_PV3_CHIP_INFO_REG0 0x0300 +#define SSD_PV3_CHIP_INFO_REG1 0x0340 +#define SSD_PV3_CHIP_INFO_REG2 0x0380 +#define SSD_PV3_CHIP_INFO_REG3 0x03B0 +#define SSD_PV3_CHIP_INFO_REG4 0x0400 +#define SSD_PV3_CHIP_INFO_REG5 0x0440 +#define SSD_PV3_CHIP_INFO_REG6 0x0480 +#define SSD_PV3_CHIP_INFO_REG7 0x04B0 + +#define SSD_PV3_INIT_STATE_REG_SZ 0x20 +#define SSD_PV3_INIT_STATE_REG0 0x0500 +#define SSD_PV3_INIT_STATE_REG1 0x0520 +#define SSD_PV3_INIT_STATE_REG2 0x0540 +#define SSD_PV3_INIT_STATE_REG3 0x0560 +#define SSD_PV3_INIT_STATE_REG4 0x0580 +#define SSD_PV3_INIT_STATE_REG5 0x05A0 +#define SSD_PV3_INIT_STATE_REG6 0x05C0 +#define SSD_PV3_INIT_STATE_REG7 0x05E0 + +/* reversion 3.1.1 reg */ +#define SSD_FULL_RESET_REG 0x01B0 + +#define SSD_CTRL_REG_ZONE_SZ 0x800 + +#define SSD_BB_THRESHOLD_L1_REG 0x2C0 +#define SSD_BB_THRESHOLD_L2_REG 0x2C4 + +#define SSD_BB_ACC_REG_SZ 0x4 +#define SSD_BB_ACC_REG0 0x21C0 +#define SSD_BB_ACC_REG1 0x29C0 +#define SSD_BB_ACC_REG2 0x31C0 + +#define SSD_EC_THRESHOLD_L1_REG 0x2C8 +#define SSD_EC_THRESHOLD_L2_REG 0x2CC + +#define SSD_EC_ACC_REG_SZ 0x4 +#define SSD_EC_ACC_REG0 0x21E0 +#define SSD_EC_ACC_REG1 0x29E0 +#define SSD_EC_ACC_REG2 0x31E0 + +/* reversion 3.1.2 & 3.1.3 reg */ +#define SSD_HW_STATUS_REG 0x02AC + +#define SSD_PLP_INFO_REG 0x0664 + +/*reversion 3.2 reg*/ +#define SSD_POWER_ON_REG 0x01EC +#define SSD_PCIE_LINKSTATUS_REG 0x01F8 +#define SSD_PL_CAP_LEARN_REG 0x01FC + +#define SSD_FPGA_1V0_REG0 0x2070 +#define SSD_FPGA_1V8_REG0 0x2078 +#define SSD_FPGA_1V0_REG1 0x2870 +#define SSD_FPGA_1V8_REG1 0x2878 + +/*reversion 3.2 reg*/ +#define SSD_READ_OT_REG0 0x2260 +#define SSD_WRITE_OT_REG0 0x2264 +#define SSD_READ_OT_REG1 0x2A60 +#define SSD_WRITE_OT_REG1 0x2A64 + + +/* function */ +#define SSD_FUNC_READ 0x01 +#define SSD_FUNC_WRITE 0x02 +#define SSD_FUNC_NAND_READ_WOOB 0x03 +#define SSD_FUNC_NAND_READ 0x04 +#define SSD_FUNC_NAND_WRITE 0x05 +#define SSD_FUNC_NAND_ERASE 0x06 +#define SSD_FUNC_NAND_READ_ID 0x07 +#define SSD_FUNC_READ_LOG 0x08 +#define SSD_FUNC_TRIM 0x09 +#define SSD_FUNC_RAM_READ 0x10 +#define SSD_FUNC_RAM_WRITE 0x11 +#define SSD_FUNC_FLUSH 0x12 //cache / bbt + +/* spi function */ +#define SSD_SPI_CMD_PROGRAM 0x02 +#define SSD_SPI_CMD_READ 0x03 +#define SSD_SPI_CMD_W_DISABLE 0x04 +#define SSD_SPI_CMD_READ_STATUS 0x05 +#define SSD_SPI_CMD_W_ENABLE 0x06 +#define SSD_SPI_CMD_ERASE 0xd8 +#define SSD_SPI_CMD_CLSR 0x30 +#define SSD_SPI_CMD_READ_ID 0x9f + +/* i2c */ +#define SSD_I2C_CTRL_READ 0x00 +#define SSD_I2C_CTRL_WRITE 0x01 + +/* i2c internal register */ +#define SSD_I2C_CFG_REG 0x00 +#define SSD_I2C_DATA_REG 0x01 +#define SSD_I2C_CMD_REG 0x02 +#define SSD_I2C_STATUS_REG 0x03 +#define SSD_I2C_SADDR_REG 0x04 +#define SSD_I2C_LEN_REG 0x05 +#define SSD_I2C_RLEN_REG 0x06 +#define SSD_I2C_WLEN_REG 0x07 +#define SSD_I2C_RESET_REG 0x08 //write for reset +#define SSD_I2C_PRER_REG 0x09 + + +/* hw mon */ +/* FPGA volt = ADC_value / 4096 * 3v */ +#define SSD_FPGA_1V0_ADC_MIN 1228 // 0.9v +#define SSD_FPGA_1V0_ADC_MAX 1502 // 1.1v +#define SSD_FPGA_1V8_ADC_MIN 2211 // 1.62v +#define SSD_FPGA_1V8_ADC_MAX 2703 // 1.98 + +/* ADC value */ +#define SSD_FPGA_VOLT_MAX(val) (((val) & 0xffff) >> 4) +#define SSD_FPGA_VOLT_MIN(val) (((val >> 16) & 0xffff) >> 4) +#define SSD_FPGA_VOLT_CUR(val) (((val >> 32) & 0xffff) >> 4) +#define SSD_FPGA_VOLT(val) ((val * 3000) >> 12) + +#define SSD_VOLT_LOG_DATA(idx, ctrl, volt) (((uint32_t)idx << 24) | ((uint32_t)ctrl << 16) | ((uint32_t)volt)) + +enum ssd_fpga_volt +{ + SSD_FPGA_1V0 = 0, + SSD_FPGA_1V8, + SSD_FPGA_VOLT_NR +}; + +enum ssd_clock +{ + SSD_CLOCK_166M_LOST = 0, + SSD_CLOCK_166M_SKEW, + SSD_CLOCK_156M_LOST, + SSD_CLOCK_156M_SKEW, + SSD_CLOCK_NR +}; + +/* sensor */ +#define SSD_SENSOR_LM75_SADDRESS (0x49 << 1) +#define SSD_SENSOR_LM80_SADDRESS (0x28 << 1) + +#define SSD_SENSOR_CONVERT_TEMP(val) ((int)(val >> 8)) + +#define SSD_INLET_OT_TEMP (55) //55 DegC +#define SSD_INLET_OT_HYST (50) //50 DegC +#define SSD_FLASH_OT_TEMP (70) //70 DegC +#define SSD_FLASH_OT_HYST (65) //65 DegC + +enum ssd_sensor +{ + SSD_SENSOR_LM80 = 0, + SSD_SENSOR_LM75, + SSD_SENSOR_NR +}; + + +/* lm75 */ +enum ssd_lm75_reg +{ + SSD_LM75_REG_TEMP = 0, + SSD_LM75_REG_CONF, + SSD_LM75_REG_THYST, + SSD_LM75_REG_TOS +}; + +/* lm96080 */ +#define SSD_LM80_REG_IN_MAX(nr) (0x2a + (nr) * 2) +#define SSD_LM80_REG_IN_MIN(nr) (0x2b + (nr) * 2) +#define SSD_LM80_REG_IN(nr) (0x20 + (nr)) + +#define SSD_LM80_REG_FAN1 0x28 +#define SSD_LM80_REG_FAN2 0x29 +#define SSD_LM80_REG_FAN_MIN(nr) (0x3b + (nr)) + +#define SSD_LM80_REG_TEMP 0x27 +#define SSD_LM80_REG_TEMP_HOT_MAX 0x38 +#define SSD_LM80_REG_TEMP_HOT_HYST 0x39 +#define SSD_LM80_REG_TEMP_OS_MAX 0x3a +#define SSD_LM80_REG_TEMP_OS_HYST 0x3b + +#define SSD_LM80_REG_CONFIG 0x00 +#define SSD_LM80_REG_ALARM1 0x01 +#define SSD_LM80_REG_ALARM2 0x02 +#define SSD_LM80_REG_MASK1 0x03 +#define SSD_LM80_REG_MASK2 0x04 +#define SSD_LM80_REG_FANDIV 0x05 +#define SSD_LM80_REG_RES 0x06 + +#define SSD_LM80_CONVERT_VOLT(val) ((val * 10) >> 8) + +#define SSD_LM80_3V3_VOLT(val) ((val)*33/19) + +#define SSD_LM80_CONV_INTERVAL (1000) + +enum ssd_lm80_in +{ + SSD_LM80_IN_CAP = 0, + SSD_LM80_IN_1V2, + SSD_LM80_IN_1V2a, + SSD_LM80_IN_1V5, + SSD_LM80_IN_1V8, + SSD_LM80_IN_FPGA_3V3, + SSD_LM80_IN_3V3, + SSD_LM80_IN_NR +}; + +struct ssd_lm80_limit +{ + uint8_t low; + uint8_t high; +}; + +/* +/- 5% except cap in*/ +static struct ssd_lm80_limit ssd_lm80_limit[SSD_LM80_IN_NR] = { + {171, 217}, /* CAP in: 1710 ~ 2170 */ + {114, 126}, + {114, 126}, + {142, 158}, + {171, 189}, + {180, 200}, + {180, 200}, +}; + +/* temperature sensors */ +enum ssd_temp_sensor +{ + SSD_TEMP_INLET = 0, + SSD_TEMP_FLASH, + SSD_TEMP_CTRL, + SSD_TEMP_NR +}; + + +#ifdef SSD_OT_PROTECT +#define SSD_OT_DELAY (60) //ms + +#define SSD_OT_TEMP (90) //90 DegC + +#define SSD_OT_TEMP_HYST (85) //85 DegC +#endif + +/* fpga temperature */ +//#define CONVERT_TEMP(val) ((float)(val)*503.975f/4096.0f-273.15f) +#define CONVERT_TEMP(val) ((val)*504/4096-273) + +#define MAX_TEMP(val) CONVERT_TEMP(((val & 0xffff) >> 4)) +#define MIN_TEMP(val) CONVERT_TEMP((((val>>16) & 0xffff) >> 4)) +#define CUR_TEMP(val) CONVERT_TEMP((((val>>32) & 0xffff) >> 4)) + + +/* CAP monitor */ +#define SSD_PL_CAP_U1 SSD_LM80_REG_IN(SSD_LM80_IN_CAP) +#define SSD_PL_CAP_U2 SSD_LM80_REG_IN(SSD_LM80_IN_1V8) +#define SSD_PL_CAP_LEARN(u1, u2, t) ((t*(u1+u2))/(2*162*(u1-u2))) +#define SSD_PL_CAP_LEARN_WAIT (20) //20ms +#define SSD_PL_CAP_LEARN_MAX_WAIT (1000/SSD_PL_CAP_LEARN_WAIT) //1s + +#define SSD_PL_CAP_CHARGE_WAIT (1000) +#define SSD_PL_CAP_CHARGE_MAX_WAIT ((120*1000)/SSD_PL_CAP_CHARGE_WAIT) //120s + +#define SSD_PL_CAP_VOLT(val) (val*7) + +#define SSD_PL_CAP_VOLT_FULL (13700) +#define SSD_PL_CAP_VOLT_READY (12880) + +#define SSD_PL_CAP_THRESHOLD (8900) +#define SSD_PL_CAP_CP_THRESHOLD (5800) +#define SSD_PL_CAP_THRESHOLD_HYST (100) + +enum ssd_pl_cap_status +{ + SSD_PL_CAP = 0, + SSD_PL_CAP_NR +}; + +enum ssd_pl_cap_type +{ + SSD_PL_CAP_DEFAULT = 0, /* 4 cap */ + SSD_PL_CAP_CP /* 3 cap */ +}; + + +/* hwmon offset */ +#define SSD_HWMON_OFFS_TEMP (0) +#define SSD_HWMON_OFFS_SENSOR (SSD_HWMON_OFFS_TEMP + SSD_TEMP_NR) +#define SSD_HWMON_OFFS_PL_CAP (SSD_HWMON_OFFS_SENSOR + SSD_SENSOR_NR) +#define SSD_HWMON_OFFS_LM80 (SSD_HWMON_OFFS_PL_CAP + SSD_PL_CAP_NR) +#define SSD_HWMON_OFFS_CLOCK (SSD_HWMON_OFFS_LM80 + SSD_LM80_IN_NR) +#define SSD_HWMON_OFFS_FPGA (SSD_HWMON_OFFS_CLOCK + SSD_CLOCK_NR) + +#define SSD_HWMON_TEMP(idx) (SSD_HWMON_OFFS_TEMP + idx) +#define SSD_HWMON_SENSOR(idx) (SSD_HWMON_OFFS_SENSOR + idx) +#define SSD_HWMON_PL_CAP(idx) (SSD_HWMON_OFFS_PL_CAP + idx) +#define SSD_HWMON_LM80(idx) (SSD_HWMON_OFFS_LM80 + idx) +#define SSD_HWMON_CLOCK(idx) (SSD_HWMON_OFFS_CLOCK + idx) +#define SSD_HWMON_FPGA(ctrl, idx) (SSD_HWMON_OFFS_FPGA + (ctrl * SSD_FPGA_VOLT_NR) + idx) + + + +/* fifo */ +typedef struct sfifo +{ + uint32_t in; + uint32_t out; + uint32_t size; + uint32_t esize; + uint32_t mask; + spinlock_t lock; + void *data; +} sfifo_t; + +static int sfifo_alloc(struct sfifo *fifo, uint32_t size, uint32_t esize) +{ + uint32_t __size = 1; + + if (!fifo || size > INT_MAX || esize == 0) { + return -EINVAL; + } + + while (__size < size) __size <<= 1; + + if (__size < 2) { + return -EINVAL; + } + + fifo->data = vmalloc(esize * __size); + if (!fifo->data) { + return -ENOMEM; + } + + fifo->in = 0; + fifo->out = 0; + fifo->mask = __size - 1; + fifo->size = __size; + fifo->esize = esize; + spin_lock_init(&fifo->lock); + + return 0; +} + +static void sfifo_free(struct sfifo *fifo) +{ + if (!fifo) { + return; + } + + vfree(fifo->data); + fifo->data = NULL; + fifo->in = 0; + fifo->out = 0; + fifo->mask = 0; + fifo->size = 0; + fifo->esize = 0; +} + +static int __sfifo_put(struct sfifo *fifo, void *val) +{ + if (((fifo->in + 1) & fifo->mask) == fifo->out) { + return -1; + } + + memcpy((fifo->data + (fifo->in * fifo->esize)), val, fifo->esize); + fifo->in = (fifo->in + 1) & fifo->mask; + + return 0; +} + +static int sfifo_put(struct sfifo *fifo, void *val) +{ + int ret = 0; + + if (!fifo || !val) { + return -EINVAL; + } + + if (!in_interrupt()) { + spin_lock_irq(&fifo->lock); + ret = __sfifo_put(fifo, val); + spin_unlock_irq(&fifo->lock); + } else { + spin_lock(&fifo->lock); + ret = __sfifo_put(fifo, val); + spin_unlock(&fifo->lock); + } + + return ret; +} + +static int __sfifo_get(struct sfifo *fifo, void *val) +{ + if (fifo->out == fifo->in) { + return -1; + } + + memcpy(val, (fifo->data + (fifo->out * fifo->esize)), fifo->esize); + fifo->out = (fifo->out + 1) & fifo->mask; + + return 0; +} + +static int sfifo_get(struct sfifo *fifo, void *val) +{ + int ret = 0; + + if (!fifo || !val) { + return -EINVAL; + } + + if (!in_interrupt()) { + spin_lock_irq(&fifo->lock); + ret = __sfifo_get(fifo, val); + spin_unlock_irq(&fifo->lock); + } else { + spin_lock(&fifo->lock); + ret = __sfifo_get(fifo, val); + spin_unlock(&fifo->lock); + } + + return ret; +} + +/* bio list */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) +struct ssd_blist { + struct bio *prev; + struct bio *next; +}; + +static inline void ssd_blist_init(struct ssd_blist *ssd_bl) +{ + ssd_bl->prev = NULL; + ssd_bl->next = NULL; +} + +static inline struct bio *ssd_blist_get(struct ssd_blist *ssd_bl) +{ + struct bio *bio = ssd_bl->prev; + + ssd_bl->prev = NULL; + ssd_bl->next = NULL; + + return bio; +} + +static inline void ssd_blist_add(struct ssd_blist *ssd_bl, struct bio *bio) +{ + bio->bi_next = NULL; + + if (ssd_bl->next) { + ssd_bl->next->bi_next = bio; + } else { + ssd_bl->prev = bio; + } + + ssd_bl->next = bio; +} + +#else +#define ssd_blist bio_list +#define ssd_blist_init bio_list_init +#define ssd_blist_get bio_list_get +#define ssd_blist_add bio_list_add +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)) +#define bio_start(bio) (bio->bi_sector) +#else +#define bio_start(bio) (bio->bi_iter.bi_sector) +#endif + +/* mutex */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)) +#define mutex_lock down +#define mutex_unlock up +#define mutex semaphore +#define mutex_init init_MUTEX +#endif + +/* i2c */ +typedef union ssd_i2c_ctrl { + uint32_t val; + struct { + uint8_t wdata; + uint8_t addr; + uint16_t rw:1; + uint16_t pad:15; + } bits; +}__attribute__((packed)) ssd_i2c_ctrl_t; + +typedef union ssd_i2c_data { + uint32_t val; + struct { + uint32_t rdata:8; + uint32_t valid:1; + uint32_t pad:23; + } bits; +}__attribute__((packed)) ssd_i2c_data_t; + +/* write mode */ +enum ssd_write_mode +{ + SSD_WMODE_BUFFER = 0, + SSD_WMODE_BUFFER_EX, + SSD_WMODE_FUA, + /* dummy */ + SSD_WMODE_AUTO, + SSD_WMODE_DEFAULT +}; + +/* reset type */ +enum ssd_reset_type +{ + SSD_RST_NOINIT = 0, + SSD_RST_NORMAL, + SSD_RST_FULL +}; + +/* ssd msg */ +typedef struct ssd_sg_entry +{ + uint64_t block:48; + uint64_t length:16; + uint64_t buf; +}__attribute__((packed))ssd_sg_entry_t; + +typedef struct ssd_rw_msg +{ + uint8_t tag; + uint8_t flag; + uint8_t nsegs; + uint8_t fun; + uint32_t reserved; //for 64-bit align + struct ssd_sg_entry sge[1]; //base +}__attribute__((packed))ssd_rw_msg_t; + +typedef struct ssd_resp_msg +{ + uint8_t tag; + uint8_t status:2; + uint8_t bitflip:6; + uint8_t log; + uint8_t fun; + uint32_t reserved; +}__attribute__((packed))ssd_resp_msg_t; + +typedef struct ssd_flush_msg +{ + uint8_t tag; + uint8_t flag:2; //flash cache 0 or bbt 1 + uint8_t flash:6; + uint8_t ctrl_idx; + uint8_t fun; + uint32_t reserved; //align +}__attribute__((packed))ssd_flush_msg_t; + +typedef struct ssd_nand_op_msg +{ + uint8_t tag; + uint8_t flag; + uint8_t ctrl_idx; + uint8_t fun; + uint32_t reserved; //align + uint16_t page_count; + uint8_t chip_ce; + uint8_t chip_no; + uint32_t page_no; + uint64_t buf; +}__attribute__((packed))ssd_nand_op_msg_t; + +typedef struct ssd_ram_op_msg +{ + uint8_t tag; + uint8_t flag; + uint8_t ctrl_idx; + uint8_t fun; + uint32_t reserved; //align + uint32_t start; + uint32_t length; + uint64_t buf; +}__attribute__((packed))ssd_ram_op_msg_t; + + +/* log msg */ +typedef struct ssd_log_msg +{ + uint8_t tag; + uint8_t flag; + uint8_t ctrl_idx; + uint8_t fun; + uint32_t reserved; //align + uint64_t buf; +}__attribute__((packed))ssd_log_msg_t; + +typedef struct ssd_log_op_msg +{ + uint8_t tag; + uint8_t flag; + uint8_t ctrl_idx; + uint8_t fun; + uint32_t reserved; //align + uint64_t reserved1; //align + uint64_t buf; +}__attribute__((packed))ssd_log_op_msg_t; + +typedef struct ssd_log_resp_msg +{ + uint8_t tag; + uint16_t status :2; + uint16_t reserved1 :2; //align with the normal resp msg + uint16_t nr_log :12; + uint8_t fun; + uint32_t reserved; +}__attribute__((packed))ssd_log_resp_msg_t; + + +/* resp msg */ +typedef union ssd_response_msq +{ + ssd_resp_msg_t resp_msg; + ssd_log_resp_msg_t log_resp_msg; + uint64_t u64_msg; + uint32_t u32_msg[2]; +} ssd_response_msq_t; + + +/* custom struct */ +typedef struct ssd_protocol_info +{ + uint32_t ver; + uint32_t init_state_reg; + uint32_t init_state_reg_sz; + uint32_t chip_info_reg; + uint32_t chip_info_reg_sz; +} ssd_protocol_info_t; + +typedef struct ssd_hw_info +{ + uint32_t bridge_ver; + uint32_t ctrl_ver; + + uint32_t cmd_fifo_sz; + uint32_t cmd_fifo_sz_mask; + uint32_t cmd_max_sg; + uint32_t sg_max_sec; + uint32_t resp_ptr_sz; + uint32_t resp_msg_sz; + + uint16_t nr_ctrl; + + uint16_t nr_data_ch; + uint16_t nr_ch; + uint16_t max_ch; + uint16_t nr_chip; + + uint8_t pcb_ver; + uint8_t upper_pcb_ver; + + uint8_t nand_vendor_id; + uint8_t nand_dev_id; + + uint8_t max_ce; + uint8_t id_size; + uint16_t oob_size; + + uint16_t bbf_pages; + uint16_t bbf_seek; // + + uint16_t page_count; //per block + uint32_t page_size; + uint32_t block_count; //per flash + + uint64_t ram_size; + uint32_t ram_align; + uint32_t ram_max_len; + + uint64_t bbt_base; + uint32_t bbt_size; + uint64_t md_base; //metadata + uint32_t md_size; + uint32_t md_entry_sz; + + uint32_t log_sz; + + uint64_t nand_wbuff_base; + + uint32_t md_reserved_blks; + uint32_t reserved_blks; + uint32_t valid_pages; + uint32_t max_valid_pages; + uint64_t size; +} ssd_hw_info_t; + +typedef struct ssd_hw_info_extend +{ + uint8_t board_type; + uint8_t cap_type; + uint8_t plp_type; + uint8_t work_mode; + uint8_t form_factor; + + uint8_t pad[59]; +}ssd_hw_info_extend_t; + +typedef struct ssd_rom_info +{ + uint32_t size; + uint32_t block_size; + uint16_t page_size; + uint8_t nr_bridge_fw; + uint8_t nr_ctrl_fw; + uint8_t nr_bm_fw; + uint8_t nr_smart; + uint32_t bridge_fw_base; + uint32_t bridge_fw_sz; + uint32_t ctrl_fw_base; + uint32_t ctrl_fw_sz; + uint32_t bm_fw_base; + uint32_t bm_fw_sz; + uint32_t log_base; + uint32_t log_sz; + uint32_t smart_base; + uint32_t smart_sz; + uint32_t vp_base; + uint32_t label_base; +} ssd_rom_info_t; + +/* debug info */ +enum ssd_debug_type +{ + SSD_DEBUG_NONE = 0, + SSD_DEBUG_READ_ERR, + SSD_DEBUG_WRITE_ERR, + SSD_DEBUG_RW_ERR, + SSD_DEBUG_READ_TO, + SSD_DEBUG_WRITE_TO, + SSD_DEBUG_RW_TO, + SSD_DEBUG_LOG, + SSD_DEBUG_OFFLINE, + SSD_DEBUG_NR +}; + +typedef struct ssd_debug_info +{ + int type; + union { + struct { + uint64_t off; + uint32_t len; + } loc; + struct { + int event; + uint32_t extra; + } log; + } data; +}ssd_debug_info_t; + +/* label */ +#define SSD_LABEL_FIELD_SZ 32 +#define SSD_SN_SZ 16 + +typedef struct ssd_label +{ + char date[SSD_LABEL_FIELD_SZ]; + char sn[SSD_LABEL_FIELD_SZ]; + char part[SSD_LABEL_FIELD_SZ]; + char desc[SSD_LABEL_FIELD_SZ]; + char other[SSD_LABEL_FIELD_SZ]; + char maf[SSD_LABEL_FIELD_SZ]; +} ssd_label_t; + +#define SSD_LABEL_DESC_SZ 256 + +typedef struct ssd_labelv3 +{ + char boardtype[SSD_LABEL_FIELD_SZ]; + char barcode[SSD_LABEL_FIELD_SZ]; + char item[SSD_LABEL_FIELD_SZ]; + char description[SSD_LABEL_DESC_SZ]; + char manufactured[SSD_LABEL_FIELD_SZ]; + char vendorname[SSD_LABEL_FIELD_SZ]; + char issuenumber[SSD_LABEL_FIELD_SZ]; + char cleicode[SSD_LABEL_FIELD_SZ]; + char bom[SSD_LABEL_FIELD_SZ]; +} ssd_labelv3_t; + +/* battery */ +typedef struct ssd_battery_info +{ + uint32_t fw_ver; +} ssd_battery_info_t; + +/* ssd power stat */ +typedef struct ssd_power_stat +{ + uint64_t nr_poweron; + uint64_t nr_powerloss; + uint64_t init_failed; +} ssd_power_stat_t; + +/* io stat */ +typedef struct ssd_io_stat +{ + uint64_t run_time; + uint64_t nr_to; + uint64_t nr_ioerr; + uint64_t nr_rwerr; + uint64_t nr_read; + uint64_t nr_write; + uint64_t rsectors; + uint64_t wsectors; +} ssd_io_stat_t; + +/* ecc */ +typedef struct ssd_ecc_info +{ + uint64_t bitflip[SSD_ECC_MAX_FLIP]; +} ssd_ecc_info_t; + +/* log */ +enum ssd_log_level +{ + SSD_LOG_LEVEL_INFO = 0, + SSD_LOG_LEVEL_NOTICE, + SSD_LOG_LEVEL_WARNING, + SSD_LOG_LEVEL_ERR, + SSD_LOG_NR_LEVEL +}; + +typedef struct ssd_log_info +{ + uint64_t nr_log; + uint64_t stat[SSD_LOG_NR_LEVEL]; +} ssd_log_info_t; + +/* S.M.A.R.T. */ +#define SSD_SMART_MAGIC (0x5452414D53445353ull) + +typedef struct ssd_smart +{ + struct ssd_power_stat pstat; + struct ssd_io_stat io_stat; + struct ssd_ecc_info ecc_info; + struct ssd_log_info log_info; + uint64_t version; + uint64_t magic; +} ssd_smart_t; + +/* internal log */ +typedef struct ssd_internal_log +{ + uint32_t nr_log; + void *log; +} ssd_internal_log_t; + +/* ssd cmd */ +typedef struct ssd_cmd +{ + struct bio *bio; + struct scatterlist *sgl; + struct list_head list; + void *dev; + int nsegs; + int flag; /*pbio(1) or bio(0)*/ + + int tag; + void *msg; + dma_addr_t msg_dma; + + unsigned long start_time; + + int errors; + unsigned int nr_log; + + struct timer_list cmd_timer; + struct completion *waiting; +} ssd_cmd_t; + +typedef void (*send_cmd_func)(struct ssd_cmd *); +typedef int (*ssd_event_call)(struct gendisk *, int, int); /* gendisk, event id, event level */ + +/* dcmd sz */ +#define SSD_DCMD_MAX_SZ 32 + +typedef struct ssd_dcmd +{ + struct list_head list; + void *dev; + uint8_t msg[SSD_DCMD_MAX_SZ]; +} ssd_dcmd_t; + + +enum ssd_state { + SSD_INIT_WORKQ, + SSD_INIT_BD, + SSD_ONLINE, + /* full reset */ + SSD_RESETING, + /* hw log */ + SSD_LOG_HW, + /* log err */ + SSD_LOG_ERR +}; + +#define SSD_QUEUE_NAME_LEN 16 +typedef struct ssd_queue { + char name[SSD_QUEUE_NAME_LEN]; + void *dev; + + int idx; + + uint32_t resp_idx; + uint32_t resp_idx_mask; + uint32_t resp_msg_sz; + + void *resp_msg; + void *resp_ptr; + + struct ssd_cmd *cmd; + + struct ssd_io_stat io_stat; + struct ssd_ecc_info ecc_info; +} ssd_queue_t; + +typedef struct ssd_device { + char name[SSD_DEV_NAME_LEN]; + + int idx; + int major; + int readonly; + + int int_mode; +#ifdef SSD_ESCAPE_IRQ + int irq_cpu; +#endif + + int reload_fw; + + int ot_delay; //in ms + + atomic_t refcnt; + atomic_t tocnt; + atomic_t in_flight[2]; //r&w + + uint64_t uptime; + + struct list_head list; + struct pci_dev *pdev; + + unsigned long mmio_base; + unsigned long mmio_len; + void __iomem *ctrlp; + + struct mutex spi_mutex; + struct mutex i2c_mutex; + + struct ssd_protocol_info protocol_info; + struct ssd_hw_info hw_info; + struct ssd_rom_info rom_info; + struct ssd_label label; + + struct ssd_smart smart; + + atomic_t in_sendq; + spinlock_t sendq_lock; + struct ssd_blist sendq; + struct task_struct *send_thread; + wait_queue_head_t send_waitq; + + atomic_t in_doneq; + spinlock_t doneq_lock; + struct ssd_blist doneq; + struct task_struct *done_thread; + wait_queue_head_t done_waitq; + + struct ssd_dcmd *dcmd; + spinlock_t dcmd_lock; + struct list_head dcmd_list; /* direct cmd list */ + wait_queue_head_t dcmd_wq; + + unsigned long *tag_map; + wait_queue_head_t tag_wq; + + spinlock_t cmd_lock; + struct ssd_cmd *cmd; + send_cmd_func scmd; + + ssd_event_call event_call; + void *msg_base; + dma_addr_t msg_base_dma; + + uint32_t resp_idx; + void *resp_msg_base; + void *resp_ptr_base; + dma_addr_t resp_msg_base_dma; + dma_addr_t resp_ptr_base_dma; + + int nr_queue; + struct msix_entry entry[SSD_MSIX_VEC]; + struct ssd_queue queue[SSD_MSIX_VEC]; + + struct request_queue *rq; /* The device request queue */ + struct gendisk *gd; /* The gendisk structure */ + + struct mutex internal_log_mutex; + struct ssd_internal_log internal_log; + struct workqueue_struct *workq; + struct work_struct log_work; /* get log */ + void *log_buf; + + unsigned long state; /* device state, for example, block device inited */ + + struct module *owner; + + /* extend */ + + int slave; + int cmajor; + int save_md; + int ot_protect; + + struct kref kref; + + struct mutex gd_mutex; + struct ssd_log_info log_info; /* volatile */ + + atomic_t queue_depth; + struct mutex barrier_mutex; + struct mutex fw_mutex; + + struct ssd_hw_info_extend hw_info_ext; + struct ssd_labelv3 labelv3; + + int wmode; + int user_wmode; + struct mutex bm_mutex; + struct work_struct bm_work; /* check bm */ + struct timer_list bm_timer; + struct sfifo log_fifo; + + struct timer_list routine_timer; + unsigned long routine_tick; + unsigned long hwmon; + + struct work_struct hwmon_work; /* check hw */ + struct work_struct capmon_work; /* check battery */ + struct work_struct tempmon_work; /* check temp */ + + /* debug info */ + struct ssd_debug_info db_info; +} ssd_device_t; + + +/* Ioctl struct */ +typedef struct ssd_acc_info { + uint32_t threshold_l1; + uint32_t threshold_l2; + uint32_t val; +} ssd_acc_info_t; + +typedef struct ssd_reg_op_info +{ + uint32_t offset; + uint32_t value; +} ssd_reg_op_info_t; + +typedef struct ssd_spi_op_info +{ + void __user *buf; + uint32_t off; + uint32_t len; +} ssd_spi_op_info_t; + +typedef struct ssd_i2c_op_info +{ + uint8_t saddr; + uint8_t wsize; + uint8_t rsize; + void __user *wbuf; + void __user *rbuf; +} ssd_i2c_op_info_t; + +typedef struct ssd_smbus_op_info +{ + uint8_t saddr; + uint8_t cmd; + uint8_t size; + void __user *buf; +} ssd_smbus_op_info_t; + +typedef struct ssd_ram_op_info { + uint8_t ctrl_idx; + uint32_t length; + uint64_t start; + uint8_t __user *buf; +} ssd_ram_op_info_t; + +typedef struct ssd_flash_op_info { + uint32_t page; + uint16_t flash; + uint8_t chip; + uint8_t ctrl_idx; + uint8_t __user *buf; +} ssd_flash_op_info_t; + +typedef struct ssd_sw_log_info { + uint16_t event; + uint16_t pad; + uint32_t data; +} ssd_sw_log_info_t; + +typedef struct ssd_version_info +{ + uint32_t bridge_ver; /* bridge fw version */ + uint32_t ctrl_ver; /* controller fw version */ + uint32_t bm_ver; /* battery manager fw version */ + uint8_t pcb_ver; /* main pcb version */ + uint8_t upper_pcb_ver; + uint8_t pad0; + uint8_t pad1; +} ssd_version_info_t; + +typedef struct pci_addr +{ + uint16_t domain; + uint8_t bus; + uint8_t slot; + uint8_t func; +} pci_addr_t; + +typedef struct ssd_drv_param_info { + int mode; + int status_mask; + int int_mode; + int threaded_irq; + int log_level; + int wmode; + int ot_protect; + int finject; + int pad[8]; +} ssd_drv_param_info_t; + + +/* form factor */ +enum ssd_form_factor +{ + SSD_FORM_FACTOR_HHHL = 0, + SSD_FORM_FACTOR_FHHL +}; + + +/* ssd power loss protect */ +enum ssd_plp_type +{ + SSD_PLP_SCAP = 0, + SSD_PLP_CAP, + SSD_PLP_NONE +}; + +/* ssd bm */ +#define SSD_BM_SLAVE_ADDRESS 0x16 +#define SSD_BM_CAP 5 + +/* SBS cmd */ +#define SSD_BM_SAFETYSTATUS 0x51 +#define SSD_BM_OPERATIONSTATUS 0x54 + +/* ManufacturerAccess */ +#define SSD_BM_MANUFACTURERACCESS 0x00 +#define SSD_BM_ENTER_CAP_LEARNING 0x0023 /* cap learning */ + +/* Data flash access */ +#define SSD_BM_DATA_FLASH_SUBCLASS_ID 0x77 +#define SSD_BM_DATA_FLASH_SUBCLASS_ID_PAGE1 0x78 +#define SSD_BM_SYSTEM_DATA_SUBCLASS_ID 56 +#define SSD_BM_CONFIGURATION_REGISTERS_ID 64 + +/* min cap voltage */ +#define SSD_BM_CAP_VOLT_MIN 500 + +/* +enum ssd_bm_cap +{ + SSD_BM_CAP_VINA = 1, + SSD_BM_CAP_JH = 3 +};*/ + +enum ssd_bmstatus +{ + SSD_BMSTATUS_OK = 0, + SSD_BMSTATUS_CHARGING, /* not fully charged */ + SSD_BMSTATUS_WARNING +}; + +enum sbs_unit { + SBS_UNIT_VALUE = 0, + SBS_UNIT_TEMPERATURE, + SBS_UNIT_VOLTAGE, + SBS_UNIT_CURRENT, + SBS_UNIT_ESR, + SBS_UNIT_PERCENT, + SBS_UNIT_CAPACITANCE +}; + +enum sbs_size { + SBS_SIZE_BYTE = 1, + SBS_SIZE_WORD, + SBS_SIZE_BLK, +}; + +struct sbs_cmd { + uint8_t cmd; + uint8_t size; + uint8_t unit; + uint8_t off; + uint16_t mask; + char *desc; +}; + +struct ssd_bm { + uint16_t temp; + uint16_t volt; + uint16_t curr; + uint16_t esr; + uint16_t rsoc; + uint16_t health; + uint16_t cap; + uint16_t chg_curr; + uint16_t chg_volt; + uint16_t cap_volt[SSD_BM_CAP]; + uint16_t sf_alert; + uint16_t sf_status; + uint16_t op_status; + uint16_t sys_volt; +}; + +struct ssd_bm_manufacturer_data +{ + uint16_t pack_lot_code; + uint16_t pcb_lot_code; + uint16_t firmware_ver; + uint16_t hardware_ver; +}; + +struct ssd_bm_configuration_registers +{ + struct { + uint16_t cc:3; + uint16_t rsvd:5; + uint16_t stack:1; + uint16_t rsvd1:2; + uint16_t temp:2; + uint16_t rsvd2:1; + uint16_t lt_en:1; + uint16_t rsvd3:1; + } operation_cfg; + uint16_t pad; + uint16_t fet_action; + uint16_t pad1; + uint16_t fault; +}; + +#define SBS_VALUE_MASK 0xffff + +#define bm_var_offset(var) ((size_t) &((struct ssd_bm *)0)->var) +#define bm_var(start, offset) ((void *) start + (offset)) + +static struct sbs_cmd ssd_bm_sbs[] = { + {0x08, SBS_SIZE_WORD, SBS_UNIT_TEMPERATURE, bm_var_offset(temp), SBS_VALUE_MASK, "Temperature"}, + {0x09, SBS_SIZE_WORD, SBS_UNIT_VOLTAGE, bm_var_offset(volt), SBS_VALUE_MASK, "Voltage"}, + {0x0a, SBS_SIZE_WORD, SBS_UNIT_CURRENT, bm_var_offset(curr), SBS_VALUE_MASK, "Current"}, + {0x0b, SBS_SIZE_WORD, SBS_UNIT_ESR, bm_var_offset(esr), SBS_VALUE_MASK, "ESR"}, + {0x0d, SBS_SIZE_BYTE, SBS_UNIT_PERCENT, bm_var_offset(rsoc), SBS_VALUE_MASK, "RelativeStateOfCharge"}, + {0x0e, SBS_SIZE_BYTE, SBS_UNIT_PERCENT, bm_var_offset(health), SBS_VALUE_MASK, "Health"}, + {0x10, SBS_SIZE_WORD, SBS_UNIT_CAPACITANCE, bm_var_offset(cap), SBS_VALUE_MASK, "Capacitance"}, + {0x14, SBS_SIZE_WORD, SBS_UNIT_CURRENT, bm_var_offset(chg_curr), SBS_VALUE_MASK, "ChargingCurrent"}, + {0x15, SBS_SIZE_WORD, SBS_UNIT_VOLTAGE, bm_var_offset(chg_volt), SBS_VALUE_MASK, "ChargingVoltage"}, + {0x3b, SBS_SIZE_WORD, SBS_UNIT_VOLTAGE, (uint8_t)bm_var_offset(cap_volt[4]), SBS_VALUE_MASK, "CapacitorVoltage5"}, + {0x3c, SBS_SIZE_WORD, SBS_UNIT_VOLTAGE, (uint8_t)bm_var_offset(cap_volt[3]), SBS_VALUE_MASK, "CapacitorVoltage4"}, + {0x3d, SBS_SIZE_WORD, SBS_UNIT_VOLTAGE, (uint8_t)bm_var_offset(cap_volt[2]), SBS_VALUE_MASK, "CapacitorVoltage3"}, + {0x3e, SBS_SIZE_WORD, SBS_UNIT_VOLTAGE, (uint8_t)bm_var_offset(cap_volt[1]), SBS_VALUE_MASK, "CapacitorVoltage2"}, + {0x3f, SBS_SIZE_WORD, SBS_UNIT_VOLTAGE, (uint8_t)bm_var_offset(cap_volt[0]), SBS_VALUE_MASK, "CapacitorVoltage1"}, + {0x50, SBS_SIZE_WORD, SBS_UNIT_VALUE, bm_var_offset(sf_alert), 0x870F, "SafetyAlert"}, + {0x51, SBS_SIZE_WORD, SBS_UNIT_VALUE, bm_var_offset(sf_status), 0xE7BF, "SafetyStatus"}, + {0x54, SBS_SIZE_WORD, SBS_UNIT_VALUE, bm_var_offset(op_status), 0x79F4, "OperationStatus"}, + {0x5a, SBS_SIZE_WORD, SBS_UNIT_VOLTAGE, bm_var_offset(sys_volt), SBS_VALUE_MASK, "SystemVoltage"}, + {0, 0, 0, 0, 0, NULL}, +}; + +/* ssd ioctl */ +#define SSD_CMD_GET_PROTOCOL_INFO _IOR('H', 100, struct ssd_protocol_info) +#define SSD_CMD_GET_HW_INFO _IOR('H', 101, struct ssd_hw_info) +#define SSD_CMD_GET_ROM_INFO _IOR('H', 102, struct ssd_rom_info) +#define SSD_CMD_GET_SMART _IOR('H', 103, struct ssd_smart) +#define SSD_CMD_GET_IDX _IOR('H', 105, int) +#define SSD_CMD_GET_AMOUNT _IOR('H', 106, int) +#define SSD_CMD_GET_TO_INFO _IOR('H', 107, int) +#define SSD_CMD_GET_DRV_VER _IOR('H', 108, char[DRIVER_VERSION_LEN]) + +#define SSD_CMD_GET_BBACC_INFO _IOR('H', 109, struct ssd_acc_info) +#define SSD_CMD_GET_ECACC_INFO _IOR('H', 110, struct ssd_acc_info) + +#define SSD_CMD_GET_HW_INFO_EXT _IOR('H', 111, struct ssd_hw_info_extend) + +#define SSD_CMD_REG_READ _IOWR('H', 120, struct ssd_reg_op_info) +#define SSD_CMD_REG_WRITE _IOWR('H', 121, struct ssd_reg_op_info) + +#define SSD_CMD_SPI_READ _IOWR('H', 125, struct ssd_spi_op_info) +#define SSD_CMD_SPI_WRITE _IOWR('H', 126, struct ssd_spi_op_info) +#define SSD_CMD_SPI_ERASE _IOWR('H', 127, struct ssd_spi_op_info) + +#define SSD_CMD_I2C_READ _IOWR('H', 128, struct ssd_i2c_op_info) +#define SSD_CMD_I2C_WRITE _IOWR('H', 129, struct ssd_i2c_op_info) +#define SSD_CMD_I2C_WRITE_READ _IOWR('H', 130, struct ssd_i2c_op_info) + +#define SSD_CMD_SMBUS_SEND_BYTE _IOWR('H', 131, struct ssd_smbus_op_info) +#define SSD_CMD_SMBUS_RECEIVE_BYTE _IOWR('H', 132, struct ssd_smbus_op_info) +#define SSD_CMD_SMBUS_WRITE_BYTE _IOWR('H', 133, struct ssd_smbus_op_info) +#define SSD_CMD_SMBUS_READ_BYTE _IOWR('H', 135, struct ssd_smbus_op_info) +#define SSD_CMD_SMBUS_WRITE_WORD _IOWR('H', 136, struct ssd_smbus_op_info) +#define SSD_CMD_SMBUS_READ_WORD _IOWR('H', 137, struct ssd_smbus_op_info) +#define SSD_CMD_SMBUS_WRITE_BLOCK _IOWR('H', 138, struct ssd_smbus_op_info) +#define SSD_CMD_SMBUS_READ_BLOCK _IOWR('H', 139, struct ssd_smbus_op_info) + +#define SSD_CMD_BM_GET_VER _IOR('H', 140, uint16_t) +#define SSD_CMD_BM_GET_NR_CAP _IOR('H', 141, int) +#define SSD_CMD_BM_CAP_LEARNING _IOW('H', 142, int) +#define SSD_CMD_CAP_LEARN _IOR('H', 143, uint32_t) +#define SSD_CMD_GET_CAP_STATUS _IOR('H', 144, int) + +#define SSD_CMD_RAM_READ _IOWR('H', 150, struct ssd_ram_op_info) +#define SSD_CMD_RAM_WRITE _IOWR('H', 151, struct ssd_ram_op_info) + +#define SSD_CMD_NAND_READ_ID _IOR('H', 160, struct ssd_flash_op_info) +#define SSD_CMD_NAND_READ _IOWR('H', 161, struct ssd_flash_op_info) //with oob +#define SSD_CMD_NAND_WRITE _IOWR('H', 162, struct ssd_flash_op_info) +#define SSD_CMD_NAND_ERASE _IOWR('H', 163, struct ssd_flash_op_info) +#define SSD_CMD_NAND_READ_EXT _IOWR('H', 164, struct ssd_flash_op_info) //ingore EIO + +#define SSD_CMD_UPDATE_BBT _IOW('H', 180, struct ssd_flash_op_info) + +#define SSD_CMD_CLEAR_ALARM _IOW('H', 190, int) +#define SSD_CMD_SET_ALARM _IOW('H', 191, int) + +#define SSD_CMD_RESET _IOW('H', 200, int) +#define SSD_CMD_RELOAD_FW _IOW('H', 201, int) +#define SSD_CMD_UNLOAD_DEV _IOW('H', 202, int) +#define SSD_CMD_LOAD_DEV _IOW('H', 203, int) +#define SSD_CMD_UPDATE_VP _IOWR('H', 205, uint32_t) +#define SSD_CMD_FULL_RESET _IOW('H', 206, int) + +#define SSD_CMD_GET_NR_LOG _IOR('H', 220, uint32_t) +#define SSD_CMD_GET_LOG _IOR('H', 221, void *) +#define SSD_CMD_LOG_LEVEL _IOW('H', 222, int) + +#define SSD_CMD_OT_PROTECT _IOW('H', 223, int) +#define SSD_CMD_GET_OT_STATUS _IOR('H', 224, int) + +#define SSD_CMD_CLEAR_LOG _IOW('H', 230, int) +#define SSD_CMD_CLEAR_SMART _IOW('H', 231, int) + +#define SSD_CMD_SW_LOG _IOW('H', 232, struct ssd_sw_log_info) + +#define SSD_CMD_GET_LABEL _IOR('H', 235, struct ssd_label) +#define SSD_CMD_GET_VERSION _IOR('H', 236, struct ssd_version_info) +#define SSD_CMD_GET_TEMPERATURE _IOR('H', 237, int) +#define SSD_CMD_GET_BMSTATUS _IOR('H', 238, int) +#define SSD_CMD_GET_LABEL2 _IOR('H', 239, void *) + + +#define SSD_CMD_FLUSH _IOW('H', 240, int) +#define SSD_CMD_SAVE_MD _IOW('H', 241, int) + +#define SSD_CMD_SET_WMODE _IOW('H', 242, int) +#define SSD_CMD_GET_WMODE _IOR('H', 243, int) +#define SSD_CMD_GET_USER_WMODE _IOR('H', 244, int) + +#define SSD_CMD_DEBUG _IOW('H', 250, struct ssd_debug_info) +#define SSD_CMD_DRV_PARAM_INFO _IOR('H', 251, struct ssd_drv_param_info) + + +/* log */ +#define SSD_LOG_MAX_SZ 4096 +#define SSD_LOG_LEVEL SSD_LOG_LEVEL_NOTICE + +enum ssd_log_data +{ + SSD_LOG_DATA_NONE = 0, + SSD_LOG_DATA_LOC, + SSD_LOG_DATA_HEX +}; + +typedef struct ssd_log_entry +{ + union { + struct { + uint32_t page:10; + uint32_t block:14; + uint32_t flash:8; + } loc; + struct { + uint32_t page:12; + uint32_t block:12; + uint32_t flash:8; + } loc1; + uint32_t val; + } data; + uint16_t event:10; + uint16_t mod:6; + uint16_t idx; +}__attribute__((packed))ssd_log_entry_t; + +typedef struct ssd_log +{ + uint64_t time:56; + uint64_t ctrl_idx:8; + ssd_log_entry_t le; +} __attribute__((packed)) ssd_log_t; + +typedef struct ssd_log_desc +{ + uint16_t event; + uint8_t level; + uint8_t data; + uint8_t sblock; + uint8_t spage; + char *desc; +} __attribute__((packed)) ssd_log_desc_t; + +#define SSD_LOG_SW_IDX 0xF +#define SSD_UNKNOWN_EVENT ((uint16_t)-1) +static struct ssd_log_desc ssd_log_desc[] = { + /* event, level, show flash, show block, show page, desc */ + {0x0, SSD_LOG_LEVEL_WARNING, SSD_LOG_DATA_LOC, 0, 0, "Create BBT failure"}, //g3 + {0x1, SSD_LOG_LEVEL_WARNING, SSD_LOG_DATA_LOC, 0, 0, "Read BBT failure"}, //g3 + {0x2, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "Mark bad block"}, + {0x3, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 0, 0, "Flush BBT failure"}, + {0x4, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Program failure"}, + {0x7, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 1, "No available blocks"}, + {0x8, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "Bad EC header"}, + {0x9, SSD_LOG_LEVEL_WARNING, SSD_LOG_DATA_LOC, 1, 0, "Bad VID header"}, //g3 + {0xa, SSD_LOG_LEVEL_INFO, SSD_LOG_DATA_LOC, 1, 0, "Wear leveling"}, + {0xb, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "WL read back failure"}, + {0x11, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 1, "Data recovery failure"}, // err + {0x20, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 1, "Init: scan mapping table failure"}, // err g3 + {0x21, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Program failure"}, + {0x22, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Program failure"}, + {0x23, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Program failure"}, + {0x24, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "Merge: read mapping page failure"}, + {0x25, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Merge: read back failure"}, + {0x26, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Program failure"}, + {0x27, SSD_LOG_LEVEL_WARNING, SSD_LOG_DATA_LOC, 1, 1, "Data corrupted for abnormal power down"}, //g3 + {0x28, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Merge: mapping page corrupted"}, + {0x29, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "Init: no mapping page"}, + {0x2a, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: mapping pages incomplete"}, + {0x2b, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 1, "Read back failure after programming failure"}, // err + {0xf1, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 1, "Read failure without recovery"}, // err + {0xf2, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 0, 0, "No available blocks"}, // maybe err g3 + {0xf3, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 0, "Init: RAID incomplete"}, // err g3 + {0xf4, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Program failure"}, + {0xf5, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Read failure in moving data"}, + {0xf6, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Program failure"}, + {0xf7, SSD_LOG_LEVEL_WARNING, SSD_LOG_DATA_LOC, 1, 1, "Init: RAID not complete"}, + {0xf8, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "Init: data moving interrupted"}, + {0xfe, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 0, 0, "Data inspection failure"}, + {0xff, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "IO: ECC failed"}, + + /* new */ + {0x2e, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 0, 0, "No available reserved blocks" }, // err + {0x30, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 0, 0, "Init: PMT membership not found"}, + {0x31, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "Init: PMT corrupted"}, + {0x32, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 0, 0, "Init: PBT membership not found"}, + {0x33, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 0, 0, "Init: PBT not found"}, + {0x34, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 0, 0, "Init: PBT corrupted"}, + {0x35, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: PMT page read failure"}, + {0x36, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: PBT page read failure"}, + {0x37, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: PBT backup page read failure"}, + {0x38, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: PBMT read failure"}, + {0x39, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 1, "Init: PBMT scan failure"}, // err + {0x3a, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: first page read failure"}, + {0x3b, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 1, "Init: first page scan failure"}, // err + {0x3c, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 1, "Init: scan unclosed block failure"}, // err + {0x3d, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: write pointer mismatch"}, + {0x3e, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: PMT recovery: PBMT read failure"}, + {0x3f, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "Init: PMT recovery: PBMT scan failure"}, + {0x40, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 1, "Init: PMT recovery: data page read failure"}, //err + {0x41, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: PBT write pointer mismatch"}, + {0x42, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: PBT latest version corrupted"}, + {0x43, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 0, "Init: too many unclosed blocks"}, + {0x44, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "Init: PDW block found"}, + {0x45, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_HEX, 0, 0, "Init: more than one PDW block found"}, //err + {0x46, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Init: first page is blank or read failure"}, + {0x47, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 0, 0, "Init: PDW block not found"}, + + {0x50, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 0, "Cache: hit error data"}, // err + {0x51, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 0, "Cache: read back failure"}, // err + {0x52, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Cache: unknown command"}, //? + {0x53, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_LOC, 1, 1, "GC/WL read back failure"}, // err + + {0x60, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "Erase failure"}, + + {0x70, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "LPA not matched"}, + {0x71, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "PBN not matched"}, + {0x72, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Read retry failure"}, + {0x73, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Need raid recovery"}, + {0x74, SSD_LOG_LEVEL_INFO, SSD_LOG_DATA_LOC, 1, 1, "Need read retry"}, + {0x75, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Read invalid data page"}, + {0x76, SSD_LOG_LEVEL_INFO, SSD_LOG_DATA_LOC, 1, 1, "ECC error, data in cache, PBN matched"}, + {0x77, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "ECC error, data in cache, PBN not matched"}, + {0x78, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "ECC error, data in flash, PBN not matched"}, + {0x79, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "ECC ok, data in cache, LPA not matched"}, + {0x7a, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "ECC ok, data in flash, LPA not matched"}, + {0x7b, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "RAID data in cache, LPA not matched"}, + {0x7c, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "RAID data in flash, LPA not matched"}, + {0x7d, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Read data page status error"}, + {0x7e, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Read blank page"}, + {0x7f, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Access flash timeout"}, + + {0x80, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "EC overflow"}, + {0x81, SSD_LOG_LEVEL_INFO, SSD_LOG_DATA_NONE, 0, 0, "Scrubbing completed"}, + {0x82, SSD_LOG_LEVEL_INFO, SSD_LOG_DATA_LOC, 1, 0, "Unstable block(too much bit flip)"}, + {0x83, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "GC: ram error"}, //? + {0x84, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "GC: one PBMT read failure"}, + + {0x88, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "GC: mark bad block"}, + {0x89, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 0, "GC: invalid page count error"}, // maybe err + {0x8a, SSD_LOG_LEVEL_WARNING, SSD_LOG_DATA_NONE, 0, 0, "Warning: Bad Block close to limit"}, + {0x8b, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_NONE, 0, 0, "Error: Bad Block over limit"}, + {0x8c, SSD_LOG_LEVEL_WARNING, SSD_LOG_DATA_NONE, 0, 0, "Warning: P/E cycles close to limit"}, + {0x8d, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_NONE, 0, 0, "Error: P/E cycles over limit"}, + + {0x90, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Over temperature"}, //xx + {0x91, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Temperature is OK"}, //xx + {0x92, SSD_LOG_LEVEL_WARNING, SSD_LOG_DATA_NONE, 0, 0, "Battery fault"}, + {0x93, SSD_LOG_LEVEL_WARNING, SSD_LOG_DATA_NONE, 0, 0, "SEU fault"}, //err + {0x94, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_NONE, 0, 0, "DDR error"}, //err + {0x95, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_NONE, 0, 0, "Controller serdes error"}, //err + {0x96, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_NONE, 0, 0, "Bridge serdes 1 error"}, //err + {0x97, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_NONE, 0, 0, "Bridge serdes 2 error"}, //err + {0x98, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "SEU fault (corrected)"}, //err + {0x99, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Battery is OK"}, + {0x9a, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Temperature close to limit"}, //xx + + {0x9b, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "SEU fault address (low)"}, + {0x9c, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "SEU fault address (high)"}, + {0x9d, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "I2C fault" }, + {0x9e, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "DDR single bit error" }, + {0x9f, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Board voltage fault" }, + + {0xa0, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "LPA not matched"}, + {0xa1, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Re-read data in cache"}, + {0xa2, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Read blank page"}, + {0xa3, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "RAID recovery: Read blank page"}, + {0xa4, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "RAID recovery: new data in cache"}, + {0xa5, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "RAID recovery: PBN not matched"}, + {0xa6, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Read data with error flag"}, + {0xa7, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "RAID recovery: recoverd data with error flag"}, + {0xa8, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Blank page in cache, PBN matched"}, + {0xa9, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "RAID recovery: Blank page in cache, PBN matched"}, + {0xaa, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 0, 0, "Flash init failure"}, + {0xab, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "Mapping table recovery failure"}, + {0xac, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_LOC, 1, 1, "RAID recovery: ECC failed"}, + {0xb0, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Temperature is up to degree 95"}, + {0xb1, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Temperature is up to degree 100"}, + + {0x300, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_HEX, 0, 0, "CMD timeout"}, + {0x301, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "Power on"}, + {0x302, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Power off"}, + {0x303, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Clear log"}, + {0x304, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "Set capacity"}, + {0x305, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Clear data"}, + {0x306, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "BM safety status"}, + {0x307, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_HEX, 0, 0, "I/O error"}, + {0x308, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "CMD error"}, + {0x309, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "Set wmode"}, + {0x30a, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_HEX, 0, 0, "DDR init failed" }, + {0x30b, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "PCIe link status" }, + {0x30c, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_HEX, 0, 0, "Controller reset sync error" }, + {0x30d, SSD_LOG_LEVEL_ERR, SSD_LOG_DATA_HEX, 0, 0, "Clock fault" }, + {0x30e, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "FPGA voltage fault status" }, + {0x30f, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "Set capacity finished"}, + {0x310, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Clear data finished"}, + {0x311, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "Reset"}, + {0x312, SSD_LOG_LEVEL_WARNING,SSD_LOG_DATA_HEX, 0, 0, "CAP: voltage fault"}, + {0x313, SSD_LOG_LEVEL_WARNING,SSD_LOG_DATA_NONE, 0, 0, "CAP: learn fault"}, + {0x314, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "CAP status"}, + {0x315, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "Board voltage fault status"}, + {0x316, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Inlet over temperature"}, + {0x317, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Inlet temperature is OK"}, + {0x318, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Flash over temperature"}, + {0x319, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Flash temperature is OK"}, + {0x31a, SSD_LOG_LEVEL_WARNING,SSD_LOG_DATA_NONE, 0, 0, "CAP: short circuit"}, + {0x31b, SSD_LOG_LEVEL_WARNING,SSD_LOG_DATA_HEX, 0, 0, "Sensor fault"}, + {0x31c, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Erase all data"}, + {0x31d, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_NONE, 0, 0, "Erase all data finished"}, + + {SSD_UNKNOWN_EVENT, SSD_LOG_LEVEL_NOTICE, SSD_LOG_DATA_HEX, 0, 0, "unknown event"}, +}; +/* */ +#define SSD_LOG_OVER_TEMP 0x90 +#define SSD_LOG_NORMAL_TEMP 0x91 +#define SSD_LOG_WARN_TEMP 0x9a +#define SSD_LOG_SEU_FAULT 0x93 +#define SSD_LOG_SEU_FAULT1 0x98 +#define SSD_LOG_BATTERY_FAULT 0x92 +#define SSD_LOG_BATTERY_OK 0x99 +#define SSD_LOG_BOARD_VOLT_FAULT 0x9f + +/* software log */ +#define SSD_LOG_TIMEOUT 0x300 +#define SSD_LOG_POWER_ON 0x301 +#define SSD_LOG_POWER_OFF 0x302 +#define SSD_LOG_CLEAR_LOG 0x303 +#define SSD_LOG_SET_CAPACITY 0x304 +#define SSD_LOG_CLEAR_DATA 0x305 +#define SSD_LOG_BM_SFSTATUS 0x306 +#define SSD_LOG_EIO 0x307 +#define SSD_LOG_ECMD 0x308 +#define SSD_LOG_SET_WMODE 0x309 +#define SSD_LOG_DDR_INIT_ERR 0x30a +#define SSD_LOG_PCIE_LINK_STATUS 0x30b +#define SSD_LOG_CTRL_RST_SYNC 0x30c +#define SSD_LOG_CLK_FAULT 0x30d +#define SSD_LOG_VOLT_FAULT 0x30e +#define SSD_LOG_SET_CAPACITY_END 0x30F +#define SSD_LOG_CLEAR_DATA_END 0x310 +#define SSD_LOG_RESET 0x311 +#define SSD_LOG_CAP_VOLT_FAULT 0x312 +#define SSD_LOG_CAP_LEARN_FAULT 0x313 +#define SSD_LOG_CAP_STATUS 0x314 +#define SSD_LOG_VOLT_STATUS 0x315 +#define SSD_LOG_INLET_OVER_TEMP 0x316 +#define SSD_LOG_INLET_NORMAL_TEMP 0x317 +#define SSD_LOG_FLASH_OVER_TEMP 0x318 +#define SSD_LOG_FLASH_NORMAL_TEMP 0x319 +#define SSD_LOG_CAP_SHORT_CIRCUIT 0x31a +#define SSD_LOG_SENSOR_FAULT 0x31b +#define SSD_LOG_ERASE_ALL 0x31c +#define SSD_LOG_ERASE_ALL_END 0x31d + + +/* sw log fifo depth */ +#define SSD_LOG_FIFO_SZ 1024 + + +/* done queue */ +static DEFINE_PER_CPU(struct list_head, ssd_doneq); +static DEFINE_PER_CPU(struct tasklet_struct, ssd_tasklet); + + +/* unloading driver */ +static volatile int ssd_exiting = 0; + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)) +static struct class_simple *ssd_class; +#else +static struct class *ssd_class; +#endif + +static int ssd_cmajor = SSD_CMAJOR; + +/* ssd block device major, minors */ +static int ssd_major = SSD_MAJOR; +static int ssd_major_sl = SSD_MAJOR_SL; +static int ssd_minors = SSD_MINORS; + +/* ssd device list */ +static struct list_head ssd_list; +static unsigned long ssd_index_bits[SSD_MAX_DEV / BITS_PER_LONG + 1]; +static unsigned long ssd_index_bits_sl[SSD_MAX_DEV / BITS_PER_LONG + 1]; +static atomic_t ssd_nr; + +/* module param */ +enum ssd_drv_mode +{ + SSD_DRV_MODE_STANDARD = 0, /* full */ + SSD_DRV_MODE_DEBUG = 2, /* debug */ + SSD_DRV_MODE_BASE /* base only */ +}; + +enum ssd_int_mode +{ + SSD_INT_LEGACY = 0, + SSD_INT_MSI, + SSD_INT_MSIX +}; + +#if (defined SSD_MSIX) +#define SSD_INT_MODE_DEFAULT SSD_INT_MSIX +#elif (defined SSD_MSI) +#define SSD_INT_MODE_DEFAULT SSD_INT_MSI +#else +/* auto select the defaut int mode according to the kernel version*/ +/* suse 11 sp1 irqbalance bug: use msi instead*/ +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) || (defined RHEL_MAJOR && RHEL_MAJOR >= 6) || (defined RHEL_MAJOR && RHEL_MAJOR == 5 && RHEL_MINOR >= 5)) +#define SSD_INT_MODE_DEFAULT SSD_INT_MSIX +#else +#define SSD_INT_MODE_DEFAULT SSD_INT_MSI +#endif +#endif + +static int mode = SSD_DRV_MODE_STANDARD; +static int status_mask = 0xFF; +static int int_mode = SSD_INT_MODE_DEFAULT; +static int threaded_irq = 0; +static int log_level = SSD_LOG_LEVEL_WARNING; +static int ot_protect = 1; +static int wmode = SSD_WMODE_DEFAULT; +static int finject = 0; + +module_param(mode, int, 0); +module_param(status_mask, int, 0); +module_param(int_mode, int, 0); +module_param(threaded_irq, int, 0); +module_param(log_level, int, 0); +module_param(ot_protect, int, 0); +module_param(wmode, int, 0); +module_param(finject, int, 0); + + +MODULE_PARM_DESC(mode, "driver mode, 0 - standard, 1 - debug, 2 - debug without IO, 3 - basic debug mode"); +MODULE_PARM_DESC(status_mask, "command status mask, 0 - without command error, 0xff - with command error"); +MODULE_PARM_DESC(int_mode, "preferred interrupt mode, 0 - legacy, 1 - msi, 2 - msix"); +MODULE_PARM_DESC(threaded_irq, "threaded irq, 0 - normal irq, 1 - threaded irq"); +MODULE_PARM_DESC(log_level, "log level to display, 0 - info and above, 1 - notice and above, 2 - warning and above, 3 - error only"); +MODULE_PARM_DESC(ot_protect, "over temperature protect, 0 - disable, 1 - enable"); +MODULE_PARM_DESC(wmode, "write mode, 0 - write buffer (with risk for the 6xx firmware), 1 - write buffer ex, 2 - write through, 3 - auto, 4 - default"); +MODULE_PARM_DESC(finject, "enable fault simulation, 0 - off, 1 - on, for debug purpose only"); + + +#ifndef MODULE +static int __init ssd_drv_mode(char *str) +{ + mode = (int)simple_strtoul(str, NULL, 0); + + return 1; +} + +static int __init ssd_status_mask(char *str) +{ + status_mask = (int)simple_strtoul(str, NULL, 16); + + return 1; +} + +static int __init ssd_int_mode(char *str) +{ + int_mode = (int)simple_strtoul(str, NULL, 0); + + return 1; +} + +static int __init ssd_threaded_irq(char *str) +{ + threaded_irq = (int)simple_strtoul(str, NULL, 0); + + return 1; +} + +static int __init ssd_log_level(char *str) +{ + log_level = (int)simple_strtoul(str, NULL, 0); + + return 1; +} + +static int __init ssd_ot_protect(char *str) +{ + ot_protect = (int)simple_strtoul(str, NULL, 0); + + return 1; +} + +static int __init ssd_wmode(char *str) +{ + wmode = (int)simple_strtoul(str, NULL, 0); + + return 1; +} + +static int __init ssd_finject(char *str) +{ + finject = (int)simple_strtoul(str, NULL, 0); + + return 1; +} + +__setup(MODULE_NAME"_mode=", ssd_drv_mode); +__setup(MODULE_NAME"_status_mask=", ssd_status_mask); +__setup(MODULE_NAME"_int_mode=", ssd_int_mode); +__setup(MODULE_NAME"_threaded_irq=", ssd_threaded_irq); +__setup(MODULE_NAME"_log_level=", ssd_log_level); +__setup(MODULE_NAME"_ot_protect=", ssd_ot_protect); +__setup(MODULE_NAME"_wmode=", ssd_wmode); +__setup(MODULE_NAME"_finject=", ssd_finject); +#endif + + +#ifdef CONFIG_PROC_FS +#include +#include + +#define SSD_PROC_DIR MODULE_NAME +#define SSD_PROC_INFO "info" + +static struct proc_dir_entry *ssd_proc_dir = NULL; +static struct proc_dir_entry *ssd_proc_info = NULL; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) +static int ssd_proc_read(char *page, char **start, + off_t off, int count, int *eof, void *data) +{ + struct ssd_device *dev = NULL; + struct ssd_device *n = NULL; + uint64_t size; + int idx; + int len = 0; + //char type; //xx + + if (ssd_exiting) { + return 0; + } + + len += snprintf((page + len), (count - len), "Driver Version:\t%s\n", DRIVER_VERSION); + + list_for_each_entry_safe(dev, n, &ssd_list, list) { + idx = dev->idx + 1; + size = dev->hw_info.size ; + do_div(size, 1000000000); + + len += snprintf((page + len), (count - len), "\n"); + + len += snprintf((page + len), (count - len), "HIO %d Size:\t%uGB\n", idx, (uint32_t)size); + + len += snprintf((page + len), (count - len), "HIO %d Bridge FW VER:\t%03X\n", idx, dev->hw_info.bridge_ver); + if (dev->hw_info.ctrl_ver != 0) { + len += snprintf((page + len), (count - len), "HIO %d Controller FW VER:\t%03X\n", idx, dev->hw_info.ctrl_ver); + } + + len += snprintf((page + len), (count - len), "HIO %d PCB VER:\t.%c\n", idx, dev->hw_info.pcb_ver); + + if (dev->hw_info.upper_pcb_ver >= 'A') { + len += snprintf((page + len), (count - len), "HIO %d Upper PCB VER:\t.%c\n", idx, dev->hw_info.upper_pcb_ver); + } + + len += snprintf((page + len), (count - len), "HIO %d Device:\t%s\n", idx, dev->name); + } + + return len; +} + +#else + +static int ssd_proc_show(struct seq_file *m, void *v) +{ + struct ssd_device *dev = NULL; + struct ssd_device *n = NULL; + uint64_t size; + int idx; + + if (ssd_exiting) { + return 0; + } + + seq_printf(m, "Driver Version:\t%s\n", DRIVER_VERSION); + + list_for_each_entry_safe(dev, n, &ssd_list, list) { + idx = dev->idx + 1; + size = dev->hw_info.size ; + do_div(size, 1000000000); + + seq_printf(m, "\n"); + + seq_printf(m, "HIO %d Size:\t%uGB\n", idx, (uint32_t)size); + + seq_printf(m, "HIO %d Bridge FW VER:\t%03X\n", idx, dev->hw_info.bridge_ver); + if (dev->hw_info.ctrl_ver != 0) { + seq_printf(m, "HIO %d Controller FW VER:\t%03X\n", idx, dev->hw_info.ctrl_ver); + } + + seq_printf(m, "HIO %d PCB VER:\t.%c\n", idx, dev->hw_info.pcb_ver); + + if (dev->hw_info.upper_pcb_ver >= 'A') { + seq_printf(m, "HIO %d Upper PCB VER:\t.%c\n", idx, dev->hw_info.upper_pcb_ver); + } + + seq_printf(m, "HIO %d Device:\t%s\n", idx, dev->name); + } + + return 0; +} + +static int ssd_proc_open(struct inode *inode, struct file *file) +{ +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(3,9,0)) + return single_open(file, ssd_proc_show, PDE(inode)->data); +#else + return single_open(file, ssd_proc_show, PDE_DATA(inode)); +#endif +} + +static const struct file_operations ssd_proc_fops = { + .open = ssd_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + + +static void ssd_cleanup_proc(void) +{ + if (ssd_proc_info) { + remove_proc_entry(SSD_PROC_INFO, ssd_proc_dir); + ssd_proc_info = NULL; + } + if (ssd_proc_dir) { + remove_proc_entry(SSD_PROC_DIR, NULL); + ssd_proc_dir = NULL; + } +} +static int ssd_init_proc(void) +{ + ssd_proc_dir = proc_mkdir(SSD_PROC_DIR, NULL); + if (!ssd_proc_dir) + goto out_proc_mkdir; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) + ssd_proc_info = create_proc_entry(SSD_PROC_INFO, S_IFREG | S_IRUGO | S_IWUSR, ssd_proc_dir); + if (!ssd_proc_info) + goto out_create_proc_entry; + + ssd_proc_info->read_proc = ssd_proc_read; + +/* kernel bug */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,30)) + ssd_proc_info->owner = THIS_MODULE; +#endif +#else + ssd_proc_info = proc_create(SSD_PROC_INFO, 0600, ssd_proc_dir, &ssd_proc_fops); + if (!ssd_proc_info) + goto out_create_proc_entry; +#endif + + return 0; + +out_create_proc_entry: + remove_proc_entry(SSD_PROC_DIR, NULL); +out_proc_mkdir: + return -ENOMEM; +} + +#else +static void ssd_cleanup_proc(void) +{ + return; +} +static int ssd_init_proc(void) +{ + return 0; +} +#endif /* CONFIG_PROC_FS */ + +/* sysfs */ +static void ssd_unregister_sysfs(struct ssd_device *dev) +{ + return; +} + +static int ssd_register_sysfs(struct ssd_device *dev) +{ + return 0; +} + +static void ssd_cleanup_sysfs(void) +{ + return; +} + +static int ssd_init_sysfs(void) +{ + return 0; +} + +static inline void ssd_put_index(int slave, int index) +{ + unsigned long *index_bits = ssd_index_bits; + + if (slave) { + index_bits = ssd_index_bits_sl; + } + + if (test_and_clear_bit(index, index_bits)) { + atomic_dec(&ssd_nr); + } +} + +static inline int ssd_get_index(int slave) +{ + unsigned long *index_bits = ssd_index_bits; + int index; + + if (slave) { + index_bits = ssd_index_bits_sl; + } + +find_index: + if ((index = find_first_zero_bit(index_bits, SSD_MAX_DEV)) >= SSD_MAX_DEV) { + return -1; + } + + if (test_and_set_bit(index, index_bits)) { + goto find_index; + } + + atomic_inc(&ssd_nr); + + return index; +} + +static void ssd_cleanup_index(void) +{ + return; +} + +static int ssd_init_index(void) +{ + INIT_LIST_HEAD(&ssd_list); + atomic_set(&ssd_nr, 0); + memset(ssd_index_bits, 0, (SSD_MAX_DEV / BITS_PER_LONG + 1)); + memset(ssd_index_bits_sl, 0, (SSD_MAX_DEV / BITS_PER_LONG + 1)); + + return 0; +} + +static void ssd_set_dev_name(char *name, size_t size, int idx) +{ + if(idx < SSD_ALPHABET_NUM) { + snprintf(name, size, "%c", 'a'+idx); + } else { + idx -= SSD_ALPHABET_NUM; + snprintf(name, size, "%c%c", 'a'+(idx/SSD_ALPHABET_NUM), 'a'+(idx%SSD_ALPHABET_NUM)); + } +} + +/* pci register r&w */ +static inline void ssd_reg_write(void *addr, uint64_t val) +{ + iowrite32((uint32_t)val, addr); + iowrite32((uint32_t)(val >> 32), addr + 4); + wmb(); +} + +static inline uint64_t ssd_reg_read(void *addr) +{ + uint64_t val; + uint32_t val_lo, val_hi; + + val_lo = ioread32(addr); + val_hi = ioread32(addr + 4); + + rmb(); + val = val_lo | ((uint64_t)val_hi << 32); + + return val; +} + + +#define ssd_reg32_write(addr, val) writel(val, addr) +#define ssd_reg32_read(addr) readl(addr) + +/* alarm led */ +static void ssd_clear_alarm(struct ssd_device *dev) +{ + uint32_t val; + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + return; + } + + val = ssd_reg32_read(dev->ctrlp + SSD_LED_REG); + + /* firmware control */ + val &= ~0x2; + + ssd_reg32_write(dev->ctrlp + SSD_LED_REG, val); +} + +static void ssd_set_alarm(struct ssd_device *dev) +{ + uint32_t val; + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + return; + } + + val = ssd_reg32_read(dev->ctrlp + SSD_LED_REG); + + /* light up */ + val &= ~0x1; + /* software control */ + val |= 0x2; + + ssd_reg32_write(dev->ctrlp + SSD_LED_REG, val); +} + +#define u32_swap(x) \ + ((uint32_t)( \ + (((uint32_t)(x) & (uint32_t)0x000000ffUL) << 24) | \ + (((uint32_t)(x) & (uint32_t)0x0000ff00UL) << 8) | \ + (((uint32_t)(x) & (uint32_t)0x00ff0000UL) >> 8) | \ + (((uint32_t)(x) & (uint32_t)0xff000000UL) >> 24))) + +#define u16_swap(x) \ + ((uint16_t)( \ + (((uint16_t)(x) & (uint16_t)0x00ff) << 8) | \ + (((uint16_t)(x) & (uint16_t)0xff00) >> 8) )) + + +#if 0 +/* No lock, for init only*/ +static int ssd_spi_read_id(struct ssd_device *dev, uint32_t *id) +{ + uint32_t val; + unsigned long st; + int ret = 0; + + if (!dev || !id) { + return -EINVAL; + } + + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_READ_ID); + + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + + st = jiffies; + for (;;) { + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + if (val == 0x1000000) { + break; + } + + if (time_after(jiffies, (st + SSD_SPI_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out; + } + cond_resched(); + } + + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_ID); + *id = val; + +out: + return ret; +} +#endif + +/* spi access */ +static int ssd_init_spi(struct ssd_device *dev) +{ + uint32_t val; + unsigned long st; + int ret = 0; + + mutex_lock(&dev->spi_mutex); + st = jiffies; + for(;;) { + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_READ_STATUS); + + do { + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + + if (time_after(jiffies, (st + SSD_SPI_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out; + } + cond_resched(); + } while (val != 0x1000000); + + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_STATUS); + if (!(val & 0x1)) { + break; + } + + if (time_after(jiffies, (st + SSD_SPI_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out; + } + cond_resched(); + } + +out: + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + if (val & 0x1) { + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_CLSR); + } + } + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_W_DISABLE); + mutex_unlock(&dev->spi_mutex); + + ret = 0; + + return ret; +} + +static int ssd_spi_page_read(struct ssd_device *dev, void *buf, uint32_t off, uint32_t size) +{ + uint32_t val; + uint32_t rlen = 0; + unsigned long st; + int ret = 0; + + if (!dev || !buf) { + return -EINVAL; + } + + if ((off % sizeof(uint32_t)) != 0 || (size % sizeof(uint32_t)) != 0 || size == 0 || + ((uint64_t)off + (uint64_t)size) > dev->rom_info.size || size > dev->rom_info.page_size) { + return -EINVAL; + } + + mutex_lock(&dev->spi_mutex); + while (rlen < size) { + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD_HI, ((off + rlen) >> 24)); + wmb(); + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, (((off + rlen) << 8) | SSD_SPI_CMD_READ)); + + (void)ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + (void)ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + (void)ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + (void)ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + + st = jiffies; + for (;;) { + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + if (val == 0x1000000) { + break; + } + + if (time_after(jiffies, (st + SSD_SPI_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out; + } + cond_resched(); + } + + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_RDATA); + *(uint32_t *)(buf + rlen)= u32_swap(val); + + rlen += sizeof(uint32_t); + } + +out: + mutex_unlock(&dev->spi_mutex); + return ret; +} + +static int ssd_spi_page_write(struct ssd_device *dev, void *buf, uint32_t off, uint32_t size) +{ + uint32_t val; + uint32_t wlen; + unsigned long st; + int i; + int ret = 0; + + if (!dev || !buf) { + return -EINVAL; + } + + if ((off % sizeof(uint32_t)) != 0 || (size % sizeof(uint32_t)) != 0 || size == 0 || + ((uint64_t)off + (uint64_t)size) > dev->rom_info.size || size > dev->rom_info.page_size || + (off / dev->rom_info.page_size) != ((off + size - 1) / dev->rom_info.page_size)) { + return -EINVAL; + } + + mutex_lock(&dev->spi_mutex); + + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_W_ENABLE); + + wlen = size / sizeof(uint32_t); + for (i=0; i<(int)wlen; i++) { + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_WDATA, u32_swap(*((uint32_t *)buf + i))); + } + + wmb(); + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD_HI, (off >> 24)); + wmb(); + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, ((off << 8) | SSD_SPI_CMD_PROGRAM)); + + udelay(1); + + st = jiffies; + for (;;) { + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_READ_STATUS); + do { + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + + if (time_after(jiffies, (st + SSD_SPI_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out; + } + cond_resched(); + } while (val != 0x1000000); + + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_STATUS); + if (!(val & 0x1)) { + break; + } + + if (time_after(jiffies, (st + SSD_SPI_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out; + } + cond_resched(); + } + + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + if ((val >> 6) & 0x1) { + ret = -EIO; + goto out; + } + } + +out: + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + if (val & 0x1) { + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_CLSR); + } + } + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_W_DISABLE); + + mutex_unlock(&dev->spi_mutex); + + return ret; +} + +static int ssd_spi_block_erase(struct ssd_device *dev, uint32_t off) +{ + uint32_t val; + unsigned long st; + int ret = 0; + + if (!dev) { + return -EINVAL; + } + + if ((off % dev->rom_info.block_size) != 0 || off >= dev->rom_info.size) { + return -EINVAL; + } + + mutex_lock(&dev->spi_mutex); + + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_W_ENABLE); + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_W_ENABLE); + + wmb(); + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD_HI, (off >> 24)); + wmb(); + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, ((off << 8) | SSD_SPI_CMD_ERASE)); + + st = jiffies; + for (;;) { + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_READ_STATUS); + + do { + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_READY); + + if (time_after(jiffies, (st + SSD_SPI_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out; + } + cond_resched(); + } while (val != 0x1000000); + + val = ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_STATUS); + if (!(val & 0x1)) { + break; + } + + if (time_after(jiffies, (st + SSD_SPI_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out; + } + cond_resched(); + } + + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + if ((val >> 5) & 0x1) { + ret = -EIO; + goto out; + } + } + +out: + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + if (val & 0x1) { + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_CLSR); + } + } + ssd_reg32_write(dev->ctrlp + SSD_SPI_REG_CMD, SSD_SPI_CMD_W_DISABLE); + + mutex_unlock(&dev->spi_mutex); + + return ret; +} + +static int ssd_spi_read(struct ssd_device *dev, void *buf, uint32_t off, uint32_t size) +{ + uint32_t len = 0; + uint32_t roff; + uint32_t rsize; + int ret = 0; + + if (!dev || !buf) { + return -EINVAL; + } + + if ((off % sizeof(uint32_t)) != 0 || (size % sizeof(uint32_t)) != 0 || size == 0 || + ((uint64_t)off + (uint64_t)size) > dev->rom_info.size) { + return -EINVAL; + } + + while (len < size) { + roff = (off + len) % dev->rom_info.page_size; + rsize = dev->rom_info.page_size - roff; + if ((size - len) < rsize) { + rsize = (size - len); + } + roff = off + len; + + ret = ssd_spi_page_read(dev, (buf + len), roff, rsize); + if (ret) { + goto out; + } + + len += rsize; + + cond_resched(); + } + +out: + return ret; +} + +static int ssd_spi_write(struct ssd_device *dev, void *buf, uint32_t off, uint32_t size) +{ + uint32_t len = 0; + uint32_t woff; + uint32_t wsize; + int ret = 0; + + if (!dev || !buf) { + return -EINVAL; + } + + if ((off % sizeof(uint32_t)) != 0 || (size % sizeof(uint32_t)) != 0 || size == 0 || + ((uint64_t)off + (uint64_t)size) > dev->rom_info.size) { + return -EINVAL; + } + + while (len < size) { + woff = (off + len) % dev->rom_info.page_size; + wsize = dev->rom_info.page_size - woff; + if ((size - len) < wsize) { + wsize = (size - len); + } + woff = off + len; + + ret = ssd_spi_page_write(dev, (buf + len), woff, wsize); + if (ret) { + goto out; + } + + len += wsize; + + cond_resched(); + } + +out: + return ret; +} + +static int ssd_spi_erase(struct ssd_device *dev, uint32_t off, uint32_t size) +{ + uint32_t len = 0; + uint32_t eoff; + int ret = 0; + + if (!dev) { + return -EINVAL; + } + + if (size == 0 || ((uint64_t)off + (uint64_t)size) > dev->rom_info.size || + (off % dev->rom_info.block_size) != 0 || (size % dev->rom_info.block_size) != 0) { + return -EINVAL; + } + + while (len < size) { + eoff = (off + len); + + ret = ssd_spi_block_erase(dev, eoff); + if (ret) { + goto out; + } + + len += dev->rom_info.block_size; + + cond_resched(); + } + +out: + return ret; +} + +/* i2c access */ +static uint32_t __ssd_i2c_reg32_read(void *addr) +{ + return ssd_reg32_read(addr); +} + +static void __ssd_i2c_reg32_write(void *addr, uint32_t val) +{ + ssd_reg32_write(addr, val); + ssd_reg32_read(addr); +} + +static int __ssd_i2c_clear(struct ssd_device *dev, uint8_t saddr) +{ + ssd_i2c_ctrl_t ctrl; + ssd_i2c_data_t data; + uint8_t status = 0; + int nr_data = 0; + unsigned long st; + int ret = 0; + +check_status: + ctrl.bits.wdata = 0; + ctrl.bits.addr = SSD_I2C_STATUS_REG; + ctrl.bits.rw = SSD_I2C_CTRL_READ; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + st = jiffies; + for (;;) { + data.val = __ssd_i2c_reg32_read(dev->ctrlp + SSD_I2C_RDATA_REG); + if (data.bits.valid == 0) { + break; + } + + /* retry */ + if (time_after(jiffies, (st + SSD_I2C_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out; + } + cond_resched(); + } + status = data.bits.rdata; + + if (!(status & 0x4)) { + /* clear read fifo data */ + ctrl.bits.wdata = 0; + ctrl.bits.addr = SSD_I2C_DATA_REG; + ctrl.bits.rw = SSD_I2C_CTRL_READ; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + st = jiffies; + for (;;) { + data.val = __ssd_i2c_reg32_read(dev->ctrlp + SSD_I2C_RDATA_REG); + if (data.bits.valid == 0) { + break; + } + + /* retry */ + if (time_after(jiffies, (st + SSD_I2C_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out; + } + cond_resched(); + } + + nr_data++; + if (nr_data <= SSD_I2C_MAX_DATA) { + goto check_status; + } else { + goto out_reset; + } + } + + if (status & 0x3) { + /* clear int */ + ctrl.bits.wdata = 0x04; + ctrl.bits.addr = SSD_I2C_CMD_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + } + + if (!(status & 0x8)) { +out_reset: + /* reset i2c controller */ + ctrl.bits.wdata = 0x0; + ctrl.bits.addr = SSD_I2C_RESET_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + } + +out: + return ret; +} + +static int ssd_i2c_write(struct ssd_device *dev, uint8_t saddr, uint8_t size, uint8_t *buf) +{ + ssd_i2c_ctrl_t ctrl; + ssd_i2c_data_t data; + uint8_t off = 0; + uint8_t status = 0; + unsigned long st; + int ret = 0; + + mutex_lock(&dev->i2c_mutex); + + ctrl.val = 0; + + /* slave addr */ + ctrl.bits.wdata = saddr; + ctrl.bits.addr = SSD_I2C_SADDR_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + /* data */ + while (off < size) { + ctrl.bits.wdata = buf[off]; + ctrl.bits.addr = SSD_I2C_DATA_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + off++; + } + + /* write */ + ctrl.bits.wdata = 0x01; + ctrl.bits.addr = SSD_I2C_CMD_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + /* wait */ + st = jiffies; + for (;;) { + ctrl.bits.wdata = 0; + ctrl.bits.addr = SSD_I2C_STATUS_REG; + ctrl.bits.rw = SSD_I2C_CTRL_READ; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + for (;;) { + data.val = __ssd_i2c_reg32_read(dev->ctrlp + SSD_I2C_RDATA_REG); + if (data.bits.valid == 0) { + break; + } + + /* retry */ + if (time_after(jiffies, (st + SSD_I2C_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out_clear; + } + cond_resched(); + } + + status = data.bits.rdata; + if (status & 0x1) { + break; + } + + if (time_after(jiffies, (st + SSD_I2C_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out_clear; + } + cond_resched(); + } + + if (!(status & 0x1)) { + ret = -1; + goto out_clear; + } + + /* busy ? */ + if (status & 0x20) { + ret = -2; + goto out_clear; + } + + /* ack ? */ + if (status & 0x10) { + ret = -3; + goto out_clear; + } + + /* clear */ +out_clear: + if (__ssd_i2c_clear(dev, saddr)) { + if (!ret) ret = -4; + } + + mutex_unlock(&dev->i2c_mutex); + + return ret; +} + +static int ssd_i2c_read(struct ssd_device *dev, uint8_t saddr, uint8_t size, uint8_t *buf) +{ + ssd_i2c_ctrl_t ctrl; + ssd_i2c_data_t data; + uint8_t off = 0; + uint8_t status = 0; + unsigned long st; + int ret = 0; + + mutex_lock(&dev->i2c_mutex); + + ctrl.val = 0; + + /* slave addr */ + ctrl.bits.wdata = saddr; + ctrl.bits.addr = SSD_I2C_SADDR_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + /* read len */ + ctrl.bits.wdata = size; + ctrl.bits.addr = SSD_I2C_LEN_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + /* read */ + ctrl.bits.wdata = 0x02; + ctrl.bits.addr = SSD_I2C_CMD_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + /* wait */ + st = jiffies; + for (;;) { + ctrl.bits.wdata = 0; + ctrl.bits.addr = SSD_I2C_STATUS_REG; + ctrl.bits.rw = SSD_I2C_CTRL_READ; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + for (;;) { + data.val = __ssd_i2c_reg32_read(dev->ctrlp + SSD_I2C_RDATA_REG); + if (data.bits.valid == 0) { + break; + } + + /* retry */ + if (time_after(jiffies, (st + SSD_I2C_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out_clear; + } + cond_resched(); + } + + status = data.bits.rdata; + if (status & 0x2) { + break; + } + + if (time_after(jiffies, (st + SSD_I2C_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out_clear; + } + cond_resched(); + } + + if (!(status & 0x2)) { + ret = -1; + goto out_clear; + } + + /* busy ? */ + if (status & 0x20) { + ret = -2; + goto out_clear; + } + + /* ack ? */ + if (status & 0x10) { + ret = -3; + goto out_clear; + } + + /* data */ + while (off < size) { + ctrl.bits.wdata = 0; + ctrl.bits.addr = SSD_I2C_DATA_REG; + ctrl.bits.rw = SSD_I2C_CTRL_READ; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + st = jiffies; + for (;;) { + data.val = __ssd_i2c_reg32_read(dev->ctrlp + SSD_I2C_RDATA_REG); + if (data.bits.valid == 0) { + break; + } + + /* retry */ + if (time_after(jiffies, (st + SSD_I2C_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out_clear; + } + cond_resched(); + } + + buf[off] = data.bits.rdata; + + off++; + } + + /* clear */ +out_clear: + if (__ssd_i2c_clear(dev, saddr)) { + if (!ret) ret = -4; + } + + mutex_unlock(&dev->i2c_mutex); + + return ret; +} + +static int ssd_i2c_write_read(struct ssd_device *dev, uint8_t saddr, uint8_t wsize, uint8_t *wbuf, uint8_t rsize, uint8_t *rbuf) +{ + ssd_i2c_ctrl_t ctrl; + ssd_i2c_data_t data; + uint8_t off = 0; + uint8_t status = 0; + unsigned long st; + int ret = 0; + + mutex_lock(&dev->i2c_mutex); + + ctrl.val = 0; + + /* slave addr */ + ctrl.bits.wdata = saddr; + ctrl.bits.addr = SSD_I2C_SADDR_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + /* data */ + off = 0; + while (off < wsize) { + ctrl.bits.wdata = wbuf[off]; + ctrl.bits.addr = SSD_I2C_DATA_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + off++; + } + + /* read len */ + ctrl.bits.wdata = rsize; + ctrl.bits.addr = SSD_I2C_LEN_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + /* write -> read */ + ctrl.bits.wdata = 0x03; + ctrl.bits.addr = SSD_I2C_CMD_REG; + ctrl.bits.rw = SSD_I2C_CTRL_WRITE; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + /* wait */ + st = jiffies; + for (;;) { + ctrl.bits.wdata = 0; + ctrl.bits.addr = SSD_I2C_STATUS_REG; + ctrl.bits.rw = SSD_I2C_CTRL_READ; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + for (;;) { + data.val = __ssd_i2c_reg32_read(dev->ctrlp + SSD_I2C_RDATA_REG); + if (data.bits.valid == 0) { + break; + } + + /* retry */ + if (time_after(jiffies, (st + SSD_I2C_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out_clear; + } + cond_resched(); + } + + status = data.bits.rdata; + if (status & 0x2) { + break; + } + + if (time_after(jiffies, (st + SSD_I2C_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out_clear; + } + cond_resched(); + } + + if (!(status & 0x2)) { + ret = -1; + goto out_clear; + } + + /* busy ? */ + if (status & 0x20) { + ret = -2; + goto out_clear; + } + + /* ack ? */ + if (status & 0x10) { + ret = -3; + goto out_clear; + } + + /* data */ + off = 0; + while (off < rsize) { + ctrl.bits.wdata = 0; + ctrl.bits.addr = SSD_I2C_DATA_REG; + ctrl.bits.rw = SSD_I2C_CTRL_READ; + __ssd_i2c_reg32_write(dev->ctrlp + SSD_I2C_CTRL_REG, ctrl.val); + + st = jiffies; + for (;;) { + data.val = __ssd_i2c_reg32_read(dev->ctrlp + SSD_I2C_RDATA_REG); + if (data.bits.valid == 0) { + break; + } + + /* retry */ + if (time_after(jiffies, (st + SSD_I2C_TIMEOUT))) { + ret = -ETIMEDOUT; + goto out_clear; + } + cond_resched(); + } + + rbuf[off] = data.bits.rdata; + + off++; + } + + /* clear */ +out_clear: + if (__ssd_i2c_clear(dev, saddr)) { + if (!ret) ret = -4; + } + mutex_unlock(&dev->i2c_mutex); + + return ret; +} + +static int ssd_smbus_send_byte(struct ssd_device *dev, uint8_t saddr, uint8_t *buf) +{ + int i = 0; + int ret = 0; + + for (;;) { + ret = ssd_i2c_write(dev, saddr, 1, buf); + if (!ret || -ETIMEDOUT == ret) { + break; + } + + i++; + if (i >= SSD_SMBUS_RETRY_MAX) { + break; + } + msleep(SSD_SMBUS_RETRY_INTERVAL); + } + + return ret; +} + +static int ssd_smbus_receive_byte(struct ssd_device *dev, uint8_t saddr, uint8_t *buf) +{ + int i = 0; + int ret = 0; + + for (;;) { + ret = ssd_i2c_read(dev, saddr, 1, buf); + if (!ret || -ETIMEDOUT == ret) { + break; + } + + i++; + if (i >= SSD_SMBUS_RETRY_MAX) { + break; + } + msleep(SSD_SMBUS_RETRY_INTERVAL); + } + + return ret; +} + +static int ssd_smbus_write_byte(struct ssd_device *dev, uint8_t saddr, uint8_t cmd, uint8_t *buf) +{ + uint8_t smb_data[SSD_SMBUS_DATA_MAX] = {0}; + int i = 0; + int ret = 0; + + smb_data[0] = cmd; + memcpy((smb_data + 1), buf, 1); + + for (;;) { + ret = ssd_i2c_write(dev, saddr, 2, smb_data); + if (!ret || -ETIMEDOUT == ret) { + break; + } + + i++; + if (i >= SSD_SMBUS_RETRY_MAX) { + break; + } + msleep(SSD_SMBUS_RETRY_INTERVAL); + } + + return ret; +} + +static int ssd_smbus_read_byte(struct ssd_device *dev, uint8_t saddr, uint8_t cmd, uint8_t *buf) +{ + uint8_t smb_data[SSD_SMBUS_DATA_MAX] = {0}; + int i = 0; + int ret = 0; + + smb_data[0] = cmd; + + for (;;) { + ret = ssd_i2c_write_read(dev, saddr, 1, smb_data, 1, buf); + if (!ret || -ETIMEDOUT == ret) { + break; + } + + i++; + if (i >= SSD_SMBUS_RETRY_MAX) { + break; + } + msleep(SSD_SMBUS_RETRY_INTERVAL); + } + + return ret; +} + +static int ssd_smbus_write_word(struct ssd_device *dev, uint8_t saddr, uint8_t cmd, uint8_t *buf) +{ + uint8_t smb_data[SSD_SMBUS_DATA_MAX] = {0}; + int i = 0; + int ret = 0; + + smb_data[0] = cmd; + memcpy((smb_data + 1), buf, 2); + + for (;;) { + ret = ssd_i2c_write(dev, saddr, 3, smb_data); + if (!ret || -ETIMEDOUT == ret) { + break; + } + + i++; + if (i >= SSD_SMBUS_RETRY_MAX) { + break; + } + msleep(SSD_SMBUS_RETRY_INTERVAL); + } + + return ret; +} + +static int ssd_smbus_read_word(struct ssd_device *dev, uint8_t saddr, uint8_t cmd, uint8_t *buf) +{ + uint8_t smb_data[SSD_SMBUS_DATA_MAX] = {0}; + int i = 0; + int ret = 0; + + smb_data[0] = cmd; + + for (;;) { + ret = ssd_i2c_write_read(dev, saddr, 1, smb_data, 2, buf); + if (!ret || -ETIMEDOUT == ret) { + break; + } + + i++; + if (i >= SSD_SMBUS_RETRY_MAX) { + break; + } + msleep(SSD_SMBUS_RETRY_INTERVAL); + } + + return ret; +} + +static int ssd_smbus_write_block(struct ssd_device *dev, uint8_t saddr, uint8_t cmd, uint8_t size, uint8_t *buf) +{ + uint8_t smb_data[SSD_SMBUS_DATA_MAX] = {0}; + int i = 0; + int ret = 0; + + smb_data[0] = cmd; + smb_data[1] = size; + memcpy((smb_data + 2), buf, size); + + for (;;) { + ret = ssd_i2c_write(dev, saddr, (2 + size), smb_data); + if (!ret || -ETIMEDOUT == ret) { + break; + } + + i++; + if (i >= SSD_SMBUS_RETRY_MAX) { + break; + } + msleep(SSD_SMBUS_RETRY_INTERVAL); + } + + return ret; +} + +static int ssd_smbus_read_block(struct ssd_device *dev, uint8_t saddr, uint8_t cmd, uint8_t size, uint8_t *buf) +{ + uint8_t smb_data[SSD_SMBUS_DATA_MAX] = {0}; + uint8_t rsize; + int i = 0; + int ret = 0; + + smb_data[0] = cmd; + + for (;;) { + ret = ssd_i2c_write_read(dev, saddr, 1, smb_data, (SSD_SMBUS_BLOCK_MAX + 1), (smb_data + 1)); + if (!ret || -ETIMEDOUT == ret) { + break; + } + + i++; + if (i >= SSD_SMBUS_RETRY_MAX) { + break; + } + msleep(SSD_SMBUS_RETRY_INTERVAL); + } + if (ret) { + return ret; + } + + rsize = smb_data[1]; + + if (rsize > size ) { + rsize = size; + } + + memcpy(buf, (smb_data + 2), rsize); + + return 0; +} + + +static int ssd_gen_swlog(struct ssd_device *dev, uint16_t event, uint32_t data); + +/* sensor */ +static int ssd_init_lm75(struct ssd_device *dev, uint8_t saddr) +{ + uint8_t conf = 0; + int ret = 0; + + ret = ssd_smbus_read_byte(dev, saddr, SSD_LM75_REG_CONF, &conf); + if (ret) { + goto out; + } + + conf &= (uint8_t)(~1u); + + ret = ssd_smbus_write_byte(dev, saddr, SSD_LM75_REG_CONF, &conf); + if (ret) { + goto out; + } + +out: + return ret; +} + +static int ssd_lm75_read(struct ssd_device *dev, uint8_t saddr, uint16_t *data) +{ + uint16_t val = 0; + int ret; + + ret = ssd_smbus_read_word(dev, saddr, SSD_LM75_REG_TEMP, (uint8_t *)&val); + if (ret) { + return ret; + } + + *data = u16_swap(val); + + return 0; +} + +static int ssd_init_lm80(struct ssd_device *dev, uint8_t saddr) +{ + uint8_t val; + uint8_t low, high; + int i; + int ret = 0; + + /* init */ + val = 0x80; + ret = ssd_smbus_write_byte(dev, saddr, SSD_LM80_REG_CONFIG, &val); + if (ret) { + goto out; + } + + /* 11-bit temp */ + val = 0x08; + ret = ssd_smbus_write_byte(dev, saddr, SSD_LM80_REG_RES, &val); + if (ret) { + goto out; + } + + /* set volt limit */ + for (i=0; ihw_info.nr_ctrl <= 1 && SSD_LM80_IN_1V2 == i) { + high = 0xFF; + low = 0; + } + + /* high limit */ + ret = ssd_smbus_write_byte(dev, saddr, SSD_LM80_REG_IN_MAX(i), &high); + if (ret) { + goto out; + } + + /* low limit*/ + ret = ssd_smbus_write_byte(dev, saddr, SSD_LM80_REG_IN_MIN(i), &low); + if (ret) { + goto out; + } + } + + /* set interrupt mask: allow volt in interrupt except cap in*/ + val = 0x81; + ret = ssd_smbus_write_byte(dev, saddr, SSD_LM80_REG_MASK1, &val); + if (ret) { + goto out; + } + + /* set interrupt mask: disable others */ + val = 0xFF; + ret = ssd_smbus_write_byte(dev, saddr, SSD_LM80_REG_MASK2, &val); + if (ret) { + goto out; + } + + /* start */ + val = 0x03; + ret = ssd_smbus_write_byte(dev, saddr, SSD_LM80_REG_CONFIG, &val); + if (ret) { + goto out; + } + +out: + return ret; +} + +static int ssd_lm80_enable_in(struct ssd_device *dev, uint8_t saddr, int idx) +{ + uint8_t val = 0; + int ret = 0; + + if (idx >= SSD_LM80_IN_NR || idx < 0) { + return -EINVAL; + } + + ret = ssd_smbus_read_byte(dev, saddr, SSD_LM80_REG_MASK1, &val); + if (ret) { + goto out; + } + + val &= ~(1UL << (uint32_t)idx); + + ret = ssd_smbus_write_byte(dev, saddr, SSD_LM80_REG_MASK1, &val); + if (ret) { + goto out; + } + +out: + return ret; +} + +static int ssd_lm80_disable_in(struct ssd_device *dev, uint8_t saddr, int idx) +{ + uint8_t val = 0; + int ret = 0; + + if (idx >= SSD_LM80_IN_NR || idx < 0) { + return -EINVAL; + } + + ret = ssd_smbus_read_byte(dev, saddr, SSD_LM80_REG_MASK1, &val); + if (ret) { + goto out; + } + + val |= (1UL << (uint32_t)idx); + + ret = ssd_smbus_write_byte(dev, saddr, SSD_LM80_REG_MASK1, &val); + if (ret) { + goto out; + } + +out: + return ret; +} + +static int ssd_lm80_read_temp(struct ssd_device *dev, uint8_t saddr, uint16_t *data) +{ + uint16_t val = 0; + int ret; + + ret = ssd_smbus_read_word(dev, saddr, SSD_LM80_REG_TEMP, (uint8_t *)&val); + if (ret) { + return ret; + } + + *data = u16_swap(val); + + return 0; +} + +static int ssd_lm80_check_event(struct ssd_device *dev, uint8_t saddr) +{ + uint32_t volt; + uint16_t val = 0, status; + uint8_t alarm1 = 0, alarm2 = 0; + int i; + int ret = 0; + + /* read interrupt status to clear interrupt */ + ret = ssd_smbus_read_byte(dev, saddr, SSD_LM80_REG_ALARM1, &alarm1); + if (ret) { + goto out; + } + + ret = ssd_smbus_read_byte(dev, saddr, SSD_LM80_REG_ALARM2, &alarm2); + if (ret) { + goto out; + } + + status = (uint16_t)alarm1 | ((uint16_t)alarm2 << 8); + + /* parse inetrrupt status */ + for (i=0; i> (uint32_t)i) & 0x1)) { + if (test_and_clear_bit(SSD_HWMON_LM80(i), &dev->hwmon)) { + /* enable INx irq */ + ret = ssd_lm80_enable_in(dev, saddr, i); + if (ret) { + goto out; + } + } + + continue; + } + + /* disable INx irq */ + ret = ssd_lm80_disable_in(dev, saddr, i); + if (ret) { + goto out; + } + + if (test_and_set_bit(SSD_HWMON_LM80(i), &dev->hwmon)) { + continue; + } + + ret = ssd_smbus_read_word(dev, saddr, SSD_LM80_REG_IN(i), (uint8_t *)&val); + if (ret) { + goto out; + } + + volt = SSD_LM80_CONVERT_VOLT(u16_swap(val)); + + switch (i) { + case SSD_LM80_IN_CAP: { + if (0 == volt) { + ssd_gen_swlog(dev, SSD_LOG_CAP_SHORT_CIRCUIT, 0); + } else { + ssd_gen_swlog(dev, SSD_LOG_CAP_VOLT_FAULT, SSD_PL_CAP_VOLT(volt)); + } + break; + } + + case SSD_LM80_IN_1V2: + case SSD_LM80_IN_1V2a: + case SSD_LM80_IN_1V5: + case SSD_LM80_IN_1V8: { + ssd_gen_swlog(dev, SSD_LOG_VOLT_STATUS, SSD_VOLT_LOG_DATA(i, 0, volt)); + break; + } + case SSD_LM80_IN_FPGA_3V3: + case SSD_LM80_IN_3V3: { + ssd_gen_swlog(dev, SSD_LOG_VOLT_STATUS, SSD_VOLT_LOG_DATA(i, 0, SSD_LM80_3V3_VOLT(volt))); + break; + } + default: + break; + } + } + +out: + if (ret) { + if (!test_and_set_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM80), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_SENSOR_FAULT, (uint32_t)saddr); + } + } else { + test_and_clear_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM80), &dev->hwmon); + } + return ret; +} + +static int ssd_init_sensor(struct ssd_device *dev) +{ + int ret = 0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + goto out; + } + + ret = ssd_init_lm75(dev, SSD_SENSOR_LM75_SADDRESS); + if (ret) { + hio_warn("%s: init lm75 failed\n", dev->name); + if (!test_and_set_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM75), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_SENSOR_FAULT, SSD_SENSOR_LM75_SADDRESS); + } + goto out; + } + + if (dev->hw_info.pcb_ver >= 'B' || dev->hw_info_ext.form_factor == SSD_FORM_FACTOR_HHHL) { + ret = ssd_init_lm80(dev, SSD_SENSOR_LM80_SADDRESS); + if (ret) { + hio_warn("%s: init lm80 failed\n", dev->name); + if (!test_and_set_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM80), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_SENSOR_FAULT, SSD_SENSOR_LM80_SADDRESS); + } + goto out; + } + } + +out: + /* skip error if not in standard mode */ + if (mode != SSD_DRV_MODE_STANDARD) { + ret = 0; + } + return ret; +} + +/* board volt */ +static int ssd_mon_boardvolt(struct ssd_device *dev) +{ + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + return 0; + } + + if (dev->hw_info_ext.form_factor == SSD_FORM_FACTOR_FHHL && dev->hw_info.pcb_ver < 'B') { + return 0; + } + + return ssd_lm80_check_event(dev, SSD_SENSOR_LM80_SADDRESS); +} + +/* temperature */ +static int ssd_mon_temp(struct ssd_device *dev) +{ + int cur; + uint16_t val = 0; + int ret = 0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + return 0; + } + + if (dev->hw_info_ext.form_factor == SSD_FORM_FACTOR_FHHL && dev->hw_info.pcb_ver < 'B') { + return 0; + } + + /* inlet */ + ret = ssd_lm80_read_temp(dev, SSD_SENSOR_LM80_SADDRESS, &val); + if (ret) { + if (!test_and_set_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM80), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_SENSOR_FAULT, SSD_SENSOR_LM80_SADDRESS); + } + goto out; + } + test_and_clear_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM80), &dev->hwmon); + + cur = SSD_SENSOR_CONVERT_TEMP(val); + if (cur >= SSD_INLET_OT_TEMP) { + if (!test_and_set_bit(SSD_HWMON_TEMP(SSD_TEMP_INLET), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_INLET_OVER_TEMP, (uint32_t)cur); + } + } else if(cur < SSD_INLET_OT_HYST) { + if (test_and_clear_bit(SSD_HWMON_TEMP(SSD_TEMP_INLET), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_INLET_NORMAL_TEMP, (uint32_t)cur); + } + } + + /* flash */ + ret = ssd_lm75_read(dev, SSD_SENSOR_LM75_SADDRESS, &val); + if (ret) { + if (!test_and_set_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM75), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_SENSOR_FAULT, SSD_SENSOR_LM75_SADDRESS); + } + goto out; + } + test_and_clear_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM75), &dev->hwmon); + + cur = SSD_SENSOR_CONVERT_TEMP(val); + if (cur >= SSD_FLASH_OT_TEMP) { + if (!test_and_set_bit(SSD_HWMON_TEMP(SSD_TEMP_FLASH), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_FLASH_OVER_TEMP, (uint32_t)cur); + } + } else if(cur < SSD_FLASH_OT_HYST) { + if (test_and_clear_bit(SSD_HWMON_TEMP(SSD_TEMP_FLASH), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_FLASH_NORMAL_TEMP, (uint32_t)cur); + } + } + +out: + return ret; +} + +/* cmd tag */ +static inline void ssd_put_tag(struct ssd_device *dev, int tag) +{ + test_and_clear_bit(tag, dev->tag_map); + wake_up(&dev->tag_wq); +} + +static inline int ssd_get_tag(struct ssd_device *dev, int wait) +{ + int tag; + +find_tag: + while ((tag = find_first_zero_bit(dev->tag_map, dev->hw_info.cmd_fifo_sz)) >= atomic_read(&dev->queue_depth)) { + DEFINE_WAIT(__wait); + + if (!wait) { + return -1; + } + + prepare_to_wait_exclusive(&dev->tag_wq, &__wait, TASK_UNINTERRUPTIBLE); + schedule(); + + finish_wait(&dev->tag_wq, &__wait); + } + + if (test_and_set_bit(tag, dev->tag_map)) { + goto find_tag; + } + + return tag; +} + +static void ssd_barrier_put_tag(struct ssd_device *dev, int tag) +{ + test_and_clear_bit(tag, dev->tag_map); +} + +static int ssd_barrier_get_tag(struct ssd_device *dev) +{ + int tag = 0; + + if (test_and_set_bit(tag, dev->tag_map)) { + return -1; + } + + return tag; +} + +static void ssd_barrier_end(struct ssd_device *dev) +{ + atomic_set(&dev->queue_depth, dev->hw_info.cmd_fifo_sz); + wake_up_all(&dev->tag_wq); + + mutex_unlock(&dev->barrier_mutex); +} + +static int ssd_barrier_start(struct ssd_device *dev) +{ + int i; + + mutex_lock(&dev->barrier_mutex); + + atomic_set(&dev->queue_depth, 0); + + for (i=0; itag_map, dev->hw_info.cmd_fifo_sz) >= dev->hw_info.cmd_fifo_sz) { + return 0; + } + + __set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(1); + } + + atomic_set(&dev->queue_depth, dev->hw_info.cmd_fifo_sz); + wake_up_all(&dev->tag_wq); + + mutex_unlock(&dev->barrier_mutex); + + return -EBUSY; +} + +static int ssd_busy(struct ssd_device *dev) +{ + if (find_first_bit(dev->tag_map, dev->hw_info.cmd_fifo_sz) >= dev->hw_info.cmd_fifo_sz) { + return 0; + } + + return 1; +} + +static int ssd_wait_io(struct ssd_device *dev) +{ + int i; + + for (i=0; itag_map, dev->hw_info.cmd_fifo_sz) >= dev->hw_info.cmd_fifo_sz) { + return 0; + } + + __set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(1); + } + + return -EBUSY; +} + +#if 0 +static int ssd_in_barrier(struct ssd_device *dev) +{ + return (0 == atomic_read(&dev->queue_depth)); +} +#endif + +static void ssd_cleanup_tag(struct ssd_device *dev) +{ + kfree(dev->tag_map); +} + +static int ssd_init_tag(struct ssd_device *dev) +{ + int nr_ulongs = ALIGN(dev->hw_info.cmd_fifo_sz, BITS_PER_LONG) / BITS_PER_LONG; + + mutex_init(&dev->barrier_mutex); + + atomic_set(&dev->queue_depth, dev->hw_info.cmd_fifo_sz); + + dev->tag_map = kmalloc(nr_ulongs * sizeof(unsigned long), GFP_ATOMIC); + if (!dev->tag_map) { + return -ENOMEM; + } + + memset(dev->tag_map, 0, nr_ulongs * sizeof(unsigned long)); + + init_waitqueue_head(&dev->tag_wq); + + return 0; +} + +/* io stat */ +static void ssd_end_io_acct(struct ssd_cmd *cmd) +{ + struct ssd_device *dev = cmd->dev; + struct bio *bio = cmd->bio; + unsigned long dur = jiffies - cmd->start_time; + int rw = bio_data_dir(bio); + +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)) || (defined RHEL_MAJOR && RHEL_MAJOR == 6 && RHEL_MINOR >= 7)) + int cpu = part_stat_lock(); + struct hd_struct *part = disk_map_sector_rcu(dev->gd, bio_start(bio)); + part_round_stats(cpu, part); + part_stat_add(cpu, part, ticks[rw], dur); + part_dec_in_flight(part, rw); + part_stat_unlock(); +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) + int cpu = part_stat_lock(); + struct hd_struct *part = &dev->gd->part0; + part_round_stats(cpu, part); + part_stat_add(cpu, part, ticks[rw], dur); + part_stat_unlock(); + part->in_flight[rw] = atomic_dec_return(&dev->in_flight[rw]); +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,14)) + preempt_disable(); + disk_round_stats(dev->gd); + preempt_enable(); + disk_stat_add(dev->gd, ticks[rw], dur); + dev->gd->in_flight = atomic_dec_return(&dev->in_flight[0]); +#else + preempt_disable(); + disk_round_stats(dev->gd); + preempt_enable(); + if (rw == WRITE) { + disk_stat_add(dev->gd, write_ticks, dur); + } else { + disk_stat_add(dev->gd, read_ticks, dur); + } + dev->gd->in_flight = atomic_dec_return(&dev->in_flight[0]); +#endif +} + +static void ssd_start_io_acct(struct ssd_cmd *cmd) +{ + struct ssd_device *dev = cmd->dev; + struct bio *bio = cmd->bio; + int rw = bio_data_dir(bio); + +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)) || (defined RHEL_MAJOR && RHEL_MAJOR == 6 && RHEL_MINOR >= 7)) + int cpu = part_stat_lock(); + struct hd_struct *part = disk_map_sector_rcu(dev->gd, bio_start(bio)); + part_round_stats(cpu, part); + part_stat_inc(cpu, part, ios[rw]); + part_stat_add(cpu, part, sectors[rw], bio_sectors(bio)); + part_inc_in_flight(part, rw); + part_stat_unlock(); +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) + int cpu = part_stat_lock(); + struct hd_struct *part = &dev->gd->part0; + part_round_stats(cpu, part); + part_stat_inc(cpu, part, ios[rw]); + part_stat_add(cpu, part, sectors[rw], bio_sectors(bio)); + part_stat_unlock(); + part->in_flight[rw] = atomic_inc_return(&dev->in_flight[rw]); +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,14)) + preempt_disable(); + disk_round_stats(dev->gd); + preempt_enable(); + disk_stat_inc(dev->gd, ios[rw]); + disk_stat_add(dev->gd, sectors[rw], bio_sectors(bio)); + dev->gd->in_flight = atomic_inc_return(&dev->in_flight[0]); +#else + preempt_disable(); + disk_round_stats(dev->gd); + preempt_enable(); + if (rw == WRITE) { + disk_stat_inc(dev->gd, writes); + disk_stat_add(dev->gd, write_sectors, bio_sectors(bio)); + } else { + disk_stat_inc(dev->gd, reads); + disk_stat_add(dev->gd, read_sectors, bio_sectors(bio)); + } + dev->gd->in_flight = atomic_inc_return(&dev->in_flight[0]); +#endif + + cmd->start_time = jiffies; +} + +/* io */ +static void ssd_queue_bio(struct ssd_device *dev, struct bio *bio) +{ + spin_lock(&dev->sendq_lock); + ssd_blist_add(&dev->sendq, bio); + spin_unlock(&dev->sendq_lock); + + atomic_inc(&dev->in_sendq); + wake_up(&dev->send_waitq); +} + +static inline void ssd_end_request(struct ssd_cmd *cmd) +{ + struct ssd_device *dev = cmd->dev; + struct bio *bio = cmd->bio; + int errors = cmd->errors; + int tag = cmd->tag; + + if (bio) { +#if (defined SSD_TRIM && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))) + if (!(bio->bi_rw & REQ_DISCARD)) { + ssd_end_io_acct(cmd); + if (!cmd->flag) { + pci_unmap_sg(dev->pdev, cmd->sgl, cmd->nsegs, + bio_data_dir(bio) == READ ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); + } + } +#elif (defined SSD_TRIM && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))) + if (!bio_rw_flagged(bio, BIO_RW_DISCARD)) { + ssd_end_io_acct(cmd); + if (!cmd->flag) { + pci_unmap_sg(dev->pdev, cmd->sgl, cmd->nsegs, + bio_data_dir(bio) == READ ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); + } + } +#else + ssd_end_io_acct(cmd); + + if (!cmd->flag) { + pci_unmap_sg(dev->pdev, cmd->sgl, cmd->nsegs, + bio_data_dir(bio) == READ ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); + } +#endif + + cmd->bio = NULL; + ssd_put_tag(dev, tag); + + if (SSD_INT_MSIX == dev->int_mode || tag < 16 || errors) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, errors); +#else + bio_endio(bio, bio->bi_size, errors); +#endif + } else /* if (bio->bi_idx >= bio->bi_vcnt)*/ { + spin_lock(&dev->doneq_lock); + ssd_blist_add(&dev->doneq, bio); + spin_unlock(&dev->doneq_lock); + + atomic_inc(&dev->in_doneq); + wake_up(&dev->done_waitq); + } + } else { + if (cmd->waiting) { + complete(cmd->waiting); + } + } +} + +static void ssd_end_timeout_request(struct ssd_cmd *cmd) +{ + struct ssd_device *dev = cmd->dev; + struct ssd_rw_msg *msg = (struct ssd_rw_msg *)cmd->msg; + int i; + + for (i=0; inr_queue; i++) { + disable_irq(dev->entry[i].vector); + } + + atomic_inc(&dev->tocnt); + //if (cmd->bio) { + hio_err("%s: cmd timeout: tag %d fun %#x\n", dev->name, msg->tag, msg->fun); + cmd->errors = -ETIMEDOUT; + ssd_end_request(cmd); + //} + + for (i=0; inr_queue; i++) { + enable_irq(dev->entry[i].vector); + } + + /* alarm led */ + ssd_set_alarm(dev); +} + +/* cmd timer */ +static void ssd_cmd_add_timer(struct ssd_cmd *cmd, int timeout, void (*complt)(struct ssd_cmd *)) +{ + init_timer(&cmd->cmd_timer); + + cmd->cmd_timer.data = (unsigned long)cmd; + cmd->cmd_timer.expires = jiffies + timeout; + cmd->cmd_timer.function = (void (*)(unsigned long)) complt; + + add_timer(&cmd->cmd_timer); +} + +static int ssd_cmd_del_timer(struct ssd_cmd *cmd) +{ + return del_timer(&cmd->cmd_timer); +} + +static void ssd_add_timer(struct timer_list *timer, int timeout, void (*complt)(void *), void *data) +{ + init_timer(timer); + + timer->data = (unsigned long)data; + timer->expires = jiffies + timeout; + timer->function = (void (*)(unsigned long)) complt; + + add_timer(timer); +} + +static int ssd_del_timer(struct timer_list *timer) +{ + return del_timer(timer); +} + +static void ssd_cmd_timeout(struct ssd_cmd *cmd) +{ + struct ssd_device *dev = cmd->dev; + uint32_t msg = *(uint32_t *)cmd->msg; + + ssd_end_timeout_request(cmd); + + ssd_gen_swlog(dev, SSD_LOG_TIMEOUT, msg); +} + + +static void __ssd_done(unsigned long data) +{ + struct ssd_cmd *cmd; + LIST_HEAD(localq); + + local_irq_disable(); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0)) + list_splice_init(&__get_cpu_var(ssd_doneq), &localq); +#else + list_splice_init(this_cpu_ptr(&ssd_doneq), &localq); +#endif + local_irq_enable(); + + while (!list_empty(&localq)) { + cmd = list_entry(localq.next, struct ssd_cmd, list); + list_del_init(&cmd->list); + + ssd_end_request(cmd); + } +} + +static void __ssd_done_db(unsigned long data) +{ + struct ssd_cmd *cmd; + struct ssd_device *dev; + struct bio *bio; + LIST_HEAD(localq); + + local_irq_disable(); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0)) + list_splice_init(&__get_cpu_var(ssd_doneq), &localq); +#else + list_splice_init(this_cpu_ptr(&ssd_doneq), &localq); +#endif + local_irq_enable(); + + while (!list_empty(&localq)) { + cmd = list_entry(localq.next, struct ssd_cmd, list); + list_del_init(&cmd->list); + + dev = (struct ssd_device *)cmd->dev; + bio = cmd->bio; + + if (bio) { + sector_t off = dev->db_info.data.loc.off; + uint32_t len = dev->db_info.data.loc.len; + + switch (dev->db_info.type) { + case SSD_DEBUG_READ_ERR: + if (bio_data_dir(bio) == READ && + !((off + len) <= bio_start(bio) || off >= (bio_start(bio) + bio_sectors(bio)))) { + cmd->errors = -EIO; + } + break; + case SSD_DEBUG_WRITE_ERR: + if (bio_data_dir(bio) == WRITE && + !((off + len) <= bio_start(bio) || off >= (bio_start(bio) + bio_sectors(bio)))) { + cmd->errors = -EROFS; + } + break; + case SSD_DEBUG_RW_ERR: + if (!((off + len) <= bio_start(bio) || off >= (bio_start(bio) + bio_sectors(bio)))) { + if (bio_data_dir(bio) == READ) { + cmd->errors = -EIO; + } else { + cmd->errors = -EROFS; + } + } + break; + default: + break; + } + } + + ssd_end_request(cmd); + } +} + +static inline void ssd_done_bh(struct ssd_cmd *cmd) +{ + unsigned long flags = 0; + + if (unlikely(!ssd_cmd_del_timer(cmd))) { + struct ssd_device *dev = cmd->dev; + struct ssd_rw_msg *msg = (struct ssd_rw_msg *)cmd->msg; + hio_err("%s: unknown cmd: tag %d fun %#x\n", dev->name, msg->tag, msg->fun); + + /* alarm led */ + ssd_set_alarm(dev); + return; + } + + local_irq_save(flags); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,13,0)) + list_add_tail(&cmd->list, &__get_cpu_var(ssd_doneq)); + tasklet_hi_schedule(&__get_cpu_var(ssd_tasklet)); +#else + list_add_tail(&cmd->list, this_cpu_ptr(&ssd_doneq)); + tasklet_hi_schedule(this_cpu_ptr(&ssd_tasklet)); +#endif + local_irq_restore(flags); + + return; +} + +static inline void ssd_done(struct ssd_cmd *cmd) +{ + if (unlikely(!ssd_cmd_del_timer(cmd))) { + struct ssd_device *dev = cmd->dev; + struct ssd_rw_msg *msg = (struct ssd_rw_msg *)cmd->msg; + hio_err("%s: unknown cmd: tag %d fun %#x\n", dev->name, msg->tag, msg->fun); + + /* alarm led */ + ssd_set_alarm(dev); + return; + } + + ssd_end_request(cmd); + + return; +} + +static inline void ssd_dispatch_cmd(struct ssd_cmd *cmd) +{ + struct ssd_device *dev = (struct ssd_device *)cmd->dev; + + ssd_cmd_add_timer(cmd, SSD_CMD_TIMEOUT, ssd_cmd_timeout); + + spin_lock(&dev->cmd_lock); + ssd_reg_write(dev->ctrlp + SSD_REQ_FIFO_REG, cmd->msg_dma); + spin_unlock(&dev->cmd_lock); +} + +static inline void ssd_send_cmd(struct ssd_cmd *cmd) +{ + struct ssd_device *dev = (struct ssd_device *)cmd->dev; + + ssd_cmd_add_timer(cmd, SSD_CMD_TIMEOUT, ssd_cmd_timeout); + + ssd_reg32_write(dev->ctrlp + SSD_REQ_FIFO_REG, ((uint32_t)cmd->tag | ((uint32_t)cmd->nsegs << 16))); +} + +static inline void ssd_send_cmd_db(struct ssd_cmd *cmd) +{ + struct ssd_device *dev = (struct ssd_device *)cmd->dev; + struct bio *bio = cmd->bio; + + ssd_cmd_add_timer(cmd, SSD_CMD_TIMEOUT, ssd_cmd_timeout); + + if (bio) { + switch (dev->db_info.type) { + case SSD_DEBUG_READ_TO: + if (bio_data_dir(bio) == READ) { + return; + } + break; + case SSD_DEBUG_WRITE_TO: + if (bio_data_dir(bio) == WRITE) { + return; + } + break; + case SSD_DEBUG_RW_TO: + return; + break; + default: + break; + } + } + + ssd_reg32_write(dev->ctrlp + SSD_REQ_FIFO_REG, ((uint32_t)cmd->tag | ((uint32_t)cmd->nsegs << 16))); +} + + +/* fixed for BIOVEC_PHYS_MERGEABLE */ +#ifdef SSD_BIOVEC_PHYS_MERGEABLE_FIXED +#include +#include +#include + +static bool xen_biovec_phys_mergeable_fixed(const struct bio_vec *vec1, + const struct bio_vec *vec2) +{ + unsigned long mfn1 = pfn_to_mfn(page_to_pfn(vec1->bv_page)); + unsigned long mfn2 = pfn_to_mfn(page_to_pfn(vec2->bv_page)); + + return __BIOVEC_PHYS_MERGEABLE(vec1, vec2) && + ((mfn1 == mfn2) || ((mfn1+1) == mfn2)); +} + +#ifdef BIOVEC_PHYS_MERGEABLE +#undef BIOVEC_PHYS_MERGEABLE +#endif +#define BIOVEC_PHYS_MERGEABLE(vec1, vec2) \ + (__BIOVEC_PHYS_MERGEABLE(vec1, vec2) && \ + (!xen_domain() || xen_biovec_phys_mergeable_fixed(vec1, vec2))) + +#endif + +static inline int ssd_bio_map_sg(struct ssd_device *dev, struct bio *bio, struct scatterlist *sgl) +{ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)) + struct bio_vec *bvec, *bvprv = NULL; + struct scatterlist *sg = NULL; + int i = 0, nsegs = 0; + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,23)) + sg_init_table(sgl, dev->hw_info.cmd_max_sg); +#endif + + /* + * for each segment in bio + */ + bio_for_each_segment(bvec, bio, i) { + if (bvprv && BIOVEC_PHYS_MERGEABLE(bvprv, bvec)) { + sg->length += bvec->bv_len; + } else { + if (unlikely(nsegs >= (int)dev->hw_info.cmd_max_sg)) { + break; + } + + sg = sg ? (sg + 1) : sgl; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + sg_set_page(sg, bvec->bv_page, bvec->bv_len, bvec->bv_offset); +#else + sg->page = bvec->bv_page; + sg->length = bvec->bv_len; + sg->offset = bvec->bv_offset; +#endif + nsegs++; + } + bvprv = bvec; + } + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + if (sg) { + sg_mark_end(sg); + } +#endif + + bio->bi_idx = i; + + return nsegs; +#else + struct bio_vec bvec, bvprv; + struct bvec_iter iter; + struct scatterlist *sg = NULL; + int nsegs = 0; + int first = 1; + + sg_init_table(sgl, dev->hw_info.cmd_max_sg); + + /* + * for each segment in bio + */ + bio_for_each_segment(bvec, bio, iter) { + if (!first && BIOVEC_PHYS_MERGEABLE(&bvprv, &bvec)) { + sg->length += bvec.bv_len; + } else { + if (unlikely(nsegs >= (int)dev->hw_info.cmd_max_sg)) { + break; + } + + sg = sg ? (sg + 1) : sgl; + + sg_set_page(sg, bvec.bv_page, bvec.bv_len, bvec.bv_offset); + + nsegs++; + first = 0; + } + bvprv = bvec; + } + + if (sg) { + sg_mark_end(sg); + } + + return nsegs; +#endif +} + + +static int __ssd_submit_pbio(struct ssd_device *dev, struct bio *bio, int wait) +{ + struct ssd_cmd *cmd; + struct ssd_rw_msg *msg; + struct ssd_sg_entry *sge; + sector_t block = bio_start(bio); + int tag; + int i; + + tag = ssd_get_tag(dev, wait); + if (tag < 0) { + return -EBUSY; + } + + cmd = &dev->cmd[tag]; + cmd->bio = bio; + cmd->flag = 1; + + msg = (struct ssd_rw_msg *)cmd->msg; + +#if (defined SSD_TRIM && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))) + if (bio->bi_rw & REQ_DISCARD) { + unsigned int length = bio_sectors(bio); + + //printk(KERN_WARNING "%s: discard len %u, block %llu\n", dev->name, bio_sectors(bio), block); + msg->tag = tag; + msg->fun = SSD_FUNC_TRIM; + + sge = msg->sge; + for (i=0; i<(dev->hw_info.cmd_max_sg); i++) { + sge->block = block; + sge->length = (length >= dev->hw_info.sg_max_sec) ? dev->hw_info.sg_max_sec : length; + sge->buf = 0; + + block += sge->length; + length -= sge->length; + sge++; + + if (length <= 0) { + break; + } + } + msg->nsegs = cmd->nsegs = (i + 1); + + dev->scmd(cmd); + return 0; + } +#elif (defined SSD_TRIM && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))) + if (bio_rw_flagged(bio, BIO_RW_DISCARD)) { + unsigned int length = bio_sectors(bio); + + //printk(KERN_WARNING "%s: discard len %u, block %llu\n", dev->name, bio_sectors(bio), block); + msg->tag = tag; + msg->fun = SSD_FUNC_TRIM; + + sge = msg->sge; + for (i=0; i<(dev->hw_info.cmd_max_sg); i++) { + sge->block = block; + sge->length = (length >= dev->hw_info.sg_max_sec) ? dev->hw_info.sg_max_sec : length; + sge->buf = 0; + + block += sge->length; + length -= sge->length; + sge++; + + if (length <= 0) { + break; + } + } + msg->nsegs = cmd->nsegs = (i + 1); + + dev->scmd(cmd); + return 0; + } +#endif + + //msg->nsegs = cmd->nsegs = ssd_bio_map_sg(dev, bio, sgl); + msg->nsegs = cmd->nsegs = bio->bi_vcnt; + + //xx + if (bio_data_dir(bio) == READ) { + msg->fun = SSD_FUNC_READ; + msg->flag = 0; + } else { + msg->fun = SSD_FUNC_WRITE; + msg->flag = dev->wmode; + } + + sge = msg->sge; + for (i=0; ibi_vcnt; i++) { + sge->block = block; + sge->length = bio->bi_io_vec[i].bv_len >> 9; + sge->buf = (uint64_t)((void *)bio->bi_io_vec[i].bv_page + bio->bi_io_vec[i].bv_offset); + + block += sge->length; + sge++; + } + + msg->tag = tag; + +#ifdef SSD_OT_PROTECT + if (unlikely(dev->ot_delay > 0 && dev->ot_protect != 0)) { + msleep_interruptible(dev->ot_delay); + } +#endif + + ssd_start_io_acct(cmd); + dev->scmd(cmd); + + return 0; +} + +static inline int ssd_submit_bio(struct ssd_device *dev, struct bio *bio, int wait) +{ + struct ssd_cmd *cmd; + struct ssd_rw_msg *msg; + struct ssd_sg_entry *sge; + struct scatterlist *sgl; + sector_t block = bio_start(bio); + int tag; + int i; + + tag = ssd_get_tag(dev, wait); + if (tag < 0) { + return -EBUSY; + } + + cmd = &dev->cmd[tag]; + cmd->bio = bio; + cmd->flag = 0; + + msg = (struct ssd_rw_msg *)cmd->msg; + + sgl = cmd->sgl; + +#if (defined SSD_TRIM && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36))) + if (bio->bi_rw & REQ_DISCARD) { + unsigned int length = bio_sectors(bio); + + //printk(KERN_WARNING "%s: discard len %u, block %llu\n", dev->name, bio_sectors(bio), block); + msg->tag = tag; + msg->fun = SSD_FUNC_TRIM; + + sge = msg->sge; + for (i=0; i<(dev->hw_info.cmd_max_sg); i++) { + sge->block = block; + sge->length = (length >= dev->hw_info.sg_max_sec) ? dev->hw_info.sg_max_sec : length; + sge->buf = 0; + + block += sge->length; + length -= sge->length; + sge++; + + if (length <= 0) { + break; + } + } + msg->nsegs = cmd->nsegs = (i + 1); + + dev->scmd(cmd); + return 0; + } +#elif (defined SSD_TRIM && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))) + if (bio_rw_flagged(bio, BIO_RW_DISCARD)) { + unsigned int length = bio_sectors(bio); + + //printk(KERN_WARNING "%s: discard len %u, block %llu\n", dev->name, bio_sectors(bio), block); + msg->tag = tag; + msg->fun = SSD_FUNC_TRIM; + + sge = msg->sge; + for (i=0; i<(dev->hw_info.cmd_max_sg); i++) { + sge->block = block; + sge->length = (length >= dev->hw_info.sg_max_sec) ? dev->hw_info.sg_max_sec : length; + sge->buf = 0; + + block += sge->length; + length -= sge->length; + sge++; + + if (length <= 0) { + break; + } + } + msg->nsegs = cmd->nsegs = (i + 1); + + dev->scmd(cmd); + return 0; + } +#endif + + msg->nsegs = cmd->nsegs = ssd_bio_map_sg(dev, bio, sgl); + + //xx + if (bio_data_dir(bio) == READ) { + msg->fun = SSD_FUNC_READ; + msg->flag = 0; + pci_map_sg(dev->pdev, sgl, cmd->nsegs, PCI_DMA_FROMDEVICE); + } else { + msg->fun = SSD_FUNC_WRITE; + msg->flag = dev->wmode; + pci_map_sg(dev->pdev, sgl, cmd->nsegs, PCI_DMA_TODEVICE); + } + + sge = msg->sge; + for (i=0; insegs; i++) { + sge->block = block; + sge->length = sg_dma_len(sgl) >> 9; + sge->buf = sg_dma_address(sgl); + + block += sge->length; + sgl++; + sge++; + } + + msg->tag = tag; + +#ifdef SSD_OT_PROTECT + if (unlikely(dev->ot_delay > 0 && dev->ot_protect != 0)) { + msleep_interruptible(dev->ot_delay); + } +#endif + + ssd_start_io_acct(cmd); + dev->scmd(cmd); + + return 0; +} + +/* threads */ +static int ssd_done_thread(void *data) +{ + struct ssd_device *dev; + struct bio *bio; + struct bio *next; +#ifdef SSD_ESCAPE_IRQ + cpumask_t new_mask; +#endif + + if (!data) { + return -EINVAL; + } + dev = data; + + //set_user_nice(current, -5); + + while (!kthread_should_stop()) { + wait_event_interruptible(dev->done_waitq, (atomic_read(&dev->in_doneq) || kthread_should_stop())); + + while (atomic_read(&dev->in_doneq)) { + if (threaded_irq) { + spin_lock(&dev->doneq_lock); + bio = ssd_blist_get(&dev->doneq); + spin_unlock(&dev->doneq_lock); + } else { + spin_lock_irq(&dev->doneq_lock); + bio = ssd_blist_get(&dev->doneq); + spin_unlock_irq(&dev->doneq_lock); + } + + while (bio) { + next = bio->bi_next; + bio->bi_next = NULL; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, 0); +#else + bio_endio(bio, bio->bi_size, 0); +#endif + atomic_dec(&dev->in_doneq); + bio = next; + } + + cond_resched(); + +#ifdef SSD_ESCAPE_IRQ + if (unlikely(smp_processor_id() == dev->irq_cpu)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28)) + cpumask_setall(&new_mask); + cpumask_clear_cpu(dev->irq_cpu, &new_mask); + set_cpus_allowed_ptr(current, &new_mask); +#else + cpus_setall(new_mask); + cpu_clear(dev->irq_cpu, new_mask); + set_cpus_allowed(current, new_mask); +#endif + } +#endif + } + } + return 0; +} + +static int ssd_send_thread(void *data) +{ + struct ssd_device *dev; + struct bio *bio; + struct bio *next; +#ifdef SSD_ESCAPE_IRQ + cpumask_t new_mask; +#endif + + if (!data) { + return -EINVAL; + } + dev = data; + + //set_user_nice(current, -5); + + while (!kthread_should_stop()) { + wait_event_interruptible(dev->send_waitq, (atomic_read(&dev->in_sendq) || kthread_should_stop())); + + while (atomic_read(&dev->in_sendq)) { + spin_lock(&dev->sendq_lock); + bio = ssd_blist_get(&dev->sendq); + spin_unlock(&dev->sendq_lock); + + while (bio) { + next = bio->bi_next; + bio->bi_next = NULL; +#ifdef SSD_QUEUE_PBIO + if (test_and_clear_bit(BIO_SSD_PBIO, &bio->bi_flags)) { + __ssd_submit_pbio(dev, bio, 1); + } else { + ssd_submit_bio(dev, bio, 1); + } +#else + ssd_submit_bio(dev, bio, 1); +#endif + atomic_dec(&dev->in_sendq); + bio = next; + } + + cond_resched(); + +#ifdef SSD_ESCAPE_IRQ + if (unlikely(smp_processor_id() == dev->irq_cpu)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28)) + cpumask_setall(&new_mask); + cpumask_clear_cpu(dev->irq_cpu, &new_mask); + set_cpus_allowed_ptr(current, &new_mask); +#else + cpus_setall(new_mask); + cpu_clear(dev->irq_cpu, new_mask); + set_cpus_allowed(current, new_mask); +#endif + } +#endif + } + } + + return 0; +} + +static void ssd_cleanup_thread(struct ssd_device *dev) +{ + kthread_stop(dev->send_thread); + kthread_stop(dev->done_thread); +} + +static int ssd_init_thread(struct ssd_device *dev) +{ + int ret; + + atomic_set(&dev->in_doneq, 0); + atomic_set(&dev->in_sendq, 0); + + spin_lock_init(&dev->doneq_lock); + spin_lock_init(&dev->sendq_lock); + + ssd_blist_init(&dev->doneq); + ssd_blist_init(&dev->sendq); + + init_waitqueue_head(&dev->done_waitq); + init_waitqueue_head(&dev->send_waitq); + + dev->done_thread = kthread_run(ssd_done_thread, dev, "%s/d", dev->name); + if (IS_ERR(dev->done_thread)) { + ret = PTR_ERR(dev->done_thread); + goto out_done_thread; + } + + dev->send_thread = kthread_run(ssd_send_thread, dev, "%s/s", dev->name); + if (IS_ERR(dev->send_thread)) { + ret = PTR_ERR(dev->send_thread); + goto out_send_thread; + } + + return 0; + +out_send_thread: + kthread_stop(dev->done_thread); +out_done_thread: + return ret; +} + +/* dcmd pool */ +static void ssd_put_dcmd(struct ssd_dcmd *dcmd) +{ + struct ssd_device *dev = (struct ssd_device *)dcmd->dev; + + spin_lock(&dev->dcmd_lock); + list_add_tail(&dcmd->list, &dev->dcmd_list); + spin_unlock(&dev->dcmd_lock); +} + +static struct ssd_dcmd *ssd_get_dcmd(struct ssd_device *dev) +{ + struct ssd_dcmd *dcmd = NULL; + + spin_lock(&dev->dcmd_lock); + if (!list_empty(&dev->dcmd_list)) { + dcmd = list_entry(dev->dcmd_list.next, + struct ssd_dcmd, list); + list_del_init(&dcmd->list); + } + spin_unlock(&dev->dcmd_lock); + + return dcmd; +} + +static void ssd_cleanup_dcmd(struct ssd_device *dev) +{ + kfree(dev->dcmd); +} + +static int ssd_init_dcmd(struct ssd_device *dev) +{ + struct ssd_dcmd *dcmd; + int dcmd_sz = sizeof(struct ssd_dcmd)*dev->hw_info.cmd_fifo_sz; + int i; + + spin_lock_init(&dev->dcmd_lock); + INIT_LIST_HEAD(&dev->dcmd_list); + init_waitqueue_head(&dev->dcmd_wq); + + dev->dcmd = kmalloc(dcmd_sz, GFP_KERNEL); + if (!dev->dcmd) { + hio_warn("%s: can not alloc dcmd\n", dev->name); + goto out_alloc_dcmd; + } + memset(dev->dcmd, 0, dcmd_sz); + + for (i=0, dcmd=dev->dcmd; i<(int)dev->hw_info.cmd_fifo_sz; i++, dcmd++) { + dcmd->dev = dev; + INIT_LIST_HEAD(&dcmd->list); + list_add_tail(&dcmd->list, &dev->dcmd_list); + } + + return 0; + +out_alloc_dcmd: + return -ENOMEM; +} + +static void ssd_put_dmsg(void *msg) +{ + struct ssd_dcmd *dcmd = container_of(msg, struct ssd_dcmd, msg); + struct ssd_device *dev = (struct ssd_device *)dcmd->dev; + + memset(dcmd->msg, 0, SSD_DCMD_MAX_SZ); + ssd_put_dcmd(dcmd); + wake_up(&dev->dcmd_wq); +} + +static void *ssd_get_dmsg(struct ssd_device *dev) +{ + struct ssd_dcmd *dcmd = ssd_get_dcmd(dev); + + while (!dcmd) { + DEFINE_WAIT(wait); + prepare_to_wait_exclusive(&dev->dcmd_wq, &wait, TASK_UNINTERRUPTIBLE); + schedule(); + + dcmd = ssd_get_dcmd(dev); + + finish_wait(&dev->dcmd_wq, &wait); + } + return dcmd->msg; +} + +/* do direct cmd */ +static int ssd_do_request(struct ssd_device *dev, int rw, void *msg, int *done) +{ + DECLARE_COMPLETION(wait); + struct ssd_cmd *cmd; + int tag; + int ret = 0; + + tag = ssd_get_tag(dev, 1); + if (tag < 0) { + return -EBUSY; + } + + cmd = &dev->cmd[tag]; + cmd->nsegs = 1; + memcpy(cmd->msg, msg, SSD_DCMD_MAX_SZ); + ((struct ssd_rw_msg *)cmd->msg)->tag = tag; + + cmd->waiting = &wait; + + dev->scmd(cmd); + + wait_for_completion(cmd->waiting); + cmd->waiting = NULL; + + if (cmd->errors == -ETIMEDOUT) { + ret = cmd->errors; + } else if (cmd->errors) { + ret = -EIO; + } + + if (done != NULL) { + *done = cmd->nr_log; + } + ssd_put_tag(dev, cmd->tag); + + return ret; +} + +static int ssd_do_barrier_request(struct ssd_device *dev, int rw, void *msg, int *done) +{ + DECLARE_COMPLETION(wait); + struct ssd_cmd *cmd; + int tag; + int ret = 0; + + tag = ssd_barrier_get_tag(dev); + if (tag < 0) { + return -EBUSY; + } + + cmd = &dev->cmd[tag]; + cmd->nsegs = 1; + memcpy(cmd->msg, msg, SSD_DCMD_MAX_SZ); + ((struct ssd_rw_msg *)cmd->msg)->tag = tag; + + cmd->waiting = &wait; + + dev->scmd(cmd); + + wait_for_completion(cmd->waiting); + cmd->waiting = NULL; + + if (cmd->errors == -ETIMEDOUT) { + ret = cmd->errors; + } else if (cmd->errors) { + ret = -EIO; + } + + if (done != NULL) { + *done = cmd->nr_log; + } + ssd_barrier_put_tag(dev, cmd->tag); + + return ret; +} + +#ifdef SSD_OT_PROTECT +static void ssd_check_temperature(struct ssd_device *dev, int temp) +{ + uint64_t val; + uint32_t off; + int cur; + int i; + + if (mode != SSD_DRV_MODE_STANDARD) { + return; + } + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + } + + for (i=0; ihw_info.nr_ctrl; i++) { + off = SSD_CTRL_TEMP_REG0 + i * sizeof(uint64_t); + + val = ssd_reg_read(dev->ctrlp + off); + if (val == 0xffffffffffffffffull) { + continue; + } + + cur = (int)CUR_TEMP(val); + if (cur >= temp) { + if (!test_and_set_bit(SSD_HWMON_TEMP(SSD_TEMP_CTRL), &dev->hwmon)) { + if (dev->protocol_info.ver > SSD_PROTOCOL_V3 && dev->protocol_info.ver < SSD_PROTOCOL_V3_2_2) { + hio_warn("%s: Over temperature, please check the fans.\n", dev->name); + dev->ot_delay = SSD_OT_DELAY; + } + } + return; + } + } + + if (test_and_clear_bit(SSD_HWMON_TEMP(SSD_TEMP_CTRL), &dev->hwmon)) { + if (dev->protocol_info.ver > SSD_PROTOCOL_V3 && dev->protocol_info.ver < SSD_PROTOCOL_V3_2_2) { + hio_warn("%s: Temperature is OK.\n", dev->name); + dev->ot_delay = 0; + } + } +} +#endif + +static int ssd_get_ot_status(struct ssd_device *dev, int *status) +{ + uint32_t off; + uint32_t val; + int i; + + if (!dev || !status) { + return -EINVAL; + } + + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2_2) { + for (i=0; ihw_info.nr_ctrl; i++) { + off = SSD_READ_OT_REG0 + (i * SSD_CTRL_REG_ZONE_SZ); + val = ssd_reg32_read(dev->ctrlp + off); + if ((val >> 22) & 0x1) { + *status = 1; + goto out; + } + + + off = SSD_WRITE_OT_REG0 + (i * SSD_CTRL_REG_ZONE_SZ); + val = ssd_reg32_read(dev->ctrlp + off); + if ((val >> 22) & 0x1) { + *status = 1; + goto out; + } + } + } else { + *status = !!dev->ot_delay; + } + +out: + return 0; +} + +static void ssd_set_ot_protect(struct ssd_device *dev, int protect) +{ + uint32_t off; + uint32_t val; + int i; + + mutex_lock(&dev->fw_mutex); + + dev->ot_protect = !!protect; + + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2_2) { + for (i=0; ihw_info.nr_ctrl; i++) { + off = SSD_READ_OT_REG0 + (i * SSD_CTRL_REG_ZONE_SZ); + val = ssd_reg32_read(dev->ctrlp + off); + if (dev->ot_protect) { + val |= (1U << 21); + } else { + val &= ~(1U << 21); + } + ssd_reg32_write(dev->ctrlp + off, val); + + + off = SSD_WRITE_OT_REG0 + (i * SSD_CTRL_REG_ZONE_SZ); + val = ssd_reg32_read(dev->ctrlp + off); + if (dev->ot_protect) { + val |= (1U << 21); + } else { + val &= ~(1U << 21); + } + ssd_reg32_write(dev->ctrlp + off, val); + } + } + + mutex_unlock(&dev->fw_mutex); +} + +static int ssd_init_ot_protect(struct ssd_device *dev) +{ + ssd_set_ot_protect(dev, ot_protect); + +#ifdef SSD_OT_PROTECT + ssd_check_temperature(dev, SSD_OT_TEMP); +#endif + + return 0; +} + +/* log */ +static int ssd_read_log(struct ssd_device *dev, int ctrl_idx, void *buf, int *nr_log) +{ + struct ssd_log_op_msg *msg; + struct ssd_log_msg *lmsg; + dma_addr_t buf_dma; + size_t length = dev->hw_info.log_sz; + int ret = 0; + + if (ctrl_idx >= dev->hw_info.nr_ctrl) { + return -EINVAL; + } + + buf_dma = pci_map_single(dev->pdev, buf, length, PCI_DMA_FROMDEVICE); +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,26)) + ret = dma_mapping_error(buf_dma); +#else + ret = dma_mapping_error(&(dev->pdev->dev), buf_dma); +#endif + if (ret) { + hio_warn("%s: unable to map read DMA buffer\n", dev->name); + goto out_dma_mapping; + } + + msg = (struct ssd_log_op_msg *)ssd_get_dmsg(dev); + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + lmsg = (struct ssd_log_msg *)msg; + lmsg->fun = SSD_FUNC_READ_LOG; + lmsg->ctrl_idx = ctrl_idx; + lmsg->buf = buf_dma; + } else { + msg->fun = SSD_FUNC_READ_LOG; + msg->ctrl_idx = ctrl_idx; + msg->buf = buf_dma; + } + + ret = ssd_do_request(dev, READ, msg, nr_log); + ssd_put_dmsg(msg); + + pci_unmap_single(dev->pdev, buf_dma, length, PCI_DMA_FROMDEVICE); + +out_dma_mapping: + return ret; +} + +#define SSD_LOG_PRINT_BUF_SZ 256 +static int ssd_parse_log(struct ssd_device *dev, struct ssd_log *log, int print) +{ + struct ssd_log_desc *log_desc = ssd_log_desc; + struct ssd_log_entry *le; + char *sn = NULL; + char print_buf[SSD_LOG_PRINT_BUF_SZ]; + int print_len; + + le = &log->le; + + /* find desc */ + while (log_desc->event != SSD_UNKNOWN_EVENT) { + if (log_desc->event == le->event) { + break; + } + log_desc++; + } + + if (!print) { + goto out; + } + + if (log_desc->level < log_level) { + goto out; + } + + /* parse */ + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + sn = dev->label.sn; + } else { + sn = dev->labelv3.barcode; + } + + print_len = snprintf(print_buf, SSD_LOG_PRINT_BUF_SZ, "%s (%s): <%#x>", dev->name, sn, le->event); + + if (log->ctrl_idx != SSD_LOG_SW_IDX) { + print_len += snprintf((print_buf + print_len), (SSD_LOG_PRINT_BUF_SZ - print_len), " controller %d", log->ctrl_idx); + } + + switch (log_desc->data) { + case SSD_LOG_DATA_NONE: + break; + case SSD_LOG_DATA_LOC: + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + print_len += snprintf((print_buf + print_len), (SSD_LOG_PRINT_BUF_SZ - print_len), " flash %d", le->data.loc.flash); + if (log_desc->sblock) { + print_len += snprintf((print_buf + print_len), (SSD_LOG_PRINT_BUF_SZ - print_len), " block %d", le->data.loc.block); + } + if (log_desc->spage) { + print_len += snprintf((print_buf + print_len), (SSD_LOG_PRINT_BUF_SZ - print_len), " page %d", le->data.loc.page); + } + } else { + print_len += snprintf((print_buf + print_len), (SSD_LOG_PRINT_BUF_SZ - print_len), " flash %d", le->data.loc1.flash); + if (log_desc->sblock) { + print_len += snprintf((print_buf + print_len), (SSD_LOG_PRINT_BUF_SZ - print_len), " block %d", le->data.loc1.block); + } + if (log_desc->spage) { + print_len += snprintf((print_buf + print_len), (SSD_LOG_PRINT_BUF_SZ - print_len), " page %d", le->data.loc1.page); + } + } + break; + case SSD_LOG_DATA_HEX: + print_len += snprintf((print_buf + print_len), (SSD_LOG_PRINT_BUF_SZ - print_len), " info %#x", le->data.val); + break; + default: + break; + } + /*print_len += */snprintf((print_buf + print_len), (SSD_LOG_PRINT_BUF_SZ - print_len), ": %s", log_desc->desc); + + switch (log_desc->level) { + case SSD_LOG_LEVEL_INFO: + hio_info("%s\n", print_buf); + break; + case SSD_LOG_LEVEL_NOTICE: + hio_note("%s\n", print_buf); + break; + case SSD_LOG_LEVEL_WARNING: + hio_warn("%s\n", print_buf); + break; + case SSD_LOG_LEVEL_ERR: + hio_err("%s\n", print_buf); + //printk(KERN_ERR MODULE_NAME": some exception occurred, please check the data or refer to FAQ."); + break; + default: + hio_warn("%s\n", print_buf); + break; + } + +out: + return log_desc->level; +} + +static int ssd_bm_get_sfstatus(struct ssd_device *dev, uint16_t *status); +static int ssd_switch_wmode(struct ssd_device *dev, int wmode); + + +static int ssd_handle_event(struct ssd_device *dev, uint16_t event, int level) +{ + int ret = 0; + + switch (event) { + case SSD_LOG_OVER_TEMP: { +#ifdef SSD_OT_PROTECT + if (!test_and_set_bit(SSD_HWMON_TEMP(SSD_TEMP_CTRL), &dev->hwmon)) { + if (dev->protocol_info.ver > SSD_PROTOCOL_V3 && dev->protocol_info.ver < SSD_PROTOCOL_V3_2_2) { + hio_warn("%s: Over temperature, please check the fans.\n", dev->name); + dev->ot_delay = SSD_OT_DELAY; + } + } +#endif + break; + } + + case SSD_LOG_NORMAL_TEMP: { +#ifdef SSD_OT_PROTECT + /* need to check all controller's temperature */ + ssd_check_temperature(dev, SSD_OT_TEMP_HYST); +#endif + break; + } + + case SSD_LOG_BATTERY_FAULT: { + uint16_t sfstatus; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + if (!ssd_bm_get_sfstatus(dev, &sfstatus)) { + ssd_gen_swlog(dev, SSD_LOG_BM_SFSTATUS, sfstatus); + } + } + + if (!test_and_set_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + ssd_switch_wmode(dev, dev->user_wmode); + } + break; + } + + case SSD_LOG_BATTERY_OK: { + if (test_and_clear_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + ssd_switch_wmode(dev, dev->user_wmode); + } + break; + } + + case SSD_LOG_BOARD_VOLT_FAULT: { + ssd_mon_boardvolt(dev); + break; + } + + case SSD_LOG_CLEAR_LOG: { + /* update smart */ + memset(&dev->smart.log_info, 0, sizeof(struct ssd_log_info)); + break; + } + + case SSD_LOG_CAP_VOLT_FAULT: + case SSD_LOG_CAP_LEARN_FAULT: + case SSD_LOG_CAP_SHORT_CIRCUIT: { + if (!test_and_set_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + ssd_switch_wmode(dev, dev->user_wmode); + } + break; + } + + default: + break; + } + + /* ssd event call */ + if (dev->event_call) { + dev->event_call(dev->gd, event, level); + + /* FIXME */ + if (SSD_LOG_CAP_VOLT_FAULT == event || SSD_LOG_CAP_LEARN_FAULT == event || SSD_LOG_CAP_SHORT_CIRCUIT == event) { + dev->event_call(dev->gd, SSD_LOG_BATTERY_FAULT, level); + } + } + + return ret; +} + +static int ssd_save_log(struct ssd_device *dev, struct ssd_log *log) +{ + uint32_t off, size; + void *internal_log; + int ret = 0; + + mutex_lock(&dev->internal_log_mutex); + + size = sizeof(struct ssd_log); + off = dev->internal_log.nr_log * size; + + if (off == dev->rom_info.log_sz) { + if (dev->internal_log.nr_log == dev->smart.log_info.nr_log) { + hio_warn("%s: internal log is full\n", dev->name); + } + goto out; + } + + internal_log = dev->internal_log.log + off; + memcpy(internal_log, log, size); + + if (dev->protocol_info.ver > SSD_PROTOCOL_V3) { + off += dev->rom_info.log_base; + + ret = ssd_spi_write(dev, log, off, size); + if (ret) { + goto out; + } + } + + dev->internal_log.nr_log++; + +out: + mutex_unlock(&dev->internal_log_mutex); + return ret; +} + +static int ssd_save_swlog(struct ssd_device *dev, uint16_t event, uint32_t data) +{ + struct ssd_log log; + struct timeval tv; + int level; + int ret = 0; + + if (unlikely(mode != SSD_DRV_MODE_STANDARD)) + return 0; + + memset(&log, 0, sizeof(struct ssd_log)); + + do_gettimeofday(&tv); + log.ctrl_idx = SSD_LOG_SW_IDX; + log.time = tv.tv_sec; + log.le.event = event; + log.le.data.val = data; + + level = ssd_parse_log(dev, &log, 0); + if (level >= SSD_LOG_LEVEL) { + ret = ssd_save_log(dev, &log); + } + + /* set alarm */ + if (SSD_LOG_LEVEL_ERR == level) { + ssd_set_alarm(dev); + } + + /* update smart */ + dev->smart.log_info.nr_log++; + dev->smart.log_info.stat[level]++; + + /* handle event */ + ssd_handle_event(dev, event, level); + + return ret; +} + +static int ssd_gen_swlog(struct ssd_device *dev, uint16_t event, uint32_t data) +{ + struct ssd_log_entry le; + int ret; + + if (unlikely(mode != SSD_DRV_MODE_STANDARD)) + return 0; + + /* slave port ? */ + if (dev->slave) { + return 0; + } + + memset(&le, 0, sizeof(struct ssd_log_entry)); + le.event = event; + le.data.val = data; + + ret = sfifo_put(&dev->log_fifo, &le); + if (ret) { + return ret; + } + + if (test_bit(SSD_INIT_WORKQ, &dev->state)) { + queue_work(dev->workq, &dev->log_work); + } + + return 0; +} + +static int ssd_do_swlog(struct ssd_device *dev) +{ + struct ssd_log_entry le; + int ret = 0; + + memset(&le, 0, sizeof(struct ssd_log_entry)); + while (!sfifo_get(&dev->log_fifo, &le)) { + ret = ssd_save_swlog(dev, le.event, le.data.val); + if (ret) { + break; + } + } + + return ret; +} + +static int __ssd_clear_log(struct ssd_device *dev) +{ + uint32_t off, length; + int ret; + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + return 0; + } + + if (dev->internal_log.nr_log == 0) { + return 0; + } + + mutex_lock(&dev->internal_log_mutex); + + off = dev->rom_info.log_base; + length = dev->rom_info.log_sz; + + ret = ssd_spi_erase(dev, off, length); + if (ret) { + hio_warn("%s: log erase: failed\n", dev->name); + goto out; + } + + dev->internal_log.nr_log = 0; + +out: + mutex_unlock(&dev->internal_log_mutex); + return ret; +} + +static int ssd_clear_log(struct ssd_device *dev) +{ + int ret; + + ret = __ssd_clear_log(dev); + if(!ret) { + ssd_gen_swlog(dev, SSD_LOG_CLEAR_LOG, 0); + } + + return ret; +} + +static int ssd_do_log(struct ssd_device *dev, int ctrl_idx, void *buf) +{ + struct ssd_log_entry *le; + struct ssd_log log; + struct timeval tv; + int nr_log = 0; + int level; + int ret = 0; + + ret = ssd_read_log(dev, ctrl_idx, buf, &nr_log); + if (ret) { + return ret; + } + + do_gettimeofday(&tv); + + log.time = tv.tv_sec; + log.ctrl_idx = ctrl_idx; + + le = (ssd_log_entry_t *)buf; + while (nr_log > 0) { + memcpy(&log.le, le, sizeof(struct ssd_log_entry)); + + level = ssd_parse_log(dev, &log, 1); + if (level >= SSD_LOG_LEVEL) { + ssd_save_log(dev, &log); + } + + /* set alarm */ + if (SSD_LOG_LEVEL_ERR == level) { + ssd_set_alarm(dev); + } + + dev->smart.log_info.nr_log++; + if (SSD_LOG_SEU_FAULT != le->event && SSD_LOG_SEU_FAULT1 != le->event) { + dev->smart.log_info.stat[level]++; + } else { + /* SEU fault */ + + /* log to the volatile log info */ + dev->log_info.nr_log++; + dev->log_info.stat[level]++; + + /* do something */ + dev->reload_fw = 1; + ssd_reg32_write(dev->ctrlp + SSD_RELOAD_FW_REG, SSD_RELOAD_FLAG); + + /*dev->readonly = 1; + set_disk_ro(dev->gd, 1); + hio_warn("%s: switched to read-only mode.\n", dev->name);*/ + } + + /* handle event */ + ssd_handle_event(dev, le->event, level); + + le++; + nr_log--; + } + + return 0; +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) +static void ssd_log_worker(void *data) +{ + struct ssd_device *dev = (struct ssd_device *)data; +#else +static void ssd_log_worker(struct work_struct *work) +{ + struct ssd_device *dev = container_of(work, struct ssd_device, log_work); +#endif + int i; + int ret; + + if (!test_bit(SSD_LOG_ERR, &dev->state) && test_bit(SSD_ONLINE, &dev->state)) { + /* alloc log buf */ + if (!dev->log_buf) { + dev->log_buf = kmalloc(dev->hw_info.log_sz, GFP_KERNEL); + if (!dev->log_buf) { + hio_warn("%s: ssd_log_worker: no mem\n", dev->name); + return; + } + } + + /* get log */ + if (test_and_clear_bit(SSD_LOG_HW, &dev->state)) { + for (i=0; ihw_info.nr_ctrl; i++) { + ret = ssd_do_log(dev, i, dev->log_buf); + if (ret) { + (void)test_and_set_bit(SSD_LOG_ERR, &dev->state); + hio_warn("%s: do log fail\n", dev->name); + } + } + } + } + + ret = ssd_do_swlog(dev); + if (ret) { + hio_warn("%s: do swlog fail\n", dev->name); + } +} + +static void ssd_cleanup_log(struct ssd_device *dev) +{ + if (dev->log_buf) { + kfree(dev->log_buf); + dev->log_buf = NULL; + } + + sfifo_free(&dev->log_fifo); + + if (dev->internal_log.log) { + vfree(dev->internal_log.log); + dev->internal_log.log = NULL; + } +} + +static int ssd_init_log(struct ssd_device *dev) +{ + struct ssd_log *log; + uint32_t off, size; + uint32_t len = 0; + int ret = 0; + + mutex_init(&dev->internal_log_mutex); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) + INIT_WORK(&dev->log_work, ssd_log_worker, dev); +#else + INIT_WORK(&dev->log_work, ssd_log_worker); +#endif + + off = dev->rom_info.log_base; + size = dev->rom_info.log_sz; + + dev->internal_log.log = vmalloc(size); + if (!dev->internal_log.log) { + ret = -ENOMEM; + goto out_alloc_log; + } + + ret = sfifo_alloc(&dev->log_fifo, SSD_LOG_FIFO_SZ, sizeof(struct ssd_log_entry)); + if (ret < 0) { + goto out_alloc_log_fifo; + } + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + return 0; + } + + log = (struct ssd_log *)dev->internal_log.log; + while (len < size) { + ret = ssd_spi_read(dev, log, off, sizeof(struct ssd_log)); + if (ret) { + goto out_read_log; + } + + if (log->ctrl_idx == 0xff) { + break; + } + + dev->internal_log.nr_log++; + log++; + len += sizeof(struct ssd_log); + off += sizeof(struct ssd_log); + } + + return 0; + +out_read_log: + sfifo_free(&dev->log_fifo); +out_alloc_log_fifo: + vfree(dev->internal_log.log); + dev->internal_log.log = NULL; + dev->internal_log.nr_log = 0; +out_alloc_log: + /* skip error if not in standard mode */ + if (mode != SSD_DRV_MODE_STANDARD) { + ret = 0; + } + return ret; +} + +/* work queue */ +static void ssd_stop_workq(struct ssd_device *dev) +{ + test_and_clear_bit(SSD_INIT_WORKQ, &dev->state); + flush_workqueue(dev->workq); +} + +static void ssd_start_workq(struct ssd_device *dev) +{ + (void)test_and_set_bit(SSD_INIT_WORKQ, &dev->state); + + /* log ? */ + queue_work(dev->workq, &dev->log_work); +} + +static void ssd_cleanup_workq(struct ssd_device *dev) +{ + flush_workqueue(dev->workq); + destroy_workqueue(dev->workq); + dev->workq = NULL; +} + +static int ssd_init_workq(struct ssd_device *dev) +{ + int ret = 0; + + dev->workq = create_singlethread_workqueue(dev->name); + if (!dev->workq) { + ret = -ESRCH; + goto out; + } + +out: + return ret; +} + +/* rom */ +static int ssd_init_rom_info(struct ssd_device *dev) +{ + uint32_t val; + + mutex_init(&dev->spi_mutex); + mutex_init(&dev->i2c_mutex); + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + /* fix bug: read data to clear status */ + (void)ssd_reg32_read(dev->ctrlp + SSD_SPI_REG_RDATA); + + dev->rom_info.size = SSD_ROM_SIZE; + dev->rom_info.block_size = SSD_ROM_BLK_SIZE; + dev->rom_info.page_size = SSD_ROM_PAGE_SIZE; + + dev->rom_info.bridge_fw_base = SSD_ROM_BRIDGE_FW_BASE; + dev->rom_info.bridge_fw_sz = SSD_ROM_BRIDGE_FW_SIZE; + dev->rom_info.nr_bridge_fw = SSD_ROM_NR_BRIDGE_FW; + + dev->rom_info.ctrl_fw_base = SSD_ROM_CTRL_FW_BASE; + dev->rom_info.ctrl_fw_sz = SSD_ROM_CTRL_FW_SIZE; + dev->rom_info.nr_ctrl_fw = SSD_ROM_NR_CTRL_FW; + + dev->rom_info.log_sz = SSD_ROM_LOG_SZ; + + dev->rom_info.vp_base = SSD_ROM_VP_BASE; + dev->rom_info.label_base = SSD_ROM_LABEL_BASE; + } else if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + val = ssd_reg32_read(dev->ctrlp + SSD_ROM_INFO_REG); + dev->rom_info.size = 0x100000 * (1U << (val & 0xFF)); + dev->rom_info.block_size = 0x10000 * (1U << ((val>>8) & 0xFF)); + dev->rom_info.page_size = (val>>16) & 0xFFFF; + + val = ssd_reg32_read(dev->ctrlp + SSD_ROM_BRIDGE_FW_INFO_REG); + dev->rom_info.bridge_fw_base = dev->rom_info.block_size * (val & 0xFFFF); + dev->rom_info.bridge_fw_sz = dev->rom_info.block_size * ((val>>16) & 0x3FFF); + dev->rom_info.nr_bridge_fw = ((val >> 30) & 0x3) + 1; + + val = ssd_reg32_read(dev->ctrlp + SSD_ROM_CTRL_FW_INFO_REG); + dev->rom_info.ctrl_fw_base = dev->rom_info.block_size * (val & 0xFFFF); + dev->rom_info.ctrl_fw_sz = dev->rom_info.block_size * ((val>>16) & 0x3FFF); + dev->rom_info.nr_ctrl_fw = ((val >> 30) & 0x3) + 1; + + dev->rom_info.bm_fw_base = dev->rom_info.ctrl_fw_base + (dev->rom_info.nr_ctrl_fw * dev->rom_info.ctrl_fw_sz); + dev->rom_info.bm_fw_sz = SSD_PV3_ROM_BM_FW_SZ; + dev->rom_info.nr_bm_fw = SSD_PV3_ROM_NR_BM_FW; + + dev->rom_info.log_base = dev->rom_info.bm_fw_base + (dev->rom_info.nr_bm_fw * dev->rom_info.bm_fw_sz); + dev->rom_info.log_sz = SSD_ROM_LOG_SZ; + + dev->rom_info.smart_base = dev->rom_info.log_base + dev->rom_info.log_sz; + dev->rom_info.smart_sz = SSD_PV3_ROM_SMART_SZ; + dev->rom_info.nr_smart = SSD_PV3_ROM_NR_SMART; + + val = ssd_reg32_read(dev->ctrlp + SSD_ROM_VP_INFO_REG); + dev->rom_info.vp_base = dev->rom_info.block_size * val; + dev->rom_info.label_base = dev->rom_info.vp_base + dev->rom_info.block_size; + if (dev->rom_info.label_base >= dev->rom_info.size) { + dev->rom_info.label_base = dev->rom_info.vp_base - dev->rom_info.block_size; + } + } else { + val = ssd_reg32_read(dev->ctrlp + SSD_ROM_INFO_REG); + dev->rom_info.size = 0x100000 * (1U << (val & 0xFF)); + dev->rom_info.block_size = 0x10000 * (1U << ((val>>8) & 0xFF)); + dev->rom_info.page_size = (val>>16) & 0xFFFF; + + val = ssd_reg32_read(dev->ctrlp + SSD_ROM_BRIDGE_FW_INFO_REG); + dev->rom_info.bridge_fw_base = dev->rom_info.block_size * (val & 0xFFFF); + dev->rom_info.bridge_fw_sz = dev->rom_info.block_size * ((val>>16) & 0x3FFF); + dev->rom_info.nr_bridge_fw = ((val >> 30) & 0x3) + 1; + + val = ssd_reg32_read(dev->ctrlp + SSD_ROM_CTRL_FW_INFO_REG); + dev->rom_info.ctrl_fw_base = dev->rom_info.block_size * (val & 0xFFFF); + dev->rom_info.ctrl_fw_sz = dev->rom_info.block_size * ((val>>16) & 0x3FFF); + dev->rom_info.nr_ctrl_fw = ((val >> 30) & 0x3) + 1; + + val = ssd_reg32_read(dev->ctrlp + SSD_ROM_VP_INFO_REG); + dev->rom_info.vp_base = dev->rom_info.block_size * val; + dev->rom_info.label_base = dev->rom_info.vp_base - SSD_PV3_2_ROM_SEC_SZ; + + dev->rom_info.nr_smart = SSD_PV3_ROM_NR_SMART; + dev->rom_info.smart_sz = SSD_PV3_2_ROM_SEC_SZ; + dev->rom_info.smart_base = dev->rom_info.label_base - (dev->rom_info.smart_sz * dev->rom_info.nr_smart); + if (dev->rom_info.smart_sz > dev->rom_info.block_size) { + dev->rom_info.smart_sz = dev->rom_info.block_size; + } + + dev->rom_info.log_sz = SSD_PV3_2_ROM_LOG_SZ; + dev->rom_info.log_base = dev->rom_info.smart_base - dev->rom_info.log_sz; + } + + return ssd_init_spi(dev); +} + +/* smart */ +static int ssd_update_smart(struct ssd_device *dev, struct ssd_smart *smart) +{ + struct timeval tv; + uint64_t run_time; +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) + struct hd_struct *part; + int cpu; +#endif + int i, j; + int ret = 0; + + if (!test_bit(SSD_INIT_BD, &dev->state)) { + return 0; + } + + do_gettimeofday(&tv); + if ((uint64_t)tv.tv_sec < dev->uptime) { + run_time = 0; + } else { + run_time = tv.tv_sec - dev->uptime; + } + + /* avoid frequently update */ + if (run_time >= 60) { + ret = 1; + } + + /* io stat */ + smart->io_stat.run_time += run_time; + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,27)) + cpu = part_stat_lock(); + part = &dev->gd->part0; + part_round_stats(cpu, part); + part_stat_unlock(); + + smart->io_stat.nr_read += part_stat_read(part, ios[READ]); + smart->io_stat.nr_write += part_stat_read(part, ios[WRITE]); + smart->io_stat.rsectors += part_stat_read(part, sectors[READ]); + smart->io_stat.wsectors += part_stat_read(part, sectors[WRITE]); +#elif (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,14)) + preempt_disable(); + disk_round_stats(dev->gd); + preempt_enable(); + + smart->io_stat.nr_read += disk_stat_read(dev->gd, ios[READ]); + smart->io_stat.nr_write += disk_stat_read(dev->gd, ios[WRITE]); + smart->io_stat.rsectors += disk_stat_read(dev->gd, sectors[READ]); + smart->io_stat.wsectors += disk_stat_read(dev->gd, sectors[WRITE]); +#else + preempt_disable(); + disk_round_stats(dev->gd); + preempt_enable(); + + smart->io_stat.nr_read += disk_stat_read(dev->gd, reads); + smart->io_stat.nr_write += disk_stat_read(dev->gd, writes); + smart->io_stat.rsectors += disk_stat_read(dev->gd, read_sectors); + smart->io_stat.wsectors += disk_stat_read(dev->gd, write_sectors); +#endif + + smart->io_stat.nr_to += atomic_read(&dev->tocnt); + + for (i=0; inr_queue; i++) { + smart->io_stat.nr_rwerr += dev->queue[i].io_stat.nr_rwerr; + smart->io_stat.nr_ioerr += dev->queue[i].io_stat.nr_ioerr; + } + + for (i=0; inr_queue; i++) { + for (j=0; jecc_info.bitflip[j] += dev->queue[i].ecc_info.bitflip[j]; + } + } + + //dev->uptime = tv.tv_sec; + + return ret; +} + +static int ssd_clear_smart(struct ssd_device *dev) +{ + struct timeval tv; + uint64_t sversion; + uint32_t off, length; + int i; + int ret; + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + return 0; + } + + /* clear smart */ + off = dev->rom_info.smart_base; + length = dev->rom_info.smart_sz * dev->rom_info.nr_smart; + + ret = ssd_spi_erase(dev, off, length); + if (ret) { + hio_warn("%s: info erase: failed\n", dev->name); + goto out; + } + + sversion = dev->smart.version; + + memset(&dev->smart, 0, sizeof(struct ssd_smart)); + dev->smart.version = sversion + 1; + dev->smart.magic = SSD_SMART_MAGIC; + + /* clear all tmp acc */ + for (i=0; inr_queue; i++) { + memset(&(dev->queue[i].io_stat), 0, sizeof(struct ssd_io_stat)); + memset(&(dev->queue[i].ecc_info), 0, sizeof(struct ssd_ecc_info)); + } + + atomic_set(&dev->tocnt, 0); + + /* clear tmp log info */ + memset(&dev->log_info, 0, sizeof(struct ssd_log_info)); + + do_gettimeofday(&tv); + dev->uptime = tv.tv_sec; + + /* clear alarm ? */ + //ssd_clear_alarm(dev); +out: + return ret; +} + +static int ssd_save_smart(struct ssd_device *dev) +{ + uint32_t off, size; + int i; + int ret = 0; + + if (unlikely(mode != SSD_DRV_MODE_STANDARD)) + return 0; + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + return 0; + } + + if (!ssd_update_smart(dev, &dev->smart)) { + return 0; + } + + dev->smart.version++; + + for (i=0; irom_info.nr_smart; i++) { + off = dev->rom_info.smart_base + (dev->rom_info.smart_sz * i); + size = dev->rom_info.smart_sz; + + ret = ssd_spi_erase(dev, off, size); + if (ret) { + hio_warn("%s: info erase failed\n", dev->name); + goto out; + } + + size = sizeof(struct ssd_smart); + + ret = ssd_spi_write(dev, &dev->smart, off, size); + if (ret) { + hio_warn("%s: info write failed\n", dev->name); + goto out; + } + + //xx + } + +out: + return ret; +} + +static int ssd_init_smart(struct ssd_device *dev) +{ + struct ssd_smart *smart; + struct timeval tv; + uint32_t off, size; + int i; + int ret = 0; + + do_gettimeofday(&tv); + dev->uptime = tv.tv_sec; + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + return 0; + } + + smart = kmalloc(sizeof(struct ssd_smart) * SSD_ROM_NR_SMART_MAX, GFP_KERNEL); + if (!smart) { + ret = -ENOMEM; + goto out_nomem; + } + + memset(&dev->smart, 0, sizeof(struct ssd_smart)); + + /* read smart */ + for (i=0; irom_info.nr_smart; i++) { + memset(&smart[i], 0, sizeof(struct ssd_smart)); + + off = dev->rom_info.smart_base + (dev->rom_info.smart_sz * i); + size = sizeof(struct ssd_smart); + + ret = ssd_spi_read(dev, &smart[i], off, size); + if (ret) { + hio_warn("%s: info read failed\n", dev->name); + goto out; + } + + if (smart[i].magic != SSD_SMART_MAGIC) { + smart[i].magic = 0; + smart[i].version = 0; + continue; + } + + if (smart[i].version > dev->smart.version) { + memcpy(&dev->smart, &smart[i], sizeof(struct ssd_smart)); + } + } + + if (dev->smart.magic != SSD_SMART_MAGIC) { + /* first time power up */ + dev->smart.magic = SSD_SMART_MAGIC; + dev->smart.version = 1; + } + + /* check log info */ + { + struct ssd_log_info log_info; + struct ssd_log *log = (struct ssd_log *)dev->internal_log.log; + + memset(&log_info, 0, sizeof(struct ssd_log_info)); + + while (log_info.nr_log < dev->internal_log.nr_log) { + /* skip the volatile log info */ + if (SSD_LOG_SEU_FAULT != log->le.event && SSD_LOG_SEU_FAULT1 != log->le.event) { + log_info.stat[ssd_parse_log(dev, log, 0)]++; + } + + log_info.nr_log++; + log++; + } + + /* check */ + for (i=(SSD_LOG_NR_LEVEL-1); i>=0; i--) { + if (log_info.stat[i] > dev->smart.log_info.stat[i]) { + /* unclean */ + memcpy(&dev->smart.log_info, &log_info, sizeof(struct ssd_log_info)); + dev->smart.version++; + break; + } + } + } + + for (i=0; irom_info.nr_smart; i++) { + if (smart[i].magic == SSD_SMART_MAGIC && smart[i].version == dev->smart.version) { + continue; + } + + off = dev->rom_info.smart_base + (dev->rom_info.smart_sz * i); + size = dev->rom_info.smart_sz; + + ret = ssd_spi_erase(dev, off, size); + if (ret) { + hio_warn("%s: info erase failed\n", dev->name); + goto out; + } + + size = sizeof(struct ssd_smart); + ret = ssd_spi_write(dev, &dev->smart, off, size); + if (ret) { + hio_warn("%s: info write failed\n", dev->name); + goto out; + } + + //xx + } + + /* sync smart with alarm led */ + if (dev->smart.io_stat.nr_to || dev->smart.io_stat.nr_rwerr || dev->smart.log_info.stat[SSD_LOG_LEVEL_ERR]) { + hio_warn("%s: some fault found in the history info\n", dev->name); + ssd_set_alarm(dev); + } + +out: + kfree(smart); +out_nomem: + /* skip error if not in standard mode */ + if (mode != SSD_DRV_MODE_STANDARD) { + ret = 0; + } + return ret; +} + +/* bm */ +static int __ssd_bm_get_version(struct ssd_device *dev, uint16_t *ver) +{ + struct ssd_bm_manufacturer_data bm_md = {0}; + uint16_t sc_id = SSD_BM_SYSTEM_DATA_SUBCLASS_ID; + uint8_t cmd; + int ret = 0; + + if (!dev || !ver) { + return -EINVAL; + } + + mutex_lock(&dev->bm_mutex); + + cmd = SSD_BM_DATA_FLASH_SUBCLASS_ID; + ret = ssd_smbus_write_word(dev, SSD_BM_SLAVE_ADDRESS, cmd, (uint8_t *)&sc_id); + if (ret) { + goto out; + } + + cmd = SSD_BM_DATA_FLASH_SUBCLASS_ID_PAGE1; + ret = ssd_smbus_read_block(dev, SSD_BM_SLAVE_ADDRESS, cmd, sizeof(struct ssd_bm_manufacturer_data), (uint8_t *)&bm_md); + if (ret) { + goto out; + } + + if (bm_md.firmware_ver & 0xF000) { + ret = -EIO; + goto out; + } + + *ver = bm_md.firmware_ver; + +out: + mutex_unlock(&dev->bm_mutex); + return ret; +} + +static int ssd_bm_get_version(struct ssd_device *dev, uint16_t *ver) +{ + uint16_t tmp = 0; + int i = SSD_BM_RETRY_MAX; + int ret = 0; + + while (i-- > 0) { + ret = __ssd_bm_get_version(dev, &tmp); + if (!ret) { + break; + } + } + if (ret) { + return ret; + } + + *ver = tmp; + + return 0; +} + +static int __ssd_bm_nr_cap(struct ssd_device *dev, int *nr_cap) +{ + struct ssd_bm_configuration_registers bm_cr; + uint16_t sc_id = SSD_BM_CONFIGURATION_REGISTERS_ID; + uint8_t cmd; + int ret; + + mutex_lock(&dev->bm_mutex); + + cmd = SSD_BM_DATA_FLASH_SUBCLASS_ID; + ret = ssd_smbus_write_word(dev, SSD_BM_SLAVE_ADDRESS, cmd, (uint8_t *)&sc_id); + if (ret) { + goto out; + } + + cmd = SSD_BM_DATA_FLASH_SUBCLASS_ID_PAGE1; + ret = ssd_smbus_read_block(dev, SSD_BM_SLAVE_ADDRESS, cmd, sizeof(struct ssd_bm_configuration_registers), (uint8_t *)&bm_cr); + if (ret) { + goto out; + } + + if (bm_cr.operation_cfg.cc == 0 || bm_cr.operation_cfg.cc > 4) { + ret = -EIO; + goto out; + } + + *nr_cap = bm_cr.operation_cfg.cc + 1; + +out: + mutex_unlock(&dev->bm_mutex); + return ret; +} + +static int ssd_bm_nr_cap(struct ssd_device *dev, int *nr_cap) +{ + int tmp = 0; + int i = SSD_BM_RETRY_MAX; + int ret = 0; + + while (i-- > 0) { + ret = __ssd_bm_nr_cap(dev, &tmp); + if (!ret) { + break; + } + } + if (ret) { + return ret; + } + + *nr_cap = tmp; + + return 0; +} + +static int ssd_bm_enter_cap_learning(struct ssd_device *dev) +{ + uint16_t buf = SSD_BM_ENTER_CAP_LEARNING; + uint8_t cmd = SSD_BM_MANUFACTURERACCESS; + int ret; + + ret = ssd_smbus_write_word(dev, SSD_BM_SLAVE_ADDRESS, cmd, (uint8_t *)&buf); + if (ret) { + goto out; + } + +out: + return ret; +} + +static int ssd_bm_get_sfstatus(struct ssd_device *dev, uint16_t *status) +{ + uint16_t val = 0; + uint8_t cmd = SSD_BM_SAFETYSTATUS; + int ret; + + ret = ssd_smbus_read_word(dev, SSD_BM_SLAVE_ADDRESS, cmd, (uint8_t *)&val); + if (ret) { + goto out; + } + + *status = val; +out: + return ret; +} + +static int ssd_bm_get_opstatus(struct ssd_device *dev, uint16_t *status) +{ + uint16_t val = 0; + uint8_t cmd = SSD_BM_OPERATIONSTATUS; + int ret; + + ret = ssd_smbus_read_word(dev, SSD_BM_SLAVE_ADDRESS, cmd, (uint8_t *)&val); + if (ret) { + goto out; + } + + *status = val; +out: + return ret; +} + +static int ssd_get_bmstruct(struct ssd_device *dev, struct ssd_bm *bm_status_out) +{ + struct sbs_cmd *bm_sbs = ssd_bm_sbs; + struct ssd_bm bm_status; + uint8_t buf[2] = {0, }; + uint16_t val = 0; + uint16_t cval; + int ret = 0; + + memset(&bm_status, 0, sizeof(struct ssd_bm)); + + while (bm_sbs->desc != NULL) { + switch (bm_sbs->size) { + case SBS_SIZE_BYTE: + ret = ssd_smbus_read_byte(dev, SSD_BM_SLAVE_ADDRESS, bm_sbs->cmd, buf); + if (ret) { + //printf("Error: smbus read byte %#x\n", bm_sbs->cmd); + goto out; + } + val = buf[0]; + break; + case SBS_SIZE_WORD: + ret = ssd_smbus_read_word(dev, SSD_BM_SLAVE_ADDRESS, bm_sbs->cmd, (uint8_t *)&val); + if (ret) { + //printf("Error: smbus read word %#x\n", bm_sbs->cmd); + goto out; + } + //val = *(uint16_t *)buf; + break; + default: + ret = -1; + goto out; + break; + } + + switch (bm_sbs->unit) { + case SBS_UNIT_VALUE: + *(uint16_t *)bm_var(&bm_status, bm_sbs->off) = val & bm_sbs->mask; + break; + case SBS_UNIT_TEMPERATURE: + cval = (uint16_t)(val - 2731) / 10; + *(uint16_t *)bm_var(&bm_status, bm_sbs->off) = cval; + break; + case SBS_UNIT_VOLTAGE: + *(uint16_t *)bm_var(&bm_status, bm_sbs->off) = val; + break; + case SBS_UNIT_CURRENT: + *(uint16_t *)bm_var(&bm_status, bm_sbs->off) = val; + break; + case SBS_UNIT_ESR: + *(uint16_t *)bm_var(&bm_status, bm_sbs->off) = val; + break; + case SBS_UNIT_PERCENT: + *(uint16_t *)bm_var(&bm_status, bm_sbs->off) = val; + break; + case SBS_UNIT_CAPACITANCE: + *(uint16_t *)bm_var(&bm_status, bm_sbs->off) = val; + break; + default: + ret = -1; + goto out; + break; + } + + bm_sbs++; + } + + memcpy(bm_status_out, &bm_status, sizeof(struct ssd_bm)); + +out: + return ret; +} + +static int __ssd_bm_status(struct ssd_device *dev, int *status) +{ + struct ssd_bm bm_status = {0}; + int nr_cap = 0; + int i; + int ret = 0; + + ret = ssd_get_bmstruct(dev, &bm_status); + if (ret) { + goto out; + } + + /* capacitor voltage */ + ret = ssd_bm_nr_cap(dev, &nr_cap); + if (ret) { + goto out; + } + + for (i=0; i> 12) & 0x1)) { + *status = SSD_BMSTATUS_CHARGING; + }else{ + *status = SSD_BMSTATUS_OK; + } + +out: + return ret; +} + +static void ssd_set_flush_timeout(struct ssd_device *dev, int mode); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) +static void ssd_bm_worker(void *data) +{ + struct ssd_device *dev = (struct ssd_device *)data; +#else +static void ssd_bm_worker(struct work_struct *work) +{ + struct ssd_device *dev = container_of(work, struct ssd_device, bm_work); +#endif + + uint16_t opstatus; + int ret = 0; + + if (mode != SSD_DRV_MODE_STANDARD) { + return; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_1_1) { + return; + } + + if (dev->hw_info_ext.plp_type != SSD_PLP_SCAP) { + return; + } + + ret = ssd_bm_get_opstatus(dev, &opstatus); + if (ret) { + hio_warn("%s: get bm operationstatus failed\n", dev->name); + return; + } + + /* need cap learning ? */ + if (!(opstatus & 0xF0)) { + ret = ssd_bm_enter_cap_learning(dev); + if (ret) { + hio_warn("%s: enter capacitance learning failed\n", dev->name); + return; + } + } +} + +static void ssd_bm_routine_start(void *data) +{ + struct ssd_device *dev; + + if (!data) { + return; + } + dev = data; + + if (test_bit(SSD_INIT_WORKQ, &dev->state)) { + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + queue_work(dev->workq, &dev->bm_work); + } else { + queue_work(dev->workq, &dev->capmon_work); + } + } +} + +/* CAP */ +static int ssd_do_cap_learn(struct ssd_device *dev, uint32_t *cap) +{ + uint32_t u1, u2, t; + uint16_t val = 0; + int wait = 0; + int ret = 0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + *cap = 0; + return 0; + } + + if (dev->hw_info_ext.form_factor == SSD_FORM_FACTOR_FHHL && dev->hw_info.pcb_ver < 'B') { + *cap = 0; + return 0; + } + + /* make sure the lm80 voltage value is updated */ + msleep(SSD_LM80_CONV_INTERVAL); + + /* check if full charged */ + wait = 0; + for (;;) { + ret = ssd_smbus_read_word(dev, SSD_SENSOR_LM80_SADDRESS, SSD_PL_CAP_U1, (uint8_t *)&val); + if (ret) { + if (!test_and_set_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM80), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_SENSOR_FAULT, SSD_SENSOR_LM80_SADDRESS); + } + goto out; + } + u1 = SSD_LM80_CONVERT_VOLT(u16_swap(val)); + if (SSD_PL_CAP_VOLT(u1) >= SSD_PL_CAP_VOLT_FULL) { + break; + } + + wait++; + if (wait > SSD_PL_CAP_CHARGE_MAX_WAIT) { + ret = -ETIMEDOUT; + goto out; + } + msleep(SSD_PL_CAP_CHARGE_WAIT); + } + + ret = ssd_smbus_read_word(dev, SSD_SENSOR_LM80_SADDRESS, SSD_PL_CAP_U2, (uint8_t *)&val); + if (ret) { + if (!test_and_set_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM80), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_SENSOR_FAULT, SSD_SENSOR_LM80_SADDRESS); + } + goto out; + } + u2 = SSD_LM80_CONVERT_VOLT(u16_swap(val)); + + if (u1 == u2) { + ret = -EINVAL; + goto out; + } + + /* enter cap learn */ + ssd_reg32_write(dev->ctrlp + SSD_PL_CAP_LEARN_REG, 0x1); + + wait = 0; + for (;;) { + msleep(SSD_PL_CAP_LEARN_WAIT); + + t = ssd_reg32_read(dev->ctrlp + SSD_PL_CAP_LEARN_REG); + if (!((t >> 1) & 0x1)) { + break; + } + + wait++; + if (wait > SSD_PL_CAP_LEARN_MAX_WAIT) { + ret = -ETIMEDOUT; + goto out; + } + } + + if ((t >> 4) & 0x1) { + ret = -ETIMEDOUT; + goto out; + } + + t = (t >> 8); + if (0 == t) { + ret = -EINVAL; + goto out; + } + + *cap = SSD_PL_CAP_LEARN(u1, u2, t); + +out: + return ret; +} + +static int ssd_cap_learn(struct ssd_device *dev, uint32_t *cap) +{ + int ret = 0; + + if (!dev || !cap) { + return -EINVAL; + } + + mutex_lock(&dev->bm_mutex); + + ssd_stop_workq(dev); + + ret = ssd_do_cap_learn(dev, cap); + if (ret) { + ssd_gen_swlog(dev, SSD_LOG_CAP_LEARN_FAULT, 0); + goto out; + } + + ssd_gen_swlog(dev, SSD_LOG_CAP_STATUS, *cap); + +out: + ssd_start_workq(dev); + mutex_unlock(&dev->bm_mutex); + + return ret; +} + +static int ssd_check_pl_cap(struct ssd_device *dev) +{ + uint32_t u1; + uint16_t val = 0; + uint8_t low = 0; + int wait = 0; + int ret = 0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + return 0; + } + + if (dev->hw_info_ext.form_factor == SSD_FORM_FACTOR_FHHL && dev->hw_info.pcb_ver < 'B') { + return 0; + } + + /* cap ready ? */ + wait = 0; + for (;;) { + ret = ssd_smbus_read_word(dev, SSD_SENSOR_LM80_SADDRESS, SSD_PL_CAP_U1, (uint8_t *)&val); + if (ret) { + if (!test_and_set_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM80), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_SENSOR_FAULT, SSD_SENSOR_LM80_SADDRESS); + } + goto out; + } + u1 = SSD_LM80_CONVERT_VOLT(u16_swap(val)); + if (SSD_PL_CAP_VOLT(u1) >= SSD_PL_CAP_VOLT_READY) { + break; + } + + wait++; + if (wait > SSD_PL_CAP_CHARGE_MAX_WAIT) { + ret = -ETIMEDOUT; + ssd_gen_swlog(dev, SSD_LOG_CAP_VOLT_FAULT, SSD_PL_CAP_VOLT(u1)); + goto out; + } + msleep(SSD_PL_CAP_CHARGE_WAIT); + } + + low = ssd_lm80_limit[SSD_LM80_IN_CAP].low; + ret = ssd_smbus_write_byte(dev, SSD_SENSOR_LM80_SADDRESS, SSD_LM80_REG_IN_MIN(SSD_LM80_IN_CAP), &low); + if (ret) { + goto out; + } + + /* enable cap INx */ + ret = ssd_lm80_enable_in(dev, SSD_SENSOR_LM80_SADDRESS, SSD_LM80_IN_CAP); + if (ret) { + if (!test_and_set_bit(SSD_HWMON_SENSOR(SSD_SENSOR_LM80), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_SENSOR_FAULT, SSD_SENSOR_LM80_SADDRESS); + } + goto out; + } + +out: + /* skip error if not in standard mode */ + if (mode != SSD_DRV_MODE_STANDARD) { + ret = 0; + } + return ret; +} + +static int ssd_check_pl_cap_fast(struct ssd_device *dev) +{ + uint32_t u1; + uint16_t val = 0; + int ret = 0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + return 0; + } + + if (dev->hw_info_ext.form_factor == SSD_FORM_FACTOR_FHHL && dev->hw_info.pcb_ver < 'B') { + return 0; + } + + /* cap ready ? */ + ret = ssd_smbus_read_word(dev, SSD_SENSOR_LM80_SADDRESS, SSD_PL_CAP_U1, (uint8_t *)&val); + if (ret) { + goto out; + } + u1 = SSD_LM80_CONVERT_VOLT(u16_swap(val)); + if (SSD_PL_CAP_VOLT(u1) < SSD_PL_CAP_VOLT_READY) { + ret = 1; + } + +out: + return ret; +} + +static int ssd_init_pl_cap(struct ssd_device *dev) +{ + int ret = 0; + + /* set here: user write mode */ + dev->user_wmode = wmode; + + mutex_init(&dev->bm_mutex); + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + uint32_t val; + val = ssd_reg32_read(dev->ctrlp + SSD_BM_FAULT_REG); + if ((val >> 1) & 0x1) { + (void)test_and_set_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon); + } + } else { + ret = ssd_check_pl_cap(dev); + if (ret) { + (void)test_and_set_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon); + } + } + + return 0; +} + +/* label */ +static void __end_str(char *str, int len) +{ + int i; + + for(i=0; irom_info.label_base; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + size = sizeof(struct ssd_label); + + /* read label */ + ret = ssd_spi_read(dev, &dev->label, off, size); + if (ret) { + memset(&dev->label, 0, size); + goto out; + } + + __end_str(dev->label.date, SSD_LABEL_FIELD_SZ); + __end_str(dev->label.sn, SSD_LABEL_FIELD_SZ); + __end_str(dev->label.part, SSD_LABEL_FIELD_SZ); + __end_str(dev->label.desc, SSD_LABEL_FIELD_SZ); + __end_str(dev->label.other, SSD_LABEL_FIELD_SZ); + __end_str(dev->label.maf, SSD_LABEL_FIELD_SZ); + } else { + size = sizeof(struct ssd_labelv3); + + /* read label */ + ret = ssd_spi_read(dev, &dev->labelv3, off, size); + if (ret) { + memset(&dev->labelv3, 0, size); + goto out; + } + + __end_str(dev->labelv3.boardtype, SSD_LABEL_FIELD_SZ); + __end_str(dev->labelv3.barcode, SSD_LABEL_FIELD_SZ); + __end_str(dev->labelv3.item, SSD_LABEL_FIELD_SZ); + __end_str(dev->labelv3.description, SSD_LABEL_DESC_SZ); + __end_str(dev->labelv3.manufactured, SSD_LABEL_FIELD_SZ); + __end_str(dev->labelv3.vendorname, SSD_LABEL_FIELD_SZ); + __end_str(dev->labelv3.issuenumber, SSD_LABEL_FIELD_SZ); + __end_str(dev->labelv3.cleicode, SSD_LABEL_FIELD_SZ); + __end_str(dev->labelv3.bom, SSD_LABEL_FIELD_SZ); + } + +out: + /* skip error if not in standard mode */ + if (mode != SSD_DRV_MODE_STANDARD) { + ret = 0; + } + return ret; +} + +int ssd_get_label(struct block_device *bdev, struct ssd_label *label) +{ + struct ssd_device *dev; + + if (!bdev || !label || !(bdev->bd_disk)) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + memset(label, 0, sizeof(struct ssd_label)); + memcpy(label->date, dev->labelv3.manufactured, SSD_LABEL_FIELD_SZ); + memcpy(label->sn, dev->labelv3.barcode, SSD_LABEL_FIELD_SZ); + memcpy(label->desc, dev->labelv3.boardtype, SSD_LABEL_FIELD_SZ); + memcpy(label->maf, dev->labelv3.vendorname, SSD_LABEL_FIELD_SZ); + } else { + memcpy(label, &dev->label, sizeof(struct ssd_label)); + } + + return 0; +} + +static int __ssd_get_version(struct ssd_device *dev, struct ssd_version_info *ver) +{ + uint16_t bm_ver = 0; + int ret = 0; + + if (dev->protocol_info.ver > SSD_PROTOCOL_V3 && dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + ret = ssd_bm_get_version(dev, &bm_ver); + if(ret){ + goto out; + } + } + + ver->bridge_ver = dev->hw_info.bridge_ver; + ver->ctrl_ver = dev->hw_info.ctrl_ver; + ver->bm_ver = bm_ver; + ver->pcb_ver = dev->hw_info.pcb_ver; + ver->upper_pcb_ver = dev->hw_info.upper_pcb_ver; + +out: + return ret; + +} + +int ssd_get_version(struct block_device *bdev, struct ssd_version_info *ver) +{ + struct ssd_device *dev; + int ret; + + if (!bdev || !ver || !(bdev->bd_disk)) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + + mutex_lock(&dev->fw_mutex); + ret = __ssd_get_version(dev, ver); + mutex_unlock(&dev->fw_mutex); + + return ret; +} + +static int __ssd_get_temperature(struct ssd_device *dev, int *temp) +{ + uint64_t val; + uint32_t off; + int max = -300; + int cur; + int i; + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + *temp = 0; + return 0; + } + + if (finject) { + if (dev->db_info.type == SSD_DEBUG_LOG && + (dev->db_info.data.log.event == SSD_LOG_OVER_TEMP || + dev->db_info.data.log.event == SSD_LOG_NORMAL_TEMP || + dev->db_info.data.log.event == SSD_LOG_WARN_TEMP)) { + *temp = (int)dev->db_info.data.log.extra; + return 0; + } + } + + for (i=0; ihw_info.nr_ctrl; i++) { + off = SSD_CTRL_TEMP_REG0 + i * sizeof(uint64_t); + + val = ssd_reg_read(dev->ctrlp + off); + if (val == 0xffffffffffffffffull) { + continue; + } + + cur = (int)CUR_TEMP(val); + if (cur >= max) { + max = cur; + } + } + + *temp = max; + + return 0; +} + +int ssd_get_temperature(struct block_device *bdev, int *temp) +{ + struct ssd_device *dev; + int ret; + + if (!bdev || !temp || !(bdev->bd_disk)) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + + + mutex_lock(&dev->fw_mutex); + ret = __ssd_get_temperature(dev, temp); + mutex_unlock(&dev->fw_mutex); + + return ret; +} + +int ssd_set_otprotect(struct block_device *bdev, int otprotect) + { + struct ssd_device *dev; + + if (!bdev || !(bdev->bd_disk)) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + ssd_set_ot_protect(dev, !!otprotect); + + return 0; + } + +int ssd_bm_status(struct block_device *bdev, int *status) +{ + struct ssd_device *dev; + int ret = 0; + + if (!bdev || !status || !(bdev->bd_disk)) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + + mutex_lock(&dev->fw_mutex); + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + if (test_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + *status = SSD_BMSTATUS_WARNING; + } else { + *status = SSD_BMSTATUS_OK; + } + } else if(dev->protocol_info.ver > SSD_PROTOCOL_V3) { + ret = __ssd_bm_status(dev, status); + } else { + *status = SSD_BMSTATUS_OK; + } + mutex_unlock(&dev->fw_mutex); + + return ret; +} + +int ssd_get_pciaddr(struct block_device *bdev, struct pci_addr *paddr) +{ + struct ssd_device *dev; + + if (!bdev || !paddr || !bdev->bd_disk) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + + paddr->domain = pci_domain_nr(dev->pdev->bus); + paddr->bus = dev->pdev->bus->number; + paddr->slot = PCI_SLOT(dev->pdev->devfn); + paddr->func= PCI_FUNC(dev->pdev->devfn); + + return 0; +} + +/* acc */ +static int ssd_bb_acc(struct ssd_device *dev, struct ssd_acc_info *acc) +{ + uint32_t val; + int ctrl, chip; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_1_1) { + return -EOPNOTSUPP; + } + + acc->threshold_l1 = ssd_reg32_read(dev->ctrlp + SSD_BB_THRESHOLD_L1_REG); + if (0xffffffffull == acc->threshold_l1) { + return -EIO; + } + acc->threshold_l2 = ssd_reg32_read(dev->ctrlp + SSD_BB_THRESHOLD_L2_REG); + if (0xffffffffull == acc->threshold_l2) { + return -EIO; + } + acc->val = 0; + + for (ctrl=0; ctrlhw_info.nr_ctrl; ctrl++) { + for (chip=0; chiphw_info.nr_chip; chip++) { + val = ssd_reg32_read(dev->ctrlp + SSD_BB_ACC_REG0 + (SSD_CTRL_REG_ZONE_SZ * ctrl) + (SSD_BB_ACC_REG_SZ * chip)); + if (0xffffffffull == acc->val) { + return -EIO; + } + if (val > acc->val) { + acc->val = val; + } + } + } + + return 0; +} + +static int ssd_ec_acc(struct ssd_device *dev, struct ssd_acc_info *acc) +{ + uint32_t val; + int ctrl, chip; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_1_1) { + return -EOPNOTSUPP; + } + + acc->threshold_l1 = ssd_reg32_read(dev->ctrlp + SSD_EC_THRESHOLD_L1_REG); + if (0xffffffffull == acc->threshold_l1) { + return -EIO; + } + acc->threshold_l2 = ssd_reg32_read(dev->ctrlp + SSD_EC_THRESHOLD_L2_REG); + if (0xffffffffull == acc->threshold_l2) { + return -EIO; + } + acc->val = 0; + + for (ctrl=0; ctrlhw_info.nr_ctrl; ctrl++) { + for (chip=0; chiphw_info.nr_chip; chip++) { + val = ssd_reg32_read(dev->ctrlp + SSD_EC_ACC_REG0 + (SSD_CTRL_REG_ZONE_SZ * ctrl) + (SSD_EC_ACC_REG_SZ * chip)); + if (0xffffffffull == acc->val) { + return -EIO; + } + + if (val > acc->val) { + acc->val = val; + } + } + } + + return 0; +} + + +/* ram r&w */ +static int ssd_ram_read_4k(struct ssd_device *dev, void *buf, size_t length, loff_t ofs, int ctrl_idx) +{ + struct ssd_ram_op_msg *msg; + dma_addr_t buf_dma; + size_t len = length; + loff_t ofs_w = ofs; + int ret = 0; + + if (ctrl_idx >= dev->hw_info.nr_ctrl || (uint64_t)(ofs + length) > dev->hw_info.ram_size + || !length || length > dev->hw_info.ram_max_len + || (length & (dev->hw_info.ram_align - 1)) != 0 || ((uint64_t)ofs & (dev->hw_info.ram_align - 1)) != 0) { + return -EINVAL; + } + + len /= dev->hw_info.ram_align; + do_div(ofs_w, dev->hw_info.ram_align); + + buf_dma = pci_map_single(dev->pdev, buf, length, PCI_DMA_FROMDEVICE); +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,26)) + ret = dma_mapping_error(buf_dma); +#else + ret = dma_mapping_error(&(dev->pdev->dev), buf_dma); +#endif + if (ret) { + hio_warn("%s: unable to map read DMA buffer\n", dev->name); + goto out_dma_mapping; + } + + msg = (struct ssd_ram_op_msg *)ssd_get_dmsg(dev); + + msg->fun = SSD_FUNC_RAM_READ; + msg->ctrl_idx = ctrl_idx; + msg->start = (uint32_t)ofs_w; + msg->length = len; + msg->buf = buf_dma; + + ret = ssd_do_request(dev, READ, msg, NULL); + ssd_put_dmsg(msg); + + pci_unmap_single(dev->pdev, buf_dma, length, PCI_DMA_FROMDEVICE); + +out_dma_mapping: + return ret; +} + +static int ssd_ram_write_4k(struct ssd_device *dev, void *buf, size_t length, loff_t ofs, int ctrl_idx) +{ + struct ssd_ram_op_msg *msg; + dma_addr_t buf_dma; + size_t len = length; + loff_t ofs_w = ofs; + int ret = 0; + + if (ctrl_idx >= dev->hw_info.nr_ctrl || (uint64_t)(ofs + length) > dev->hw_info.ram_size + || !length || length > dev->hw_info.ram_max_len + || (length & (dev->hw_info.ram_align - 1)) != 0 || ((uint64_t)ofs & (dev->hw_info.ram_align - 1)) != 0) { + return -EINVAL; + } + + len /= dev->hw_info.ram_align; + do_div(ofs_w, dev->hw_info.ram_align); + + buf_dma = pci_map_single(dev->pdev, buf, length, PCI_DMA_TODEVICE); +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,26)) + ret = dma_mapping_error(buf_dma); +#else + ret = dma_mapping_error(&(dev->pdev->dev), buf_dma); +#endif + if (ret) { + hio_warn("%s: unable to map write DMA buffer\n", dev->name); + goto out_dma_mapping; + } + + msg = (struct ssd_ram_op_msg *)ssd_get_dmsg(dev); + + msg->fun = SSD_FUNC_RAM_WRITE; + msg->ctrl_idx = ctrl_idx; + msg->start = (uint32_t)ofs_w; + msg->length = len; + msg->buf = buf_dma; + + ret = ssd_do_request(dev, WRITE, msg, NULL); + ssd_put_dmsg(msg); + + pci_unmap_single(dev->pdev, buf_dma, length, PCI_DMA_TODEVICE); + +out_dma_mapping: + return ret; + +} + +static int ssd_ram_read(struct ssd_device *dev, void *buf, size_t length, loff_t ofs, int ctrl_idx) +{ + int left = length; + size_t len; + loff_t off = ofs; + int ret = 0; + + if (ctrl_idx >= dev->hw_info.nr_ctrl || (uint64_t)(ofs + length) > dev->hw_info.ram_size || !length + || (length & (dev->hw_info.ram_align - 1)) != 0 || ((uint64_t)ofs & (dev->hw_info.ram_align - 1)) != 0) { + return -EINVAL; + } + + while (left > 0) { + len = dev->hw_info.ram_max_len; + if (left < (int)dev->hw_info.ram_max_len) { + len = left; + } + + ret = ssd_ram_read_4k(dev, buf, len, off, ctrl_idx); + if (ret) { + break; + } + + left -= len; + off += len; + buf += len; + } + + return ret; +} + +static int ssd_ram_write(struct ssd_device *dev, void *buf, size_t length, loff_t ofs, int ctrl_idx) +{ + int left = length; + size_t len; + loff_t off = ofs; + int ret = 0; + + if (ctrl_idx >= dev->hw_info.nr_ctrl || (uint64_t)(ofs + length) > dev->hw_info.ram_size || !length + || (length & (dev->hw_info.ram_align - 1)) != 0 || ((uint64_t)ofs & (dev->hw_info.ram_align - 1)) != 0) { + return -EINVAL; + } + + while (left > 0) { + len = dev->hw_info.ram_max_len; + if (left < (int)dev->hw_info.ram_max_len) { + len = left; + } + + ret = ssd_ram_write_4k(dev, buf, len, off, ctrl_idx); + if (ret) { + break; + } + + left -= len; + off += len; + buf += len; + } + + return ret; +} + + +/* flash op */ +static int ssd_check_flash(struct ssd_device *dev, int flash, int page, int ctrl_idx) +{ + int cur_ch = flash % dev->hw_info.max_ch; + int cur_chip = flash /dev->hw_info.max_ch; + + if (ctrl_idx >= dev->hw_info.nr_ctrl) { + return -EINVAL; + } + + if (cur_ch >= dev->hw_info.nr_ch || cur_chip >= dev->hw_info.nr_chip) { + return -EINVAL; + } + + if (page >= (int)(dev->hw_info.block_count * dev->hw_info.page_count)) { + return -EINVAL; + } + return 0; +} + +static int ssd_nand_read_id(struct ssd_device *dev, void *id, int flash, int chip, int ctrl_idx) +{ + struct ssd_nand_op_msg *msg; + dma_addr_t buf_dma; + int ret = 0; + + if (unlikely(!id)) + return -EINVAL; + + buf_dma = pci_map_single(dev->pdev, id, SSD_NAND_ID_BUFF_SZ, PCI_DMA_FROMDEVICE); +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,26)) + ret = dma_mapping_error(buf_dma); +#else + ret = dma_mapping_error(&(dev->pdev->dev), buf_dma); +#endif + if (ret) { + hio_warn("%s: unable to map read DMA buffer\n", dev->name); + goto out_dma_mapping; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + flash = ((uint32_t)flash << 1) | (uint32_t)chip; + chip = 0; + } + + msg = (struct ssd_nand_op_msg *)ssd_get_dmsg(dev); + + msg->fun = SSD_FUNC_NAND_READ_ID; + msg->chip_no = flash; + msg->chip_ce = chip; + msg->ctrl_idx = ctrl_idx; + msg->buf = buf_dma; + + ret = ssd_do_request(dev, READ, msg, NULL); + ssd_put_dmsg(msg); + + pci_unmap_single(dev->pdev, buf_dma, SSD_NAND_ID_BUFF_SZ, PCI_DMA_FROMDEVICE); + +out_dma_mapping: + return ret; +} + +#if 0 +static int ssd_nand_read(struct ssd_device *dev, void *buf, + int flash, int chip, int page, int page_count, int ctrl_idx) +{ + struct ssd_nand_op_msg *msg; + dma_addr_t buf_dma; + int length; + int ret = 0; + + if (!buf) { + return -EINVAL; + } + + if ((page + page_count) > dev->hw_info.block_count*dev->hw_info.page_count) { + return -EINVAL; + } + + ret = ssd_check_flash(dev, flash, page, ctrl_idx); + if (ret) { + return ret; + } + + length = page_count * dev->hw_info.page_size; + + buf_dma = pci_map_single(dev->pdev, buf, length, PCI_DMA_FROMDEVICE); +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,26)) + ret = dma_mapping_error(buf_dma); +#else + ret = dma_mapping_error(&(dev->pdev->dev), buf_dma); +#endif + if (ret) { + hio_warn("%s: unable to map read DMA buffer\n", dev->name); + goto out_dma_mapping; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + flash = (flash << 1) | chip; + chip = 0; + } + + msg = (struct ssd_nand_op_msg *)ssd_get_dmsg(dev); + + msg->fun = SSD_FUNC_NAND_READ; + msg->ctrl_idx = ctrl_idx; + msg->chip_no = flash; + msg->chip_ce = chip; + msg->page_no = page; + msg->page_count = page_count; + msg->buf = buf_dma; + + ret = ssd_do_request(dev, READ, msg, NULL); + ssd_put_dmsg(msg); + + pci_unmap_single(dev->pdev, buf_dma, length, PCI_DMA_FROMDEVICE); + +out_dma_mapping: + return ret; +} +#endif + +static int ssd_nand_read_w_oob(struct ssd_device *dev, void *buf, + int flash, int chip, int page, int count, int ctrl_idx) +{ + struct ssd_nand_op_msg *msg; + dma_addr_t buf_dma; + int length; + int ret = 0; + + if (!buf) { + return -EINVAL; + } + + if ((page + count) > (int)(dev->hw_info.block_count * dev->hw_info.page_count)) { + return -EINVAL; + } + + ret = ssd_check_flash(dev, flash, page, ctrl_idx); + if (ret) { + return ret; + } + + length = count * (dev->hw_info.page_size + dev->hw_info.oob_size); + + buf_dma = pci_map_single(dev->pdev, buf, length, PCI_DMA_FROMDEVICE); +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,26)) + ret = dma_mapping_error(buf_dma); +#else + ret = dma_mapping_error(&(dev->pdev->dev), buf_dma); +#endif + if (ret) { + hio_warn("%s: unable to map read DMA buffer\n", dev->name); + goto out_dma_mapping; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + flash = ((uint32_t)flash << 1) | (uint32_t)chip; + chip = 0; + } + + msg = (struct ssd_nand_op_msg *)ssd_get_dmsg(dev); + + msg->fun = SSD_FUNC_NAND_READ_WOOB; + msg->ctrl_idx = ctrl_idx; + msg->chip_no = flash; + msg->chip_ce = chip; + msg->page_no = page; + msg->page_count = count; + msg->buf = buf_dma; + + ret = ssd_do_request(dev, READ, msg, NULL); + ssd_put_dmsg(msg); + + pci_unmap_single(dev->pdev, buf_dma, length, PCI_DMA_FROMDEVICE); + +out_dma_mapping: + return ret; +} + +/* write 1 page */ +static int ssd_nand_write(struct ssd_device *dev, void *buf, + int flash, int chip, int page, int count, int ctrl_idx) +{ + struct ssd_nand_op_msg *msg; + dma_addr_t buf_dma; + int length; + int ret = 0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + return -EINVAL; + } + + if (!buf) { + return -EINVAL; + } + + if (count != 1) { + return -EINVAL; + } + + ret = ssd_check_flash(dev, flash, page, ctrl_idx); + if (ret) { + return ret; + } + + length = count * (dev->hw_info.page_size + dev->hw_info.oob_size); + + /* write data to ram */ + /*ret = ssd_ram_write(dev, buf, length, dev->hw_info.nand_wbuff_base, ctrl_idx); + if (ret) { + return ret; + }*/ + + buf_dma = pci_map_single(dev->pdev, buf, length, PCI_DMA_TODEVICE); +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,26)) + ret = dma_mapping_error(buf_dma); +#else + ret = dma_mapping_error(&(dev->pdev->dev), buf_dma); +#endif + if (ret) { + hio_warn("%s: unable to map write DMA buffer\n", dev->name); + goto out_dma_mapping; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + flash = ((uint32_t)flash << 1) | (uint32_t)chip; + chip = 0; + } + + msg = (struct ssd_nand_op_msg *)ssd_get_dmsg(dev); + + msg->fun = SSD_FUNC_NAND_WRITE; + msg->ctrl_idx = ctrl_idx; + msg->chip_no = flash; + msg->chip_ce = chip; + + msg->page_no = page; + msg->page_count = count; + msg->buf = buf_dma; + + ret = ssd_do_request(dev, WRITE, msg, NULL); + ssd_put_dmsg(msg); + + pci_unmap_single(dev->pdev, buf_dma, length, PCI_DMA_TODEVICE); + +out_dma_mapping: + return ret; +} + +static int ssd_nand_erase(struct ssd_device *dev, int flash, int chip, int page, int ctrl_idx) +{ + struct ssd_nand_op_msg *msg; + int ret = 0; + + ret = ssd_check_flash(dev, flash, page, ctrl_idx); + if (ret) { + return ret; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + flash = ((uint32_t)flash << 1) | (uint32_t)chip; + chip = 0; + } + + msg = (struct ssd_nand_op_msg *)ssd_get_dmsg(dev); + + msg->fun = SSD_FUNC_NAND_ERASE; + msg->ctrl_idx = ctrl_idx; + msg->chip_no = flash; + msg->chip_ce = chip; + msg->page_no = page; + + ret = ssd_do_request(dev, WRITE, msg, NULL); + ssd_put_dmsg(msg); + + return ret; +} + +static int ssd_update_bbt(struct ssd_device *dev, int flash, int ctrl_idx) +{ + struct ssd_nand_op_msg *msg; + struct ssd_flush_msg *fmsg; + int ret = 0; + + ret = ssd_check_flash(dev, flash, 0, ctrl_idx); + if (ret) { + return ret; + } + + msg = (struct ssd_nand_op_msg *)ssd_get_dmsg(dev); + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + fmsg = (struct ssd_flush_msg *)msg; + + fmsg->fun = SSD_FUNC_FLUSH; + fmsg->flag = 0x1; + fmsg->flash = flash; + fmsg->ctrl_idx = ctrl_idx; + } else { + msg->fun = SSD_FUNC_FLUSH; + msg->flag = 0x1; + msg->chip_no = flash; + msg->ctrl_idx = ctrl_idx; + } + + ret = ssd_do_request(dev, WRITE, msg, NULL); + ssd_put_dmsg(msg); + + return ret; +} + +/* flash controller init state */ +static int __ssd_check_init_state(struct ssd_device *dev) +{ + uint32_t *init_state = NULL; + int reg_base, reg_sz; + int max_wait = SSD_INIT_MAX_WAIT; + int init_wait = 0; + int i, j, k; + int ch_start = 0; + +/* + for (i=0; ihw_info.nr_ctrl; i++) { + ssd_reg32_write(dev->ctrlp + SSD_CTRL_TEST_REG0 + i * 8, test_data); + read_data = ssd_reg32_read(dev->ctrlp + SSD_CTRL_TEST_REG0 + i * 8); + if (read_data == ~test_data) { + //dev->hw_info.nr_ctrl++; + dev->hw_info.nr_ctrl_map |= 1<ctrlp + SSD_READY_REG); + j=0; + for (i=0; ihw_info.nr_ctrl; i++) { + if (((read_data>>i) & 0x1) == 0) { + j++; + } + } + + if (dev->hw_info.nr_ctrl != j) { + printk(KERN_WARNING "%s: nr_ctrl mismatch: %d %d\n", dev->name, dev->hw_info.nr_ctrl, j); + return -1; + } +*/ + +/* + init_state = ssd_reg_read(dev->ctrlp + SSD_FLASH_INFO_REG0); + for (j=1; jhw_info.nr_ctrl;j++) { + if (init_state != ssd_reg_read(dev->ctrlp + SSD_FLASH_INFO_REG0 + j*8)) { + printk(KERN_WARNING "SSD_FLASH_INFO_REG[%d], not match\n", j); + return -1; + } + } +*/ + +/* init_state = ssd_reg_read(dev->ctrlp + SSD_CHIP_INFO_REG0); + for (j=1; jhw_info.nr_ctrl; j++) { + if (init_state != ssd_reg_read(dev->ctrlp + SSD_CHIP_INFO_REG0 + j*16)) { + printk(KERN_WARNING "SSD_CHIP_INFO_REG Lo [%d], not match\n", j); + return -1; + } + } + + init_state = ssd_reg_read(dev->ctrlp + SSD_CHIP_INFO_REG0 + 8); + for (j=1; jhw_info.nr_ctrl; j++) { + if (init_state != ssd_reg_read(dev->ctrlp + SSD_CHIP_INFO_REG0 + 8 + j*16)) { + printk(KERN_WARNING "SSD_CHIP_INFO_REG Hi [%d], not match\n", j); + return -1; + } + } +*/ + + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + max_wait = SSD_INIT_MAX_WAIT_V3_2; + } + + reg_base = dev->protocol_info.init_state_reg; + reg_sz = dev->protocol_info.init_state_reg_sz; + + init_state = (uint32_t *)kmalloc(reg_sz, GFP_KERNEL); + if (!init_state) { + return -ENOMEM; + } + + for (i=0; ihw_info.nr_ctrl; i++) { +check_init: + for (j=0, k=0; jctrlp + reg_base + j); + } + + if (dev->protocol_info.ver > SSD_PROTOCOL_V3) { + /* just check the last bit, no need to check all channel */ + ch_start = dev->hw_info.max_ch - 1; + } else { + ch_start = 0; + } + + for (j=0; jhw_info.nr_chip; j++) { + for (k=ch_start; khw_info.max_ch; k++) { + if (test_bit((j*dev->hw_info.max_ch + k), (void *)init_state)) { + continue; + } + + init_wait++; + if (init_wait <= max_wait) { + msleep(SSD_INIT_WAIT); + goto check_init; + } else { + if (k < dev->hw_info.nr_ch) { + hio_warn("%s: controller %d chip %d ch %d init failed\n", + dev->name, i, j, k); + } else { + hio_warn("%s: controller %d chip %d init failed\n", + dev->name, i, j); + } + + kfree(init_state); + return -1; + } + } + } + reg_base += reg_sz; + } + //printk(KERN_WARNING "%s: init wait %d\n", dev->name, init_wait); + + kfree(init_state); + return 0; +} + +static int ssd_check_init_state(struct ssd_device *dev) +{ + if (mode != SSD_DRV_MODE_STANDARD) { + return 0; + } + + return __ssd_check_init_state(dev); +} + +static void ssd_reset_resp_ptr(struct ssd_device *dev); + +/* reset flash controller etc */ +static int __ssd_reset(struct ssd_device *dev, int type) +{ + if (type < SSD_RST_NOINIT || type > SSD_RST_FULL) { + return -EINVAL; + } + + mutex_lock(&dev->fw_mutex); + + if (type == SSD_RST_NOINIT) { //no init + ssd_reg32_write(dev->ctrlp + SSD_RESET_REG, SSD_RESET_NOINIT); + } else if (type == SSD_RST_NORMAL) { //reset & init + ssd_reg32_write(dev->ctrlp + SSD_RESET_REG, SSD_RESET); + } else { // full reset + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + mutex_unlock(&dev->fw_mutex); + return -EINVAL; + } + + ssd_reg32_write(dev->ctrlp + SSD_FULL_RESET_REG, SSD_RESET_FULL); + + /* ?? */ + ssd_reset_resp_ptr(dev); + } + +#ifdef SSD_OT_PROTECT + dev->ot_delay = 0; +#endif + + msleep(1000); + + /* xx */ + ssd_set_flush_timeout(dev, dev->wmode); + + mutex_unlock(&dev->fw_mutex); + ssd_gen_swlog(dev, SSD_LOG_RESET, (uint32_t)type); + + return __ssd_check_init_state(dev); +} + +static int ssd_save_md(struct ssd_device *dev) +{ + struct ssd_nand_op_msg *msg; + int ret = 0; + + if (unlikely(mode != SSD_DRV_MODE_STANDARD)) + return 0; + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + return 0; + } + + if (!dev->save_md) { + return 0; + } + + msg = (struct ssd_nand_op_msg *)ssd_get_dmsg(dev); + + msg->fun = SSD_FUNC_FLUSH; + msg->flag = 0x2; + msg->ctrl_idx = 0; + msg->chip_no = 0; + + ret = ssd_do_request(dev, WRITE, msg, NULL); + ssd_put_dmsg(msg); + + return ret; +} + +static int ssd_barrier_save_md(struct ssd_device *dev) +{ + struct ssd_nand_op_msg *msg; + int ret = 0; + + if (unlikely(mode != SSD_DRV_MODE_STANDARD)) + return 0; + + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + return 0; + } + + if (!dev->save_md) { + return 0; + } + + msg = (struct ssd_nand_op_msg *)ssd_get_dmsg(dev); + + msg->fun = SSD_FUNC_FLUSH; + msg->flag = 0x2; + msg->ctrl_idx = 0; + msg->chip_no = 0; + + ret = ssd_do_barrier_request(dev, WRITE, msg, NULL); + ssd_put_dmsg(msg); + + return ret; +} + +static int ssd_flush(struct ssd_device *dev) +{ + struct ssd_nand_op_msg *msg; + struct ssd_flush_msg *fmsg; + int ret = 0; + + if (unlikely(mode != SSD_DRV_MODE_STANDARD)) + return 0; + + msg = (struct ssd_nand_op_msg *)ssd_get_dmsg(dev); + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + fmsg = (struct ssd_flush_msg *)msg; + + fmsg->fun = SSD_FUNC_FLUSH; + fmsg->flag = 0; + fmsg->ctrl_idx = 0; + fmsg->flash = 0; + } else { + msg->fun = SSD_FUNC_FLUSH; + msg->flag = 0; + msg->ctrl_idx = 0; + msg->chip_no = 0; + } + + ret = ssd_do_request(dev, WRITE, msg, NULL); + ssd_put_dmsg(msg); + + return ret; +} + +static int ssd_barrier_flush(struct ssd_device *dev) +{ + struct ssd_nand_op_msg *msg; + struct ssd_flush_msg *fmsg; + int ret = 0; + + if (unlikely(mode != SSD_DRV_MODE_STANDARD)) + return 0; + + msg = (struct ssd_nand_op_msg *)ssd_get_dmsg(dev); + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + fmsg = (struct ssd_flush_msg *)msg; + + fmsg->fun = SSD_FUNC_FLUSH; + fmsg->flag = 0; + fmsg->ctrl_idx = 0; + fmsg->flash = 0; + } else { + msg->fun = SSD_FUNC_FLUSH; + msg->flag = 0; + msg->ctrl_idx = 0; + msg->chip_no = 0; + } + + ret = ssd_do_barrier_request(dev, WRITE, msg, NULL); + ssd_put_dmsg(msg); + + return ret; +} + +#define SSD_WMODE_BUFFER_TIMEOUT 0x00c82710 +#define SSD_WMODE_BUFFER_EX_TIMEOUT 0x000500c8 +#define SSD_WMODE_FUA_TIMEOUT 0x000503E8 +static void ssd_set_flush_timeout(struct ssd_device *dev, int m) +{ + uint32_t to; + uint32_t val = 0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_1_1) { + return; + } + + switch(m) { + case SSD_WMODE_BUFFER: + to = SSD_WMODE_BUFFER_TIMEOUT; + break; + case SSD_WMODE_BUFFER_EX: + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2_1) { + to = SSD_WMODE_BUFFER_EX_TIMEOUT; + } else { + to = SSD_WMODE_BUFFER_TIMEOUT; + } + break; + case SSD_WMODE_FUA: + to = SSD_WMODE_FUA_TIMEOUT; + break; + default: + return; + } + + val = (((uint32_t)((uint32_t)m & 0x3) << 28) | to); + + ssd_reg32_write(dev->ctrlp + SSD_FLUSH_TIMEOUT_REG, val); +} + +static int ssd_do_switch_wmode(struct ssd_device *dev, int m) +{ + int ret = 0; + + ret = ssd_barrier_start(dev); + if (ret) { + goto out; + } + + ret = ssd_barrier_flush(dev); + if (ret) { + goto out_barrier_end; + } + + /* set contoller flush timeout */ + ssd_set_flush_timeout(dev, m); + + dev->wmode = m; + mb(); + +out_barrier_end: + ssd_barrier_end(dev); +out: + return ret; +} + +static int ssd_switch_wmode(struct ssd_device *dev, int m) +{ + int default_wmode; + int next_wmode; + int ret = 0; + + if (!test_bit(SSD_ONLINE, &dev->state)) { + return -ENODEV; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + default_wmode = SSD_WMODE_BUFFER; + } else { + default_wmode = SSD_WMODE_BUFFER_EX; + } + + if (SSD_WMODE_AUTO == m) { + /* battery fault ? */ + if (test_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + next_wmode = SSD_WMODE_FUA; + } else { + next_wmode = default_wmode; + } + } else if (SSD_WMODE_DEFAULT == m) { + next_wmode = default_wmode; + } else { + next_wmode = m; + } + + if (next_wmode != dev->wmode) { + hio_warn("%s: switch write mode (%d -> %d)\n", dev->name, dev->wmode, next_wmode); + ret = ssd_do_switch_wmode(dev, next_wmode); + if (ret) { + hio_err("%s: can not switch write mode (%d -> %d)\n", dev->name, dev->wmode, next_wmode); + } + } + + return ret; +} + +static int ssd_init_wmode(struct ssd_device *dev) +{ + int default_wmode; + int ret = 0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + default_wmode = SSD_WMODE_BUFFER; + } else { + default_wmode = SSD_WMODE_BUFFER_EX; + } + + /* dummy mode */ + if (SSD_WMODE_AUTO == dev->user_wmode) { + /* battery fault ? */ + if (test_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + dev->wmode = SSD_WMODE_FUA; + } else { + dev->wmode = default_wmode; + } + } else if (SSD_WMODE_DEFAULT == dev->user_wmode) { + dev->wmode = default_wmode; + } else { + dev->wmode = dev->user_wmode; + } + ssd_set_flush_timeout(dev, dev->wmode); + + return ret; +} + +static int __ssd_set_wmode(struct ssd_device *dev, int m) +{ + int ret = 0; + + /* not support old fw*/ + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_1_1) { + ret = -EOPNOTSUPP; + goto out; + } + + if (m < SSD_WMODE_BUFFER || m > SSD_WMODE_DEFAULT) { + ret = -EINVAL; + goto out; + } + + ssd_gen_swlog(dev, SSD_LOG_SET_WMODE, m); + + dev->user_wmode = m; + + ret = ssd_switch_wmode(dev, dev->user_wmode); + if (ret) { + goto out; + } + +out: + return ret; +} + +int ssd_set_wmode(struct block_device *bdev, int m) +{ + struct ssd_device *dev; + + if (!bdev || !(bdev->bd_disk)) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + + return __ssd_set_wmode(dev, m); +} + +static int ssd_do_reset(struct ssd_device *dev) +{ + int ret = 0; + + if (test_and_set_bit(SSD_RESETING, &dev->state)) { + return 0; + } + + ssd_stop_workq(dev); + + ret = ssd_barrier_start(dev); + if (ret) { + goto out; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + /* old reset */ + ret = __ssd_reset(dev, SSD_RST_NORMAL); + } else { + /* full reset */ + //ret = __ssd_reset(dev, SSD_RST_FULL); + ret = __ssd_reset(dev, SSD_RST_NORMAL); + } + if (ret) { + goto out_barrier_end; + } + +out_barrier_end: + ssd_barrier_end(dev); +out: + ssd_start_workq(dev); + test_and_clear_bit(SSD_RESETING, &dev->state); + return ret; +} + +static int ssd_full_reset(struct ssd_device *dev) +{ + int ret = 0; + + if (test_and_set_bit(SSD_RESETING, &dev->state)) { + return 0; + } + + ssd_stop_workq(dev); + + ret = ssd_barrier_start(dev); + if (ret) { + goto out; + } + + ret = ssd_barrier_flush(dev); + if (ret) { + goto out_barrier_end; + } + + ret = ssd_barrier_save_md(dev); + if (ret) { + goto out_barrier_end; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + /* old reset */ + ret = __ssd_reset(dev, SSD_RST_NORMAL); + } else { + /* full reset */ + //ret = __ssd_reset(dev, SSD_RST_FULL); + ret = __ssd_reset(dev, SSD_RST_NORMAL); + } + if (ret) { + goto out_barrier_end; + } + +out_barrier_end: + ssd_barrier_end(dev); +out: + ssd_start_workq(dev); + test_and_clear_bit(SSD_RESETING, &dev->state); + return ret; +} + +int ssd_reset(struct block_device *bdev) +{ + struct ssd_device *dev; + + if (!bdev || !(bdev->bd_disk)) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + + return ssd_full_reset(dev); +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) +static int ssd_issue_flush_fn(struct request_queue *q, struct gendisk *disk, + sector_t *error_sector) +{ + struct ssd_device *dev = q->queuedata; + + return ssd_flush(dev); +} +#endif + +void ssd_submit_pbio(struct request_queue *q, struct bio *bio) +{ + struct ssd_device *dev = q->queuedata; +#ifdef SSD_QUEUE_PBIO + int ret = -EBUSY; +#endif + + if (!test_bit(SSD_ONLINE, &dev->state)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -ENODEV); +#else + bio_endio(bio, bio->bi_size, -ENODEV); +#endif + goto out; + } + +#ifdef SSD_DEBUG_ERR + if (atomic_read(&dev->tocnt)) { + hio_warn("%s: IO rejected because of IO timeout!\n", dev->name); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EIO); +#else + bio_endio(bio, bio->bi_size, -EIO); +#endif + goto out; + } +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) + if (unlikely(bio_barrier(bio))) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EOPNOTSUPP); +#else + bio_endio(bio, bio->bi_size, -EOPNOTSUPP); +#endif + goto out; + } +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)) + if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EOPNOTSUPP); +#else + bio_endio(bio, bio->bi_size, -EOPNOTSUPP); +#endif + goto out; + } +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) + if (unlikely(bio->bi_rw & REQ_HARDBARRIER)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EOPNOTSUPP); +#else + bio_endio(bio, bio->bi_size, -EOPNOTSUPP); +#endif + goto out; + } +#else + //xx + if (unlikely(bio->bi_rw & REQ_FUA)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EOPNOTSUPP); +#else + bio_endio(bio, bio->bi_size, -EOPNOTSUPP); +#endif + goto out; + } +#endif + + if (unlikely(dev->readonly && bio_data_dir(bio) == WRITE)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EROFS); +#else + bio_endio(bio, bio->bi_size, -EROFS); +#endif + goto out; + } + +#ifdef SSD_QUEUE_PBIO + if (0 == atomic_read(&dev->in_sendq)) { + ret = __ssd_submit_pbio(dev, bio, 0); + } + + if (ret) { + (void)test_and_set_bit(BIO_SSD_PBIO, &bio->bi_flags); + ssd_queue_bio(dev, bio); + } +#else + __ssd_submit_pbio(dev, bio, 1); +#endif + +out: + return; +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) +static int ssd_make_request(struct request_queue *q, struct bio *bio) +#else +static void ssd_make_request(struct request_queue *q, struct bio *bio) +#endif +{ + struct ssd_device *dev = q->queuedata; + int ret = -EBUSY; + + if (!test_bit(SSD_ONLINE, &dev->state)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -ENODEV); +#else + bio_endio(bio, bio->bi_size, -ENODEV); +#endif + goto out; + } + +#ifdef SSD_DEBUG_ERR + if (atomic_read(&dev->tocnt)) { + hio_warn("%s: IO rejected because of IO timeout!\n", dev->name); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EIO); +#else + bio_endio(bio, bio->bi_size, -EIO); +#endif + goto out; + } +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) + if (unlikely(bio_barrier(bio))) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EOPNOTSUPP); +#else + bio_endio(bio, bio->bi_size, -EOPNOTSUPP); +#endif + goto out; + } +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)) + if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EOPNOTSUPP); +#else + bio_endio(bio, bio->bi_size, -EOPNOTSUPP); +#endif + goto out; + } +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37)) + if (unlikely(bio->bi_rw & REQ_HARDBARRIER)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EOPNOTSUPP); +#else + bio_endio(bio, bio->bi_size, -EOPNOTSUPP); +#endif + goto out; + } +#else + //xx + if (unlikely(bio->bi_rw & REQ_FUA)) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) + bio_endio(bio, -EOPNOTSUPP); +#else + bio_endio(bio, bio->bi_size, -EOPNOTSUPP); +#endif + goto out; + } + + /* writeback_cache_control.txt: REQ_FLUSH requests without data can be completed successfully without doing any work */ + if (unlikely((bio->bi_rw & REQ_FLUSH) && !bio_sectors(bio))) { + bio_endio(bio, 0); + goto out; + } + +#endif + + if (0 == atomic_read(&dev->in_sendq)) { + ret = ssd_submit_bio(dev, bio, 0); + } + + if (ret) { + ssd_queue_bio(dev, bio); + } + +out: +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)) + return 0; +#else + return; +#endif +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)) +static int ssd_block_getgeo(struct block_device *bdev, struct hd_geometry *geo) +{ + struct ssd_device *dev; + + if (!bdev) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + if (!dev) { + return -EINVAL; + } + + geo->heads = 4; + geo->sectors = 16; + geo->cylinders = (dev->hw_info.size & ~0x3f) >> 6; + return 0; +} +#endif + +static void ssd_cleanup_blkdev(struct ssd_device *dev); +static int ssd_init_blkdev(struct ssd_device *dev); +static int ssd_ioctl_common(struct ssd_device *dev, unsigned int cmd, unsigned long arg) +{ + void __user *argp = (void __user *)arg; + void __user *buf = NULL; + void *kbuf = NULL; + int ret = 0; + + switch (cmd) { + case SSD_CMD_GET_PROTOCOL_INFO: + if (copy_to_user(argp, &dev->protocol_info, sizeof(struct ssd_protocol_info))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + + case SSD_CMD_GET_HW_INFO: + if (copy_to_user(argp, &dev->hw_info, sizeof(struct ssd_hw_info))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + + case SSD_CMD_GET_ROM_INFO: + if (copy_to_user(argp, &dev->rom_info, sizeof(struct ssd_rom_info))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + + case SSD_CMD_GET_SMART: { + struct ssd_smart smart; + int i; + + memcpy(&smart, &dev->smart, sizeof(struct ssd_smart)); + + mutex_lock(&dev->gd_mutex); + ssd_update_smart(dev, &smart); + mutex_unlock(&dev->gd_mutex); + + /* combine the volatile log info */ + if (dev->log_info.nr_log) { + for (i=0; ilog_info.stat[i]; + } + } + + if (copy_to_user(argp, &smart, sizeof(struct ssd_smart))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_GET_IDX: + if (copy_to_user(argp, &dev->idx, sizeof(int))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + + case SSD_CMD_GET_AMOUNT: { + int nr_ssd = atomic_read(&ssd_nr); + if (copy_to_user(argp, &nr_ssd, sizeof(int))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_GET_TO_INFO: { + int tocnt = atomic_read(&dev->tocnt); + + if (copy_to_user(argp, &tocnt, sizeof(int))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_GET_DRV_VER: { + char ver[] = DRIVER_VERSION; + int len = sizeof(ver); + + if (len > (DRIVER_VERSION_LEN - 1)) { + len = (DRIVER_VERSION_LEN - 1); + } + if (copy_to_user(argp, ver, len)) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_GET_BBACC_INFO: { + struct ssd_acc_info acc; + + mutex_lock(&dev->fw_mutex); + ret = ssd_bb_acc(dev, &acc); + mutex_unlock(&dev->fw_mutex); + if (ret) { + break; + } + + if (copy_to_user(argp, &acc, sizeof(struct ssd_acc_info))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_GET_ECACC_INFO: { + struct ssd_acc_info acc; + + mutex_lock(&dev->fw_mutex); + ret = ssd_ec_acc(dev, &acc); + mutex_unlock(&dev->fw_mutex); + if (ret) { + break; + } + + if (copy_to_user(argp, &acc, sizeof(struct ssd_acc_info))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_GET_HW_INFO_EXT: + if (copy_to_user(argp, &dev->hw_info_ext, sizeof(struct ssd_hw_info_extend))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + + case SSD_CMD_REG_READ: { + struct ssd_reg_op_info reg_info; + + if (copy_from_user(®_info, argp, sizeof(struct ssd_reg_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + if (reg_info.offset > dev->mmio_len-sizeof(uint32_t)) { + ret = -EINVAL; + break; + } + + reg_info.value = ssd_reg32_read(dev->ctrlp + reg_info.offset); + if (copy_to_user(argp, ®_info, sizeof(struct ssd_reg_op_info))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_REG_WRITE: { + struct ssd_reg_op_info reg_info; + + if (copy_from_user(®_info, argp, sizeof(struct ssd_reg_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + if (reg_info.offset > dev->mmio_len-sizeof(uint32_t)) { + ret = -EINVAL; + break; + } + + ssd_reg32_write(dev->ctrlp + reg_info.offset, reg_info.value); + + break; + } + + case SSD_CMD_SPI_READ: { + struct ssd_spi_op_info spi_info; + uint32_t off, size; + + if (copy_from_user(&spi_info, argp, sizeof(struct ssd_spi_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + off = spi_info.off; + size = spi_info.len; + buf = spi_info.buf; + + if (size > dev->rom_info.size || 0 == size || (off + size) > dev->rom_info.size) { + ret = -EINVAL; + break; + } + + kbuf = kmalloc(size, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + break; + } + + ret = ssd_spi_page_read(dev, kbuf, off, size); + if (ret) { + kfree(kbuf); + break; + } + + if (copy_to_user(buf, kbuf, size)) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + kfree(kbuf); + ret = -EFAULT; + break; + } + + kfree(kbuf); + + break; + } + + case SSD_CMD_SPI_WRITE: { + struct ssd_spi_op_info spi_info; + uint32_t off, size; + + if (copy_from_user(&spi_info, argp, sizeof(struct ssd_spi_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + off = spi_info.off; + size = spi_info.len; + buf = spi_info.buf; + + if (size > dev->rom_info.size || 0 == size || (off + size) > dev->rom_info.size) { + ret = -EINVAL; + break; + } + + kbuf = kmalloc(size, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + break; + } + + if (copy_from_user(kbuf, buf, size)) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + kfree(kbuf); + ret = -EFAULT; + break; + } + + ret = ssd_spi_page_write(dev, kbuf, off, size); + if (ret) { + kfree(kbuf); + break; + } + + kfree(kbuf); + + break; + } + + case SSD_CMD_SPI_ERASE: { + struct ssd_spi_op_info spi_info; + uint32_t off; + + if (copy_from_user(&spi_info, argp, sizeof(struct ssd_spi_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + off = spi_info.off; + + if ((off + dev->rom_info.block_size) > dev->rom_info.size) { + ret = -EINVAL; + break; + } + + ret = ssd_spi_block_erase(dev, off); + if (ret) { + break; + } + + break; + } + + case SSD_CMD_I2C_READ: { + struct ssd_i2c_op_info i2c_info; + uint8_t saddr; + uint8_t rsize; + + if (copy_from_user(&i2c_info, argp, sizeof(struct ssd_i2c_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = i2c_info.saddr; + rsize = i2c_info.rsize; + buf = i2c_info.rbuf; + + if (rsize <= 0 || rsize > SSD_I2C_MAX_DATA) { + ret = -EINVAL; + break; + } + + kbuf = kmalloc(rsize, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + break; + } + + ret = ssd_i2c_read(dev, saddr, rsize, kbuf); + if (ret) { + kfree(kbuf); + break; + } + + if (copy_to_user(buf, kbuf, rsize)) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + kfree(kbuf); + ret = -EFAULT; + break; + } + + kfree(kbuf); + + break; + } + + case SSD_CMD_I2C_WRITE: { + struct ssd_i2c_op_info i2c_info; + uint8_t saddr; + uint8_t wsize; + + if (copy_from_user(&i2c_info, argp, sizeof(struct ssd_i2c_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = i2c_info.saddr; + wsize = i2c_info.wsize; + buf = i2c_info.wbuf; + + if (wsize <= 0 || wsize > SSD_I2C_MAX_DATA) { + ret = -EINVAL; + break; + } + + kbuf = kmalloc(wsize, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + break; + } + + if (copy_from_user(kbuf, buf, wsize)) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + kfree(kbuf); + ret = -EFAULT; + break; + } + + ret = ssd_i2c_write(dev, saddr, wsize, kbuf); + if (ret) { + kfree(kbuf); + break; + } + + kfree(kbuf); + + break; + } + + case SSD_CMD_I2C_WRITE_READ: { + struct ssd_i2c_op_info i2c_info; + uint8_t saddr; + uint8_t wsize; + uint8_t rsize; + uint8_t size; + + if (copy_from_user(&i2c_info, argp, sizeof(struct ssd_i2c_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = i2c_info.saddr; + wsize = i2c_info.wsize; + rsize = i2c_info.rsize; + buf = i2c_info.wbuf; + + if (wsize <= 0 || wsize > SSD_I2C_MAX_DATA) { + ret = -EINVAL; + break; + } + + if (rsize <= 0 || rsize > SSD_I2C_MAX_DATA) { + ret = -EINVAL; + break; + } + + size = wsize + rsize; + + kbuf = kmalloc(size, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + break; + } + + if (copy_from_user((kbuf + rsize), buf, wsize)) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + kfree(kbuf); + ret = -EFAULT; + break; + } + + buf = i2c_info.rbuf; + + ret = ssd_i2c_write_read(dev, saddr, wsize, (kbuf + rsize), rsize, kbuf); + if (ret) { + kfree(kbuf); + break; + } + + if (copy_to_user(buf, kbuf, rsize)) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + kfree(kbuf); + ret = -EFAULT; + break; + } + + kfree(kbuf); + + break; + } + + case SSD_CMD_SMBUS_SEND_BYTE: { + struct ssd_smbus_op_info smbus_info; + uint8_t smb_data[SSD_SMBUS_BLOCK_MAX]; + uint8_t saddr; + uint8_t size; + + if (copy_from_user(&smbus_info, argp, sizeof(struct ssd_smbus_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = smbus_info.saddr; + buf = smbus_info.buf; + size = 1; + + if (copy_from_user(smb_data, buf, size)) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + ret = ssd_smbus_send_byte(dev, saddr, smb_data); + if (ret) { + break; + } + + break; + } + + case SSD_CMD_SMBUS_RECEIVE_BYTE: { + struct ssd_smbus_op_info smbus_info; + uint8_t smb_data[SSD_SMBUS_BLOCK_MAX]; + uint8_t saddr; + uint8_t size; + + if (copy_from_user(&smbus_info, argp, sizeof(struct ssd_smbus_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = smbus_info.saddr; + buf = smbus_info.buf; + size = 1; + + ret = ssd_smbus_receive_byte(dev, saddr, smb_data); + if (ret) { + break; + } + + if (copy_to_user(buf, smb_data, size)) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_SMBUS_WRITE_BYTE: { + struct ssd_smbus_op_info smbus_info; + uint8_t smb_data[SSD_SMBUS_BLOCK_MAX]; + uint8_t saddr; + uint8_t command; + uint8_t size; + + if (copy_from_user(&smbus_info, argp, sizeof(struct ssd_smbus_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = smbus_info.saddr; + command = smbus_info.cmd; + buf = smbus_info.buf; + size = 1; + + if (copy_from_user(smb_data, buf, size)) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + ret = ssd_smbus_write_byte(dev, saddr, command, smb_data); + if (ret) { + break; + } + + break; + } + + case SSD_CMD_SMBUS_READ_BYTE: { + struct ssd_smbus_op_info smbus_info; + uint8_t smb_data[SSD_SMBUS_BLOCK_MAX]; + uint8_t saddr; + uint8_t command; + uint8_t size; + + if (copy_from_user(&smbus_info, argp, sizeof(struct ssd_smbus_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = smbus_info.saddr; + command = smbus_info.cmd; + buf = smbus_info.buf; + size = 1; + + ret = ssd_smbus_read_byte(dev, saddr, command, smb_data); + if (ret) { + break; + } + + if (copy_to_user(buf, smb_data, size)) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_SMBUS_WRITE_WORD: { + struct ssd_smbus_op_info smbus_info; + uint8_t smb_data[SSD_SMBUS_BLOCK_MAX]; + uint8_t saddr; + uint8_t command; + uint8_t size; + + if (copy_from_user(&smbus_info, argp, sizeof(struct ssd_smbus_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = smbus_info.saddr; + command = smbus_info.cmd; + buf = smbus_info.buf; + size = 2; + + if (copy_from_user(smb_data, buf, size)) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + ret = ssd_smbus_write_word(dev, saddr, command, smb_data); + if (ret) { + break; + } + + break; + } + + case SSD_CMD_SMBUS_READ_WORD: { + struct ssd_smbus_op_info smbus_info; + uint8_t smb_data[SSD_SMBUS_BLOCK_MAX]; + uint8_t saddr; + uint8_t command; + uint8_t size; + + if (copy_from_user(&smbus_info, argp, sizeof(struct ssd_smbus_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = smbus_info.saddr; + command = smbus_info.cmd; + buf = smbus_info.buf; + size = 2; + + ret = ssd_smbus_read_word(dev, saddr, command, smb_data); + if (ret) { + break; + } + + if (copy_to_user(buf, smb_data, size)) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_SMBUS_WRITE_BLOCK: { + struct ssd_smbus_op_info smbus_info; + uint8_t smb_data[SSD_SMBUS_BLOCK_MAX]; + uint8_t saddr; + uint8_t command; + uint8_t size; + + if (copy_from_user(&smbus_info, argp, sizeof(struct ssd_smbus_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = smbus_info.saddr; + command = smbus_info.cmd; + buf = smbus_info.buf; + size = smbus_info.size; + + if (size > SSD_SMBUS_BLOCK_MAX) { + ret = -EINVAL; + break; + } + + if (copy_from_user(smb_data, buf, size)) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + ret = ssd_smbus_write_block(dev, saddr, command, size, smb_data); + if (ret) { + break; + } + + break; + } + + case SSD_CMD_SMBUS_READ_BLOCK: { + struct ssd_smbus_op_info smbus_info; + uint8_t smb_data[SSD_SMBUS_BLOCK_MAX]; + uint8_t saddr; + uint8_t command; + uint8_t size; + + if (copy_from_user(&smbus_info, argp, sizeof(struct ssd_smbus_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + saddr = smbus_info.saddr; + command = smbus_info.cmd; + buf = smbus_info.buf; + size = smbus_info.size; + + if (size > SSD_SMBUS_BLOCK_MAX) { + ret = -EINVAL; + break; + } + + ret = ssd_smbus_read_block(dev, saddr, command, size, smb_data); + if (ret) { + break; + } + + if (copy_to_user(buf, smb_data, size)) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_BM_GET_VER: { + uint16_t ver; + + ret = ssd_bm_get_version(dev, &ver); + if (ret) { + break; + } + + if (copy_to_user(argp, &ver, sizeof(uint16_t))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_BM_GET_NR_CAP: { + int nr_cap; + + ret = ssd_bm_nr_cap(dev, &nr_cap); + if (ret) { + break; + } + + if (copy_to_user(argp, &nr_cap, sizeof(int))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_BM_CAP_LEARNING: { + ret = ssd_bm_enter_cap_learning(dev); + + if (ret) { + break; + } + + break; + } + + case SSD_CMD_CAP_LEARN: { + uint32_t cap = 0; + + ret = ssd_cap_learn(dev, &cap); + if (ret) { + break; + } + + if (copy_to_user(argp, &cap, sizeof(uint32_t))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_GET_CAP_STATUS: { + int cap_status = 0; + + if (test_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + cap_status = 1; + } + + if (copy_to_user(argp, &cap_status, sizeof(int))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_RAM_READ: { + struct ssd_ram_op_info ram_info; + uint64_t ofs; + uint32_t length; + size_t rlen, len = dev->hw_info.ram_max_len; + int ctrl_idx; + + if (copy_from_user(&ram_info, argp, sizeof(struct ssd_ram_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + ofs = ram_info.start; + length = ram_info.length; + buf = ram_info.buf; + ctrl_idx = ram_info.ctrl_idx; + + if (ofs >= dev->hw_info.ram_size || length > dev->hw_info.ram_size || 0 == length || (ofs + length) > dev->hw_info.ram_size) { + ret = -EINVAL; + break; + } + + kbuf = kmalloc(len, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + break; + } + + for (rlen=0; rlenhw_info.ram_max_len; + int ctrl_idx; + + if (copy_from_user(&ram_info, argp, sizeof(struct ssd_ram_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + ofs = ram_info.start; + length = ram_info.length; + buf = ram_info.buf; + ctrl_idx = ram_info.ctrl_idx; + + if (ofs >= dev->hw_info.ram_size || length > dev->hw_info.ram_size || 0 == length || (ofs + length) > dev->hw_info.ram_size) { + ret = -EINVAL; + break; + } + + kbuf = kmalloc(len, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + break; + } + + for (wlen=0; wlenname); + ret = -EFAULT; + break; + } + + chip_no = flash_info.flash; + chip_ce = flash_info.chip; + ctrl_idx = flash_info.ctrl_idx; + buf = flash_info.buf; + length = dev->hw_info.id_size; + + //kbuf = kmalloc(length, GFP_KERNEL); + kbuf = kmalloc(SSD_NAND_ID_BUFF_SZ, GFP_KERNEL); //xx + if (!kbuf) { + ret = -ENOMEM; + break; + } + memset(kbuf, 0, length); + + ret = ssd_nand_read_id(dev, kbuf, chip_no, chip_ce, ctrl_idx); + if (ret) { + kfree(kbuf); + break; + } + + if (copy_to_user(buf, kbuf, length)) { + kfree(kbuf); + ret = -EFAULT; + break; + } + + kfree(kbuf); + + break; + } + + case SSD_CMD_NAND_READ: { //with oob + struct ssd_flash_op_info flash_info; + uint32_t length; + int flash, chip, page, ctrl_idx; + int err = 0; + + if (copy_from_user(&flash_info, argp, sizeof(struct ssd_flash_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + flash = flash_info.flash; + chip = flash_info.chip; + page = flash_info.page; + buf = flash_info.buf; + ctrl_idx = flash_info.ctrl_idx; + + length = dev->hw_info.page_size + dev->hw_info.oob_size; + + kbuf = kmalloc(length, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + break; + } + + err = ret = ssd_nand_read_w_oob(dev, kbuf, flash, chip, page, 1, ctrl_idx); + if (ret && (-EIO != ret)) { + kfree(kbuf); + break; + } + + if (copy_to_user(buf, kbuf, length)) { + kfree(kbuf); + ret = -EFAULT; + break; + } + + ret = err; + + kfree(kbuf); + break; + } + + case SSD_CMD_NAND_WRITE: { + struct ssd_flash_op_info flash_info; + int flash, chip, page, ctrl_idx; + uint32_t length; + + if (copy_from_user(&flash_info, argp, sizeof(struct ssd_flash_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + flash = flash_info.flash; + chip = flash_info.chip; + page = flash_info.page; + buf = flash_info.buf; + ctrl_idx = flash_info.ctrl_idx; + + length = dev->hw_info.page_size + dev->hw_info.oob_size; + + kbuf = kmalloc(length, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + break; + } + + if (copy_from_user(kbuf, buf, length)) { + kfree(kbuf); + ret = -EFAULT; + break; + } + + ret = ssd_nand_write(dev, kbuf, flash, chip, page, 1, ctrl_idx); + if (ret) { + kfree(kbuf); + break; + } + + kfree(kbuf); + break; + } + + case SSD_CMD_NAND_ERASE: { + struct ssd_flash_op_info flash_info; + int flash, chip, page, ctrl_idx; + + if (copy_from_user(&flash_info, argp, sizeof(struct ssd_flash_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + flash = flash_info.flash; + chip = flash_info.chip; + page = flash_info.page; + ctrl_idx = flash_info.ctrl_idx; + + if ((page % dev->hw_info.page_count) != 0) { + ret = -EINVAL; + break; + } + + //hio_warn("erase fs = %llx\n", ofs); + ret = ssd_nand_erase(dev, flash, chip, page, ctrl_idx); + if (ret) { + break; + } + + break; + } + + case SSD_CMD_NAND_READ_EXT: { //ingore EIO + struct ssd_flash_op_info flash_info; + uint32_t length; + int flash, chip, page, ctrl_idx; + + if (copy_from_user(&flash_info, argp, sizeof(struct ssd_flash_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + flash = flash_info.flash; + chip = flash_info.chip; + page = flash_info.page; + buf = flash_info.buf; + ctrl_idx = flash_info.ctrl_idx; + + length = dev->hw_info.page_size + dev->hw_info.oob_size; + + kbuf = kmalloc(length, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + break; + } + + ret = ssd_nand_read_w_oob(dev, kbuf, flash, chip, page, 1, ctrl_idx); + if (-EIO == ret) { //ingore EIO + ret = 0; + } + if (ret) { + kfree(kbuf); + break; + } + + if (copy_to_user(buf, kbuf, length)) { + kfree(kbuf); + ret = -EFAULT; + break; + } + + kfree(kbuf); + break; + } + + case SSD_CMD_UPDATE_BBT: { + struct ssd_flash_op_info flash_info; + int ctrl_idx, flash; + + if (copy_from_user(&flash_info, argp, sizeof(struct ssd_flash_op_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + ctrl_idx = flash_info.ctrl_idx; + flash = flash_info.flash; + ret = ssd_update_bbt(dev, flash, ctrl_idx); + if (ret) { + break; + } + + break; + } + + case SSD_CMD_CLEAR_ALARM: + ssd_clear_alarm(dev); + break; + + case SSD_CMD_SET_ALARM: + ssd_set_alarm(dev); + break; + + case SSD_CMD_RESET: + ret = ssd_do_reset(dev); + break; + + case SSD_CMD_RELOAD_FW: + dev->reload_fw = 1; + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + ssd_reg32_write(dev->ctrlp + SSD_RELOAD_FW_REG, SSD_RELOAD_FLAG); + } else if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_1_1) { + ssd_reg32_write(dev->ctrlp + SSD_RELOAD_FW_REG, SSD_RELOAD_FW); + + } + break; + + case SSD_CMD_UNLOAD_DEV: { + if (atomic_read(&dev->refcnt)) { + ret = -EBUSY; + break; + } + + /* save smart */ + ssd_save_smart(dev); + + ret = ssd_flush(dev); + if (ret) { + break; + } + + /* cleanup the block device */ + if (test_and_clear_bit(SSD_INIT_BD, &dev->state)) { + mutex_lock(&dev->gd_mutex); + ssd_cleanup_blkdev(dev); + mutex_unlock(&dev->gd_mutex); + } + + break; + } + + case SSD_CMD_LOAD_DEV: { + + if (test_bit(SSD_INIT_BD, &dev->state)) { + ret = -EINVAL; + break; + } + + ret = ssd_init_smart(dev); + if (ret) { + hio_warn("%s: init info: failed\n", dev->name); + break; + } + + ret = ssd_init_blkdev(dev); + if (ret) { + hio_warn("%s: register block device: failed\n", dev->name); + break; + } + (void)test_and_set_bit(SSD_INIT_BD, &dev->state); + + break; + } + + case SSD_CMD_UPDATE_VP: { + uint32_t val; + uint32_t new_vp, new_vp1 = 0; + + if (test_bit(SSD_INIT_BD, &dev->state)) { + ret = -EINVAL; + break; + } + + if (copy_from_user(&new_vp, argp, sizeof(uint32_t))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + if (new_vp > dev->hw_info.max_valid_pages || new_vp <= 0) { + ret = -EINVAL; + break; + } + + while (new_vp <= dev->hw_info.max_valid_pages) { + ssd_reg32_write(dev->ctrlp + SSD_VALID_PAGES_REG, new_vp); + msleep(10); + val = ssd_reg32_read(dev->ctrlp + SSD_VALID_PAGES_REG); + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + new_vp1 = val & 0x3FF; + } else { + new_vp1 = val & 0x7FFF; + } + + if (new_vp1 == new_vp) { + break; + } + + new_vp++; + /*if (new_vp == dev->hw_info.valid_pages) { + new_vp++; + }*/ + } + + if (new_vp1 != new_vp || new_vp > dev->hw_info.max_valid_pages) { + /* restore */ + ssd_reg32_write(dev->ctrlp + SSD_VALID_PAGES_REG, dev->hw_info.valid_pages); + ret = -EINVAL; + break; + } + + if (copy_to_user(argp, &new_vp, sizeof(uint32_t))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ssd_reg32_write(dev->ctrlp + SSD_VALID_PAGES_REG, dev->hw_info.valid_pages); + ret = -EFAULT; + break; + } + + /* new */ + dev->hw_info.valid_pages = new_vp; + dev->hw_info.size = (uint64_t)dev->hw_info.valid_pages * dev->hw_info.page_size; + dev->hw_info.size *= (dev->hw_info.block_count - dev->hw_info.reserved_blks); + dev->hw_info.size *= ((uint64_t)dev->hw_info.nr_data_ch * (uint64_t)dev->hw_info.nr_chip * (uint64_t)dev->hw_info.nr_ctrl); + + break; + } + + case SSD_CMD_FULL_RESET: { + ret = ssd_full_reset(dev); + break; + } + + case SSD_CMD_GET_NR_LOG: { + if (copy_to_user(argp, &dev->internal_log.nr_log, sizeof(dev->internal_log.nr_log))) { + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_GET_LOG: { + uint32_t length = dev->rom_info.log_sz; + + buf = argp; + + if (copy_to_user(buf, dev->internal_log.log, length)) { + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_LOG_LEVEL: { + int level = 0; + if (copy_from_user(&level, argp, sizeof(int))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + if (level >= SSD_LOG_NR_LEVEL || level < SSD_LOG_LEVEL_INFO) { + level = SSD_LOG_LEVEL_ERR; + } + + //just for showing log, no need to protect + log_level = level; + break; + } + + case SSD_CMD_OT_PROTECT: { + int protect = 0; + + if (copy_from_user(&protect, argp, sizeof(int))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + ssd_set_ot_protect(dev, !!protect); + break; + } + + case SSD_CMD_GET_OT_STATUS: { + int status = ssd_get_ot_status(dev, &status); + + if (copy_to_user(argp, &status, sizeof(int))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_CLEAR_LOG: { + ret = ssd_clear_log(dev); + break; + } + + case SSD_CMD_CLEAR_SMART: { + ret = ssd_clear_smart(dev); + break; + } + + case SSD_CMD_SW_LOG: { + struct ssd_sw_log_info sw_log; + + if (copy_from_user(&sw_log, argp, sizeof(struct ssd_sw_log_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + ret = ssd_gen_swlog(dev, sw_log.event, sw_log.data); + break; + } + + case SSD_CMD_GET_LABEL: { + + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + ret = -EINVAL; + break; + } + + if (copy_to_user(argp, &dev->label, sizeof(struct ssd_label))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_GET_VERSION: { + struct ssd_version_info ver; + + mutex_lock(&dev->fw_mutex); + ret = __ssd_get_version(dev, &ver); + mutex_unlock(&dev->fw_mutex); + if (ret) { + break; + } + + if (copy_to_user(argp, &ver, sizeof(struct ssd_version_info))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_GET_TEMPERATURE: { + int temp; + + mutex_lock(&dev->fw_mutex); + ret = __ssd_get_temperature(dev, &temp); + mutex_unlock(&dev->fw_mutex); + if (ret) { + break; + } + + if (copy_to_user(argp, &temp, sizeof(int))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_GET_BMSTATUS: { + int status; + + mutex_lock(&dev->fw_mutex); + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + if (test_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + status = SSD_BMSTATUS_WARNING; + } else { + status = SSD_BMSTATUS_OK; + } + } else if(dev->protocol_info.ver > SSD_PROTOCOL_V3) { + ret = __ssd_bm_status(dev, &status); + } else { + status = SSD_BMSTATUS_OK; + } + mutex_unlock(&dev->fw_mutex); + if (ret) { + break; + } + + if (copy_to_user(argp, &status, sizeof(int))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_GET_LABEL2: { + void *label; + int length; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + label = &dev->label; + length = sizeof(struct ssd_label); + } else { + label = &dev->labelv3; + length = sizeof(struct ssd_labelv3); + } + + if (copy_to_user(argp, label, length)) { + ret = -EFAULT; + break; + } + break; + } + + case SSD_CMD_FLUSH: + ret = ssd_flush(dev); + if (ret) { + hio_warn("%s: ssd_flush: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + + case SSD_CMD_SAVE_MD: { + int save_md = 0; + + if (copy_from_user(&save_md, argp, sizeof(int))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + dev->save_md = !!save_md; + break; + } + + case SSD_CMD_SET_WMODE: { + int new_wmode = 0; + + if (copy_from_user(&new_wmode, argp, sizeof(int))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + ret = __ssd_set_wmode(dev, new_wmode); + if (ret) { + break; + } + + break; + } + + case SSD_CMD_GET_WMODE: { + if (copy_to_user(argp, &dev->wmode, sizeof(int))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_GET_USER_WMODE: { + if (copy_to_user(argp, &dev->user_wmode, sizeof(int))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + break; + } + + case SSD_CMD_DEBUG: { + struct ssd_debug_info db_info; + + if (!finject) { + ret = -EOPNOTSUPP; + break; + } + + if (copy_from_user(&db_info, argp, sizeof(struct ssd_debug_info))) { + hio_warn("%s: copy_from_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + + if (db_info.type < SSD_DEBUG_NONE || db_info.type >= SSD_DEBUG_NR) { + ret = -EINVAL; + break; + } + + /* IO */ + if (db_info.type >= SSD_DEBUG_READ_ERR && db_info.type <= SSD_DEBUG_RW_ERR && + (db_info.data.loc.off + db_info.data.loc.len) > (dev->hw_info.size >> 9)) { + ret = -EINVAL; + break; + } + + memcpy(&dev->db_info, &db_info, sizeof(struct ssd_debug_info)); + +#ifdef SSD_OT_PROTECT + /* temperature */ + if (db_info.type == SSD_DEBUG_NONE) { + ssd_check_temperature(dev, SSD_OT_TEMP); + } else if (db_info.type == SSD_DEBUG_LOG) { + if (db_info.data.log.event == SSD_LOG_OVER_TEMP) { + dev->ot_delay = SSD_OT_DELAY; + } else if (db_info.data.log.event == SSD_LOG_NORMAL_TEMP) { + dev->ot_delay = 0; + } + } +#endif + + /* offline */ + if (db_info.type == SSD_DEBUG_OFFLINE) { + test_and_clear_bit(SSD_ONLINE, &dev->state); + } else if (db_info.type == SSD_DEBUG_NONE) { + (void)test_and_set_bit(SSD_ONLINE, &dev->state); + } + + /* log */ + if (db_info.type == SSD_DEBUG_LOG && dev->event_call && dev->gd) { + dev->event_call(dev->gd, db_info.data.log.event, 0); + } + + break; + } + + case SSD_CMD_DRV_PARAM_INFO: { + struct ssd_drv_param_info drv_param; + + memset(&drv_param, 0, sizeof(struct ssd_drv_param_info)); + + drv_param.mode = mode; + drv_param.status_mask = status_mask; + drv_param.int_mode = int_mode; + drv_param.threaded_irq = threaded_irq; + drv_param.log_level = log_level; + drv_param.wmode = wmode; + drv_param.ot_protect = ot_protect; + drv_param.finject = finject; + + if (copy_to_user(argp, &drv_param, sizeof(struct ssd_drv_param_info))) { + hio_warn("%s: copy_to_user: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + } + + default: + ret = -EINVAL; + break; + } + + return ret; +} + + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)) +static int ssd_block_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +{ + struct ssd_device *dev; + void __user *argp = (void __user *)arg; + int ret = 0; + + if (!inode) { + return -EINVAL; + } + dev = inode->i_bdev->bd_disk->private_data; + if (!dev) { + return -EINVAL; + } +#else +static int ssd_block_ioctl(struct block_device *bdev, fmode_t mode, + unsigned int cmd, unsigned long arg) +{ + struct ssd_device *dev; + void __user *argp = (void __user *)arg; + int ret = 0; + + if (!bdev) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + if (!dev) { + return -EINVAL; + } +#endif + + switch (cmd) { + case HDIO_GETGEO: { + struct hd_geometry geo; + geo.cylinders = (dev->hw_info.size & ~0x3f) >> 6; + geo.heads = 4; + geo.sectors = 16; +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)) + geo.start = get_start_sect(inode->i_bdev); +#else + geo.start = get_start_sect(bdev); +#endif + if (copy_to_user(argp, &geo, sizeof(geo))) { + ret = -EFAULT; + break; + } + + break; + } + + case BLKFLSBUF: + ret = ssd_flush(dev); + if (ret) { + hio_warn("%s: ssd_flush: failed\n", dev->name); + ret = -EFAULT; + break; + } + break; + + default: + if (!dev->slave) { + ret = ssd_ioctl_common(dev, cmd, arg); + } else { + ret = -EFAULT; + } + break; + } + + return ret; +} + + +static void ssd_free_dev(struct kref *kref) +{ + struct ssd_device *dev; + + if (!kref) { + return; + } + + dev = container_of(kref, struct ssd_device, kref); + + put_disk(dev->gd); + + ssd_put_index(dev->slave, dev->idx); + + kfree(dev); +} + +static void ssd_put(struct ssd_device *dev) +{ + kref_put(&dev->kref, ssd_free_dev); +} + +static int ssd_get(struct ssd_device *dev) +{ + kref_get(&dev->kref); + return 0; +} + +/* block device */ +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)) +static int ssd_block_open(struct inode *inode, struct file *filp) +{ + struct ssd_device *dev; + + if (!inode) { + return -EINVAL; + } + + dev = inode->i_bdev->bd_disk->private_data; + if (!dev) { + return -EINVAL; + } +#else +static int ssd_block_open(struct block_device *bdev, fmode_t mode) +{ + struct ssd_device *dev; + + if (!bdev) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + if (!dev) { + return -EINVAL; + } +#endif + + /*if (!try_module_get(dev->owner)) + return -ENODEV; + */ + + ssd_get(dev); + + atomic_inc(&dev->refcnt); + + return 0; +} + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)) +static int ssd_block_release(struct inode *inode, struct file *filp) +{ + struct ssd_device *dev; + + if (!inode) { + return -EINVAL; + } + + dev = inode->i_bdev->bd_disk->private_data; + if (!dev) { + return -EINVAL; + } +#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(3,9,0)) +static int ssd_block_release(struct gendisk *disk, fmode_t mode) +{ + struct ssd_device *dev; + + if (!disk) { + return -EINVAL; + } + + dev = disk->private_data; + if (!dev) { + return -EINVAL; + } +#else +static void ssd_block_release(struct gendisk *disk, fmode_t mode) +{ + struct ssd_device *dev; + + if (!disk) { + return; + } + + dev = disk->private_data; + if (!dev) { + return; + } +#endif + + atomic_dec(&dev->refcnt); + + ssd_put(dev); + + //module_put(dev->owner); +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(3,9,0)) + return 0; +#endif +} + +static struct block_device_operations ssd_fops = { + .owner = THIS_MODULE, + .open = ssd_block_open, + .release = ssd_block_release, + .ioctl = ssd_block_ioctl, +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)) + .getgeo = ssd_block_getgeo, +#endif +}; + +static void ssd_init_trim(ssd_device_t *dev) +{ +#if (defined SSD_TRIM && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32))) + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + return; + } + queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, dev->rq); + +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,33)) || (defined RHEL_MAJOR && RHEL_MAJOR >= 6)) + dev->rq->limits.discard_zeroes_data = 1; + dev->rq->limits.discard_alignment = 4096; + dev->rq->limits.discard_granularity = 4096; +#endif + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2_4) { + dev->rq->limits.max_discard_sectors = dev->hw_info.sg_max_sec; + } else { + dev->rq->limits.max_discard_sectors = (dev->hw_info.sg_max_sec) * (dev->hw_info.cmd_max_sg); + } +#endif +} + +static void ssd_cleanup_queue(struct ssd_device *dev) +{ + ssd_wait_io(dev); + + blk_cleanup_queue(dev->rq); + dev->rq = NULL; +} + +static int ssd_init_queue(struct ssd_device *dev) +{ + dev->rq = blk_alloc_queue(GFP_KERNEL); + if (dev->rq == NULL) { + hio_warn("%s: alloc queue: failed\n ", dev->name); + goto out_init_queue; + } + + /* must be first */ + blk_queue_make_request(dev->rq, ssd_make_request); + +#if ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) && !(defined RHEL_MAJOR && RHEL_MAJOR == 6)) + blk_queue_max_hw_segments(dev->rq, dev->hw_info.cmd_max_sg); + blk_queue_max_phys_segments(dev->rq, dev->hw_info.cmd_max_sg); + blk_queue_max_sectors(dev->rq, dev->hw_info.sg_max_sec); +#else + blk_queue_max_segments(dev->rq, dev->hw_info.cmd_max_sg); + blk_queue_max_hw_sectors(dev->rq, dev->hw_info.sg_max_sec); +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)) + blk_queue_hardsect_size(dev->rq, 512); +#else + blk_queue_logical_block_size(dev->rq, 512); +#endif + /* not work for make_request based drivers(bio) */ + blk_queue_max_segment_size(dev->rq, dev->hw_info.sg_max_sec << 9); + + blk_queue_bounce_limit(dev->rq, BLK_BOUNCE_HIGH); + + dev->rq->queuedata = dev; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) + blk_queue_issue_flush_fn(dev->rq, ssd_issue_flush_fn); +#endif + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28)) + queue_flag_set_unlocked(QUEUE_FLAG_NONROT, dev->rq); +#endif + + ssd_init_trim(dev); + + return 0; + +out_init_queue: + return -ENOMEM; +} + +static void ssd_cleanup_blkdev(struct ssd_device *dev) +{ + del_gendisk(dev->gd); +} + +static int ssd_init_blkdev(struct ssd_device *dev) +{ + if (dev->gd) { + put_disk(dev->gd); + } + + dev->gd = alloc_disk(ssd_minors); + if (!dev->gd) { + hio_warn("%s: alloc_disk fail\n", dev->name); + goto out_alloc_gd; + } + dev->gd->major = dev->major; + dev->gd->first_minor = dev->idx * ssd_minors; + dev->gd->fops = &ssd_fops; + dev->gd->queue = dev->rq; + dev->gd->private_data = dev; + dev->gd->driverfs_dev = &dev->pdev->dev; + snprintf (dev->gd->disk_name, sizeof(dev->gd->disk_name), "%s", dev->name); + + set_capacity(dev->gd, dev->hw_info.size >> 9); + + add_disk(dev->gd); + + return 0; + +out_alloc_gd: + return -ENOMEM; +} + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,10)) +static int ssd_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) +#else +static long ssd_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +#endif +{ + struct ssd_device *dev; + + if (!file) { + return -EINVAL; + } + + dev = file->private_data; + if (!dev) { + return -EINVAL; + } + + return (long)ssd_ioctl_common(dev, cmd, arg); +} + +static int ssd_open(struct inode *inode, struct file *file) +{ + struct ssd_device *dev = NULL; + struct ssd_device *n = NULL; + int idx; + int ret = -ENODEV; + + if (!inode || !file) { + return -EINVAL; + } + + idx = iminor(inode); + + list_for_each_entry_safe(dev, n, &ssd_list, list) { + if (dev->idx == idx) { + ret = 0; + break; + } + } + + if (ret) { + return ret; + } + + file->private_data = dev; + + ssd_get(dev); + + return 0; +} + +static int ssd_release(struct inode *inode, struct file *file) +{ + struct ssd_device *dev; + + if (!file) { + return -EINVAL; + } + + dev = file->private_data; + if (!dev) { + return -EINVAL; + } + + ssd_put(dev); + + file->private_data = NULL; + + return 0; +} + +static struct file_operations ssd_cfops = { + .owner = THIS_MODULE, + .open = ssd_open, + .release = ssd_release, +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,10)) + .ioctl = ssd_ioctl, +#else + .unlocked_ioctl = ssd_ioctl, +#endif +}; + +static void ssd_cleanup_chardev(struct ssd_device *dev) +{ + if (dev->slave) { + return; + } + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)) + class_simple_device_remove(MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx)); + devfs_remove("c%s", dev->name); +#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,14)) + class_device_destroy(ssd_class, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx)); + devfs_remove("c%s", dev->name); +#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)) + class_device_destroy(ssd_class, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx)); + devfs_remove("c%s", dev->name); +#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24)) + class_device_destroy(ssd_class, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx)); +#else + device_destroy(ssd_class, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx)); +#endif +} + +static int ssd_init_chardev(struct ssd_device *dev) +{ + int ret = 0; + + if (dev->slave) { + return 0; + } + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)) + ret = devfs_mk_cdev(MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx), S_IFCHR|S_IRUSR|S_IWUSR, "c%s", dev->name); + if (ret) { + goto out; + } + class_simple_device_add(ssd_class, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx), NULL, "c%s", dev->name); +out: +#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,14)) + ret = devfs_mk_cdev(MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx), S_IFCHR|S_IRUSR|S_IWUSR, "c%s", dev->name); + if (ret) { + goto out; + } + class_device_create(ssd_class, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx), NULL, "c%s", dev->name); +out: +#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,17)) + ret = devfs_mk_cdev(MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx), S_IFCHR|S_IRUSR|S_IWUSR, "c%s", dev->name); + if (ret) { + goto out; + } + class_device_create(ssd_class, NULL, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx), NULL, "c%s", dev->name); +out: +#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24)) + class_device_create(ssd_class, NULL, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx), NULL, "c%s", dev->name); +#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,26)) + device_create(ssd_class, NULL, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx), "c%s", dev->name); +#elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)) + device_create_drvdata(ssd_class, NULL, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx), NULL, "c%s", dev->name); +#else + device_create(ssd_class, NULL, MKDEV((dev_t)dev->cmajor, (dev_t)dev->idx), NULL, "c%s", dev->name); +#endif + + return ret; +} + +static int ssd_check_hw(struct ssd_device *dev) +{ + uint32_t test_data = 0x55AA5AA5; + uint32_t read_data; + + ssd_reg32_write(dev->ctrlp + SSD_BRIDGE_TEST_REG, test_data); + read_data = ssd_reg32_read(dev->ctrlp + SSD_BRIDGE_TEST_REG); + if (read_data != ~(test_data)) { + //hio_warn("%s: check bridge error: %#x\n", dev->name, read_data); + return -1; + } + + return 0; +} + +static int ssd_check_fw(struct ssd_device *dev) +{ + uint32_t val = 0; + int i; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_1_3) { + return 0; + } + + for (i=0; ictrlp + SSD_HW_STATUS_REG); + if ((val & 0x1) && ((val >> 8) & 0x1)) { + break; + } + + msleep(SSD_INIT_WAIT); + } + + if (!(val & 0x1)) { + /* controller fw status */ + hio_warn("%s: controller firmware load failed: %#x\n", dev->name, val); + return -1; + } else if (!((val >> 8) & 0x1)) { + /* controller state */ + hio_warn("%s: controller state error: %#x\n", dev->name, val); + return -1; + } + + val = ssd_reg32_read(dev->ctrlp + SSD_RELOAD_FW_REG); + if (val) { + dev->reload_fw = 1; + } + + return 0; +} + +static int ssd_init_fw_info(struct ssd_device *dev) +{ + uint32_t val; + int ret = 0; + + val = ssd_reg32_read(dev->ctrlp + SSD_BRIDGE_VER_REG); + dev->hw_info.bridge_ver = val & 0xFFF; + if (dev->hw_info.bridge_ver < SSD_FW_MIN) { + hio_warn("%s: bridge firmware version %03X is not supported\n", dev->name, dev->hw_info.bridge_ver); + return -EINVAL; + } + hio_info("%s: bridge firmware version: %03X\n", dev->name, dev->hw_info.bridge_ver); + + ret = ssd_check_fw(dev); + if (ret) { + goto out; + } + +out: + /* skip error if not in standard mode */ + if (mode != SSD_DRV_MODE_STANDARD) { + ret = 0; + } + return ret; +} + +static int ssd_check_clock(struct ssd_device *dev) +{ + uint32_t val; + int ret = 0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_1_3) { + return 0; + } + + val = ssd_reg32_read(dev->ctrlp + SSD_HW_STATUS_REG); + + /* clock status */ + if (!((val >> 4 ) & 0x1)) { + if (!test_and_set_bit(SSD_HWMON_CLOCK(SSD_CLOCK_166M_LOST), &dev->hwmon)) { + hio_warn("%s: 166MHz clock losed: %#x\n", dev->name, val); + ssd_gen_swlog(dev, SSD_LOG_CLK_FAULT, val); + } + ret = -1; + } + + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + if (!((val >> 5 ) & 0x1)) { + if (!test_and_set_bit(SSD_HWMON_CLOCK(SSD_CLOCK_166M_SKEW), &dev->hwmon)) { + hio_warn("%s: 166MHz clock is skew: %#x\n", dev->name, val); + ssd_gen_swlog(dev, SSD_LOG_CLK_FAULT, val); + } + ret = -1; + } + if (!((val >> 6 ) & 0x1)) { + if (!test_and_set_bit(SSD_HWMON_CLOCK(SSD_CLOCK_156M_LOST), &dev->hwmon)) { + hio_warn("%s: 156.25MHz clock lost: %#x\n", dev->name, val); + ssd_gen_swlog(dev, SSD_LOG_CLK_FAULT, val); + } + ret = -1; + } + if (!((val >> 7 ) & 0x1)) { + if (!test_and_set_bit(SSD_HWMON_CLOCK(SSD_CLOCK_156M_SKEW), &dev->hwmon)) { + hio_warn("%s: 156.25MHz clock is skew: %#x\n", dev->name, val); + ssd_gen_swlog(dev, SSD_LOG_CLK_FAULT, val); + } + ret = -1; + } + } + + return ret; +} + +static int ssd_check_volt(struct ssd_device *dev) +{ + int i = 0; + uint64_t val; + uint32_t adc_val; + int ret =0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + return 0; + } + + for (i=0; ihw_info.nr_ctrl; i++) { + /* 1.0v */ + if (!test_bit(SSD_HWMON_FPGA(i, SSD_FPGA_1V0), &dev->hwmon)) { + val = ssd_reg_read(dev->ctrlp + SSD_FPGA_1V0_REG0 + i * SSD_CTRL_REG_ZONE_SZ); + adc_val = SSD_FPGA_VOLT_MAX(val); + if (adc_val < SSD_FPGA_1V0_ADC_MIN || adc_val > SSD_FPGA_1V0_ADC_MAX) { + (void)test_and_set_bit(SSD_HWMON_FPGA(i, SSD_FPGA_1V0), &dev->hwmon); + hio_warn("%s: controller %d 1.0V fault: %d mV.\n", dev->name, i, SSD_FPGA_VOLT(adc_val)); + ssd_gen_swlog(dev, SSD_LOG_VOLT_FAULT, SSD_VOLT_LOG_DATA(SSD_FPGA_1V0, i, adc_val)); + ret = -1; + } + + adc_val = SSD_FPGA_VOLT_MIN(val); + if (adc_val < SSD_FPGA_1V0_ADC_MIN || adc_val > SSD_FPGA_1V0_ADC_MAX) { + (void)test_and_set_bit(SSD_HWMON_FPGA(i, SSD_FPGA_1V0), &dev->hwmon); + hio_warn("%s: controller %d 1.0V fault: %d mV.\n", dev->name, i, SSD_FPGA_VOLT(adc_val)); + ssd_gen_swlog(dev, SSD_LOG_VOLT_FAULT, SSD_VOLT_LOG_DATA(SSD_FPGA_1V0, i, adc_val)); + ret = -2; + } + } + + /* 1.8v */ + if (!test_bit(SSD_HWMON_FPGA(i, SSD_FPGA_1V8), &dev->hwmon)) { + val = ssd_reg_read(dev->ctrlp + SSD_FPGA_1V8_REG0 + i * SSD_CTRL_REG_ZONE_SZ); + adc_val = SSD_FPGA_VOLT_MAX(val); + if (adc_val < SSD_FPGA_1V8_ADC_MIN || adc_val > SSD_FPGA_1V8_ADC_MAX) { + (void)test_and_set_bit(SSD_HWMON_FPGA(i, SSD_FPGA_1V8), &dev->hwmon); + hio_warn("%s: controller %d 1.8V fault: %d mV.\n", dev->name, i, SSD_FPGA_VOLT(adc_val)); + ssd_gen_swlog(dev, SSD_LOG_VOLT_FAULT, SSD_VOLT_LOG_DATA(SSD_FPGA_1V8, i, adc_val)); + ret = -3; + } + + adc_val = SSD_FPGA_VOLT_MIN(val); + if (adc_val < SSD_FPGA_1V8_ADC_MIN || adc_val > SSD_FPGA_1V8_ADC_MAX) { + (void)test_and_set_bit(SSD_HWMON_FPGA(i, SSD_FPGA_1V8), &dev->hwmon); + hio_warn("%s: controller %d 1.8V fault: %d mV.\n", dev->name, i, SSD_FPGA_VOLT(adc_val)); + ssd_gen_swlog(dev, SSD_LOG_VOLT_FAULT, SSD_VOLT_LOG_DATA(SSD_FPGA_1V8, i, adc_val)); + ret = -4; + } + } + } + + return ret; +} + +static int ssd_check_reset_sync(struct ssd_device *dev) +{ + uint32_t val; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_1_3) { + return 0; + } + + val = ssd_reg32_read(dev->ctrlp + SSD_HW_STATUS_REG); + if (!((val >> 8) & 0x1)) { + /* controller state */ + hio_warn("%s: controller state error: %#x\n", dev->name, val); + return -1; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + return 0; + } + + if (((val >> 9 ) & 0x1)) { + hio_warn("%s: controller reset asynchronously: %#x\n", dev->name, val); + ssd_gen_swlog(dev, SSD_LOG_CTRL_RST_SYNC, val); + return -1; + } + + return 0; +} + +static int ssd_check_hw_bh(struct ssd_device *dev) +{ + int ret; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_1_3) { + return 0; + } + + /* clock status */ + ret = ssd_check_clock(dev); + if (ret) { + goto out; + } + +out: + /* skip error if not in standard mode */ + if (mode != SSD_DRV_MODE_STANDARD) { + ret = 0; + } + return ret; +} + +static int ssd_check_controller(struct ssd_device *dev) +{ + int ret; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_1_3) { + return 0; + } + + /* sync reset */ + ret = ssd_check_reset_sync(dev); + if (ret) { + goto out; + } + +out: + /* skip error if not in standard mode */ + if (mode != SSD_DRV_MODE_STANDARD) { + ret = 0; + } + return ret; +} + +static int ssd_check_controller_bh(struct ssd_device *dev) +{ + uint32_t test_data = 0x55AA5AA5; + uint32_t val; + int reg_base, reg_sz; + int init_wait = 0; + int i; + int ret = 0; + + if (mode != SSD_DRV_MODE_STANDARD) { + return 0; + } + + /* controller */ + val = ssd_reg32_read(dev->ctrlp + SSD_READY_REG); + if (val & 0x1) { + hio_warn("%s: controller 0 not ready\n", dev->name); + return -1; + } + + for (i=0; ihw_info.nr_ctrl; i++) { + reg_base = SSD_CTRL_TEST_REG0 + i * SSD_CTRL_TEST_REG_SZ; + ssd_reg32_write(dev->ctrlp + reg_base, test_data); + val = ssd_reg32_read(dev->ctrlp + reg_base); + if (val != ~(test_data)) { + hio_warn("%s: check controller %d error: %#x\n", dev->name, i, val); + return -1; + } + } + + /* clock */ + ret = ssd_check_volt(dev); + if (ret) { + return ret; + } + + /* ddr */ + if (dev->protocol_info.ver > SSD_PROTOCOL_V3) { + reg_base = SSD_PV3_RAM_STATUS_REG0; + reg_sz = SSD_PV3_RAM_STATUS_REG_SZ; + + for (i=0; ihw_info.nr_ctrl; i++) { +check_ram_status: + val = ssd_reg32_read(dev->ctrlp + reg_base); + + if (!((val >> 1) & 0x1)) { + init_wait++; + if (init_wait <= SSD_RAM_INIT_MAX_WAIT) { + msleep(SSD_INIT_WAIT); + goto check_ram_status; + } else { + hio_warn("%s: controller %d ram init failed: %#x\n", dev->name, i, val); + ssd_gen_swlog(dev, SSD_LOG_DDR_INIT_ERR, i); + return -1; + } + } + + reg_base += reg_sz; + } + } + + /* ch info */ + for (i=0; ictrlp + SSD_CH_INFO_REG); + if (!((val >> 31) & 0x1)) { + break; + } + + msleep(SSD_INIT_WAIT); + } + if ((val >> 31) & 0x1) { + hio_warn("%s: channel info init failed: %#x\n", dev->name, val); + return -1; + } + + return 0; +} + +static int ssd_init_protocol_info(struct ssd_device *dev) +{ + uint32_t val; + + val = ssd_reg32_read(dev->ctrlp + SSD_PROTOCOL_VER_REG); + if (val == (uint32_t)-1) { + hio_warn("%s: protocol version error: %#x\n", dev->name, val); + return -EINVAL; + } + dev->protocol_info.ver = val; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + dev->protocol_info.init_state_reg = SSD_INIT_STATE_REG0; + dev->protocol_info.init_state_reg_sz = SSD_INIT_STATE_REG_SZ; + + dev->protocol_info.chip_info_reg = SSD_CHIP_INFO_REG0; + dev->protocol_info.chip_info_reg_sz = SSD_CHIP_INFO_REG_SZ; + } else { + dev->protocol_info.init_state_reg = SSD_PV3_INIT_STATE_REG0; + dev->protocol_info.init_state_reg_sz = SSD_PV3_INIT_STATE_REG_SZ; + + dev->protocol_info.chip_info_reg = SSD_PV3_CHIP_INFO_REG0; + dev->protocol_info.chip_info_reg_sz = SSD_PV3_CHIP_INFO_REG_SZ; + } + + return 0; +} + +static int ssd_init_hw_info(struct ssd_device *dev) +{ + uint64_t val64; + uint32_t val; + uint32_t nr_ctrl; + int ret = 0; + + /* base info */ + val = ssd_reg32_read(dev->ctrlp + SSD_RESP_INFO_REG); + dev->hw_info.resp_ptr_sz = 16 * (1U << (val & 0xFF)); + dev->hw_info.resp_msg_sz = 16 * (1U << ((val >> 8) & 0xFF)); + + if (0 == dev->hw_info.resp_ptr_sz || 0 == dev->hw_info.resp_msg_sz) { + hio_warn("%s: response info error\n", dev->name); + ret = -EINVAL; + goto out; + } + + val = ssd_reg32_read(dev->ctrlp + SSD_BRIDGE_INFO_REG); + dev->hw_info.cmd_fifo_sz = 1U << ((val >> 4) & 0xF); + dev->hw_info.cmd_max_sg = 1U << ((val >> 8) & 0xF); + dev->hw_info.sg_max_sec = 1U << ((val >> 12) & 0xF); + dev->hw_info.cmd_fifo_sz_mask = dev->hw_info.cmd_fifo_sz - 1; + + if (0 == dev->hw_info.cmd_fifo_sz || 0 == dev->hw_info.cmd_max_sg || 0 == dev->hw_info.sg_max_sec) { + hio_warn("%s: cmd info error\n", dev->name); + ret = -EINVAL; + goto out; + } + + /* check hw */ + if (ssd_check_hw_bh(dev)) { + hio_warn("%s: check hardware status failed\n", dev->name); + ret = -EINVAL; + goto out; + } + + if (ssd_check_controller(dev)) { + hio_warn("%s: check controller state failed\n", dev->name); + ret = -EINVAL; + goto out; + } + + /* nr controller : read again*/ + val = ssd_reg32_read(dev->ctrlp + SSD_BRIDGE_INFO_REG); + dev->hw_info.nr_ctrl = (val >> 16) & 0xF; + + /* nr ctrl configured */ + nr_ctrl = (val >> 20) & 0xF; + if (0 == dev->hw_info.nr_ctrl) { + hio_warn("%s: nr controller error: %u\n", dev->name, dev->hw_info.nr_ctrl); + ret = -EINVAL; + goto out; + } else if (0 != nr_ctrl && nr_ctrl != dev->hw_info.nr_ctrl) { + hio_warn("%s: nr controller error: configured %u but found %u\n", dev->name, nr_ctrl, dev->hw_info.nr_ctrl); + if (mode <= SSD_DRV_MODE_STANDARD) { + ret = -EINVAL; + goto out; + } + } + + if (ssd_check_controller_bh(dev)) { + hio_warn("%s: check controller failed\n", dev->name); + ret = -EINVAL; + goto out; + } + + val = ssd_reg32_read(dev->ctrlp + SSD_PCB_VER_REG); + dev->hw_info.pcb_ver = (uint8_t) ((val >> 4) & 0xF) + 'A' -1; + if ((val & 0xF) != 0xF) { + dev->hw_info.upper_pcb_ver = (uint8_t) (val & 0xF) + 'A' -1; + } + + if (dev->hw_info.pcb_ver < 'A' || (0 != dev->hw_info.upper_pcb_ver && dev->hw_info.upper_pcb_ver < 'A')) { + hio_warn("%s: PCB version error: %#x %#x\n", dev->name, dev->hw_info.pcb_ver, dev->hw_info.upper_pcb_ver); + ret = -EINVAL; + goto out; + } + + /* channel info */ + if (mode <= SSD_DRV_MODE_DEBUG) { + val = ssd_reg32_read(dev->ctrlp + SSD_CH_INFO_REG); + dev->hw_info.nr_data_ch = val & 0xFF; + dev->hw_info.nr_ch = dev->hw_info.nr_data_ch + ((val >> 8) & 0xFF); + dev->hw_info.nr_chip = (val >> 16) & 0xFF; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + dev->hw_info.max_ch = 1; + while (dev->hw_info.max_ch < dev->hw_info.nr_ch) dev->hw_info.max_ch <<= 1; + } else { + /* set max channel 32 */ + dev->hw_info.max_ch = 32; + } + + if (0 == dev->hw_info.nr_chip) { + //for debug mode + dev->hw_info.nr_chip = 1; + } + + //xx + dev->hw_info.id_size = SSD_NAND_ID_SZ; + dev->hw_info.max_ce = SSD_NAND_MAX_CE; + + if (0 == dev->hw_info.nr_data_ch || 0 == dev->hw_info.nr_ch || 0 == dev->hw_info.nr_chip) { + hio_warn("%s: channel info error: data_ch %u ch %u chip %u\n", dev->name, dev->hw_info.nr_data_ch, dev->hw_info.nr_ch, dev->hw_info.nr_chip); + ret = -EINVAL; + goto out; + } + } + + /* ram info */ + if (mode <= SSD_DRV_MODE_DEBUG) { + val = ssd_reg32_read(dev->ctrlp + SSD_RAM_INFO_REG); + dev->hw_info.ram_size = 0x4000000ull * (1ULL << (val & 0xF)); + dev->hw_info.ram_align = 1U << ((val >> 12) & 0xF); + if (dev->hw_info.ram_align < SSD_RAM_ALIGN) { + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + dev->hw_info.ram_align = SSD_RAM_ALIGN; + } else { + hio_warn("%s: ram align error: %u\n", dev->name, dev->hw_info.ram_align); + ret = -EINVAL; + goto out; + } + } + dev->hw_info.ram_max_len = 0x1000 * (1U << ((val >> 16) & 0xF)); + + if (0 == dev->hw_info.ram_size || 0 == dev->hw_info.ram_align || 0 == dev->hw_info.ram_max_len || dev->hw_info.ram_align > dev->hw_info.ram_max_len) { + hio_warn("%s: ram info error\n", dev->name); + ret = -EINVAL; + goto out; + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + dev->hw_info.log_sz = SSD_LOG_MAX_SZ; + } else { + val = ssd_reg32_read(dev->ctrlp + SSD_LOG_INFO_REG); + dev->hw_info.log_sz = 0x1000 * (1U << (val & 0xFF)); + } + if (0 == dev->hw_info.log_sz) { + hio_warn("%s: log size error\n", dev->name); + ret = -EINVAL; + goto out; + } + + val = ssd_reg32_read(dev->ctrlp + SSD_BBT_BASE_REG); + dev->hw_info.bbt_base = 0x40000ull * (val & 0xFFFF); + dev->hw_info.bbt_size = 0x40000 * (((val >> 16) & 0xFFFF) + 1) / (dev->hw_info.max_ch * dev->hw_info.nr_chip); + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + if (dev->hw_info.bbt_base > dev->hw_info.ram_size || 0 == dev->hw_info.bbt_size) { + hio_warn("%s: bbt info error\n", dev->name); + ret = -EINVAL; + goto out; + } + } + + val = ssd_reg32_read(dev->ctrlp + SSD_ECT_BASE_REG); + dev->hw_info.md_base = 0x40000ull * (val & 0xFFFF); + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + dev->hw_info.md_size = 0x40000 * (((val >> 16) & 0xFFF) + 1) / (dev->hw_info.max_ch * dev->hw_info.nr_chip); + } else { + dev->hw_info.md_size = 0x40000 * (((val >> 16) & 0xFFF) + 1) / (dev->hw_info.nr_chip); + } + dev->hw_info.md_entry_sz = 8 * (1U << ((val >> 28) & 0xF)); + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3) { + if (dev->hw_info.md_base > dev->hw_info.ram_size || 0 == dev->hw_info.md_size || + 0 == dev->hw_info.md_entry_sz || dev->hw_info.md_entry_sz > dev->hw_info.md_size) { + hio_warn("%s: md info error\n", dev->name); + ret = -EINVAL; + goto out; + } + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + dev->hw_info.nand_wbuff_base = dev->hw_info.ram_size + 1; + } else { + val = ssd_reg32_read(dev->ctrlp + SSD_NAND_BUFF_BASE); + dev->hw_info.nand_wbuff_base = 0x8000ull * val; + } + } + + /* flash info */ + if (mode <= SSD_DRV_MODE_DEBUG) { + if (dev->hw_info.nr_ctrl > 1) { + val = ssd_reg32_read(dev->ctrlp + SSD_CTRL_VER_REG); + dev->hw_info.ctrl_ver = val & 0xFFF; + hio_info("%s: controller firmware version: %03X\n", dev->name, dev->hw_info.ctrl_ver); + } + + val64 = ssd_reg_read(dev->ctrlp + SSD_FLASH_INFO_REG0); + dev->hw_info.nand_vendor_id = ((val64 >> 56) & 0xFF); + dev->hw_info.nand_dev_id = ((val64 >> 48) & 0xFF); + + dev->hw_info.block_count = (((val64 >> 32) & 0xFFFF) + 1); + dev->hw_info.page_count = ((val64>>16) & 0xFFFF); + dev->hw_info.page_size = (val64 & 0xFFFF); + + val = ssd_reg32_read(dev->ctrlp + SSD_BB_INFO_REG); + dev->hw_info.bbf_pages = val & 0xFF; + dev->hw_info.bbf_seek = (val >> 8) & 0x1; + + if (0 == dev->hw_info.block_count || 0 == dev->hw_info.page_count || 0 == dev->hw_info.page_size || dev->hw_info.block_count > INT_MAX) { + hio_warn("%s: flash info error\n", dev->name); + ret = -EINVAL; + goto out; + } + + //xx + dev->hw_info.oob_size = SSD_NAND_OOB_SZ; //(dev->hw_info.page_size) >> 5; + + val = ssd_reg32_read(dev->ctrlp + SSD_VALID_PAGES_REG); + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + dev->hw_info.valid_pages = val & 0x3FF; + dev->hw_info.max_valid_pages = (val>>20) & 0x3FF; + } else { + dev->hw_info.valid_pages = val & 0x7FFF; + dev->hw_info.max_valid_pages = (val>>15) & 0x7FFF; + } + if (0 == dev->hw_info.valid_pages || 0 == dev->hw_info.max_valid_pages || + dev->hw_info.valid_pages > dev->hw_info.max_valid_pages || dev->hw_info.max_valid_pages > dev->hw_info.page_count) { + hio_warn("%s: valid page info error: valid_pages %d, max_valid_pages %d\n", dev->name, dev->hw_info.valid_pages, dev->hw_info.max_valid_pages); + ret = -EINVAL; + goto out; + } + + val = ssd_reg32_read(dev->ctrlp + SSD_RESERVED_BLKS_REG); + dev->hw_info.reserved_blks = val & 0xFFFF; + dev->hw_info.md_reserved_blks = (val >> 16) & 0xFF; + if (dev->protocol_info.ver <= SSD_PROTOCOL_V3) { + dev->hw_info.md_reserved_blks = SSD_BBT_RESERVED; + } + if (dev->hw_info.reserved_blks > dev->hw_info.block_count || dev->hw_info.md_reserved_blks > dev->hw_info.block_count) { + hio_warn("%s: reserved blocks info error: reserved_blks %d, md_reserved_blks %d\n", dev->name, dev->hw_info.reserved_blks, dev->hw_info.md_reserved_blks); + ret = -EINVAL; + goto out; + } + } + + /* size */ + if (mode < SSD_DRV_MODE_DEBUG) { + dev->hw_info.size = (uint64_t)dev->hw_info.valid_pages * dev->hw_info.page_size; + dev->hw_info.size *= (dev->hw_info.block_count - dev->hw_info.reserved_blks); + dev->hw_info.size *= ((uint64_t)dev->hw_info.nr_data_ch * (uint64_t)dev->hw_info.nr_chip * (uint64_t)dev->hw_info.nr_ctrl); + } + + /* extend hardware info */ + val = ssd_reg32_read(dev->ctrlp + SSD_PCB_VER_REG); + dev->hw_info_ext.board_type = (val >> 24) & 0xF; + + dev->hw_info_ext.form_factor = SSD_FORM_FACTOR_FHHL; + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2_1) { + dev->hw_info_ext.form_factor = (val >> 31) & 0x1; + } + /* + dev->hw_info_ext.cap_type = (val >> 28) & 0x3; + if (SSD_BM_CAP_VINA != dev->hw_info_ext.cap_type && SSD_BM_CAP_JH != dev->hw_info_ext.cap_type) { + dev->hw_info_ext.cap_type = SSD_BM_CAP_VINA; + }*/ + + /* power loss protect */ + val = ssd_reg32_read(dev->ctrlp + SSD_PLP_INFO_REG); + dev->hw_info_ext.plp_type = (val & 0x3); + if (dev->protocol_info.ver >= SSD_PROTOCOL_V3_2) { + /* 3 or 4 cap */ + dev->hw_info_ext.cap_type = ((val >> 2)& 0x1); + } + + /* work mode */ + val = ssd_reg32_read(dev->ctrlp + SSD_CH_INFO_REG); + dev->hw_info_ext.work_mode = (val >> 25) & 0x1; + +out: + /* skip error if not in standard mode */ + if (mode != SSD_DRV_MODE_STANDARD) { + ret = 0; + } + return ret; +} + +static void ssd_cleanup_response(struct ssd_device *dev) +{ + int resp_msg_sz = dev->hw_info.resp_msg_sz * dev->hw_info.cmd_fifo_sz * SSD_MSIX_VEC; + int resp_ptr_sz = dev->hw_info.resp_ptr_sz * SSD_MSIX_VEC; + + pci_free_consistent(dev->pdev, resp_ptr_sz, dev->resp_ptr_base, dev->resp_ptr_base_dma); + pci_free_consistent(dev->pdev, resp_msg_sz, dev->resp_msg_base, dev->resp_msg_base_dma); +} + +static int ssd_init_response(struct ssd_device *dev) +{ + int resp_msg_sz = dev->hw_info.resp_msg_sz * dev->hw_info.cmd_fifo_sz * SSD_MSIX_VEC; + int resp_ptr_sz = dev->hw_info.resp_ptr_sz * SSD_MSIX_VEC; + + dev->resp_msg_base = pci_alloc_consistent(dev->pdev, resp_msg_sz, &(dev->resp_msg_base_dma)); + if (!dev->resp_msg_base) { + hio_warn("%s: unable to allocate resp msg DMA buffer\n", dev->name); + goto out_alloc_resp_msg; + } + memset(dev->resp_msg_base, 0xFF, resp_msg_sz); + + dev->resp_ptr_base = pci_alloc_consistent(dev->pdev, resp_ptr_sz, &(dev->resp_ptr_base_dma)); + if (!dev->resp_ptr_base){ + hio_warn("%s: unable to allocate resp ptr DMA buffer\n", dev->name); + goto out_alloc_resp_ptr; + } + memset(dev->resp_ptr_base, 0, resp_ptr_sz); + dev->resp_idx = *(uint32_t *)(dev->resp_ptr_base) = dev->hw_info.cmd_fifo_sz * 2 - 1; + + ssd_reg_write(dev->ctrlp + SSD_RESP_FIFO_REG, dev->resp_msg_base_dma); + ssd_reg_write(dev->ctrlp + SSD_RESP_PTR_REG, dev->resp_ptr_base_dma); + + return 0; + +out_alloc_resp_ptr: + pci_free_consistent(dev->pdev, resp_msg_sz, dev->resp_msg_base, dev->resp_msg_base_dma); +out_alloc_resp_msg: + return -ENOMEM; +} + +static int ssd_cleanup_cmd(struct ssd_device *dev) +{ + int msg_sz = ALIGN(sizeof(struct ssd_rw_msg) + (dev->hw_info.cmd_max_sg - 1) * sizeof(struct ssd_sg_entry), SSD_DMA_ALIGN); + int i; + + for (i=0; i<(int)dev->hw_info.cmd_fifo_sz; i++) { + kfree(dev->cmd[i].sgl); + } + kfree(dev->cmd); + pci_free_consistent(dev->pdev, (msg_sz * dev->hw_info.cmd_fifo_sz), dev->msg_base, dev->msg_base_dma); + return 0; +} + +static int ssd_init_cmd(struct ssd_device *dev) +{ + int sgl_sz = sizeof(struct scatterlist) * dev->hw_info.cmd_max_sg; + int cmd_sz = sizeof(struct ssd_cmd) * dev->hw_info.cmd_fifo_sz; + int msg_sz = ALIGN(sizeof(struct ssd_rw_msg) + (dev->hw_info.cmd_max_sg - 1) * sizeof(struct ssd_sg_entry), SSD_DMA_ALIGN); + int i; + + spin_lock_init(&dev->cmd_lock); + + dev->msg_base = pci_alloc_consistent(dev->pdev, (msg_sz * dev->hw_info.cmd_fifo_sz), &dev->msg_base_dma); + if (!dev->msg_base) { + hio_warn("%s: can not alloc cmd msg\n", dev->name); + goto out_alloc_msg; + } + + dev->cmd = kmalloc(cmd_sz, GFP_KERNEL); + if (!dev->cmd) { + hio_warn("%s: can not alloc cmd\n", dev->name); + goto out_alloc_cmd; + } + memset(dev->cmd, 0, cmd_sz); + + for (i=0; i<(int)dev->hw_info.cmd_fifo_sz; i++) { + dev->cmd[i].sgl = kmalloc(sgl_sz, GFP_KERNEL); + if (!dev->cmd[i].sgl) { + hio_warn("%s: can not alloc cmd sgl %d\n", dev->name, i); + goto out_alloc_sgl; + } + + dev->cmd[i].msg = dev->msg_base + (msg_sz * i); + dev->cmd[i].msg_dma = dev->msg_base_dma + ((dma_addr_t)msg_sz * i); + + dev->cmd[i].dev = dev; + dev->cmd[i].tag = i; + dev->cmd[i].flag = 0; + + INIT_LIST_HEAD(&dev->cmd[i].list); + } + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3) { + dev->scmd = ssd_dispatch_cmd; + } else { + ssd_reg_write(dev->ctrlp + SSD_MSG_BASE_REG, dev->msg_base_dma); + if (finject) { + dev->scmd = ssd_send_cmd_db; + } else { + dev->scmd = ssd_send_cmd; + } + } + + return 0; + +out_alloc_sgl: + for (i--; i>=0; i--) { + kfree(dev->cmd[i].sgl); + } + kfree(dev->cmd); +out_alloc_cmd: + pci_free_consistent(dev->pdev, (msg_sz * dev->hw_info.cmd_fifo_sz), dev->msg_base, dev->msg_base_dma); +out_alloc_msg: + return -ENOMEM; +} + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) +static irqreturn_t ssd_interrupt_check(int irq, void *dev_id) +{ + struct ssd_queue *queue = (struct ssd_queue *)dev_id; + + if (*(uint32_t *)queue->resp_ptr == queue->resp_idx) { + return IRQ_NONE; + } + + return IRQ_WAKE_THREAD; +} + +static irqreturn_t ssd_interrupt_threaded(int irq, void *dev_id) +{ + struct ssd_queue *queue = (struct ssd_queue *)dev_id; + struct ssd_device *dev = (struct ssd_device *)queue->dev; + struct ssd_cmd *cmd; + union ssd_response_msq __msg; + union ssd_response_msq *msg = &__msg; + uint64_t *u64_msg; + uint32_t resp_idx = queue->resp_idx; + uint32_t new_resp_idx = *(uint32_t *)queue->resp_ptr; + uint32_t end_resp_idx; + + if (unlikely(resp_idx == new_resp_idx)) { + return IRQ_NONE; + } + + end_resp_idx = new_resp_idx & queue->resp_idx_mask; + + do { + resp_idx = (resp_idx + 1) & queue->resp_idx_mask; + + /* the resp msg */ + u64_msg = (uint64_t *)(queue->resp_msg + queue->resp_msg_sz * resp_idx); + msg->u64_msg = *u64_msg; + + if (unlikely(msg->u64_msg == (uint64_t)(-1))) { + hio_err("%s: empty resp msg: queue %d idx %u\n", dev->name, queue->idx, resp_idx); + continue; + } + /* clear the resp msg */ + *u64_msg = (uint64_t)(-1); + + cmd = &queue->cmd[msg->resp_msg.tag]; + /*if (unlikely(!cmd->bio)) { + printk(KERN_WARNING "%s: unknown tag %d fun %#x\n", + dev->name, msg->resp_msg.tag, msg->resp_msg.fun); + continue; + }*/ + + if(unlikely(msg->resp_msg.status & (uint32_t)status_mask)) { + cmd->errors = -EIO; + } else { + cmd->errors = 0; + } + cmd->nr_log = msg->log_resp_msg.nr_log; + + ssd_done(cmd); + + if (unlikely(msg->resp_msg.fun != SSD_FUNC_READ_LOG && msg->resp_msg.log > 0)) { + (void)test_and_set_bit(SSD_LOG_HW, &dev->state); + if (test_bit(SSD_INIT_WORKQ, &dev->state)) { + queue_work(dev->workq, &dev->log_work); + } + } + + if (unlikely(msg->resp_msg.status)) { + if (msg->resp_msg.fun == SSD_FUNC_READ || msg->resp_msg.fun == SSD_FUNC_WRITE) { + hio_err("%s: I/O error %d: tag %d fun %#x\n", + dev->name, msg->resp_msg.status, msg->resp_msg.tag, msg->resp_msg.fun); + + /* alarm led */ + ssd_set_alarm(dev); + queue->io_stat.nr_rwerr++; + ssd_gen_swlog(dev, SSD_LOG_EIO, msg->u32_msg[0]); + } else { + hio_info("%s: CMD error %d: tag %d fun %#x\n", + dev->name, msg->resp_msg.status, msg->resp_msg.tag, msg->resp_msg.fun); + + ssd_gen_swlog(dev, SSD_LOG_ECMD, msg->u32_msg[0]); + } + queue->io_stat.nr_ioerr++; + } + + if (msg->resp_msg.fun == SSD_FUNC_READ || + msg->resp_msg.fun == SSD_FUNC_NAND_READ_WOOB || + msg->resp_msg.fun == SSD_FUNC_NAND_READ) { + + queue->ecc_info.bitflip[msg->resp_msg.bitflip]++; + } + }while (resp_idx != end_resp_idx); + + queue->resp_idx = new_resp_idx; + + return IRQ_HANDLED; +} +#endif + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static irqreturn_t ssd_interrupt(int irq, void *dev_id, struct pt_regs *regs) +#else +static irqreturn_t ssd_interrupt(int irq, void *dev_id) +#endif +{ + struct ssd_queue *queue = (struct ssd_queue *)dev_id; + struct ssd_device *dev = (struct ssd_device *)queue->dev; + struct ssd_cmd *cmd; + union ssd_response_msq __msg; + union ssd_response_msq *msg = &__msg; + uint64_t *u64_msg; + uint32_t resp_idx = queue->resp_idx; + uint32_t new_resp_idx = *(uint32_t *)queue->resp_ptr; + uint32_t end_resp_idx; + + if (unlikely(resp_idx == new_resp_idx)) { + return IRQ_NONE; + } + +#if (defined SSD_ESCAPE_IRQ) + if (SSD_INT_MSIX != dev->int_mode) { + dev->irq_cpu = smp_processor_id(); + } +#endif + + end_resp_idx = new_resp_idx & queue->resp_idx_mask; + + do { + resp_idx = (resp_idx + 1) & queue->resp_idx_mask; + + /* the resp msg */ + u64_msg = (uint64_t *)(queue->resp_msg + queue->resp_msg_sz * resp_idx); + msg->u64_msg = *u64_msg; + + if (unlikely(msg->u64_msg == (uint64_t)(-1))) { + hio_err("%s: empty resp msg: queue %d idx %u\n", dev->name, queue->idx, resp_idx); + continue; + } + /* clear the resp msg */ + *u64_msg = (uint64_t)(-1); + + cmd = &queue->cmd[msg->resp_msg.tag]; + /*if (unlikely(!cmd->bio)) { + printk(KERN_WARNING "%s: unknown tag %d fun %#x\n", + dev->name, msg->resp_msg.tag, msg->resp_msg.fun); + continue; + }*/ + + if(unlikely(msg->resp_msg.status & (uint32_t)status_mask)) { + cmd->errors = -EIO; + } else { + cmd->errors = 0; + } + cmd->nr_log = msg->log_resp_msg.nr_log; + + ssd_done_bh(cmd); + + if (unlikely(msg->resp_msg.fun != SSD_FUNC_READ_LOG && msg->resp_msg.log > 0)) { + (void)test_and_set_bit(SSD_LOG_HW, &dev->state); + if (test_bit(SSD_INIT_WORKQ, &dev->state)) { + queue_work(dev->workq, &dev->log_work); + } + } + + if (unlikely(msg->resp_msg.status)) { + if (msg->resp_msg.fun == SSD_FUNC_READ || msg->resp_msg.fun == SSD_FUNC_WRITE) { + hio_err("%s: I/O error %d: tag %d fun %#x\n", + dev->name, msg->resp_msg.status, msg->resp_msg.tag, msg->resp_msg.fun); + + /* alarm led */ + ssd_set_alarm(dev); + queue->io_stat.nr_rwerr++; + ssd_gen_swlog(dev, SSD_LOG_EIO, msg->u32_msg[0]); + } else { + hio_info("%s: CMD error %d: tag %d fun %#x\n", + dev->name, msg->resp_msg.status, msg->resp_msg.tag, msg->resp_msg.fun); + + ssd_gen_swlog(dev, SSD_LOG_ECMD, msg->u32_msg[0]); + } + queue->io_stat.nr_ioerr++; + } + + if (msg->resp_msg.fun == SSD_FUNC_READ || + msg->resp_msg.fun == SSD_FUNC_NAND_READ_WOOB || + msg->resp_msg.fun == SSD_FUNC_NAND_READ) { + + queue->ecc_info.bitflip[msg->resp_msg.bitflip]++; + } + }while (resp_idx != end_resp_idx); + + queue->resp_idx = new_resp_idx; + + return IRQ_HANDLED; +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) +static irqreturn_t ssd_interrupt_legacy(int irq, void *dev_id, struct pt_regs *regs) +#else +static irqreturn_t ssd_interrupt_legacy(int irq, void *dev_id) +#endif +{ + irqreturn_t ret; + struct ssd_queue *queue = (struct ssd_queue *)dev_id; + struct ssd_device *dev = (struct ssd_device *)queue->dev; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)) + ret = ssd_interrupt(irq, dev_id, regs); +#else + ret = ssd_interrupt(irq, dev_id); +#endif + + /* clear intr */ + if (IRQ_HANDLED == ret) { + ssd_reg32_write(dev->ctrlp + SSD_CLEAR_INTR_REG, 1); + } + + return ret; +} + +static void ssd_reset_resp_ptr(struct ssd_device *dev) +{ + int i; + + for (i=0; inr_queue; i++) { + *(uint32_t *)dev->queue[i].resp_ptr = dev->queue[i].resp_idx = (dev->hw_info.cmd_fifo_sz * 2) - 1; + } +} + +static void ssd_free_irq(struct ssd_device *dev) +{ + int i; + +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) || (defined RHEL_MAJOR && RHEL_MAJOR == 6)) + if (SSD_INT_MSIX == dev->int_mode) { + for (i=0; inr_queue; i++) { + irq_set_affinity_hint(dev->entry[i].vector, NULL); + } + } +#endif + + for (i=0; inr_queue; i++) { + free_irq(dev->entry[i].vector, &dev->queue[i]); + } + + if (SSD_INT_MSIX == dev->int_mode) { + pci_disable_msix(dev->pdev); + } else if (SSD_INT_MSI == dev->int_mode) { + pci_disable_msi(dev->pdev); + } + +} + +static int ssd_init_irq(struct ssd_device *dev) +{ +#if (!defined MODULE) && (defined SSD_MSIX_AFFINITY_FORCE) + const struct cpumask *cpu_mask; + static int cpu_affinity = 0; +#endif +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) || (defined RHEL_MAJOR && RHEL_MAJOR == 6)) + const struct cpumask *mask; + static int cpu = 0; + int j; +#endif + int i; + unsigned long flags = 0; + int ret = 0; + + ssd_reg32_write(dev->ctrlp + SSD_INTR_INTERVAL_REG, 0x800); + +#ifdef SSD_ESCAPE_IRQ + dev->irq_cpu = -1; +#endif + + if (int_mode >= SSD_INT_MSIX && pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) { + dev->nr_queue = SSD_MSIX_VEC; + for (i=0; inr_queue; i++) { + dev->entry[i].entry = i; + } + for (;;) { + ret = pci_enable_msix(dev->pdev, dev->entry, dev->nr_queue); + if (ret == 0) { + break; + } else if (ret > 0) { + dev->nr_queue = ret; + } else { + hio_warn("%s: can not enable msix\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out; + } + } + +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) || (defined RHEL_MAJOR && RHEL_MAJOR == 6)) + mask = (dev_to_node(&dev->pdev->dev) == -1) ? cpu_online_mask : cpumask_of_node(dev_to_node(&dev->pdev->dev)); + if ((0 == cpu) || (!cpumask_intersects(mask, cpumask_of(cpu)))) { + cpu = cpumask_first(mask); + } + for (i=0; inr_queue; i++) { + irq_set_affinity_hint(dev->entry[i].vector, cpumask_of(cpu)); + cpu = cpumask_next(cpu, mask); + if (cpu >= nr_cpu_ids) { + cpu = cpumask_first(mask); + } + } +#endif + + dev->int_mode = SSD_INT_MSIX; + } else if (int_mode >= SSD_INT_MSI && pci_find_capability(dev->pdev, PCI_CAP_ID_MSI)) { + ret = pci_enable_msi(dev->pdev); + if (ret) { + hio_warn("%s: can not enable msi\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out; + } + + dev->nr_queue = 1; + dev->entry[0].vector = dev->pdev->irq; + + dev->int_mode = SSD_INT_MSI; + } else { + dev->nr_queue = 1; + dev->entry[0].vector = dev->pdev->irq; + + dev->int_mode = SSD_INT_LEGACY; + } + + for (i=0; inr_queue; i++) { + if (dev->nr_queue > 1) { + snprintf(dev->queue[i].name, SSD_QUEUE_NAME_LEN, "%s_e100-%d", dev->name, i); + } else { + snprintf(dev->queue[i].name, SSD_QUEUE_NAME_LEN, "%s_e100", dev->name); + } + + dev->queue[i].dev = dev; + dev->queue[i].idx = i; + + dev->queue[i].resp_idx = (dev->hw_info.cmd_fifo_sz * 2) - 1; + dev->queue[i].resp_idx_mask = dev->hw_info.cmd_fifo_sz - 1; + + dev->queue[i].resp_msg_sz = dev->hw_info.resp_msg_sz; + dev->queue[i].resp_msg = dev->resp_msg_base + dev->hw_info.resp_msg_sz * dev->hw_info.cmd_fifo_sz * i; + dev->queue[i].resp_ptr = dev->resp_ptr_base + dev->hw_info.resp_ptr_sz * i; + *(uint32_t *)dev->queue[i].resp_ptr = dev->queue[i].resp_idx; + + dev->queue[i].cmd = dev->cmd; + } + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)) + flags = IRQF_SHARED; +#else + flags = SA_SHIRQ; +#endif + + for (i=0; inr_queue; i++) { +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) + if (threaded_irq) { + ret = request_threaded_irq(dev->entry[i].vector, ssd_interrupt_check, ssd_interrupt_threaded, flags, dev->queue[i].name, &dev->queue[i]); + } else if (dev->int_mode == SSD_INT_LEGACY) { + ret = request_irq(dev->entry[i].vector, &ssd_interrupt_legacy, flags, dev->queue[i].name, &dev->queue[i]); + } else { + ret = request_irq(dev->entry[i].vector, &ssd_interrupt, flags, dev->queue[i].name, &dev->queue[i]); + } +#else + if (dev->int_mode == SSD_INT_LEGACY) { + ret = request_irq(dev->entry[i].vector, &ssd_interrupt_legacy, flags, dev->queue[i].name, &dev->queue[i]); + } else { + ret = request_irq(dev->entry[i].vector, &ssd_interrupt, flags, dev->queue[i].name, &dev->queue[i]); + } +#endif + if (ret) { + hio_warn("%s: request irq failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_request_irq; + } + +#if (!defined MODULE) && (defined SSD_MSIX_AFFINITY_FORCE) + cpu_mask = (dev_to_node(&dev->pdev->dev) == -1) ? cpu_online_mask : cpumask_of_node(dev_to_node(&dev->pdev->dev)); + if (SSD_INT_MSIX == dev->int_mode) { + if ((0 == cpu_affinity) || (!cpumask_intersects(mask, cpumask_of(cpu_affinity)))) { + cpu_affinity = cpumask_first(cpu_mask); + } + + irq_set_affinity(dev->entry[i].vector, cpumask_of(cpu_affinity)); + cpu_affinity = cpumask_next(cpu_affinity, cpu_mask); + if (cpu_affinity >= nr_cpu_ids) { + cpu_affinity = cpumask_first(cpu_mask); + } + } +#endif + } + + return ret; + +out_request_irq: +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) || (defined RHEL_MAJOR && RHEL_MAJOR == 6)) + if (SSD_INT_MSIX == dev->int_mode) { + for (j=0; jnr_queue; j++) { + irq_set_affinity_hint(dev->entry[j].vector, NULL); + } + } +#endif + + for (i--; i>=0; i--) { + free_irq(dev->entry[i].vector, &dev->queue[i]); + } + + if (SSD_INT_MSIX == dev->int_mode) { + pci_disable_msix(dev->pdev); + } else if (SSD_INT_MSI == dev->int_mode) { + pci_disable_msi(dev->pdev); + } + +out: + return ret; +} + +static void ssd_initial_log(struct ssd_device *dev) +{ + uint32_t val; + uint32_t speed, width; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + return; + } + + val = ssd_reg32_read(dev->ctrlp + SSD_POWER_ON_REG); + if (val) { + ssd_gen_swlog(dev, SSD_LOG_POWER_ON, dev->hw_info.bridge_ver); + } + + val = ssd_reg32_read(dev->ctrlp + SSD_PCIE_LINKSTATUS_REG); + speed = val & 0xF; + width = (val >> 4)& 0x3F; + if (0x1 == speed) { + hio_info("%s: PCIe: 2.5GT/s, x%u\n", dev->name, width); + } else if (0x2 == speed) { + hio_info("%s: PCIe: 5GT/s, x%u\n", dev->name, width); + } else { + hio_info("%s: PCIe: unknown GT/s, x%u\n", dev->name, width); + } + ssd_gen_swlog(dev, SSD_LOG_PCIE_LINK_STATUS, val); + + return; +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) +static void ssd_hwmon_worker(void *data) +{ + struct ssd_device *dev = (struct ssd_device *)data; +#else +static void ssd_hwmon_worker(struct work_struct *work) +{ + struct ssd_device *dev = container_of(work, struct ssd_device, hwmon_work); +#endif + + if (ssd_check_hw(dev)) { + //hio_err("%s: check hardware failed\n", dev->name); + return; + } + + ssd_check_clock(dev); + ssd_check_volt(dev); + + ssd_mon_boardvolt(dev); +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) +static void ssd_tempmon_worker(void *data) +{ + struct ssd_device *dev = (struct ssd_device *)data; +#else +static void ssd_tempmon_worker(struct work_struct *work) +{ + struct ssd_device *dev = container_of(work, struct ssd_device, tempmon_work); +#endif + + if (ssd_check_hw(dev)) { + //hio_err("%s: check hardware failed\n", dev->name); + return; + } + + ssd_mon_temp(dev); +} + + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) +static void ssd_capmon_worker(void *data) +{ + struct ssd_device *dev = (struct ssd_device *)data; +#else +static void ssd_capmon_worker(struct work_struct *work) +{ + struct ssd_device *dev = container_of(work, struct ssd_device, capmon_work); +#endif + uint32_t cap = 0; + uint32_t cap_threshold = SSD_PL_CAP_THRESHOLD; + int ret = 0; + + if (dev->protocol_info.ver < SSD_PROTOCOL_V3_2) { + return; + } + + if (dev->hw_info_ext.form_factor == SSD_FORM_FACTOR_FHHL && dev->hw_info.pcb_ver < 'B') { + return; + } + + /* fault before? */ + if (test_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + ret = ssd_check_pl_cap_fast(dev); + if (ret) { + return; + } + } + + /* learn */ + ret = ssd_do_cap_learn(dev, &cap); + if (ret) { + hio_err("%s: cap learn failed\n", dev->name); + ssd_gen_swlog(dev, SSD_LOG_CAP_LEARN_FAULT, 0); + return; + } + + ssd_gen_swlog(dev, SSD_LOG_CAP_STATUS, cap); + + if (SSD_PL_CAP_CP == dev->hw_info_ext.cap_type) { + cap_threshold = SSD_PL_CAP_CP_THRESHOLD; + } + + //use the fw event id? + if (cap < cap_threshold) { + if (!test_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_BATTERY_FAULT, 0); + } + } else if (cap >= (cap_threshold + SSD_PL_CAP_THRESHOLD_HYST)) { + if (test_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon)) { + ssd_gen_swlog(dev, SSD_LOG_BATTERY_OK, 0); + } + } +} + +static void ssd_routine_start(void *data) +{ + struct ssd_device *dev; + + if (!data) { + return; + } + dev = data; + + dev->routine_tick++; + + if (test_bit(SSD_INIT_WORKQ, &dev->state) && !ssd_busy(dev)) { + (void)test_and_set_bit(SSD_LOG_HW, &dev->state); + queue_work(dev->workq, &dev->log_work); + } + + if ((dev->routine_tick % SSD_HWMON_ROUTINE_TICK) == 0 && test_bit(SSD_INIT_WORKQ, &dev->state)) { + queue_work(dev->workq, &dev->hwmon_work); + } + + if ((dev->routine_tick % SSD_CAPMON_ROUTINE_TICK) == 0 && test_bit(SSD_INIT_WORKQ, &dev->state)) { + queue_work(dev->workq, &dev->capmon_work); + } + + if ((dev->routine_tick % SSD_CAPMON2_ROUTINE_TICK) == 0 && test_bit(SSD_HWMON_PL_CAP(SSD_PL_CAP), &dev->hwmon) && test_bit(SSD_INIT_WORKQ, &dev->state)) { + /* CAP fault? check again */ + queue_work(dev->workq, &dev->capmon_work); + } + + if (test_bit(SSD_INIT_WORKQ, &dev->state)) { + queue_work(dev->workq, &dev->tempmon_work); + } + + /* schedule routine */ + mod_timer(&dev->routine_timer, jiffies + msecs_to_jiffies(SSD_ROUTINE_INTERVAL)); +} + +static void ssd_cleanup_routine(struct ssd_device *dev) +{ + if (unlikely(mode != SSD_DRV_MODE_STANDARD)) + return; + + (void)ssd_del_timer(&dev->routine_timer); + + (void)ssd_del_timer(&dev->bm_timer); +} + +static int ssd_init_routine(struct ssd_device *dev) +{ + if (unlikely(mode != SSD_DRV_MODE_STANDARD)) + return 0; + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) + INIT_WORK(&dev->bm_work, ssd_bm_worker, dev); + INIT_WORK(&dev->hwmon_work, ssd_hwmon_worker, dev); + INIT_WORK(&dev->capmon_work, ssd_capmon_worker, dev); + INIT_WORK(&dev->tempmon_work, ssd_tempmon_worker, dev); +#else + INIT_WORK(&dev->bm_work, ssd_bm_worker); + INIT_WORK(&dev->hwmon_work, ssd_hwmon_worker); + INIT_WORK(&dev->capmon_work, ssd_capmon_worker); + INIT_WORK(&dev->tempmon_work, ssd_tempmon_worker); +#endif + + /* initial log */ + ssd_initial_log(dev); + + /* schedule bm routine */ + ssd_add_timer(&dev->bm_timer, msecs_to_jiffies(SSD_BM_CAP_LEARNING_DELAY), ssd_bm_routine_start, dev); + + /* schedule routine */ + ssd_add_timer(&dev->routine_timer, msecs_to_jiffies(SSD_ROUTINE_INTERVAL), ssd_routine_start, dev); + + return 0; +} + +static void +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) +__devexit +#endif +ssd_remove_one (struct pci_dev *pdev) +{ + struct ssd_device *dev; + + if (!pdev) { + return; + } + + dev = pci_get_drvdata(pdev); + if (!dev) { + return; + } + + list_del_init(&dev->list); + + ssd_unregister_sysfs(dev); + + /* offline firstly */ + test_and_clear_bit(SSD_ONLINE, &dev->state); + + /* clean work queue first */ + if (!dev->slave) { + test_and_clear_bit(SSD_INIT_WORKQ, &dev->state); + ssd_cleanup_workq(dev); + } + + /* flush cache */ + (void)ssd_flush(dev); + (void)ssd_save_md(dev); + + /* save smart */ + if (!dev->slave) { + ssd_save_smart(dev); + } + + if (test_and_clear_bit(SSD_INIT_BD, &dev->state)) { + ssd_cleanup_blkdev(dev); + } + + if (!dev->slave) { + ssd_cleanup_chardev(dev); + } + + /* clean routine */ + if (!dev->slave) { + ssd_cleanup_routine(dev); + } + + ssd_cleanup_queue(dev); + + ssd_cleanup_tag(dev); + ssd_cleanup_thread(dev); + + ssd_free_irq(dev); + + ssd_cleanup_dcmd(dev); + ssd_cleanup_cmd(dev); + ssd_cleanup_response(dev); + + if (!dev->slave) { + ssd_cleanup_log(dev); + } + + if (dev->reload_fw) { //reload fw + ssd_reg32_write(dev->ctrlp + SSD_RELOAD_FW_REG, SSD_RELOAD_FW); + } + + /* unmap physical adress */ +#ifdef LINUX_SUSE_OS + iounmap(dev->ctrlp); +#else + pci_iounmap(pdev, dev->ctrlp); +#endif + + release_mem_region(dev->mmio_base, dev->mmio_len); + + pci_disable_device(pdev); + + pci_set_drvdata(pdev, NULL); + + ssd_put(dev); +} + +static int +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) +__devinit +#endif +ssd_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + struct ssd_device *dev; + int ret = 0; + + if (!pdev || !ent) { + ret = -EINVAL; + goto out; + } + + dev = kmalloc(sizeof(struct ssd_device), GFP_KERNEL); + if (!dev) { + ret = -ENOMEM; + goto out_alloc_dev; + } + memset(dev, 0, sizeof(struct ssd_device)); + + dev->owner = THIS_MODULE; + + if (SSD_SLAVE_PORT_DEVID == ent->device) { + dev->slave = 1; + } + + dev->idx = ssd_get_index(dev->slave); + if (dev->idx < 0) { + ret = -ENOMEM; + goto out_get_index; + } + + if (!dev->slave) { + snprintf(dev->name, SSD_DEV_NAME_LEN, SSD_DEV_NAME); + ssd_set_dev_name(&dev->name[strlen(SSD_DEV_NAME)], SSD_DEV_NAME_LEN-strlen(SSD_DEV_NAME), dev->idx); + + dev->major = ssd_major; + dev->cmajor = ssd_cmajor; + } else { + snprintf(dev->name, SSD_DEV_NAME_LEN, SSD_SDEV_NAME); + ssd_set_dev_name(&dev->name[strlen(SSD_SDEV_NAME)], SSD_DEV_NAME_LEN-strlen(SSD_SDEV_NAME), dev->idx); + dev->major = ssd_major_sl; + dev->cmajor = 0; + } + + atomic_set(&(dev->refcnt), 0); + atomic_set(&(dev->tocnt), 0); + + mutex_init(&dev->fw_mutex); + + //xx + mutex_init(&dev->gd_mutex); + + dev->pdev = pdev; + pci_set_drvdata(pdev, dev); + + kref_init(&dev->kref); + + ret = pci_enable_device(pdev); + if (ret) { + hio_warn("%s: can not enable device\n", dev->name); + goto out_enable_device; + } + + pci_set_master(pdev); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)) + ret = pci_set_dma_mask(pdev, DMA_64BIT_MASK); +#else + ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(64)); +#endif + if (ret) { + hio_warn("%s: set dma mask: failed\n", dev->name); + goto out_set_dma_mask; + } + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)) + ret = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK); +#else + ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); +#endif + if (ret) { + hio_warn("%s: set consistent dma mask: failed\n", dev->name); + goto out_set_dma_mask; + } + + dev->mmio_base = pci_resource_start(pdev, 0); + dev->mmio_len = pci_resource_len(pdev, 0); + + if (!request_mem_region(dev->mmio_base, dev->mmio_len, SSD_DEV_NAME)) { + hio_warn("%s: can not reserve MMIO region 0\n", dev->name); + ret = -EBUSY; + goto out_request_mem_region; + } + + /* 2.6.9 kernel bug */ + dev->ctrlp = pci_iomap(pdev, 0, 0); + if (!dev->ctrlp) { + hio_warn("%s: can not remap IO region 0\n", dev->name); + ret = -ENOMEM; + goto out_pci_iomap; + } + + ret = ssd_check_hw(dev); + if (ret) { + hio_err("%s: check hardware failed\n", dev->name); + goto out_check_hw; + } + + ret = ssd_init_protocol_info(dev); + if (ret) { + hio_err("%s: init protocol info failed\n", dev->name); + goto out_init_protocol_info; + } + + /* alarm led ? */ + ssd_clear_alarm(dev); + + ret = ssd_init_fw_info(dev); + if (ret) { + hio_err("%s: init firmware info failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_init_fw_info; + } + + /* slave port ? */ + if (dev->slave) { + goto init_next1; + } + + ret = ssd_init_rom_info(dev); + if (ret) { + hio_err("%s: init rom info failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_init_rom_info; + } + + ret = ssd_init_label(dev); + if (ret) { + hio_err("%s: init label failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_init_label; + } + + ret = ssd_init_workq(dev); + if (ret) { + hio_warn("%s: init workq failed\n", dev->name); + goto out_init_workq; + } + (void)test_and_set_bit(SSD_INIT_WORKQ, &dev->state); + + ret = ssd_init_log(dev); + if (ret) { + hio_err("%s: init log failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_init_log; + } + + ret = ssd_init_smart(dev); + if (ret) { + hio_err("%s: init info failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_init_smart; + } + +init_next1: + ret = ssd_init_hw_info(dev); + if (ret) { + hio_err("%s: init hardware info failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_init_hw_info; + } + + /* slave port ? */ + if (dev->slave) { + goto init_next2; + } + + ret = ssd_init_sensor(dev); + if (ret) { + hio_err("%s: init sensor failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_init_sensor; + } + + ret = ssd_init_pl_cap(dev); + if (ret) { + hio_err("%s: int pl_cap failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_init_pl_cap; + } + +init_next2: + ret = ssd_check_init_state(dev); + if (ret) { + hio_err("%s: check init state failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_check_init_state; + } + + ret = ssd_init_response(dev); + if (ret) { + hio_warn("%s: init resp_msg failed\n", dev->name); + goto out_init_response; + } + + ret = ssd_init_cmd(dev); + if (ret) { + hio_warn("%s: init msg failed\n", dev->name); + goto out_init_cmd; + } + + ret = ssd_init_dcmd(dev); + if (ret) { + hio_warn("%s: init cmd failed\n", dev->name); + goto out_init_dcmd; + } + + ret = ssd_init_irq(dev); + if (ret) { + hio_warn("%s: init irq failed\n", dev->name); + goto out_init_irq; + } + + ret = ssd_init_thread(dev); + if (ret) { + hio_warn("%s: init thread failed\n", dev->name); + goto out_init_thread; + } + + ret = ssd_init_tag(dev); + if(ret) { + hio_warn("%s: init tags failed\n", dev->name); + goto out_init_tags; + } + + /* */ + (void)test_and_set_bit(SSD_ONLINE, &dev->state); + + ret = ssd_init_queue(dev); + if (ret) { + hio_warn("%s: init queue failed\n", dev->name); + goto out_init_queue; + } + + /* slave port ? */ + if (dev->slave) { + goto init_next3; + } + + ret = ssd_init_ot_protect(dev); + if (ret) { + hio_err("%s: int ot_protect failed\n", dev->name); + /* alarm led */ + ssd_set_alarm(dev); + goto out_int_ot_protect; + } + + ret = ssd_init_wmode(dev); + if (ret) { + hio_warn("%s: init write mode\n", dev->name); + goto out_init_wmode; + } + + /* init routine after hw is ready */ + ret = ssd_init_routine(dev); + if (ret) { + hio_warn("%s: init routine\n", dev->name); + goto out_init_routine; + } + + ret = ssd_init_chardev(dev); + if (ret) { + hio_warn("%s: register char device failed\n", dev->name); + goto out_init_chardev; + } + +init_next3: + ret = ssd_init_blkdev(dev); + if (ret) { + hio_warn("%s: register block device failed\n", dev->name); + goto out_init_blkdev; + } + (void)test_and_set_bit(SSD_INIT_BD, &dev->state); + + ret = ssd_register_sysfs(dev); + if (ret) { + hio_warn("%s: register sysfs failed\n", dev->name); + goto out_register_sysfs; + } + + dev->save_md = 1; + + list_add_tail(&dev->list, &ssd_list); + + return 0; + +out_register_sysfs: + test_and_clear_bit(SSD_INIT_BD, &dev->state); + ssd_cleanup_blkdev(dev); +out_init_blkdev: + /* slave port ? */ + if (!dev->slave) { + ssd_cleanup_chardev(dev); + } +out_init_chardev: + /* slave port ? */ + if (!dev->slave) { + ssd_cleanup_routine(dev); + } +out_init_routine: +out_init_wmode: +out_int_ot_protect: + ssd_cleanup_queue(dev); +out_init_queue: + test_and_clear_bit(SSD_ONLINE, &dev->state); + ssd_cleanup_tag(dev); +out_init_tags: + ssd_cleanup_thread(dev); +out_init_thread: + ssd_free_irq(dev); +out_init_irq: + ssd_cleanup_dcmd(dev); +out_init_dcmd: + ssd_cleanup_cmd(dev); +out_init_cmd: + ssd_cleanup_response(dev); +out_init_response: +out_check_init_state: +out_init_pl_cap: +out_init_sensor: +out_init_hw_info: +out_init_smart: + /* slave port ? */ + if (!dev->slave) { + ssd_cleanup_log(dev); + } +out_init_log: + /* slave port ? */ + if (!dev->slave) { + test_and_clear_bit(SSD_INIT_WORKQ, &dev->state); + ssd_cleanup_workq(dev); + } +out_init_workq: +out_init_label: +out_init_rom_info: +out_init_fw_info: +out_init_protocol_info: +out_check_hw: +#ifdef LINUX_SUSE_OS + iounmap(dev->ctrlp); +#else + pci_iounmap(pdev, dev->ctrlp); +#endif +out_pci_iomap: + release_mem_region(dev->mmio_base, dev->mmio_len); +out_request_mem_region: +out_set_dma_mask: + pci_disable_device(pdev); +out_enable_device: + pci_set_drvdata(pdev, NULL); +out_get_index: + kfree(dev); +out_alloc_dev: +out: + return ret; +} + +static void ssd_cleanup_tasklet(void) +{ + int i; + for_each_online_cpu(i) { + tasklet_kill(&per_cpu(ssd_tasklet, i)); + } +} + +static int ssd_init_tasklet(void) +{ + int i; + + for_each_online_cpu(i) { + INIT_LIST_HEAD(&per_cpu(ssd_doneq, i)); + + if (finject) { + tasklet_init(&per_cpu(ssd_tasklet, i), __ssd_done_db, 0); + } else { + tasklet_init(&per_cpu(ssd_tasklet, i), __ssd_done, 0); + } + } + + return 0; +} + +static struct pci_device_id ssd_pci_tbl[] = { + { 0x10ee, 0x0007, PCI_ANY_ID, PCI_ANY_ID, }, /* g3 */ + { 0x19e5, 0x0007, PCI_ANY_ID, PCI_ANY_ID, }, /* v1 */ + //{ 0x19e5, 0x0008, PCI_ANY_ID, PCI_ANY_ID, }, /* v1 sp*/ + { 0x19e5, 0x0009, PCI_ANY_ID, PCI_ANY_ID, }, /* v2 */ + { 0x19e5, 0x000a, PCI_ANY_ID, PCI_ANY_ID, }, /* v2 dp slave*/ + { 0, } +}; +MODULE_DEVICE_TABLE(pci, ssd_pci_tbl); + +static struct pci_driver ssd_driver = { + .name = MODULE_NAME, + .id_table = ssd_pci_tbl, + .probe = ssd_init_one, +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,38)) + .remove = __devexit_p(ssd_remove_one), +#else + .remove = ssd_remove_one, +#endif +}; + +/* notifier block to get a notify on system shutdown/halt/reboot */ +static int ssd_notify_reboot(struct notifier_block *nb, unsigned long event, void *buf) +{ + struct ssd_device *dev = NULL; + struct ssd_device *n = NULL; + + list_for_each_entry_safe(dev, n, &ssd_list, list) { + ssd_gen_swlog(dev, SSD_LOG_POWER_OFF, 0); + + (void)ssd_flush(dev); + (void)ssd_save_md(dev); + + /* slave port ? */ + if (!dev->slave) { + ssd_save_smart(dev); + + ssd_stop_workq(dev); + + if (dev->reload_fw) { + ssd_reg32_write(dev->ctrlp + SSD_RELOAD_FW_REG, SSD_RELOAD_FW); + } + } + } + + return NOTIFY_OK; +} + +static struct notifier_block ssd_notifier = { + ssd_notify_reboot, NULL, 0 +}; + +static int __init ssd_init_module(void) +{ + int ret = 0; + + hio_info("driver version: %s\n", DRIVER_VERSION); + + ret = ssd_init_index(); + if (ret) { + hio_warn("init index failed\n"); + goto out_init_index; + } + + ret = ssd_init_proc(); + if (ret) { + hio_warn("init proc failed\n"); + goto out_init_proc; + } + + ret = ssd_init_sysfs(); + if (ret) { + hio_warn("init sysfs failed\n"); + goto out_init_sysfs; + } + + ret = ssd_init_tasklet(); + if (ret) { + hio_warn("init tasklet failed\n"); + goto out_init_tasklet; + } + +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)) + ssd_class = class_simple_create(THIS_MODULE, SSD_DEV_NAME); +#else + ssd_class = class_create(THIS_MODULE, SSD_DEV_NAME); +#endif + if (IS_ERR(ssd_class)) { + ret = PTR_ERR(ssd_class); + goto out_class_create; + } + + if (ssd_cmajor > 0) { + ret = register_chrdev(ssd_cmajor, SSD_CDEV_NAME, &ssd_cfops); + } else { + ret = ssd_cmajor = register_chrdev(ssd_cmajor, SSD_CDEV_NAME, &ssd_cfops); + } + if (ret < 0) { + hio_warn("unable to register chardev major number\n"); + goto out_register_chardev; + } + + if (ssd_major > 0) { + ret = register_blkdev(ssd_major, SSD_DEV_NAME); + } else { + ret = ssd_major = register_blkdev(ssd_major, SSD_DEV_NAME); + } + if (ret < 0) { + hio_warn("unable to register major number\n"); + goto out_register_blkdev; + } + + if (ssd_major_sl > 0) { + ret = register_blkdev(ssd_major_sl, SSD_SDEV_NAME); + } else { + ret = ssd_major_sl = register_blkdev(ssd_major_sl, SSD_SDEV_NAME); + } + if (ret < 0) { + hio_warn("unable to register slave major number\n"); + goto out_register_blkdev_sl; + } + + if (mode < SSD_DRV_MODE_STANDARD || mode > SSD_DRV_MODE_BASE) { + mode = SSD_DRV_MODE_STANDARD; + } + + /* for debug */ + if (mode != SSD_DRV_MODE_STANDARD) { + ssd_minors = 1; + } + + if (int_mode < SSD_INT_LEGACY || int_mode > SSD_INT_MSIX) { + int_mode = SSD_INT_MODE_DEFAULT; + } + + if (threaded_irq) { + int_mode = SSD_INT_MSI; + } + + if (log_level >= SSD_LOG_NR_LEVEL || log_level < SSD_LOG_LEVEL_INFO) { + log_level = SSD_LOG_LEVEL_ERR; + } + + if (wmode < SSD_WMODE_BUFFER || wmode > SSD_WMODE_DEFAULT) { + wmode = SSD_WMODE_DEFAULT; + } + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)) + ret = pci_module_init(&ssd_driver); +#else + ret = pci_register_driver(&ssd_driver); +#endif + if (ret) { + hio_warn("pci init failed\n"); + goto out_pci_init; + } + + ret = register_reboot_notifier(&ssd_notifier); + if (ret) { + hio_warn("register reboot notifier failed\n"); + goto out_register_reboot_notifier; + } + + return 0; + +out_register_reboot_notifier: +out_pci_init: + pci_unregister_driver(&ssd_driver); + unregister_blkdev(ssd_major_sl, SSD_SDEV_NAME); +out_register_blkdev_sl: + unregister_blkdev(ssd_major, SSD_DEV_NAME); +out_register_blkdev: + unregister_chrdev(ssd_cmajor, SSD_CDEV_NAME); +out_register_chardev: +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)) + class_simple_destroy(ssd_class); +#else + class_destroy(ssd_class); +#endif +out_class_create: + ssd_cleanup_tasklet(); +out_init_tasklet: + ssd_cleanup_sysfs(); +out_init_sysfs: + ssd_cleanup_proc(); +out_init_proc: + ssd_cleanup_index(); +out_init_index: + return ret; + +} + +static void __exit ssd_cleanup_module(void) +{ + + hio_info("unload driver: %s\n", DRIVER_VERSION); + /* exiting */ + ssd_exiting = 1; + + unregister_reboot_notifier(&ssd_notifier); + + pci_unregister_driver(&ssd_driver); + + unregister_blkdev(ssd_major_sl, SSD_SDEV_NAME); + unregister_blkdev(ssd_major, SSD_DEV_NAME); + unregister_chrdev(ssd_cmajor, SSD_CDEV_NAME); +#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)) + class_simple_destroy(ssd_class); +#else + class_destroy(ssd_class); +#endif + + ssd_cleanup_tasklet(); + ssd_cleanup_sysfs(); + ssd_cleanup_proc(); + ssd_cleanup_index(); +} + +int ssd_register_event_notifier(struct block_device *bdev, ssd_event_call event_call) +{ + struct ssd_device *dev; + struct timeval tv; + struct ssd_log *le; + uint64_t cur; + int log_nr; + + if (!bdev || !event_call || !(bdev->bd_disk)) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + dev->event_call = event_call; + + do_gettimeofday(&tv); + cur = tv.tv_sec; + + le = (struct ssd_log *)(dev->internal_log.log); + log_nr = dev->internal_log.nr_log; + + while (log_nr--) { + if (le->time <= cur && le->time >= dev->uptime) { + (void)dev->event_call(dev->gd, le->le.event, ssd_parse_log(dev, le, 0)); + } + le++; + } + + return 0; +} + +int ssd_unregister_event_notifier(struct block_device *bdev) +{ + struct ssd_device *dev; + + if (!bdev || !(bdev->bd_disk)) { + return -EINVAL; + } + + dev = bdev->bd_disk->private_data; + dev->event_call = NULL; + + return 0; +} + +EXPORT_SYMBOL(ssd_get_label); +EXPORT_SYMBOL(ssd_get_version); +EXPORT_SYMBOL(ssd_set_otprotect); +EXPORT_SYMBOL(ssd_bm_status); +EXPORT_SYMBOL(ssd_submit_pbio); +EXPORT_SYMBOL(ssd_get_pciaddr); +EXPORT_SYMBOL(ssd_get_temperature); +EXPORT_SYMBOL(ssd_register_event_notifier); +EXPORT_SYMBOL(ssd_unregister_event_notifier); +EXPORT_SYMBOL(ssd_reset); +EXPORT_SYMBOL(ssd_set_wmode); + + + +module_init(ssd_init_module); +module_exit(ssd_cleanup_module); +MODULE_VERSION(DRIVER_VERSION); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Huawei SSD DEV Team"); +MODULE_DESCRIPTION("Huawei SSD driver"); --- linux-azure-6.5.0.orig/ubuntu/hio/hio.h +++ linux-azure-6.5.0/ubuntu/hio/hio.h @@ -0,0 +1,104 @@ +/* +* Huawei SSD device driver +* Copyright (c) 2016, Huawei Technologies Co., Ltd. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms and conditions of the GNU General Public License, +* version 2, as published by the Free Software Foundation. +* +* This program is distributed in the hope it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +*/ + +#ifndef _HIO_H +#define _HIO_H + +#include +#include +#include +#include + + + +typedef int (*ssd_event_call)(struct gendisk *, int, int); /* gendisk, event id, event level */ +extern int ssd_register_event_notifier(struct block_device *bdev, ssd_event_call event_call); +/* unregister event notifier before module exit */ +extern int ssd_unregister_event_notifier(struct block_device *bdev); + + +/* label */ +#define SSD_LABEL_FIELD_SZ 32 +#define SSD_SN_SZ 16 + +typedef struct ssd_label +{ + char date[SSD_LABEL_FIELD_SZ]; + char sn[SSD_LABEL_FIELD_SZ]; + char part[SSD_LABEL_FIELD_SZ]; + char desc[SSD_LABEL_FIELD_SZ]; + char other[SSD_LABEL_FIELD_SZ]; + char maf[SSD_LABEL_FIELD_SZ]; +} ssd_label_t; + + +/* version */ +typedef struct ssd_version_info +{ + uint32_t bridge_ver; /* bridge fw version: hex */ + uint32_t ctrl_ver; /* controller fw version: hex */ + uint32_t bm_ver; /* battery manager fw version: hex */ + uint8_t pcb_ver; /* main pcb version: char */ + uint8_t upper_pcb_ver; + uint8_t pad0; + uint8_t pad1; +} ssd_version_info_t; + +extern int ssd_get_label(struct block_device *bdev, struct ssd_label *label); +extern int ssd_get_version(struct block_device *bdev, struct ssd_version_info *ver); +extern int ssd_get_temperature(struct block_device *bdev, int *temp); + + +enum ssd_bmstatus +{ + SSD_BMSTATUS_OK = 0, + SSD_BMSTATUS_CHARGING, + SSD_BMSTATUS_WARNING +}; +extern int ssd_bm_status(struct block_device *bdev, int *status); + +enum ssd_otprotect +{ + SSD_OTPROTECT_OFF = 0, + SSD_OTPROTECT_ON +}; +extern int ssd_set_otprotect(struct block_device *bdev, int otprotect); + +typedef struct pci_addr +{ + uint16_t domain; + uint8_t bus; + uint8_t slot; + uint8_t func; +} pci_addr_t; +extern int ssd_get_pciaddr(struct block_device *bdev, struct pci_addr *paddr); + +/* submit phys bio: phys addr in iovec */ +extern void ssd_submit_pbio(struct request_queue *q, struct bio *bio); + +extern int ssd_reset(struct block_device *bdev); + +enum ssd_write_mode +{ + SSD_WMODE_BUFFER = 0, + SSD_WMODE_BUFFER_EX, + SSD_WMODE_FUA, + /* dummy */ + SSD_WMODE_AUTO, + SSD_WMODE_DEFAULT +}; +extern int ssd_set_wmode(struct block_device *bdev, int wmode); + +#endif + --- linux-azure-6.5.0.orig/ubuntu/include/Kbuild +++ linux-azure-6.5.0/ubuntu/include/Kbuild @@ -0,0 +1,2 @@ + + --- linux-azure-6.5.0.orig/ubuntu/include/README +++ linux-azure-6.5.0/ubuntu/include/README @@ -0,0 +1,4 @@ +Only use this directory for things which need to share their headers with +other parts of the kernel or other modules in ubuntu/ + +Otherwise, keep them local to the module directory. --- linux-azure-6.5.0.orig/ubuntu/ubuntu-host/Kconfig +++ linux-azure-6.5.0/ubuntu/ubuntu-host/Kconfig @@ -0,0 +1,5 @@ +config UBUNTU_HOST + tristate "proc dir for exporting host data to containers" + help + Creates an ubuntu-host directory in proc for providing data from + Ubuntu hosts to containers. --- linux-azure-6.5.0.orig/ubuntu/ubuntu-host/Makefile +++ linux-azure-6.5.0/ubuntu/ubuntu-host/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_UBUNTU_HOST) += ubuntu-host.o --- linux-azure-6.5.0.orig/ubuntu/ubuntu-host/ubuntu-host.c +++ linux-azure-6.5.0/ubuntu/ubuntu-host/ubuntu-host.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include + +#define PROC_DIR "ubuntu-host" + +#define ESM_TOKEN_FILE "esm-token" +#define ESM_TOKEN_MAX_SIZE 64 + +static struct proc_dir_entry *proc_dir; +static char esm_token_buffer[ESM_TOKEN_MAX_SIZE]; + +static ssize_t esm_token_read(struct file *f, char __user *buf, size_t len, + loff_t *off) +{ + return simple_read_from_buffer(buf, len, off, esm_token_buffer, + strlen(esm_token_buffer)); +} + +static ssize_t esm_token_write(struct file *f, const char __user *buf, + size_t len, loff_t *off) +{ + ssize_t ret; + + if (len >= ESM_TOKEN_MAX_SIZE - 1) + return -EINVAL; + + ret = simple_write_to_buffer(esm_token_buffer, ESM_TOKEN_MAX_SIZE - 1, + off, buf, len); + if (ret >= 0) + esm_token_buffer[ret] = '\0'; + + return ret; +} + +static const struct proc_ops esm_token_fops = { + .proc_read = esm_token_read, + .proc_write = esm_token_write, +}; + +static void ubuntu_host_cleanup(void) +{ + remove_proc_entry(ESM_TOKEN_FILE, proc_dir); + proc_remove(proc_dir); +} + +static int __init ubuntu_host_init(void) +{ + proc_dir = proc_mkdir(PROC_DIR, NULL); + if (!proc_dir) { + pr_err("Failed to create ubuntu-host dir\n"); + return -ENOMEM; + } + + if (!proc_create_data(ESM_TOKEN_FILE, 0644, proc_dir, &esm_token_fops, NULL)) { + pr_err("Failed to create esm-tokan file\n"); + ubuntu_host_cleanup(); + return -ENOMEM; + } + + return 0; +} + +module_init(ubuntu_host_init); +module_exit(ubuntu_host_cleanup); +MODULE_LICENSE("GPL"); --- linux-azure-6.5.0.orig/virt/kvm/vfio.c +++ linux-azure-6.5.0/virt/kvm/vfio.c @@ -21,7 +21,7 @@ #include #endif -struct kvm_vfio_group { +struct kvm_vfio_file { struct list_head node; struct file *file; #ifdef CONFIG_SPAPR_TCE_IOMMU @@ -30,7 +30,7 @@ }; struct kvm_vfio { - struct list_head group_list; + struct list_head file_list; struct mutex lock; bool noncoherent; }; @@ -98,34 +98,35 @@ } static void kvm_spapr_tce_release_vfio_group(struct kvm *kvm, - struct kvm_vfio_group *kvg) + struct kvm_vfio_file *kvf) { - if (WARN_ON_ONCE(!kvg->iommu_group)) + if (WARN_ON_ONCE(!kvf->iommu_group)) return; - kvm_spapr_tce_release_iommu_group(kvm, kvg->iommu_group); - iommu_group_put(kvg->iommu_group); - kvg->iommu_group = NULL; + kvm_spapr_tce_release_iommu_group(kvm, kvf->iommu_group); + iommu_group_put(kvf->iommu_group); + kvf->iommu_group = NULL; } #endif /* - * Groups can use the same or different IOMMU domains. If the same then - * adding a new group may change the coherency of groups we've previously - * been told about. We don't want to care about any of that so we retest - * each group and bail as soon as we find one that's noncoherent. This - * means we only ever [un]register_noncoherent_dma once for the whole device. + * Groups/devices can use the same or different IOMMU domains. If the same + * then adding a new group/device may change the coherency of groups/devices + * we've previously been told about. We don't want to care about any of + * that so we retest each group/device and bail as soon as we find one that's + * noncoherent. This means we only ever [un]register_noncoherent_dma once + * for the whole device. */ static void kvm_vfio_update_coherency(struct kvm_device *dev) { struct kvm_vfio *kv = dev->private; bool noncoherent = false; - struct kvm_vfio_group *kvg; + struct kvm_vfio_file *kvf; mutex_lock(&kv->lock); - list_for_each_entry(kvg, &kv->group_list, node) { - if (!kvm_vfio_file_enforced_coherent(kvg->file)) { + list_for_each_entry(kvf, &kv->file_list, node) { + if (!kvm_vfio_file_enforced_coherent(kvf->file)) { noncoherent = true; break; } @@ -143,10 +144,10 @@ mutex_unlock(&kv->lock); } -static int kvm_vfio_group_add(struct kvm_device *dev, unsigned int fd) +static int kvm_vfio_file_add(struct kvm_device *dev, unsigned int fd) { struct kvm_vfio *kv = dev->private; - struct kvm_vfio_group *kvg; + struct kvm_vfio_file *kvf; struct file *filp; int ret; @@ -162,27 +163,27 @@ mutex_lock(&kv->lock); - list_for_each_entry(kvg, &kv->group_list, node) { - if (kvg->file == filp) { + list_for_each_entry(kvf, &kv->file_list, node) { + if (kvf->file == filp) { ret = -EEXIST; goto err_unlock; } } - kvg = kzalloc(sizeof(*kvg), GFP_KERNEL_ACCOUNT); - if (!kvg) { + kvf = kzalloc(sizeof(*kvf), GFP_KERNEL_ACCOUNT); + if (!kvf) { ret = -ENOMEM; goto err_unlock; } - kvg->file = filp; - list_add_tail(&kvg->node, &kv->group_list); + kvf->file = filp; + list_add_tail(&kvf->node, &kv->file_list); kvm_arch_start_assignment(dev->kvm); + kvm_vfio_file_set_kvm(kvf->file, dev->kvm); mutex_unlock(&kv->lock); - kvm_vfio_file_set_kvm(kvg->file, dev->kvm); kvm_vfio_update_coherency(dev); return 0; @@ -193,10 +194,10 @@ return ret; } -static int kvm_vfio_group_del(struct kvm_device *dev, unsigned int fd) +static int kvm_vfio_file_del(struct kvm_device *dev, unsigned int fd) { struct kvm_vfio *kv = dev->private; - struct kvm_vfio_group *kvg; + struct kvm_vfio_file *kvf; struct fd f; int ret; @@ -208,18 +209,18 @@ mutex_lock(&kv->lock); - list_for_each_entry(kvg, &kv->group_list, node) { - if (kvg->file != f.file) + list_for_each_entry(kvf, &kv->file_list, node) { + if (kvf->file != f.file) continue; - list_del(&kvg->node); + list_del(&kvf->node); kvm_arch_end_assignment(dev->kvm); #ifdef CONFIG_SPAPR_TCE_IOMMU - kvm_spapr_tce_release_vfio_group(dev->kvm, kvg); + kvm_spapr_tce_release_vfio_group(dev->kvm, kvf); #endif - kvm_vfio_file_set_kvm(kvg->file, NULL); - fput(kvg->file); - kfree(kvg); + kvm_vfio_file_set_kvm(kvf->file, NULL); + fput(kvf->file); + kfree(kvf); ret = 0; break; } @@ -234,12 +235,12 @@ } #ifdef CONFIG_SPAPR_TCE_IOMMU -static int kvm_vfio_group_set_spapr_tce(struct kvm_device *dev, - void __user *arg) +static int kvm_vfio_file_set_spapr_tce(struct kvm_device *dev, + void __user *arg) { struct kvm_vfio_spapr_tce param; struct kvm_vfio *kv = dev->private; - struct kvm_vfio_group *kvg; + struct kvm_vfio_file *kvf; struct fd f; int ret; @@ -254,20 +255,20 @@ mutex_lock(&kv->lock); - list_for_each_entry(kvg, &kv->group_list, node) { - if (kvg->file != f.file) + list_for_each_entry(kvf, &kv->file_list, node) { + if (kvf->file != f.file) continue; - if (!kvg->iommu_group) { - kvg->iommu_group = kvm_vfio_file_iommu_group(kvg->file); - if (WARN_ON_ONCE(!kvg->iommu_group)) { + if (!kvf->iommu_group) { + kvf->iommu_group = kvm_vfio_file_iommu_group(kvf->file); + if (WARN_ON_ONCE(!kvf->iommu_group)) { ret = -EIO; goto err_fdput; } } ret = kvm_spapr_tce_attach_iommu_group(dev->kvm, param.tablefd, - kvg->iommu_group); + kvf->iommu_group); break; } @@ -278,8 +279,8 @@ } #endif -static int kvm_vfio_set_group(struct kvm_device *dev, long attr, - void __user *arg) +static int kvm_vfio_set_file(struct kvm_device *dev, long attr, + void __user *arg) { int32_t __user *argp = arg; int32_t fd; @@ -288,16 +289,16 @@ case KVM_DEV_VFIO_GROUP_ADD: if (get_user(fd, argp)) return -EFAULT; - return kvm_vfio_group_add(dev, fd); + return kvm_vfio_file_add(dev, fd); case KVM_DEV_VFIO_GROUP_DEL: if (get_user(fd, argp)) return -EFAULT; - return kvm_vfio_group_del(dev, fd); + return kvm_vfio_file_del(dev, fd); #ifdef CONFIG_SPAPR_TCE_IOMMU case KVM_DEV_VFIO_GROUP_SET_SPAPR_TCE: - return kvm_vfio_group_set_spapr_tce(dev, arg); + return kvm_vfio_file_set_spapr_tce(dev, arg); #endif } @@ -309,8 +310,8 @@ { switch (attr->group) { case KVM_DEV_VFIO_GROUP: - return kvm_vfio_set_group(dev, attr->attr, - u64_to_user_ptr(attr->addr)); + return kvm_vfio_set_file(dev, attr->attr, + u64_to_user_ptr(attr->addr)); } return -ENXIO; @@ -339,16 +340,16 @@ static void kvm_vfio_release(struct kvm_device *dev) { struct kvm_vfio *kv = dev->private; - struct kvm_vfio_group *kvg, *tmp; + struct kvm_vfio_file *kvf, *tmp; - list_for_each_entry_safe(kvg, tmp, &kv->group_list, node) { + list_for_each_entry_safe(kvf, tmp, &kv->file_list, node) { #ifdef CONFIG_SPAPR_TCE_IOMMU - kvm_spapr_tce_release_vfio_group(dev->kvm, kvg); + kvm_spapr_tce_release_vfio_group(dev->kvm, kvf); #endif - kvm_vfio_file_set_kvm(kvg->file, NULL); - fput(kvg->file); - list_del(&kvg->node); - kfree(kvg); + kvm_vfio_file_set_kvm(kvf->file, NULL); + fput(kvf->file); + list_del(&kvf->node); + kfree(kvf); kvm_arch_end_assignment(dev->kvm); } @@ -382,7 +383,7 @@ if (!kv) return -ENOMEM; - INIT_LIST_HEAD(&kv->group_list); + INIT_LIST_HEAD(&kv->file_list); mutex_init(&kv->lock); dev->private = kv;