Merge f810c18236 ("Merge tag 'm68k-for-v6.5-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k") into android-mainline
Steps on the way to 6.5-rc1 Change-Id: I86db2c95f2a67f5a701b00f426b986996dc3f95b Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -383,6 +383,12 @@ E: tomas@nocrew.org
|
||||
W: http://tomas.nocrew.org/
|
||||
D: dsp56k device driver
|
||||
|
||||
N: Srivatsa S. Bhat
|
||||
E: srivatsa@csail.mit.edu
|
||||
D: Maintainer of Generic Paravirt-Ops subsystem
|
||||
D: Maintainer of VMware hypervisor interface
|
||||
D: Maintainer of VMware virtual PTP clock driver (ptp_vmw)
|
||||
|
||||
N: Ross Biro
|
||||
E: ross.biro@gmail.com
|
||||
D: Original author of the Linux networking code
|
||||
|
||||
@@ -818,20 +818,6 @@
|
||||
Format:
|
||||
<first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
|
||||
|
||||
cpu0_hotplug [X86] Turn on CPU0 hotplug feature when
|
||||
CONFIG_BOOTPARAM_HOTPLUG_CPU0 is off.
|
||||
Some features depend on CPU0. Known dependencies are:
|
||||
1. Resume from suspend/hibernate depends on CPU0.
|
||||
Suspend/hibernate will fail if CPU0 is offline and you
|
||||
need to online CPU0 before suspend/hibernate.
|
||||
2. PIC interrupts also depend on CPU0. CPU0 can't be
|
||||
removed if a PIC interrupt is detected.
|
||||
It's said poweroff/reboot may depend on CPU0 on some
|
||||
machines although I haven't seen such issues so far
|
||||
after CPU0 is offline on a few tested machines.
|
||||
If the dependencies are under your control, you can
|
||||
turn on cpu0_hotplug.
|
||||
|
||||
cpuidle.off=1 [CPU_IDLE]
|
||||
disable the cpuidle sub-system
|
||||
|
||||
@@ -852,6 +838,12 @@
|
||||
on every CPU online, such as boot, and resume from suspend.
|
||||
Default: 10000
|
||||
|
||||
cpuhp.parallel=
|
||||
[SMP] Enable/disable parallel bringup of secondary CPUs
|
||||
Format: <bool>
|
||||
Default is enabled if CONFIG_HOTPLUG_PARALLEL=y. Otherwise
|
||||
the parameter has no effect.
|
||||
|
||||
crash_kexec_post_notifiers
|
||||
Run kdump after running panic-notifiers and dumping
|
||||
kmsg. This only for the users who doubt kdump always
|
||||
|
||||
@@ -287,6 +287,13 @@ Removing a directory will move all tasks and cpus owned by the group it
|
||||
represents to the parent. Removing one of the created CTRL_MON groups
|
||||
will automatically remove all MON groups below it.
|
||||
|
||||
Moving MON group directories to a new parent CTRL_MON group is supported
|
||||
for the purpose of changing the resource allocations of a MON group
|
||||
without impacting its monitoring data or assigned tasks. This operation
|
||||
is not allowed for MON groups which monitor CPUs. No other move
|
||||
operation is currently allowed other than simply renaming a CTRL_MON or
|
||||
MON group.
|
||||
|
||||
All groups contain the following files:
|
||||
|
||||
"tasks":
|
||||
|
||||
@@ -127,17 +127,8 @@ bring CPU4 back online::
|
||||
$ echo 1 > /sys/devices/system/cpu/cpu4/online
|
||||
smpboot: Booting Node 0 Processor 4 APIC 0x1
|
||||
|
||||
The CPU is usable again. This should work on all CPUs. CPU0 is often special
|
||||
and excluded from CPU hotplug. On X86 the kernel option
|
||||
*CONFIG_BOOTPARAM_HOTPLUG_CPU0* has to be enabled in order to be able to
|
||||
shutdown CPU0. Alternatively the kernel command option *cpu0_hotplug* can be
|
||||
used. Some known dependencies of CPU0:
|
||||
|
||||
* Resume from hibernate/suspend. Hibernate/suspend will fail if CPU0 is offline.
|
||||
* PIC interrupts. CPU0 can't be removed if a PIC interrupt is detected.
|
||||
|
||||
Please let Fenghua Yu <fenghua.yu@intel.com> know if you find any dependencies
|
||||
on CPU0.
|
||||
The CPU is usable again. This should work on all CPUs, but CPU0 is often special
|
||||
and excluded from CPU hotplug.
|
||||
|
||||
The CPU hotplug coordination
|
||||
============================
|
||||
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/memory-controllers/nuvoton,npcm-memory-controller.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Nuvoton NPCM Memory Controller
|
||||
|
||||
maintainers:
|
||||
- Marvin Lin <kflin@nuvoton.com>
|
||||
- Stanley Chu <yschu@nuvoton.com>
|
||||
|
||||
description: |
|
||||
The Nuvoton BMC SoC supports DDR4 memory with or without ECC (error correction
|
||||
check).
|
||||
|
||||
The memory controller supports single bit error correction, double bit error
|
||||
detection (in-line ECC in which a section (1/8th) of the memory device used to
|
||||
store data is used for ECC storage).
|
||||
|
||||
Note, the bootloader must configure ECC mode for the memory controller.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- nuvoton,npcm750-memory-controller
|
||||
- nuvoton,npcm845-memory-controller
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
mc: memory-controller@f0824000 {
|
||||
compatible = "nuvoton,npcm750-memory-controller";
|
||||
reg = <0xf0824000 0x1000>;
|
||||
interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
@@ -1,25 +0,0 @@
|
||||
Broadcom Kona Family timer
|
||||
-----------------------------------------------------
|
||||
This timer is used in the following Broadcom SoCs:
|
||||
BCM11130, BCM11140, BCM11351, BCM28145, BCM28155
|
||||
|
||||
Required properties:
|
||||
- compatible : "brcm,kona-timer"
|
||||
- DEPRECATED: compatible : "bcm,kona-timer"
|
||||
- reg : Register range for the timer
|
||||
- interrupts : interrupt for the timer
|
||||
- clocks: phandle + clock specifier pair of the external clock
|
||||
- clock-frequency: frequency that the clock operates
|
||||
|
||||
Only one of clocks or clock-frequency should be specified.
|
||||
|
||||
Refer to clocks/clock-bindings.txt for generic clock consumer properties.
|
||||
|
||||
Example:
|
||||
timer@35006000 {
|
||||
compatible = "brcm,kona-timer";
|
||||
reg = <0x35006000 0x1000>;
|
||||
interrupts = <0x0 7 0x4>;
|
||||
clocks = <&hub_timer_clk>;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/timer/brcm,kona-timer.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Broadcom Kona family timer
|
||||
|
||||
maintainers:
|
||||
- Florian Fainelli <f.fainelli@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: brcm,kona-timer
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-frequency: true
|
||||
|
||||
oneOf:
|
||||
- required:
|
||||
- clocks
|
||||
- required:
|
||||
- clock-frequency
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/bcm281xx.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
|
||||
timer@35006000 {
|
||||
compatible = "brcm,kona-timer";
|
||||
reg = <0x35006000 0x1000>;
|
||||
interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&aon_ccu BCM281XX_AON_CCU_HUB_TIMER>;
|
||||
};
|
||||
...
|
||||
@@ -0,0 +1,48 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/timer/loongson,ls1x-pwmtimer.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Loongson-1 PWM timer
|
||||
|
||||
maintainers:
|
||||
- Keguang Zhang <keguang.zhang@gmail.com>
|
||||
|
||||
description:
|
||||
Loongson-1 PWM timer can be used for system clock source
|
||||
and clock event timers.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: loongson,ls1b-pwmtimer
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/loongson,ls1x-clk.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
clocksource: timer@1fe5c030 {
|
||||
compatible = "loongson,ls1b-pwmtimer";
|
||||
reg = <0x1fe5c030 0x10>;
|
||||
|
||||
clocks = <&clkc LS1X_CLKID_APB>;
|
||||
interrupt-parent = <&intc0>;
|
||||
interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
@@ -0,0 +1,44 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/timer/ralink,rt2880-timer.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Timer present in Ralink family SoCs
|
||||
|
||||
maintainers:
|
||||
- Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: ralink,rt2880-timer
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
timer@100 {
|
||||
compatible = "ralink,rt2880-timer";
|
||||
reg = <0x100 0x20>;
|
||||
|
||||
clocks = <&sysc 3>;
|
||||
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <1>;
|
||||
};
|
||||
...
|
||||
@@ -106,6 +106,16 @@ will occupy those chip-select rows.
|
||||
This term is avoided because it is unclear when needing to distinguish
|
||||
between chip-select rows and socket sets.
|
||||
|
||||
* High Bandwidth Memory (HBM)
|
||||
|
||||
HBM is a new memory type with low power consumption and ultra-wide
|
||||
communication lanes. It uses vertically stacked memory chips (DRAM dies)
|
||||
interconnected by microscopic wires called "through-silicon vias," or
|
||||
TSVs.
|
||||
|
||||
Several stacks of HBM chips connect to the CPU or GPU through an ultra-fast
|
||||
interconnect called the "interposer". Therefore, HBM's characteristics
|
||||
are nearly indistinguishable from on-chip integrated RAM.
|
||||
|
||||
Memory Controllers
|
||||
------------------
|
||||
@@ -176,3 +186,113 @@ nodes::
|
||||
the L1 and L2 directories would be "edac_device_block's"
|
||||
|
||||
.. kernel-doc:: drivers/edac/edac_device.h
|
||||
|
||||
|
||||
Heterogeneous system support
|
||||
----------------------------
|
||||
|
||||
An AMD heterogeneous system is built by connecting the data fabrics of
|
||||
both CPUs and GPUs via custom xGMI links. Thus, the data fabric on the
|
||||
GPU nodes can be accessed the same way as the data fabric on CPU nodes.
|
||||
|
||||
The MI200 accelerators are data center GPUs. They have 2 data fabrics,
|
||||
and each GPU data fabric contains four Unified Memory Controllers (UMC).
|
||||
Each UMC contains eight channels. Each UMC channel controls one 128-bit
|
||||
HBM2e (2GB) channel (equivalent to 8 X 2GB ranks). This creates a total
|
||||
of 4096-bits of DRAM data bus.
|
||||
|
||||
While the UMC is interfacing a 16GB (8high X 2GB DRAM) HBM stack, each UMC
|
||||
channel is interfacing 2GB of DRAM (represented as rank).
|
||||
|
||||
Memory controllers on AMD GPU nodes can be represented in EDAC thusly:
|
||||
|
||||
GPU DF / GPU Node -> EDAC MC
|
||||
GPU UMC -> EDAC CSROW
|
||||
GPU UMC channel -> EDAC CHANNEL
|
||||
|
||||
For example: a heterogeneous system with 1 AMD CPU is connected to
|
||||
4 MI200 (Aldebaran) GPUs using xGMI.
|
||||
|
||||
Some more heterogeneous hardware details:
|
||||
|
||||
- The CPU UMC (Unified Memory Controller) is mostly the same as the GPU UMC.
|
||||
They have chip selects (csrows) and channels. However, the layouts are different
|
||||
for performance, physical layout, or other reasons.
|
||||
- CPU UMCs use 1 channel, In this case UMC = EDAC channel. This follows the
|
||||
marketing speak. CPU has X memory channels, etc.
|
||||
- CPU UMCs use up to 4 chip selects, So UMC chip select = EDAC CSROW.
|
||||
- GPU UMCs use 1 chip select, So UMC = EDAC CSROW.
|
||||
- GPU UMCs use 8 channels, So UMC channel = EDAC channel.
|
||||
|
||||
The EDAC subsystem provides a mechanism to handle AMD heterogeneous
|
||||
systems by calling system specific ops for both CPUs and GPUs.
|
||||
|
||||
AMD GPU nodes are enumerated in sequential order based on the PCI
|
||||
hierarchy, and the first GPU node is assumed to have a Node ID value
|
||||
following those of the CPU nodes after latter are fully populated::
|
||||
|
||||
$ ls /sys/devices/system/edac/mc/
|
||||
mc0 - CPU MC node 0
|
||||
mc1 |
|
||||
mc2 |- GPU card[0] => node 0(mc1), node 1(mc2)
|
||||
mc3 |
|
||||
mc4 |- GPU card[1] => node 0(mc3), node 1(mc4)
|
||||
mc5 |
|
||||
mc6 |- GPU card[2] => node 0(mc5), node 1(mc6)
|
||||
mc7 |
|
||||
mc8 |- GPU card[3] => node 0(mc7), node 1(mc8)
|
||||
|
||||
For example, a heterogeneous system with one AMD CPU is connected to
|
||||
four MI200 (Aldebaran) GPUs using xGMI. This topology can be represented
|
||||
via the following sysfs entries::
|
||||
|
||||
/sys/devices/system/edac/mc/..
|
||||
|
||||
CPU # CPU node
|
||||
├── mc 0
|
||||
|
||||
GPU Nodes are enumerated sequentially after CPU nodes have been populated
|
||||
GPU card 1 # Each MI200 GPU has 2 nodes/mcs
|
||||
├── mc 1 # GPU node 0 == mc1, Each MC node has 4 UMCs/CSROWs
|
||||
│ ├── csrow 0 # UMC 0
|
||||
│ │ ├── channel 0 # Each UMC has 8 channels
|
||||
│ │ ├── channel 1 # size of each channel is 2 GB, so each UMC has 16 GB
|
||||
│ │ ├── channel 2
|
||||
│ │ ├── channel 3
|
||||
│ │ ├── channel 4
|
||||
│ │ ├── channel 5
|
||||
│ │ ├── channel 6
|
||||
│ │ ├── channel 7
|
||||
│ ├── csrow 1 # UMC 1
|
||||
│ │ ├── channel 0
|
||||
│ │ ├── ..
|
||||
│ │ ├── channel 7
|
||||
│ ├── .. ..
|
||||
│ ├── csrow 3 # UMC 3
|
||||
│ │ ├── channel 0
|
||||
│ │ ├── ..
|
||||
│ │ ├── channel 7
|
||||
│ ├── rank 0
|
||||
│ ├── .. ..
|
||||
│ ├── rank 31 # total 32 ranks/dimms from 4 UMCs
|
||||
├
|
||||
├── mc 2 # GPU node 1 == mc2
|
||||
│ ├── .. # each GPU has total 64 GB
|
||||
|
||||
GPU card 2
|
||||
├── mc 3
|
||||
│ ├── ..
|
||||
├── mc 4
|
||||
│ ├── ..
|
||||
|
||||
GPU card 3
|
||||
├── mc 5
|
||||
│ ├── ..
|
||||
├── mc 6
|
||||
│ ├── ..
|
||||
|
||||
GPU card 4
|
||||
├── mc 7
|
||||
│ ├── ..
|
||||
├── mc 8
|
||||
│ ├── ..
|
||||
|
||||
@@ -421,6 +421,9 @@ allowing themselves a breath. Please respect that.
|
||||
The release candidate -rc1 is the starting point for new patches to be
|
||||
applied which are targeted for the next merge window.
|
||||
|
||||
So called _urgent_ branches will be merged into mainline during the
|
||||
stabilization phase of each release.
|
||||
|
||||
|
||||
Git
|
||||
^^^
|
||||
|
||||
@@ -5,31 +5,31 @@ Paravirt_ops
|
||||
============
|
||||
|
||||
Linux provides support for different hypervisor virtualization technologies.
|
||||
Historically different binary kernels would be required in order to support
|
||||
different hypervisors, this restriction was removed with pv_ops.
|
||||
Historically, different binary kernels would be required in order to support
|
||||
different hypervisors; this restriction was removed with pv_ops.
|
||||
Linux pv_ops is a virtualization API which enables support for different
|
||||
hypervisors. It allows each hypervisor to override critical operations and
|
||||
allows a single kernel binary to run on all supported execution environments
|
||||
including native machine -- without any hypervisors.
|
||||
|
||||
pv_ops provides a set of function pointers which represent operations
|
||||
corresponding to low level critical instructions and high level
|
||||
functionalities in various areas. pv-ops allows for optimizations at run
|
||||
time by enabling binary patching of the low-ops critical operations
|
||||
corresponding to low-level critical instructions and high-level
|
||||
functionalities in various areas. pv_ops allows for optimizations at run
|
||||
time by enabling binary patching of the low-level critical operations
|
||||
at boot time.
|
||||
|
||||
pv_ops operations are classified into three categories:
|
||||
|
||||
- simple indirect call
|
||||
These operations correspond to high level functionality where it is
|
||||
These operations correspond to high-level functionality where it is
|
||||
known that the overhead of indirect call isn't very important.
|
||||
|
||||
- indirect call which allows optimization with binary patch
|
||||
Usually these operations correspond to low level critical instructions. They
|
||||
Usually these operations correspond to low-level critical instructions. They
|
||||
are called frequently and are performance critical. The overhead is
|
||||
very important.
|
||||
|
||||
- a set of macros for hand written assembly code
|
||||
Hand written assembly codes (.S files) also need paravirtualization
|
||||
because they include sensitive instructions or some of code paths in
|
||||
because they include sensitive instructions or some code paths in
|
||||
them are very performance critical.
|
||||
|
||||
+23
-3
@@ -5344,6 +5344,18 @@ F: include/linux/sched/cpufreq.h
|
||||
F: kernel/sched/cpufreq*.c
|
||||
F: tools/testing/selftests/cpufreq/
|
||||
|
||||
CPU HOTPLUG
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Peter Zijlstra <peterz@infradead.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git smp/core
|
||||
F: kernel/cpu.c
|
||||
F: kernel/smpboot.*
|
||||
F: include/linux/cpu.h
|
||||
F: include/linux/cpuhotplug.h
|
||||
F: include/linux/smpboot.h
|
||||
|
||||
CPU IDLE TIME MANAGEMENT FRAMEWORK
|
||||
M: "Rafael J. Wysocki" <rafael@kernel.org>
|
||||
M: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||
@@ -7482,6 +7494,14 @@ L: linux-edac@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/edac/mpc85xx_edac.[ch]
|
||||
|
||||
EDAC-NPCM
|
||||
M: Marvin Lin <kflin@nuvoton.com>
|
||||
M: Stanley Chu <yschu@nuvoton.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/memory-controllers/nuvoton,npcm-memory-controller.yaml
|
||||
F: drivers/edac/npcm_edac.c
|
||||
|
||||
EDAC-PASEMI
|
||||
M: Egor Martovetsky <egor@pasemi.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
@@ -15961,7 +15981,7 @@ F: include/uapi/linux/ppdev.h
|
||||
|
||||
PARAVIRT_OPS INTERFACE
|
||||
M: Juergen Gross <jgross@suse.com>
|
||||
M: Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
|
||||
R: Ajay Kaher <akaher@vmware.com>
|
||||
R: Alexey Makhalov <amakhalov@vmware.com>
|
||||
R: VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
|
||||
L: virtualization@lists.linux-foundation.org
|
||||
@@ -22533,7 +22553,7 @@ S: Supported
|
||||
F: drivers/misc/vmw_balloon.c
|
||||
|
||||
VMWARE HYPERVISOR INTERFACE
|
||||
M: Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
|
||||
M: Ajay Kaher <akaher@vmware.com>
|
||||
M: Alexey Makhalov <amakhalov@vmware.com>
|
||||
R: VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
|
||||
L: virtualization@lists.linux-foundation.org
|
||||
@@ -22560,8 +22580,8 @@ F: drivers/scsi/vmw_pvscsi.c
|
||||
F: drivers/scsi/vmw_pvscsi.h
|
||||
|
||||
VMWARE VIRTUAL PTP CLOCK DRIVER
|
||||
M: Srivatsa S. Bhat (VMware) <srivatsa@csail.mit.edu>
|
||||
M: Deep Shah <sdeep@vmware.com>
|
||||
R: Ajay Kaher <akaher@vmware.com>
|
||||
R: Alexey Makhalov <amakhalov@vmware.com>
|
||||
R: VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
|
||||
L: netdev@vger.kernel.org
|
||||
|
||||
@@ -34,6 +34,29 @@ config ARCH_HAS_SUBPAGE_FAULTS
|
||||
config HOTPLUG_SMT
|
||||
bool
|
||||
|
||||
# Selected by HOTPLUG_CORE_SYNC_DEAD or HOTPLUG_CORE_SYNC_FULL
|
||||
config HOTPLUG_CORE_SYNC
|
||||
bool
|
||||
|
||||
# Basic CPU dead synchronization selected by architecture
|
||||
config HOTPLUG_CORE_SYNC_DEAD
|
||||
bool
|
||||
select HOTPLUG_CORE_SYNC
|
||||
|
||||
# Full CPU synchronization with alive state selected by architecture
|
||||
config HOTPLUG_CORE_SYNC_FULL
|
||||
bool
|
||||
select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU
|
||||
select HOTPLUG_CORE_SYNC
|
||||
|
||||
config HOTPLUG_SPLIT_STARTUP
|
||||
bool
|
||||
select HOTPLUG_CORE_SYNC_FULL
|
||||
|
||||
config HOTPLUG_PARALLEL
|
||||
bool
|
||||
select HOTPLUG_SPLIT_STARTUP
|
||||
|
||||
config GENERIC_ENTRY
|
||||
bool
|
||||
|
||||
@@ -285,6 +308,9 @@ config ARCH_HAS_DMA_SET_UNCACHED
|
||||
config ARCH_HAS_DMA_CLEAR_UNCACHED
|
||||
bool
|
||||
|
||||
config ARCH_HAS_CPU_FINALIZE_INIT
|
||||
bool
|
||||
|
||||
# Select if arch init_task must go in the __init_task_data section
|
||||
config ARCH_TASK_STRUCT_ON_STACK
|
||||
bool
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
/*
|
||||
* include/asm-alpha/bugs.h
|
||||
*
|
||||
* Copyright (C) 1994 Linus Torvalds
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is included by init/main.c to check for architecture-dependent bugs.
|
||||
*
|
||||
* Needs:
|
||||
* void check_bugs(void);
|
||||
*/
|
||||
|
||||
/*
|
||||
* I don't know of any alpha bugs yet.. Nice chip
|
||||
*/
|
||||
|
||||
static void check_bugs(void)
|
||||
{
|
||||
}
|
||||
@@ -1014,8 +1014,6 @@ SYSCALL_DEFINE2(osf_settimeofday, struct timeval32 __user *, tv,
|
||||
return do_sys_settimeofday64(tv ? &kts : NULL, tz ? &ktz : NULL);
|
||||
}
|
||||
|
||||
asmlinkage long sys_ni_posix_timers(void);
|
||||
|
||||
SYSCALL_DEFINE2(osf_utimes, const char __user *, filename,
|
||||
struct timeval32 __user *, tvs)
|
||||
{
|
||||
|
||||
@@ -5,6 +5,7 @@ config ARM
|
||||
select ARCH_32BIT_OFF_T
|
||||
select ARCH_CORRECT_STACKTRACE_ON_KRETPROBE if HAVE_KRETPROBES && FRAME_POINTER && !ARM_UNWIND
|
||||
select ARCH_HAS_BINFMT_FLAT
|
||||
select ARCH_HAS_CPU_FINALIZE_INIT if MMU
|
||||
select ARCH_HAS_CURRENT_STACK_POINTER
|
||||
select ARCH_HAS_DEBUG_VIRTUAL if MMU
|
||||
select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE
|
||||
@@ -124,6 +125,7 @@ config ARM
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_UID16
|
||||
select HAVE_VIRT_CPU_ACCOUNTING_GEN
|
||||
select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU
|
||||
select IRQ_FORCED_THREADING
|
||||
select MODULES_USE_ELF_REL
|
||||
select NEED_DMA_MAP_STATE
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* arch/arm/include/asm/bugs.h
|
||||
*
|
||||
* Copyright (C) 1995-2003 Russell King
|
||||
*/
|
||||
#ifndef __ASM_BUGS_H
|
||||
@@ -10,10 +8,8 @@
|
||||
extern void check_writebuffer_bugs(void);
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
extern void check_bugs(void);
|
||||
extern void check_other_bugs(void);
|
||||
#else
|
||||
#define check_bugs() do { } while (0)
|
||||
#define check_other_bugs() do { } while (0)
|
||||
#endif
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ extern void secondary_startup_arm(void);
|
||||
|
||||
extern int __cpu_disable(void);
|
||||
|
||||
extern void __cpu_die(unsigned int cpu);
|
||||
static inline void __cpu_die(unsigned int cpu) { }
|
||||
|
||||
extern void arch_send_call_function_single_ipi(int cpu);
|
||||
extern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/init.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <asm/bugs.h>
|
||||
#include <asm/proc-fns.h>
|
||||
|
||||
@@ -11,7 +12,7 @@ void check_other_bugs(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init check_bugs(void)
|
||||
void __init arch_cpu_finalize_init(void)
|
||||
{
|
||||
check_writebuffer_bugs();
|
||||
check_other_bugs();
|
||||
|
||||
+7
-11
@@ -292,15 +292,11 @@ int __cpu_disable(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* called on the thread which is asking for a CPU to be shutdown -
|
||||
* waits until shutdown has completed, or it is timed out.
|
||||
* called on the thread which is asking for a CPU to be shutdown after the
|
||||
* shutdown completed.
|
||||
*/
|
||||
void __cpu_die(unsigned int cpu)
|
||||
void arch_cpuhp_cleanup_dead_cpu(unsigned int cpu)
|
||||
{
|
||||
if (!cpu_wait_death(cpu, 5)) {
|
||||
pr_err("CPU%u: cpu didn't die\n", cpu);
|
||||
return;
|
||||
}
|
||||
pr_debug("CPU%u: shutdown\n", cpu);
|
||||
|
||||
clear_tasks_mm_cpumask(cpu);
|
||||
@@ -340,11 +336,11 @@ void __noreturn arch_cpu_idle_dead(void)
|
||||
flush_cache_louis();
|
||||
|
||||
/*
|
||||
* Tell __cpu_die() that this CPU is now safe to dispose of. Once
|
||||
* this returns, power and/or clocks can be removed at any point
|
||||
* from this CPU and its cache by platform_cpu_kill().
|
||||
* Tell cpuhp_bp_sync_dead() that this CPU is now safe to dispose
|
||||
* of. Once this returns, power and/or clocks can be removed at
|
||||
* any point from this CPU and its cache by platform_cpu_kill().
|
||||
*/
|
||||
(void)cpu_report_death();
|
||||
cpuhp_ap_report_dead();
|
||||
|
||||
/*
|
||||
* Ensure that the cache lines associated with that completion are
|
||||
|
||||
@@ -222,6 +222,7 @@ config ARM64
|
||||
select HAVE_KPROBES
|
||||
select HAVE_KRETPROBES
|
||||
select HAVE_GENERIC_VDSO
|
||||
select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU
|
||||
select IRQ_DOMAIN
|
||||
select IRQ_FORCED_THREADING
|
||||
select KASAN_VMALLOC if KASAN
|
||||
|
||||
@@ -101,7 +101,7 @@ static inline void arch_send_wakeup_ipi_mask(const struct cpumask *mask)
|
||||
|
||||
extern int __cpu_disable(void);
|
||||
|
||||
extern void __cpu_die(unsigned int cpu);
|
||||
static inline void __cpu_die(unsigned int cpu) { }
|
||||
extern void __noreturn cpu_die(void);
|
||||
extern void __noreturn cpu_die_early(void);
|
||||
|
||||
|
||||
@@ -337,17 +337,13 @@ static int op_cpu_kill(unsigned int cpu)
|
||||
}
|
||||
|
||||
/*
|
||||
* called on the thread which is asking for a CPU to be shutdown -
|
||||
* waits until shutdown has completed, or it is timed out.
|
||||
* Called on the thread which is asking for a CPU to be shutdown after the
|
||||
* shutdown completed.
|
||||
*/
|
||||
void __cpu_die(unsigned int cpu)
|
||||
void arch_cpuhp_cleanup_dead_cpu(unsigned int cpu)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!cpu_wait_death(cpu, 5)) {
|
||||
pr_crit("CPU%u: cpu didn't die\n", cpu);
|
||||
return;
|
||||
}
|
||||
pr_debug("CPU%u: shutdown\n", cpu);
|
||||
|
||||
/*
|
||||
@@ -374,8 +370,8 @@ void __noreturn cpu_die(void)
|
||||
|
||||
local_daif_mask();
|
||||
|
||||
/* Tell __cpu_die() that this CPU is now safe to dispose of */
|
||||
(void)cpu_report_death();
|
||||
/* Tell cpuhp_bp_sync_dead() that this CPU is now safe to dispose of */
|
||||
cpuhp_ap_report_dead();
|
||||
|
||||
/*
|
||||
* Actually shutdown the CPU. This must never fail. The specific hotplug
|
||||
|
||||
@@ -96,6 +96,7 @@ config CSKY
|
||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||
select HAVE_STACKPROTECTOR
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU
|
||||
select MAY_HAVE_SPARSE_IRQ
|
||||
select MODULES_USE_ELF_RELA if MODULES
|
||||
select OF
|
||||
|
||||
@@ -23,7 +23,7 @@ void __init set_send_ipi(void (*func)(const struct cpumask *mask), int irq);
|
||||
|
||||
int __cpu_disable(void);
|
||||
|
||||
void __cpu_die(unsigned int cpu);
|
||||
static inline void __cpu_die(unsigned int cpu) { }
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
|
||||
@@ -291,12 +291,8 @@ int __cpu_disable(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __cpu_die(unsigned int cpu)
|
||||
void arch_cpuhp_cleanup_dead_cpu(unsigned int cpu)
|
||||
{
|
||||
if (!cpu_wait_death(cpu, 5)) {
|
||||
pr_crit("CPU%u: shutdown failed\n", cpu);
|
||||
return;
|
||||
}
|
||||
pr_notice("CPU%u: shutdown\n", cpu);
|
||||
}
|
||||
|
||||
@@ -304,7 +300,7 @@ void __noreturn arch_cpu_idle_dead(void)
|
||||
{
|
||||
idle_task_exit();
|
||||
|
||||
cpu_report_death();
|
||||
cpuhp_ap_report_dead();
|
||||
|
||||
while (!secondary_stack)
|
||||
arch_cpu_idle();
|
||||
|
||||
@@ -9,6 +9,7 @@ menu "Processor type and features"
|
||||
config IA64
|
||||
bool
|
||||
select ARCH_BINFMT_ELF_EXTRA_PHDRS
|
||||
select ARCH_HAS_CPU_FINALIZE_INIT
|
||||
select ARCH_HAS_DMA_MARK_CLEAN
|
||||
select ARCH_HAS_STRNCPY_FROM_USER
|
||||
select ARCH_HAS_STRNLEN_USER
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* This is included by init/main.c to check for architecture-dependent bugs.
|
||||
*
|
||||
* Needs:
|
||||
* void check_bugs(void);
|
||||
*
|
||||
* Based on <asm-alpha/bugs.h>.
|
||||
*
|
||||
* Modified 1998, 1999, 2003
|
||||
* David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co.
|
||||
*/
|
||||
#ifndef _ASM_IA64_BUGS_H
|
||||
#define _ASM_IA64_BUGS_H
|
||||
|
||||
#include <asm/processor.h>
|
||||
|
||||
extern void check_bugs (void);
|
||||
|
||||
#endif /* _ASM_IA64_BUGS_H */
|
||||
@@ -1067,8 +1067,7 @@ cpu_init (void)
|
||||
}
|
||||
}
|
||||
|
||||
void __init
|
||||
check_bugs (void)
|
||||
void __init arch_cpu_finalize_init(void)
|
||||
{
|
||||
ia64_patch_mckinley_e9((unsigned long) __start___mckinley_e9_bundles,
|
||||
(unsigned long) __end___mckinley_e9_bundles);
|
||||
|
||||
@@ -10,6 +10,7 @@ config LOONGARCH
|
||||
select ARCH_ENABLE_MEMORY_HOTPLUG
|
||||
select ARCH_ENABLE_MEMORY_HOTREMOVE
|
||||
select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI
|
||||
select ARCH_HAS_CPU_FINALIZE_INIT
|
||||
select ARCH_HAS_FORTIFY_SOURCE
|
||||
select ARCH_HAS_NMI_SAFE_THIS_CPU_OPS
|
||||
select ARCH_HAS_PTE_SPECIAL
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* This is included by init/main.c to check for architecture-dependent bugs.
|
||||
*
|
||||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
#ifndef _ASM_BUGS_H
|
||||
#define _ASM_BUGS_H
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/cpu-info.h>
|
||||
|
||||
extern void check_bugs(void);
|
||||
|
||||
#endif /* _ASM_BUGS_H */
|
||||
@@ -12,6 +12,7 @@
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/export.h>
|
||||
@@ -37,7 +38,6 @@
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/alternative.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/bugs.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/dma.h>
|
||||
@@ -87,7 +87,7 @@ const char *get_system_type(void)
|
||||
return "generic-loongson-machine";
|
||||
}
|
||||
|
||||
void __init check_bugs(void)
|
||||
void __init arch_cpu_finalize_init(void)
|
||||
{
|
||||
alternative_instructions();
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ config M68K
|
||||
default y
|
||||
select ARCH_32BIT_OFF_T
|
||||
select ARCH_HAS_BINFMT_FLAT
|
||||
select ARCH_HAS_CPU_FINALIZE_INIT if MMU
|
||||
select ARCH_HAS_CURRENT_STACK_POINTER
|
||||
select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE
|
||||
select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA
|
||||
|
||||
@@ -43,6 +43,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -454,7 +455,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -39,6 +39,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -411,7 +412,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -46,6 +46,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -431,7 +432,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -36,6 +36,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -403,7 +404,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -38,6 +38,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -413,7 +414,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -37,6 +37,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -433,7 +434,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -57,6 +57,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -519,7 +520,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -35,6 +35,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -402,7 +403,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -36,6 +36,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -403,7 +404,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -37,6 +37,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -420,7 +421,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -402,7 +402,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -33,6 +33,7 @@ CONFIG_IOSCHED_BFQ=m
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
CONFIG_DMAPOOL_TEST=m
|
||||
CONFIG_USERFAULTFD=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
@@ -401,7 +402,6 @@ CONFIG_OCFS2_FS=m
|
||||
# CONFIG_OCFS2_DEBUG_MASKLOG is not set
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_QUOTA_NETLINK_INTERFACE=y
|
||||
# CONFIG_PRINT_QUOTA_WARNING is not set
|
||||
CONFIG_AUTOFS_FS=m
|
||||
CONFIG_FUSE_FS=m
|
||||
CONFIG_CUSE=m
|
||||
|
||||
@@ -24,8 +24,6 @@ CONFIG_SUN_PARTITION=y
|
||||
CONFIG_SYSV68_PARTITION=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* include/asm-m68k/bugs.h
|
||||
*
|
||||
* Copyright (C) 1994 Linus Torvalds
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is included by init/main.c to check for architecture-dependent bugs.
|
||||
*
|
||||
* Needs:
|
||||
* void check_bugs(void);
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
extern void check_bugs(void); /* in arch/m68k/kernel/setup.c */
|
||||
#else
|
||||
static void check_bugs(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
@@ -10,6 +10,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/delay.h>
|
||||
@@ -504,7 +505,7 @@ static int __init proc_hardware_init(void)
|
||||
module_init(proc_hardware_init);
|
||||
#endif
|
||||
|
||||
void check_bugs(void)
|
||||
void __init arch_cpu_finalize_init(void)
|
||||
{
|
||||
#if defined(CONFIG_FPU) && !defined(CONFIG_M68KFPU_EMU)
|
||||
if (m68k_fputype == 0) {
|
||||
|
||||
@@ -4,6 +4,7 @@ config MIPS
|
||||
default y
|
||||
select ARCH_32BIT_OFF_T if !64BIT
|
||||
select ARCH_BINFMT_ELF_STATE if MIPS_FP_SUPPORT
|
||||
select ARCH_HAS_CPU_FINALIZE_INIT
|
||||
select ARCH_HAS_CURRENT_STACK_POINTER if !CC_IS_CLANG || CLANG_VERSION >= 140000
|
||||
select ARCH_HAS_DEBUG_VIRTUAL if !64BIT
|
||||
select ARCH_HAS_FORTIFY_SOURCE
|
||||
@@ -2286,6 +2287,7 @@ config MIPS_CPS
|
||||
select MIPS_CM
|
||||
select MIPS_CPS_PM if HOTPLUG_CPU
|
||||
select SMP
|
||||
select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU
|
||||
select SYNC_R4K if (CEVT_R4K || CSRC_R4K)
|
||||
select SYS_SUPPORTS_HOTPLUG_CPU
|
||||
select SYS_SUPPORTS_SCHED_SMT if CPU_MIPSR6
|
||||
|
||||
@@ -345,6 +345,7 @@ void play_dead(void)
|
||||
int cpu = cpu_number_map(cvmx_get_core_num());
|
||||
|
||||
idle_task_exit();
|
||||
cpuhp_ap_report_dead();
|
||||
octeon_processor_boot = 0xff;
|
||||
per_cpu(cpu_state, cpu) = CPU_DEAD;
|
||||
|
||||
|
||||
@@ -1,17 +1,11 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* This is included by init/main.c to check for architecture-dependent bugs.
|
||||
*
|
||||
* Copyright (C) 2007 Maciej W. Rozycki
|
||||
*
|
||||
* Needs:
|
||||
* void check_bugs(void);
|
||||
*/
|
||||
#ifndef _ASM_BUGS_H
|
||||
#define _ASM_BUGS_H
|
||||
|
||||
#include <linux/bug.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
@@ -24,17 +18,6 @@ extern void check_bugs64_early(void);
|
||||
extern void check_bugs32(void);
|
||||
extern void check_bugs64(void);
|
||||
|
||||
static inline void __init check_bugs(void)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
cpu_data[cpu].udelay_val = loops_per_jiffy;
|
||||
check_bugs32();
|
||||
|
||||
if (IS_ENABLED(CONFIG_CPU_R4X00_BUGS64))
|
||||
check_bugs64();
|
||||
}
|
||||
|
||||
static inline int r4k_daddiu_bug(void)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_CPU_R4X00_BUGS64))
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
|
||||
#include <regs-clk.h>
|
||||
#include <regs-mux.h>
|
||||
#include <regs-pwm.h>
|
||||
#include <regs-rtc.h>
|
||||
#include <regs-wdt.h>
|
||||
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Copyright (c) 2014 Zhang, Keguang <keguang.zhang@gmail.com>
|
||||
*
|
||||
* Loongson 1 PWM Register Definitions.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_MACH_LOONGSON32_REGS_PWM_H
|
||||
#define __ASM_MACH_LOONGSON32_REGS_PWM_H
|
||||
|
||||
/* Loongson 1 PWM Timer Register Definitions */
|
||||
#define PWM_CNT 0x0
|
||||
#define PWM_HRC 0x4
|
||||
#define PWM_LRC 0x8
|
||||
#define PWM_CTRL 0xc
|
||||
|
||||
/* PWM Control Register Bits */
|
||||
#define CNT_RST BIT(7)
|
||||
#define INT_SR BIT(6)
|
||||
#define INT_EN BIT(5)
|
||||
#define PWM_SINGLE BIT(4)
|
||||
#define PWM_OE BIT(3)
|
||||
#define CNT_EN BIT(0)
|
||||
|
||||
#endif /* __ASM_MACH_LOONGSON32_REGS_PWM_H */
|
||||
@@ -33,6 +33,7 @@ struct plat_smp_ops {
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
int (*cpu_disable)(void);
|
||||
void (*cpu_die)(unsigned int cpu);
|
||||
void (*cleanup_dead_cpu)(unsigned cpu);
|
||||
#endif
|
||||
#ifdef CONFIG_KEXEC
|
||||
void (*kexec_nonboot_cpu)(void);
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
* Copyright (C) 2000, 2001, 2002, 2007 Maciej W. Rozycki
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/screen_info.h>
|
||||
@@ -841,3 +843,14 @@ static int __init setnocoherentio(char *str)
|
||||
}
|
||||
early_param("nocoherentio", setnocoherentio);
|
||||
#endif
|
||||
|
||||
void __init arch_cpu_finalize_init(void)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
cpu_data[cpu].udelay_val = loops_per_jiffy;
|
||||
check_bugs32();
|
||||
|
||||
if (IS_ENABLED(CONFIG_CPU_R4X00_BUGS64))
|
||||
check_bugs64();
|
||||
}
|
||||
|
||||
@@ -392,6 +392,7 @@ static void bmips_cpu_die(unsigned int cpu)
|
||||
void __ref play_dead(void)
|
||||
{
|
||||
idle_task_exit();
|
||||
cpuhp_ap_report_dead();
|
||||
|
||||
/* flush data cache */
|
||||
_dma_cache_wback_inv(0, ~0);
|
||||
|
||||
@@ -503,8 +503,7 @@ void play_dead(void)
|
||||
}
|
||||
}
|
||||
|
||||
/* This CPU has chosen its way out */
|
||||
(void)cpu_report_death();
|
||||
cpuhp_ap_report_dead();
|
||||
|
||||
cps_shutdown_this_cpu(cpu_death);
|
||||
|
||||
@@ -527,7 +526,9 @@ static void wait_for_sibling_halt(void *ptr_cpu)
|
||||
} while (!(halted & TCHALT_H));
|
||||
}
|
||||
|
||||
static void cps_cpu_die(unsigned int cpu)
|
||||
static void cps_cpu_die(unsigned int cpu) { }
|
||||
|
||||
static void cps_cleanup_dead_cpu(unsigned cpu)
|
||||
{
|
||||
unsigned core = cpu_core(&cpu_data[cpu]);
|
||||
unsigned int vpe_id = cpu_vpe_id(&cpu_data[cpu]);
|
||||
@@ -535,12 +536,6 @@ static void cps_cpu_die(unsigned int cpu)
|
||||
unsigned stat;
|
||||
int err;
|
||||
|
||||
/* Wait for the cpu to choose its way out */
|
||||
if (!cpu_wait_death(cpu, 5)) {
|
||||
pr_err("CPU%u: didn't offline\n", cpu);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now wait for the CPU to actually offline. Without doing this that
|
||||
* offlining may race with one or more of:
|
||||
@@ -624,6 +619,7 @@ static const struct plat_smp_ops cps_smp_ops = {
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
.cpu_disable = cps_cpu_disable,
|
||||
.cpu_die = cps_cpu_die,
|
||||
.cleanup_dead_cpu = cps_cleanup_dead_cpu,
|
||||
#endif
|
||||
#ifdef CONFIG_KEXEC
|
||||
.kexec_nonboot_cpu = cps_kexec_nonboot_cpu,
|
||||
|
||||
@@ -690,6 +690,14 @@ void flush_tlb_one(unsigned long vaddr)
|
||||
EXPORT_SYMBOL(flush_tlb_page);
|
||||
EXPORT_SYMBOL(flush_tlb_one);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CORE_SYNC_DEAD
|
||||
void arch_cpuhp_cleanup_dead_cpu(unsigned int cpu)
|
||||
{
|
||||
if (mp_ops->cleanup_dead_cpu)
|
||||
mp_ops->cleanup_dead_cpu(cpu);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
|
||||
|
||||
static void tick_broadcast_callee(void *info)
|
||||
|
||||
@@ -35,41 +35,4 @@ config LOONGSON1_LS1C
|
||||
select COMMON_CLK
|
||||
endchoice
|
||||
|
||||
menuconfig CEVT_CSRC_LS1X
|
||||
bool "Use PWM Timer for clockevent/clocksource"
|
||||
select MIPS_EXTERNAL_TIMER
|
||||
depends on CPU_LOONGSON32
|
||||
help
|
||||
This option changes the default clockevent/clocksource to PWM Timer,
|
||||
and is required by Loongson1 CPUFreq support.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
choice
|
||||
prompt "Select clockevent/clocksource"
|
||||
depends on CEVT_CSRC_LS1X
|
||||
default TIMER_USE_PWM0
|
||||
|
||||
config TIMER_USE_PWM0
|
||||
bool "Use PWM Timer 0"
|
||||
help
|
||||
Use PWM Timer 0 as the default clockevent/clocksourcer.
|
||||
|
||||
config TIMER_USE_PWM1
|
||||
bool "Use PWM Timer 1"
|
||||
help
|
||||
Use PWM Timer 1 as the default clockevent/clocksourcer.
|
||||
|
||||
config TIMER_USE_PWM2
|
||||
bool "Use PWM Timer 2"
|
||||
help
|
||||
Use PWM Timer 2 as the default clockevent/clocksourcer.
|
||||
|
||||
config TIMER_USE_PWM3
|
||||
bool "Use PWM Timer 3"
|
||||
help
|
||||
Use PWM Timer 3 as the default clockevent/clocksourcer.
|
||||
|
||||
endchoice
|
||||
|
||||
endif # MACH_LOONGSON32
|
||||
|
||||
@@ -5,208 +5,8 @@
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/of_clk.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sizes.h>
|
||||
#include <asm/time.h>
|
||||
|
||||
#include <loongson1.h>
|
||||
#include <platform.h>
|
||||
|
||||
#ifdef CONFIG_CEVT_CSRC_LS1X
|
||||
|
||||
#if defined(CONFIG_TIMER_USE_PWM1)
|
||||
#define LS1X_TIMER_BASE LS1X_PWM1_BASE
|
||||
#define LS1X_TIMER_IRQ LS1X_PWM1_IRQ
|
||||
|
||||
#elif defined(CONFIG_TIMER_USE_PWM2)
|
||||
#define LS1X_TIMER_BASE LS1X_PWM2_BASE
|
||||
#define LS1X_TIMER_IRQ LS1X_PWM2_IRQ
|
||||
|
||||
#elif defined(CONFIG_TIMER_USE_PWM3)
|
||||
#define LS1X_TIMER_BASE LS1X_PWM3_BASE
|
||||
#define LS1X_TIMER_IRQ LS1X_PWM3_IRQ
|
||||
|
||||
#else
|
||||
#define LS1X_TIMER_BASE LS1X_PWM0_BASE
|
||||
#define LS1X_TIMER_IRQ LS1X_PWM0_IRQ
|
||||
#endif
|
||||
|
||||
DEFINE_RAW_SPINLOCK(ls1x_timer_lock);
|
||||
|
||||
static void __iomem *timer_reg_base;
|
||||
static uint32_t ls1x_jiffies_per_tick;
|
||||
|
||||
static inline void ls1x_pwmtimer_set_period(uint32_t period)
|
||||
{
|
||||
__raw_writel(period, timer_reg_base + PWM_HRC);
|
||||
__raw_writel(period, timer_reg_base + PWM_LRC);
|
||||
}
|
||||
|
||||
static inline void ls1x_pwmtimer_restart(void)
|
||||
{
|
||||
__raw_writel(0x0, timer_reg_base + PWM_CNT);
|
||||
__raw_writel(INT_EN | CNT_EN, timer_reg_base + PWM_CTRL);
|
||||
}
|
||||
|
||||
void __init ls1x_pwmtimer_init(void)
|
||||
{
|
||||
timer_reg_base = ioremap(LS1X_TIMER_BASE, SZ_16);
|
||||
if (!timer_reg_base)
|
||||
panic("Failed to remap timer registers");
|
||||
|
||||
ls1x_jiffies_per_tick = DIV_ROUND_CLOSEST(mips_hpt_frequency, HZ);
|
||||
|
||||
ls1x_pwmtimer_set_period(ls1x_jiffies_per_tick);
|
||||
ls1x_pwmtimer_restart();
|
||||
}
|
||||
|
||||
static u64 ls1x_clocksource_read(struct clocksource *cs)
|
||||
{
|
||||
unsigned long flags;
|
||||
int count;
|
||||
u32 jifs;
|
||||
static int old_count;
|
||||
static u32 old_jifs;
|
||||
|
||||
raw_spin_lock_irqsave(&ls1x_timer_lock, flags);
|
||||
/*
|
||||
* Although our caller may have the read side of xtime_lock,
|
||||
* this is now a seqlock, and we are cheating in this routine
|
||||
* by having side effects on state that we cannot undo if
|
||||
* there is a collision on the seqlock and our caller has to
|
||||
* retry. (Namely, old_jifs and old_count.) So we must treat
|
||||
* jiffies as volatile despite the lock. We read jiffies
|
||||
* before latching the timer count to guarantee that although
|
||||
* the jiffies value might be older than the count (that is,
|
||||
* the counter may underflow between the last point where
|
||||
* jiffies was incremented and the point where we latch the
|
||||
* count), it cannot be newer.
|
||||
*/
|
||||
jifs = jiffies;
|
||||
/* read the count */
|
||||
count = __raw_readl(timer_reg_base + PWM_CNT);
|
||||
|
||||
/*
|
||||
* It's possible for count to appear to go the wrong way for this
|
||||
* reason:
|
||||
*
|
||||
* The timer counter underflows, but we haven't handled the resulting
|
||||
* interrupt and incremented jiffies yet.
|
||||
*
|
||||
* Previous attempts to handle these cases intelligently were buggy, so
|
||||
* we just do the simple thing now.
|
||||
*/
|
||||
if (count < old_count && jifs == old_jifs)
|
||||
count = old_count;
|
||||
|
||||
old_count = count;
|
||||
old_jifs = jifs;
|
||||
|
||||
raw_spin_unlock_irqrestore(&ls1x_timer_lock, flags);
|
||||
|
||||
return (u64) (jifs * ls1x_jiffies_per_tick) + count;
|
||||
}
|
||||
|
||||
static struct clocksource ls1x_clocksource = {
|
||||
.name = "ls1x-pwmtimer",
|
||||
.read = ls1x_clocksource_read,
|
||||
.mask = CLOCKSOURCE_MASK(24),
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
static irqreturn_t ls1x_clockevent_isr(int irq, void *devid)
|
||||
{
|
||||
struct clock_event_device *cd = devid;
|
||||
|
||||
ls1x_pwmtimer_restart();
|
||||
cd->event_handler(cd);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int ls1x_clockevent_set_state_periodic(struct clock_event_device *cd)
|
||||
{
|
||||
raw_spin_lock(&ls1x_timer_lock);
|
||||
ls1x_pwmtimer_set_period(ls1x_jiffies_per_tick);
|
||||
ls1x_pwmtimer_restart();
|
||||
__raw_writel(INT_EN | CNT_EN, timer_reg_base + PWM_CTRL);
|
||||
raw_spin_unlock(&ls1x_timer_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ls1x_clockevent_tick_resume(struct clock_event_device *cd)
|
||||
{
|
||||
raw_spin_lock(&ls1x_timer_lock);
|
||||
__raw_writel(INT_EN | CNT_EN, timer_reg_base + PWM_CTRL);
|
||||
raw_spin_unlock(&ls1x_timer_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ls1x_clockevent_set_state_shutdown(struct clock_event_device *cd)
|
||||
{
|
||||
raw_spin_lock(&ls1x_timer_lock);
|
||||
__raw_writel(__raw_readl(timer_reg_base + PWM_CTRL) & ~CNT_EN,
|
||||
timer_reg_base + PWM_CTRL);
|
||||
raw_spin_unlock(&ls1x_timer_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ls1x_clockevent_set_next(unsigned long evt,
|
||||
struct clock_event_device *cd)
|
||||
{
|
||||
raw_spin_lock(&ls1x_timer_lock);
|
||||
ls1x_pwmtimer_set_period(evt);
|
||||
ls1x_pwmtimer_restart();
|
||||
raw_spin_unlock(&ls1x_timer_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct clock_event_device ls1x_clockevent = {
|
||||
.name = "ls1x-pwmtimer",
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC,
|
||||
.rating = 300,
|
||||
.irq = LS1X_TIMER_IRQ,
|
||||
.set_next_event = ls1x_clockevent_set_next,
|
||||
.set_state_shutdown = ls1x_clockevent_set_state_shutdown,
|
||||
.set_state_periodic = ls1x_clockevent_set_state_periodic,
|
||||
.set_state_oneshot = ls1x_clockevent_set_state_shutdown,
|
||||
.tick_resume = ls1x_clockevent_tick_resume,
|
||||
};
|
||||
|
||||
static void __init ls1x_time_init(void)
|
||||
{
|
||||
struct clock_event_device *cd = &ls1x_clockevent;
|
||||
int ret;
|
||||
|
||||
if (!mips_hpt_frequency)
|
||||
panic("Invalid timer clock rate");
|
||||
|
||||
ls1x_pwmtimer_init();
|
||||
|
||||
clockevent_set_clock(cd, mips_hpt_frequency);
|
||||
cd->max_delta_ns = clockevent_delta2ns(0xffffff, cd);
|
||||
cd->max_delta_ticks = 0xffffff;
|
||||
cd->min_delta_ns = clockevent_delta2ns(0x000300, cd);
|
||||
cd->min_delta_ticks = 0x000300;
|
||||
cd->cpumask = cpumask_of(smp_processor_id());
|
||||
clockevents_register_device(cd);
|
||||
|
||||
ls1x_clocksource.rating = 200 + mips_hpt_frequency / 10000000;
|
||||
ret = clocksource_register_hz(&ls1x_clocksource, mips_hpt_frequency);
|
||||
if (ret)
|
||||
panic(KERN_ERR "Failed to register clocksource: %d\n", ret);
|
||||
|
||||
if (request_irq(LS1X_TIMER_IRQ, ls1x_clockevent_isr,
|
||||
IRQF_PERCPU | IRQF_TIMER, "ls1x-pwmtimer",
|
||||
&ls1x_clockevent))
|
||||
pr_err("Failed to register ls1x-pwmtimer interrupt\n");
|
||||
}
|
||||
#endif /* CONFIG_CEVT_CSRC_LS1X */
|
||||
|
||||
void __init plat_time_init(void)
|
||||
{
|
||||
struct clk *clk = NULL;
|
||||
@@ -214,20 +14,10 @@ void __init plat_time_init(void)
|
||||
/* initialize LS1X clocks */
|
||||
of_clk_init(NULL);
|
||||
|
||||
#ifdef CONFIG_CEVT_CSRC_LS1X
|
||||
/* setup LS1X PWM timer */
|
||||
clk = clk_get(NULL, "ls1x-pwmtimer");
|
||||
if (IS_ERR(clk))
|
||||
panic("unable to get timer clock, err=%ld", PTR_ERR(clk));
|
||||
|
||||
mips_hpt_frequency = clk_get_rate(clk);
|
||||
ls1x_time_init();
|
||||
#else
|
||||
/* setup mips r4k timer */
|
||||
clk = clk_get(NULL, "cpu_clk");
|
||||
if (IS_ERR(clk))
|
||||
panic("unable to get cpu clock, err=%ld", PTR_ERR(clk));
|
||||
|
||||
mips_hpt_frequency = clk_get_rate(clk) / 2;
|
||||
#endif /* CONFIG_CEVT_CSRC_LS1X */
|
||||
}
|
||||
|
||||
@@ -775,6 +775,7 @@ void play_dead(void)
|
||||
void (*play_dead_at_ckseg1)(int *);
|
||||
|
||||
idle_task_exit();
|
||||
cpuhp_ap_report_dead();
|
||||
|
||||
prid_imp = read_c0_prid() & PRID_IMP_MASK;
|
||||
prid_rev = read_c0_prid() & PRID_REV_MASK;
|
||||
|
||||
@@ -57,6 +57,7 @@ config PARISC
|
||||
select HAVE_ARCH_SECCOMP_FILTER
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||
select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU
|
||||
select GENERIC_SCHED_CLOCK
|
||||
select GENERIC_IRQ_MIGRATION if SMP
|
||||
select HAVE_UNSTABLE_SCHED_CLOCK if SMP
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* include/asm-parisc/bugs.h
|
||||
*
|
||||
* Copyright (C) 1999 Mike Shaver
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is included by init/main.c to check for architecture-dependent bugs.
|
||||
*
|
||||
* Needs:
|
||||
* void check_bugs(void);
|
||||
*/
|
||||
|
||||
#include <asm/processor.h>
|
||||
|
||||
static inline void check_bugs(void)
|
||||
{
|
||||
// identify_cpu(&boot_cpu_data);
|
||||
}
|
||||
@@ -171,8 +171,8 @@ void __noreturn arch_cpu_idle_dead(void)
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
/* Tell __cpu_die() that this CPU is now safe to dispose of. */
|
||||
(void)cpu_report_death();
|
||||
/* Tell the core that this CPU is now safe to dispose of. */
|
||||
cpuhp_ap_report_dead();
|
||||
|
||||
/* Ensure that the cache lines are written out. */
|
||||
flush_cache_all_local();
|
||||
|
||||
@@ -500,11 +500,10 @@ int __cpu_disable(void)
|
||||
void __cpu_die(unsigned int cpu)
|
||||
{
|
||||
pdc_cpu_rendezvous_lock();
|
||||
}
|
||||
|
||||
if (!cpu_wait_death(cpu, 5)) {
|
||||
pr_crit("CPU%u: cpu didn't die\n", cpu);
|
||||
return;
|
||||
}
|
||||
void arch_cpuhp_cleanup_dead_cpu(unsigned int cpu)
|
||||
{
|
||||
pr_info("CPU%u: is shutting down\n", cpu);
|
||||
|
||||
/* set task's state to interruptible sleep */
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
#ifndef _ASM_POWERPC_BUGS_H
|
||||
#define _ASM_POWERPC_BUGS_H
|
||||
|
||||
/*
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is included by 'init/main.c' to check for
|
||||
* architecture-dependent bugs.
|
||||
*/
|
||||
|
||||
static inline void check_bugs(void) { }
|
||||
|
||||
#endif /* _ASM_POWERPC_BUGS_H */
|
||||
@@ -124,6 +124,7 @@ config RISCV
|
||||
select HAVE_RSEQ
|
||||
select HAVE_STACKPROTECTOR
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HOTPLUG_CORE_SYNC_DEAD if HOTPLUG_CPU
|
||||
select IRQ_DOMAIN
|
||||
select IRQ_FORCED_THREADING
|
||||
select KASAN_VMALLOC if KASAN
|
||||
|
||||
@@ -70,7 +70,7 @@ asmlinkage void smp_callin(void);
|
||||
|
||||
#if defined CONFIG_HOTPLUG_CPU
|
||||
int __cpu_disable(void);
|
||||
void __cpu_die(unsigned int cpu);
|
||||
static inline void __cpu_die(unsigned int cpu) { }
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
#else
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/cpuhotplug.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/sched/hotplug.h>
|
||||
#include <asm/irq.h>
|
||||
@@ -49,17 +50,15 @@ int __cpu_disable(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
/*
|
||||
* Called on the thread which is asking for a CPU to be shutdown.
|
||||
* Called on the thread which is asking for a CPU to be shutdown, if the
|
||||
* CPU reported dead to the hotplug core.
|
||||
*/
|
||||
void __cpu_die(unsigned int cpu)
|
||||
void arch_cpuhp_cleanup_dead_cpu(unsigned int cpu)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (!cpu_wait_death(cpu, 5)) {
|
||||
pr_err("CPU %u: didn't die\n", cpu);
|
||||
return;
|
||||
}
|
||||
pr_notice("CPU%u: off\n", cpu);
|
||||
|
||||
/* Verify from the firmware if the cpu is really stopped*/
|
||||
@@ -76,9 +75,10 @@ void __noreturn arch_cpu_idle_dead(void)
|
||||
{
|
||||
idle_task_exit();
|
||||
|
||||
(void)cpu_report_death();
|
||||
cpuhp_ap_report_dead();
|
||||
|
||||
cpu_ops[smp_processor_id()]->cpu_stop();
|
||||
/* It should never reach here */
|
||||
BUG();
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -6,6 +6,7 @@ config SUPERH
|
||||
select ARCH_ENABLE_MEMORY_HOTREMOVE if SPARSEMEM && MMU
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG if (GUSA_RB || CPU_SH4A)
|
||||
select ARCH_HAS_BINFMT_FLAT if !MMU
|
||||
select ARCH_HAS_CPU_FINALIZE_INIT
|
||||
select ARCH_HAS_CURRENT_STACK_POINTER
|
||||
select ARCH_HAS_GIGANTIC_PAGE
|
||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __ASM_SH_BUGS_H
|
||||
#define __ASM_SH_BUGS_H
|
||||
|
||||
/*
|
||||
* This is included by init/main.c to check for architecture-dependent bugs.
|
||||
*
|
||||
* Needs:
|
||||
* void check_bugs(void);
|
||||
*/
|
||||
|
||||
/*
|
||||
* I don't know of any Super-H bugs yet.
|
||||
*/
|
||||
|
||||
#include <asm/processor.h>
|
||||
|
||||
extern void select_idle_routine(void);
|
||||
|
||||
static void __init check_bugs(void)
|
||||
{
|
||||
extern unsigned long loops_per_jiffy;
|
||||
char *p = &init_utsname()->machine[2]; /* "sh" */
|
||||
|
||||
select_idle_routine();
|
||||
|
||||
current_cpu_data.loops_per_jiffy = loops_per_jiffy;
|
||||
|
||||
switch (current_cpu_data.family) {
|
||||
case CPU_FAMILY_SH2:
|
||||
*p++ = '2';
|
||||
break;
|
||||
case CPU_FAMILY_SH2A:
|
||||
*p++ = '2';
|
||||
*p++ = 'a';
|
||||
break;
|
||||
case CPU_FAMILY_SH3:
|
||||
*p++ = '3';
|
||||
break;
|
||||
case CPU_FAMILY_SH4:
|
||||
*p++ = '4';
|
||||
break;
|
||||
case CPU_FAMILY_SH4A:
|
||||
*p++ = '4';
|
||||
*p++ = 'a';
|
||||
break;
|
||||
case CPU_FAMILY_SH4AL_DSP:
|
||||
*p++ = '4';
|
||||
*p++ = 'a';
|
||||
*p++ = 'l';
|
||||
*p++ = '-';
|
||||
*p++ = 'd';
|
||||
*p++ = 's';
|
||||
*p++ = 'p';
|
||||
break;
|
||||
case CPU_FAMILY_UNKNOWN:
|
||||
/*
|
||||
* Specifically use CPU_FAMILY_UNKNOWN rather than
|
||||
* default:, so we're able to have the compiler whine
|
||||
* about unhandled enumerations.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
|
||||
printk("CPU: %s\n", get_cpu_subtype(¤t_cpu_data));
|
||||
|
||||
#ifndef __LITTLE_ENDIAN__
|
||||
/* 'eb' means 'Endian Big' */
|
||||
*p++ = 'e';
|
||||
*p++ = 'b';
|
||||
#endif
|
||||
*p = '\0';
|
||||
}
|
||||
#endif /* __ASM_SH_BUGS_H */
|
||||
@@ -166,6 +166,8 @@ extern unsigned int instruction_size(unsigned int insn);
|
||||
#define instruction_size(insn) (2)
|
||||
#endif
|
||||
|
||||
void select_idle_routine(void);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#include <asm/processor_32.h>
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/irqflags.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/bl_bit.h>
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#include <asm/smp.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/mmzone.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/sparsemem.h>
|
||||
#include <asm/platform_early.h>
|
||||
|
||||
@@ -354,3 +355,57 @@ int test_mode_pin(int pin)
|
||||
{
|
||||
return sh_mv.mv_mode_pins() & pin;
|
||||
}
|
||||
|
||||
void __init arch_cpu_finalize_init(void)
|
||||
{
|
||||
char *p = &init_utsname()->machine[2]; /* "sh" */
|
||||
|
||||
select_idle_routine();
|
||||
|
||||
current_cpu_data.loops_per_jiffy = loops_per_jiffy;
|
||||
|
||||
switch (current_cpu_data.family) {
|
||||
case CPU_FAMILY_SH2:
|
||||
*p++ = '2';
|
||||
break;
|
||||
case CPU_FAMILY_SH2A:
|
||||
*p++ = '2';
|
||||
*p++ = 'a';
|
||||
break;
|
||||
case CPU_FAMILY_SH3:
|
||||
*p++ = '3';
|
||||
break;
|
||||
case CPU_FAMILY_SH4:
|
||||
*p++ = '4';
|
||||
break;
|
||||
case CPU_FAMILY_SH4A:
|
||||
*p++ = '4';
|
||||
*p++ = 'a';
|
||||
break;
|
||||
case CPU_FAMILY_SH4AL_DSP:
|
||||
*p++ = '4';
|
||||
*p++ = 'a';
|
||||
*p++ = 'l';
|
||||
*p++ = '-';
|
||||
*p++ = 'd';
|
||||
*p++ = 's';
|
||||
*p++ = 'p';
|
||||
break;
|
||||
case CPU_FAMILY_UNKNOWN:
|
||||
/*
|
||||
* Specifically use CPU_FAMILY_UNKNOWN rather than
|
||||
* default:, so we're able to have the compiler whine
|
||||
* about unhandled enumerations.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
|
||||
pr_info("CPU: %s\n", get_cpu_subtype(¤t_cpu_data));
|
||||
|
||||
#ifndef __LITTLE_ENDIAN__
|
||||
/* 'eb' means 'Endian Big' */
|
||||
*p++ = 'e';
|
||||
*p++ = 'b';
|
||||
#endif
|
||||
*p = '\0';
|
||||
}
|
||||
|
||||
@@ -52,6 +52,7 @@ config SPARC
|
||||
config SPARC32
|
||||
def_bool !64BIT
|
||||
select ARCH_32BIT_OFF_T
|
||||
select ARCH_HAS_CPU_FINALIZE_INIT if !SMP
|
||||
select ARCH_HAS_SYNC_DMA_FOR_CPU
|
||||
select CLZ_TAB
|
||||
select DMA_DIRECT_REMAP
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* include/asm/bugs.h: Sparc probes for various bugs.
|
||||
*
|
||||
* Copyright (C) 1996, 2007 David S. Miller (davem@davemloft.net)
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_SPARC32
|
||||
#include <asm/cpudata.h>
|
||||
#endif
|
||||
|
||||
extern unsigned long loops_per_jiffy;
|
||||
|
||||
static void __init check_bugs(void)
|
||||
{
|
||||
#if defined(CONFIG_SPARC32) && !defined(CONFIG_SMP)
|
||||
cpu_data(0).udelay_val = loops_per_jiffy;
|
||||
#endif
|
||||
}
|
||||
@@ -412,3 +412,10 @@ static int __init topology_init(void)
|
||||
}
|
||||
|
||||
subsys_initcall(topology_init);
|
||||
|
||||
#if defined(CONFIG_SPARC32) && !defined(CONFIG_SMP)
|
||||
void __init arch_cpu_finalize_init(void)
|
||||
{
|
||||
cpu_data(0).udelay_val = loops_per_jiffy;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -6,6 +6,7 @@ config UML
|
||||
bool
|
||||
default y
|
||||
select ARCH_EPHEMERAL_INODES
|
||||
select ARCH_HAS_CPU_FINALIZE_INIT
|
||||
select ARCH_HAS_FORTIFY_SOURCE
|
||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||
select ARCH_HAS_KCOV
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __UM_BUGS_H
|
||||
#define __UM_BUGS_H
|
||||
|
||||
void check_bugs(void);
|
||||
|
||||
#endif
|
||||
@@ -3,6 +3,7 @@
|
||||
* Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
|
||||
*/
|
||||
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
@@ -430,7 +431,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
}
|
||||
}
|
||||
|
||||
void __init check_bugs(void)
|
||||
void __init arch_cpu_finalize_init(void)
|
||||
{
|
||||
arch_check_bugs();
|
||||
os_check_bugs();
|
||||
|
||||
+7
-55
@@ -71,6 +71,7 @@ config X86
|
||||
select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI
|
||||
select ARCH_HAS_CACHE_LINE_SIZE
|
||||
select ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION
|
||||
select ARCH_HAS_CPU_FINALIZE_INIT
|
||||
select ARCH_HAS_CURRENT_STACK_POINTER
|
||||
select ARCH_HAS_DEBUG_VIRTUAL
|
||||
select ARCH_HAS_DEBUG_VM_PGTABLE if !X86_PAE
|
||||
@@ -274,7 +275,9 @@ config X86
|
||||
select HAVE_UNSTABLE_SCHED_CLOCK
|
||||
select HAVE_USER_RETURN_NOTIFIER
|
||||
select HAVE_GENERIC_VDSO
|
||||
select HOTPLUG_PARALLEL if SMP && X86_64
|
||||
select HOTPLUG_SMT if SMP
|
||||
select HOTPLUG_SPLIT_STARTUP if SMP && X86_32
|
||||
select IRQ_FORCED_THREADING
|
||||
select NEED_PER_CPU_EMBED_FIRST_CHUNK
|
||||
select NEED_PER_CPU_PAGE_FIRST_CHUNK
|
||||
@@ -291,7 +294,6 @@ config X86
|
||||
select TRACE_IRQFLAGS_NMI_SUPPORT
|
||||
select USER_STACKTRACE_SUPPORT
|
||||
select HAVE_ARCH_KCSAN if X86_64
|
||||
select X86_FEATURE_NAMES if PROC_FS
|
||||
select PROC_PID_ARCH_STATUS if PROC_FS
|
||||
select HAVE_ARCH_NODE_DEV_GROUP if X86_SGX
|
||||
select FUNCTION_ALIGNMENT_16B if X86_64 || X86_ALIGNMENT_16
|
||||
@@ -441,17 +443,6 @@ config SMP
|
||||
|
||||
If you don't know what to do here, say N.
|
||||
|
||||
config X86_FEATURE_NAMES
|
||||
bool "Processor feature human-readable names" if EMBEDDED
|
||||
default y
|
||||
help
|
||||
This option compiles in a table of x86 feature bits and corresponding
|
||||
names. This is required to support /proc/cpuinfo and a few kernel
|
||||
messages. You can disable this to save space, at the expense of
|
||||
making those few kernel messages show numeric feature bits instead.
|
||||
|
||||
If in doubt, say Y.
|
||||
|
||||
config X86_X2APIC
|
||||
bool "Support x2apic"
|
||||
depends on X86_LOCAL_APIC && X86_64 && (IRQ_REMAP || HYPERVISOR_GUEST)
|
||||
@@ -884,9 +875,11 @@ config INTEL_TDX_GUEST
|
||||
bool "Intel TDX (Trust Domain Extensions) - Guest Support"
|
||||
depends on X86_64 && CPU_SUP_INTEL
|
||||
depends on X86_X2APIC
|
||||
depends on EFI_STUB
|
||||
select ARCH_HAS_CC_PLATFORM
|
||||
select X86_MEM_ENCRYPT
|
||||
select X86_MCE
|
||||
select UNACCEPTED_MEMORY
|
||||
help
|
||||
Support running as a guest under Intel TDX. Without this support,
|
||||
the guest kernel can not boot or run under TDX.
|
||||
@@ -1541,11 +1534,13 @@ config X86_MEM_ENCRYPT
|
||||
config AMD_MEM_ENCRYPT
|
||||
bool "AMD Secure Memory Encryption (SME) support"
|
||||
depends on X86_64 && CPU_SUP_AMD
|
||||
depends on EFI_STUB
|
||||
select DMA_COHERENT_POOL
|
||||
select ARCH_USE_MEMREMAP_PROT
|
||||
select INSTRUCTION_DECODER
|
||||
select ARCH_HAS_CC_PLATFORM
|
||||
select X86_MEM_ENCRYPT
|
||||
select UNACCEPTED_MEMORY
|
||||
help
|
||||
Say yes to enable support for the encryption of system memory.
|
||||
This requires an AMD processor that supports Secure Memory
|
||||
@@ -2305,49 +2300,6 @@ config HOTPLUG_CPU
|
||||
def_bool y
|
||||
depends on SMP
|
||||
|
||||
config BOOTPARAM_HOTPLUG_CPU0
|
||||
bool "Set default setting of cpu0_hotpluggable"
|
||||
depends on HOTPLUG_CPU
|
||||
help
|
||||
Set whether default state of cpu0_hotpluggable is on or off.
|
||||
|
||||
Say Y here to enable CPU0 hotplug by default. If this switch
|
||||
is turned on, there is no need to give cpu0_hotplug kernel
|
||||
parameter and the CPU0 hotplug feature is enabled by default.
|
||||
|
||||
Please note: there are two known CPU0 dependencies if you want
|
||||
to enable the CPU0 hotplug feature either by this switch or by
|
||||
cpu0_hotplug kernel parameter.
|
||||
|
||||
First, resume from hibernate or suspend always starts from CPU0.
|
||||
So hibernate and suspend are prevented if CPU0 is offline.
|
||||
|
||||
Second dependency is PIC interrupts always go to CPU0. CPU0 can not
|
||||
offline if any interrupt can not migrate out of CPU0. There may
|
||||
be other CPU0 dependencies.
|
||||
|
||||
Please make sure the dependencies are under your control before
|
||||
you enable this feature.
|
||||
|
||||
Say N if you don't want to enable CPU0 hotplug feature by default.
|
||||
You still can enable the CPU0 hotplug feature at boot by kernel
|
||||
parameter cpu0_hotplug.
|
||||
|
||||
config DEBUG_HOTPLUG_CPU0
|
||||
def_bool n
|
||||
prompt "Debug CPU0 hotplug"
|
||||
depends on HOTPLUG_CPU
|
||||
help
|
||||
Enabling this option offlines CPU0 (if CPU0 can be offlined) as
|
||||
soon as possible and boots up userspace with CPU0 offlined. User
|
||||
can online CPU0 back after boot time.
|
||||
|
||||
To debug CPU0 hotplug, you need to enable CPU0 offline/online
|
||||
feature by either turning on CONFIG_BOOTPARAM_HOTPLUG_CPU0 during
|
||||
compilation or giving cpu0_hotplug kernel parameter at boot.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config COMPAT_VDSO
|
||||
def_bool n
|
||||
prompt "Disable the 32-bit vDSO (needed for glibc 2.3.3)"
|
||||
|
||||
@@ -389,7 +389,7 @@ config IA32_FEAT_CTL
|
||||
|
||||
config X86_VMX_FEATURE_NAMES
|
||||
def_bool y
|
||||
depends on IA32_FEAT_CTL && X86_FEATURE_NAMES
|
||||
depends on IA32_FEAT_CTL
|
||||
|
||||
menuconfig PROCESSOR_SELECT
|
||||
bool "Supported processor vendors" if EXPERT
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# ===========================================================================
|
||||
# Post-link x86 pass
|
||||
# ===========================================================================
|
||||
#
|
||||
# 1. Separate relocations from vmlinux into vmlinux.relocs.
|
||||
# 2. Strip relocations from vmlinux.
|
||||
|
||||
PHONY := __archpost
|
||||
__archpost:
|
||||
|
||||
-include include/config/auto.conf
|
||||
include $(srctree)/scripts/Kbuild.include
|
||||
|
||||
CMD_RELOCS = arch/x86/tools/relocs
|
||||
OUT_RELOCS = arch/x86/boot/compressed
|
||||
quiet_cmd_relocs = RELOCS $(OUT_RELOCS)/$@.relocs
|
||||
cmd_relocs = \
|
||||
mkdir -p $(OUT_RELOCS); \
|
||||
$(CMD_RELOCS) $@ > $(OUT_RELOCS)/$@.relocs; \
|
||||
$(CMD_RELOCS) --abs-relocs $@
|
||||
|
||||
quiet_cmd_strip_relocs = RSTRIP $@
|
||||
cmd_strip_relocs = \
|
||||
$(OBJCOPY) --remove-section='.rel.*' --remove-section='.rel__*' \
|
||||
--remove-section='.rela.*' --remove-section='.rela__*' $@
|
||||
|
||||
# `@true` prevents complaint when there is nothing to be done
|
||||
|
||||
vmlinux: FORCE
|
||||
@true
|
||||
ifeq ($(CONFIG_X86_NEED_RELOCS),y)
|
||||
$(call cmd,relocs)
|
||||
$(call cmd,strip_relocs)
|
||||
endif
|
||||
|
||||
%.ko: FORCE
|
||||
@true
|
||||
|
||||
clean:
|
||||
@rm -f $(OUT_RELOCS)/vmlinux.relocs
|
||||
|
||||
PHONY += FORCE clean
|
||||
|
||||
FORCE:
|
||||
|
||||
.PHONY: $(PHONY)
|
||||
@@ -55,14 +55,12 @@ HOST_EXTRACFLAGS += -I$(srctree)/tools/include \
|
||||
-include include/generated/autoconf.h \
|
||||
-D__EXPORTED_HEADERS__
|
||||
|
||||
ifdef CONFIG_X86_FEATURE_NAMES
|
||||
$(obj)/cpu.o: $(obj)/cpustr.h
|
||||
|
||||
quiet_cmd_cpustr = CPUSTR $@
|
||||
cmd_cpustr = $(obj)/mkcpustr > $@
|
||||
$(obj)/cpustr.h: $(obj)/mkcpustr FORCE
|
||||
$(call if_changed,cpustr)
|
||||
endif
|
||||
targets += cpustr.h
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@@ -106,7 +106,8 @@ ifdef CONFIG_X86_64
|
||||
endif
|
||||
|
||||
vmlinux-objs-$(CONFIG_ACPI) += $(obj)/acpi.o
|
||||
vmlinux-objs-$(CONFIG_INTEL_TDX_GUEST) += $(obj)/tdx.o $(obj)/tdcall.o
|
||||
vmlinux-objs-$(CONFIG_INTEL_TDX_GUEST) += $(obj)/tdx.o $(obj)/tdcall.o $(obj)/tdx-shared.o
|
||||
vmlinux-objs-$(CONFIG_UNACCEPTED_MEMORY) += $(obj)/mem.o
|
||||
|
||||
vmlinux-objs-$(CONFIG_EFI) += $(obj)/efi.o
|
||||
vmlinux-objs-$(CONFIG_EFI_MIXED) += $(obj)/efi_mixed.o
|
||||
@@ -121,11 +122,9 @@ $(obj)/vmlinux.bin: vmlinux FORCE
|
||||
|
||||
targets += $(patsubst $(obj)/%,%,$(vmlinux-objs-y)) vmlinux.bin.all vmlinux.relocs
|
||||
|
||||
CMD_RELOCS = arch/x86/tools/relocs
|
||||
quiet_cmd_relocs = RELOCS $@
|
||||
cmd_relocs = $(CMD_RELOCS) $< > $@;$(CMD_RELOCS) --abs-relocs $<
|
||||
$(obj)/vmlinux.relocs: vmlinux FORCE
|
||||
$(call if_changed,relocs)
|
||||
# vmlinux.relocs is created by the vmlinux postlink step.
|
||||
$(obj)/vmlinux.relocs: vmlinux
|
||||
@true
|
||||
|
||||
vmlinux.bin.all-y := $(obj)/vmlinux.bin
|
||||
vmlinux.bin.all-$(CONFIG_X86_NEED_RELOCS) += $(obj)/vmlinux.relocs
|
||||
|
||||
@@ -16,6 +16,7 @@ typedef guid_t efi_guid_t __aligned(__alignof__(u32));
|
||||
#define ACPI_TABLE_GUID EFI_GUID(0xeb9d2d30, 0x2d88, 0x11d3, 0x9a, 0x16, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
|
||||
#define ACPI_20_TABLE_GUID EFI_GUID(0x8868e871, 0xe4f1, 0x11d3, 0xbc, 0x22, 0x00, 0x80, 0xc7, 0x3c, 0x88, 0x81)
|
||||
#define EFI_CC_BLOB_GUID EFI_GUID(0x067b1f5f, 0xcf26, 0x44c5, 0x85, 0x54, 0x93, 0xd7, 0x77, 0x91, 0x2d, 0x42)
|
||||
#define LINUX_EFI_UNACCEPTED_MEM_TABLE_GUID EFI_GUID(0xd5d1de3c, 0x105c, 0x44f9, 0x9e, 0xa9, 0xbc, 0xef, 0x98, 0x12, 0x00, 0x31)
|
||||
|
||||
#define EFI32_LOADER_SIGNATURE "EL32"
|
||||
#define EFI64_LOADER_SIGNATURE "EL64"
|
||||
@@ -32,6 +33,7 @@ typedef struct {
|
||||
} efi_table_hdr_t;
|
||||
|
||||
#define EFI_CONVENTIONAL_MEMORY 7
|
||||
#define EFI_UNACCEPTED_MEMORY 15
|
||||
|
||||
#define EFI_MEMORY_MORE_RELIABLE \
|
||||
((u64)0x0000000000010000ULL) /* higher reliability */
|
||||
@@ -104,6 +106,14 @@ struct efi_setup_data {
|
||||
u64 reserved[8];
|
||||
};
|
||||
|
||||
struct efi_unaccepted_memory {
|
||||
u32 version;
|
||||
u32 unit_size;
|
||||
u64 phys_base;
|
||||
u64 size;
|
||||
unsigned long bitmap[];
|
||||
};
|
||||
|
||||
static inline int efi_guidcmp (efi_guid_t left, efi_guid_t right)
|
||||
{
|
||||
return memcmp(&left, &right, sizeof (efi_guid_t));
|
||||
|
||||
@@ -22,3 +22,22 @@ void error(char *m)
|
||||
while (1)
|
||||
asm("hlt");
|
||||
}
|
||||
|
||||
/* EFI libstub provides vsnprintf() */
|
||||
#ifdef CONFIG_EFI_STUB
|
||||
void panic(const char *fmt, ...)
|
||||
{
|
||||
static char buf[1024];
|
||||
va_list args;
|
||||
int len;
|
||||
|
||||
va_start(args, fmt);
|
||||
len = vsnprintf(buf, sizeof(buf), fmt, args);
|
||||
va_end(args);
|
||||
|
||||
if (len && buf[len - 1] == '\n')
|
||||
buf[len - 1] = '\0';
|
||||
|
||||
error(buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -6,5 +6,6 @@
|
||||
|
||||
void warn(char *m);
|
||||
void error(char *m) __noreturn;
|
||||
void panic(const char *fmt, ...) __noreturn __cold;
|
||||
|
||||
#endif /* BOOT_COMPRESSED_ERROR_H */
|
||||
|
||||
@@ -672,6 +672,33 @@ static bool process_mem_region(struct mem_vector *region,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_EFI
|
||||
|
||||
/*
|
||||
* Only EFI_CONVENTIONAL_MEMORY and EFI_UNACCEPTED_MEMORY (if supported) are
|
||||
* guaranteed to be free.
|
||||
*
|
||||
* Pick free memory more conservatively than the EFI spec allows: according to
|
||||
* the spec, EFI_BOOT_SERVICES_{CODE|DATA} are also free memory and thus
|
||||
* available to place the kernel image into, but in practice there's firmware
|
||||
* where using that memory leads to crashes. Buggy vendor EFI code registers
|
||||
* for an event that triggers on SetVirtualAddressMap(). The handler assumes
|
||||
* that EFI_BOOT_SERVICES_DATA memory has not been touched by loader yet, which
|
||||
* is probably true for Windows.
|
||||
*
|
||||
* Preserve EFI_BOOT_SERVICES_* regions until after SetVirtualAddressMap().
|
||||
*/
|
||||
static inline bool memory_type_is_free(efi_memory_desc_t *md)
|
||||
{
|
||||
if (md->type == EFI_CONVENTIONAL_MEMORY)
|
||||
return true;
|
||||
|
||||
if (IS_ENABLED(CONFIG_UNACCEPTED_MEMORY) &&
|
||||
md->type == EFI_UNACCEPTED_MEMORY)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns true if we processed the EFI memmap, which we prefer over the E820
|
||||
* table if it is available.
|
||||
@@ -716,18 +743,7 @@ process_efi_entries(unsigned long minimum, unsigned long image_size)
|
||||
for (i = 0; i < nr_desc; i++) {
|
||||
md = efi_early_memdesc_ptr(pmap, e->efi_memdesc_size, i);
|
||||
|
||||
/*
|
||||
* Here we are more conservative in picking free memory than
|
||||
* the EFI spec allows:
|
||||
*
|
||||
* According to the spec, EFI_BOOT_SERVICES_{CODE|DATA} are also
|
||||
* free memory and thus available to place the kernel image into,
|
||||
* but in practice there's firmware where using that memory leads
|
||||
* to crashes.
|
||||
*
|
||||
* Only EFI_CONVENTIONAL_MEMORY is guaranteed to be free.
|
||||
*/
|
||||
if (md->type != EFI_CONVENTIONAL_MEMORY)
|
||||
if (!memory_type_is_free(md))
|
||||
continue;
|
||||
|
||||
if (efi_soft_reserve_enabled() &&
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
#include "error.h"
|
||||
#include "misc.h"
|
||||
#include "tdx.h"
|
||||
#include "sev.h"
|
||||
#include <asm/shared/tdx.h>
|
||||
|
||||
/*
|
||||
* accept_memory() and process_unaccepted_memory() called from EFI stub which
|
||||
* runs before decompresser and its early_tdx_detect().
|
||||
*
|
||||
* Enumerate TDX directly from the early users.
|
||||
*/
|
||||
static bool early_is_tdx_guest(void)
|
||||
{
|
||||
static bool once;
|
||||
static bool is_tdx;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_INTEL_TDX_GUEST))
|
||||
return false;
|
||||
|
||||
if (!once) {
|
||||
u32 eax, sig[3];
|
||||
|
||||
cpuid_count(TDX_CPUID_LEAF_ID, 0, &eax,
|
||||
&sig[0], &sig[2], &sig[1]);
|
||||
is_tdx = !memcmp(TDX_IDENT, sig, sizeof(sig));
|
||||
once = true;
|
||||
}
|
||||
|
||||
return is_tdx;
|
||||
}
|
||||
|
||||
void arch_accept_memory(phys_addr_t start, phys_addr_t end)
|
||||
{
|
||||
/* Platform-specific memory-acceptance call goes here */
|
||||
if (early_is_tdx_guest()) {
|
||||
if (!tdx_accept_memory(start, end))
|
||||
panic("TDX: Failed to accept memory\n");
|
||||
} else if (sev_snp_enabled()) {
|
||||
snp_accept_memory(start, end);
|
||||
} else {
|
||||
error("Cannot accept memory: unknown platform\n");
|
||||
}
|
||||
}
|
||||
|
||||
bool init_unaccepted_memory(void)
|
||||
{
|
||||
guid_t guid = LINUX_EFI_UNACCEPTED_MEM_TABLE_GUID;
|
||||
struct efi_unaccepted_memory *table;
|
||||
unsigned long cfg_table_pa;
|
||||
unsigned int cfg_table_len;
|
||||
enum efi_type et;
|
||||
int ret;
|
||||
|
||||
et = efi_get_type(boot_params);
|
||||
if (et == EFI_TYPE_NONE)
|
||||
return false;
|
||||
|
||||
ret = efi_get_conf_table(boot_params, &cfg_table_pa, &cfg_table_len);
|
||||
if (ret) {
|
||||
warn("EFI config table not found.");
|
||||
return false;
|
||||
}
|
||||
|
||||
table = (void *)efi_find_vendor_table(boot_params, cfg_table_pa,
|
||||
cfg_table_len, guid);
|
||||
if (!table)
|
||||
return false;
|
||||
|
||||
if (table->version != 1)
|
||||
error("Unknown version of unaccepted memory table\n");
|
||||
|
||||
/*
|
||||
* In many cases unaccepted_table is already set by EFI stub, but it
|
||||
* has to be initialized again to cover cases when the table is not
|
||||
* allocated by EFI stub or EFI stub copied the kernel image with
|
||||
* efi_relocate_kernel() before the variable is set.
|
||||
*
|
||||
* It must be initialized before the first usage of accept_memory().
|
||||
*/
|
||||
unaccepted_table = table;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -455,6 +455,12 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap,
|
||||
#endif
|
||||
|
||||
debug_putstr("\nDecompressing Linux... ");
|
||||
|
||||
if (init_unaccepted_memory()) {
|
||||
debug_putstr("Accepting memory... ");
|
||||
accept_memory(__pa(output), __pa(output) + needed_size);
|
||||
}
|
||||
|
||||
__decompress(input_data, input_len, NULL, NULL, output, output_len,
|
||||
NULL, error);
|
||||
entry_offset = parse_elf(output);
|
||||
|
||||
@@ -247,4 +247,14 @@ static inline unsigned long efi_find_vendor_table(struct boot_params *bp,
|
||||
}
|
||||
#endif /* CONFIG_EFI */
|
||||
|
||||
#ifdef CONFIG_UNACCEPTED_MEMORY
|
||||
bool init_unaccepted_memory(void);
|
||||
#else
|
||||
static inline bool init_unaccepted_memory(void) { return false; }
|
||||
#endif
|
||||
|
||||
/* Defined in EFI stub */
|
||||
extern struct efi_unaccepted_memory *unaccepted_table;
|
||||
void accept_memory(phys_addr_t start, phys_addr_t end);
|
||||
|
||||
#endif /* BOOT_COMPRESSED_MISC_H */
|
||||
|
||||
@@ -115,7 +115,7 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt,
|
||||
/* Include code for early handlers */
|
||||
#include "../../kernel/sev-shared.c"
|
||||
|
||||
static inline bool sev_snp_enabled(void)
|
||||
bool sev_snp_enabled(void)
|
||||
{
|
||||
return sev_status & MSR_AMD64_SEV_SNP_ENABLED;
|
||||
}
|
||||
@@ -181,6 +181,58 @@ static bool early_setup_ghcb(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
static phys_addr_t __snp_accept_memory(struct snp_psc_desc *desc,
|
||||
phys_addr_t pa, phys_addr_t pa_end)
|
||||
{
|
||||
struct psc_hdr *hdr;
|
||||
struct psc_entry *e;
|
||||
unsigned int i;
|
||||
|
||||
hdr = &desc->hdr;
|
||||
memset(hdr, 0, sizeof(*hdr));
|
||||
|
||||
e = desc->entries;
|
||||
|
||||
i = 0;
|
||||
while (pa < pa_end && i < VMGEXIT_PSC_MAX_ENTRY) {
|
||||
hdr->end_entry = i;
|
||||
|
||||
e->gfn = pa >> PAGE_SHIFT;
|
||||
e->operation = SNP_PAGE_STATE_PRIVATE;
|
||||
if (IS_ALIGNED(pa, PMD_SIZE) && (pa_end - pa) >= PMD_SIZE) {
|
||||
e->pagesize = RMP_PG_SIZE_2M;
|
||||
pa += PMD_SIZE;
|
||||
} else {
|
||||
e->pagesize = RMP_PG_SIZE_4K;
|
||||
pa += PAGE_SIZE;
|
||||
}
|
||||
|
||||
e++;
|
||||
i++;
|
||||
}
|
||||
|
||||
if (vmgexit_psc(boot_ghcb, desc))
|
||||
sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_PSC);
|
||||
|
||||
pvalidate_pages(desc);
|
||||
|
||||
return pa;
|
||||
}
|
||||
|
||||
void snp_accept_memory(phys_addr_t start, phys_addr_t end)
|
||||
{
|
||||
struct snp_psc_desc desc = {};
|
||||
unsigned int i;
|
||||
phys_addr_t pa;
|
||||
|
||||
if (!boot_ghcb && !early_setup_ghcb())
|
||||
sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_PSC);
|
||||
|
||||
pa = start;
|
||||
while (pa < end)
|
||||
pa = __snp_accept_memory(&desc, pa, end);
|
||||
}
|
||||
|
||||
void sev_es_shutdown_ghcb(void)
|
||||
{
|
||||
if (!boot_ghcb)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* AMD SEV header for early boot related functions.
|
||||
*
|
||||
* Author: Tom Lendacky <thomas.lendacky@amd.com>
|
||||
*/
|
||||
|
||||
#ifndef BOOT_COMPRESSED_SEV_H
|
||||
#define BOOT_COMPRESSED_SEV_H
|
||||
|
||||
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
||||
|
||||
bool sev_snp_enabled(void);
|
||||
void snp_accept_memory(phys_addr_t start, phys_addr_t end);
|
||||
|
||||
#else
|
||||
|
||||
static inline bool sev_snp_enabled(void) { return false; }
|
||||
static inline void snp_accept_memory(phys_addr_t start, phys_addr_t end) { }
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,2 @@
|
||||
#include "error.h"
|
||||
#include "../../coco/tdx/tdx-shared.c"
|
||||
@@ -20,7 +20,7 @@ static inline unsigned int tdx_io_in(int size, u16 port)
|
||||
{
|
||||
struct tdx_hypercall_args args = {
|
||||
.r10 = TDX_HYPERCALL_STANDARD,
|
||||
.r11 = EXIT_REASON_IO_INSTRUCTION,
|
||||
.r11 = hcall_func(EXIT_REASON_IO_INSTRUCTION),
|
||||
.r12 = size,
|
||||
.r13 = 0,
|
||||
.r14 = port,
|
||||
@@ -36,7 +36,7 @@ static inline void tdx_io_out(int size, u16 port, u32 value)
|
||||
{
|
||||
struct tdx_hypercall_args args = {
|
||||
.r10 = TDX_HYPERCALL_STANDARD,
|
||||
.r11 = EXIT_REASON_IO_INSTRUCTION,
|
||||
.r11 = hcall_func(EXIT_REASON_IO_INSTRUCTION),
|
||||
.r12 = size,
|
||||
.r13 = 1,
|
||||
.r14 = port,
|
||||
|
||||
@@ -14,9 +14,7 @@
|
||||
*/
|
||||
|
||||
#include "boot.h"
|
||||
#ifdef CONFIG_X86_FEATURE_NAMES
|
||||
#include "cpustr.h"
|
||||
#endif
|
||||
|
||||
static char *cpu_name(int level)
|
||||
{
|
||||
@@ -35,7 +33,6 @@ static char *cpu_name(int level)
|
||||
static void show_cap_strs(u32 *err_flags)
|
||||
{
|
||||
int i, j;
|
||||
#ifdef CONFIG_X86_FEATURE_NAMES
|
||||
const unsigned char *msg_strs = (const unsigned char *)x86_cap_strs;
|
||||
for (i = 0; i < NCAPINTS; i++) {
|
||||
u32 e = err_flags[i];
|
||||
@@ -58,16 +55,6 @@ static void show_cap_strs(u32 *err_flags)
|
||||
e >>= 1;
|
||||
}
|
||||
}
|
||||
#else
|
||||
for (i = 0; i < NCAPINTS; i++) {
|
||||
u32 e = err_flags[i];
|
||||
for (j = 0; j < 32; j++) {
|
||||
if (e & 1)
|
||||
printf("%d:%d ", i, j);
|
||||
e >>= 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int validate_cpu(void)
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
obj-y += tdx.o tdcall.o
|
||||
obj-y += tdx.o tdx-shared.o tdcall.o
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
#include <asm/tdx.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
static unsigned long try_accept_one(phys_addr_t start, unsigned long len,
|
||||
enum pg_level pg_level)
|
||||
{
|
||||
unsigned long accept_size = page_level_size(pg_level);
|
||||
u64 tdcall_rcx;
|
||||
u8 page_size;
|
||||
|
||||
if (!IS_ALIGNED(start, accept_size))
|
||||
return 0;
|
||||
|
||||
if (len < accept_size)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Pass the page physical address to the TDX module to accept the
|
||||
* pending, private page.
|
||||
*
|
||||
* Bits 2:0 of RCX encode page size: 0 - 4K, 1 - 2M, 2 - 1G.
|
||||
*/
|
||||
switch (pg_level) {
|
||||
case PG_LEVEL_4K:
|
||||
page_size = 0;
|
||||
break;
|
||||
case PG_LEVEL_2M:
|
||||
page_size = 1;
|
||||
break;
|
||||
case PG_LEVEL_1G:
|
||||
page_size = 2;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
tdcall_rcx = start | page_size;
|
||||
if (__tdx_module_call(TDX_ACCEPT_PAGE, tdcall_rcx, 0, 0, 0, NULL))
|
||||
return 0;
|
||||
|
||||
return accept_size;
|
||||
}
|
||||
|
||||
bool tdx_accept_memory(phys_addr_t start, phys_addr_t end)
|
||||
{
|
||||
/*
|
||||
* For shared->private conversion, accept the page using
|
||||
* TDX_ACCEPT_PAGE TDX module call.
|
||||
*/
|
||||
while (start < end) {
|
||||
unsigned long len = end - start;
|
||||
unsigned long accept_size;
|
||||
|
||||
/*
|
||||
* Try larger accepts first. It gives chance to VMM to keep
|
||||
* 1G/2M Secure EPT entries where possible and speeds up
|
||||
* process by cutting number of hypercalls (if successful).
|
||||
*/
|
||||
|
||||
accept_size = try_accept_one(start, len, PG_LEVEL_1G);
|
||||
if (!accept_size)
|
||||
accept_size = try_accept_one(start, len, PG_LEVEL_2M);
|
||||
if (!accept_size)
|
||||
accept_size = try_accept_one(start, len, PG_LEVEL_4K);
|
||||
if (!accept_size)
|
||||
return false;
|
||||
start += accept_size;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user