Pull in char-misc-next from Greg
We need 32ea33a044
("mei: bus: export to_mei_cl_device for mei
client devices drivers") for the mei-hdcp patches.
References: https://lkml.org/lkml/2019/2/19/356
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
This commit is contained in:
commit
4509209f8b
|
@ -24,7 +24,7 @@ What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/
|
|||
cpld3_version
|
||||
|
||||
Date: November 2018
|
||||
KernelVersion: 4.21
|
||||
KernelVersion: 5.0
|
||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||
Description: These files show with which CPLD versions have been burned
|
||||
on LED board.
|
||||
|
@ -35,7 +35,7 @@ What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/
|
|||
jtag_enable
|
||||
|
||||
Date: November 2018
|
||||
KernelVersion: 4.21
|
||||
KernelVersion: 5.0
|
||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||
Description: These files enable and disable the access to the JTAG domain.
|
||||
By default access to the JTAG domain is disabled.
|
||||
|
@ -105,7 +105,7 @@ What: /sys/devices/platform/mlxplat/mlxreg-io/hwmon/hwmon*/
|
|||
reset_voltmon_upgrade_fail
|
||||
|
||||
Date: November 2018
|
||||
KernelVersion: 4.21
|
||||
KernelVersion: 5.0
|
||||
Contact: Vadim Pasternak <vadimpmellanox.com>
|
||||
Description: These files show the system reset cause, as following: ComEx
|
||||
power fail, reset from ComEx, system platform reset, reset
|
||||
|
|
|
@ -1696,12 +1696,11 @@
|
|||
By default, super page will be supported if Intel IOMMU
|
||||
has the capability. With this option, super page will
|
||||
not be supported.
|
||||
sm_off [Default Off]
|
||||
By default, scalable mode will be supported if the
|
||||
sm_on [Default Off]
|
||||
By default, scalable mode will be disabled even if the
|
||||
hardware advertises that it has support for the scalable
|
||||
mode translation. With this option set, scalable mode
|
||||
will not be used even on hardware which claims to support
|
||||
it.
|
||||
will be used on hardware which claims to support it.
|
||||
tboot_noforce [Default Off]
|
||||
Do not force the Intel IOMMU enabled under tboot.
|
||||
By default, tboot will force Intel IOMMU on, which
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
* PTN5150 CC (Configuration Channel) Logic device
|
||||
|
||||
PTN5150 is a small thin low power CC logic chip supporting the USB Type-C
|
||||
connector application with CC control logic detection and indication functions.
|
||||
It is interfaced to the host controller using an I2C interface.
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "nxp,ptn5150"
|
||||
- reg: specifies the I2C slave address of the device
|
||||
- int-gpio: should contain a phandle and GPIO specifier for the GPIO pin
|
||||
connected to the PTN5150's INTB pin.
|
||||
- vbus-gpio: should contain a phandle and GPIO specifier for the GPIO pin which
|
||||
is used to control VBUS.
|
||||
- pinctrl-names : a pinctrl state named "default" must be defined.
|
||||
- pinctrl-0 : phandle referencing pin configuration of interrupt and vbus
|
||||
control.
|
||||
|
||||
Example:
|
||||
ptn5150@1d {
|
||||
compatible = "nxp,ptn5150";
|
||||
reg = <0x1d>;
|
||||
int-gpio = <&msmgpio 78 GPIO_ACTIVE_HIGH>;
|
||||
vbus-gpio = <&msmgpio 148 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ptn5150_default>;
|
||||
status = "okay";
|
||||
};
|
|
@ -0,0 +1,60 @@
|
|||
Interconnect Provider Device Tree Bindings
|
||||
=========================================
|
||||
|
||||
The purpose of this document is to define a common set of generic interconnect
|
||||
providers/consumers properties.
|
||||
|
||||
|
||||
= interconnect providers =
|
||||
|
||||
The interconnect provider binding is intended to represent the interconnect
|
||||
controllers in the system. Each provider registers a set of interconnect
|
||||
nodes, which expose the interconnect related capabilities of the interconnect
|
||||
to consumer drivers. These capabilities can be throughput, latency, priority
|
||||
etc. The consumer drivers set constraints on interconnect path (or endpoints)
|
||||
depending on the use case. Interconnect providers can also be interconnect
|
||||
consumers, such as in the case where two network-on-chip fabrics interface
|
||||
directly.
|
||||
|
||||
Required properties:
|
||||
- compatible : contains the interconnect provider compatible string
|
||||
- #interconnect-cells : number of cells in a interconnect specifier needed to
|
||||
encode the interconnect node id
|
||||
|
||||
Example:
|
||||
|
||||
snoc: interconnect@580000 {
|
||||
compatible = "qcom,msm8916-snoc";
|
||||
#interconnect-cells = <1>;
|
||||
reg = <0x580000 0x14000>;
|
||||
clock-names = "bus_clk", "bus_a_clk";
|
||||
clocks = <&rpmcc RPM_SMD_SNOC_CLK>,
|
||||
<&rpmcc RPM_SMD_SNOC_A_CLK>;
|
||||
};
|
||||
|
||||
|
||||
= interconnect consumers =
|
||||
|
||||
The interconnect consumers are device nodes which dynamically express their
|
||||
bandwidth requirements along interconnect paths they are connected to. There
|
||||
can be multiple interconnect providers on a SoC and the consumer may consume
|
||||
multiple paths from different providers depending on use case and the
|
||||
components it has to interact with.
|
||||
|
||||
Required properties:
|
||||
interconnects : Pairs of phandles and interconnect provider specifier to denote
|
||||
the edge source and destination ports of the interconnect path.
|
||||
|
||||
Optional properties:
|
||||
interconnect-names : List of interconnect path name strings sorted in the same
|
||||
order as the interconnects property. Consumers drivers will use
|
||||
interconnect-names to match interconnect paths with interconnect
|
||||
specifier pairs.
|
||||
|
||||
Example:
|
||||
|
||||
sdhci@7864000 {
|
||||
...
|
||||
interconnects = <&pnoc MASTER_SDCC_1 &bimc SLAVE_EBI_CH0>;
|
||||
interconnect-names = "sdhc-mem";
|
||||
};
|
|
@ -0,0 +1,24 @@
|
|||
Qualcomm SDM845 Network-On-Chip interconnect driver binding
|
||||
-----------------------------------------------------------
|
||||
|
||||
SDM845 interconnect providers support system bandwidth requirements through
|
||||
RPMh hardware accelerators known as Bus Clock Manager (BCM). The provider is
|
||||
able to communicate with the BCM through the Resource State Coordinator (RSC)
|
||||
associated with each execution environment. Provider nodes must reside within
|
||||
an RPMh device node pertaining to their RSC and each provider maps to a single
|
||||
RPMh resource.
|
||||
|
||||
Required properties :
|
||||
- compatible : shall contain only one of the following:
|
||||
"qcom,sdm845-rsc-hlos"
|
||||
- #interconnect-cells : should contain 1
|
||||
|
||||
Examples:
|
||||
|
||||
apps_rsc: rsc {
|
||||
rsc_hlos: interconnect {
|
||||
compatible = "qcom,sdm845-rsc-hlos";
|
||||
#interconnect-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
Freescale i.MX6 On-Chip OTP Controller (OCOTP) device tree bindings
|
||||
|
||||
This binding represents the on-chip eFuse OTP controller found on
|
||||
i.MX6Q/D, i.MX6DL/S, i.MX6SL, i.MX6SX, i.MX6UL and i.MX6SLL SoCs.
|
||||
i.MX6Q/D, i.MX6DL/S, i.MX6SL, i.MX6SX, i.MX6UL, i.MX6ULL/ULZ and i.MX6SLL SoCs.
|
||||
|
||||
Required properties:
|
||||
- compatible: should be one of
|
||||
|
@ -9,8 +9,10 @@ Required properties:
|
|||
"fsl,imx6sl-ocotp" (i.MX6SL), or
|
||||
"fsl,imx6sx-ocotp" (i.MX6SX),
|
||||
"fsl,imx6ul-ocotp" (i.MX6UL),
|
||||
"fsl,imx6ull-ocotp" (i.MX6ULL/ULZ),
|
||||
"fsl,imx7d-ocotp" (i.MX7D/S),
|
||||
"fsl,imx6sll-ocotp" (i.MX6SLL),
|
||||
"fsl,imx7ulp-ocotp" (i.MX7ULP),
|
||||
followed by "syscon".
|
||||
- #address-cells : Should be 1
|
||||
- #size-cells : Should be 1
|
||||
|
|
|
@ -0,0 +1,94 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=====================================
|
||||
GENERIC SYSTEM INTERCONNECT SUBSYSTEM
|
||||
=====================================
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
This framework is designed to provide a standard kernel interface to control
|
||||
the settings of the interconnects on an SoC. These settings can be throughput,
|
||||
latency and priority between multiple interconnected devices or functional
|
||||
blocks. This can be controlled dynamically in order to save power or provide
|
||||
maximum performance.
|
||||
|
||||
The interconnect bus is hardware with configurable parameters, which can be
|
||||
set on a data path according to the requests received from various drivers.
|
||||
An example of interconnect buses are the interconnects between various
|
||||
components or functional blocks in chipsets. There can be multiple interconnects
|
||||
on an SoC that can be multi-tiered.
|
||||
|
||||
Below is a simplified diagram of a real-world SoC interconnect bus topology.
|
||||
|
||||
::
|
||||
|
||||
+----------------+ +----------------+
|
||||
| HW Accelerator |--->| M NoC |<---------------+
|
||||
+----------------+ +----------------+ |
|
||||
| | +------------+
|
||||
+-----+ +-------------+ V +------+ | |
|
||||
| DDR | | +--------+ | PCIe | | |
|
||||
+-----+ | | Slaves | +------+ | |
|
||||
^ ^ | +--------+ | | C NoC |
|
||||
| | V V | |
|
||||
+------------------+ +------------------------+ | | +-----+
|
||||
| |-->| |-->| |-->| CPU |
|
||||
| |-->| |<--| | +-----+
|
||||
| Mem NoC | | S NoC | +------------+
|
||||
| |<--| |---------+ |
|
||||
| |<--| |<------+ | | +--------+
|
||||
+------------------+ +------------------------+ | | +-->| Slaves |
|
||||
^ ^ ^ ^ ^ | | +--------+
|
||||
| | | | | | V
|
||||
+------+ | +-----+ +-----+ +---------+ +----------------+ +--------+
|
||||
| CPUs | | | GPU | | DSP | | Masters |-->| P NoC |-->| Slaves |
|
||||
+------+ | +-----+ +-----+ +---------+ +----------------+ +--------+
|
||||
|
|
||||
+-------+
|
||||
| Modem |
|
||||
+-------+
|
||||
|
||||
Terminology
|
||||
-----------
|
||||
|
||||
Interconnect provider is the software definition of the interconnect hardware.
|
||||
The interconnect providers on the above diagram are M NoC, S NoC, C NoC, P NoC
|
||||
and Mem NoC.
|
||||
|
||||
Interconnect node is the software definition of the interconnect hardware
|
||||
port. Each interconnect provider consists of multiple interconnect nodes,
|
||||
which are connected to other SoC components including other interconnect
|
||||
providers. The point on the diagram where the CPUs connect to the memory is
|
||||
called an interconnect node, which belongs to the Mem NoC interconnect provider.
|
||||
|
||||
Interconnect endpoints are the first or the last element of the path. Every
|
||||
endpoint is a node, but not every node is an endpoint.
|
||||
|
||||
Interconnect path is everything between two endpoints including all the nodes
|
||||
that have to be traversed to reach from a source to destination node. It may
|
||||
include multiple master-slave pairs across several interconnect providers.
|
||||
|
||||
Interconnect consumers are the entities which make use of the data paths exposed
|
||||
by the providers. The consumers send requests to providers requesting various
|
||||
throughput, latency and priority. Usually the consumers are device drivers, that
|
||||
send request based on their needs. An example for a consumer is a video decoder
|
||||
that supports various formats and image sizes.
|
||||
|
||||
Interconnect providers
|
||||
----------------------
|
||||
|
||||
Interconnect provider is an entity that implements methods to initialize and
|
||||
configure interconnect bus hardware. The interconnect provider drivers should
|
||||
be registered with the interconnect provider core.
|
||||
|
||||
.. kernel-doc:: include/linux/interconnect-provider.h
|
||||
|
||||
Interconnect consumers
|
||||
----------------------
|
||||
|
||||
Interconnect consumers are the clients which use the interconnect APIs to
|
||||
get paths between endpoints and set their bandwidth/latency/QoS requirements
|
||||
for these interconnect paths.
|
||||
|
||||
.. kernel-doc:: include/linux/interconnect.h
|
35
MAINTAINERS
35
MAINTAINERS
|
@ -2848,6 +2848,9 @@ F: include/uapi/linux/if_bonding.h
|
|||
BPF (Safe dynamic programs and tools)
|
||||
M: Alexei Starovoitov <ast@kernel.org>
|
||||
M: Daniel Borkmann <daniel@iogearbox.net>
|
||||
R: Martin KaFai Lau <kafai@fb.com>
|
||||
R: Song Liu <songliubraving@fb.com>
|
||||
R: Yonghong Song <yhs@fb.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git
|
||||
|
@ -2873,6 +2876,8 @@ F: samples/bpf/
|
|||
F: tools/bpf/
|
||||
F: tools/lib/bpf/
|
||||
F: tools/testing/selftests/bpf/
|
||||
K: bpf
|
||||
N: bpf
|
||||
|
||||
BPF JIT for ARM
|
||||
M: Shubham Bansal <illusionist.neo@gmail.com>
|
||||
|
@ -5181,7 +5186,7 @@ DRM DRIVERS FOR XEN
|
|||
M: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
|
||||
T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
L: xen-devel@lists.xen.org
|
||||
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: drivers/gpu/drm/xen/
|
||||
F: Documentation/gpu/xen-front.rst
|
||||
|
@ -7883,6 +7888,16 @@ L: linux-gpio@vger.kernel.org
|
|||
S: Maintained
|
||||
F: drivers/gpio/gpio-intel-mid.c
|
||||
|
||||
INTERCONNECT API
|
||||
M: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
S: Maintained
|
||||
F: Documentation/interconnect/
|
||||
F: Documentation/devicetree/bindings/interconnect/
|
||||
F: drivers/interconnect/
|
||||
F: include/dt-bindings/interconnect/
|
||||
F: include/linux/interconnect-provider.h
|
||||
F: include/linux/interconnect.h
|
||||
|
||||
INVENSENSE MPU-3050 GYROSCOPE DRIVER
|
||||
M: Linus Walleij <linus.walleij@linaro.org>
|
||||
L: linux-iio@vger.kernel.org
|
||||
|
@ -11307,10 +11322,12 @@ F: include/dt-bindings/
|
|||
|
||||
OPENCORES I2C BUS DRIVER
|
||||
M: Peter Korsgaard <peter@korsgaard.com>
|
||||
M: Andrew Lunn <andrew@lunn.ch>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/i2c/busses/i2c-ocores
|
||||
F: drivers/i2c/busses/i2c-ocores.c
|
||||
F: include/linux/platform_data/i2c-ocores.h
|
||||
|
||||
OPENRISC ARCHITECTURE
|
||||
M: Jonas Bonn <jonas@southpole.se>
|
||||
|
@ -12868,6 +12885,13 @@ F: Documentation/devicetree/bindings/net/dsa/realtek-smi.txt
|
|||
F: drivers/net/dsa/realtek-smi*
|
||||
F: drivers/net/dsa/rtl83*
|
||||
|
||||
REDPINE WIRELESS DRIVER
|
||||
M: Amitkumar Karwar <amitkarwar@gmail.com>
|
||||
M: Siva Rebbagondla <siva8118@gmail.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/rsi/
|
||||
|
||||
REGISTER MAP ABSTRACTION
|
||||
M: Mark Brown <broonie@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
|
@ -13696,6 +13720,15 @@ L: netdev@vger.kernel.org
|
|||
S: Supported
|
||||
F: drivers/net/ethernet/sfc/
|
||||
|
||||
SFF/SFP/SFP+ MODULE SUPPORT
|
||||
M: Russell King <linux@armlinux.org.uk>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/phy/phylink.c
|
||||
F: drivers/net/phy/sfp*
|
||||
F: include/linux/phylink.h
|
||||
F: include/linux/sfp.h
|
||||
|
||||
SGI GRU DRIVER
|
||||
M: Dimitri Sivanich <sivanich@sgi.com>
|
||||
S: Maintained
|
||||
|
|
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
|||
VERSION = 5
|
||||
PATCHLEVEL = 0
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Shy Crocodile
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -701,6 +701,9 @@ config HAVE_ARCH_HASH
|
|||
file which provides platform-specific implementations of some
|
||||
functions in <linux/hash.h> or fs/namei.c.
|
||||
|
||||
config HAVE_ARCH_NVRAM_OPS
|
||||
bool
|
||||
|
||||
config ISA_BUS_API
|
||||
def_bool ISA
|
||||
|
||||
|
|
|
@ -215,7 +215,7 @@
|
|||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mmc1_pins>;
|
||||
bus-width = <0x4>;
|
||||
cd-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
|
||||
cd-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
|
||||
cd-inverted;
|
||||
max-frequency = <26000000>;
|
||||
vmmc-supply = <&vmmcsd_fixed>;
|
||||
|
|
|
@ -476,7 +476,7 @@
|
|||
clocksource: timer@20000 {
|
||||
compatible = "ti,da830-timer";
|
||||
reg = <0x20000 0x1000>;
|
||||
interrupts = <12>, <13>;
|
||||
interrupts = <21>, <22>;
|
||||
interrupt-names = "tint12", "tint34";
|
||||
clocks = <&pll0_auxclk>;
|
||||
};
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
power {
|
||||
label = "Power Button";
|
||||
gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
|
||||
gpio-key,wakeup;
|
||||
wakeup-source;
|
||||
linux,code = <KEY_POWER>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -309,7 +309,7 @@
|
|||
pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
|
||||
cd-gpios = <&gpio3 22 GPIO_ACTIVE_LOW>;
|
||||
keep-power-in-suspend;
|
||||
enable-sdio-wakeup;
|
||||
wakeup-source;
|
||||
vmmc-supply = <®_sd3_vmmc>;
|
||||
status = "okay";
|
||||
};
|
||||
|
|
|
@ -467,7 +467,7 @@
|
|||
};
|
||||
|
||||
gpt: gpt@2098000 {
|
||||
compatible = "fsl,imx6sx-gpt", "fsl,imx31-gpt";
|
||||
compatible = "fsl,imx6sx-gpt", "fsl,imx6dl-gpt";
|
||||
reg = <0x02098000 0x4000>;
|
||||
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6SX_CLK_GPT_BUS>,
|
||||
|
|
|
@ -274,7 +274,7 @@
|
|||
compatible = "amlogic,meson6-dwmac", "snps,dwmac";
|
||||
reg = <0xc9410000 0x10000
|
||||
0xc1108108 0x4>;
|
||||
interrupts = <GIC_SPI 8 IRQ_TYPE_EDGE_RISING>;
|
||||
interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq";
|
||||
status = "disabled";
|
||||
};
|
||||
|
|
|
@ -205,8 +205,7 @@
|
|||
cap-sd-highspeed;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vcc_3v3>;
|
||||
};
|
||||
|
|
|
@ -221,7 +221,6 @@
|
|||
/* Realtek RTL8211F (0x001cc916) */
|
||||
eth_phy: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
eee-broken-1000t;
|
||||
interrupt-parent = <&gpio_intc>;
|
||||
/* GPIOH_3 */
|
||||
interrupts = <17 IRQ_TYPE_LEVEL_LOW>;
|
||||
|
@ -273,8 +272,7 @@
|
|||
cap-sd-highspeed;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&tflash_vdd>;
|
||||
vqmmc-supply = <&tf_io>;
|
||||
|
|
|
@ -206,8 +206,7 @@
|
|||
cap-sd-highspeed;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vcc_3v3>;
|
||||
};
|
||||
|
|
|
@ -105,7 +105,7 @@
|
|||
interrupts-extended = <
|
||||
&cpcap 15 0 &cpcap 14 0 &cpcap 28 0 &cpcap 19 0
|
||||
&cpcap 18 0 &cpcap 17 0 &cpcap 16 0 &cpcap 49 0
|
||||
&cpcap 48 1
|
||||
&cpcap 48 0
|
||||
>;
|
||||
interrupt-names =
|
||||
"id_ground", "id_float", "se0conn", "vbusvld",
|
||||
|
|
|
@ -714,11 +714,7 @@
|
|||
|
||||
vdda-supply = <&vdac>;
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port {
|
||||
reg = <0>;
|
||||
venc_out: endpoint {
|
||||
remote-endpoint = <&opa_in>;
|
||||
ti,channels = <1>;
|
||||
|
|
|
@ -814,7 +814,7 @@
|
|||
/* For debugging, it is often good idea to remove this GPIO.
|
||||
It means you can remove back cover (to reboot by removing
|
||||
battery) and still use the MMC card. */
|
||||
cd-gpios = <&gpio6 0 GPIO_ACTIVE_HIGH>; /* 160 */
|
||||
cd-gpios = <&gpio6 0 GPIO_ACTIVE_LOW>; /* 160 */
|
||||
};
|
||||
|
||||
/* most boards use vaux3, only some old versions use vmmc2 instead */
|
||||
|
|
|
@ -370,6 +370,19 @@
|
|||
compatible = "ti,omap2-onenand";
|
||||
reg = <0 0 0x20000>; /* CS0, offset 0, IO size 128K */
|
||||
|
||||
/*
|
||||
* These timings are based on CONFIG_OMAP_GPMC_DEBUG=y reported
|
||||
* bootloader set values when booted with v4.19 using both N950
|
||||
* and N9 devices (OneNAND Manufacturer: Samsung):
|
||||
*
|
||||
* gpmc cs0 before gpmc_cs_program_settings:
|
||||
* cs0 GPMC_CS_CONFIG1: 0xfd001202
|
||||
* cs0 GPMC_CS_CONFIG2: 0x00181800
|
||||
* cs0 GPMC_CS_CONFIG3: 0x00030300
|
||||
* cs0 GPMC_CS_CONFIG4: 0x18001804
|
||||
* cs0 GPMC_CS_CONFIG5: 0x03171d1d
|
||||
* cs0 GPMC_CS_CONFIG6: 0x97080000
|
||||
*/
|
||||
gpmc,sync-read;
|
||||
gpmc,sync-write;
|
||||
gpmc,burst-length = <16>;
|
||||
|
@ -379,26 +392,27 @@
|
|||
gpmc,device-width = <2>;
|
||||
gpmc,mux-add-data = <2>;
|
||||
gpmc,cs-on-ns = <0>;
|
||||
gpmc,cs-rd-off-ns = <87>;
|
||||
gpmc,cs-wr-off-ns = <87>;
|
||||
gpmc,cs-rd-off-ns = <122>;
|
||||
gpmc,cs-wr-off-ns = <122>;
|
||||
gpmc,adv-on-ns = <0>;
|
||||
gpmc,adv-rd-off-ns = <10>;
|
||||
gpmc,adv-wr-off-ns = <10>;
|
||||
gpmc,oe-on-ns = <15>;
|
||||
gpmc,oe-off-ns = <87>;
|
||||
gpmc,adv-rd-off-ns = <15>;
|
||||
gpmc,adv-wr-off-ns = <15>;
|
||||
gpmc,oe-on-ns = <20>;
|
||||
gpmc,oe-off-ns = <122>;
|
||||
gpmc,we-on-ns = <0>;
|
||||
gpmc,we-off-ns = <87>;
|
||||
gpmc,rd-cycle-ns = <112>;
|
||||
gpmc,wr-cycle-ns = <112>;
|
||||
gpmc,access-ns = <81>;
|
||||
gpmc,we-off-ns = <122>;
|
||||
gpmc,rd-cycle-ns = <148>;
|
||||
gpmc,wr-cycle-ns = <148>;
|
||||
gpmc,access-ns = <117>;
|
||||
gpmc,page-burst-access-ns = <15>;
|
||||
gpmc,bus-turnaround-ns = <0>;
|
||||
gpmc,cycle2cycle-delay-ns = <0>;
|
||||
gpmc,wait-monitoring-ns = <0>;
|
||||
gpmc,clk-activation-ns = <5>;
|
||||
gpmc,wr-data-mux-bus-ns = <30>;
|
||||
gpmc,wr-access-ns = <81>;
|
||||
gpmc,sync-clk-ps = <15000>;
|
||||
gpmc,clk-activation-ns = <10>;
|
||||
gpmc,wr-data-mux-bus-ns = <40>;
|
||||
gpmc,wr-access-ns = <117>;
|
||||
|
||||
gpmc,sync-clk-ps = <15000>; /* TBC; Where this value came? */
|
||||
|
||||
/*
|
||||
* MTD partition table corresponding to Nokia's MeeGo 1.2
|
||||
|
|
|
@ -1046,8 +1046,6 @@
|
|||
<SYSC_IDLE_SMART>,
|
||||
<SYSC_IDLE_SMART_WKUP>;
|
||||
ti,syss-mask = <1>;
|
||||
ti,no-reset-on-init;
|
||||
ti,no-idle-on-init;
|
||||
/* Domains (V, P, C): core, core_pwrdm, l4per_clkdm */
|
||||
clocks = <&l4per_clkctrl OMAP5_UART3_CLKCTRL 0>;
|
||||
clock-names = "fck";
|
||||
|
|
|
@ -1681,15 +1681,12 @@
|
|||
|
||||
du: display@feb00000 {
|
||||
compatible = "renesas,du-r8a7743";
|
||||
reg = <0 0xfeb00000 0 0x40000>,
|
||||
<0 0xfeb90000 0 0x1c>;
|
||||
reg-names = "du", "lvds.0";
|
||||
reg = <0 0xfeb00000 0 0x40000>;
|
||||
interrupts = <GIC_SPI 256 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 268 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cpg CPG_MOD 724>,
|
||||
<&cpg CPG_MOD 723>,
|
||||
<&cpg CPG_MOD 726>;
|
||||
clock-names = "du.0", "du.1", "lvds.0";
|
||||
<&cpg CPG_MOD 723>;
|
||||
clock-names = "du.0", "du.1";
|
||||
status = "disabled";
|
||||
|
||||
ports {
|
||||
|
@ -1704,6 +1701,33 @@
|
|||
port@1 {
|
||||
reg = <1>;
|
||||
du_out_lvds0: endpoint {
|
||||
remote-endpoint = <&lvds0_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
lvds0: lvds@feb90000 {
|
||||
compatible = "renesas,r8a7743-lvds";
|
||||
reg = <0 0xfeb90000 0 0x1c>;
|
||||
clocks = <&cpg CPG_MOD 726>;
|
||||
power-domains = <&sysc R8A7743_PD_ALWAYS_ON>;
|
||||
resets = <&cpg 726>;
|
||||
status = "disabled";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
lvds0_in: endpoint {
|
||||
remote-endpoint = <&du_out_lvds0>;
|
||||
};
|
||||
};
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
lvds0_out: endpoint {
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -216,6 +216,7 @@
|
|||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <24000000>;
|
||||
clock-output-names = "osc24M";
|
||||
};
|
||||
|
||||
osc32k: clk-32k {
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
/* ethernet0 is the H3 emac, defined in sun8i-h3.dtsi */
|
||||
ethernet0 = &emac;
|
||||
ethernet1 = &sdiowifi;
|
||||
};
|
||||
|
||||
|
|
|
@ -110,11 +110,11 @@
|
|||
bus-num = <3>;
|
||||
status = "okay";
|
||||
spi-slave;
|
||||
#address-cells = <0>;
|
||||
|
||||
slave@0 {
|
||||
slave {
|
||||
compatible = "lwn,bk4";
|
||||
spi-max-frequency = <30000000>;
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -75,8 +75,7 @@ void __init n2100_map_io(void)
|
|||
/*
|
||||
* N2100 PCI.
|
||||
*/
|
||||
static int __init
|
||||
n2100_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
static int n2100_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int irq;
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include <linux/suspend.h>
|
||||
#include <asm/suspend.h>
|
||||
#include "smc.h"
|
||||
#include "pm.h"
|
||||
|
||||
static int tango_pm_powerdown(unsigned long arg)
|
||||
{
|
||||
|
@ -24,10 +25,7 @@ static const struct platform_suspend_ops tango_pm_ops = {
|
|||
.valid = suspend_valid_only_mem,
|
||||
};
|
||||
|
||||
static int __init tango_pm_init(void)
|
||||
void __init tango_pm_init(void)
|
||||
{
|
||||
suspend_set_ops(&tango_pm_ops);
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(tango_pm_init);
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
void __init tango_pm_init(void);
|
||||
#else
|
||||
#define tango_pm_init NULL
|
||||
#endif
|
|
@ -2,6 +2,7 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
#include "smc.h"
|
||||
#include "pm.h"
|
||||
|
||||
static void tango_l2c_write(unsigned long val, unsigned int reg)
|
||||
{
|
||||
|
@ -15,4 +16,5 @@ DT_MACHINE_START(TANGO_DT, "Sigma Tango DT")
|
|||
.dt_compat = tango_dt_compat,
|
||||
.l2c_aux_mask = ~0,
|
||||
.l2c_write_sec = tango_l2c_write,
|
||||
.init_late = tango_pm_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -190,8 +190,6 @@ static int pxa_ssp_remove(struct platform_device *pdev)
|
|||
if (ssp == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
iounmap(ssp->mmio_base);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
|
||||
|
@ -201,7 +199,6 @@ static int pxa_ssp_remove(struct platform_device *pdev)
|
|||
list_del(&ssp->node);
|
||||
mutex_unlock(&ssp_lock);
|
||||
|
||||
kfree(ssp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
#include <linux/of_address.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/swiotlb.h>
|
||||
|
||||
|
|
|
@ -188,6 +188,7 @@
|
|||
reg = <0x3a3>;
|
||||
interrupt-parent = <&r_intc>;
|
||||
interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
|
||||
x-powers,drive-vbus-en; /* set N_VBUSEN as output pin */
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -390,7 +390,7 @@
|
|||
};
|
||||
|
||||
video-codec@1c0e000 {
|
||||
compatible = "allwinner,sun50i-h5-video-engine";
|
||||
compatible = "allwinner,sun50i-a64-video-engine";
|
||||
reg = <0x01c0e000 0x1000>;
|
||||
clocks = <&ccu CLK_BUS_VE>, <&ccu CLK_VE>,
|
||||
<&ccu CLK_DRAM_VE>;
|
||||
|
|
|
@ -187,8 +187,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddao_3v3>;
|
||||
vqmmc-supply = <&vddio_boot>;
|
||||
|
|
|
@ -305,8 +305,7 @@
|
|||
max-frequency = <200000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddio_ao3v3>;
|
||||
vqmmc-supply = <&vddio_tf>;
|
||||
|
|
|
@ -238,8 +238,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddao_3v3>;
|
||||
vqmmc-supply = <&vddio_card>;
|
||||
|
|
|
@ -258,8 +258,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&tflash_vdd>;
|
||||
vqmmc-supply = <&tf_io>;
|
||||
|
|
|
@ -196,8 +196,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddao_3v3>;
|
||||
vqmmc-supply = <&vddio_card>;
|
||||
|
|
|
@ -154,8 +154,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vcc_3v3>;
|
||||
};
|
||||
|
|
|
@ -211,8 +211,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddao_3v3>;
|
||||
vqmmc-supply = <&vcc_3v3>;
|
||||
|
|
|
@ -131,8 +131,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddao_3v3>;
|
||||
vqmmc-supply = <&vddio_card>;
|
||||
|
|
|
@ -238,8 +238,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vcc_3v3>;
|
||||
vqmmc-supply = <&vcc_card>;
|
||||
|
|
|
@ -183,8 +183,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddao_3v3>;
|
||||
vqmmc-supply = <&vddio_card>;
|
||||
|
|
|
@ -137,8 +137,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddao_3v3>;
|
||||
vqmmc-supply = <&vddio_boot>;
|
||||
|
|
|
@ -356,8 +356,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddao_3v3>;
|
||||
vqmmc-supply = <&vddio_boot>;
|
||||
|
|
|
@ -147,8 +147,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddao_3v3>;
|
||||
vqmmc-supply = <&vddio_boot>;
|
||||
|
|
|
@ -170,8 +170,7 @@
|
|||
max-frequency = <100000000>;
|
||||
disable-wp;
|
||||
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vmmc-supply = <&vddao_3v3>;
|
||||
vqmmc-supply = <&vddio_boot>;
|
||||
|
|
|
@ -404,7 +404,7 @@
|
|||
};
|
||||
|
||||
intc: interrupt-controller@9bc0000 {
|
||||
compatible = "arm,gic-v3";
|
||||
compatible = "qcom,msm8996-gic-v3", "arm,gic-v3";
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-controller;
|
||||
#redistributor-regions = <1>;
|
||||
|
|
|
@ -1011,6 +1011,9 @@
|
|||
<&cpg CPG_CORE R8A774A1_CLK_S3D1>,
|
||||
<&scif_clk>;
|
||||
clock-names = "fck", "brg_int", "scif_clk";
|
||||
dmas = <&dmac1 0x13>, <&dmac1 0x12>,
|
||||
<&dmac2 0x13>, <&dmac2 0x12>;
|
||||
dma-names = "tx", "rx", "tx", "rx";
|
||||
power-domains = <&sysc R8A774A1_PD_ALWAYS_ON>;
|
||||
resets = <&cpg 310>;
|
||||
status = "disabled";
|
||||
|
|
|
@ -1262,6 +1262,9 @@
|
|||
<&cpg CPG_CORE R8A7796_CLK_S3D1>,
|
||||
<&scif_clk>;
|
||||
clock-names = "fck", "brg_int", "scif_clk";
|
||||
dmas = <&dmac1 0x13>, <&dmac1 0x12>,
|
||||
<&dmac2 0x13>, <&dmac2 0x12>;
|
||||
dma-names = "tx", "rx", "tx", "rx";
|
||||
power-domains = <&sysc R8A7796_PD_ALWAYS_ON>;
|
||||
resets = <&cpg 310>;
|
||||
status = "disabled";
|
||||
|
|
|
@ -1068,6 +1068,9 @@
|
|||
<&cpg CPG_CORE R8A77965_CLK_S3D1>,
|
||||
<&scif_clk>;
|
||||
clock-names = "fck", "brg_int", "scif_clk";
|
||||
dmas = <&dmac1 0x13>, <&dmac1 0x12>,
|
||||
<&dmac2 0x13>, <&dmac2 0x12>;
|
||||
dma-names = "tx", "rx", "tx", "rx";
|
||||
power-domains = <&sysc R8A77965_PD_ALWAYS_ON>;
|
||||
resets = <&cpg 310>;
|
||||
status = "disabled";
|
||||
|
|
|
@ -120,10 +120,12 @@ static int create_dtb(struct kimage *image,
|
|||
{
|
||||
void *buf;
|
||||
size_t buf_size;
|
||||
size_t cmdline_len;
|
||||
int ret;
|
||||
|
||||
cmdline_len = cmdline ? strlen(cmdline) : 0;
|
||||
buf_size = fdt_totalsize(initial_boot_params)
|
||||
+ strlen(cmdline) + DTB_EXTRA_SPACE;
|
||||
+ cmdline_len + DTB_EXTRA_SPACE;
|
||||
|
||||
for (;;) {
|
||||
buf = vmalloc(buf_size);
|
||||
|
|
|
@ -286,74 +286,73 @@ static void note_page(struct pg_state *st, unsigned long addr, unsigned level,
|
|||
|
||||
}
|
||||
|
||||
static void walk_pte(struct pg_state *st, pmd_t *pmdp, unsigned long start)
|
||||
static void walk_pte(struct pg_state *st, pmd_t *pmdp, unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
pte_t *ptep = pte_offset_kernel(pmdp, 0UL);
|
||||
unsigned long addr;
|
||||
unsigned i;
|
||||
unsigned long addr = start;
|
||||
pte_t *ptep = pte_offset_kernel(pmdp, start);
|
||||
|
||||
for (i = 0; i < PTRS_PER_PTE; i++, ptep++) {
|
||||
addr = start + i * PAGE_SIZE;
|
||||
do {
|
||||
note_page(st, addr, 4, READ_ONCE(pte_val(*ptep)));
|
||||
}
|
||||
} while (ptep++, addr += PAGE_SIZE, addr != end);
|
||||
}
|
||||
|
||||
static void walk_pmd(struct pg_state *st, pud_t *pudp, unsigned long start)
|
||||
static void walk_pmd(struct pg_state *st, pud_t *pudp, unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
pmd_t *pmdp = pmd_offset(pudp, 0UL);
|
||||
unsigned long addr;
|
||||
unsigned i;
|
||||
unsigned long next, addr = start;
|
||||
pmd_t *pmdp = pmd_offset(pudp, start);
|
||||
|
||||
for (i = 0; i < PTRS_PER_PMD; i++, pmdp++) {
|
||||
do {
|
||||
pmd_t pmd = READ_ONCE(*pmdp);
|
||||
next = pmd_addr_end(addr, end);
|
||||
|
||||
addr = start + i * PMD_SIZE;
|
||||
if (pmd_none(pmd) || pmd_sect(pmd)) {
|
||||
note_page(st, addr, 3, pmd_val(pmd));
|
||||
} else {
|
||||
BUG_ON(pmd_bad(pmd));
|
||||
walk_pte(st, pmdp, addr);
|
||||
walk_pte(st, pmdp, addr, next);
|
||||
}
|
||||
}
|
||||
} while (pmdp++, addr = next, addr != end);
|
||||
}
|
||||
|
||||
static void walk_pud(struct pg_state *st, pgd_t *pgdp, unsigned long start)
|
||||
static void walk_pud(struct pg_state *st, pgd_t *pgdp, unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
pud_t *pudp = pud_offset(pgdp, 0UL);
|
||||
unsigned long addr;
|
||||
unsigned i;
|
||||
unsigned long next, addr = start;
|
||||
pud_t *pudp = pud_offset(pgdp, start);
|
||||
|
||||
for (i = 0; i < PTRS_PER_PUD; i++, pudp++) {
|
||||
do {
|
||||
pud_t pud = READ_ONCE(*pudp);
|
||||
next = pud_addr_end(addr, end);
|
||||
|
||||
addr = start + i * PUD_SIZE;
|
||||
if (pud_none(pud) || pud_sect(pud)) {
|
||||
note_page(st, addr, 2, pud_val(pud));
|
||||
} else {
|
||||
BUG_ON(pud_bad(pud));
|
||||
walk_pmd(st, pudp, addr);
|
||||
walk_pmd(st, pudp, addr, next);
|
||||
}
|
||||
}
|
||||
} while (pudp++, addr = next, addr != end);
|
||||
}
|
||||
|
||||
static void walk_pgd(struct pg_state *st, struct mm_struct *mm,
|
||||
unsigned long start)
|
||||
{
|
||||
pgd_t *pgdp = pgd_offset(mm, 0UL);
|
||||
unsigned i;
|
||||
unsigned long addr;
|
||||
unsigned long end = (start < TASK_SIZE_64) ? TASK_SIZE_64 : 0;
|
||||
unsigned long next, addr = start;
|
||||
pgd_t *pgdp = pgd_offset(mm, start);
|
||||
|
||||
for (i = 0; i < PTRS_PER_PGD; i++, pgdp++) {
|
||||
do {
|
||||
pgd_t pgd = READ_ONCE(*pgdp);
|
||||
next = pgd_addr_end(addr, end);
|
||||
|
||||
addr = start + i * PGDIR_SIZE;
|
||||
if (pgd_none(pgd)) {
|
||||
note_page(st, addr, 1, pgd_val(pgd));
|
||||
} else {
|
||||
BUG_ON(pgd_bad(pgd));
|
||||
walk_pud(st, pgdp, addr);
|
||||
walk_pud(st, pgdp, addr, next);
|
||||
}
|
||||
}
|
||||
} while (pgdp++, addr = next, addr != end);
|
||||
}
|
||||
|
||||
void ptdump_walk_pgd(struct seq_file *m, struct ptdump_info *info)
|
||||
|
|
|
@ -16,6 +16,7 @@ config ATARI
|
|||
bool "Atari support"
|
||||
depends on MMU
|
||||
select MMU_MOTOROLA if MMU
|
||||
select HAVE_ARCH_NVRAM_OPS
|
||||
help
|
||||
This option enables support for the 68000-based Atari series of
|
||||
computers (including the TT, Falcon and Medusa). If you plan to use
|
||||
|
@ -26,6 +27,7 @@ config MAC
|
|||
bool "Macintosh support"
|
||||
depends on MMU
|
||||
select MMU_MOTOROLA if MMU
|
||||
select HAVE_ARCH_NVRAM_OPS
|
||||
help
|
||||
This option enables support for the Apple Macintosh series of
|
||||
computers (yes, there is experimental support now, at least for part
|
||||
|
|
|
@ -6,3 +6,5 @@ obj-y := config.o time.o debug.o ataints.o stdma.o \
|
|||
atasound.o stram.o
|
||||
|
||||
obj-$(CONFIG_ATARI_KBD_CORE) += atakeyb.o
|
||||
|
||||
obj-$(CONFIG_NVRAM:m=y) += nvram.o
|
||||
|
|
|
@ -0,0 +1,272 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* CMOS/NV-RAM driver for Atari. Adapted from drivers/char/nvram.c.
|
||||
* Copyright (C) 1997 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
|
||||
* idea by and with help from Richard Jelinek <rj@suse.de>
|
||||
* Portions copyright (c) 2001,2002 Sun Microsystems (thockin@sun.com)
|
||||
* Further contributions from Cesar Barros, Erik Gilling, Tim Hockin and
|
||||
* Wim Van Sebroeck.
|
||||
*/
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/nvram.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/atarihw.h>
|
||||
#include <asm/atariints.h>
|
||||
|
||||
#define NVRAM_BYTES 50
|
||||
|
||||
/* It is worth noting that these functions all access bytes of general
|
||||
* purpose memory in the NVRAM - that is to say, they all add the
|
||||
* NVRAM_FIRST_BYTE offset. Pass them offsets into NVRAM as if you did not
|
||||
* know about the RTC cruft.
|
||||
*/
|
||||
|
||||
/* Note that *all* calls to CMOS_READ and CMOS_WRITE must be done with
|
||||
* rtc_lock held. Due to the index-port/data-port design of the RTC, we
|
||||
* don't want two different things trying to get to it at once. (e.g. the
|
||||
* periodic 11 min sync from kernel/time/ntp.c vs. this driver.)
|
||||
*/
|
||||
|
||||
static unsigned char __nvram_read_byte(int i)
|
||||
{
|
||||
return CMOS_READ(NVRAM_FIRST_BYTE + i);
|
||||
}
|
||||
|
||||
/* This races nicely with trying to read with checksum checking */
|
||||
static void __nvram_write_byte(unsigned char c, int i)
|
||||
{
|
||||
CMOS_WRITE(c, NVRAM_FIRST_BYTE + i);
|
||||
}
|
||||
|
||||
/* On Ataris, the checksum is over all bytes except the checksum bytes
|
||||
* themselves; these are at the very end.
|
||||
*/
|
||||
#define ATARI_CKS_RANGE_START 0
|
||||
#define ATARI_CKS_RANGE_END 47
|
||||
#define ATARI_CKS_LOC 48
|
||||
|
||||
static int __nvram_check_checksum(void)
|
||||
{
|
||||
int i;
|
||||
unsigned char sum = 0;
|
||||
|
||||
for (i = ATARI_CKS_RANGE_START; i <= ATARI_CKS_RANGE_END; ++i)
|
||||
sum += __nvram_read_byte(i);
|
||||
return (__nvram_read_byte(ATARI_CKS_LOC) == (~sum & 0xff)) &&
|
||||
(__nvram_read_byte(ATARI_CKS_LOC + 1) == (sum & 0xff));
|
||||
}
|
||||
|
||||
static void __nvram_set_checksum(void)
|
||||
{
|
||||
int i;
|
||||
unsigned char sum = 0;
|
||||
|
||||
for (i = ATARI_CKS_RANGE_START; i <= ATARI_CKS_RANGE_END; ++i)
|
||||
sum += __nvram_read_byte(i);
|
||||
__nvram_write_byte(~sum, ATARI_CKS_LOC);
|
||||
__nvram_write_byte(sum, ATARI_CKS_LOC + 1);
|
||||
}
|
||||
|
||||
long atari_nvram_set_checksum(void)
|
||||
{
|
||||
spin_lock_irq(&rtc_lock);
|
||||
__nvram_set_checksum();
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
long atari_nvram_initialize(void)
|
||||
{
|
||||
loff_t i;
|
||||
|
||||
spin_lock_irq(&rtc_lock);
|
||||
for (i = 0; i < NVRAM_BYTES; ++i)
|
||||
__nvram_write_byte(0, i);
|
||||
__nvram_set_checksum();
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t atari_nvram_read(char *buf, size_t count, loff_t *ppos)
|
||||
{
|
||||
char *p = buf;
|
||||
loff_t i;
|
||||
|
||||
spin_lock_irq(&rtc_lock);
|
||||
if (!__nvram_check_checksum()) {
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
return -EIO;
|
||||
}
|
||||
for (i = *ppos; count > 0 && i < NVRAM_BYTES; --count, ++i, ++p)
|
||||
*p = __nvram_read_byte(i);
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
|
||||
*ppos = i;
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
ssize_t atari_nvram_write(char *buf, size_t count, loff_t *ppos)
|
||||
{
|
||||
char *p = buf;
|
||||
loff_t i;
|
||||
|
||||
spin_lock_irq(&rtc_lock);
|
||||
if (!__nvram_check_checksum()) {
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
return -EIO;
|
||||
}
|
||||
for (i = *ppos; count > 0 && i < NVRAM_BYTES; --count, ++i, ++p)
|
||||
__nvram_write_byte(*p, i);
|
||||
__nvram_set_checksum();
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
|
||||
*ppos = i;
|
||||
return p - buf;
|
||||
}
|
||||
|
||||
ssize_t atari_nvram_get_size(void)
|
||||
{
|
||||
return NVRAM_BYTES;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static struct {
|
||||
unsigned char val;
|
||||
const char *name;
|
||||
} boot_prefs[] = {
|
||||
{ 0x80, "TOS" },
|
||||
{ 0x40, "ASV" },
|
||||
{ 0x20, "NetBSD (?)" },
|
||||
{ 0x10, "Linux" },
|
||||
{ 0x00, "unspecified" },
|
||||
};
|
||||
|
||||
static const char * const languages[] = {
|
||||
"English (US)",
|
||||
"German",
|
||||
"French",
|
||||
"English (UK)",
|
||||
"Spanish",
|
||||
"Italian",
|
||||
"6 (undefined)",
|
||||
"Swiss (French)",
|
||||
"Swiss (German)",
|
||||
};
|
||||
|
||||
static const char * const dateformat[] = {
|
||||
"MM%cDD%cYY",
|
||||
"DD%cMM%cYY",
|
||||
"YY%cMM%cDD",
|
||||
"YY%cDD%cMM",
|
||||
"4 (undefined)",
|
||||
"5 (undefined)",
|
||||
"6 (undefined)",
|
||||
"7 (undefined)",
|
||||
};
|
||||
|
||||
static const char * const colors[] = {
|
||||
"2", "4", "16", "256", "65536", "??", "??", "??"
|
||||
};
|
||||
|
||||
static void atari_nvram_proc_read(unsigned char *nvram, struct seq_file *seq,
|
||||
void *offset)
|
||||
{
|
||||
int checksum;
|
||||
int i;
|
||||
unsigned int vmode;
|
||||
|
||||
spin_lock_irq(&rtc_lock);
|
||||
checksum = __nvram_check_checksum();
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
|
||||
seq_printf(seq, "Checksum status : %svalid\n", checksum ? "" : "not ");
|
||||
|
||||
seq_puts(seq, "Boot preference : ");
|
||||
for (i = ARRAY_SIZE(boot_prefs) - 1; i >= 0; --i)
|
||||
if (nvram[1] == boot_prefs[i].val) {
|
||||
seq_printf(seq, "%s\n", boot_prefs[i].name);
|
||||
break;
|
||||
}
|
||||
if (i < 0)
|
||||
seq_printf(seq, "0x%02x (undefined)\n", nvram[1]);
|
||||
|
||||
seq_printf(seq, "SCSI arbitration : %s\n",
|
||||
(nvram[16] & 0x80) ? "on" : "off");
|
||||
seq_puts(seq, "SCSI host ID : ");
|
||||
if (nvram[16] & 0x80)
|
||||
seq_printf(seq, "%d\n", nvram[16] & 7);
|
||||
else
|
||||
seq_puts(seq, "n/a\n");
|
||||
|
||||
if (!MACH_IS_FALCON)
|
||||
return;
|
||||
|
||||
seq_puts(seq, "OS language : ");
|
||||
if (nvram[6] < ARRAY_SIZE(languages))
|
||||
seq_printf(seq, "%s\n", languages[nvram[6]]);
|
||||
else
|
||||
seq_printf(seq, "%u (undefined)\n", nvram[6]);
|
||||
seq_puts(seq, "Keyboard language: ");
|
||||
if (nvram[7] < ARRAY_SIZE(languages))
|
||||
seq_printf(seq, "%s\n", languages[nvram[7]]);
|
||||
else
|
||||
seq_printf(seq, "%u (undefined)\n", nvram[7]);
|
||||
seq_puts(seq, "Date format : ");
|
||||
seq_printf(seq, dateformat[nvram[8] & 7],
|
||||
nvram[9] ? nvram[9] : '/', nvram[9] ? nvram[9] : '/');
|
||||
seq_printf(seq, ", %dh clock\n", nvram[8] & 16 ? 24 : 12);
|
||||
seq_puts(seq, "Boot delay : ");
|
||||
if (nvram[10] == 0)
|
||||
seq_puts(seq, "default\n");
|
||||
else
|
||||
seq_printf(seq, "%ds%s\n", nvram[10],
|
||||
nvram[10] < 8 ? ", no memory test" : "");
|
||||
|
||||
vmode = (nvram[14] << 8) | nvram[15];
|
||||
seq_printf(seq,
|
||||
"Video mode : %s colors, %d columns, %s %s monitor\n",
|
||||
colors[vmode & 7], vmode & 8 ? 80 : 40,
|
||||
vmode & 16 ? "VGA" : "TV", vmode & 32 ? "PAL" : "NTSC");
|
||||
seq_printf(seq,
|
||||
" %soverscan, compat. mode %s%s\n",
|
||||
vmode & 64 ? "" : "no ", vmode & 128 ? "on" : "off",
|
||||
vmode & 256 ?
|
||||
(vmode & 16 ? ", line doubling" : ", half screen") : "");
|
||||
}
|
||||
|
||||
static int nvram_proc_read(struct seq_file *seq, void *offset)
|
||||
{
|
||||
unsigned char contents[NVRAM_BYTES];
|
||||
int i;
|
||||
|
||||
spin_lock_irq(&rtc_lock);
|
||||
for (i = 0; i < NVRAM_BYTES; ++i)
|
||||
contents[i] = __nvram_read_byte(i);
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
|
||||
atari_nvram_proc_read(contents, seq, offset);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init atari_nvram_init(void)
|
||||
{
|
||||
if (!(MACH_IS_ATARI && ATARIHW_PRESENT(TT_CLK)))
|
||||
return -ENODEV;
|
||||
|
||||
if (!proc_create_single("driver/nvram", 0, NULL, nvram_proc_read)) {
|
||||
pr_err("nvram: can't create /proc/driver/nvram\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
device_initcall(atari_nvram_init);
|
||||
#endif /* CONFIG_PROC_FS */
|
|
@ -155,18 +155,22 @@ out:
|
|||
static int __init nfhd_init(void)
|
||||
{
|
||||
u32 blocks, bsize;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
nfhd_id = nf_get_id("XHDI");
|
||||
if (!nfhd_id)
|
||||
return -ENODEV;
|
||||
|
||||
major_num = register_blkdev(major_num, "nfhd");
|
||||
if (major_num <= 0) {
|
||||
ret = register_blkdev(major_num, "nfhd");
|
||||
if (ret < 0) {
|
||||
pr_warn("nfhd: unable to get major number\n");
|
||||
return major_num;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!major_num)
|
||||
major_num = ret;
|
||||
|
||||
for (i = NFHD_DEV_OFFSET; i < 24; i++) {
|
||||
if (nfhd_get_capacity(i, 0, &blocks, &bsize))
|
||||
continue;
|
||||
|
|
|
@ -33,6 +33,12 @@ extern int atari_dont_touch_floppy_select;
|
|||
|
||||
extern int atari_SCC_reset_done;
|
||||
|
||||
extern ssize_t atari_nvram_read(char *, size_t, loff_t *);
|
||||
extern ssize_t atari_nvram_write(char *, size_t, loff_t *);
|
||||
extern ssize_t atari_nvram_get_size(void);
|
||||
extern long atari_nvram_set_checksum(void);
|
||||
extern long atari_nvram_initialize(void);
|
||||
|
||||
/* convenience macros for testing machine type */
|
||||
#define MACH_IS_ST ((atari_mch_cookie >> 16) == ATARI_MCH_ST)
|
||||
#define MACH_IS_STE ((atari_mch_cookie >> 16) == ATARI_MCH_STE && \
|
||||
|
|
|
@ -19,6 +19,10 @@ extern void mac_init_IRQ(void);
|
|||
extern void mac_irq_enable(struct irq_data *data);
|
||||
extern void mac_irq_disable(struct irq_data *data);
|
||||
|
||||
extern unsigned char mac_pram_read_byte(int);
|
||||
extern void mac_pram_write_byte(unsigned char, int);
|
||||
extern ssize_t mac_pram_get_size(void);
|
||||
|
||||
/*
|
||||
* Macintosh Table
|
||||
*/
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/nvram.h>
|
||||
#include <linux/initrd.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
|
@ -37,13 +38,14 @@
|
|||
#ifdef CONFIG_AMIGA
|
||||
#include <asm/amigahw.h>
|
||||
#endif
|
||||
#ifdef CONFIG_ATARI
|
||||
#include <asm/atarihw.h>
|
||||
#ifdef CONFIG_ATARI
|
||||
#include <asm/atari_stram.h>
|
||||
#endif
|
||||
#ifdef CONFIG_SUN3X
|
||||
#include <asm/dvma.h>
|
||||
#endif
|
||||
#include <asm/macintosh.h>
|
||||
#include <asm/natfeat.h>
|
||||
|
||||
#if !FPSTATESIZE || !NR_IRQS
|
||||
|
@ -547,3 +549,81 @@ static int __init adb_probe_sync_enable (char *str) {
|
|||
|
||||
__setup("adb_sync", adb_probe_sync_enable);
|
||||
#endif /* CONFIG_ADB */
|
||||
|
||||
#if IS_ENABLED(CONFIG_NVRAM)
|
||||
#ifdef CONFIG_MAC
|
||||
static unsigned char m68k_nvram_read_byte(int addr)
|
||||
{
|
||||
if (MACH_IS_MAC)
|
||||
return mac_pram_read_byte(addr);
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
static void m68k_nvram_write_byte(unsigned char val, int addr)
|
||||
{
|
||||
if (MACH_IS_MAC)
|
||||
mac_pram_write_byte(val, addr);
|
||||
}
|
||||
#endif /* CONFIG_MAC */
|
||||
|
||||
#ifdef CONFIG_ATARI
|
||||
static ssize_t m68k_nvram_read(char *buf, size_t count, loff_t *ppos)
|
||||
{
|
||||
if (MACH_IS_ATARI)
|
||||
return atari_nvram_read(buf, count, ppos);
|
||||
else if (MACH_IS_MAC)
|
||||
return nvram_read_bytes(buf, count, ppos);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static ssize_t m68k_nvram_write(char *buf, size_t count, loff_t *ppos)
|
||||
{
|
||||
if (MACH_IS_ATARI)
|
||||
return atari_nvram_write(buf, count, ppos);
|
||||
else if (MACH_IS_MAC)
|
||||
return nvram_write_bytes(buf, count, ppos);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static long m68k_nvram_set_checksum(void)
|
||||
{
|
||||
if (MACH_IS_ATARI)
|
||||
return atari_nvram_set_checksum();
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static long m68k_nvram_initialize(void)
|
||||
{
|
||||
if (MACH_IS_ATARI)
|
||||
return atari_nvram_initialize();
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif /* CONFIG_ATARI */
|
||||
|
||||
static ssize_t m68k_nvram_get_size(void)
|
||||
{
|
||||
if (MACH_IS_ATARI)
|
||||
return atari_nvram_get_size();
|
||||
else if (MACH_IS_MAC)
|
||||
return mac_pram_get_size();
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Atari device drivers call .read (to get checksum validation) whereas
|
||||
* Mac and PowerMac device drivers just use .read_byte.
|
||||
*/
|
||||
const struct nvram_ops arch_nvram_ops = {
|
||||
#ifdef CONFIG_MAC
|
||||
.read_byte = m68k_nvram_read_byte,
|
||||
.write_byte = m68k_nvram_write_byte,
|
||||
#endif
|
||||
#ifdef CONFIG_ATARI
|
||||
.read = m68k_nvram_read,
|
||||
.write = m68k_nvram_write,
|
||||
.set_checksum = m68k_nvram_set_checksum,
|
||||
.initialize = m68k_nvram_initialize,
|
||||
#endif
|
||||
.get_size = m68k_nvram_get_size,
|
||||
};
|
||||
EXPORT_SYMBOL(arch_nvram_ops);
|
||||
#endif /* CONFIG_NVRAM */
|
||||
|
|
|
@ -36,8 +36,9 @@
|
|||
|
||||
static void (*rom_reset)(void);
|
||||
|
||||
#if IS_ENABLED(CONFIG_NVRAM)
|
||||
#ifdef CONFIG_ADB_CUDA
|
||||
static __u8 cuda_read_pram(int offset)
|
||||
static unsigned char cuda_pram_read_byte(int offset)
|
||||
{
|
||||
struct adb_request req;
|
||||
|
||||
|
@ -49,7 +50,7 @@ static __u8 cuda_read_pram(int offset)
|
|||
return req.reply[3];
|
||||
}
|
||||
|
||||
static void cuda_write_pram(int offset, __u8 data)
|
||||
static void cuda_pram_write_byte(unsigned char data, int offset)
|
||||
{
|
||||
struct adb_request req;
|
||||
|
||||
|
@ -62,29 +63,29 @@ static void cuda_write_pram(int offset, __u8 data)
|
|||
#endif /* CONFIG_ADB_CUDA */
|
||||
|
||||
#ifdef CONFIG_ADB_PMU
|
||||
static __u8 pmu_read_pram(int offset)
|
||||
static unsigned char pmu_pram_read_byte(int offset)
|
||||
{
|
||||
struct adb_request req;
|
||||
|
||||
if (pmu_request(&req, NULL, 3, PMU_READ_NVRAM,
|
||||
(offset >> 8) & 0xFF, offset & 0xFF) < 0)
|
||||
if (pmu_request(&req, NULL, 3, PMU_READ_XPRAM,
|
||||
offset & 0xFF, 1) < 0)
|
||||
return 0;
|
||||
while (!req.complete)
|
||||
pmu_poll();
|
||||
return req.reply[3];
|
||||
pmu_wait_complete(&req);
|
||||
|
||||
return req.reply[0];
|
||||
}
|
||||
|
||||
static void pmu_write_pram(int offset, __u8 data)
|
||||
static void pmu_pram_write_byte(unsigned char data, int offset)
|
||||
{
|
||||
struct adb_request req;
|
||||
|
||||
if (pmu_request(&req, NULL, 4, PMU_WRITE_NVRAM,
|
||||
(offset >> 8) & 0xFF, offset & 0xFF, data) < 0)
|
||||
if (pmu_request(&req, NULL, 4, PMU_WRITE_XPRAM,
|
||||
offset & 0xFF, 1, data) < 0)
|
||||
return;
|
||||
while (!req.complete)
|
||||
pmu_poll();
|
||||
pmu_wait_complete(&req);
|
||||
}
|
||||
#endif /* CONFIG_ADB_PMU */
|
||||
#endif /* CONFIG_NVRAM */
|
||||
|
||||
/*
|
||||
* VIA PRAM/RTC access routines
|
||||
|
@ -93,7 +94,7 @@ static void pmu_write_pram(int offset, __u8 data)
|
|||
* the RTC should be enabled.
|
||||
*/
|
||||
|
||||
static __u8 via_pram_readbyte(void)
|
||||
static __u8 via_rtc_recv(void)
|
||||
{
|
||||
int i, reg;
|
||||
__u8 data;
|
||||
|
@ -120,7 +121,7 @@ static __u8 via_pram_readbyte(void)
|
|||
return data;
|
||||
}
|
||||
|
||||
static void via_pram_writebyte(__u8 data)
|
||||
static void via_rtc_send(__u8 data)
|
||||
{
|
||||
int i, reg, bit;
|
||||
|
||||
|
@ -136,6 +137,31 @@ static void via_pram_writebyte(__u8 data)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* These values can be found in Inside Macintosh vol. III ch. 2
|
||||
* which has a description of the RTC chip in the original Mac.
|
||||
*/
|
||||
|
||||
#define RTC_FLG_READ BIT(7)
|
||||
#define RTC_FLG_WRITE_PROTECT BIT(7)
|
||||
#define RTC_CMD_READ(r) (RTC_FLG_READ | (r << 2))
|
||||
#define RTC_CMD_WRITE(r) (r << 2)
|
||||
#define RTC_REG_SECONDS_0 0
|
||||
#define RTC_REG_SECONDS_1 1
|
||||
#define RTC_REG_SECONDS_2 2
|
||||
#define RTC_REG_SECONDS_3 3
|
||||
#define RTC_REG_WRITE_PROTECT 13
|
||||
|
||||
/*
|
||||
* Inside Mac has no information about two-byte RTC commands but
|
||||
* the MAME/MESS source code has the essentials.
|
||||
*/
|
||||
|
||||
#define RTC_REG_XPRAM 14
|
||||
#define RTC_CMD_XPRAM_READ (RTC_CMD_READ(RTC_REG_XPRAM) << 8)
|
||||
#define RTC_CMD_XPRAM_WRITE (RTC_CMD_WRITE(RTC_REG_XPRAM) << 8)
|
||||
#define RTC_CMD_XPRAM_ARG(a) (((a & 0xE0) << 3) | ((a & 0x1F) << 2))
|
||||
|
||||
/*
|
||||
* Execute a VIA PRAM/RTC command. For read commands
|
||||
* data should point to a one-byte buffer for the
|
||||
|
@ -145,29 +171,33 @@ static void via_pram_writebyte(__u8 data)
|
|||
* This function disables all interrupts while running.
|
||||
*/
|
||||
|
||||
static void via_pram_command(int command, __u8 *data)
|
||||
static void via_rtc_command(int command, __u8 *data)
|
||||
{
|
||||
unsigned long flags;
|
||||
int is_read;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
/* The least significant bits must be 0b01 according to Inside Mac */
|
||||
|
||||
command = (command & ~3) | 1;
|
||||
|
||||
/* Enable the RTC and make sure the strobe line is high */
|
||||
|
||||
via1[vBufB] = (via1[vBufB] | VIA1B_vRTCClk) & ~VIA1B_vRTCEnb;
|
||||
|
||||
if (command & 0xFF00) { /* extended (two-byte) command */
|
||||
via_pram_writebyte((command & 0xFF00) >> 8);
|
||||
via_pram_writebyte(command & 0xFF);
|
||||
is_read = command & 0x8000;
|
||||
via_rtc_send((command & 0xFF00) >> 8);
|
||||
via_rtc_send(command & 0xFF);
|
||||
is_read = command & (RTC_FLG_READ << 8);
|
||||
} else { /* one-byte command */
|
||||
via_pram_writebyte(command);
|
||||
is_read = command & 0x80;
|
||||
via_rtc_send(command);
|
||||
is_read = command & RTC_FLG_READ;
|
||||
}
|
||||
if (is_read) {
|
||||
*data = via_pram_readbyte();
|
||||
*data = via_rtc_recv();
|
||||
} else {
|
||||
via_pram_writebyte(*data);
|
||||
via_rtc_send(*data);
|
||||
}
|
||||
|
||||
/* All done, disable the RTC */
|
||||
|
@ -177,14 +207,30 @@ static void via_pram_command(int command, __u8 *data)
|
|||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static __u8 via_read_pram(int offset)
|
||||
#if IS_ENABLED(CONFIG_NVRAM)
|
||||
static unsigned char via_pram_read_byte(int offset)
|
||||
{
|
||||
return 0;
|
||||
unsigned char temp;
|
||||
|
||||
via_rtc_command(RTC_CMD_XPRAM_READ | RTC_CMD_XPRAM_ARG(offset), &temp);
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
static void via_write_pram(int offset, __u8 data)
|
||||
static void via_pram_write_byte(unsigned char data, int offset)
|
||||
{
|
||||
unsigned char temp;
|
||||
|
||||
temp = 0x55;
|
||||
via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
|
||||
|
||||
temp = data;
|
||||
via_rtc_command(RTC_CMD_XPRAM_WRITE | RTC_CMD_XPRAM_ARG(offset), &temp);
|
||||
|
||||
temp = 0x55 | RTC_FLG_WRITE_PROTECT;
|
||||
via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
|
||||
}
|
||||
#endif /* CONFIG_NVRAM */
|
||||
|
||||
/*
|
||||
* Return the current time in seconds since January 1, 1904.
|
||||
|
@ -201,10 +247,10 @@ static time64_t via_read_time(void)
|
|||
} result, last_result;
|
||||
int count = 1;
|
||||
|
||||
via_pram_command(0x81, &last_result.cdata[3]);
|
||||
via_pram_command(0x85, &last_result.cdata[2]);
|
||||
via_pram_command(0x89, &last_result.cdata[1]);
|
||||
via_pram_command(0x8D, &last_result.cdata[0]);
|
||||
via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_0), &last_result.cdata[3]);
|
||||
via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_1), &last_result.cdata[2]);
|
||||
via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_2), &last_result.cdata[1]);
|
||||
via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_3), &last_result.cdata[0]);
|
||||
|
||||
/*
|
||||
* The NetBSD guys say to loop until you get the same reading
|
||||
|
@ -212,10 +258,14 @@ static time64_t via_read_time(void)
|
|||
*/
|
||||
|
||||
while (1) {
|
||||
via_pram_command(0x81, &result.cdata[3]);
|
||||
via_pram_command(0x85, &result.cdata[2]);
|
||||
via_pram_command(0x89, &result.cdata[1]);
|
||||
via_pram_command(0x8D, &result.cdata[0]);
|
||||
via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_0),
|
||||
&result.cdata[3]);
|
||||
via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_1),
|
||||
&result.cdata[2]);
|
||||
via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_2),
|
||||
&result.cdata[1]);
|
||||
via_rtc_command(RTC_CMD_READ(RTC_REG_SECONDS_3),
|
||||
&result.cdata[0]);
|
||||
|
||||
if (result.idata == last_result.idata)
|
||||
return (time64_t)result.idata - RTC_OFFSET;
|
||||
|
@ -254,18 +304,18 @@ static void via_set_rtc_time(struct rtc_time *tm)
|
|||
/* Clear the write protect bit */
|
||||
|
||||
temp = 0x55;
|
||||
via_pram_command(0x35, &temp);
|
||||
via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
|
||||
|
||||
data.idata = lower_32_bits(time + RTC_OFFSET);
|
||||
via_pram_command(0x01, &data.cdata[3]);
|
||||
via_pram_command(0x05, &data.cdata[2]);
|
||||
via_pram_command(0x09, &data.cdata[1]);
|
||||
via_pram_command(0x0D, &data.cdata[0]);
|
||||
via_rtc_command(RTC_CMD_WRITE(RTC_REG_SECONDS_0), &data.cdata[3]);
|
||||
via_rtc_command(RTC_CMD_WRITE(RTC_REG_SECONDS_1), &data.cdata[2]);
|
||||
via_rtc_command(RTC_CMD_WRITE(RTC_REG_SECONDS_2), &data.cdata[1]);
|
||||
via_rtc_command(RTC_CMD_WRITE(RTC_REG_SECONDS_3), &data.cdata[0]);
|
||||
|
||||
/* Set the write protect bit */
|
||||
|
||||
temp = 0xD5;
|
||||
via_pram_command(0x35, &temp);
|
||||
temp = 0x55 | RTC_FLG_WRITE_PROTECT;
|
||||
via_rtc_command(RTC_CMD_WRITE(RTC_REG_WRITE_PROTECT), &temp);
|
||||
}
|
||||
|
||||
static void via_shutdown(void)
|
||||
|
@ -326,66 +376,58 @@ static void cuda_shutdown(void)
|
|||
*-------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void mac_pram_read(int offset, __u8 *buffer, int len)
|
||||
#if IS_ENABLED(CONFIG_NVRAM)
|
||||
unsigned char mac_pram_read_byte(int addr)
|
||||
{
|
||||
__u8 (*func)(int);
|
||||
int i;
|
||||
|
||||
switch (macintosh_config->adb_type) {
|
||||
case MAC_ADB_IOP:
|
||||
case MAC_ADB_II:
|
||||
case MAC_ADB_PB1:
|
||||
func = via_read_pram;
|
||||
break;
|
||||
return via_pram_read_byte(addr);
|
||||
#ifdef CONFIG_ADB_CUDA
|
||||
case MAC_ADB_EGRET:
|
||||
case MAC_ADB_CUDA:
|
||||
func = cuda_read_pram;
|
||||
break;
|
||||
return cuda_pram_read_byte(addr);
|
||||
#endif
|
||||
#ifdef CONFIG_ADB_PMU
|
||||
case MAC_ADB_PB2:
|
||||
func = pmu_read_pram;
|
||||
break;
|
||||
return pmu_pram_read_byte(addr);
|
||||
#endif
|
||||
default:
|
||||
return;
|
||||
}
|
||||
for (i = 0 ; i < len ; i++) {
|
||||
buffer[i] = (*func)(offset++);
|
||||
return 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
void mac_pram_write(int offset, __u8 *buffer, int len)
|
||||
void mac_pram_write_byte(unsigned char val, int addr)
|
||||
{
|
||||
void (*func)(int, __u8);
|
||||
int i;
|
||||
|
||||
switch (macintosh_config->adb_type) {
|
||||
case MAC_ADB_IOP:
|
||||
case MAC_ADB_II:
|
||||
case MAC_ADB_PB1:
|
||||
func = via_write_pram;
|
||||
via_pram_write_byte(val, addr);
|
||||
break;
|
||||
#ifdef CONFIG_ADB_CUDA
|
||||
case MAC_ADB_EGRET:
|
||||
case MAC_ADB_CUDA:
|
||||
func = cuda_write_pram;
|
||||
cuda_pram_write_byte(val, addr);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_ADB_PMU
|
||||
case MAC_ADB_PB2:
|
||||
func = pmu_write_pram;
|
||||
pmu_pram_write_byte(val, addr);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return;
|
||||
}
|
||||
for (i = 0 ; i < len ; i++) {
|
||||
(*func)(offset++, buffer[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ssize_t mac_pram_get_size(void)
|
||||
{
|
||||
return 256;
|
||||
}
|
||||
#endif /* CONFIG_NVRAM */
|
||||
|
||||
void mac_poweroff(void)
|
||||
{
|
||||
if (oss_present) {
|
||||
|
|
|
@ -1403,6 +1403,21 @@ config LOONGSON3_ENHANCEMENT
|
|||
please say 'N' here. If you want a high-performance kernel to run on
|
||||
new Loongson 3 machines only, please say 'Y' here.
|
||||
|
||||
config CPU_LOONGSON3_WORKAROUNDS
|
||||
bool "Old Loongson 3 LLSC Workarounds"
|
||||
default y if SMP
|
||||
depends on CPU_LOONGSON3
|
||||
help
|
||||
Loongson 3 processors have the llsc issues which require workarounds.
|
||||
Without workarounds the system may hang unexpectedly.
|
||||
|
||||
Newer Loongson 3 will fix these issues and no workarounds are needed.
|
||||
The workarounds have no significant side effect on them but may
|
||||
decrease the performance of the system so this option should be
|
||||
disabled unless the kernel is intended to be run on old systems.
|
||||
|
||||
If unsure, please say Y.
|
||||
|
||||
config CPU_LOONGSON2E
|
||||
bool "Loongson 2E"
|
||||
depends on SYS_HAS_CPU_LOONGSON2E
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
status = "okay";
|
||||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pins_uart2>;
|
||||
pinctrl-0 = <&pins_uart3>;
|
||||
};
|
||||
|
||||
&uart4 {
|
||||
|
@ -196,9 +196,9 @@
|
|||
bias-disable;
|
||||
};
|
||||
|
||||
pins_uart2: uart2 {
|
||||
function = "uart2";
|
||||
groups = "uart2-data", "uart2-hwflow";
|
||||
pins_uart3: uart3 {
|
||||
function = "uart3";
|
||||
groups = "uart3-data", "uart3-hwflow";
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
|
|
|
@ -161,7 +161,7 @@
|
|||
#dma-cells = <2>;
|
||||
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <29>;
|
||||
interrupts = <20>;
|
||||
|
||||
clocks = <&cgu JZ4740_CLK_DMA>;
|
||||
|
||||
|
|
|
@ -90,11 +90,11 @@
|
|||
interrupts = <0>;
|
||||
};
|
||||
|
||||
axi_i2c: i2c@10A00000 {
|
||||
axi_i2c: i2c@10a00000 {
|
||||
compatible = "xlnx,xps-iic-2.00.a";
|
||||
interrupt-parent = <&axi_intc>;
|
||||
interrupts = <4>;
|
||||
reg = < 0x10A00000 0x10000 >;
|
||||
reg = < 0x10a00000 0x10000 >;
|
||||
clocks = <&ext>;
|
||||
xlnx,clk-freq = <0x5f5e100>;
|
||||
xlnx,family = "Artix7";
|
||||
|
@ -106,9 +106,9 @@
|
|||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
ad7420@4B {
|
||||
ad7420@4b {
|
||||
compatible = "adi,adt7420";
|
||||
reg = <0x4B>;
|
||||
reg = <0x4b>;
|
||||
};
|
||||
} ;
|
||||
};
|
||||
|
|
|
@ -58,6 +58,7 @@ static __inline__ void atomic_##op(int i, atomic_t * v) \
|
|||
if (kernel_uses_llsc) { \
|
||||
int temp; \
|
||||
\
|
||||
loongson_llsc_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
" .set push \n" \
|
||||
" .set "MIPS_ISA_LEVEL" \n" \
|
||||
|
@ -85,6 +86,7 @@ static __inline__ int atomic_##op##_return_relaxed(int i, atomic_t * v) \
|
|||
if (kernel_uses_llsc) { \
|
||||
int temp; \
|
||||
\
|
||||
loongson_llsc_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
" .set push \n" \
|
||||
" .set "MIPS_ISA_LEVEL" \n" \
|
||||
|
@ -118,6 +120,7 @@ static __inline__ int atomic_fetch_##op##_relaxed(int i, atomic_t * v) \
|
|||
if (kernel_uses_llsc) { \
|
||||
int temp; \
|
||||
\
|
||||
loongson_llsc_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
" .set push \n" \
|
||||
" .set "MIPS_ISA_LEVEL" \n" \
|
||||
|
@ -256,6 +259,7 @@ static __inline__ void atomic64_##op(long i, atomic64_t * v) \
|
|||
if (kernel_uses_llsc) { \
|
||||
long temp; \
|
||||
\
|
||||
loongson_llsc_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
" .set push \n" \
|
||||
" .set "MIPS_ISA_LEVEL" \n" \
|
||||
|
@ -283,6 +287,7 @@ static __inline__ long atomic64_##op##_return_relaxed(long i, atomic64_t * v) \
|
|||
if (kernel_uses_llsc) { \
|
||||
long temp; \
|
||||
\
|
||||
loongson_llsc_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
" .set push \n" \
|
||||
" .set "MIPS_ISA_LEVEL" \n" \
|
||||
|
@ -316,6 +321,7 @@ static __inline__ long atomic64_fetch_##op##_relaxed(long i, atomic64_t * v) \
|
|||
if (kernel_uses_llsc) { \
|
||||
long temp; \
|
||||
\
|
||||
loongson_llsc_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
" .set push \n" \
|
||||
" .set "MIPS_ISA_LEVEL" \n" \
|
||||
|
|
|
@ -222,6 +222,42 @@
|
|||
#define __smp_mb__before_atomic() __smp_mb__before_llsc()
|
||||
#define __smp_mb__after_atomic() smp_llsc_mb()
|
||||
|
||||
/*
|
||||
* Some Loongson 3 CPUs have a bug wherein execution of a memory access (load,
|
||||
* store or pref) in between an ll & sc can cause the sc instruction to
|
||||
* erroneously succeed, breaking atomicity. Whilst it's unusual to write code
|
||||
* containing such sequences, this bug bites harder than we might otherwise
|
||||
* expect due to reordering & speculation:
|
||||
*
|
||||
* 1) A memory access appearing prior to the ll in program order may actually
|
||||
* be executed after the ll - this is the reordering case.
|
||||
*
|
||||
* In order to avoid this we need to place a memory barrier (ie. a sync
|
||||
* instruction) prior to every ll instruction, in between it & any earlier
|
||||
* memory access instructions. Many of these cases are already covered by
|
||||
* smp_mb__before_llsc() but for the remaining cases, typically ones in
|
||||
* which multiple CPUs may operate on a memory location but ordering is not
|
||||
* usually guaranteed, we use loongson_llsc_mb() below.
|
||||
*
|
||||
* This reordering case is fixed by 3A R2 CPUs, ie. 3A2000 models and later.
|
||||
*
|
||||
* 2) If a conditional branch exists between an ll & sc with a target outside
|
||||
* of the ll-sc loop, for example an exit upon value mismatch in cmpxchg()
|
||||
* or similar, then misprediction of the branch may allow speculative
|
||||
* execution of memory accesses from outside of the ll-sc loop.
|
||||
*
|
||||
* In order to avoid this we need a memory barrier (ie. a sync instruction)
|
||||
* at each affected branch target, for which we also use loongson_llsc_mb()
|
||||
* defined below.
|
||||
*
|
||||
* This case affects all current Loongson 3 CPUs.
|
||||
*/
|
||||
#ifdef CONFIG_CPU_LOONGSON3_WORKAROUNDS /* Loongson-3's LLSC workaround */
|
||||
#define loongson_llsc_mb() __asm__ __volatile__(__WEAK_LLSC_MB : : :"memory")
|
||||
#else
|
||||
#define loongson_llsc_mb() do { } while (0)
|
||||
#endif
|
||||
|
||||
#include <asm-generic/barrier.h>
|
||||
|
||||
#endif /* __ASM_BARRIER_H */
|
||||
|
|
|
@ -69,6 +69,7 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *addr)
|
|||
: "ir" (1UL << bit), GCC_OFF_SMALL_ASM() (*m));
|
||||
#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
|
||||
} else if (kernel_uses_llsc && __builtin_constant_p(bit)) {
|
||||
loongson_llsc_mb();
|
||||
do {
|
||||
__asm__ __volatile__(
|
||||
" " __LL "%0, %1 # set_bit \n"
|
||||
|
@ -79,6 +80,7 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *addr)
|
|||
} while (unlikely(!temp));
|
||||
#endif /* CONFIG_CPU_MIPSR2 || CONFIG_CPU_MIPSR6 */
|
||||
} else if (kernel_uses_llsc) {
|
||||
loongson_llsc_mb();
|
||||
do {
|
||||
__asm__ __volatile__(
|
||||
" .set push \n"
|
||||
|
@ -123,6 +125,7 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *addr)
|
|||
: "ir" (~(1UL << bit)));
|
||||
#if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6)
|
||||
} else if (kernel_uses_llsc && __builtin_constant_p(bit)) {
|
||||
loongson_llsc_mb();
|
||||
do {
|
||||
__asm__ __volatile__(
|
||||
" " __LL "%0, %1 # clear_bit \n"
|
||||
|
@ -133,6 +136,7 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *addr)
|
|||
} while (unlikely(!temp));
|
||||
#endif /* CONFIG_CPU_MIPSR2 || CONFIG_CPU_MIPSR6 */
|
||||
} else if (kernel_uses_llsc) {
|
||||
loongson_llsc_mb();
|
||||
do {
|
||||
__asm__ __volatile__(
|
||||
" .set push \n"
|
||||
|
@ -193,6 +197,7 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr)
|
|||
unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG);
|
||||
unsigned long temp;
|
||||
|
||||
loongson_llsc_mb();
|
||||
do {
|
||||
__asm__ __volatile__(
|
||||
" .set push \n"
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
"i" (-EFAULT) \
|
||||
: "memory"); \
|
||||
} else if (cpu_has_llsc) { \
|
||||
loongson_llsc_mb(); \
|
||||
__asm__ __volatile__( \
|
||||
" .set push \n" \
|
||||
" .set noat \n" \
|
||||
|
@ -163,6 +164,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
|||
"i" (-EFAULT)
|
||||
: "memory");
|
||||
} else if (cpu_has_llsc) {
|
||||
loongson_llsc_mb();
|
||||
__asm__ __volatile__(
|
||||
"# futex_atomic_cmpxchg_inatomic \n"
|
||||
" .set push \n"
|
||||
|
@ -192,6 +194,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
|||
: GCC_OFF_SMALL_ASM() (*uaddr), "Jr" (oldval), "Jr" (newval),
|
||||
"i" (-EFAULT)
|
||||
: "memory");
|
||||
loongson_llsc_mb();
|
||||
} else
|
||||
return -ENOSYS;
|
||||
|
||||
|
|
|
@ -228,6 +228,7 @@ static inline void set_pte(pte_t *ptep, pte_t pteval)
|
|||
: [buddy] "+m" (buddy->pte), [tmp] "=&r" (tmp)
|
||||
: [global] "r" (page_global));
|
||||
} else if (kernel_uses_llsc) {
|
||||
loongson_llsc_mb();
|
||||
__asm__ __volatile__ (
|
||||
" .set push \n"
|
||||
" .set "MIPS_ISA_ARCH_LEVEL" \n"
|
||||
|
@ -242,6 +243,7 @@ static inline void set_pte(pte_t *ptep, pte_t pteval)
|
|||
" .set pop \n"
|
||||
: [buddy] "+m" (buddy->pte), [tmp] "=&r" (tmp)
|
||||
: [global] "r" (page_global));
|
||||
loongson_llsc_mb();
|
||||
}
|
||||
#else /* !CONFIG_SMP */
|
||||
if (pte_none(*buddy))
|
||||
|
|
|
@ -457,5 +457,5 @@ void mips_cm_error_report(void)
|
|||
}
|
||||
|
||||
/* reprime cause register */
|
||||
write_gcr_error_cause(0);
|
||||
write_gcr_error_cause(cm_error);
|
||||
}
|
||||
|
|
|
@ -371,7 +371,7 @@ static inline int is_sp_move_ins(union mips_instruction *ip, int *frame_size)
|
|||
static int get_frame_info(struct mips_frame_info *info)
|
||||
{
|
||||
bool is_mmips = IS_ENABLED(CONFIG_CPU_MICROMIPS);
|
||||
union mips_instruction insn, *ip, *ip_end;
|
||||
union mips_instruction insn, *ip;
|
||||
const unsigned int max_insns = 128;
|
||||
unsigned int last_insn_size = 0;
|
||||
unsigned int i;
|
||||
|
@ -384,10 +384,9 @@ static int get_frame_info(struct mips_frame_info *info)
|
|||
if (!ip)
|
||||
goto err;
|
||||
|
||||
ip_end = (void *)ip + info->func_size;
|
||||
|
||||
for (i = 0; i < max_insns && ip < ip_end; i++) {
|
||||
for (i = 0; i < max_insns; i++) {
|
||||
ip = (void *)ip + last_insn_size;
|
||||
|
||||
if (is_mmips && mm_insn_16bit(ip->halfword[0])) {
|
||||
insn.word = ip->halfword[0] << 16;
|
||||
last_insn_size = 2;
|
||||
|
|
|
@ -23,6 +23,29 @@ ifdef CONFIG_CPU_LOONGSON2F_WORKAROUNDS
|
|||
endif
|
||||
|
||||
cflags-$(CONFIG_CPU_LOONGSON3) += -Wa,--trap
|
||||
|
||||
#
|
||||
# Some versions of binutils, not currently mainline as of 2019/02/04, support
|
||||
# an -mfix-loongson3-llsc flag which emits a sync prior to each ll instruction
|
||||
# to work around a CPU bug (see loongson_llsc_mb() in asm/barrier.h for a
|
||||
# description).
|
||||
#
|
||||
# We disable this in order to prevent the assembler meddling with the
|
||||
# instruction that labels refer to, ie. if we label an ll instruction:
|
||||
#
|
||||
# 1: ll v0, 0(a0)
|
||||
#
|
||||
# ...then with the assembler fix applied the label may actually point at a sync
|
||||
# instruction inserted by the assembler, and if we were using the label in an
|
||||
# exception table the table would no longer contain the address of the ll
|
||||
# instruction.
|
||||
#
|
||||
# Avoid this by explicitly disabling that assembler behaviour. If upstream
|
||||
# binutils does not merge support for the flag then we can revisit & remove
|
||||
# this later - for now it ensures vendor toolchains don't cause problems.
|
||||
#
|
||||
cflags-$(CONFIG_CPU_LOONGSON3) += $(call as-option,-Wa$(comma)-mno-fix-loongson3-llsc,)
|
||||
|
||||
#
|
||||
# binutils from v2.25 on and gcc starting from v4.9.0 treat -march=loongson3a
|
||||
# as MIPS64 R2; older versions as just R1. This leaves the possibility open
|
||||
|
|
|
@ -59,7 +59,12 @@ static void loongson_poweroff(void)
|
|||
{
|
||||
#ifndef CONFIG_LEFI_FIRMWARE_INTERFACE
|
||||
mach_prepare_shutdown();
|
||||
unreachable();
|
||||
|
||||
/*
|
||||
* It needs a wait loop here, but mips/kernel/reset.c already calls
|
||||
* a generic delay loop, machine_hang(), so simply return.
|
||||
*/
|
||||
return;
|
||||
#else
|
||||
void (*fw_poweroff)(void) = (void *)loongson_sysconf.poweroff_addr;
|
||||
|
||||
|
|
|
@ -932,6 +932,8 @@ build_get_pgd_vmalloc64(u32 **p, struct uasm_label **l, struct uasm_reloc **r,
|
|||
* to mimic that here by taking a load/istream page
|
||||
* fault.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_CPU_LOONGSON3_WORKAROUNDS))
|
||||
uasm_i_sync(p, 0);
|
||||
UASM_i_LA(p, ptr, (unsigned long)tlb_do_page_fault_0);
|
||||
uasm_i_jr(p, ptr);
|
||||
|
||||
|
@ -1646,6 +1648,8 @@ static void
|
|||
iPTE_LW(u32 **p, unsigned int pte, unsigned int ptr)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
if (IS_ENABLED(CONFIG_CPU_LOONGSON3_WORKAROUNDS))
|
||||
uasm_i_sync(p, 0);
|
||||
# ifdef CONFIG_PHYS_ADDR_T_64BIT
|
||||
if (cpu_has_64bits)
|
||||
uasm_i_lld(p, pte, 0, ptr);
|
||||
|
@ -2259,6 +2263,8 @@ static void build_r4000_tlb_load_handler(void)
|
|||
#endif
|
||||
|
||||
uasm_l_nopage_tlbl(&l, p);
|
||||
if (IS_ENABLED(CONFIG_CPU_LOONGSON3_WORKAROUNDS))
|
||||
uasm_i_sync(&p, 0);
|
||||
build_restore_work_registers(&p);
|
||||
#ifdef CONFIG_CPU_MICROMIPS
|
||||
if ((unsigned long)tlb_do_page_fault_0 & 1) {
|
||||
|
@ -2313,6 +2319,8 @@ static void build_r4000_tlb_store_handler(void)
|
|||
#endif
|
||||
|
||||
uasm_l_nopage_tlbs(&l, p);
|
||||
if (IS_ENABLED(CONFIG_CPU_LOONGSON3_WORKAROUNDS))
|
||||
uasm_i_sync(&p, 0);
|
||||
build_restore_work_registers(&p);
|
||||
#ifdef CONFIG_CPU_MICROMIPS
|
||||
if ((unsigned long)tlb_do_page_fault_1 & 1) {
|
||||
|
@ -2368,6 +2376,8 @@ static void build_r4000_tlb_modify_handler(void)
|
|||
#endif
|
||||
|
||||
uasm_l_nopage_tlbm(&l, p);
|
||||
if (IS_ENABLED(CONFIG_CPU_LOONGSON3_WORKAROUNDS))
|
||||
uasm_i_sync(&p, 0);
|
||||
build_restore_work_registers(&p);
|
||||
#ifdef CONFIG_CPU_MICROMIPS
|
||||
if ((unsigned long)tlb_do_page_fault_1 & 1) {
|
||||
|
|
|
@ -568,6 +568,11 @@ static int __init octeon_pci_setup(void)
|
|||
if (octeon_has_feature(OCTEON_FEATURE_PCIE))
|
||||
return 0;
|
||||
|
||||
if (!octeon_is_pci_host()) {
|
||||
pr_notice("Not in host mode, PCI Controller not initialized\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Point pcibios_map_irq() to the PCI version of it */
|
||||
octeon_pcibios_map_irq = octeon_pci_pcibios_map_irq;
|
||||
|
||||
|
@ -579,11 +584,6 @@ static int __init octeon_pci_setup(void)
|
|||
else
|
||||
octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_BIG;
|
||||
|
||||
if (!octeon_is_pci_host()) {
|
||||
pr_notice("Not in host mode, PCI Controller not initialized\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* PCI I/O and PCI MEM values */
|
||||
set_io_port_base(OCTEON_PCI_IOSPACE_BASE);
|
||||
ioport_resource.start = 0;
|
||||
|
|
|
@ -8,6 +8,7 @@ ccflags-vdso := \
|
|||
$(filter -E%,$(KBUILD_CFLAGS)) \
|
||||
$(filter -mmicromips,$(KBUILD_CFLAGS)) \
|
||||
$(filter -march=%,$(KBUILD_CFLAGS)) \
|
||||
$(filter -m%-float,$(KBUILD_CFLAGS)) \
|
||||
-D__VDSO__
|
||||
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
|
@ -129,7 +130,7 @@ $(obj)/%-o32.o: $(src)/%.c FORCE
|
|||
$(call cmd,force_checksrc)
|
||||
$(call if_changed_rule,cc_o_c)
|
||||
|
||||
$(obj)/vdso-o32.lds: KBUILD_CPPFLAGS := -mabi=32
|
||||
$(obj)/vdso-o32.lds: KBUILD_CPPFLAGS := $(ccflags-vdso) -mabi=32
|
||||
$(obj)/vdso-o32.lds: $(src)/vdso.lds.S FORCE
|
||||
$(call if_changed_dep,cpp_lds_S)
|
||||
|
||||
|
@ -169,7 +170,7 @@ $(obj)/%-n32.o: $(src)/%.c FORCE
|
|||
$(call cmd,force_checksrc)
|
||||
$(call if_changed_rule,cc_o_c)
|
||||
|
||||
$(obj)/vdso-n32.lds: KBUILD_CPPFLAGS := -mabi=n32
|
||||
$(obj)/vdso-n32.lds: KBUILD_CPPFLAGS := $(ccflags-vdso) -mabi=n32
|
||||
$(obj)/vdso-n32.lds: $(src)/vdso.lds.S FORCE
|
||||
$(call if_changed_dep,cpp_lds_S)
|
||||
|
||||
|
|
|
@ -311,6 +311,15 @@ extern void outsl (unsigned long port, const void *src, unsigned long count);
|
|||
* value for either 32 or 64 bit mode */
|
||||
#define F_EXTEND(x) ((unsigned long)((x) | (0xffffffff00000000ULL)))
|
||||
|
||||
#define ioread64 ioread64
|
||||
#define ioread64be ioread64be
|
||||
#define iowrite64 iowrite64
|
||||
#define iowrite64be iowrite64be
|
||||
extern u64 ioread64(void __iomem *addr);
|
||||
extern u64 ioread64be(void __iomem *addr);
|
||||
extern void iowrite64(u64 val, void __iomem *addr);
|
||||
extern void iowrite64be(u64 val, void __iomem *addr);
|
||||
|
||||
#include <asm-generic/iomap.h>
|
||||
|
||||
/*
|
||||
|
|
|
@ -48,11 +48,15 @@ struct iomap_ops {
|
|||
unsigned int (*read16be)(void __iomem *);
|
||||
unsigned int (*read32)(void __iomem *);
|
||||
unsigned int (*read32be)(void __iomem *);
|
||||
u64 (*read64)(void __iomem *);
|
||||
u64 (*read64be)(void __iomem *);
|
||||
void (*write8)(u8, void __iomem *);
|
||||
void (*write16)(u16, void __iomem *);
|
||||
void (*write16be)(u16, void __iomem *);
|
||||
void (*write32)(u32, void __iomem *);
|
||||
void (*write32be)(u32, void __iomem *);
|
||||
void (*write64)(u64, void __iomem *);
|
||||
void (*write64be)(u64, void __iomem *);
|
||||
void (*read8r)(void __iomem *, void *, unsigned long);
|
||||
void (*read16r)(void __iomem *, void *, unsigned long);
|
||||
void (*read32r)(void __iomem *, void *, unsigned long);
|
||||
|
@ -171,6 +175,16 @@ static unsigned int iomem_read32be(void __iomem *addr)
|
|||
return __raw_readl(addr);
|
||||
}
|
||||
|
||||
static u64 iomem_read64(void __iomem *addr)
|
||||
{
|
||||
return readq(addr);
|
||||
}
|
||||
|
||||
static u64 iomem_read64be(void __iomem *addr)
|
||||
{
|
||||
return __raw_readq(addr);
|
||||
}
|
||||
|
||||
static void iomem_write8(u8 datum, void __iomem *addr)
|
||||
{
|
||||
writeb(datum, addr);
|
||||
|
@ -196,6 +210,16 @@ static void iomem_write32be(u32 datum, void __iomem *addr)
|
|||
__raw_writel(datum, addr);
|
||||
}
|
||||
|
||||
static void iomem_write64(u64 datum, void __iomem *addr)
|
||||
{
|
||||
writel(datum, addr);
|
||||
}
|
||||
|
||||
static void iomem_write64be(u64 datum, void __iomem *addr)
|
||||
{
|
||||
__raw_writel(datum, addr);
|
||||
}
|
||||
|
||||
static void iomem_read8r(void __iomem *addr, void *dst, unsigned long count)
|
||||
{
|
||||
while (count--) {
|
||||
|
@ -250,11 +274,15 @@ static const struct iomap_ops iomem_ops = {
|
|||
.read16be = iomem_read16be,
|
||||
.read32 = iomem_read32,
|
||||
.read32be = iomem_read32be,
|
||||
.read64 = iomem_read64,
|
||||
.read64be = iomem_read64be,
|
||||
.write8 = iomem_write8,
|
||||
.write16 = iomem_write16,
|
||||
.write16be = iomem_write16be,
|
||||
.write32 = iomem_write32,
|
||||
.write32be = iomem_write32be,
|
||||
.write64 = iomem_write64,
|
||||
.write64be = iomem_write64be,
|
||||
.read8r = iomem_read8r,
|
||||
.read16r = iomem_read16r,
|
||||
.read32r = iomem_read32r,
|
||||
|
@ -304,6 +332,20 @@ unsigned int ioread32be(void __iomem *addr)
|
|||
return *((u32 *)addr);
|
||||
}
|
||||
|
||||
u64 ioread64(void __iomem *addr)
|
||||
{
|
||||
if (unlikely(INDIRECT_ADDR(addr)))
|
||||
return iomap_ops[ADDR_TO_REGION(addr)]->read64(addr);
|
||||
return le64_to_cpup((u64 *)addr);
|
||||
}
|
||||
|
||||
u64 ioread64be(void __iomem *addr)
|
||||
{
|
||||
if (unlikely(INDIRECT_ADDR(addr)))
|
||||
return iomap_ops[ADDR_TO_REGION(addr)]->read64be(addr);
|
||||
return *((u64 *)addr);
|
||||
}
|
||||
|
||||
void iowrite8(u8 datum, void __iomem *addr)
|
||||
{
|
||||
if (unlikely(INDIRECT_ADDR(addr))) {
|
||||
|
@ -349,6 +391,24 @@ void iowrite32be(u32 datum, void __iomem *addr)
|
|||
}
|
||||
}
|
||||
|
||||
void iowrite64(u64 datum, void __iomem *addr)
|
||||
{
|
||||
if (unlikely(INDIRECT_ADDR(addr))) {
|
||||
iomap_ops[ADDR_TO_REGION(addr)]->write64(datum, addr);
|
||||
} else {
|
||||
*((u64 *)addr) = cpu_to_le64(datum);
|
||||
}
|
||||
}
|
||||
|
||||
void iowrite64be(u64 datum, void __iomem *addr)
|
||||
{
|
||||
if (unlikely(INDIRECT_ADDR(addr))) {
|
||||
iomap_ops[ADDR_TO_REGION(addr)]->write64be(datum, addr);
|
||||
} else {
|
||||
*((u64 *)addr) = datum;
|
||||
}
|
||||
}
|
||||
|
||||
/* Repeating interfaces */
|
||||
|
||||
void ioread8_rep(void __iomem *addr, void *dst, unsigned long count)
|
||||
|
@ -449,11 +509,15 @@ EXPORT_SYMBOL(ioread16);
|
|||
EXPORT_SYMBOL(ioread16be);
|
||||
EXPORT_SYMBOL(ioread32);
|
||||
EXPORT_SYMBOL(ioread32be);
|
||||
EXPORT_SYMBOL(ioread64);
|
||||
EXPORT_SYMBOL(ioread64be);
|
||||
EXPORT_SYMBOL(iowrite8);
|
||||
EXPORT_SYMBOL(iowrite16);
|
||||
EXPORT_SYMBOL(iowrite16be);
|
||||
EXPORT_SYMBOL(iowrite32);
|
||||
EXPORT_SYMBOL(iowrite32be);
|
||||
EXPORT_SYMBOL(iowrite64);
|
||||
EXPORT_SYMBOL(iowrite64be);
|
||||
EXPORT_SYMBOL(ioread8_rep);
|
||||
EXPORT_SYMBOL(ioread16_rep);
|
||||
EXPORT_SYMBOL(ioread32_rep);
|
||||
|
|
|
@ -178,6 +178,7 @@ config PPC
|
|||
select HAVE_ARCH_KGDB
|
||||
select HAVE_ARCH_MMAP_RND_BITS
|
||||
select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT
|
||||
select HAVE_ARCH_NVRAM_OPS
|
||||
select HAVE_ARCH_SECCOMP_FILTER
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_CBPF_JIT if !PPC64
|
||||
|
@ -274,11 +275,6 @@ config SYSVIPC_COMPAT
|
|||
depends on COMPAT && SYSVIPC
|
||||
default y
|
||||
|
||||
# All PPC32s use generic nvram driver through ppc_md
|
||||
config GENERIC_NVRAM
|
||||
bool
|
||||
default y if PPC32
|
||||
|
||||
config SCHED_OMIT_FRAME_POINTER
|
||||
bool
|
||||
default y
|
||||
|
|
|
@ -1258,21 +1258,13 @@ extern pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
|
|||
|
||||
#define pmd_move_must_withdraw pmd_move_must_withdraw
|
||||
struct spinlock;
|
||||
static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
||||
struct spinlock *old_pmd_ptl,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
if (radix_enabled())
|
||||
return false;
|
||||
/*
|
||||
* Archs like ppc64 use pgtable to store per pmd
|
||||
* specific information. So when we switch the pmd,
|
||||
* we should also withdraw and deposit the pgtable
|
||||
*/
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
extern int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
||||
struct spinlock *old_pmd_ptl,
|
||||
struct vm_area_struct *vma);
|
||||
/*
|
||||
* Hash translation mode use the deposited table to store hash pte
|
||||
* slot information.
|
||||
*/
|
||||
#define arch_needs_pgtable_deposit arch_needs_pgtable_deposit
|
||||
static inline bool arch_needs_pgtable_deposit(void)
|
||||
{
|
||||
|
|
|
@ -783,8 +783,10 @@ extern void __iounmap_at(void *ea, unsigned long size);
|
|||
|
||||
#define mmio_read16be(addr) readw_be(addr)
|
||||
#define mmio_read32be(addr) readl_be(addr)
|
||||
#define mmio_read64be(addr) readq_be(addr)
|
||||
#define mmio_write16be(val, addr) writew_be(val, addr)
|
||||
#define mmio_write32be(val, addr) writel_be(val, addr)
|
||||
#define mmio_write64be(val, addr) writeq_be(val, addr)
|
||||
#define mmio_insb(addr, dst, count) readsb(addr, dst, count)
|
||||
#define mmio_insw(addr, dst, count) readsw(addr, dst, count)
|
||||
#define mmio_insl(addr, dst, count) readsl(addr, dst, count)
|
||||
|
|
|
@ -78,9 +78,6 @@ extern int pmac_get_partition(int partition);
|
|||
extern u8 pmac_xpram_read(int xpaddr);
|
||||
extern void pmac_xpram_write(int xpaddr, u8 data);
|
||||
|
||||
/* Synchronize NVRAM */
|
||||
extern void nvram_sync(void);
|
||||
|
||||
/* Initialize NVRAM OS partition */
|
||||
extern int __init nvram_init_os_partition(struct nvram_os_partition *part);
|
||||
|
||||
|
@ -98,10 +95,4 @@ extern int nvram_write_os_partition(struct nvram_os_partition *part,
|
|||
unsigned int err_type,
|
||||
unsigned int error_log_cnt);
|
||||
|
||||
/* Determine NVRAM size */
|
||||
extern ssize_t nvram_get_size(void);
|
||||
|
||||
/* Normal access to NVRAM */
|
||||
extern unsigned char nvram_read_byte(int i);
|
||||
extern void nvram_write_byte(unsigned char c, int i);
|
||||
#endif /* _ASM_POWERPC_NVRAM_H */
|
||||
|
|
|
@ -7,12 +7,6 @@
|
|||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* /dev/nvram driver for PPC64
|
||||
*
|
||||
* This perhaps should live in drivers/char
|
||||
*
|
||||
* TODO: Split the /dev/nvram part (that one can use
|
||||
* drivers/char/generic_nvram.c) from the arch & partition
|
||||
* parsing code.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
@ -714,137 +708,6 @@ static void oops_to_nvram(struct kmsg_dumper *dumper,
|
|||
spin_unlock_irqrestore(&lock, flags);
|
||||
}
|
||||
|
||||
static loff_t dev_nvram_llseek(struct file *file, loff_t offset, int origin)
|
||||
{
|
||||
if (ppc_md.nvram_size == NULL)
|
||||
return -ENODEV;
|
||||
return generic_file_llseek_size(file, offset, origin, MAX_LFS_FILESIZE,
|
||||
ppc_md.nvram_size());
|
||||
}
|
||||
|
||||
|
||||
static ssize_t dev_nvram_read(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
ssize_t ret;
|
||||
char *tmp = NULL;
|
||||
ssize_t size;
|
||||
|
||||
if (!ppc_md.nvram_size) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
size = ppc_md.nvram_size();
|
||||
if (size < 0) {
|
||||
ret = size;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (*ppos >= size) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
count = min_t(size_t, count, size - *ppos);
|
||||
count = min(count, PAGE_SIZE);
|
||||
|
||||
tmp = kmalloc(count, GFP_KERNEL);
|
||||
if (!tmp) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = ppc_md.nvram_read(tmp, count, ppos);
|
||||
if (ret <= 0)
|
||||
goto out;
|
||||
|
||||
if (copy_to_user(buf, tmp, ret))
|
||||
ret = -EFAULT;
|
||||
|
||||
out:
|
||||
kfree(tmp);
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static ssize_t dev_nvram_write(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
ssize_t ret;
|
||||
char *tmp = NULL;
|
||||
ssize_t size;
|
||||
|
||||
ret = -ENODEV;
|
||||
if (!ppc_md.nvram_size)
|
||||
goto out;
|
||||
|
||||
ret = 0;
|
||||
size = ppc_md.nvram_size();
|
||||
if (*ppos >= size || size < 0)
|
||||
goto out;
|
||||
|
||||
count = min_t(size_t, count, size - *ppos);
|
||||
count = min(count, PAGE_SIZE);
|
||||
|
||||
tmp = memdup_user(buf, count);
|
||||
if (IS_ERR(tmp)) {
|
||||
ret = PTR_ERR(tmp);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = ppc_md.nvram_write(tmp, count, ppos);
|
||||
|
||||
kfree(tmp);
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static long dev_nvram_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
switch(cmd) {
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
case OBSOLETE_PMAC_NVRAM_GET_OFFSET:
|
||||
printk(KERN_WARNING "nvram: Using obsolete PMAC_NVRAM_GET_OFFSET ioctl\n");
|
||||
/* fall through */
|
||||
case IOC_NVRAM_GET_OFFSET: {
|
||||
int part, offset;
|
||||
|
||||
if (!machine_is(powermac))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&part, (void __user*)arg, sizeof(part)) != 0)
|
||||
return -EFAULT;
|
||||
if (part < pmac_nvram_OF || part > pmac_nvram_NR)
|
||||
return -EINVAL;
|
||||
offset = pmac_get_partition(part);
|
||||
if (offset < 0)
|
||||
return offset;
|
||||
if (copy_to_user((void __user*)arg, &offset, sizeof(offset)) != 0)
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct file_operations nvram_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.llseek = dev_nvram_llseek,
|
||||
.read = dev_nvram_read,
|
||||
.write = dev_nvram_write,
|
||||
.unlocked_ioctl = dev_nvram_ioctl,
|
||||
};
|
||||
|
||||
static struct miscdevice nvram_dev = {
|
||||
NVRAM_MINOR,
|
||||
"nvram",
|
||||
&nvram_fops
|
||||
};
|
||||
|
||||
|
||||
#ifdef DEBUG_NVRAM
|
||||
static void __init nvram_print_partitions(char * label)
|
||||
{
|
||||
|
@ -992,6 +855,8 @@ loff_t __init nvram_create_partition(const char *name, int sig,
|
|||
long size = 0;
|
||||
int rc;
|
||||
|
||||
BUILD_BUG_ON(NVRAM_BLOCK_LEN != 16);
|
||||
|
||||
/* Convert sizes from bytes to blocks */
|
||||
req_size = _ALIGN_UP(req_size, NVRAM_BLOCK_LEN) / NVRAM_BLOCK_LEN;
|
||||
min_size = _ALIGN_UP(min_size, NVRAM_BLOCK_LEN) / NVRAM_BLOCK_LEN;
|
||||
|
@ -1192,22 +1057,3 @@ int __init nvram_scan_partitions(void)
|
|||
kfree(header);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __init nvram_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
BUILD_BUG_ON(NVRAM_BLOCK_LEN != 16);
|
||||
|
||||
if (ppc_md.nvram_size == NULL || ppc_md.nvram_size() <= 0)
|
||||
return -ENODEV;
|
||||
|
||||
rc = misc_register(&nvram_dev);
|
||||
if (rc != 0) {
|
||||
printk(KERN_ERR "nvram_init: failed to register device\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
device_initcall(nvram_init);
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/console.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/nvram.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/prom.h>
|
||||
|
@ -147,41 +148,6 @@ static int __init ppc_setup_l3cr(char *str)
|
|||
}
|
||||
__setup("l3cr=", ppc_setup_l3cr);
|
||||
|
||||
#ifdef CONFIG_GENERIC_NVRAM
|
||||
|
||||
/* Generic nvram hooks used by drivers/char/gen_nvram.c */
|
||||
unsigned char nvram_read_byte(int addr)
|
||||
{
|
||||
if (ppc_md.nvram_read_val)
|
||||
return ppc_md.nvram_read_val(addr);
|
||||
return 0xff;
|
||||
}
|
||||
EXPORT_SYMBOL(nvram_read_byte);
|
||||
|
||||
void nvram_write_byte(unsigned char val, int addr)
|
||||
{
|
||||
if (ppc_md.nvram_write_val)
|
||||
ppc_md.nvram_write_val(addr, val);
|
||||
}
|
||||
EXPORT_SYMBOL(nvram_write_byte);
|
||||
|
||||
ssize_t nvram_get_size(void)
|
||||
{
|
||||
if (ppc_md.nvram_size)
|
||||
return ppc_md.nvram_size();
|
||||
return -1;
|
||||
}
|
||||
EXPORT_SYMBOL(nvram_get_size);
|
||||
|
||||
void nvram_sync(void)
|
||||
{
|
||||
if (ppc_md.nvram_sync)
|
||||
ppc_md.nvram_sync();
|
||||
}
|
||||
EXPORT_SYMBOL(nvram_sync);
|
||||
|
||||
#endif /* CONFIG_NVRAM */
|
||||
|
||||
static int __init ppc_init(void)
|
||||
{
|
||||
/* clear the progress line */
|
||||
|
|
|
@ -400,3 +400,25 @@ void arch_report_meminfo(struct seq_file *m)
|
|||
atomic_long_read(&direct_pages_count[MMU_PAGE_1G]) << 20);
|
||||
}
|
||||
#endif /* CONFIG_PROC_FS */
|
||||
|
||||
/*
|
||||
* For hash translation mode, we use the deposited table to store hash slot
|
||||
* information and they are stored at PTRS_PER_PMD offset from related pmd
|
||||
* location. Hence a pmd move requires deposit and withdraw.
|
||||
*
|
||||
* For radix translation with split pmd ptl, we store the deposited table in the
|
||||
* pmd page. Hence if we have different pmd page we need to withdraw during pmd
|
||||
* move.
|
||||
*
|
||||
* With hash we use deposited table always irrespective of anon or not.
|
||||
* With radix we use deposited table only for anonymous mapping.
|
||||
*/
|
||||
int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
||||
struct spinlock *old_pmd_ptl,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
if (radix_enabled())
|
||||
return (new_pmd_ptl != old_pmd_ptl) && vma_is_anonymous(vma);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
obj-y += setup.o time.o pegasos_eth.o pci.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_NVRAM) += nvram.o
|
||||
obj-$(CONFIG_NVRAM:m=y) += nvram.o
|
||||
|
|
|
@ -24,7 +24,7 @@ static unsigned int nvram_size;
|
|||
static unsigned char nvram_buf[4];
|
||||
static DEFINE_SPINLOCK(nvram_lock);
|
||||
|
||||
static unsigned char chrp_nvram_read(int addr)
|
||||
static unsigned char chrp_nvram_read_val(int addr)
|
||||
{
|
||||
unsigned int done;
|
||||
unsigned long flags;
|
||||
|
@ -46,7 +46,7 @@ static unsigned char chrp_nvram_read(int addr)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void chrp_nvram_write(int addr, unsigned char val)
|
||||
static void chrp_nvram_write_val(int addr, unsigned char val)
|
||||
{
|
||||
unsigned int done;
|
||||
unsigned long flags;
|
||||
|
@ -64,6 +64,11 @@ static void chrp_nvram_write(int addr, unsigned char val)
|
|||
spin_unlock_irqrestore(&nvram_lock, flags);
|
||||
}
|
||||
|
||||
static ssize_t chrp_nvram_size(void)
|
||||
{
|
||||
return nvram_size;
|
||||
}
|
||||
|
||||
void __init chrp_nvram_init(void)
|
||||
{
|
||||
struct device_node *nvram;
|
||||
|
@ -85,8 +90,9 @@ void __init chrp_nvram_init(void)
|
|||
printk(KERN_INFO "CHRP nvram contains %u bytes\n", nvram_size);
|
||||
of_node_put(nvram);
|
||||
|
||||
ppc_md.nvram_read_val = chrp_nvram_read;
|
||||
ppc_md.nvram_write_val = chrp_nvram_write;
|
||||
ppc_md.nvram_read_val = chrp_nvram_read_val;
|
||||
ppc_md.nvram_write_val = chrp_nvram_write_val;
|
||||
ppc_md.nvram_size = chrp_nvram_size;
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -549,7 +549,7 @@ static void __init chrp_init_IRQ(void)
|
|||
static void __init
|
||||
chrp_init2(void)
|
||||
{
|
||||
#ifdef CONFIG_NVRAM
|
||||
#if IS_ENABLED(CONFIG_NVRAM)
|
||||
chrp_nvram_init();
|
||||
#endif
|
||||
|
||||
|
|
|
@ -15,7 +15,5 @@ obj-$(CONFIG_PMAC_BACKLIGHT) += backlight.o
|
|||
# need this to be a bool. Cheat here and pretend CONFIG_NVRAM=m is really
|
||||
# CONFIG_NVRAM=y
|
||||
obj-$(CONFIG_NVRAM:m=y) += nvram.o
|
||||
# ppc64 pmac doesn't define CONFIG_NVRAM but needs nvram stuff
|
||||
obj-$(CONFIG_PPC64) += nvram.o
|
||||
obj-$(CONFIG_PPC32) += bootx_init.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
|
|
|
@ -147,6 +147,11 @@ static ssize_t core99_nvram_size(void)
|
|||
static volatile unsigned char __iomem *nvram_addr;
|
||||
static int nvram_mult;
|
||||
|
||||
static ssize_t ppc32_nvram_size(void)
|
||||
{
|
||||
return NVRAM_SIZE;
|
||||
}
|
||||
|
||||
static unsigned char direct_nvram_read_byte(int addr)
|
||||
{
|
||||
return in_8(&nvram_data[(addr & (NVRAM_SIZE - 1)) * nvram_mult]);
|
||||
|
@ -590,21 +595,25 @@ int __init pmac_nvram_init(void)
|
|||
nvram_mult = 1;
|
||||
ppc_md.nvram_read_val = direct_nvram_read_byte;
|
||||
ppc_md.nvram_write_val = direct_nvram_write_byte;
|
||||
ppc_md.nvram_size = ppc32_nvram_size;
|
||||
} else if (nvram_naddrs == 1) {
|
||||
nvram_data = ioremap(r1.start, s1);
|
||||
nvram_mult = (s1 + NVRAM_SIZE - 1) / NVRAM_SIZE;
|
||||
ppc_md.nvram_read_val = direct_nvram_read_byte;
|
||||
ppc_md.nvram_write_val = direct_nvram_write_byte;
|
||||
ppc_md.nvram_size = ppc32_nvram_size;
|
||||
} else if (nvram_naddrs == 2) {
|
||||
nvram_addr = ioremap(r1.start, s1);
|
||||
nvram_data = ioremap(r2.start, s2);
|
||||
ppc_md.nvram_read_val = indirect_nvram_read_byte;
|
||||
ppc_md.nvram_write_val = indirect_nvram_write_byte;
|
||||
ppc_md.nvram_size = ppc32_nvram_size;
|
||||
} else if (nvram_naddrs == 0 && sys_ctrler == SYS_CTRLER_PMU) {
|
||||
#ifdef CONFIG_ADB_PMU
|
||||
nvram_naddrs = -1;
|
||||
ppc_md.nvram_read_val = pmu_nvram_read_byte;
|
||||
ppc_md.nvram_write_val = pmu_nvram_write_byte;
|
||||
ppc_md.nvram_size = ppc32_nvram_size;
|
||||
#endif /* CONFIG_ADB_PMU */
|
||||
} else {
|
||||
printk(KERN_ERR "Incompatible type of NVRAM\n");
|
||||
|
|
|
@ -316,8 +316,7 @@ static void __init pmac_setup_arch(void)
|
|||
find_via_pmu();
|
||||
smu_init();
|
||||
|
||||
#if defined(CONFIG_NVRAM) || defined(CONFIG_NVRAM_MODULE) || \
|
||||
defined(CONFIG_PPC64)
|
||||
#if IS_ENABLED(CONFIG_NVRAM)
|
||||
pmac_nvram_init();
|
||||
#endif
|
||||
#ifdef CONFIG_PPC32
|
||||
|
|
|
@ -68,7 +68,7 @@
|
|||
long __init pmac_time_init(void)
|
||||
{
|
||||
s32 delta = 0;
|
||||
#ifdef CONFIG_NVRAM
|
||||
#if defined(CONFIG_NVRAM) && defined(CONFIG_PPC32)
|
||||
int dst;
|
||||
|
||||
delta = ((s32)pmac_xpram_read(PMAC_XPRAM_MACHINE_LOC + 0x9)) << 16;
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* /dev/nvram driver for PPC64
|
||||
*
|
||||
* This perhaps should live in drivers/char
|
||||
*/
|
||||
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ static int drc_pmem_bind(struct papr_scm_priv *p)
|
|||
{
|
||||
unsigned long ret[PLPAR_HCALL_BUFSIZE];
|
||||
uint64_t rc, token;
|
||||
uint64_t saved = 0;
|
||||
|
||||
/*
|
||||
* When the hypervisor cannot map all the requested memory in a single
|
||||
|
@ -56,6 +57,8 @@ static int drc_pmem_bind(struct papr_scm_priv *p)
|
|||
rc = plpar_hcall(H_SCM_BIND_MEM, ret, p->drc_index, 0,
|
||||
p->blocks, BIND_ANY_ADDR, token);
|
||||
token = ret[0];
|
||||
if (!saved)
|
||||
saved = ret[1];
|
||||
cond_resched();
|
||||
} while (rc == H_BUSY);
|
||||
|
||||
|
@ -64,7 +67,7 @@ static int drc_pmem_bind(struct papr_scm_priv *p)
|
|||
return -ENXIO;
|
||||
}
|
||||
|
||||
p->bound_addr = ret[1];
|
||||
p->bound_addr = saved;
|
||||
|
||||
dev_dbg(&p->pdev->dev, "bound drc %x to %pR\n", p->drc_index, &p->res);
|
||||
|
||||
|
|
|
@ -1600,7 +1600,7 @@ static void aux_sdb_init(unsigned long sdb)
|
|||
|
||||
/*
|
||||
* aux_buffer_setup() - Setup AUX buffer for diagnostic mode sampling
|
||||
* @cpu: On which to allocate, -1 means current
|
||||
* @event: Event the buffer is setup for, event->cpu == -1 means current
|
||||
* @pages: Array of pointers to buffer pages passed from perf core
|
||||
* @nr_pages: Total pages
|
||||
* @snapshot: Flag for snapshot mode
|
||||
|
@ -1612,8 +1612,8 @@ static void aux_sdb_init(unsigned long sdb)
|
|||
*
|
||||
* Return the private AUX buffer structure if success or NULL if fails.
|
||||
*/
|
||||
static void *aux_buffer_setup(int cpu, void **pages, int nr_pages,
|
||||
bool snapshot)
|
||||
static void *aux_buffer_setup(struct perf_event *event, void **pages,
|
||||
int nr_pages, bool snapshot)
|
||||
{
|
||||
struct sf_buffer *sfb;
|
||||
struct aux_buffer *aux;
|
||||
|
|
|
@ -602,10 +602,12 @@ ENTRY(trampoline_32bit_src)
|
|||
3:
|
||||
/* Set EFER.LME=1 as a precaution in case hypervsior pulls the rug */
|
||||
pushl %ecx
|
||||
pushl %edx
|
||||
movl $MSR_EFER, %ecx
|
||||
rdmsr
|
||||
btsl $_EFER_LME, %eax
|
||||
wrmsr
|
||||
popl %edx
|
||||
popl %ecx
|
||||
|
||||
/* Enable PAE and LA57 (if required) paging modes */
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue