mirror of
https://github.com/revyos/thead-kernel.git
synced 2026-06-21 17:22:24 +02:00
Compare commits
73 Commits
Linux_SDK_
...
ov5693
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
052b22ef8b | ||
|
|
cc197e94ce | ||
|
|
46e0a824e1 | ||
|
|
f72e7cd077 | ||
|
|
807db9d981 | ||
|
|
07167b855f | ||
|
|
342da2ebbd | ||
|
|
0504ee67e5 | ||
|
|
4d36214794 | ||
|
|
8e0c3eb23d | ||
|
|
3e585776f5 | ||
|
|
afef388b8e | ||
|
|
a26b2d282c | ||
|
|
0bd99ce376 | ||
|
|
3ddef5a969 | ||
|
|
8b0b779b76 | ||
|
|
c70e925ac5 | ||
|
|
c130cdb21f | ||
|
|
765b9ada52 | ||
|
|
8631d2c44f | ||
|
|
c56347a43e | ||
|
|
827be31621 | ||
|
|
8eac2d9ff9 | ||
|
|
d2d4e58f6d | ||
|
|
3360d12ccb | ||
|
|
c99828ab6f | ||
|
|
7d38ead3b4 | ||
|
|
66f9d7c397 | ||
|
|
9e49618e75 | ||
|
|
6324bd2198 | ||
|
|
16fdf152d1 | ||
|
|
0683ead841 | ||
|
|
1dd9935a28 | ||
|
|
b989adf3aa | ||
|
|
8cf226ab71 | ||
|
|
42de796933 | ||
|
|
387b686325 | ||
|
|
7a3658a807 | ||
|
|
7feb2daff6 | ||
|
|
0a18500133 | ||
|
|
87260fc991 | ||
|
|
772a291a5a | ||
|
|
77c3f5c0d0 | ||
|
|
3eeff2b39d | ||
|
|
06b8b8d9f0 | ||
|
|
9c58afc7ad | ||
|
|
ded657fd09 | ||
|
|
93e7aec675 | ||
|
|
231409c0ed | ||
|
|
1c1a707b48 | ||
|
|
7a1ebd4adb | ||
|
|
b4474f7737 | ||
|
|
bb4691fe55 | ||
|
|
0fcd24710d | ||
|
|
e495db816c | ||
|
|
0b23488d7c | ||
|
|
f158bc369f | ||
|
|
a396c98059 | ||
|
|
ca43e11e3d | ||
|
|
135fd54dd3 | ||
|
|
493de61386 | ||
|
|
3d7b6b56c3 | ||
|
|
5d620ffde0 | ||
|
|
2a5d72be62 | ||
|
|
8688f6fac3 | ||
|
|
fba465199e | ||
|
|
7b352f5ac2 | ||
|
|
3a0e6fabe8 | ||
|
|
5e2a0b4b3a | ||
|
|
d01df48030 | ||
|
|
29f55ef165 | ||
|
|
3024960f77 | ||
|
|
e042a6fabe |
103
.github/workflows/kernel.yml
vendored
Normal file
103
.github/workflows/kernel.yml
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
name: revyos-kernel-build
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: "0 2 * * *"
|
||||
|
||||
env:
|
||||
xuetie_toolchain: https://occ-oss-prod.oss-cn-hangzhou.aliyuncs.com/resource//1663142514282
|
||||
toolchain_file_name: Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.1-20220906.tar.gz
|
||||
ARCH: riscv
|
||||
board: lpi4a
|
||||
|
||||
jobs:
|
||||
kernel:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- name: thead-gcc
|
||||
toolchain_tripe: riscv64-unknown-linux-gnu-
|
||||
- name: gcc-12
|
||||
toolchain_tripe: riscv64-linux-gnu-
|
||||
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
CROSS_COMPILE: ${{ matrix.toolchain_tripe }}
|
||||
|
||||
steps:
|
||||
- name: Install software
|
||||
run: |
|
||||
sudo apt update && \
|
||||
sudo apt install -y gdisk dosfstools g++-12-riscv64-linux-gnu build-essential \
|
||||
libncurses-dev gawk flex bison openssl libssl-dev tree \
|
||||
dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf device-tree-compiler \
|
||||
devscripts
|
||||
sudo update-alternatives --install \
|
||||
/usr/bin/riscv64-linux-gnu-gcc riscv64-gcc /usr/bin/riscv64-linux-gnu-gcc-12 10
|
||||
sudo update-alternatives --install \
|
||||
/usr/bin/riscv64-linux-gnu-g++ riscv64-g++ /usr/bin/riscv64-linux-gnu-g++-12 10
|
||||
|
||||
- name: Checkout kernel
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
path: 'kernel'
|
||||
|
||||
- name: Configure toolchains
|
||||
run: |
|
||||
mkdir rootfs && mkdir rootfs/boot
|
||||
if [ x"${{ matrix.name }}" = x"thead-gcc" ]; then
|
||||
wget ${xuetie_toolchain}/${toolchain_file_name}
|
||||
tar -xvf ${toolchain_file_name} -C /opt
|
||||
fi
|
||||
|
||||
- name: Compile Kernel && Install
|
||||
run: |
|
||||
export PATH="/opt/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.1/bin:$PATH"
|
||||
|
||||
pushd kernel
|
||||
make revyos_defconfig
|
||||
export KDEB_PKGVERSION="$(date "+%Y.%m.%d.%H.%M")+$(git rev-parse --short HEAD)"
|
||||
if [ x"${{ matrix.name }}" = x"gcc-12" ]; then
|
||||
echo "CONFIG_THEAD_ISA=n" >> .config
|
||||
elif [ x"${{ matrix.name }}" = x"thead-gcc" ]; then
|
||||
echo "CONFIG_THEAD_ISA=y" >> .config
|
||||
fi
|
||||
make -j$(nproc) bindeb-pkg LOCALVERSION="-${board}"
|
||||
make -j$(nproc) dtbs
|
||||
# if [ x"$(cat .config | grep CONFIG_MODULES=y)" = x"CONFIG_MODULES=y" ]; then
|
||||
# sudo make INSTALL_MOD_PATH=${GITHUB_WORKSPACE}/rootfs/ modules_install -j$(nproc)
|
||||
# fi
|
||||
# sudo make INSTALL_PATH=${GITHUB_WORKSPACE}/rootfs/boot install -j$(nproc)
|
||||
|
||||
# Copy deb
|
||||
sudo dcmd cp -v ../*.changes ${GITHUB_WORKSPACE}/rootfs/
|
||||
|
||||
# build perf & install
|
||||
# make LDFLAGS=-static NO_LIBELF=1 NO_JVMTI=1 VF=1 -C tools/perf/
|
||||
# sudo mkdir -p ${GITHUB_WORKSPACE}/rootfs/sbin/
|
||||
# sudo cp -v tools/perf/perf ${GITHUB_WORKSPACE}/rootfs/sbin/perf-thead
|
||||
|
||||
# Install Kernel
|
||||
# sudo cp -v arch/riscv/boot/Image ${GITHUB_WORKSPACE}/rootfs/boot/
|
||||
|
||||
# record commit-id
|
||||
git rev-parse HEAD > kernel-commitid
|
||||
sudo cp -v kernel-commitid ${GITHUB_WORKSPACE}/rootfs/boot/
|
||||
|
||||
# Install DTB
|
||||
sudo cp -v arch/riscv/boot/dts/thead/{light-lpi4a.dtb,light-lpi4a-16gb.dtb} ${GITHUB_WORKSPACE}/rootfs/boot/
|
||||
popd
|
||||
|
||||
- name: compress
|
||||
run: tar -zcvf thead-kernel-${{ matrix.name }}.tar.gz rootfs
|
||||
|
||||
- name: 'Upload Artifact'
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: thead-kernel-${{ matrix.name }}.tar.gz
|
||||
path: thead-kernel-${{ matrix.name }}.tar.gz
|
||||
retention-days: 30
|
||||
@@ -1,30 +1,25 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/cpu/idle-states.yaml#
|
||||
$id: http://devicetree.org/schemas/arm/idle-states.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Idle states binding description
|
||||
title: ARM idle states binding description
|
||||
|
||||
maintainers:
|
||||
- Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
||||
- Anup Patel <anup@brainfault.org>
|
||||
|
||||
description: |+
|
||||
==========================================
|
||||
1 - Introduction
|
||||
==========================================
|
||||
|
||||
ARM and RISC-V systems contain HW capable of managing power consumption
|
||||
dynamically, where cores can be put in different low-power states (ranging
|
||||
from simple wfi to power gating) according to OS PM policies. The CPU states
|
||||
representing the range of dynamic idle states that a processor can enter at
|
||||
run-time, can be specified through device tree bindings representing the
|
||||
parameters required to enter/exit specific idle states on a given processor.
|
||||
|
||||
==========================================
|
||||
2 - ARM idle states
|
||||
==========================================
|
||||
ARM systems contain HW capable of managing power consumption dynamically,
|
||||
where cores can be put in different low-power states (ranging from simple wfi
|
||||
to power gating) according to OS PM policies. The CPU states representing the
|
||||
range of dynamic idle states that a processor can enter at run-time, can be
|
||||
specified through device tree bindings representing the parameters required to
|
||||
enter/exit specific idle states on a given processor.
|
||||
|
||||
According to the Server Base System Architecture document (SBSA, [3]), the
|
||||
power states an ARM CPU can be put into are identified by the following list:
|
||||
@@ -48,23 +43,8 @@ description: |+
|
||||
The device tree binding definition for ARM idle states is the subject of this
|
||||
document.
|
||||
|
||||
==========================================
|
||||
3 - RISC-V idle states
|
||||
==========================================
|
||||
|
||||
On RISC-V systems, the HARTs (or CPUs) [6] can be put in platform specific
|
||||
suspend (or idle) states (ranging from simple WFI, power gating, etc). The
|
||||
RISC-V SBI v0.3 (or higher) [7] hart state management extension provides a
|
||||
standard mechanism for OS to request HART state transitions.
|
||||
|
||||
The platform specific suspend (or idle) states of a hart can be either
|
||||
retentive or non-rententive in nature. A retentive suspend state will
|
||||
preserve HART registers and CSR values for all privilege modes whereas
|
||||
a non-retentive suspend state will not preserve HART registers and CSR
|
||||
values.
|
||||
|
||||
===========================================
|
||||
4 - idle-states definitions
|
||||
2 - idle-states definitions
|
||||
===========================================
|
||||
|
||||
Idle states are characterized for a specific system through a set of
|
||||
@@ -231,10 +211,10 @@ description: |+
|
||||
properties specification that is the subject of the following sections.
|
||||
|
||||
===========================================
|
||||
5 - idle-states node
|
||||
3 - idle-states node
|
||||
===========================================
|
||||
|
||||
The processor idle states are defined within the idle-states node, which is
|
||||
ARM processor idle states are defined within the idle-states node, which is
|
||||
a direct child of the cpus node [1] and provides a container where the
|
||||
processor idle states, defined as device tree nodes, are listed.
|
||||
|
||||
@@ -243,7 +223,7 @@ description: |+
|
||||
just supports idle_standby, an idle-states node is not required.
|
||||
|
||||
===========================================
|
||||
6 - References
|
||||
4 - References
|
||||
===========================================
|
||||
|
||||
[1] ARM Linux Kernel documentation - CPUs bindings
|
||||
@@ -258,15 +238,9 @@ description: |+
|
||||
[4] ARM Architecture Reference Manuals
|
||||
http://infocenter.arm.com/help/index.jsp
|
||||
|
||||
[5] ARM Linux Kernel documentation - Booting AArch64 Linux
|
||||
[6] ARM Linux Kernel documentation - Booting AArch64 Linux
|
||||
Documentation/arm64/booting.rst
|
||||
|
||||
[6] RISC-V Linux Kernel documentation - CPUs bindings
|
||||
Documentation/devicetree/bindings/riscv/cpus.yaml
|
||||
|
||||
[7] RISC-V Supervisor Binary Interface (SBI)
|
||||
http://github.com/riscv/riscv-sbi-doc/riscv-sbi.adoc
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: idle-states
|
||||
@@ -279,7 +253,7 @@ properties:
|
||||
On ARM 32-bit systems this property is optional
|
||||
|
||||
This assumes that the "enable-method" property is set to "psci" in the cpu
|
||||
node[5] that is responsible for setting up CPU idle management in the OS
|
||||
node[6] that is responsible for setting up CPU idle management in the OS
|
||||
implementation.
|
||||
const: psci
|
||||
|
||||
@@ -291,8 +265,8 @@ patternProperties:
|
||||
as follows.
|
||||
|
||||
The idle state entered by executing the wfi instruction (idle_standby
|
||||
SBSA,[3][4]) is considered standard on all ARM and RISC-V platforms and
|
||||
therefore must not be listed.
|
||||
SBSA,[3][4]) is considered standard on all ARM platforms and therefore
|
||||
must not be listed.
|
||||
|
||||
In addition to the properties listed above, a state node may require
|
||||
additional properties specific to the entry-method defined in the
|
||||
@@ -301,27 +275,7 @@ patternProperties:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- arm,idle-state
|
||||
- riscv,idle-state
|
||||
|
||||
arm,psci-suspend-param:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: |
|
||||
power_state parameter to pass to the ARM PSCI suspend call.
|
||||
|
||||
Device tree nodes that require usage of PSCI CPU_SUSPEND function
|
||||
(i.e. idle states node with entry-method property is set to "psci")
|
||||
must specify this property.
|
||||
|
||||
riscv,sbi-suspend-param:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: |
|
||||
suspend_type parameter to pass to the RISC-V SBI HSM suspend call.
|
||||
|
||||
This property is required in idle state nodes of device tree meant
|
||||
for RISC-V systems. For more details on the suspend_type parameter
|
||||
refer the SBI specifiation v0.3 (or higher) [7].
|
||||
const: arm,idle-state
|
||||
|
||||
local-timer-stop:
|
||||
description:
|
||||
@@ -363,8 +317,6 @@ patternProperties:
|
||||
description:
|
||||
A string used as a descriptive name for the idle state.
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- entry-latency-us
|
||||
@@ -706,150 +658,4 @@ examples:
|
||||
};
|
||||
};
|
||||
|
||||
- |
|
||||
// Example 3 (RISC-V 64-bit, 4-cpu systems, two clusters):
|
||||
|
||||
cpus {
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "riscv";
|
||||
reg = <0x0>;
|
||||
riscv,isa = "rv64imafdc";
|
||||
mmu-type = "riscv,sv48";
|
||||
cpu-idle-states = <&CPU_RET_0_0 &CPU_NONRET_0_0
|
||||
&CLUSTER_RET_0 &CLUSTER_NONRET_0>;
|
||||
|
||||
cpu_intc0: interrupt-controller {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,cpu-intc";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "riscv";
|
||||
reg = <0x1>;
|
||||
riscv,isa = "rv64imafdc";
|
||||
mmu-type = "riscv,sv48";
|
||||
cpu-idle-states = <&CPU_RET_0_0 &CPU_NONRET_0_0
|
||||
&CLUSTER_RET_0 &CLUSTER_NONRET_0>;
|
||||
|
||||
cpu_intc1: interrupt-controller {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,cpu-intc";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
|
||||
cpu@10 {
|
||||
device_type = "cpu";
|
||||
compatible = "riscv";
|
||||
reg = <0x10>;
|
||||
riscv,isa = "rv64imafdc";
|
||||
mmu-type = "riscv,sv48";
|
||||
cpu-idle-states = <&CPU_RET_1_0 &CPU_NONRET_1_0
|
||||
&CLUSTER_RET_1 &CLUSTER_NONRET_1>;
|
||||
|
||||
cpu_intc10: interrupt-controller {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,cpu-intc";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
|
||||
cpu@11 {
|
||||
device_type = "cpu";
|
||||
compatible = "riscv";
|
||||
reg = <0x11>;
|
||||
riscv,isa = "rv64imafdc";
|
||||
mmu-type = "riscv,sv48";
|
||||
cpu-idle-states = <&CPU_RET_1_0 &CPU_NONRET_1_0
|
||||
&CLUSTER_RET_1 &CLUSTER_NONRET_1>;
|
||||
|
||||
cpu_intc11: interrupt-controller {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "riscv,cpu-intc";
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
|
||||
idle-states {
|
||||
CPU_RET_0_0: cpu-retentive-0-0 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x10000000>;
|
||||
entry-latency-us = <20>;
|
||||
exit-latency-us = <40>;
|
||||
min-residency-us = <80>;
|
||||
};
|
||||
|
||||
CPU_NONRET_0_0: cpu-nonretentive-0-0 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x90000000>;
|
||||
entry-latency-us = <250>;
|
||||
exit-latency-us = <500>;
|
||||
min-residency-us = <950>;
|
||||
};
|
||||
|
||||
CLUSTER_RET_0: cluster-retentive-0 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x11000000>;
|
||||
local-timer-stop;
|
||||
entry-latency-us = <50>;
|
||||
exit-latency-us = <100>;
|
||||
min-residency-us = <250>;
|
||||
wakeup-latency-us = <130>;
|
||||
};
|
||||
|
||||
CLUSTER_NONRET_0: cluster-nonretentive-0 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x91000000>;
|
||||
local-timer-stop;
|
||||
entry-latency-us = <600>;
|
||||
exit-latency-us = <1100>;
|
||||
min-residency-us = <2700>;
|
||||
wakeup-latency-us = <1500>;
|
||||
};
|
||||
|
||||
CPU_RET_1_0: cpu-retentive-1-0 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x10000010>;
|
||||
entry-latency-us = <20>;
|
||||
exit-latency-us = <40>;
|
||||
min-residency-us = <80>;
|
||||
};
|
||||
|
||||
CPU_NONRET_1_0: cpu-nonretentive-1-0 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x90000010>;
|
||||
entry-latency-us = <250>;
|
||||
exit-latency-us = <500>;
|
||||
min-residency-us = <950>;
|
||||
};
|
||||
|
||||
CLUSTER_RET_1: cluster-retentive-1 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x11000010>;
|
||||
local-timer-stop;
|
||||
entry-latency-us = <50>;
|
||||
exit-latency-us = <100>;
|
||||
min-residency-us = <250>;
|
||||
wakeup-latency-us = <130>;
|
||||
};
|
||||
|
||||
CLUSTER_NONRET_1: cluster-nonretentive-1 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x91000010>;
|
||||
local-timer-stop;
|
||||
entry-latency-us = <600>;
|
||||
exit-latency-us = <1100>;
|
||||
min-residency-us = <2700>;
|
||||
wakeup-latency-us = <1500>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
...
|
||||
@@ -81,4 +81,4 @@ Example:
|
||||
};
|
||||
};
|
||||
|
||||
[1]. Documentation/devicetree/bindings/cpu/idle-states.yaml
|
||||
[1]. Documentation/devicetree/bindings/arm/idle-states.yaml
|
||||
|
||||
@@ -101,7 +101,7 @@ properties:
|
||||
bindings in [1]) must specify this property.
|
||||
|
||||
[1] Kernel documentation - ARM idle states bindings
|
||||
Documentation/devicetree/bindings/cpu/idle-states.yaml
|
||||
Documentation/devicetree/bindings/arm/idle-states.yaml
|
||||
|
||||
patternProperties:
|
||||
"^power-domain-":
|
||||
|
||||
@@ -87,12 +87,6 @@ properties:
|
||||
- compatible
|
||||
- interrupt-controller
|
||||
|
||||
cpu-idle-states:
|
||||
$ref: '/schemas/types.yaml#/definitions/phandle-array'
|
||||
description: |
|
||||
List of phandles to idle state nodes supported
|
||||
by this hart (see ./idle-states.yaml).
|
||||
|
||||
required:
|
||||
- riscv,isa
|
||||
- interrupt-controller
|
||||
|
||||
14
MAINTAINERS
14
MAINTAINERS
@@ -4614,20 +4614,6 @@ S: Supported
|
||||
F: drivers/cpuidle/cpuidle-psci.h
|
||||
F: drivers/cpuidle/cpuidle-psci-domain.c
|
||||
|
||||
CPUIDLE DRIVER - DT IDLE PM DOMAIN
|
||||
M: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/cpuidle/dt_idle_genpd.c
|
||||
F: drivers/cpuidle/dt_idle_genpd.h
|
||||
|
||||
CPUIDLE DRIVER - RISC-V SBI
|
||||
M: Anup Patel <anup@brainfault.org>
|
||||
L: linux-pm@vger.kernel.org
|
||||
L: linux-riscv@lists.infradead.org
|
||||
S: Maintained
|
||||
F: drivers/cpuidle/cpuidle-riscv-sbi.c
|
||||
|
||||
CRAMFS FILESYSTEM
|
||||
M: Nicolas Pitre <nico@fluxnic.net>
|
||||
S: Maintained
|
||||
|
||||
3
Makefile
3
Makefile
@@ -480,6 +480,8 @@ LZ4 = lz4
|
||||
XZ = xz
|
||||
ZSTD = zstd
|
||||
|
||||
PAHOLE_FLAGS = $(shell PAHOLE=$(PAHOLE) $(srctree)/scripts/pahole-flags.sh)
|
||||
|
||||
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
|
||||
-Wbitwise -Wno-return-void -Wno-unknown-attribute $(CF)
|
||||
NOSTDINC_FLAGS :=
|
||||
@@ -534,6 +536,7 @@ export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE
|
||||
export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
|
||||
export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
|
||||
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
|
||||
export PAHOLE_FLAGS
|
||||
|
||||
# Files to ignore in find ... statements
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ config RISCV
|
||||
select CLONE_BACKWARDS
|
||||
select CLINT_TIMER if !MMU
|
||||
select COMMON_CLK
|
||||
select CPU_PM if CPU_IDLE
|
||||
select CPU_PM if (SUSPEND || CPU_IDLE)
|
||||
select COMPAT_BINFMT_ELF if BINFMT_ELF && COMPAT
|
||||
select EDAC_SUPPORT
|
||||
select DMA_DIRECT_REMAP
|
||||
@@ -393,42 +393,14 @@ config FPU
|
||||
If you don't know what to do here, say Y.
|
||||
|
||||
config VECTOR
|
||||
bool "VECTOR support"
|
||||
default n
|
||||
|
||||
choice VECTOR_VERSION
|
||||
prompt "Vector Version"
|
||||
depends on VECTOR
|
||||
default VECTOR_1_0
|
||||
|
||||
config VECTOR_1_0
|
||||
bool "VECTOR 1.0 support"
|
||||
help
|
||||
Say N here if you want to disable all vector 1.0 related procedure
|
||||
in the kernel.
|
||||
|
||||
If you don't know what to do here, say Y.
|
||||
|
||||
config VECTOR_0_7
|
||||
bool "VECTOR 0.7 support"
|
||||
default y
|
||||
help
|
||||
Say N here if you want to disable all vector 0.7 related procedure
|
||||
in the kernel.
|
||||
|
||||
If you don't know what to do here, say Y.
|
||||
|
||||
endchoice
|
||||
|
||||
config VLEN_256
|
||||
bool "VECTOR VLEN 256"
|
||||
depends on VECTOR
|
||||
default n
|
||||
|
||||
config VECTOR_EMU
|
||||
bool "VECTOR e64 emulate for c906 v1"
|
||||
depends on VECTOR
|
||||
default n
|
||||
|
||||
config THEAD_ISA
|
||||
bool "T-HEAD extension ISA in AFLAGS with -march=_xtheadc"
|
||||
default n
|
||||
@@ -575,11 +547,5 @@ config ARCH_SUSPEND_POSSIBLE
|
||||
|
||||
endmenu
|
||||
|
||||
menu "CPU Power Management"
|
||||
|
||||
source "drivers/cpuidle/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
source "arch/riscv/kvm/Kconfig"
|
||||
source "drivers/firmware/Kconfig"
|
||||
|
||||
@@ -19,9 +19,6 @@ config SOC_VIRT
|
||||
select GOLDFISH
|
||||
select RTC_DRV_GOLDFISH if RTC_CLASS
|
||||
select SIFIVE_PLIC
|
||||
select PM_GENERIC_DOMAINS if PM
|
||||
select PM_GENERIC_DOMAINS_OF if PM && OF
|
||||
select RISCV_SBI_CPUIDLE if CPU_IDLE
|
||||
help
|
||||
This enables support for QEMU Virt Machine.
|
||||
|
||||
|
||||
@@ -48,25 +48,20 @@ endif
|
||||
endif
|
||||
|
||||
# ISA string setting
|
||||
riscv-march-$(CONFIG_ARCH_RV32I) := rv32ima
|
||||
riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima
|
||||
riscv-march-$(CONFIG_FPU) := $(riscv-march-y)fd
|
||||
riscv-march-$(CONFIG_RISCV_ISA_C) := $(riscv-march-y)c
|
||||
riscv-march-$(CONFIG_VECTOR) := $(riscv-march-y)v0p7
|
||||
riscv-march-$(CONFIG_THEAD_ISA) := $(riscv-march-y)_xtheadc
|
||||
|
||||
# Newer binutils versions default to ISA spec version 20191213 which moves some
|
||||
# instructions from the I extension to the Zicsr and Zifencei extensions.
|
||||
toolchain-need-zicsr-zifencei := $(call cc-option-yn, -march=$(riscv-march-y)_zicsr_zifencei)
|
||||
riscv-march-$(toolchain-need-zicsr-zifencei) := $(riscv-march-y)_zicsr_zifencei
|
||||
|
||||
riscv-march-cflags-$(CONFIG_ARCH_RV32I) := rv32ima
|
||||
riscv-march-cflags-$(CONFIG_ARCH_RV64I) := rv64ima
|
||||
riscv-march-cflags-$(CONFIG_RISCV_ISA_C) := $(riscv-march-cflags-y)c
|
||||
|
||||
riscv-march-aflags-$(CONFIG_ARCH_RV32I) := rv32ima
|
||||
riscv-march-aflags-$(CONFIG_ARCH_RV64I) := rv64ima
|
||||
riscv-march-aflags-$(CONFIG_FPU) := $(riscv-march-aflags-y)fd
|
||||
riscv-march-aflags-$(CONFIG_RISCV_ISA_C) := $(riscv-march-aflags-y)c
|
||||
riscv-march-aflags-$(CONFIG_VECTOR_1_0) := $(riscv-march-aflags-y)v
|
||||
riscv-march-aflags-$(CONFIG_VECTOR_0_7) := $(riscv-march-aflags-y)v0p7
|
||||
riscv-march-aflags-$(CONFIG_THEAD_ISA) := $(riscv-march-aflags-y)_xtheadc
|
||||
|
||||
KBUILD_CFLAGS += -march=$(riscv-march-cflags-y) -Wa,-march=$(riscv-march-aflags-y)
|
||||
KBUILD_AFLAGS += -march=$(riscv-march-aflags-y)
|
||||
KBUILD_CFLAGS += -march=$(subst _xtheadc,,$(subst v0p7,,$(subst fd,,$(riscv-march-y))))
|
||||
KBUILD_AFLAGS += -march=$(riscv-march-y)
|
||||
|
||||
KBUILD_CFLAGS += -mno-save-restore
|
||||
KBUILD_CFLAGS += -DCONFIG_PAGE_OFFSET=$(CONFIG_PAGE_OFFSET)
|
||||
@@ -124,7 +119,7 @@ endif
|
||||
ifeq ($(CONFIG_RISCV_M_MODE)$(CONFIG_SOC_KENDRYTE),yy)
|
||||
KBUILD_IMAGE := $(boot)/loader.bin
|
||||
else
|
||||
KBUILD_IMAGE := $(boot)/Image.gz
|
||||
KBUILD_IMAGE := $(boot)/Image
|
||||
endif
|
||||
BOOT_TARGETS := Image Image.gz loader loader.bin
|
||||
|
||||
|
||||
@@ -29,10 +29,11 @@ dtb-$(CONFIG_SOC_THEAD) += light-a-val-full.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-ant-ref.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-ant-discrete.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-beagle.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-lpi4a.dtb light-lpi4a-ddr2G.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-lpi4a.dtb light-lpi4a-ddr2G.dtb light-lpi4a-16gb.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-lpi4a-cluster.dtb light-lpi4a-cluster-16gb.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-a-ref.dtb light-a-ref-dsi0.dtb light-a-ref-dsi0-hdmi.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-b-ref.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-a-val-crash.dtb light-b-product-crash.dtb light-ant-ref-crash.dtb light-ant-discrete-crash.dtb light-lpi4a-crash.dtb light-lpi4a-camera-tuning.dtb light-lpi4a-hdmi.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-a-val-crash.dtb light-b-product-crash.dtb light-ant-ref-crash.dtb light-ant-discrete-crash.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-b-power.dtb
|
||||
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-a-val-android.dtb
|
||||
@@ -40,3 +41,4 @@ dtb-$(CONFIG_SOC_THEAD) += light-a-val-android.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += fire-emu.dtb fire-emu-crash.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += fire-emu-soc-base.dtb fire-emu-soc-c910x4.dtb fire-emu-gpu-dpu-dsi0.dtb fire-emu-vi-dsp-vo.dtb fire-emu-vi-vp-vo.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += fire-emu-soc-base-sec.dtb
|
||||
dtb-$(CONFIG_SOC_THEAD) += light-lpi4a-laptop.dtb
|
||||
|
||||
@@ -306,6 +306,15 @@
|
||||
pagesize = <32>;
|
||||
};
|
||||
|
||||
codec: wm8960@1a {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
wlf,shared-lrclk;
|
||||
wlf,hp-cfg = <3 2 3>;
|
||||
wlf,gpio-cfg = <1 3>;
|
||||
};
|
||||
|
||||
touch@5d {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "goodix,gt911";
|
||||
|
||||
@@ -311,6 +311,15 @@
|
||||
pagesize = <32>;
|
||||
};
|
||||
|
||||
codec: wm8960@1a {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
wlf,shared-lrclk;
|
||||
wlf,hp-cfg = <3 2 3>;
|
||||
wlf,gpio-cfg = <1 3>;
|
||||
};
|
||||
|
||||
touch@5d {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "goodix,gt911";
|
||||
|
||||
@@ -162,14 +162,6 @@
|
||||
iopmp_dsp1: IOPMP_DSP1 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio0: IOPMP_AUDIO0 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio1: IOPMP_AUDIO1 {
|
||||
is_default_region;
|
||||
};
|
||||
};
|
||||
|
||||
mbox_910t_client1: mbox_910t_client1 {
|
||||
@@ -525,6 +517,15 @@
|
||||
pagesize = <32>;
|
||||
};
|
||||
|
||||
codec: wm8960@1a {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
wlf,shared-lrclk;
|
||||
wlf,hp-cfg = <3 2 3>;
|
||||
wlf,gpio-cfg = <1 3>;
|
||||
};
|
||||
|
||||
touch@5d {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "goodix,gt911";
|
||||
|
||||
@@ -30,54 +30,45 @@
|
||||
|
||||
&lightsound {
|
||||
status = "okay";
|
||||
|
||||
simple-audio-card,widgets =
|
||||
"Microphone", "Mic Jack",
|
||||
"Speaker", "Speaker",
|
||||
"Headphone", "Headphone Jack";
|
||||
simple-audio-card,routing =
|
||||
"Headphone Jack", "HP_L",
|
||||
"Headphone Jack", "HP_R",
|
||||
"Speaker", "SPK_LP",
|
||||
"Speaker", "SPK_LN",
|
||||
"Speaker", "SPK_RP",
|
||||
"Speaker", "SPK_RN",
|
||||
"Mic Jack","MICB",
|
||||
"LINPUT1", "Mic Jack",
|
||||
"LINPUT3", "Mic Jack";
|
||||
|
||||
simple-audio-card,dai-link@0 { /* I2S - AUDIO SYS CODEC 8156*/
|
||||
reg = <0>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
sound-dai = <&i2s0 0>;
|
||||
};
|
||||
codec {
|
||||
sound-dai = <&es8156_audio_codec>;
|
||||
};
|
||||
};
|
||||
|
||||
simple-audio-card,dai-link@1 { /* I2S - AUDIO SYS CODEC 7210*/
|
||||
simple-audio-card,dai-link@0 { /* I2S - CODEC */
|
||||
reg = <0>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
sound-dai = <&light_i2s 0>;
|
||||
};
|
||||
codec {
|
||||
sound-dai = <&codec>;
|
||||
};
|
||||
};
|
||||
simple-audio-card,dai-link@1 { /* I2S - HDMI */
|
||||
reg = <1>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
sound-dai = <&i2s_8ch_sd2 2>;
|
||||
sound-dai = <&light_i2s 1>;
|
||||
};
|
||||
codec {
|
||||
sound-dai = <&es7210_audio_codec_adc0>;
|
||||
sound-dai = <&dummy_codec>;
|
||||
};
|
||||
};
|
||||
|
||||
simple-audio-card,dai-link@2 { /* I2S - HDMI */
|
||||
reg = <2>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
sound-dai = <&light_i2s 1>;
|
||||
};
|
||||
codec {
|
||||
sound-dai = <&dummy_codec>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&light_i2s {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2s0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2s_8ch_sd2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&es7210_audio_codec_adc0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
@@ -15,6 +15,3 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&eip_28 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
chosen {
|
||||
bootargs = "console=ttyS0,115200 crashkernel=256M-:128M earlycon clk_ignore_unused sram=0xffe0000000,0x180000";
|
||||
stdout-path = "serial0";
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
leds {
|
||||
@@ -165,14 +165,6 @@
|
||||
iopmp_dsp1: IOPMP_DSP1 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio0: IOPMP_AUDIO0 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio1: IOPMP_AUDIO1 {
|
||||
is_default_region;
|
||||
};
|
||||
};
|
||||
|
||||
mbox_910t_client1: mbox_910t_client1 {
|
||||
@@ -330,14 +322,12 @@
|
||||
status = "disabled";
|
||||
key-volumedown {
|
||||
label = "Volume Down Key";
|
||||
wakeup-source;
|
||||
linux,code = <KEY_1>;
|
||||
debounce-interval = <2>;
|
||||
gpios = <&ao_gpio_porta 4 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
key-volumeup {
|
||||
label = "Volume Up Key";
|
||||
wakeup-source;
|
||||
linux,code = <KEY_2>;
|
||||
debounce-interval = <2>;
|
||||
gpios = <&ao_gpio_porta 5 GPIO_ACTIVE_LOW>;
|
||||
@@ -574,14 +564,22 @@
|
||||
&i2c0 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c0>;
|
||||
|
||||
eeprom@50 {
|
||||
compatible = "atmel,24c32";
|
||||
reg = <0x50>;
|
||||
pagesize = <32>;
|
||||
};
|
||||
|
||||
codec: wm8960@1a {
|
||||
#sound-dai-cells = <0>;
|
||||
compatible = "wlf,wm8960";
|
||||
reg = <0x1a>;
|
||||
wlf,shared-lrclk;
|
||||
wlf,hp-cfg = <3 2 3>;
|
||||
wlf,gpio-cfg = <1 3>;
|
||||
};
|
||||
|
||||
touch@5d {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "goodix,gt911";
|
||||
@@ -673,8 +671,6 @@
|
||||
&i2c1 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1>;
|
||||
touch1@5d {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "goodix,gt911";
|
||||
@@ -693,9 +689,9 @@
|
||||
num-cs = <1>;
|
||||
cs-gpios = <&gpio2_porta 15 0>; // GPIO_ACTIVE_HIGH: 0
|
||||
rx-sample-delay-ns = <10>;
|
||||
status = "okay";
|
||||
|
||||
spi_norflash@0 {
|
||||
status = "okay";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "winbond,w25q64jwm", "jedec,spi-nor";
|
||||
@@ -705,7 +701,6 @@
|
||||
};
|
||||
|
||||
spidev@1 {
|
||||
status = "disable";
|
||||
compatible = "spidev";
|
||||
#address-cells = <0x1>;
|
||||
#size-cells = <0x1>;
|
||||
@@ -716,30 +711,13 @@
|
||||
|
||||
&uart0 {
|
||||
clock-frequency = <100000000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart0>;
|
||||
};
|
||||
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart1>;
|
||||
};
|
||||
|
||||
&uart3 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart3>;
|
||||
};
|
||||
|
||||
&uart4 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart4>;
|
||||
};
|
||||
|
||||
&qspi0 {
|
||||
num-cs = <1>;
|
||||
cs-gpios = <&gpio2_porta 3 0>;
|
||||
rx-sample-dly = <5>;
|
||||
status = "okay";
|
||||
rx-sample-dly = <4>;
|
||||
status = "disabled";
|
||||
|
||||
spi-flash@0 {
|
||||
#address-cells = <1>;
|
||||
@@ -760,8 +738,7 @@
|
||||
&qspi1 {
|
||||
num-cs = <1>;
|
||||
cs-gpios = <&gpio0_porta 1 0>;
|
||||
rx-sample-dly = <5>;
|
||||
status = "okay";
|
||||
status = "disabled";
|
||||
|
||||
spi-flash@0 {
|
||||
#address-cells = <1>;
|
||||
@@ -784,8 +761,6 @@
|
||||
rx-clk-delay = <0x00>; /* for RGMII */
|
||||
tx-clk-delay = <0x00>; /* for RGMII */
|
||||
phy-handle = <&phy_88E1111_0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gmac0>;
|
||||
status = "okay";
|
||||
|
||||
mdio0 {
|
||||
@@ -808,8 +783,6 @@
|
||||
rx-clk-delay = <0x00>; /* for RGMII */
|
||||
tx-clk-delay = <0x00>; /* for RGMII */
|
||||
phy-handle = <&phy_88E1111_1>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gmac1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -831,8 +804,6 @@
|
||||
bus-width = <4>;
|
||||
pull_up;
|
||||
wprtn_ignore;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sdio0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -861,8 +832,17 @@
|
||||
*/
|
||||
pinctrl_uart0: uart0grp {
|
||||
thead,pins = <
|
||||
FM_UART0_TXD 0x0 0x234
|
||||
FM_UART0_RXD 0x0 0x234
|
||||
FM_UART0_TXD 0x0 0x72
|
||||
FM_UART0_RXD 0x0 0x72
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_spi0: spi0grp {
|
||||
thead,pins = <
|
||||
FM_SPI_CSN 0x3 0x20a
|
||||
FM_SPI_SCLK 0x0 0x20a
|
||||
FM_SPI_MISO 0x0 0x23a
|
||||
FM_SPI_MOSI 0x0 0x23a
|
||||
>;
|
||||
};
|
||||
|
||||
@@ -890,87 +870,12 @@
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c2: i2c2grp {
|
||||
thead,pins = <
|
||||
FM_I2C2_SCL 0x0 0x204
|
||||
FM_I2C2_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c3: i2c3grp {
|
||||
thead,pins = <
|
||||
FM_I2C3_SCL 0x0 0x204
|
||||
FM_I2C3_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_spi0: spi0grp {
|
||||
thead,pins = <
|
||||
FM_SPI_CSN 0x3 0x20a
|
||||
FM_SPI_SCLK 0x0 0x20a
|
||||
FM_SPI_MISO 0x0 0x23a
|
||||
FM_SPI_MOSI 0x0 0x23a
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_gmac1: gmac1grp {
|
||||
thead,pins = <
|
||||
FM_GPIO2_18 0x1 0x20f /* GMAC1_TX_CLK */
|
||||
FM_GPIO2_19 0x1 0x20f /* GMAC1_RX_CLK */
|
||||
FM_GPIO2_20 0x1 0x20f /* GMAC1_TXEN */
|
||||
FM_GPIO2_21 0x1 0x20f /* GMAC1_TXD0 */
|
||||
FM_GPIO2_22 0x1 0x20f /* GMAC1_TXD1 */
|
||||
FM_GPIO2_23 0x1 0x20f /* GMAC1_TXD2 */
|
||||
FM_GPIO2_24 0x1 0x20f /* GMAC1_TXD3 */
|
||||
FM_GPIO2_25 0x1 0x20f /* GMAC1_RXDV */
|
||||
FM_GPIO2_30 0x1 0x20f /* GMAC1_RXD0 */
|
||||
FM_GPIO2_31 0x1 0x20f /* GMAC1_RXD1 */
|
||||
FM_GPIO3_0 0x1 0x20f /* GMAC1_RXD2 */
|
||||
FM_GPIO3_1 0x1 0x20f /* GMAC1_RXD3 */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_sdio0: sdio0grp {
|
||||
thead,pins = <
|
||||
FM_SDIO0_DETN 0x0 0x208
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_pwm: pwmgrp {
|
||||
thead,pins = <
|
||||
FM_GPIO3_2 0x1 0x208 /* pwm0 */
|
||||
FM_GPIO3_3 0x1 0x208 /* pwm1 */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_hdmi: hdmigrp {
|
||||
thead,pins = <
|
||||
FM_HDMI_SCL 0x0 0x208
|
||||
FM_HDMI_SDA 0x0 0x208
|
||||
FM_HDMI_CEC 0x0 0x208
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_gmac0: gmac0grp {
|
||||
thead,pins = <
|
||||
FM_GMAC0_TX_CLK 0x0 0x20f /* GMAC0_TX_CLK */
|
||||
FM_GMAC0_RX_CLK 0x0 0x20f /* GMAC0_RX_CLK */
|
||||
FM_GMAC0_TXEN 0x0 0x20f /* GMAC0_TXEN */
|
||||
FM_GMAC0_TXD0 0x0 0x20f /* GMAC0_TXD0 */
|
||||
FM_GMAC0_TXD1 0x0 0x20f /* GMAC0_TXD1 */
|
||||
FM_GMAC0_TXD2 0x0 0x20f /* GMAC0_TXD2 */
|
||||
FM_GMAC0_TXD3 0x0 0x20f /* GMAC0_TXD3 */
|
||||
FM_GMAC0_RXDV 0x0 0x20f /* GMAC0_RXDV */
|
||||
FM_GMAC0_RXD0 0x0 0x20f /* GMAC0_RXD0 */
|
||||
FM_GMAC0_RXD1 0x0 0x20f /* GMAC0_RXD1 */
|
||||
FM_GMAC0_RXD2 0x0 0x20f /* GMAC0_RXD2 */
|
||||
FM_GMAC0_RXD3 0x0 0x20f /* GMAC0_RXD3 */
|
||||
FM_GMAC0_MDC 0x0 0x208 /* GMAC0_MDC */
|
||||
FM_GMAC0_MDIO 0x0 0x208 /* GMAC0_MDIO */
|
||||
FM_GMAC0_COL 0x3 0x232 /* PHY0_nRST */
|
||||
FM_GMAC0_CRS 0x3 0x232 /* PHY0_nINT */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -980,6 +885,22 @@
|
||||
* Pin Configuration Node:
|
||||
* Format: <pin_id mux_node config>
|
||||
*/
|
||||
pinctrl_uart3: uart3grp {
|
||||
thead,pins = <
|
||||
FM_UART3_TXD 0x0 0x72
|
||||
FM_UART3_RXD 0x0 0x72
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart4: uart4grp {
|
||||
thead,pins = <
|
||||
FM_UART4_TXD 0x0 0x72
|
||||
FM_UART4_RXD 0x0 0x72
|
||||
FM_UART4_CTSN 0x0 0x72
|
||||
FM_UART4_RTSN 0x0 0x72
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_qspi1: qspi1grp {
|
||||
thead,pins = <
|
||||
FM_QSPI1_SCLK 0x0 0x20a
|
||||
@@ -991,6 +912,7 @@
|
||||
>;
|
||||
};
|
||||
|
||||
|
||||
pinctrl_iso7816: iso7816grp {
|
||||
thead,pins = <
|
||||
FM_QSPI1_SCLK 0x1 0x208
|
||||
@@ -1001,51 +923,6 @@
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c0: i2c0grp {
|
||||
thead,pins = <
|
||||
FM_I2C0_SCL 0x0 0x204
|
||||
FM_I2C0_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c1: i2c1grp {
|
||||
thead,pins = <
|
||||
FM_I2C1_SCL 0x0 0x204
|
||||
FM_I2C1_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart1: uart1grp {
|
||||
thead,pins = <
|
||||
FM_UART1_TXD 0x0 0x234
|
||||
FM_UART1_RXD 0x0 0x234
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart4: uart4grp {
|
||||
thead,pins = <
|
||||
FM_UART4_TXD 0x0 0x208
|
||||
FM_UART4_RXD 0x0 0x208
|
||||
FM_UART4_CTSN 0x0 0x208
|
||||
FM_UART4_RTSN 0x0 0x208
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart3: uart3grp {
|
||||
thead,pins = <
|
||||
FM_UART3_TXD 0x1 0x202
|
||||
FM_UART3_RXD 0x1 0x202
|
||||
FM_GPIO0_20 0x2 0x202 /* UART3_IR_OUT */
|
||||
FM_GPIO0_21 0x2 0x202 /* UART3_IR_IN */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c4: i2c4grp {
|
||||
thead,pins = <
|
||||
FM_GPIO0_18 0x1 0x204 /* I2C4_SCL */
|
||||
FM_GPIO0_19 0x1 0x204 /* I2C4_SDA */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1209,8 +1086,6 @@
|
||||
&i2c2 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c2>;
|
||||
eeprom@50 {
|
||||
compatible = "atmel,24c32";
|
||||
reg = <0x50>;
|
||||
@@ -1221,8 +1096,6 @@
|
||||
&i2c3 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c3>;
|
||||
eeprom@50 {
|
||||
compatible = "atmel,24c32";
|
||||
reg = <0x50>;
|
||||
@@ -1233,8 +1106,6 @@
|
||||
&i2c4 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c4>;
|
||||
eeprom@50 {
|
||||
compatible = "atmel,24c32";
|
||||
reg = <0x50>;
|
||||
@@ -1457,7 +1328,7 @@
|
||||
DOVDD18_RGB-supply = <&soc_dovdd18_rgb_reg>;
|
||||
DVDD12_RGB-supply = <&soc_dvdd12_rgb_reg>;
|
||||
AVDD28_RGB-supply = <&soc_avdd28_rgb_reg>;
|
||||
i2c_reg_width = /bits/ 8 <2>;
|
||||
i2c_reg_width = /bits/ 8 <2>;
|
||||
i2c_data_width = /bits/ 8 <1>;
|
||||
i2c_addr = /bits/ 8 <0x1a>;
|
||||
i2c_bus = /bits/ 8 <3>;
|
||||
@@ -1465,7 +1336,6 @@
|
||||
};
|
||||
|
||||
&video0{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <2>; // vi_mem: framebuffer, region[2]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -1552,7 +1422,6 @@
|
||||
|
||||
|
||||
&video1{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <2>; // vi_mem: framebuffer, region[2]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -1656,7 +1525,6 @@
|
||||
};
|
||||
|
||||
&video2{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -1749,7 +1617,6 @@
|
||||
};
|
||||
|
||||
&video3{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -1853,7 +1720,6 @@
|
||||
};
|
||||
|
||||
&video4{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -2005,7 +1871,6 @@
|
||||
};
|
||||
|
||||
&video5{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -2175,7 +2040,6 @@
|
||||
};
|
||||
|
||||
&video6{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <1>; // vi_mem: framebuffer, region[1]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -2216,7 +2080,6 @@
|
||||
};
|
||||
|
||||
&video7{
|
||||
status = "okay";
|
||||
channel0 {
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
@@ -2386,7 +2249,6 @@
|
||||
|
||||
|
||||
&video8{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <1>; // vi_mem: framebuffer, region[1]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -2418,7 +2280,6 @@
|
||||
};
|
||||
|
||||
&video9{
|
||||
status = "okay";
|
||||
channel0 {
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
@@ -2440,7 +2301,6 @@
|
||||
|
||||
|
||||
&video10{
|
||||
status = "okay";
|
||||
channel0 {
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
@@ -2462,7 +2322,6 @@
|
||||
};
|
||||
|
||||
&video11{
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -2489,7 +2348,6 @@
|
||||
};
|
||||
|
||||
&video12{ // TUNINGTOOL
|
||||
status = "okay";
|
||||
channel0 { // CSI2
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
@@ -2510,35 +2368,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
&video15{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <0>;
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <0>; //<0>=vivcam0 :2310
|
||||
csi_idx = <0>; //<0>=CSI2
|
||||
flash_led_idx = <0>;
|
||||
mode_idx = <1>;
|
||||
path_type = "SENSOR_1920X1088_26FPS_RAW12_LINER";
|
||||
};
|
||||
sensor1 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <7>; //imx334
|
||||
csi_idx = <0>; //<0>=CSI2
|
||||
mode_idx = <0>;
|
||||
path_type = "SENSOR_3840x2180_RAW12_LINER";
|
||||
};
|
||||
dma {
|
||||
subdev_name = "vipre";
|
||||
idx = <0>;
|
||||
path_type = "VIPRE_CSI0_DDR";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&trng {
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -2684,8 +2513,3 @@
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
&hdmi_tx {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hdmi>;
|
||||
};
|
||||
|
||||
@@ -166,14 +166,6 @@
|
||||
iopmp_dsp1: IOPMP_DSP1 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio0: IOPMP_AUDIO0 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio1: IOPMP_AUDIO1 {
|
||||
is_default_region;
|
||||
};
|
||||
};
|
||||
|
||||
mbox_910t_client1: mbox_910t_client1 {
|
||||
@@ -2279,9 +2271,6 @@
|
||||
&hdmi_tx {
|
||||
status = "okay";
|
||||
|
||||
max_width = /bits/ 16 <1280>;
|
||||
max_height = /bits/ 16 <720>;
|
||||
|
||||
port@0 {
|
||||
/* input */
|
||||
hdmi_tx_in: endpoint {
|
||||
|
||||
@@ -166,14 +166,6 @@
|
||||
iopmp_dsp1: IOPMP_DSP1 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio0: IOPMP_AUDIO0 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio1: IOPMP_AUDIO1 {
|
||||
is_default_region;
|
||||
};
|
||||
};
|
||||
|
||||
mbox_910t_client1: mbox_910t_client1 {
|
||||
@@ -266,14 +258,12 @@
|
||||
pinctrl-names = "default";
|
||||
key-volumedown {
|
||||
label = "Volume Down Key";
|
||||
wakeup-source;
|
||||
linux,code = <KEY_VOLUMEDOWN>;
|
||||
debounce-interval = <1>;
|
||||
gpios = <&ao_gpio_porta 11 0x1>;
|
||||
};
|
||||
key-volumeup {
|
||||
label = "Volume Up Key";
|
||||
wakeup-source;
|
||||
linux,code = <KEY_VOLUMEUP>;
|
||||
debounce-interval = <1>;
|
||||
gpios = <&ao_gpio_porta 10 0x1>;
|
||||
|
||||
@@ -166,14 +166,6 @@
|
||||
iopmp_dsp1: IOPMP_DSP1 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio0: IOPMP_AUDIO0 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio1: IOPMP_AUDIO1 {
|
||||
is_default_region;
|
||||
};
|
||||
};
|
||||
|
||||
mbox_910t_client1: mbox_910t_client1 {
|
||||
@@ -247,7 +239,6 @@
|
||||
ref-clock-frequency = <24000000>;
|
||||
keep_wifi_power_on;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_wifi>;
|
||||
wifi_chip_type = "rtl8723ds";
|
||||
WIFI,poweren_gpio = <&gpio2_porta 29 0>;
|
||||
WIFI,reset_n = <&gpio2_porta 24 0>;
|
||||
@@ -256,8 +247,7 @@
|
||||
|
||||
wcn_bt: wireless-bluetooth {
|
||||
compatible = "bluetooth-platdata";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_bt>;
|
||||
pinctrl-names = "default", "rts_gpio";
|
||||
BT,power_gpio = <&gpio2_porta 25 0>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -268,14 +258,12 @@
|
||||
pinctrl-names = "default";
|
||||
key-volumedown {
|
||||
label = "Volume Down Key";
|
||||
wakeup-source;
|
||||
linux,code = <KEY_VOLUMEDOWN>;
|
||||
debounce-interval = <1>;
|
||||
gpios = <&ao_gpio_porta 11 0x1>;
|
||||
};
|
||||
key-volumeup {
|
||||
label = "Volume Up Key";
|
||||
wakeup-source;
|
||||
linux,code = <KEY_VOLUMEUP>;
|
||||
debounce-interval = <1>;
|
||||
gpios = <&ao_gpio_porta 10 0x1>;
|
||||
@@ -711,23 +699,6 @@
|
||||
|
||||
&uart0 {
|
||||
clock-frequency = <100000000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart0>;
|
||||
};
|
||||
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart1>;
|
||||
};
|
||||
|
||||
&uart3 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart3>;
|
||||
};
|
||||
|
||||
&uart4 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart4>;
|
||||
};
|
||||
|
||||
&qspi0 {
|
||||
@@ -773,8 +744,6 @@
|
||||
tx-clk-delay = <0x00>; /* for RGMII */
|
||||
phy-handle = <&phy_88E1111_0>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gmac0>;
|
||||
|
||||
mdio0 {
|
||||
#address-cells = <1>;
|
||||
@@ -818,8 +787,6 @@
|
||||
pull_up;
|
||||
wprtn_ignore;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sdio0>;
|
||||
};
|
||||
|
||||
&sdhci1 {
|
||||
@@ -847,8 +814,17 @@
|
||||
*/
|
||||
pinctrl_uart0: uart0grp {
|
||||
thead,pins = <
|
||||
FM_UART0_TXD 0x0 0x234
|
||||
FM_UART0_RXD 0x0 0x234
|
||||
FM_UART0_TXD 0x0 0x72
|
||||
FM_UART0_RXD 0x0 0x72
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_spi0: spi0grp {
|
||||
thead,pins = <
|
||||
FM_SPI_CSN 0x3 0x20a
|
||||
FM_SPI_SCLK 0x0 0x20a
|
||||
FM_SPI_MISO 0x0 0x23a
|
||||
FM_SPI_MOSI 0x0 0x23a
|
||||
>;
|
||||
};
|
||||
|
||||
@@ -876,81 +852,9 @@
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c2: i2c2grp {
|
||||
thead,pins = <
|
||||
FM_I2C2_SCL 0x0 0x204
|
||||
FM_I2C2_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c3: i2c3grp {
|
||||
thead,pins = <
|
||||
FM_I2C3_SCL 0x0 0x204
|
||||
FM_I2C3_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_spi0: spi0grp {
|
||||
thead,pins = <
|
||||
FM_SPI_CSN 0x3 0x20a
|
||||
FM_SPI_SCLK 0x0 0x20a
|
||||
FM_SPI_MISO 0x0 0x23a
|
||||
FM_SPI_MOSI 0x0 0x23a
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_wifi: wifi_grp {
|
||||
thead,pins = <
|
||||
FM_GPIO2_22 0x0 0x202
|
||||
FM_GPIO2_24 0x0 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_bt: bt_grp {
|
||||
thead,pins = <
|
||||
FM_GPIO2_23 0x0 0x202
|
||||
FM_GPIO2_25 0x0 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_sdio0: sdio0grp {
|
||||
thead,pins = <
|
||||
FM_SDIO0_DETN 0x0 0x208
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_pwm: pwmgrp {
|
||||
thead,pins = <
|
||||
FM_GPIO3_2 0x1 0x20f /* pwm0 */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_hdmi: hdmigrp {
|
||||
thead,pins = <
|
||||
FM_HDMI_SCL 0x0 0x208
|
||||
FM_HDMI_SDA 0x0 0x208
|
||||
FM_HDMI_CEC 0x0 0x208
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_gmac0: gmac0grp {
|
||||
thead,pins = <
|
||||
FM_GMAC0_TX_CLK 0x0 0x20f /* GMAC0_TX_CLK */
|
||||
FM_GMAC0_RX_CLK 0x0 0x20f /* GMAC0_RX_CLK */
|
||||
FM_GMAC0_TXEN 0x0 0x20f /* GMAC0_TXEN */
|
||||
FM_GMAC0_TXD0 0x0 0x20f /* GMAC0_TXD0 */
|
||||
FM_GMAC0_TXD1 0x0 0x20f /* GMAC0_TXD1 */
|
||||
FM_GMAC0_TXD2 0x0 0x20f /* GMAC0_TXD2 */
|
||||
FM_GMAC0_TXD3 0x0 0x20f /* GMAC0_TXD3 */
|
||||
FM_GMAC0_RXDV 0x0 0x20f /* GMAC0_RXDV */
|
||||
FM_GMAC0_RXD0 0x0 0x20f /* GMAC0_RXD0 */
|
||||
FM_GMAC0_RXD1 0x0 0x20f /* GMAC0_RXD1 */
|
||||
FM_GMAC0_RXD2 0x0 0x20f /* GMAC0_RXD2 */
|
||||
FM_GMAC0_RXD3 0x0 0x20f /* GMAC0_RXD3 */
|
||||
FM_GMAC0_MDC 0x0 0x208 /* GMAC0_MDC */
|
||||
FM_GMAC0_MDIO 0x0 0x208 /* GMAC0_MDIO */
|
||||
FM_GMAC0_COL 0x3 0x232 /* PHY0_nRST */
|
||||
FM_GMAC0_CRS 0x3 0x232 /* PHY0_nINT */
|
||||
FM_GPIO3_2 0x1 0x208 /* pwm0 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
@@ -962,6 +866,22 @@
|
||||
* Pin Configuration Node:
|
||||
* Format: <pin_id mux_node config>
|
||||
*/
|
||||
pinctrl_uart3: uart3grp {
|
||||
thead,pins = <
|
||||
FM_UART3_TXD 0x0 0x72
|
||||
FM_UART3_RXD 0x0 0x72
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart4: uart4grp {
|
||||
thead,pins = <
|
||||
FM_UART4_TXD 0x0 0x72
|
||||
FM_UART4_RXD 0x0 0x72
|
||||
FM_UART4_CTSN 0x0 0x72
|
||||
FM_UART4_RTSN 0x0 0x72
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_qspi1: qspi1grp {
|
||||
thead,pins = <
|
||||
FM_QSPI1_SCLK 0x0 0x20a
|
||||
@@ -973,6 +893,7 @@
|
||||
>;
|
||||
};
|
||||
|
||||
|
||||
pinctrl_iso7816: iso7816grp {
|
||||
thead,pins = <
|
||||
FM_QSPI1_SCLK 0x1 0x208
|
||||
@@ -983,49 +904,6 @@
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c0: i2c0grp {
|
||||
thead,pins = <
|
||||
FM_I2C0_SCL 0x0 0x204
|
||||
FM_I2C0_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c1: i2c1grp {
|
||||
thead,pins = <
|
||||
FM_I2C1_SCL 0x0 0x204
|
||||
FM_I2C1_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart1: uart1grp {
|
||||
thead,pins = <
|
||||
FM_UART1_TXD 0x0 0x234
|
||||
FM_UART1_RXD 0x0 0x234
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart4: uart4grp {
|
||||
thead,pins = <
|
||||
FM_UART4_TXD 0x0 0x208
|
||||
FM_UART4_RXD 0x0 0x208
|
||||
FM_UART4_CTSN 0x0 0x208
|
||||
FM_UART4_RTSN 0x0 0x208
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart3: uart3grp {
|
||||
thead,pins = <
|
||||
FM_UART3_TXD 0x1 0x202
|
||||
FM_UART3_RXD 0x1 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c4: i2c4grp {
|
||||
thead,pins = <
|
||||
FM_GPIO0_18 0x1 0x204 /* I2C4_SCL */
|
||||
FM_GPIO0_19 0x1 0x204 /* I2C4_SDA */
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1136,36 +1014,26 @@
|
||||
&i2c0 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c0>;
|
||||
};
|
||||
|
||||
&i2c1 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1>;
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c2>;
|
||||
};
|
||||
|
||||
&i2c3 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c3>;
|
||||
};
|
||||
|
||||
&i2c4 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c4>;
|
||||
};
|
||||
|
||||
&isp0 {
|
||||
@@ -1372,7 +1240,6 @@
|
||||
};
|
||||
|
||||
&video0{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <2>; // vi_mem: framebuffer, region[2]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -1459,7 +1326,6 @@
|
||||
|
||||
|
||||
&video1{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <2>; // vi_mem: framebuffer, region[2]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -1563,7 +1429,6 @@
|
||||
};
|
||||
|
||||
&video2{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -1580,13 +1445,20 @@
|
||||
mode_idx = <0>;
|
||||
path_type = "SENSOR_1600x1200_RAW10_LINER";
|
||||
};
|
||||
sensor2 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <7>; //imx334
|
||||
csi_idx = <0>; //<0>=CSI2
|
||||
mode_idx = <0>;
|
||||
path_type = "SENSOR_3840x2180_RAW12_LINER";
|
||||
};
|
||||
isp {
|
||||
subdev_name = "isp";
|
||||
idx = <1>;
|
||||
path_type = "ISP_MI_PATH_MP";
|
||||
output {
|
||||
max_width = <1920>;
|
||||
max_height = <1088>;
|
||||
max_width = <3840>;
|
||||
max_height = <2180>;
|
||||
bit_per_pixel = <16>;
|
||||
frame_count = <3>;
|
||||
};
|
||||
@@ -1649,7 +1521,6 @@
|
||||
};
|
||||
|
||||
&video3{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -1753,7 +1624,6 @@
|
||||
};
|
||||
|
||||
&video4{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -1905,7 +1775,6 @@
|
||||
};
|
||||
|
||||
&video5{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -2075,7 +1944,6 @@
|
||||
};
|
||||
|
||||
&video6{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <1>; // vi_mem: framebuffer, region[1]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -2117,7 +1985,6 @@
|
||||
};
|
||||
|
||||
&video7{
|
||||
status = "okay";
|
||||
channel0 {
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
@@ -2287,7 +2154,6 @@
|
||||
|
||||
|
||||
&video8{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <1>; // vi_mem: framebuffer, region[1]
|
||||
channel0 {
|
||||
sensor0 {
|
||||
@@ -2319,7 +2185,6 @@
|
||||
};
|
||||
|
||||
&video9{
|
||||
status = "okay";
|
||||
channel0 {
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
@@ -2341,7 +2206,6 @@
|
||||
|
||||
|
||||
&video10{ // TUNINGTOOL
|
||||
status = "okay";
|
||||
channel0 {
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
@@ -2363,7 +2227,6 @@
|
||||
};
|
||||
|
||||
&video11{
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -2390,7 +2253,6 @@
|
||||
};
|
||||
|
||||
&video12{ // TUNINGTOOL
|
||||
status = "okay";
|
||||
channel0 { // CSI2
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
@@ -2412,7 +2274,6 @@
|
||||
};
|
||||
|
||||
&video14{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <2>; // vi_mem: framebuffer, region[0]
|
||||
status = "okay";
|
||||
channel0 {
|
||||
@@ -2579,8 +2440,6 @@
|
||||
|
||||
&hdmi_tx {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hdmi>;
|
||||
|
||||
port@0 {
|
||||
/* input */
|
||||
|
||||
@@ -166,14 +166,6 @@
|
||||
iopmp_dsp1: IOPMP_DSP1 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio0: IOPMP_AUDIO0 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio1: IOPMP_AUDIO1 {
|
||||
is_default_region;
|
||||
};
|
||||
};
|
||||
|
||||
mbox_910t_client1: mbox_910t_client1 {
|
||||
|
||||
@@ -163,14 +163,6 @@
|
||||
iopmp_dsp1: IOPMP_DSP1 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio0: IOPMP_AUDIO0 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio1: IOPMP_AUDIO1 {
|
||||
is_default_region;
|
||||
};
|
||||
};
|
||||
|
||||
mbox_910t_client1: mbox_910t_client1 {
|
||||
|
||||
20
arch/riscv/boot/dts/thead/light-lpi4a-16gb.dts
Normal file
20
arch/riscv/boot/dts/thead/light-lpi4a-16gb.dts
Normal file
@@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2022 Alibaba Group Holding Limited.
|
||||
*/
|
||||
|
||||
#include "light-lpi4a-ref.dts"
|
||||
|
||||
/ {
|
||||
model = "T-HEAD Light Lichee Pi 4A configuration for 16GB DDR board";
|
||||
compatible = "thead,light-val", "thead,light-lpi4a", "thead,light";
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x0 0x200000 0x3 0xffe00000>;
|
||||
};
|
||||
};
|
||||
|
||||
&cmamem {
|
||||
alloc-ranges = <0x3 0xe4000000 0 0x14000000>; // [0x3E400_0000 ~ 0x3F800_0000]
|
||||
};
|
||||
@@ -1,53 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2021 Alibaba Group Holding Limited.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "light-lpi4a.dts"
|
||||
|
||||
|
||||
|
||||
&video10{ // TUNINGTOOL
|
||||
status = "okay";
|
||||
channel0 {
|
||||
sensor1 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <3>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <1>; // 0=640 480 1=2592x1944
|
||||
path_type = "SENSOR_2592x1944_LINER";
|
||||
};
|
||||
dma {
|
||||
path_type = "VIPRE_CSI0_ISP0";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&video15{
|
||||
status = "okay";
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
channel0 {
|
||||
status = "okay";
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <0>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <0>;
|
||||
path_type = "SENSOR_VGA_RAW12_LINER";
|
||||
};
|
||||
sensor1 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <3>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <1>;
|
||||
path_type = "SENSOR_2592x1944_LINER";
|
||||
};
|
||||
dma {
|
||||
subdev_name = "vipre";
|
||||
idx = <0>;
|
||||
path_type = "VIPRE_CSI0_DDR";
|
||||
};
|
||||
};
|
||||
};
|
||||
26
arch/riscv/boot/dts/thead/light-lpi4a-cluster-16gb.dts
Normal file
26
arch/riscv/boot/dts/thead/light-lpi4a-cluster-16gb.dts
Normal file
@@ -0,0 +1,26 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2023 Sipeed.
|
||||
*/
|
||||
|
||||
#include "light-lpi4a-16gb.dts"
|
||||
|
||||
/ {
|
||||
model = "T-HEAD Light Lichee Pi 4A configuration for 16GB DDR board on Cluster";
|
||||
};
|
||||
|
||||
&audio_i2c0 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&audio_i2c1 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&lightsound {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
®_usb_hub_vdd1v2 {
|
||||
/delete-property/ gpio;
|
||||
};
|
||||
26
arch/riscv/boot/dts/thead/light-lpi4a-cluster.dts
Normal file
26
arch/riscv/boot/dts/thead/light-lpi4a-cluster.dts
Normal file
@@ -0,0 +1,26 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2023 Sipeed.
|
||||
*/
|
||||
|
||||
#include "light-lpi4a.dts"
|
||||
|
||||
/ {
|
||||
model = "T-HEAD Light Lichee Pi 4A configuration for 8GB DDR board on Cluster";
|
||||
};
|
||||
|
||||
&audio_i2c0 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&audio_i2c1 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&lightsound {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
®_usb_hub_vdd1v2 {
|
||||
/delete-property/ gpio;
|
||||
};
|
||||
@@ -1,98 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2023 Alibaba Group Holding Limited.
|
||||
*/
|
||||
|
||||
#include "light-crash.dts"
|
||||
|
||||
&aon {
|
||||
aon_reg_dialog: light-dialog-reg {
|
||||
compatible = "thead,light-dialog-pmic-ant";
|
||||
status = "okay";
|
||||
|
||||
dvdd_cpu_reg: appcpu_dvdd {
|
||||
regulator-name = "appcpu_dvdd";
|
||||
regulator-min-microvolt = <300000>;
|
||||
regulator-max-microvolt = <1570000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
dvddm_cpu_reg: appcpu_dvddm {
|
||||
regulator-name = "appcpu_dvddm";
|
||||
regulator-min-microvolt = <300000>;
|
||||
regulator-max-microvolt = <1570000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&cpus {
|
||||
c910_0: cpu@0 {
|
||||
operating-points = <
|
||||
/* kHz uV */
|
||||
300000 600000
|
||||
800000 700000
|
||||
1500000 800000
|
||||
1848000 1000000
|
||||
>;
|
||||
light,dvddm-operating-points = <
|
||||
/* kHz uV */
|
||||
300000 800000
|
||||
800000 800000
|
||||
1500000 800000
|
||||
1848000 1000000
|
||||
>;
|
||||
};
|
||||
c910_1: cpu@1 {
|
||||
operating-points = <
|
||||
/* kHz uV */
|
||||
300000 600000
|
||||
800000 700000
|
||||
1500000 800000
|
||||
1848000 1000000
|
||||
>;
|
||||
light,dvddm-operating-points = <
|
||||
/* kHz uV */
|
||||
300000 800000
|
||||
800000 800000
|
||||
1500000 800000
|
||||
1848000 1000000
|
||||
>;
|
||||
};
|
||||
c910_2: cpu@2 {
|
||||
|
||||
operating-points = <
|
||||
/* kHz uV */
|
||||
300000 600000
|
||||
800000 700000
|
||||
1500000 800000
|
||||
1848000 1000000
|
||||
>;
|
||||
light,dvddm-operating-points = <
|
||||
/* kHz uV */
|
||||
300000 800000
|
||||
800000 800000
|
||||
1500000 800000
|
||||
1848000 1000000
|
||||
>;
|
||||
};
|
||||
c910_3: cpu@3 {
|
||||
|
||||
operating-points = <
|
||||
/* kHz uV */
|
||||
300000 600000
|
||||
800000 700000
|
||||
1500000 800000
|
||||
1848000 1000000
|
||||
>;
|
||||
light,dvddm-operating-points = <
|
||||
/* kHz uV */
|
||||
300000 800000
|
||||
800000 800000
|
||||
1500000 800000
|
||||
1848000 1000000
|
||||
>;
|
||||
};
|
||||
};
|
||||
@@ -1,50 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2021 Alibaba Group Holding Limited.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "light-lpi4a.dts"
|
||||
|
||||
&lightsound {
|
||||
status = "okay";
|
||||
simple-audio-card,dai-link@0 { /* I2S - HDMI*/
|
||||
reg = <0>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
sound-dai = <&light_i2s 1>;
|
||||
};
|
||||
codec {
|
||||
sound-dai = <&dummy_codec>;
|
||||
};
|
||||
};
|
||||
simple-audio-card,dai-link@1 { /* I2S - AUDIO SYS CODEC 7210*/
|
||||
reg = <1>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
sound-dai = <&i2s1 0>;
|
||||
};
|
||||
codec {
|
||||
sound-dai = <&es7210_audio_codec>;
|
||||
};
|
||||
};
|
||||
simple-audio-card,dai-link@2 { /* I2S - AUDIO SYS CODEC 8156*/
|
||||
reg = <2>;
|
||||
format = "i2s";
|
||||
cpu {
|
||||
sound-dai = <&i2s1 0>;
|
||||
};
|
||||
codec {
|
||||
sound-dai = <&es8156_audio_codec>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&dpu_enc0 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&dsi0 {
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -1,60 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2022-2023 Alibaba Group Holding Limited.
|
||||
*/
|
||||
|
||||
#include "light-lpi4a-ref.dts"
|
||||
|
||||
/ {
|
||||
model = "T-HEAD Light Lichee Pi 4A configuration for 8GB DDR board";
|
||||
compatible = "thead,light-val", "thead,light-lpi4a", "thead,light";
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x0 0x200000 0x1 0xffe00000>;
|
||||
};
|
||||
};
|
||||
|
||||
&cmamem {
|
||||
size = <0 0x20000000>; // 512MB on lpi4a (SOM)
|
||||
alloc-ranges = <0 0xd8000000 0 0x20000000>; // [0x0D800_0000 ~ 0x0F800_0000]
|
||||
};
|
||||
|
||||
&i2c3 {
|
||||
touch@14 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "goodix,gt9271";
|
||||
reg = <0x14>;
|
||||
interrupt-parent = <&ao_gpio_porta>;
|
||||
interrupts = <3 0>;
|
||||
irq-gpios = <&ao_gpio_porta 3 0>;
|
||||
reset-gpios = <&pcal6408ahk_d 0 0>;
|
||||
AVDD28-supply = <®_tp_pwr_en>;
|
||||
touchscreen-size-x = <1200>;
|
||||
touchscreen-size-y = <1920>;
|
||||
tp-size = <9271>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&dsi0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
&dhost_0 {
|
||||
panel0@0 {
|
||||
compatible = "himax,hx8279";
|
||||
reg = <0>;
|
||||
backlight = <&lcd0_backlight>;
|
||||
reset-gpio = <&pcal6408ahk_d 7 0>; /* active low */
|
||||
hsvcc-supply = <&soc_vdd18_lcd0_en_reg>;
|
||||
vspn3v3-supply = <&soc_vdd33_lcd0_en_reg>;
|
||||
|
||||
port {
|
||||
panel0_in: endpoint {
|
||||
remote-endpoint = <&dsi0_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
20
arch/riscv/boot/dts/thead/light-lpi4a-laptop.dts
Normal file
20
arch/riscv/boot/dts/thead/light-lpi4a-laptop.dts
Normal file
@@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2023 Sipeed.
|
||||
*/
|
||||
|
||||
#include "light-lpi4a.dts"
|
||||
|
||||
/ {
|
||||
model = "T-HEAD Light Lichee Pi 4A configuration for 8GB DDR board use on laptop";
|
||||
|
||||
power-keys {
|
||||
compatible = "gpio-keys";
|
||||
key-lid {
|
||||
label = "lid status";
|
||||
linux,code = <KEY_DISPLAY_OFF>;
|
||||
debounce-interval = <1>;
|
||||
gpios = <&gpio1_porta 5 0x1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -158,14 +158,6 @@
|
||||
iopmp_dsp1: IOPMP_DSP1 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio0: IOPMP_AUDIO0 {
|
||||
is_default_region;
|
||||
};
|
||||
|
||||
iopmp_audio1: IOPMP_AUDIO1 {
|
||||
is_default_region;
|
||||
};
|
||||
};
|
||||
|
||||
mbox_910t_client1: mbox_910t_client1 {
|
||||
@@ -266,17 +258,15 @@
|
||||
ref-clock-frequency = <24000000>;
|
||||
keep_wifi_power_on;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_wifi_wake>;
|
||||
wifi_chip_type = "rtl8723ds";
|
||||
WIFI,poweren_gpio = <&pcal6408ahk_c 4 0>;
|
||||
WIFI,poweren_gpio = <&pcal6408ahk_c 5 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
wcn_bt: wireless-bluetooth {
|
||||
compatible = "bluetooth-platdata";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_bt_wake>;
|
||||
BT,power_gpio = <&pcal6408ahk_c 5 0>;
|
||||
pinctrl-names = "default", "rts_gpio";
|
||||
BT,power_gpio = <&pcal6408ahk_c 6 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -661,9 +651,9 @@
|
||||
no-map;
|
||||
};
|
||||
vi_mem: framebuffer@10000000 {
|
||||
reg = <0x0 0x10000000 0x0 0x6700000>; /* vi_mem_pool_region[0] 44 MB (default) */
|
||||
//0x0 0x12C00000 0x0 0x01D00000 /* vi_mem_pool_region[1] 29 MB */
|
||||
//0x0 0x14900000 0x0 0x01E00000>; /* vi_mem_pool_region[2] 30 MB */
|
||||
reg = <0x0 0x10000000 0x0 0x02C00000 /* vi_mem_pool_region[0] 44 MB (default) */
|
||||
0x0 0x12C00000 0x0 0x01D00000 /* vi_mem_pool_region[1] 29 MB */
|
||||
0x0 0x14900000 0x0 0x01E00000>; /* vi_mem_pool_region[2] 30 MB */
|
||||
no-map;
|
||||
};
|
||||
facelib_mem: memory@17000000 {
|
||||
@@ -769,9 +759,9 @@
|
||||
num-cs = <1>;
|
||||
cs-gpios = <&gpio2_porta 15 0>; // GPIO_ACTIVE_HIGH: 0
|
||||
rx-sample-delay-ns = <10>;
|
||||
status = "okay";
|
||||
|
||||
spi_norflash@0 {
|
||||
status = "okay";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "winbond,w25q64jwm", "jedec,spi-nor";
|
||||
@@ -781,7 +771,6 @@
|
||||
};
|
||||
|
||||
spidev@1 {
|
||||
status = "disable";
|
||||
compatible = "spidev";
|
||||
#address-cells = <0x1>;
|
||||
#size-cells = <0x1>;
|
||||
@@ -792,23 +781,6 @@
|
||||
|
||||
&uart0 {
|
||||
clock-frequency = <100000000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart0>;
|
||||
};
|
||||
|
||||
&uart1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart1>;
|
||||
};
|
||||
|
||||
&uart3 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart3>;
|
||||
};
|
||||
|
||||
&uart4 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uart4>;
|
||||
};
|
||||
|
||||
&qspi0 {
|
||||
@@ -855,8 +827,6 @@
|
||||
tx-clk-delay = <0x00>; /* for RGMII */
|
||||
phy-handle = <&phy_88E1111_0>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gmac0>;
|
||||
|
||||
mdio0 {
|
||||
#address-cells = <1>;
|
||||
@@ -879,8 +849,6 @@
|
||||
tx-clk-delay = <0x00>; /* for RGMII */
|
||||
phy-handle = <&phy_88E1111_1>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gmac1>;
|
||||
};
|
||||
|
||||
&emmc {
|
||||
@@ -902,8 +870,6 @@
|
||||
pull_up;
|
||||
wprtn_ignore;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sdio0>;
|
||||
};
|
||||
|
||||
&sdhci1 {
|
||||
@@ -930,22 +896,8 @@
|
||||
*/
|
||||
pinctrl_uart0: uart0grp {
|
||||
thead,pins = <
|
||||
FM_UART0_TXD 0x0 0x202
|
||||
FM_UART0_RXD 0x0 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c2: i2c2grp {
|
||||
thead,pins = <
|
||||
FM_I2C2_SCL 0x0 0x204
|
||||
FM_I2C2_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c3: i2c3grp {
|
||||
thead,pins = <
|
||||
FM_I2C3_SCL 0x0 0x204
|
||||
FM_I2C3_SDA 0x0 0x204
|
||||
FM_UART0_TXD 0x0 0x72
|
||||
FM_UART0_RXD 0x0 0x72
|
||||
>;
|
||||
};
|
||||
|
||||
@@ -982,62 +934,9 @@
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_gmac1: gmac1grp {
|
||||
thead,pins = <
|
||||
FM_GPIO2_18 0x1 0x20f /* GMAC1_TX_CLK */
|
||||
FM_GPIO2_19 0x1 0x20f /* GMAC1_RX_CLK */
|
||||
FM_GPIO2_20 0x1 0x20f /* GMAC1_TXEN */
|
||||
FM_GPIO2_21 0x1 0x20f /* GMAC1_TXD0 */
|
||||
FM_GPIO2_22 0x1 0x20f /* GMAC1_TXD1 */
|
||||
FM_GPIO2_23 0x1 0x20f /* GMAC1_TXD2 */
|
||||
FM_GPIO2_24 0x1 0x20f /* GMAC1_TXD3 */
|
||||
FM_GPIO2_25 0x1 0x20f /* GMAC1_RXDV */
|
||||
FM_GPIO2_30 0x1 0x20f /* GMAC1_RXD0 */
|
||||
FM_GPIO2_31 0x1 0x20f /* GMAC1_RXD1 */
|
||||
FM_GPIO3_0 0x1 0x20f /* GMAC1_RXD2 */
|
||||
FM_GPIO3_1 0x1 0x20f /* GMAC1_RXD3 */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_sdio0: sdio0grp {
|
||||
thead,pins = <
|
||||
FM_SDIO0_DETN 0x0 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_pwm: pwmgrp {
|
||||
thead,pins = <
|
||||
FM_GPIO3_2 0x1 0x20f /* pwm0 */
|
||||
FM_GPIO3_3 0x1 0x20f /* pwm1 */
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_hdmi: hdmigrp {
|
||||
thead,pins = <
|
||||
FM_HDMI_SCL 0x0 0x202
|
||||
FM_HDMI_SDA 0x0 0x202
|
||||
FM_HDMI_CEC 0x0 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_gmac0: gmac0grp {
|
||||
thead,pins = <
|
||||
FM_GMAC0_TX_CLK 0x0 0x20f /* GMAC0_TX_CLK */
|
||||
FM_GMAC0_RX_CLK 0x0 0x20f /* GMAC0_RX_CLK */
|
||||
FM_GMAC0_TXEN 0x0 0x20f /* GMAC0_TXEN */
|
||||
FM_GMAC0_TXD0 0x0 0x20f /* GMAC0_TXD0 */
|
||||
FM_GMAC0_TXD1 0x0 0x20f /* GMAC0_TXD1 */
|
||||
FM_GMAC0_TXD2 0x0 0x20f /* GMAC0_TXD2 */
|
||||
FM_GMAC0_TXD3 0x0 0x20f /* GMAC0_TXD3 */
|
||||
FM_GMAC0_RXDV 0x0 0x20f /* GMAC0_RXDV */
|
||||
FM_GMAC0_RXD0 0x0 0x20f /* GMAC0_RXD0 */
|
||||
FM_GMAC0_RXD1 0x0 0x20f /* GMAC0_RXD1 */
|
||||
FM_GMAC0_RXD2 0x0 0x20f /* GMAC0_RXD2 */
|
||||
FM_GMAC0_RXD3 0x0 0x20f /* GMAC0_RXD3 */
|
||||
FM_GMAC0_MDC 0x0 0x208 /* GMAC0_MDC */
|
||||
FM_GMAC0_MDIO 0x0 0x208 /* GMAC0_MDIO */
|
||||
FM_GMAC0_COL 0x3 0x232 /* PHY0_nRST */
|
||||
FM_GMAC0_CRS 0x3 0x232 /* PHY0_nINT */
|
||||
FM_GPIO3_2 0x1 0x208 /* pwm0 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
@@ -1049,6 +948,22 @@
|
||||
* Pin Configuration Node:
|
||||
* Format: <pin_id mux_node config>
|
||||
*/
|
||||
pinctrl_uart3: uart3grp {
|
||||
thead,pins = <
|
||||
FM_UART3_TXD 0x0 0x72
|
||||
FM_UART3_RXD 0x0 0x72
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart4: uart4grp {
|
||||
thead,pins = <
|
||||
FM_UART4_TXD 0x0 0x72
|
||||
FM_UART4_RXD 0x0 0x72
|
||||
FM_UART4_CTSN 0x0 0x72
|
||||
FM_UART4_RTSN 0x0 0x72
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_qspi1: qspi1grp {
|
||||
thead,pins = <
|
||||
FM_QSPI1_SCLK 0x0 0x20a
|
||||
@@ -1058,54 +973,6 @@
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c0: i2c0grp {
|
||||
thead,pins = <
|
||||
FM_I2C0_SCL 0x0 0x204
|
||||
FM_I2C0_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_i2c1: i2c1grp {
|
||||
thead,pins = <
|
||||
FM_I2C1_SCL 0x0 0x204
|
||||
FM_I2C1_SDA 0x0 0x204
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart1: uart1grp {
|
||||
thead,pins = <
|
||||
FM_UART1_TXD 0x0 0x202
|
||||
FM_UART1_RXD 0x0 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart4: uart4grp {
|
||||
thead,pins = <
|
||||
FM_UART4_TXD 0x0 0x202
|
||||
FM_UART4_RXD 0x0 0x202
|
||||
FM_UART4_CTSN 0x0 0x202
|
||||
FM_UART4_RTSN 0x0 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_uart3: uart3grp {
|
||||
thead,pins = <
|
||||
FM_UART3_TXD 0x1 0x202
|
||||
FM_UART3_RXD 0x1 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_wifi_wake: wifi_grp {
|
||||
thead,pins = <
|
||||
FM_GPIO0_27 0x0 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_bt_wake: bt_grp {
|
||||
thead,pins = <
|
||||
FM_GPIO0_28 0x0 0x202
|
||||
>;
|
||||
};
|
||||
|
||||
pinctrl_iso7816: iso7816grp {
|
||||
thead,pins = <
|
||||
@@ -1227,8 +1094,6 @@
|
||||
&i2c0 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c0>;
|
||||
|
||||
pcal6408ahk_b: gpio@20 {
|
||||
compatible = "nxp,pca9557";
|
||||
@@ -1241,8 +1106,6 @@
|
||||
&i2c1 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c1>;
|
||||
|
||||
pcal6408ahk_c: gpio@20 {
|
||||
compatible = "nxp,pca9557";
|
||||
@@ -1255,15 +1118,11 @@
|
||||
&i2c2 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c2>;
|
||||
};
|
||||
|
||||
&i2c3 {
|
||||
clock-frequency = <400000>;
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_i2c3>;
|
||||
|
||||
pcal6408ahk_d: gpio@20 {
|
||||
compatible = "nxp,pca9557";
|
||||
@@ -1416,6 +1275,13 @@
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <0>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <0>;
|
||||
path_type = "SENSOR_VGA_RAW12_LINER";
|
||||
};
|
||||
sensor1 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <3>;
|
||||
@@ -1440,52 +1306,21 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
channel1 {
|
||||
sensor1 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <3>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <1>;
|
||||
path_type = "SENSOR_2592x1944_LINER";
|
||||
};
|
||||
isp {
|
||||
subdev_name = "isp";
|
||||
idx = <1>;
|
||||
path_type = "ISP_MI_PATH_SP";
|
||||
output {
|
||||
max_width = <2600>;
|
||||
max_height = <2000>;
|
||||
bit_per_pixel = <12>;
|
||||
frame_count = <3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
channel2 {
|
||||
sensor1 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <3>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <1>;
|
||||
path_type = "SENSOR_2592x1944_LINER";
|
||||
};
|
||||
isp {
|
||||
subdev_name = "isp";
|
||||
idx = <1>;
|
||||
path_type = "ISP_MI_PATH_SP2_BP";
|
||||
output {
|
||||
max_width = <2600>;
|
||||
max_height = <2000>;
|
||||
bit_per_pixel = <12>;
|
||||
frame_count = <3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
&video3{
|
||||
vi_mem_pool_region = <0>; // vi_mem: framebuffer, region[0]
|
||||
status = "okay";
|
||||
channel0 {
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <0>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <0>;
|
||||
path_type = "SENSOR_VGA_RAW12_LINER";
|
||||
|
||||
};
|
||||
sensor1 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <3>;
|
||||
@@ -1504,8 +1339,8 @@
|
||||
idx = <1>;
|
||||
path_type = "ISP_MI_PATH_MP";
|
||||
output {
|
||||
max_width = <2600>;
|
||||
max_height = <2000>;
|
||||
max_width = <1920>;
|
||||
max_height = <1088>;
|
||||
bit_per_pixel = <12>;
|
||||
frame_count = <3>;
|
||||
};
|
||||
@@ -1518,12 +1353,13 @@
|
||||
};
|
||||
};
|
||||
channel1 {
|
||||
sensor1 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <3>;
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <0>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <1>;
|
||||
path_type = "SENSOR_2592x1944_LINER";
|
||||
mode_idx = <0>;
|
||||
path_type = "SENSOR_VGA_RAW12_LINER";
|
||||
|
||||
};
|
||||
dma {
|
||||
subdev_name = "vipre";
|
||||
@@ -1536,8 +1372,8 @@
|
||||
idx = <1>;
|
||||
path_type = "ISP_MI_PATH_MP";
|
||||
output {
|
||||
max_width = <2600>;
|
||||
max_height = <2000>;
|
||||
max_width = <1920>;
|
||||
max_height = <1088>;
|
||||
bit_per_pixel = <12>;
|
||||
frame_count = <3>;
|
||||
};
|
||||
@@ -1550,12 +1386,13 @@
|
||||
};
|
||||
};
|
||||
channel2 {
|
||||
sensor1 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <3>;
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <0>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <1>;
|
||||
path_type = "SENSOR_2592x1944_LINER";
|
||||
mode_idx = <0>;
|
||||
path_type = "SENSOR_VGA_RAW12_LINER";
|
||||
|
||||
};
|
||||
dma {
|
||||
subdev_name = "vipre";
|
||||
@@ -1568,8 +1405,8 @@
|
||||
idx = <1>;
|
||||
path_type = "ISP_MI_PATH_MP";
|
||||
output {
|
||||
max_width = <2600>;
|
||||
max_height = <2000>;
|
||||
max_width = <1920>;
|
||||
max_height = <1088>;
|
||||
bit_per_pixel = <12>;
|
||||
frame_count = <3>;
|
||||
};
|
||||
@@ -1583,6 +1420,70 @@
|
||||
};
|
||||
};
|
||||
|
||||
&video9{
|
||||
status = "okay";
|
||||
channel0 {
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <1>; //vivcam1 sc132gs
|
||||
csi_idx = <2>; //<2>=CSI2X2_A
|
||||
mode_idx = <0>;
|
||||
path_type = "SENSOR_1080X1280_30FPS_RAW10_LINER";
|
||||
};
|
||||
dsp{
|
||||
output {
|
||||
max_width = <1080>;
|
||||
max_height = <1280>;
|
||||
bit_per_pixel = <16>;
|
||||
frame_count = <3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
&video10{ // TUNINGTOOL
|
||||
status = "okay";
|
||||
channel0 {
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <0>; //<0>=vivcam0 : ov12870
|
||||
csi_idx = <0>; //<0>=CSI2
|
||||
mode_idx = <1>;
|
||||
path_type = "SENSOR_1080P_RAW10_LINER"; //SENSOR_VGA_RAW10_LINER//
|
||||
skip_init = <1>;
|
||||
};
|
||||
dma {
|
||||
path_type = "VIPRE_CSI0_ISP0";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&video15{
|
||||
status = "okay";
|
||||
channel0 {
|
||||
status = "okay";
|
||||
sensor0 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <0>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <0>;
|
||||
path_type = "SENSOR_VGA_RAW12_LINER";
|
||||
};
|
||||
sensor1 {
|
||||
subdev_name = "vivcam";
|
||||
idx = <3>;
|
||||
csi_idx = <0>;
|
||||
mode_idx = <1>;
|
||||
path_type = "SENSOR_2592x1944_LINER";
|
||||
};
|
||||
dma {
|
||||
subdev_name = "vipre";
|
||||
idx = <0>;
|
||||
path_type = "VIPRE_CSI0_DDR";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&trng {
|
||||
status = "disabled";
|
||||
@@ -1623,21 +1524,6 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&dpu_enc0 {
|
||||
status = "okay";
|
||||
|
||||
ports {
|
||||
/* output */
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
|
||||
enc0_out: endpoint {
|
||||
remote-endpoint = <&dsi0_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&dpu_enc1 {
|
||||
ports {
|
||||
/delete-node/ port@0;
|
||||
@@ -1648,37 +1534,12 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&dhost_0 {
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
|
||||
dsi0_in: endpoint {
|
||||
remote-endpoint = <&enc0_out>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
|
||||
dsi0_out: endpoint {
|
||||
remote-endpoint = <&panel0_in>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&disp1_out {
|
||||
remote-endpoint = <&hdmi_tx_in>;
|
||||
};
|
||||
|
||||
&hdmi_tx {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hdmi>;
|
||||
|
||||
port@0 {
|
||||
/* input */
|
||||
@@ -1732,13 +1593,13 @@
|
||||
|
||||
&i2s1 {
|
||||
status = "okay";
|
||||
dmas = <&dmac2 11>, <&dmac2 10>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_audiopa14>,
|
||||
<&pinctrl_audiopa15>,
|
||||
<&pinctrl_audiopa16>,
|
||||
<&pinctrl_audiopa17>,
|
||||
<&pinctrl_audio_i2s1>;
|
||||
light,mclk_keepon = <1>;
|
||||
};
|
||||
|
||||
&i2s2 {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include "light-lpi4a-hdmi.dts"
|
||||
#include "light-lpi4a.dts"
|
||||
|
||||
|
||||
&light_iopmp {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2022-2023 Alibaba Group Holding Limited.
|
||||
* Copyright (C) 2022 Alibaba Group Holding Limited.
|
||||
*/
|
||||
|
||||
#include "light-lpi4a-ref.dts"
|
||||
@@ -16,44 +16,5 @@
|
||||
};
|
||||
|
||||
&cmamem {
|
||||
size = <0 0x20000000>; // 512MB on lpi4a (SOM)
|
||||
alloc-ranges = <0 0xd8000000 0 0x20000000>; // [0x0D800_0000 ~ 0x0F800_0000]
|
||||
};
|
||||
|
||||
&i2c3 {
|
||||
touch@14 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "goodix,gt9271";
|
||||
reg = <0x14>;
|
||||
interrupt-parent = <&ao_gpio_porta>;
|
||||
interrupts = <3 0>;
|
||||
irq-gpios = <&ao_gpio_porta 3 0>;
|
||||
reset-gpios = <&pcal6408ahk_d 0 0>;
|
||||
AVDD28-supply = <®_tp_pwr_en>;
|
||||
touchscreen-size-x = <800>;
|
||||
touchscreen-size-y = <1200>;
|
||||
tp-size = <9271>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&dsi0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&dhost_0 {
|
||||
panel0@0 {
|
||||
compatible = "chongzhou,cz101b4001", "jadard,jd9365da-h3";
|
||||
reg = <0>;
|
||||
backlight = <&lcd0_backlight>;
|
||||
reset-gpio = <&pcal6408ahk_d 7 0>; /* active low */
|
||||
hsvcc-supply = <&soc_vdd18_lcd0_en_reg>;
|
||||
vspn3v3-supply = <&soc_vdd33_lcd0_en_reg>;
|
||||
|
||||
port {
|
||||
panel0_in: endpoint {
|
||||
remote-endpoint = <&dsi0_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
alloc-ranges = <0 0xe4000000 0 0x14000000>; // [0x0E400_0000 ~ 0x0F800_0000]
|
||||
};
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
&video0{
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -86,7 +86,7 @@
|
||||
};
|
||||
|
||||
&video1{
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 { // VSE0
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -183,7 +183,7 @@
|
||||
};
|
||||
|
||||
&video2 {
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -272,7 +272,7 @@
|
||||
};
|
||||
|
||||
&video3 {
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -370,7 +370,7 @@
|
||||
};
|
||||
|
||||
&video4 {
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -483,7 +483,7 @@
|
||||
};
|
||||
|
||||
&video5 {
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -612,7 +612,7 @@
|
||||
|
||||
|
||||
&video6 {
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -669,7 +669,7 @@
|
||||
|
||||
|
||||
&video7{
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -798,7 +798,7 @@
|
||||
|
||||
|
||||
&video8{
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -829,7 +829,7 @@
|
||||
|
||||
|
||||
&video9 { //IR debug
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -862,7 +862,7 @@
|
||||
|
||||
|
||||
&video10{ // TUNING TOOL
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 { // CSI2X2_B
|
||||
status = "okay";
|
||||
sensor0 {
|
||||
@@ -889,7 +889,7 @@
|
||||
|
||||
|
||||
&video11{
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 {
|
||||
channel_id = <0>;
|
||||
status = "okay";
|
||||
@@ -920,7 +920,7 @@
|
||||
|
||||
|
||||
&video12{ // TUNING TOOL
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
channel0 { // CSI2
|
||||
status = "okay";
|
||||
sensor0 {
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#include <dt-bindings/clock/light-dspsys.h>
|
||||
#include <dt-bindings/clock/light-audiosys.h>
|
||||
#include <dt-bindings/firmware/thead/rsrc.h>
|
||||
#include <dt-bindings/clock/light-miscsys.h>
|
||||
#include <dt-bindings/soc/thead,light-iopmp.h>
|
||||
#include <dt-bindings/thermal/thermal.h>
|
||||
#include <dt-bindings/reset/light-reset.h>
|
||||
@@ -186,7 +185,6 @@
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
|
||||
c910_1: cpu@1 {
|
||||
device_type = "cpu";
|
||||
reg = <1>;
|
||||
@@ -325,44 +323,6 @@
|
||||
interrupt-controller;
|
||||
};
|
||||
};
|
||||
|
||||
idle_states: idle-states {
|
||||
CPU_RET_0_0: cpu-retentive-0-0 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x10000000>;
|
||||
entry-latency-us = <20>;
|
||||
exit-latency-us = <40>;
|
||||
min-residency-us = <80>;
|
||||
};
|
||||
|
||||
CPU_NONRET_0_0: cpu-nonretentive-0-0 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x90000000>;
|
||||
entry-latency-us = <250>;
|
||||
exit-latency-us = <500>;
|
||||
min-residency-us = <950>;
|
||||
};
|
||||
|
||||
CLUSTER_RET_0: cluster-retentive-0 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x11000000>;
|
||||
local-timer-stop;
|
||||
entry-latency-us = <50>;
|
||||
exit-latency-us = <100>;
|
||||
min-residency-us = <250>;
|
||||
wakeup-latency-us = <130>;
|
||||
};
|
||||
|
||||
CLUSTER_NONRET_0: cluster-nonretentive-0 {
|
||||
compatible = "riscv,idle-state";
|
||||
riscv,sbi-suspend-param = <0x91000000>;
|
||||
local-timer-stop;
|
||||
entry-latency-us = <600>;
|
||||
exit-latency-us = <1100>;
|
||||
min-residency-us = <2700>;
|
||||
wakeup-latency-us = <1500>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
display-subsystem {
|
||||
@@ -671,18 +631,6 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
miscsys_reg: miscsys-reg@ffec02c000 {
|
||||
compatible = "thead,light-miscsys-reg", "syscon";
|
||||
reg = <0xff 0xec02c000 0x0 0x1000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
tee_miscsys_reg: tee_miscsys-reg@fffc02d000 {
|
||||
compatible = "thead,light-miscsys-reg", "syscon";
|
||||
reg = <0xff 0xfc02d000 0x0 0x1000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
audio_ioctrl: audio_ioctrl@ffcb01d000 {
|
||||
compatible = "thead,light-audio-ioctrl-reg", "syscon";
|
||||
reg = <0xff 0xcb01d000 0x0 0x1000>;
|
||||
@@ -707,8 +655,6 @@
|
||||
thead,teesys = <&teesys_syscon>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
clocks = <&miscsys_clk_gate CLKGEN_MISCSYS_EFUSE_PCLK>;
|
||||
clock-names = "pclk";
|
||||
|
||||
gmac0_mac_address: mac-address@176 {
|
||||
reg = <0xb0 6>;
|
||||
@@ -736,9 +682,7 @@
|
||||
reg = <0xff 0xec005000 0x0 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&clk CLKGEN_GPIO0_PCLK>,
|
||||
<&clk CLKGEN_GPIO0_DBCLK>;
|
||||
clock-names = "bus", "db";
|
||||
|
||||
gpio0_porta: gpio0-controller@0 {
|
||||
compatible = "snps,dw-apb-gpio-port";
|
||||
gpio-controller;
|
||||
@@ -758,9 +702,7 @@
|
||||
reg = <0xff 0xec006000 0x0 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&clk CLKGEN_GPIO1_PCLK>,
|
||||
<&clk CLKGEN_GPIO1_DBCLK>;
|
||||
clock-names = "bus", "db";
|
||||
|
||||
gpio1_porta: gpio1-controller@0 {
|
||||
compatible = "snps,dw-apb-gpio-port";
|
||||
gpio-controller;
|
||||
@@ -780,9 +722,7 @@
|
||||
reg = <0xff 0xe7f34000 0x0 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&clk CLKGEN_GPIO2_PCLK>,
|
||||
<&clk CLKGEN_GPIO2_DBCLK>;
|
||||
clock-names = "bus", "db";
|
||||
|
||||
gpio2_porta: gpio2-controller@0 {
|
||||
compatible = "snps,dw-apb-gpio-port";
|
||||
gpio-controller;
|
||||
@@ -802,9 +742,7 @@
|
||||
reg = <0xff 0xe7f38000 0x0 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&clk CLKGEN_GPIO3_PCLK>,
|
||||
<&clk CLKGEN_GPIO3_DBCLK>;
|
||||
clock-names = "bus", "db";
|
||||
|
||||
gpio3_porta: gpio3-controller@0 {
|
||||
compatible = "snps,dw-apb-gpio-port";
|
||||
gpio-controller;
|
||||
@@ -859,19 +797,15 @@
|
||||
};
|
||||
};
|
||||
|
||||
padctrl1_apsys: padctrl1-apsys@ffe7f3c000 {
|
||||
padctrl1_apsys: pinctrl1-apsys@ffe7f3c000 {
|
||||
compatible = "thead,light-fm-left-pinctrl";
|
||||
reg = <0xff 0xe7f3c000 0x0 0x1000>;
|
||||
clocks = <&clk CLKGEN_PADCTRL1_APSYS_PCLK>;
|
||||
clock-names = "pclk";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
padctrl0_apsys: padctrl0-apsys@ffec007000 {
|
||||
compatible = "thead,light-fm-right-pinctrl";
|
||||
reg = <0xff 0xec007000 0x0 0x1000>;
|
||||
clocks = <&clk CLKGEN_PADCTRL0_APSYS_PCLK>;
|
||||
clock-names = "pclk";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -987,7 +921,7 @@
|
||||
};
|
||||
|
||||
uart0: serial@ffe7014000 { /* Normal serial, for C910 log */
|
||||
compatible = "snps,dw-apb-uart", "light,uart0";
|
||||
compatible = "snps,dw-apb-uart";
|
||||
reg = <0xff 0xe7014000 0x0 0x4000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <36>;
|
||||
@@ -1082,9 +1016,7 @@
|
||||
pinctrl-0 = <&pinctrl_spi0>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <54>;
|
||||
clocks = <&clk CLKGEN_SPI_SSI_CLK>,
|
||||
<&clk CLKGEN_SPI_PCLK>;
|
||||
clock-names = "sclk", "pclk";
|
||||
clocks = <&dummy_clock_spi>;
|
||||
num-cs = <2>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
@@ -1097,9 +1029,7 @@
|
||||
pinctrl-0 = <&pinctrl_qspi0>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <52>;
|
||||
clocks = <&clk CLKGEN_QSPI0_SSI_CLK>,
|
||||
<&clk CLKGEN_QSPI0_PCLK>;
|
||||
clock-names = "sclk", "pclk";
|
||||
clocks = <&dummy_clock_qspi>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
@@ -1111,9 +1041,7 @@
|
||||
pinctrl-0 = <&pinctrl_qspi1>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <53>;
|
||||
clocks = <&clk CLKGEN_QSPI1_SSI_CLK>,
|
||||
<&clk CLKGEN_QSPI1_PCLK>;
|
||||
clock-names = "sclk", "pclk";
|
||||
clocks = <&dummy_clock_spi>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
@@ -1211,8 +1139,9 @@
|
||||
clocks = <&vosys_clk_gate LIGHT_CLKGEN_HDMI_PCLK>,
|
||||
<&vosys_clk_gate LIGHT_CLKGEN_HDMI_SFR_CLK>,
|
||||
<&vosys_clk_gate LIGHT_CLKGEN_HDMI_CEC_CLK>,
|
||||
<&vosys_clk_gate LIGHT_CLKGEN_HDMI_PIXCLK>;
|
||||
clock-names = "iahb", "isfr", "cec", "pixclk";
|
||||
<&vosys_clk_gate LIGHT_CLKGEN_HDMI_PIXCLK>,
|
||||
<&vosys_clk_gate LIGHT_CLKGEN_HDMI_I2S_CLK>;
|
||||
clock-names = "iahb", "isfr", "cec", "pixclk", "i2s";
|
||||
reg-io-width = <4>;
|
||||
phy_version = <301>;
|
||||
/* TODO: add phy property */
|
||||
@@ -1228,7 +1157,6 @@
|
||||
<0xff 0xef630010 0x0 0x60>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <93>;
|
||||
vosys-regmap = <&vosys_reg>;
|
||||
clocks = <&vosys_clk_gate LIGHT_CLKGEN_DPU_CCLK>,
|
||||
<&vosys_clk_gate LIGHT_CLKGEN_DPU_PIXCLK0>,
|
||||
<&vosys_clk_gate LIGHT_CLKGEN_DPU_PIXCLK1>,
|
||||
@@ -1290,7 +1218,6 @@
|
||||
interrupts = <74>;
|
||||
clocks = <&dummy_clock_rtc>;
|
||||
clock-names = "rtc";
|
||||
wakeup-source;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -1298,11 +1225,6 @@
|
||||
compatible = "thead,dwc3";
|
||||
usb3-misc-regmap = <&misc_sysreg>;
|
||||
usb3-drd-regmap = <&usb3_drd>;
|
||||
clocks = <&miscsys_clk_gate CLKGEN_MISCSYS_USB3_DRD_CLK>,
|
||||
<&miscsys_clk_gate CLKGEN_MISCSYS_USB3_DRD_CTRL_REF_CLK>,
|
||||
<&miscsys_clk_gate CLKGEN_MISCSYS_USB3_DRD_PHY_REF_CLK>,
|
||||
<&miscsys_clk_gate CLKGEN_MISCSYS_USB3_DRD_SUSPEND_CLK>;
|
||||
clock-names = "drd", "ctrl", "phy", "suspend";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
@@ -1312,6 +1234,8 @@
|
||||
reg = <0xff 0xe7040000 0x0 0x10000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <68>;
|
||||
clocks = <&dummy_clock_ref>, <&dummy_clock_apb>, <&dummy_clock_suspend>;
|
||||
clock-names = "ref", "bus_early", "suspend";
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
maximum-speed = "super-speed";
|
||||
@@ -1363,7 +1287,7 @@
|
||||
reg = <0xff 0xefc00000 0x0 0x1000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <27>;
|
||||
clocks = <&clk CLKGEN_DMAC_CPUSYS_ACLK>, <&clk CLKGEN_DMAC_CPUSYS_HCLK>;
|
||||
clocks = <&dummy_clock_apb>, <&dummy_clock_apb>;
|
||||
clock-names = "core-clk", "cfgr-clk";
|
||||
#dma-cells = <1>;
|
||||
dma-channels = <4>;
|
||||
@@ -1380,7 +1304,7 @@
|
||||
reg = <0xff 0xff340000 0x0 0x1000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <150>;
|
||||
clocks = <&clk CLKGEN_DMAC_CPUSYS_ACLK>, <&clk CLKGEN_DMAC_CPUSYS_HCLK>;
|
||||
clocks = <&dummy_clock_apb>, <&dummy_clock_apb>;
|
||||
clock-names = "core-clk", "cfgr-clk";
|
||||
#dma-cells = <1>;
|
||||
dma-channels = <4>;
|
||||
@@ -1397,7 +1321,7 @@
|
||||
reg = <0xff 0xc8000000 0x0 0x2000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <167>;
|
||||
clocks = <&clk CLKGEN_DMAC_CPUSYS_ACLK>, <&clk CLKGEN_DMAC_CPUSYS_HCLK>;
|
||||
clocks = <&dummy_clock_apb>, <&dummy_clock_apb>;
|
||||
clock-names = "core-clk", "cfgr-clk";
|
||||
#dma-cells = <1>;
|
||||
dma-channels = <16>;
|
||||
@@ -1428,11 +1352,8 @@
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <66>;
|
||||
interrupt-names = "macirq";
|
||||
clocks = <&clk CLKGEN_GMAC0_CCLK>,
|
||||
<&clk CLKGEN_GMAC0_PCLK>,
|
||||
<&clk CLKGEN_GMAC_AXI_ACLK>,
|
||||
<&clk CLKGEN_GMAC_AXI_PCLK>;
|
||||
clock-names = "gmac_pll_clk","pclk","axi_aclk","axi_pclk";
|
||||
clocks = <&clk CLKGEN_GMAC0_CCLK>;
|
||||
clock-names = "gmac_pll_clk";
|
||||
snps,pbl = <32>;
|
||||
snps,fixed-burst;
|
||||
snps,axi-config = <&stmmac_axi_setup>;
|
||||
@@ -1450,11 +1371,8 @@
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <67>;
|
||||
interrupt-names = "macirq";
|
||||
clocks = <&clk CLKGEN_GMAC1_CCLK>,
|
||||
<&clk CLKGEN_GMAC1_PCLK>,
|
||||
<&clk CLKGEN_GMAC_AXI_ACLK>,
|
||||
<&clk CLKGEN_GMAC_AXI_PCLK>;
|
||||
clock-names = "gmac_pll_clk","pclk","axi_aclk","axi_pclk";
|
||||
clocks = <&clk CLKGEN_GMAC1_CCLK>;
|
||||
clock-names = "gmac_pll_clk";
|
||||
snps,pbl = <32>;
|
||||
snps,fixed-burst;
|
||||
snps,axi-config = <&stmmac_axi_setup>;
|
||||
@@ -1468,9 +1386,8 @@
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <62>;
|
||||
interrupt-names = "sdhciirq";
|
||||
clocks = <&clk CLKGEN_EMMC_SDIO_REF_CLK>,
|
||||
<&miscsys_clk_gate CLKGEN_MISCSYS_EMMC_CLK>;
|
||||
clock-names = "core", "bus";
|
||||
clocks = <&dummy_clock_sdhci>;
|
||||
clock-names = "core";
|
||||
};
|
||||
|
||||
sdhci0: sd@ffe7090000 {
|
||||
@@ -1479,20 +1396,18 @@
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <64>;
|
||||
interrupt-names = "sdhci0irq";
|
||||
clocks = <&clk CLKGEN_EMMC_SDIO_REF_CLK>,
|
||||
<&miscsys_clk_gate CLKGEN_MISCSYS_EMMC_CLK>;
|
||||
clock-names = "core", "bus";
|
||||
clocks = <&dummy_clock_sdhci>;
|
||||
clock-names = "core";
|
||||
};
|
||||
|
||||
sdhci1: sd@ffe70a0000 {
|
||||
compatible = "snps,dwcmshc-sdhci";
|
||||
reg = <0xff 0xe70a0000 0x0 0x10000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <71>;
|
||||
interrupt-names = "sdhci1irq";
|
||||
clocks = <&clk CLKGEN_EMMC_SDIO_REF_CLK>,
|
||||
<&miscsys_clk_gate CLKGEN_MISCSYS_EMMC_CLK>;
|
||||
clock-names = "core", "bus";
|
||||
compatible = "snps,dwcmshc-sdhci";
|
||||
reg = <0xff 0xe70a0000 0x0 0x10000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <71>;
|
||||
interrupt-names = "sdhci1irq";
|
||||
clocks = <&dummy_clock_sdhci>;
|
||||
clock-names = "core";
|
||||
};
|
||||
|
||||
hwspinlock: hwspinlock@ffefc10000 {
|
||||
@@ -1592,6 +1507,8 @@
|
||||
#sound-dai-cells = <1>;
|
||||
compatible = "light,light-i2s";
|
||||
reg = <0xff 0xe7034000 0x0 0x4000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_light_i2s0>;
|
||||
light,mode = "i2s-master";
|
||||
light,sel = "ap_i2s";
|
||||
interrupt-parent = <&intc>;
|
||||
@@ -1600,7 +1517,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
light,dma_maxburst = <4>;
|
||||
#dma-cells = <1>;
|
||||
clocks = <&vosys_clk_gate LIGHT_CLKGEN_HDMI_I2S_CLK>;
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-names = "pclk";
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -1620,7 +1537,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
light,dma_maxburst = <4>;
|
||||
#dma-cells = <1>;
|
||||
clocks = <&audiosys_clk_gate LIGHT_CLKGEN_AUDIO_I2S0>;
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-names = "pclk";
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -1636,11 +1553,11 @@
|
||||
light,sel = "i2s1";
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <175>;
|
||||
dmas = <&dmac2 11>, <&dmac2 10>;
|
||||
dmas = <&dmac2 11>, <&dmac2 17>;
|
||||
dma-names = "tx", "rx";
|
||||
light,dma_maxburst = <4>;
|
||||
#dma-cells = <1>;
|
||||
clocks = <&audiosys_clk_gate LIGHT_CLKGEN_AUDIO_I2S1>;
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-names = "pclk";
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -1660,7 +1577,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
light,dma_maxburst = <4>;
|
||||
#dma-cells = <1>;
|
||||
clocks = <&audiosys_clk_gate LIGHT_CLKGEN_AUDIO_I2S2>;
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-names = "pclk";
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -1679,7 +1596,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
light,dma_maxburst = <4>;
|
||||
#dma-cells = <1>;
|
||||
clocks = <&audiosys_clk_gate LIGHT_CLKGEN_AUDIO_I2S8CH>;
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-names = "pclk";
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -1698,7 +1615,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
light,dma_maxburst = <4>;
|
||||
#dma-cells = <1>;
|
||||
clocks = <&audiosys_clk_gate LIGHT_CLKGEN_AUDIO_I2S8CH>;
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-names = "pclk";
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -1717,7 +1634,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
light,dma_maxburst = <4>;
|
||||
#dma-cells = <1>;
|
||||
clocks = <&audiosys_clk_gate LIGHT_CLKGEN_AUDIO_I2S8CH>;
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-names = "pclk";
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -1736,7 +1653,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
light,dma_maxburst = <4>;
|
||||
#dma-cells = <1>;
|
||||
clocks = <&audiosys_clk_gate LIGHT_CLKGEN_AUDIO_I2S8CH>;
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-names = "pclk";
|
||||
status = "disabled";
|
||||
};
|
||||
@@ -1924,7 +1841,6 @@
|
||||
#dma-cells = <1>;
|
||||
clocks = <&audiosys_clk_gate LIGHT_CLKGEN_AUDIO_SPDIF0>;
|
||||
clock-names = "pclk";
|
||||
id = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -1943,7 +1859,6 @@
|
||||
#dma-cells = <1>;
|
||||
clocks = <&audiosys_clk_gate LIGHT_CLKGEN_AUDIO_SPDIF1>;
|
||||
clock-names = "pclk";
|
||||
id = <1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -1964,8 +1879,7 @@
|
||||
reg = <0xff 0xe7f20000 0x0 0x4000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <44>;
|
||||
clocks = <&clk CLKGEN_I2C0_PCLK>;
|
||||
clock-names = "pclk";
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-frequency = <100000>;
|
||||
i2c_mode = "dma";
|
||||
dmas = <&dmac0 12>, <&dmac0 13>;
|
||||
@@ -1988,8 +1902,7 @@
|
||||
reg = <0xff 0xe7f24000 0x0 0x4000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <45>;
|
||||
clocks = <&clk CLKGEN_I2C1_PCLK>;
|
||||
clock-names = "pclk";
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-frequency = <100000>;
|
||||
i2c_mode = "dma";
|
||||
dmas = <&dmac0 14>, <&dmac0 15>;
|
||||
@@ -2012,8 +1925,7 @@
|
||||
reg = <0xff 0xec00c000 0x0 0x4000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <46>;
|
||||
clocks = <&clk CLKGEN_I2C2_PCLK>;
|
||||
clock-names = "pclk";
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-frequency = <100000>;
|
||||
i2c_mode = "dma";
|
||||
dmas = <&dmac0 16>, <&dmac0 17>;
|
||||
@@ -2038,8 +1950,7 @@
|
||||
reg = <0xff 0xec014000 0x0 0x4000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <47>;
|
||||
clocks = <&clk CLKGEN_I2C3_PCLK>;
|
||||
clock-names = "pclk";
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-frequency = <100000>;
|
||||
i2c_mode = "dma";
|
||||
dmas = <&dmac0 18>, <&dmac0 19>;
|
||||
@@ -2064,8 +1975,7 @@
|
||||
reg = <0xff 0xe7f28000 0x0 0x4000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <48>;
|
||||
clocks = <&clk CLKGEN_I2C4_PCLK>;
|
||||
clock-names = "pclk";
|
||||
clocks = <&dummy_clock_apb>;
|
||||
clock-frequency = <100000>;
|
||||
i2c_mode = "dma";
|
||||
dmas = <&dmac0 20>, <&dmac0 21>;
|
||||
@@ -2556,11 +2466,7 @@
|
||||
reg = <0xff 0xff300000 0x0 0x40000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <144>,<145>,<146>,<147>;
|
||||
clocks = <&miscsys_clk_gate CLKGEN_MISCSYS_EIP120SI_CLK>,
|
||||
<&miscsys_clk_gate CLKGEN_MISCSYS_EIP120SII_CLK>,
|
||||
<&miscsys_clk_gate CLKGEN_MISCSYS_EIP120SIII_CLK>,
|
||||
<&miscsys_clk_gate CLKGEN_MISCSYS_EIP150B_HCLK>;
|
||||
clock-names = "120si_clk","120sii_clk","120siii_clk","hclk";
|
||||
clocks = <&dummy_clock_eip>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -2576,11 +2482,6 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
aon_suspend_ctrl: aon_suspend_ctrl {
|
||||
compatible = "thead,light-aon-suspend-ctrl";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
visys_clk_gate: visys-clk-gate { /* VI_SYSREG_R */
|
||||
compatible = "thead,visys-gate-controller";
|
||||
visys-regmap = <&visys_reg>;
|
||||
@@ -2615,15 +2516,6 @@
|
||||
#clock-cells = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
miscsys_clk_gate: miscsys-clk-gate {
|
||||
compatible = "thead,miscsys-gate-controller";
|
||||
miscsys-regmap = <&miscsys_reg>;
|
||||
tee-miscsys-regmap = <&tee_miscsys_reg>;
|
||||
#clock-cells = <1>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
@@ -17,12 +17,6 @@ CONFIG_PERF_EVENTS=y
|
||||
CONFIG_SOC_THEAD=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_VECTOR=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_VIRTUALIZATION=y
|
||||
CONFIG_KVM=m
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
|
||||
@@ -3,10 +3,6 @@ CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_TASKSTATS=y
|
||||
CONFIG_TASK_DELAY_ACCT=y
|
||||
CONFIG_TASK_XACCT=y
|
||||
CONFIG_TASK_IO_ACCOUNTING=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_CGROUPS=y
|
||||
@@ -110,7 +106,6 @@ CONFIG_KEYBOARD_GPIO=y
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
CONFIG_TOUCHSCREEN_GOODIX=y
|
||||
CONFIG_TOUCHSCREEN_GT9XX=y
|
||||
CONFIG_INPUT_MISC=y
|
||||
CONFIG_INPUT_UINPUT=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
@@ -205,8 +200,6 @@ CONFIG_DRM_PANEL_SIMPLE=y
|
||||
CONFIG_DRM_PANEL_ILITEK_ILI9881C=y
|
||||
CONFIG_DRM_PANEL_ILI9881D=y
|
||||
CONFIG_DRM_PANEL_HX8394=y
|
||||
CONFIG_DRM_PANEL_JADARD_JD9365DA_H3=y
|
||||
CONFIG_DRM_PANEL_HX8279=y
|
||||
CONFIG_DRM_VERISILICON=y
|
||||
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
||||
CONFIG_BACKLIGHT_PWM=y
|
||||
@@ -341,15 +334,6 @@ CONFIG_OVERLAY_FS=y
|
||||
CONFIG_LOCKUP_DETECTOR=y
|
||||
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
|
||||
CONFIG_SCHED_INFO=y
|
||||
CONFIG_PM=y
|
||||
# CONFIG_SUSPEND is not set
|
||||
# CONFIG_PM_SLEEP is not set
|
||||
CONFIG_PM_DEVFREQ=y
|
||||
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
|
||||
CONFIG_DEVFREQ_GOV_PERFORMANCE=y
|
||||
CONFIG_DEVFREQ_GOV_POWERSAVE=y
|
||||
CONFIG_DEVFREQ_GOV_USERSPACE=y
|
||||
CONFIG_DEVFREQ_GOV_PASSIVE=y
|
||||
CONFIG_PM_DEVFREQ_EVENT=y
|
||||
|
||||
|
||||
454
arch/riscv/configs/revyos_defconfig
Normal file
454
arch/riscv/configs/revyos_defconfig
Normal file
@@ -0,0 +1,454 @@
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_TASKSTATS=y
|
||||
CONFIG_TASK_DELAY_ACCT=y
|
||||
CONFIG_TASK_XACCT=y
|
||||
CONFIG_TASK_IO_ACCOUNTING=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_MEMCG=y
|
||||
CONFIG_BLK_CGROUP=y
|
||||
CONFIG_CGROUP_SCHED=y
|
||||
CONFIG_CFS_BANDWIDTH=y
|
||||
CONFIG_RT_GROUP_SCHED=y
|
||||
CONFIG_CGROUP_PIDS=y
|
||||
CONFIG_CGROUP_FREEZER=y
|
||||
CONFIG_CGROUP_HUGETLB=y
|
||||
CONFIG_CPUSETS=y
|
||||
CONFIG_CGROUP_DEVICE=y
|
||||
CONFIG_CGROUP_CPUACCT=y
|
||||
CONFIG_CGROUP_PERF=y
|
||||
CONFIG_CGROUP_BPF=y
|
||||
CONFIG_NAMESPACES=y
|
||||
CONFIG_USER_NS=y
|
||||
CONFIG_CHECKPOINT_RESTORE=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EXPERT=y
|
||||
# CONFIG_BUG is not set
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_PERF_EVENTS=y
|
||||
CONFIG_FORCE_MAX_ZONEORDER=15
|
||||
CONFIG_SOC_SIFIVE=y
|
||||
CONFIG_SOC_THEAD=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_VECTOR=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_CPU_IDLE_GOV_LADDER=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_STAT=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
|
||||
CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
|
||||
CONFIG_CPUFREQ_DT=y
|
||||
CONFIG_RISV_THEAD_LIGHT_CPUFREQ=y
|
||||
# CONFIG_SUSPEND is not set
|
||||
CONFIG_PM=y
|
||||
CONFIG_VIRTUALIZATION=y
|
||||
CONFIG_KVM=y
|
||||
CONFIG_LIGHT_AON_PD=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_BLK_DEV_THROTTLING=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_CMA=y
|
||||
CONFIG_CMA_DEBUGFS=y
|
||||
CONFIG_CMA_AREAS=16
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM_USER=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_IP_PNP_RARP=y
|
||||
CONFIG_NET_IPVTI=y
|
||||
CONFIG_INET_ESP=y
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_BRIDGE_NETFILTER=y
|
||||
CONFIG_NF_CONNTRACK=y
|
||||
CONFIG_NF_CONNTRACK_FTP=y
|
||||
CONFIG_NF_CONNTRACK_TFTP=y
|
||||
CONFIG_NETFILTER_XT_CONNMARK=y
|
||||
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
|
||||
CONFIG_NETFILTER_XT_MATCH_IPVS=y
|
||||
CONFIG_NETFILTER_XT_MATCH_MARK=y
|
||||
CONFIG_TCP_CONG_ADVANCED=y
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_TCP_CONG_WESTWOOD=m
|
||||
CONFIG_TCP_CONG_BBR=m
|
||||
CONFIG_IP_VS=y
|
||||
CONFIG_IP_VS_PROTO_TCP=y
|
||||
CONFIG_IP_VS_PROTO_UDP=y
|
||||
CONFIG_IP_VS_RR=y
|
||||
CONFIG_IP_VS_NFCT=y
|
||||
CONFIG_IP_NF_IPTABLES=y
|
||||
CONFIG_IP_NF_FILTER=y
|
||||
CONFIG_IP_NF_NAT=y
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=y
|
||||
CONFIG_IP_NF_TARGET_REDIRECT=y
|
||||
CONFIG_IP6_NF_IPTABLES=y
|
||||
CONFIG_IP6_NF_NAT=y
|
||||
CONFIG_BRIDGE=y
|
||||
CONFIG_BRIDGE_VLAN_FILTERING=y
|
||||
CONFIG_VLAN_8021Q=y
|
||||
CONFIG_NET_SCHED=y
|
||||
CONFIG_NET_CLS_CGROUP=y
|
||||
CONFIG_VSOCKETS=y
|
||||
# CONFIG_VSOCKETS_LOOPBACK is not set
|
||||
CONFIG_VIRTIO_VSOCKETS=y
|
||||
CONFIG_NETLINK_DIAG=y
|
||||
CONFIG_CGROUP_NET_PRIO=y
|
||||
CONFIG_BT=y
|
||||
CONFIG_BT_RFCOMM=y
|
||||
CONFIG_BT_RFCOMM_TTY=y
|
||||
CONFIG_BT_BNEP=y
|
||||
CONFIG_BT_HIDP=y
|
||||
CONFIG_BT_HCIUART=y
|
||||
CONFIG_BT_HCIUART_H4=y
|
||||
CONFIG_BT_HCIUART_RTL3WIRE=y
|
||||
CONFIG_CFG80211=y
|
||||
CONFIG_RFKILL=y
|
||||
CONFIG_NET_9P=y
|
||||
CONFIG_NET_9P_VIRTIO=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_TESTS=m
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_SLRAM=m
|
||||
CONFIG_MTD_PHRAM=m
|
||||
CONFIG_MTD_SPI_NAND=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_VIRTIO_BLK=y
|
||||
CONFIG_LIGHT_DSMART_CARD=y
|
||||
CONFIG_EEPROM_AT24=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_DM=y
|
||||
CONFIG_DM_THIN_PROVISIONING=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=y
|
||||
CONFIG_MACVLAN=y
|
||||
CONFIG_IPVLAN=y
|
||||
CONFIG_VXLAN=y
|
||||
CONFIG_TUN=y
|
||||
CONFIG_VETH=y
|
||||
CONFIG_VIRTIO_NET=y
|
||||
CONFIG_MACB=y
|
||||
CONFIG_STMMAC_ETH=y
|
||||
CONFIG_STMMAC_RX_ZERO_COPY=y
|
||||
CONFIG_DWMAC_LIGHT=y
|
||||
CONFIG_MICROSEMI_PHY=y
|
||||
CONFIG_REALTEK_PHY=y
|
||||
CONFIG_USB_USBNET=m
|
||||
# CONFIG_USB_NET_AX8817X is not set
|
||||
# CONFIG_USB_NET_AX88179_178A is not set
|
||||
# CONFIG_USB_NET_NET1080 is not set
|
||||
CONFIG_RTL8723DS=y
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
CONFIG_KEYBOARD_GPIO=y
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
CONFIG_TOUCHSCREEN_GOODIX=y
|
||||
CONFIG_INPUT_MISC=y
|
||||
CONFIG_INPUT_UINPUT=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=6
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=6
|
||||
CONFIG_SERIAL_8250_DW=y
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SERIAL_EARLYCON_RISCV_SBI=y
|
||||
CONFIG_VIRTIO_CONSOLE=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_HW_RANDOM_VIRTIO=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_DESIGNWARE_PLATFORM=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_DW_QUAD=y
|
||||
CONFIG_SPI_DESIGNWARE=y
|
||||
CONFIG_SPI_DW_MMIO=y
|
||||
CONFIG_SPI_SPIDEV=y
|
||||
# CONFIG_PTP_1588_CLOCK is not set
|
||||
CONFIG_PINCTRL=y
|
||||
CONFIG_GPIOLIB=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_GPIO_DWAPB=y
|
||||
CONFIG_GPIO_PCA953X=y
|
||||
CONFIG_GPIO_PCA953X_IRQ=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_SENSORS_MR75203=y
|
||||
CONFIG_SENSORS_PWM_FAN=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_CPU_THERMAL=y
|
||||
CONFIG_THERMAL_EMULATION=y
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_WATCHDOG_OPEN_TIMEOUT=32
|
||||
CONFIG_WATCHDOG_PRETIMEOUT_GOV=y
|
||||
CONFIG_WATCHDOG_PRETIMEOUT_DEFAULT_GOV_NOOP=y
|
||||
CONFIG_DW_WATCHDOG=y
|
||||
CONFIG_LIGHT_PMIC_WATCHDOG=y
|
||||
CONFIG_ABX500_CORE=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_MEDIA_SUPPORT=y
|
||||
# CONFIG_MEDIA_ANALOG_TV_SUPPORT is not set
|
||||
# CONFIG_MEDIA_DIGITAL_TV_SUPPORT is not set
|
||||
CONFIG_MEDIA_USB_SUPPORT=y
|
||||
CONFIG_USB_VIDEO_CLASS=m
|
||||
CONFIG_V4L_PLATFORM_DRIVERS=y
|
||||
CONFIG_VIDEO_ASPEED=y
|
||||
CONFIG_V4L_MEM2MEM_DRIVERS=y
|
||||
# CONFIG_MEDIA_TUNER_SIMPLE is not set
|
||||
# CONFIG_MEDIA_TUNER_TDA18250 is not set
|
||||
# CONFIG_MEDIA_TUNER_TDA8290 is not set
|
||||
# CONFIG_MEDIA_TUNER_TDA827X is not set
|
||||
# CONFIG_MEDIA_TUNER_TDA18271 is not set
|
||||
# CONFIG_MEDIA_TUNER_TDA9887 is not set
|
||||
# CONFIG_MEDIA_TUNER_TEA5761 is not set
|
||||
# CONFIG_MEDIA_TUNER_TEA5767 is not set
|
||||
# CONFIG_MEDIA_TUNER_MSI001 is not set
|
||||
# CONFIG_MEDIA_TUNER_MT20XX is not set
|
||||
# CONFIG_MEDIA_TUNER_MT2060 is not set
|
||||
# CONFIG_MEDIA_TUNER_MT2063 is not set
|
||||
# CONFIG_MEDIA_TUNER_MT2266 is not set
|
||||
# CONFIG_MEDIA_TUNER_MT2131 is not set
|
||||
# CONFIG_MEDIA_TUNER_QT1010 is not set
|
||||
# CONFIG_MEDIA_TUNER_XC2028 is not set
|
||||
# CONFIG_MEDIA_TUNER_XC5000 is not set
|
||||
# CONFIG_MEDIA_TUNER_XC4000 is not set
|
||||
# CONFIG_MEDIA_TUNER_MXL5005S is not set
|
||||
# CONFIG_MEDIA_TUNER_MXL5007T is not set
|
||||
# CONFIG_MEDIA_TUNER_MC44S803 is not set
|
||||
# CONFIG_MEDIA_TUNER_MAX2165 is not set
|
||||
# CONFIG_MEDIA_TUNER_TDA18218 is not set
|
||||
# CONFIG_MEDIA_TUNER_FC0011 is not set
|
||||
# CONFIG_MEDIA_TUNER_FC0012 is not set
|
||||
# CONFIG_MEDIA_TUNER_FC0013 is not set
|
||||
# CONFIG_MEDIA_TUNER_TDA18212 is not set
|
||||
# CONFIG_MEDIA_TUNER_E4000 is not set
|
||||
# CONFIG_MEDIA_TUNER_FC2580 is not set
|
||||
# CONFIG_MEDIA_TUNER_M88RS6000T is not set
|
||||
# CONFIG_MEDIA_TUNER_TUA9001 is not set
|
||||
# CONFIG_MEDIA_TUNER_SI2157 is not set
|
||||
# CONFIG_MEDIA_TUNER_IT913X is not set
|
||||
# CONFIG_MEDIA_TUNER_R820T is not set
|
||||
# CONFIG_MEDIA_TUNER_MXL301RF is not set
|
||||
# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set
|
||||
# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set
|
||||
CONFIG_DRM=y
|
||||
CONFIG_DRM_PANEL_SIMPLE=y
|
||||
CONFIG_DRM_PANEL_ILITEK_ILI9881C=y
|
||||
CONFIG_DRM_PANEL_ILI9881D=y
|
||||
CONFIG_DRM_PANEL_HX8394=y
|
||||
CONFIG_DRM_VERISILICON=y
|
||||
CONFIG_DRM_POWERVR_ROGUE=m
|
||||
CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
||||
CONFIG_BACKLIGHT_PWM=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_USB_AUDIO=m
|
||||
CONFIG_SND_SOC=y
|
||||
CONFIG_SND_SOC_THEAD_LIGHT=y
|
||||
CONFIG_SND_SOC_AW87519=y
|
||||
CONFIG_SND_SOC_BT_SCO=y
|
||||
CONFIG_SND_SOC_ES7210=y
|
||||
CONFIG_SND_SOC_ES8156=y
|
||||
CONFIG_SND_SOC_WM8960=y
|
||||
CONFIG_SND_SIMPLE_CARD=y
|
||||
CONFIG_SND_AUDIO_GRAPH_CARD=y
|
||||
CONFIG_UHID=y
|
||||
CONFIG_HID_PID=y
|
||||
CONFIG_USB_HIDDEV=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_XHCI_PLATFORM=y
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_ACM=m
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_STORAGE_SDDR09=y
|
||||
CONFIG_USB_STORAGE_SDDR55=y
|
||||
CONFIG_USB_DWC3=m
|
||||
CONFIG_USB_DWC3_HOST=y
|
||||
# CONFIG_USB_DWC3_OF_SIMPLE is not set
|
||||
CONFIG_USB_SERIAL=m
|
||||
CONFIG_USB_SERIAL_GENERIC=y
|
||||
CONFIG_USB_SERIAL_SIMPLE=m
|
||||
CONFIG_USB_SERIAL_AIRCABLE=m
|
||||
CONFIG_USB_SERIAL_ARK3116=m
|
||||
CONFIG_USB_SERIAL_BELKIN=m
|
||||
CONFIG_USB_SERIAL_CH341=m
|
||||
CONFIG_USB_SERIAL_WHITEHEAT=m
|
||||
CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
|
||||
CONFIG_USB_SERIAL_CP210X=m
|
||||
CONFIG_USB_SERIAL_CYPRESS_M8=m
|
||||
CONFIG_USB_SERIAL_EMPEG=m
|
||||
CONFIG_USB_SERIAL_FTDI_SIO=m
|
||||
CONFIG_USB_SERIAL_VISOR=m
|
||||
CONFIG_USB_SERIAL_IPAQ=m
|
||||
CONFIG_USB_SERIAL_IR=m
|
||||
CONFIG_USB_SERIAL_EDGEPORT=m
|
||||
CONFIG_USB_SERIAL_EDGEPORT_TI=m
|
||||
CONFIG_USB_SERIAL_F81232=m
|
||||
CONFIG_USB_SERIAL_F8153X=m
|
||||
CONFIG_USB_SERIAL_GARMIN=m
|
||||
CONFIG_USB_SERIAL_IPW=m
|
||||
CONFIG_USB_SERIAL_IUU=m
|
||||
CONFIG_USB_SERIAL_KEYSPAN_PDA=m
|
||||
CONFIG_USB_SERIAL_KEYSPAN=m
|
||||
CONFIG_USB_SERIAL_KLSI=m
|
||||
CONFIG_USB_SERIAL_KOBIL_SCT=m
|
||||
CONFIG_USB_SERIAL_MCT_U232=m
|
||||
CONFIG_USB_SERIAL_METRO=m
|
||||
CONFIG_USB_SERIAL_MOS7720=m
|
||||
CONFIG_USB_SERIAL_MOS7840=m
|
||||
CONFIG_USB_SERIAL_MXUPORT=m
|
||||
CONFIG_USB_SERIAL_NAVMAN=m
|
||||
CONFIG_USB_SERIAL_PL2303=m
|
||||
CONFIG_USB_SERIAL_OTI6858=m
|
||||
CONFIG_USB_SERIAL_QCAUX=m
|
||||
CONFIG_USB_SERIAL_QUALCOMM=m
|
||||
CONFIG_USB_SERIAL_SPCP8X5=m
|
||||
CONFIG_USB_SERIAL_SIERRAWIRELESS=m
|
||||
CONFIG_USB_SERIAL_SYMBOL=m
|
||||
CONFIG_USB_SERIAL_TI=m
|
||||
CONFIG_USB_SERIAL_CYBERJACK=m
|
||||
CONFIG_USB_SERIAL_XIRCOM=m
|
||||
CONFIG_USB_SERIAL_OPTION=m
|
||||
CONFIG_USB_SERIAL_OMNINET=m
|
||||
CONFIG_USB_SERIAL_OPTICON=m
|
||||
CONFIG_USB_SERIAL_XSENS_MT=m
|
||||
CONFIG_USB_SERIAL_WISHBONE=m
|
||||
CONFIG_USB_SERIAL_SSU100=m
|
||||
CONFIG_USB_SERIAL_QT2=m
|
||||
CONFIG_USB_SERIAL_UPD78F0730=m
|
||||
CONFIG_USB_SERIAL_DEBUG=m
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_CONFIGFS=y
|
||||
CONFIG_USB_CONFIGFS_F_FS=y
|
||||
CONFIG_USB_CONFIGFS_F_ACC=y
|
||||
CONFIG_USB_ZERO=m
|
||||
CONFIG_USB_ETH=m
|
||||
CONFIG_USB_ETH_EEM=y
|
||||
CONFIG_USB_G_NCM=m
|
||||
CONFIG_USB_MASS_STORAGE=m
|
||||
CONFIG_USB_G_SERIAL=m
|
||||
CONFIG_USB_G_MULTI=m
|
||||
CONFIG_USB_G_MULTI_CDC=y
|
||||
CONFIG_USB_ROLE_SWITCH=m
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MMC_SDHCI_OF_DWCMSHC=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_XGENE=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_DW_AXI_DMAC=y
|
||||
CONFIG_DMATEST=y
|
||||
CONFIG_SW_SYNC=y
|
||||
CONFIG_UDMABUF=y
|
||||
CONFIG_DMABUF_SELFTESTS=m
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
CONFIG_VIRTIO_KHV_MMIO=y
|
||||
CONFIG_VHOST_NET=y
|
||||
CONFIG_VHOST_VSOCK=y
|
||||
CONFIG_STAGING=y
|
||||
CONFIG_STAGING_MEDIA=y
|
||||
CONFIG_CLK_LIGHT_FM=y
|
||||
CONFIG_HWSPINLOCK=y
|
||||
CONFIG_HWSPINLOCK_LIGHT=y
|
||||
CONFIG_HWSPINLOCK_LIGHT_TEST=m
|
||||
CONFIG_MAILBOX=y
|
||||
CONFIG_RPMSG=y
|
||||
CONFIG_RPMSG_CHAR=y
|
||||
CONFIG_RPMSG_VIRTIO=y
|
||||
CONFIG_RPMSG_THEAD_LIGHT=y
|
||||
CONFIG_EXTCON=y
|
||||
CONFIG_IIO=y
|
||||
CONFIG_IIO_SW_DEVICE=y
|
||||
CONFIG_PWM=y
|
||||
CONFIG_PWM_LIGHT=y
|
||||
CONFIG_NVMEM_THEAD_LIGHT_EFUSE=y
|
||||
CONFIG_TEE=y
|
||||
CONFIG_OPTEE=y
|
||||
CONFIG_OPTEE_BENCHMARK=y
|
||||
CONFIG_LIGHT_GPU_VIV=m
|
||||
# CONFIG_LIGHT_NET is not set
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
CONFIG_EXT4_FS_SECURITY=y
|
||||
CONFIG_BTRFS_FS=y
|
||||
CONFIG_BTRFS_FS_POSIX_ACL=y
|
||||
CONFIG_AUTOFS4_FS=y
|
||||
CONFIG_FUSE_FS=y
|
||||
CONFIG_OVERLAY_FS=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_EXFAT_FS=m
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_HUGETLBFS=y
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_UBIFS_FS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_NFS_V4_1=y
|
||||
CONFIG_NFS_V4_2=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V4=y
|
||||
CONFIG_9P_FS=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_SECURITY=y
|
||||
CONFIG_SECURITY_SELINUX=y
|
||||
CONFIG_SECURITY_APPARMOR=y
|
||||
CONFIG_DEFAULT_SECURITY_DAC=y
|
||||
CONFIG_CRYPTO_USER=y
|
||||
CONFIG_CRYPTO_DH=y
|
||||
CONFIG_CRYPTO_CURVE25519=y
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=y
|
||||
CONFIG_CRYPTO_OFB=y
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_CRYPTO_SHA512=y
|
||||
CONFIG_CRYPTO_SHA3=y
|
||||
CONFIG_CRYPTO_SM3=y
|
||||
CONFIG_CRYPTO_DES=y
|
||||
CONFIG_CRYPTO_SM4=y
|
||||
CONFIG_CRYPTO_USER_API_HASH=y
|
||||
CONFIG_CRYPTO_USER_API_SKCIPHER=y
|
||||
CONFIG_CRYPTO_USER_API_RNG=y
|
||||
CONFIG_CRYPTO_USER_API_AEAD=y
|
||||
CONFIG_DMA_CMA=y
|
||||
CONFIG_DMA_PERNUMA_CMA=y
|
||||
CONFIG_CMA_SIZE_MBYTES=32
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DYNAMIC_DEBUG=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||
CONFIG_DEBUG_ATOMIC_SLEEP=y
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
@@ -18,11 +18,6 @@ CONFIG_SOC_SIFIVE=y
|
||||
CONFIG_SOC_VIRT=y
|
||||
CONFIG_ARCH_RV32I=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_VIRTUALIZATION=y
|
||||
CONFIG_KVM=m
|
||||
CONFIG_JUMP_LABEL=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
|
||||
@@ -66,31 +66,4 @@
|
||||
#error "Unexpected __SIZEOF_SHORT__"
|
||||
#endif
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
|
||||
/* Common assembly source macros */
|
||||
|
||||
#ifdef CONFIG_XIP_KERNEL
|
||||
.macro XIP_FIXUP_OFFSET reg
|
||||
REG_L t0, _xip_fixup
|
||||
add \reg, \reg, t0
|
||||
.endm
|
||||
.macro XIP_FIXUP_FLASH_OFFSET reg
|
||||
la t1, __data_loc
|
||||
li t0, XIP_OFFSET_MASK
|
||||
and t1, t1, t0
|
||||
li t1, XIP_OFFSET
|
||||
sub t0, t0, t1
|
||||
sub \reg, \reg, t0
|
||||
.endm
|
||||
_xip_fixup: .dword CONFIG_PHYS_RAM_BASE - CONFIG_XIP_PHYS_ADDR - XIP_OFFSET
|
||||
#else
|
||||
.macro XIP_FIXUP_OFFSET reg
|
||||
.endm
|
||||
.macro XIP_FIXUP_FLASH_OFFSET reg
|
||||
.endm
|
||||
#endif /* CONFIG_XIP_KERNEL */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_RISCV_ASM_H */
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2021 by Rivos Inc.
|
||||
*/
|
||||
#ifndef __ASM_CPU_OPS_SBI_H
|
||||
#define __ASM_CPU_OPS_SBI_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/threads.h>
|
||||
|
||||
/**
|
||||
* struct sbi_hart_boot_data - Hart specific boot used during booting and
|
||||
* cpu hotplug.
|
||||
* @task_ptr: A pointer to the hart specific tp
|
||||
* @stack_ptr: A pointer to the hart specific sp
|
||||
*/
|
||||
struct sbi_hart_boot_data {
|
||||
void *task_ptr;
|
||||
void *stack_ptr;
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* ifndef __ASM_CPU_OPS_SBI_H */
|
||||
@@ -26,19 +26,11 @@
|
||||
|
||||
#define SR_VS_OFF _AC(0x00000000, UL)
|
||||
|
||||
#if (defined(CONFIG_VECTOR_1_0) && defined(__THEAD_VERSION__))
|
||||
#define SR_VS _AC(0x00000600, UL) /* Vector Status */
|
||||
#define SR_VS_INITIAL _AC(0x00000200, UL)
|
||||
#define SR_VS_CLEAN _AC(0x00000400, UL)
|
||||
#define SR_VS_DIRTY _AC(0x00000600, UL)
|
||||
#else
|
||||
#define SR_VS _AC(0x01800000, UL) /* Vector Status */
|
||||
#define SR_VS_INITIAL _AC(0x00800000, UL)
|
||||
#define SR_VS_CLEAN _AC(0x01000000, UL)
|
||||
#define SR_VS_DIRTY _AC(0x01800000, UL)
|
||||
|
||||
#endif
|
||||
|
||||
#define SR_XS _AC(0x00018000, UL) /* Extension Status */
|
||||
#define SR_XS_OFF _AC(0x00000000, UL)
|
||||
#define SR_XS_INITIAL _AC(0x00008000, UL)
|
||||
|
||||
@@ -446,7 +446,7 @@ static inline pgprot_t pgprot_writecombine(pgprot_t _prot)
|
||||
|
||||
return __pgprot(prot);
|
||||
}
|
||||
#define pgprot_dmacoherent pgprot_writecombine
|
||||
|
||||
/*
|
||||
* Encode and decode a swap entry
|
||||
*
|
||||
|
||||
@@ -61,45 +61,13 @@ enum sbi_ext_hsm_fid {
|
||||
SBI_EXT_HSM_HART_START = 0,
|
||||
SBI_EXT_HSM_HART_STOP,
|
||||
SBI_EXT_HSM_HART_STATUS,
|
||||
SBI_EXT_HSM_HART_SUSPEND,
|
||||
};
|
||||
|
||||
enum sbi_hsm_hart_state {
|
||||
SBI_HSM_STATE_STARTED = 0,
|
||||
SBI_HSM_STATE_STOPPED,
|
||||
SBI_HSM_STATE_START_PENDING,
|
||||
SBI_HSM_STATE_STOP_PENDING,
|
||||
SBI_HSM_STATE_SUSPENDED,
|
||||
SBI_HSM_STATE_SUSPEND_PENDING,
|
||||
SBI_HSM_STATE_RESUME_PENDING,
|
||||
};
|
||||
|
||||
#define SBI_HSM_SUSP_BASE_MASK 0x7fffffff
|
||||
#define SBI_HSM_SUSP_NON_RET_BIT 0x80000000
|
||||
#define SBI_HSM_SUSP_PLAT_BASE 0x10000000
|
||||
|
||||
#define SBI_HSM_SUSPEND_RET_DEFAULT 0x00000000
|
||||
#define SBI_HSM_SUSPEND_RET_PLATFORM SBI_HSM_SUSP_PLAT_BASE
|
||||
#define SBI_HSM_SUSPEND_RET_LAST SBI_HSM_SUSP_BASE_MASK
|
||||
#define SBI_HSM_SUSPEND_NON_RET_DEFAULT SBI_HSM_SUSP_NON_RET_BIT
|
||||
#define SBI_HSM_SUSPEND_NON_RET_PLATFORM (SBI_HSM_SUSP_NON_RET_BIT | \
|
||||
SBI_HSM_SUSP_PLAT_BASE)
|
||||
#define SBI_HSM_SUSPEND_NON_RET_LAST (SBI_HSM_SUSP_NON_RET_BIT | \
|
||||
SBI_HSM_SUSP_BASE_MASK)
|
||||
|
||||
enum sbi_ext_srst_fid {
|
||||
SBI_EXT_SRST_RESET = 0,
|
||||
};
|
||||
|
||||
enum sbi_srst_reset_type {
|
||||
SBI_SRST_RESET_TYPE_SHUTDOWN = 0,
|
||||
SBI_SRST_RESET_TYPE_COLD_REBOOT,
|
||||
SBI_SRST_RESET_TYPE_WARM_REBOOT,
|
||||
};
|
||||
|
||||
enum sbi_srst_reset_reason {
|
||||
SBI_SRST_RESET_REASON_NONE = 0,
|
||||
SBI_SRST_RESET_REASON_SYS_FAILURE,
|
||||
enum sbi_hsm_hart_status {
|
||||
SBI_HSM_HART_STATUS_STARTED = 0,
|
||||
SBI_HSM_HART_STATUS_STOPPED,
|
||||
SBI_HSM_HART_STATUS_START_PENDING,
|
||||
SBI_HSM_HART_STATUS_STOP_PENDING,
|
||||
};
|
||||
|
||||
#define SBI_SPEC_VERSION_DEFAULT 0x1
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2021 Western Digital Corporation or its affiliates.
|
||||
* Copyright (c) 2022 Ventana Micro Systems Inc.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_RISCV_SUSPEND_H
|
||||
#define _ASM_RISCV_SUSPEND_H
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
struct suspend_context {
|
||||
/* Saved and restored by low-level functions */
|
||||
struct pt_regs regs;
|
||||
/* Saved and restored by high-level functions */
|
||||
unsigned long scratch;
|
||||
unsigned long tvec;
|
||||
unsigned long ie;
|
||||
#ifdef CONFIG_MMU
|
||||
unsigned long satp;
|
||||
#endif
|
||||
};
|
||||
|
||||
/* Low-level CPU suspend entry function */
|
||||
int __cpu_suspend_enter(struct suspend_context *context);
|
||||
|
||||
/* High-level CPU suspend which will save context and call finish() */
|
||||
int cpu_suspend(unsigned long arg,
|
||||
int (*finish)(unsigned long arg,
|
||||
unsigned long entry,
|
||||
unsigned long context));
|
||||
|
||||
/* Low-level CPU resume entry function */
|
||||
int __cpu_resume_enter(unsigned long hartid, unsigned long context);
|
||||
|
||||
#endif
|
||||
@@ -48,8 +48,6 @@ obj-$(CONFIG_SMP) += cpu_ops_spinwait.o
|
||||
obj-$(CONFIG_MODULES) += module.o
|
||||
obj-$(CONFIG_MODULE_SECTIONS) += module-sections.o
|
||||
|
||||
obj-$(CONFIG_CPU_PM) += suspend_entry.o suspend.o
|
||||
|
||||
obj-$(CONFIG_FUNCTION_TRACER) += mcount.o ftrace.o
|
||||
obj-$(CONFIG_DYNAMIC_FTRACE) += mcount-dyn.o
|
||||
|
||||
|
||||
@@ -10,10 +10,6 @@
|
||||
#include <linux/sched.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/cpu_ops_sbi.h>
|
||||
#include <asm/suspend.h>
|
||||
|
||||
void asm_offsets(void);
|
||||
|
||||
void asm_offsets(void)
|
||||
{
|
||||
@@ -153,162 +149,6 @@ void asm_offsets(void)
|
||||
OFFSET(PT_BADADDR, pt_regs, badaddr);
|
||||
OFFSET(PT_CAUSE, pt_regs, cause);
|
||||
|
||||
OFFSET(SUSPEND_CONTEXT_REGS, suspend_context, regs);
|
||||
#if 0
|
||||
OFFSET(KVM_ARCH_GUEST_ZERO, kvm_vcpu_arch, guest_context.zero);
|
||||
OFFSET(KVM_ARCH_GUEST_RA, kvm_vcpu_arch, guest_context.ra);
|
||||
OFFSET(KVM_ARCH_GUEST_SP, kvm_vcpu_arch, guest_context.sp);
|
||||
OFFSET(KVM_ARCH_GUEST_GP, kvm_vcpu_arch, guest_context.gp);
|
||||
OFFSET(KVM_ARCH_GUEST_TP, kvm_vcpu_arch, guest_context.tp);
|
||||
OFFSET(KVM_ARCH_GUEST_T0, kvm_vcpu_arch, guest_context.t0);
|
||||
OFFSET(KVM_ARCH_GUEST_T1, kvm_vcpu_arch, guest_context.t1);
|
||||
OFFSET(KVM_ARCH_GUEST_T2, kvm_vcpu_arch, guest_context.t2);
|
||||
OFFSET(KVM_ARCH_GUEST_S0, kvm_vcpu_arch, guest_context.s0);
|
||||
OFFSET(KVM_ARCH_GUEST_S1, kvm_vcpu_arch, guest_context.s1);
|
||||
OFFSET(KVM_ARCH_GUEST_A0, kvm_vcpu_arch, guest_context.a0);
|
||||
OFFSET(KVM_ARCH_GUEST_A1, kvm_vcpu_arch, guest_context.a1);
|
||||
OFFSET(KVM_ARCH_GUEST_A2, kvm_vcpu_arch, guest_context.a2);
|
||||
OFFSET(KVM_ARCH_GUEST_A3, kvm_vcpu_arch, guest_context.a3);
|
||||
OFFSET(KVM_ARCH_GUEST_A4, kvm_vcpu_arch, guest_context.a4);
|
||||
OFFSET(KVM_ARCH_GUEST_A5, kvm_vcpu_arch, guest_context.a5);
|
||||
OFFSET(KVM_ARCH_GUEST_A6, kvm_vcpu_arch, guest_context.a6);
|
||||
OFFSET(KVM_ARCH_GUEST_A7, kvm_vcpu_arch, guest_context.a7);
|
||||
OFFSET(KVM_ARCH_GUEST_S2, kvm_vcpu_arch, guest_context.s2);
|
||||
OFFSET(KVM_ARCH_GUEST_S3, kvm_vcpu_arch, guest_context.s3);
|
||||
OFFSET(KVM_ARCH_GUEST_S4, kvm_vcpu_arch, guest_context.s4);
|
||||
OFFSET(KVM_ARCH_GUEST_S5, kvm_vcpu_arch, guest_context.s5);
|
||||
OFFSET(KVM_ARCH_GUEST_S6, kvm_vcpu_arch, guest_context.s6);
|
||||
OFFSET(KVM_ARCH_GUEST_S7, kvm_vcpu_arch, guest_context.s7);
|
||||
OFFSET(KVM_ARCH_GUEST_S8, kvm_vcpu_arch, guest_context.s8);
|
||||
OFFSET(KVM_ARCH_GUEST_S9, kvm_vcpu_arch, guest_context.s9);
|
||||
OFFSET(KVM_ARCH_GUEST_S10, kvm_vcpu_arch, guest_context.s10);
|
||||
OFFSET(KVM_ARCH_GUEST_S11, kvm_vcpu_arch, guest_context.s11);
|
||||
OFFSET(KVM_ARCH_GUEST_T3, kvm_vcpu_arch, guest_context.t3);
|
||||
OFFSET(KVM_ARCH_GUEST_T4, kvm_vcpu_arch, guest_context.t4);
|
||||
OFFSET(KVM_ARCH_GUEST_T5, kvm_vcpu_arch, guest_context.t5);
|
||||
OFFSET(KVM_ARCH_GUEST_T6, kvm_vcpu_arch, guest_context.t6);
|
||||
OFFSET(KVM_ARCH_GUEST_SEPC, kvm_vcpu_arch, guest_context.sepc);
|
||||
OFFSET(KVM_ARCH_GUEST_SSTATUS, kvm_vcpu_arch, guest_context.sstatus);
|
||||
OFFSET(KVM_ARCH_GUEST_HSTATUS, kvm_vcpu_arch, guest_context.hstatus);
|
||||
OFFSET(KVM_ARCH_GUEST_SCOUNTEREN, kvm_vcpu_arch, guest_csr.scounteren);
|
||||
|
||||
OFFSET(KVM_ARCH_HOST_ZERO, kvm_vcpu_arch, host_context.zero);
|
||||
OFFSET(KVM_ARCH_HOST_RA, kvm_vcpu_arch, host_context.ra);
|
||||
OFFSET(KVM_ARCH_HOST_SP, kvm_vcpu_arch, host_context.sp);
|
||||
OFFSET(KVM_ARCH_HOST_GP, kvm_vcpu_arch, host_context.gp);
|
||||
OFFSET(KVM_ARCH_HOST_TP, kvm_vcpu_arch, host_context.tp);
|
||||
OFFSET(KVM_ARCH_HOST_T0, kvm_vcpu_arch, host_context.t0);
|
||||
OFFSET(KVM_ARCH_HOST_T1, kvm_vcpu_arch, host_context.t1);
|
||||
OFFSET(KVM_ARCH_HOST_T2, kvm_vcpu_arch, host_context.t2);
|
||||
OFFSET(KVM_ARCH_HOST_S0, kvm_vcpu_arch, host_context.s0);
|
||||
OFFSET(KVM_ARCH_HOST_S1, kvm_vcpu_arch, host_context.s1);
|
||||
OFFSET(KVM_ARCH_HOST_A0, kvm_vcpu_arch, host_context.a0);
|
||||
OFFSET(KVM_ARCH_HOST_A1, kvm_vcpu_arch, host_context.a1);
|
||||
OFFSET(KVM_ARCH_HOST_A2, kvm_vcpu_arch, host_context.a2);
|
||||
OFFSET(KVM_ARCH_HOST_A3, kvm_vcpu_arch, host_context.a3);
|
||||
OFFSET(KVM_ARCH_HOST_A4, kvm_vcpu_arch, host_context.a4);
|
||||
OFFSET(KVM_ARCH_HOST_A5, kvm_vcpu_arch, host_context.a5);
|
||||
OFFSET(KVM_ARCH_HOST_A6, kvm_vcpu_arch, host_context.a6);
|
||||
OFFSET(KVM_ARCH_HOST_A7, kvm_vcpu_arch, host_context.a7);
|
||||
OFFSET(KVM_ARCH_HOST_S2, kvm_vcpu_arch, host_context.s2);
|
||||
OFFSET(KVM_ARCH_HOST_S3, kvm_vcpu_arch, host_context.s3);
|
||||
OFFSET(KVM_ARCH_HOST_S4, kvm_vcpu_arch, host_context.s4);
|
||||
OFFSET(KVM_ARCH_HOST_S5, kvm_vcpu_arch, host_context.s5);
|
||||
OFFSET(KVM_ARCH_HOST_S6, kvm_vcpu_arch, host_context.s6);
|
||||
OFFSET(KVM_ARCH_HOST_S7, kvm_vcpu_arch, host_context.s7);
|
||||
OFFSET(KVM_ARCH_HOST_S8, kvm_vcpu_arch, host_context.s8);
|
||||
OFFSET(KVM_ARCH_HOST_S9, kvm_vcpu_arch, host_context.s9);
|
||||
OFFSET(KVM_ARCH_HOST_S10, kvm_vcpu_arch, host_context.s10);
|
||||
OFFSET(KVM_ARCH_HOST_S11, kvm_vcpu_arch, host_context.s11);
|
||||
OFFSET(KVM_ARCH_HOST_T3, kvm_vcpu_arch, host_context.t3);
|
||||
OFFSET(KVM_ARCH_HOST_T4, kvm_vcpu_arch, host_context.t4);
|
||||
OFFSET(KVM_ARCH_HOST_T5, kvm_vcpu_arch, host_context.t5);
|
||||
OFFSET(KVM_ARCH_HOST_T6, kvm_vcpu_arch, host_context.t6);
|
||||
OFFSET(KVM_ARCH_HOST_SEPC, kvm_vcpu_arch, host_context.sepc);
|
||||
OFFSET(KVM_ARCH_HOST_SSTATUS, kvm_vcpu_arch, host_context.sstatus);
|
||||
OFFSET(KVM_ARCH_HOST_HSTATUS, kvm_vcpu_arch, host_context.hstatus);
|
||||
OFFSET(KVM_ARCH_HOST_SSCRATCH, kvm_vcpu_arch, host_sscratch);
|
||||
OFFSET(KVM_ARCH_HOST_STVEC, kvm_vcpu_arch, host_stvec);
|
||||
OFFSET(KVM_ARCH_HOST_SCOUNTEREN, kvm_vcpu_arch, host_scounteren);
|
||||
|
||||
OFFSET(KVM_ARCH_TRAP_SEPC, kvm_cpu_trap, sepc);
|
||||
OFFSET(KVM_ARCH_TRAP_SCAUSE, kvm_cpu_trap, scause);
|
||||
OFFSET(KVM_ARCH_TRAP_STVAL, kvm_cpu_trap, stval);
|
||||
OFFSET(KVM_ARCH_TRAP_HTVAL, kvm_cpu_trap, htval);
|
||||
OFFSET(KVM_ARCH_TRAP_HTINST, kvm_cpu_trap, htinst);
|
||||
|
||||
/* F extension */
|
||||
|
||||
OFFSET(KVM_ARCH_FP_F_F0, kvm_cpu_context, fp.f.f[0]);
|
||||
OFFSET(KVM_ARCH_FP_F_F1, kvm_cpu_context, fp.f.f[1]);
|
||||
OFFSET(KVM_ARCH_FP_F_F2, kvm_cpu_context, fp.f.f[2]);
|
||||
OFFSET(KVM_ARCH_FP_F_F3, kvm_cpu_context, fp.f.f[3]);
|
||||
OFFSET(KVM_ARCH_FP_F_F4, kvm_cpu_context, fp.f.f[4]);
|
||||
OFFSET(KVM_ARCH_FP_F_F5, kvm_cpu_context, fp.f.f[5]);
|
||||
OFFSET(KVM_ARCH_FP_F_F6, kvm_cpu_context, fp.f.f[6]);
|
||||
OFFSET(KVM_ARCH_FP_F_F7, kvm_cpu_context, fp.f.f[7]);
|
||||
OFFSET(KVM_ARCH_FP_F_F8, kvm_cpu_context, fp.f.f[8]);
|
||||
OFFSET(KVM_ARCH_FP_F_F9, kvm_cpu_context, fp.f.f[9]);
|
||||
OFFSET(KVM_ARCH_FP_F_F10, kvm_cpu_context, fp.f.f[10]);
|
||||
OFFSET(KVM_ARCH_FP_F_F11, kvm_cpu_context, fp.f.f[11]);
|
||||
OFFSET(KVM_ARCH_FP_F_F12, kvm_cpu_context, fp.f.f[12]);
|
||||
OFFSET(KVM_ARCH_FP_F_F13, kvm_cpu_context, fp.f.f[13]);
|
||||
OFFSET(KVM_ARCH_FP_F_F14, kvm_cpu_context, fp.f.f[14]);
|
||||
OFFSET(KVM_ARCH_FP_F_F15, kvm_cpu_context, fp.f.f[15]);
|
||||
OFFSET(KVM_ARCH_FP_F_F16, kvm_cpu_context, fp.f.f[16]);
|
||||
OFFSET(KVM_ARCH_FP_F_F17, kvm_cpu_context, fp.f.f[17]);
|
||||
OFFSET(KVM_ARCH_FP_F_F18, kvm_cpu_context, fp.f.f[18]);
|
||||
OFFSET(KVM_ARCH_FP_F_F19, kvm_cpu_context, fp.f.f[19]);
|
||||
OFFSET(KVM_ARCH_FP_F_F20, kvm_cpu_context, fp.f.f[20]);
|
||||
OFFSET(KVM_ARCH_FP_F_F21, kvm_cpu_context, fp.f.f[21]);
|
||||
OFFSET(KVM_ARCH_FP_F_F22, kvm_cpu_context, fp.f.f[22]);
|
||||
OFFSET(KVM_ARCH_FP_F_F23, kvm_cpu_context, fp.f.f[23]);
|
||||
OFFSET(KVM_ARCH_FP_F_F24, kvm_cpu_context, fp.f.f[24]);
|
||||
OFFSET(KVM_ARCH_FP_F_F25, kvm_cpu_context, fp.f.f[25]);
|
||||
OFFSET(KVM_ARCH_FP_F_F26, kvm_cpu_context, fp.f.f[26]);
|
||||
OFFSET(KVM_ARCH_FP_F_F27, kvm_cpu_context, fp.f.f[27]);
|
||||
OFFSET(KVM_ARCH_FP_F_F28, kvm_cpu_context, fp.f.f[28]);
|
||||
OFFSET(KVM_ARCH_FP_F_F29, kvm_cpu_context, fp.f.f[29]);
|
||||
OFFSET(KVM_ARCH_FP_F_F30, kvm_cpu_context, fp.f.f[30]);
|
||||
OFFSET(KVM_ARCH_FP_F_F31, kvm_cpu_context, fp.f.f[31]);
|
||||
OFFSET(KVM_ARCH_FP_F_FCSR, kvm_cpu_context, fp.f.fcsr);
|
||||
|
||||
/* D extension */
|
||||
|
||||
OFFSET(KVM_ARCH_FP_D_F0, kvm_cpu_context, fp.d.f[0]);
|
||||
OFFSET(KVM_ARCH_FP_D_F1, kvm_cpu_context, fp.d.f[1]);
|
||||
OFFSET(KVM_ARCH_FP_D_F2, kvm_cpu_context, fp.d.f[2]);
|
||||
OFFSET(KVM_ARCH_FP_D_F3, kvm_cpu_context, fp.d.f[3]);
|
||||
OFFSET(KVM_ARCH_FP_D_F4, kvm_cpu_context, fp.d.f[4]);
|
||||
OFFSET(KVM_ARCH_FP_D_F5, kvm_cpu_context, fp.d.f[5]);
|
||||
OFFSET(KVM_ARCH_FP_D_F6, kvm_cpu_context, fp.d.f[6]);
|
||||
OFFSET(KVM_ARCH_FP_D_F7, kvm_cpu_context, fp.d.f[7]);
|
||||
OFFSET(KVM_ARCH_FP_D_F8, kvm_cpu_context, fp.d.f[8]);
|
||||
OFFSET(KVM_ARCH_FP_D_F9, kvm_cpu_context, fp.d.f[9]);
|
||||
OFFSET(KVM_ARCH_FP_D_F10, kvm_cpu_context, fp.d.f[10]);
|
||||
OFFSET(KVM_ARCH_FP_D_F11, kvm_cpu_context, fp.d.f[11]);
|
||||
OFFSET(KVM_ARCH_FP_D_F12, kvm_cpu_context, fp.d.f[12]);
|
||||
OFFSET(KVM_ARCH_FP_D_F13, kvm_cpu_context, fp.d.f[13]);
|
||||
OFFSET(KVM_ARCH_FP_D_F14, kvm_cpu_context, fp.d.f[14]);
|
||||
OFFSET(KVM_ARCH_FP_D_F15, kvm_cpu_context, fp.d.f[15]);
|
||||
OFFSET(KVM_ARCH_FP_D_F16, kvm_cpu_context, fp.d.f[16]);
|
||||
OFFSET(KVM_ARCH_FP_D_F17, kvm_cpu_context, fp.d.f[17]);
|
||||
OFFSET(KVM_ARCH_FP_D_F18, kvm_cpu_context, fp.d.f[18]);
|
||||
OFFSET(KVM_ARCH_FP_D_F19, kvm_cpu_context, fp.d.f[19]);
|
||||
OFFSET(KVM_ARCH_FP_D_F20, kvm_cpu_context, fp.d.f[20]);
|
||||
OFFSET(KVM_ARCH_FP_D_F21, kvm_cpu_context, fp.d.f[21]);
|
||||
OFFSET(KVM_ARCH_FP_D_F22, kvm_cpu_context, fp.d.f[22]);
|
||||
OFFSET(KVM_ARCH_FP_D_F23, kvm_cpu_context, fp.d.f[23]);
|
||||
OFFSET(KVM_ARCH_FP_D_F24, kvm_cpu_context, fp.d.f[24]);
|
||||
OFFSET(KVM_ARCH_FP_D_F25, kvm_cpu_context, fp.d.f[25]);
|
||||
OFFSET(KVM_ARCH_FP_D_F26, kvm_cpu_context, fp.d.f[26]);
|
||||
OFFSET(KVM_ARCH_FP_D_F27, kvm_cpu_context, fp.d.f[27]);
|
||||
OFFSET(KVM_ARCH_FP_D_F28, kvm_cpu_context, fp.d.f[28]);
|
||||
OFFSET(KVM_ARCH_FP_D_F29, kvm_cpu_context, fp.d.f[29]);
|
||||
OFFSET(KVM_ARCH_FP_D_F30, kvm_cpu_context, fp.d.f[30]);
|
||||
OFFSET(KVM_ARCH_FP_D_F31, kvm_cpu_context, fp.d.f[31]);
|
||||
OFFSET(KVM_ARCH_FP_D_FCSR, kvm_cpu_context, fp.d.fcsr);
|
||||
#endif
|
||||
/*
|
||||
* THREAD_{F,X}* might be larger than a S-type offset can handle, but
|
||||
* these are used in performance-sensitive assembly so we can't resort
|
||||
@@ -660,9 +500,4 @@ void asm_offsets(void)
|
||||
* ensures the alignment is sane.
|
||||
*/
|
||||
DEFINE(PT_SIZE_ON_STACK, ALIGN(sizeof(struct pt_regs), STACK_ALIGN));
|
||||
#if 0
|
||||
OFFSET(KERNEL_MAP_VIRT_ADDR, kernel_mapping, virt_addr);
|
||||
#endif
|
||||
OFFSET(SBI_HART_BOOT_TASK_PTR_OFFSET, sbi_hart_boot_data, task_ptr);
|
||||
OFFSET(SBI_HART_BOOT_STACK_PTR_OFFSET, sbi_hart_boot_data, stack_ptr);
|
||||
}
|
||||
|
||||
@@ -7,22 +7,13 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched/task_stack.h>
|
||||
#include <asm/cpu_ops.h>
|
||||
#include <asm/cpu_ops_sbi.h>
|
||||
#include <asm/sbi.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
extern char secondary_start_sbi[];
|
||||
const struct cpu_operations cpu_ops_sbi;
|
||||
|
||||
/*
|
||||
* Ordered booting via HSM brings one cpu at a time. However, cpu hotplug can
|
||||
* be invoked from multiple threads in parallel. Define a per cpu data
|
||||
* to handle that.
|
||||
*/
|
||||
DEFINE_PER_CPU(struct sbi_hart_boot_data, boot_data);
|
||||
|
||||
static int sbi_hsm_hart_start(unsigned long hartid, unsigned long saddr,
|
||||
unsigned long priv)
|
||||
{
|
||||
@@ -64,19 +55,14 @@ static int sbi_hsm_hart_get_status(unsigned long hartid)
|
||||
|
||||
static int sbi_cpu_start(unsigned int cpuid, struct task_struct *tidle)
|
||||
{
|
||||
int rc;
|
||||
unsigned long boot_addr = __pa_symbol(secondary_start_sbi);
|
||||
int hartid = cpuid_to_hartid_map(cpuid);
|
||||
unsigned long hsm_data;
|
||||
struct sbi_hart_boot_data *bdata = &per_cpu(boot_data, cpuid);
|
||||
|
||||
/* Make sure tidle is updated */
|
||||
smp_mb();
|
||||
bdata->task_ptr = tidle;
|
||||
bdata->stack_ptr = task_stack_page(tidle) + THREAD_SIZE;
|
||||
/* Make sure boot data is updated */
|
||||
smp_mb();
|
||||
hsm_data = __pa(bdata);
|
||||
return sbi_hsm_hart_start(hartid, boot_addr, hsm_data);
|
||||
cpu_update_secondary_bootdata(cpuid, tidle);
|
||||
rc = sbi_hsm_hart_start(hartid, boot_addr, 0);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int sbi_cpu_prepare(unsigned int cpuid)
|
||||
@@ -111,7 +97,7 @@ static int sbi_cpu_is_stopped(unsigned int cpuid)
|
||||
|
||||
rc = sbi_hsm_hart_get_status(hartid);
|
||||
|
||||
if (rc == SBI_HSM_STATE_STOPPED)
|
||||
if (rc == SBI_HSM_HART_STATUS_STOPPED)
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/csr.h>
|
||||
#include <asm/cpu_ops_sbi.h>
|
||||
#include <asm/hwcap.h>
|
||||
#include <asm/image.h>
|
||||
#include "efi-header.S"
|
||||
@@ -68,8 +67,7 @@ pe_head_start:
|
||||
|
||||
.align 2
|
||||
#ifdef CONFIG_MMU
|
||||
.global relocate_enable_mmu
|
||||
relocate_enable_mmu:
|
||||
relocate:
|
||||
/* Relocate return address */
|
||||
li a1, PAGE_OFFSET
|
||||
la a2, _start
|
||||
@@ -144,15 +142,13 @@ secondary_start_sbi:
|
||||
la a3, .Lsecondary_park
|
||||
csrw CSR_TVEC, a3
|
||||
|
||||
/* a0 contains the hartid & a1 contains boot data */
|
||||
li a2, SBI_HART_BOOT_TASK_PTR_OFFSET
|
||||
XIP_FIXUP_OFFSET a2
|
||||
add a2, a2, a1
|
||||
REG_L tp, (a2)
|
||||
li a3, SBI_HART_BOOT_STACK_PTR_OFFSET
|
||||
XIP_FIXUP_OFFSET a3
|
||||
add a3, a3, a1
|
||||
REG_L sp, (a3)
|
||||
slli a3, a0, LGREG
|
||||
la a4, __cpu_up_stack_pointer
|
||||
la a5, __cpu_up_task_pointer
|
||||
add a4, a3, a4
|
||||
add a5, a3, a5
|
||||
REG_L sp, (a4)
|
||||
REG_L tp, (a5)
|
||||
|
||||
.global secondary_start_common
|
||||
secondary_start_common:
|
||||
@@ -160,8 +156,7 @@ secondary_start_common:
|
||||
#ifdef CONFIG_MMU
|
||||
/* Enable virtual memory and relocate to virtual address */
|
||||
la a0, swapper_pg_dir
|
||||
XIP_FIXUP_OFFSET a0
|
||||
call relocate_enable_mmu
|
||||
call relocate
|
||||
#endif
|
||||
call setup_trap_vector
|
||||
tail smp_callin
|
||||
@@ -271,8 +266,7 @@ clear_bss_done:
|
||||
call setup_vm
|
||||
#ifdef CONFIG_MMU
|
||||
la a0, early_pg_dir
|
||||
XIP_FIXUP_OFFSET a0
|
||||
call relocate_enable_mmu
|
||||
call relocate
|
||||
#endif /* CONFIG_MMU */
|
||||
|
||||
call setup_trap_vector
|
||||
|
||||
@@ -77,7 +77,7 @@ void perf_callchain_user(struct perf_callchain_entry_ctx *entry,
|
||||
|
||||
bool fill_callchain(unsigned long pc, unsigned long regs, void *entry)
|
||||
{
|
||||
return perf_callchain_store(entry, pc);
|
||||
return perf_callchain_store(entry, pc) == 0;
|
||||
}
|
||||
|
||||
void notrace walk_stackframe(struct task_struct *task,
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <asm/string.h>
|
||||
#include <asm/switch_to.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/cpuidle.h>
|
||||
|
||||
register unsigned long gp_in_global __asm__("gp");
|
||||
|
||||
@@ -38,7 +37,7 @@ extern asmlinkage void ret_from_kernel_thread(void);
|
||||
|
||||
void arch_cpu_idle(void)
|
||||
{
|
||||
cpu_do_idle();
|
||||
wait_for_interrupt();
|
||||
raw_local_irq_enable();
|
||||
}
|
||||
|
||||
|
||||
@@ -97,7 +97,6 @@ static int riscv_vr_get(struct task_struct *target,
|
||||
struct __riscv_v_state *vstate = &target->thread.vstate;
|
||||
|
||||
membuf_write(&to, vstate, offsetof(struct __riscv_v_state, vtype));
|
||||
membuf_store(&to, vstate->vtype);
|
||||
return membuf_zero(&to, 4); // explicitly pad
|
||||
}
|
||||
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2021 Western Digital Corporation or its affiliates.
|
||||
* Copyright (c) 2022 Ventana Micro Systems Inc.
|
||||
*/
|
||||
|
||||
#include <linux/ftrace.h>
|
||||
#include <asm/csr.h>
|
||||
#include <asm/suspend.h>
|
||||
|
||||
static void suspend_save_csrs(struct suspend_context *context)
|
||||
{
|
||||
context->scratch = csr_read(CSR_SCRATCH);
|
||||
context->tvec = csr_read(CSR_TVEC);
|
||||
context->ie = csr_read(CSR_IE);
|
||||
|
||||
/*
|
||||
* No need to save/restore IP CSR (i.e. MIP or SIP) because:
|
||||
*
|
||||
* 1. For no-MMU (M-mode) kernel, the bits in MIP are set by
|
||||
* external devices (such as interrupt controller, timer, etc).
|
||||
* 2. For MMU (S-mode) kernel, the bits in SIP are set by
|
||||
* M-mode firmware and external devices (such as interrupt
|
||||
* controller, etc).
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
context->satp = csr_read(CSR_SATP);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void suspend_restore_csrs(struct suspend_context *context)
|
||||
{
|
||||
csr_write(CSR_SCRATCH, context->scratch);
|
||||
csr_write(CSR_TVEC, context->tvec);
|
||||
csr_write(CSR_IE, context->ie);
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
csr_write(CSR_SATP, context->satp);
|
||||
#endif
|
||||
}
|
||||
|
||||
int cpu_suspend(unsigned long arg,
|
||||
int (*finish)(unsigned long arg,
|
||||
unsigned long entry,
|
||||
unsigned long context))
|
||||
{
|
||||
int rc = 0;
|
||||
struct suspend_context context = { 0 };
|
||||
|
||||
/* Finisher should be non-NULL */
|
||||
if (!finish)
|
||||
return -EINVAL;
|
||||
|
||||
/* Save additional CSRs*/
|
||||
suspend_save_csrs(&context);
|
||||
|
||||
/*
|
||||
* Function graph tracer state gets incosistent when the kernel
|
||||
* calls functions that never return (aka finishers) hence disable
|
||||
* graph tracing during their execution.
|
||||
*/
|
||||
pause_graph_tracing();
|
||||
|
||||
/* Save context on stack */
|
||||
if (__cpu_suspend_enter(&context)) {
|
||||
/* Call the finisher */
|
||||
rc = finish(arg, __pa_symbol(__cpu_resume_enter),
|
||||
(ulong)&context);
|
||||
|
||||
/*
|
||||
* Should never reach here, unless the suspend finisher
|
||||
* fails. Successful cpu_suspend() should return from
|
||||
* __cpu_resume_entry()
|
||||
*/
|
||||
if (!rc)
|
||||
rc = -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/* Enable function graph tracer */
|
||||
unpause_graph_tracing();
|
||||
|
||||
/* Restore additional CSRs */
|
||||
suspend_restore_csrs(&context);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@@ -1,124 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2021 Western Digital Corporation or its affiliates.
|
||||
* Copyright (c) 2022 Ventana Micro Systems Inc.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/csr.h>
|
||||
|
||||
.text
|
||||
.altmacro
|
||||
.option norelax
|
||||
|
||||
ENTRY(__cpu_suspend_enter)
|
||||
/* Save registers (except A0 and T0-T6) */
|
||||
REG_S ra, (SUSPEND_CONTEXT_REGS + PT_RA)(a0)
|
||||
REG_S sp, (SUSPEND_CONTEXT_REGS + PT_SP)(a0)
|
||||
REG_S gp, (SUSPEND_CONTEXT_REGS + PT_GP)(a0)
|
||||
REG_S tp, (SUSPEND_CONTEXT_REGS + PT_TP)(a0)
|
||||
REG_S s0, (SUSPEND_CONTEXT_REGS + PT_S0)(a0)
|
||||
REG_S s1, (SUSPEND_CONTEXT_REGS + PT_S1)(a0)
|
||||
REG_S a1, (SUSPEND_CONTEXT_REGS + PT_A1)(a0)
|
||||
REG_S a2, (SUSPEND_CONTEXT_REGS + PT_A2)(a0)
|
||||
REG_S a3, (SUSPEND_CONTEXT_REGS + PT_A3)(a0)
|
||||
REG_S a4, (SUSPEND_CONTEXT_REGS + PT_A4)(a0)
|
||||
REG_S a5, (SUSPEND_CONTEXT_REGS + PT_A5)(a0)
|
||||
REG_S a6, (SUSPEND_CONTEXT_REGS + PT_A6)(a0)
|
||||
REG_S a7, (SUSPEND_CONTEXT_REGS + PT_A7)(a0)
|
||||
REG_S s2, (SUSPEND_CONTEXT_REGS + PT_S2)(a0)
|
||||
REG_S s3, (SUSPEND_CONTEXT_REGS + PT_S3)(a0)
|
||||
REG_S s4, (SUSPEND_CONTEXT_REGS + PT_S4)(a0)
|
||||
REG_S s5, (SUSPEND_CONTEXT_REGS + PT_S5)(a0)
|
||||
REG_S s6, (SUSPEND_CONTEXT_REGS + PT_S6)(a0)
|
||||
REG_S s7, (SUSPEND_CONTEXT_REGS + PT_S7)(a0)
|
||||
REG_S s8, (SUSPEND_CONTEXT_REGS + PT_S8)(a0)
|
||||
REG_S s9, (SUSPEND_CONTEXT_REGS + PT_S9)(a0)
|
||||
REG_S s10, (SUSPEND_CONTEXT_REGS + PT_S10)(a0)
|
||||
REG_S s11, (SUSPEND_CONTEXT_REGS + PT_S11)(a0)
|
||||
|
||||
/* Save CSRs */
|
||||
csrr t0, CSR_EPC
|
||||
REG_S t0, (SUSPEND_CONTEXT_REGS + PT_EPC)(a0)
|
||||
csrr t0, CSR_STATUS
|
||||
REG_S t0, (SUSPEND_CONTEXT_REGS + PT_STATUS)(a0)
|
||||
csrr t0, CSR_TVAL
|
||||
REG_S t0, (SUSPEND_CONTEXT_REGS + PT_BADADDR)(a0)
|
||||
csrr t0, CSR_CAUSE
|
||||
REG_S t0, (SUSPEND_CONTEXT_REGS + PT_CAUSE)(a0)
|
||||
|
||||
/* Return non-zero value */
|
||||
li a0, 1
|
||||
|
||||
/* Return to C code */
|
||||
ret
|
||||
END(__cpu_suspend_enter)
|
||||
|
||||
ENTRY(__cpu_resume_enter)
|
||||
/* Load the global pointer */
|
||||
.option push
|
||||
.option norelax
|
||||
la gp, __global_pointer$
|
||||
.option pop
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
/* Save A0 and A1 */
|
||||
add t0, a0, zero
|
||||
add t1, a1, zero
|
||||
|
||||
/* Enable MMU */
|
||||
la a0, swapper_pg_dir
|
||||
XIP_FIXUP_OFFSET a0
|
||||
call relocate_enable_mmu
|
||||
|
||||
/* Restore A0 and A1 */
|
||||
add a0, t0, zero
|
||||
add a1, t1, zero
|
||||
#endif
|
||||
|
||||
/* Make A0 point to suspend context */
|
||||
add a0, a1, zero
|
||||
|
||||
/* Restore CSRs */
|
||||
REG_L t0, (SUSPEND_CONTEXT_REGS + PT_EPC)(a0)
|
||||
csrw CSR_EPC, t0
|
||||
REG_L t0, (SUSPEND_CONTEXT_REGS + PT_STATUS)(a0)
|
||||
csrw CSR_STATUS, t0
|
||||
REG_L t0, (SUSPEND_CONTEXT_REGS + PT_BADADDR)(a0)
|
||||
csrw CSR_TVAL, t0
|
||||
REG_L t0, (SUSPEND_CONTEXT_REGS + PT_CAUSE)(a0)
|
||||
csrw CSR_CAUSE, t0
|
||||
|
||||
/* Restore registers (except A0 and T0-T6) */
|
||||
REG_L ra, (SUSPEND_CONTEXT_REGS + PT_RA)(a0)
|
||||
REG_L sp, (SUSPEND_CONTEXT_REGS + PT_SP)(a0)
|
||||
REG_L gp, (SUSPEND_CONTEXT_REGS + PT_GP)(a0)
|
||||
REG_L tp, (SUSPEND_CONTEXT_REGS + PT_TP)(a0)
|
||||
REG_L s0, (SUSPEND_CONTEXT_REGS + PT_S0)(a0)
|
||||
REG_L s1, (SUSPEND_CONTEXT_REGS + PT_S1)(a0)
|
||||
REG_L a1, (SUSPEND_CONTEXT_REGS + PT_A1)(a0)
|
||||
REG_L a2, (SUSPEND_CONTEXT_REGS + PT_A2)(a0)
|
||||
REG_L a3, (SUSPEND_CONTEXT_REGS + PT_A3)(a0)
|
||||
REG_L a4, (SUSPEND_CONTEXT_REGS + PT_A4)(a0)
|
||||
REG_L a5, (SUSPEND_CONTEXT_REGS + PT_A5)(a0)
|
||||
REG_L a6, (SUSPEND_CONTEXT_REGS + PT_A6)(a0)
|
||||
REG_L a7, (SUSPEND_CONTEXT_REGS + PT_A7)(a0)
|
||||
REG_L s2, (SUSPEND_CONTEXT_REGS + PT_S2)(a0)
|
||||
REG_L s3, (SUSPEND_CONTEXT_REGS + PT_S3)(a0)
|
||||
REG_L s4, (SUSPEND_CONTEXT_REGS + PT_S4)(a0)
|
||||
REG_L s5, (SUSPEND_CONTEXT_REGS + PT_S5)(a0)
|
||||
REG_L s6, (SUSPEND_CONTEXT_REGS + PT_S6)(a0)
|
||||
REG_L s7, (SUSPEND_CONTEXT_REGS + PT_S7)(a0)
|
||||
REG_L s8, (SUSPEND_CONTEXT_REGS + PT_S8)(a0)
|
||||
REG_L s9, (SUSPEND_CONTEXT_REGS + PT_S9)(a0)
|
||||
REG_L s10, (SUSPEND_CONTEXT_REGS + PT_S10)(a0)
|
||||
REG_L s11, (SUSPEND_CONTEXT_REGS + PT_S11)(a0)
|
||||
|
||||
/* Return zero value */
|
||||
add a0, zero, zero
|
||||
|
||||
/* Return to C code */
|
||||
ret
|
||||
END(__cpu_resume_enter)
|
||||
@@ -20,14 +20,6 @@
|
||||
#include <asm/csr.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
#if (defined(CONFIG_VECTOR_1_0) && defined(__THEAD_VERSION__))
|
||||
#define V_ST vse8.v
|
||||
#define V_LD vle8.v
|
||||
#else
|
||||
#define V_ST vsb.v
|
||||
#define V_LD vlb.v
|
||||
#endif
|
||||
|
||||
ENTRY(__vstate_save)
|
||||
li a2, TASK_THREAD_V0
|
||||
add a0, a0, a2
|
||||
@@ -46,81 +38,14 @@ ENTRY(__vstate_save)
|
||||
csrr t0, CSR_VTYPE
|
||||
sd t0, TASK_THREAD_VTYPE_V0(a0)
|
||||
|
||||
#ifdef CONFIG_VLEN_256
|
||||
vsetvli t0, x0, e8,m1
|
||||
V_ST v0, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v1, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v2, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v3, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v4, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v5, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v6, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v7, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v8, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v9, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v10, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v11, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v12, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v13, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v14, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v15, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v16, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v17, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v18, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v19, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v20, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v21, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v22, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v23, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v24, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v25, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v26, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v27, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v28, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v29, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v30, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_ST v31, (a0)
|
||||
#else
|
||||
vsetvli t0, x0, e8,m8
|
||||
V_ST v0, (a0)
|
||||
.word 0x003072d7 /* vsetvli t0, x0, e8,m8 */
|
||||
.word 0x02050027 /* vsb.v v0, (a0) */
|
||||
addi a0, a0, RISCV_VECTOR_VLENB*8
|
||||
V_ST v8, (a0)
|
||||
.word 0x02050427 /* vsb.v v8, (a0) */
|
||||
addi a0, a0, RISCV_VECTOR_VLENB*8
|
||||
V_ST v16, (a0)
|
||||
.word 0x02050827 /* vsb.v v16, (a0) */
|
||||
addi a0, a0, RISCV_VECTOR_VLENB*8
|
||||
V_ST v24, (a0)
|
||||
#endif
|
||||
.word 0x02050c27 /* vsb.v v24, (a0) */
|
||||
|
||||
csrc sstatus, t1
|
||||
ret
|
||||
@@ -134,81 +59,14 @@ ENTRY(__vstate_restore)
|
||||
li t1, (SR_VS | SR_FS)
|
||||
csrs sstatus, t1
|
||||
|
||||
#ifdef CONFIG_VLEN_256
|
||||
vsetvli t0, x0, e8,m1
|
||||
V_LD v0, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v1, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v2, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v3, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v4, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v5, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v6, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v7, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v8, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v9, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v10, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v11, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v12, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v13, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v14, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v15, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v16, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v17, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v18, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v19, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v20, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v21, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v22, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v23, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v24, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v25, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v26, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v27, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v28, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v29, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v30, (a0)
|
||||
addi a0, a0, RISCV_VECTOR_VLENB
|
||||
V_LD v31, (a0)
|
||||
#else
|
||||
vsetvli t0, x0, e8,m8
|
||||
V_LD v0, (a0)
|
||||
.word 0x003072d7 /* vsetvli t0, x0, e8,m8 */
|
||||
.word 0x12050007 /* vlb.v v0, (a0) */
|
||||
addi a0, a0, RISCV_VECTOR_VLENB*8
|
||||
V_LD v8, (a0)
|
||||
.word 0x12050407 /* vlb.v v8, (a0) */
|
||||
addi a0, a0, RISCV_VECTOR_VLENB*8
|
||||
V_LD v16, (a0)
|
||||
.word 0x12050807 /* vlb.v v16, (a0) */
|
||||
addi a0, a0, RISCV_VECTOR_VLENB*8
|
||||
V_LD v24, (a0)
|
||||
#endif
|
||||
.word 0x12050c07 /* vlb.v v24, (a0) */
|
||||
|
||||
mv a0, t2
|
||||
ld t0, TASK_THREAD_VSTART_V0(a0)
|
||||
@@ -219,16 +77,9 @@ ENTRY(__vstate_restore)
|
||||
csrw CSR_VXRM, t0
|
||||
ld t0, TASK_THREAD_VL_V0(a0)
|
||||
ld t2, TASK_THREAD_VTYPE_V0(a0)
|
||||
#ifdef CONFIG_VECTOR_EMU
|
||||
srli t3, t2, 63
|
||||
bne t3,zero,1f
|
||||
#endif
|
||||
vsetvl t3, t0, t2
|
||||
#ifdef CONFIG_VECTOR_EMU
|
||||
j 2f
|
||||
1: vsetvli zero,zero,e64,m2,d1
|
||||
2:
|
||||
#endif
|
||||
|
||||
.word 0x8072fe57 /* vsetvl t3, t0, t2 */
|
||||
|
||||
csrc sstatus, t1
|
||||
ret
|
||||
ENDPROC(__vstate_restore)
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (c) 2021 Western Digital Corporation or its affiliates.
|
||||
*
|
||||
* Authors:
|
||||
* Atish Patra <atish.patra@wdc.com>
|
||||
*/
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <asm/csr.h>
|
||||
#include <asm/sbi.h>
|
||||
#include <asm/kvm_vcpu_sbi.h>
|
||||
|
||||
static int kvm_sbi_hsm_vcpu_start(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_cpu_context *reset_cntx;
|
||||
struct kvm_cpu_context *cp = &vcpu->arch.guest_context;
|
||||
struct kvm_vcpu *target_vcpu;
|
||||
unsigned long target_vcpuid = cp->a0;
|
||||
|
||||
target_vcpu = kvm_get_vcpu_by_id(vcpu->kvm, target_vcpuid);
|
||||
if (!target_vcpu)
|
||||
return -EINVAL;
|
||||
if (!target_vcpu->arch.power_off)
|
||||
return -EALREADY;
|
||||
|
||||
reset_cntx = &target_vcpu->arch.guest_reset_context;
|
||||
/* start address */
|
||||
reset_cntx->sepc = cp->a1;
|
||||
/* target vcpu id to start */
|
||||
reset_cntx->a0 = target_vcpuid;
|
||||
/* private data passed from kernel */
|
||||
reset_cntx->a1 = cp->a2;
|
||||
kvm_make_request(KVM_REQ_VCPU_RESET, target_vcpu);
|
||||
|
||||
kvm_riscv_vcpu_power_on(target_vcpu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kvm_sbi_hsm_vcpu_stop(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
if (vcpu->arch.power_off)
|
||||
return -EINVAL;
|
||||
|
||||
kvm_riscv_vcpu_power_off(vcpu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kvm_sbi_hsm_vcpu_get_status(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_cpu_context *cp = &vcpu->arch.guest_context;
|
||||
unsigned long target_vcpuid = cp->a0;
|
||||
struct kvm_vcpu *target_vcpu;
|
||||
|
||||
target_vcpu = kvm_get_vcpu_by_id(vcpu->kvm, target_vcpuid);
|
||||
if (!target_vcpu)
|
||||
return -EINVAL;
|
||||
if (!target_vcpu->arch.power_off)
|
||||
return SBI_HSM_STATE_STARTED;
|
||||
else
|
||||
return SBI_HSM_STATE_STOPPED;
|
||||
}
|
||||
|
||||
static int kvm_sbi_ext_hsm_handler(struct kvm_vcpu *vcpu, struct kvm_run *run,
|
||||
unsigned long *out_val,
|
||||
struct kvm_cpu_trap *utrap,
|
||||
bool *exit)
|
||||
{
|
||||
int ret = 0;
|
||||
struct kvm_cpu_context *cp = &vcpu->arch.guest_context;
|
||||
struct kvm *kvm = vcpu->kvm;
|
||||
unsigned long funcid = cp->a6;
|
||||
|
||||
switch (funcid) {
|
||||
case SBI_EXT_HSM_HART_START:
|
||||
mutex_lock(&kvm->lock);
|
||||
ret = kvm_sbi_hsm_vcpu_start(vcpu);
|
||||
mutex_unlock(&kvm->lock);
|
||||
break;
|
||||
case SBI_EXT_HSM_HART_STOP:
|
||||
ret = kvm_sbi_hsm_vcpu_stop(vcpu);
|
||||
break;
|
||||
case SBI_EXT_HSM_HART_STATUS:
|
||||
ret = kvm_sbi_hsm_vcpu_get_status(vcpu);
|
||||
if (ret >= 0) {
|
||||
*out_val = ret;
|
||||
ret = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
const struct kvm_vcpu_sbi_extension vcpu_sbi_ext_hsm = {
|
||||
.extid_start = SBI_EXT_HSM,
|
||||
.extid_end = SBI_EXT_HSM,
|
||||
.handler = kvm_sbi_ext_hsm_handler,
|
||||
};
|
||||
@@ -8,6 +8,7 @@ source "drivers/eisa/Kconfig"
|
||||
source "drivers/pci/Kconfig"
|
||||
source "drivers/pcmcia/Kconfig"
|
||||
source "drivers/rapidio/Kconfig"
|
||||
source "drivers/nna/Kconfig"
|
||||
|
||||
|
||||
source "drivers/base/Kconfig"
|
||||
|
||||
@@ -45,6 +45,9 @@ obj-$(CONFIG_VIRTIO) += virtio/
|
||||
obj-$(CONFIG_VDPA) += vdpa/
|
||||
obj-$(CONFIG_XEN) += xen/
|
||||
|
||||
# npu-ax3386-gpl driver
|
||||
obj-y += nna/
|
||||
|
||||
# regulators early, since some subsystems rely on them to initialize
|
||||
obj-$(CONFIG_REGULATOR) += regulator/
|
||||
|
||||
|
||||
@@ -1385,13 +1385,14 @@ compress_again:
|
||||
__GFP_KSWAPD_RECLAIM |
|
||||
__GFP_NOWARN |
|
||||
__GFP_HIGHMEM |
|
||||
__GFP_MOVABLE);
|
||||
__GFP_MOVABLE |
|
||||
__GFP_CMA);
|
||||
if (!handle) {
|
||||
zcomp_stream_put(zram->comp);
|
||||
atomic64_inc(&zram->stats.writestall);
|
||||
handle = zs_malloc(zram->mem_pool, comp_len,
|
||||
GFP_NOIO | __GFP_HIGHMEM |
|
||||
__GFP_MOVABLE);
|
||||
__GFP_MOVABLE | __GFP_CMA);
|
||||
if (handle)
|
||||
goto compress_again;
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -50,7 +50,6 @@ static u32 share_cnt_spi_clk_en;
|
||||
static u32 share_cnt_uart0_clk_en;
|
||||
static u32 share_cnt_uart2_clk_en;
|
||||
static u32 share_cnt_i2c2_clk_en;
|
||||
static u32 share_cnt_i2c3_clk_en;
|
||||
static u32 share_cnt_peri_i2s_clk_en;
|
||||
static u32 share_cnt_qspi1_clk_en;
|
||||
static u32 share_cnt_uart1_clk_en;
|
||||
@@ -379,31 +378,31 @@ static int light_clocks_probe(struct platform_device *pdev)
|
||||
clks[AONSYS_BUS_CLK] = thead_clk_fixed("aonsys_hclk", 101606400); //from sys_pll, maybe change ?
|
||||
|
||||
/* Light Fullmask AP MUX */
|
||||
clks[CPU_PLL0_BYPASS] = thead_light_clk_mux_flags("cpu_pll0_bypass", ap_base + 0x4, 30, 1, cpu_pll0_bypass_sels, ARRAY_SIZE(cpu_pll0_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[CPU_PLL1_BYPASS] = thead_light_clk_mux_flags("cpu_pll1_bypass", ap_base + 0x14, 30, 1, cpu_pll1_bypass_sels, ARRAY_SIZE(cpu_pll1_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[GMAC_PLL_BYPASS] = thead_light_clk_mux_flags("gmac_pll_bypass", ap_base + 0x24, 30, 1, gmac_pll_bypass_sels, ARRAY_SIZE(gmac_pll_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[VIDEO_PLL_BYPASS] = thead_light_clk_mux_flags("video_pll_bypass", ap_base + 0x34, 30, 1, video_pll_bypass_sels, ARRAY_SIZE(video_pll_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[TEE_PLL_BYPASS] = thead_light_clk_mux_flags("tee_pll_bypass", ap_base + 0x64, 30, 1, tee_pll_bypass_sels, ARRAY_SIZE(tee_pll_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[DPU0_PLL_BYPASS] = thead_light_clk_mux_flags("dpu0_pll_bypass", ap_base + 0x44, 30, 1, dpu0_pll_bypass_sels, ARRAY_SIZE(dpu0_pll_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[DPU1_PLL_BYPASS] = thead_light_clk_mux_flags("dpu1_pll_bypass", ap_base + 0x54, 30, 1, dpu1_pll_bypass_sels, ARRAY_SIZE(dpu1_pll_bypass_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[CPU_PLL0_BYPASS] = thead_light_clk_mux_flags("cpu_pll0_bypass", ap_base + 0x4, 30, 1, cpu_pll0_bypass_sels, ARRAY_SIZE(cpu_pll0_bypass_sels), CLK_SET_RATE_PARENT);
|
||||
clks[CPU_PLL1_BYPASS] = thead_light_clk_mux_flags("cpu_pll1_bypass", ap_base + 0x14, 30, 1, cpu_pll1_bypass_sels, ARRAY_SIZE(cpu_pll1_bypass_sels), CLK_SET_RATE_PARENT);
|
||||
clks[GMAC_PLL_BYPASS] = thead_light_clk_mux_flags("gmac_pll_bypass", ap_base + 0x24, 30, 1, gmac_pll_bypass_sels, ARRAY_SIZE(gmac_pll_bypass_sels), CLK_SET_RATE_PARENT);
|
||||
clks[VIDEO_PLL_BYPASS] = thead_light_clk_mux_flags("video_pll_bypass", ap_base + 0x34, 30, 1, video_pll_bypass_sels, ARRAY_SIZE(video_pll_bypass_sels), CLK_SET_RATE_PARENT);
|
||||
clks[TEE_PLL_BYPASS] = thead_light_clk_mux_flags("tee_pll_bypass", ap_base + 0x64, 30, 1, tee_pll_bypass_sels, ARRAY_SIZE(tee_pll_bypass_sels), CLK_SET_RATE_PARENT);
|
||||
clks[DPU0_PLL_BYPASS] = thead_light_clk_mux_flags("dpu0_pll_bypass", ap_base + 0x44, 30, 1, dpu0_pll_bypass_sels, ARRAY_SIZE(dpu0_pll_bypass_sels), CLK_SET_RATE_PARENT);
|
||||
clks[DPU1_PLL_BYPASS] = thead_light_clk_mux_flags("dpu1_pll_bypass", ap_base + 0x54, 30, 1, dpu1_pll_bypass_sels, ARRAY_SIZE(dpu1_pll_bypass_sels), CLK_SET_RATE_PARENT);
|
||||
|
||||
clks[AHB2_CPUSYS_HCLK] = thead_light_clk_mux_flags("ahb2_cpusys_hclk", ap_base + 0x120, 5, 1, ahb2_cpusys_hclk_sels, ARRAY_SIZE(ahb2_cpusys_hclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[C910_CCLK_I0] = thead_light_clk_mux_flags("c910_cclk_i0", ap_base + 0x100, 1, 1, c910_cclk_i0_sels, ARRAY_SIZE(c910_cclk_i0_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[C910_CCLK] = thead_light_clk_mux_flags("c910_cclk", ap_base + 0x100, 0, 1, c910_cclk_sels, ARRAY_SIZE(c910_cclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[CFG_AXI_ACLK] = thead_light_clk_mux_flags("cfg_axi_aclk", ap_base + 0x138, 5, 1, cfg_axi_aclk_sels, ARRAY_SIZE(cfg_axi_aclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[AHB2_CPUSYS_HCLK] = thead_light_clk_mux_flags("ahb2_cpusys_hclk", ap_base + 0x120, 5, 1, ahb2_cpusys_hclk_sels, ARRAY_SIZE(ahb2_cpusys_hclk_sels), CLK_SET_RATE_PARENT);
|
||||
clks[C910_CCLK_I0] = thead_light_clk_mux_flags("c910_cclk_i0", ap_base + 0x100, 1, 1, c910_cclk_i0_sels, ARRAY_SIZE(c910_cclk_i0_sels), CLK_SET_RATE_PARENT);
|
||||
clks[C910_CCLK] = thead_light_clk_mux_flags("c910_cclk", ap_base + 0x100, 0, 1, c910_cclk_sels, ARRAY_SIZE(c910_cclk_sels), CLK_SET_RATE_PARENT);
|
||||
clks[CFG_AXI_ACLK] = thead_light_clk_mux_flags("cfg_axi_aclk", ap_base + 0x138, 5, 1, cfg_axi_aclk_sels, ARRAY_SIZE(cfg_axi_aclk_sels), CLK_SET_RATE_PARENT);
|
||||
|
||||
if (teesys)
|
||||
clks[TEESYS_HCLK] = thead_light_clk_mux_flags("teesys_hclk", ap_base + 0x1cc, 13, 1, teesys_hclk_sels, ARRAY_SIZE(teesys_hclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT); //just for teesys!!!
|
||||
clks[TEESYS_HCLK] = thead_light_clk_mux_flags("teesys_hclk", ap_base + 0x1cc, 13, 1, teesys_hclk_sels, ARRAY_SIZE(teesys_hclk_sels), CLK_SET_RATE_PARENT); //just for teesys!!!
|
||||
|
||||
clks[PERISYS_AHB_HCLK] = thead_light_clk_mux_flags("perisys_ahb_hclk", ap_base + 0x140, 5, 1, perisys_ahb_hclk_sels, ARRAY_SIZE(perisys_ahb_hclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[CLK_OUT_1] = thead_light_clk_mux_flags("clk_out_1", ap_base + 0x1b4, 4, 1, clk_out_1_sels, ARRAY_SIZE(clk_out_1_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[CLK_OUT_2] = thead_light_clk_mux_flags("clk_out_2", ap_base + 0x1b8, 4, 1, clk_out_2_sels, ARRAY_SIZE(clk_out_2_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[CLK_OUT_3] = thead_light_clk_mux_flags("clk_out_3", ap_base + 0x1bc, 4, 1, clk_out_3_sels, ARRAY_SIZE(clk_out_3_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[CLK_OUT_4] = thead_light_clk_mux_flags("clk_out_4", ap_base + 0x1c0, 4, 1, clk_out_4_sels, ARRAY_SIZE(clk_out_4_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[PERI_I2S_SRC_CLK] = thead_light_clk_mux_flags("peri_i2s_src_clk", ap_base + 0x1f0, 0, 1, peri_i2s_src_clk_sels, ARRAY_SIZE(peri_i2s_src_clk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[PERISYS_AHB_HCLK] = thead_light_clk_mux_flags("perisys_ahb_hclk", ap_base + 0x140, 5, 1, perisys_ahb_hclk_sels, ARRAY_SIZE(perisys_ahb_hclk_sels), CLK_SET_RATE_PARENT);
|
||||
clks[CLK_OUT_1] = thead_light_clk_mux_flags("clk_out_1", ap_base + 0x1b4, 4, 1, clk_out_1_sels, ARRAY_SIZE(clk_out_1_sels), CLK_SET_RATE_PARENT);
|
||||
clks[CLK_OUT_2] = thead_light_clk_mux_flags("clk_out_2", ap_base + 0x1b8, 4, 1, clk_out_2_sels, ARRAY_SIZE(clk_out_2_sels), CLK_SET_RATE_PARENT);
|
||||
clks[CLK_OUT_3] = thead_light_clk_mux_flags("clk_out_3", ap_base + 0x1bc, 4, 1, clk_out_3_sels, ARRAY_SIZE(clk_out_3_sels), CLK_SET_RATE_PARENT);
|
||||
clks[CLK_OUT_4] = thead_light_clk_mux_flags("clk_out_4", ap_base + 0x1c0, 4, 1, clk_out_4_sels, ARRAY_SIZE(clk_out_4_sels), CLK_SET_RATE_PARENT);
|
||||
clks[PERI_I2S_SRC_CLK] = thead_light_clk_mux_flags("peri_i2s_src_clk", ap_base + 0x1f0, 0, 1, peri_i2s_src_clk_sels, ARRAY_SIZE(peri_i2s_src_clk_sels), CLK_SET_RATE_PARENT);
|
||||
clks[NPU_CCLK] = thead_light_clk_mux_flags("npu_cclk", ap_base + 0x1c8, 6, 1, npu_cclk_sels, ARRAY_SIZE(npu_cclk_sels), CLK_SET_RATE_PARENT);
|
||||
clks[CFG_APB_PCLK] = thead_light_clk_mux_flags("cfg_apb_pclk", ap_base + 0x1c4, 7, 1, cfg_apb_pclk_sels, ARRAY_SIZE(cfg_apb_pclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[UART_SCLK] = thead_light_clk_mux_flags("uart_sclk", ap_base + 0x210, 0, 1, uart_sclk_sels, ARRAY_SIZE(uart_sclk_sels), CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT);
|
||||
clks[CFG_APB_PCLK] = thead_light_clk_mux_flags("cfg_apb_pclk", ap_base + 0x1c4, 7, 1, cfg_apb_pclk_sels, ARRAY_SIZE(cfg_apb_pclk_sels), CLK_SET_RATE_PARENT);
|
||||
clks[UART_SCLK] = thead_light_clk_mux_flags("uart_sclk", ap_base + 0x210, 0, 1, uart_sclk_sels, ARRAY_SIZE(uart_sclk_sels), CLK_SET_RATE_PARENT);
|
||||
|
||||
/* Light Fullmask AP Divider */
|
||||
clks[AHB2_CPUSYS_HCLK_OUT_DIV] = thead_clk_light_divider("ahb2_cpusys_hclk_out_div", "gmac_pll_fout1ph0", ap_base + 0x120, 0, 3, 4, MUX_TYPE_DIV, 2, 7);
|
||||
@@ -437,7 +436,7 @@ static int light_clocks_probe(struct platform_device *pdev)
|
||||
/* Light Fullmask PLL FOUT */
|
||||
clks[GMAC_PLL_FOUT1PH0] = thead_light_clk_fixed_factor("gmac_pll_fout1ph0", "gmac_pll_bypass", 1, 2);
|
||||
clks[GMAC_PLL_FOUT4] = thead_light_clk_fixed_factor("gmac_pll_fout4", "gmac_pll_bypass", 1, 8);
|
||||
clks[VIDEO_PLL_FOUT1PH0] = thead_light_clk_fixed_factor("video_pll_fout1ph0", "video_pll_bypass", 1, 2);
|
||||
clks[VIDEO_PLL_FOUT1PH0] = thead_light_clk_fixed_factor("video_pll_fout1ph0", "video_pll_bybass", 1, 2);
|
||||
clks[VIDEO_PLL_FOUT4] = thead_light_clk_fixed_factor("video_pll_fout4", "video_pll_bypass", 1, 8);
|
||||
clks[TEE_PLL_FOUT4] = thead_light_clk_fixed_factor("tee_pll_fout4", "tee_pll_bypass", 1, 8);
|
||||
clks[CPU_PLL0_FOUT4] = thead_light_clk_fixed_factor("cpu_pll0_fout4", "cpu_pll0_bypass", 1, 8);
|
||||
@@ -451,7 +450,7 @@ static int light_clocks_probe(struct platform_device *pdev)
|
||||
clks[QSPI0_SSI_CLK] = thead_light_clk_fixed_factor("qspi0_ssi_clk", "qspi_ssi_clk", 1, 1);
|
||||
clks[QSPI1_SSI_CLK] = thead_light_clk_fixed_factor("qspi1_ssi_clk", "video_pll_fout1ph0", 1, 1);
|
||||
clks[SPI_SSI_CLK] = thead_light_clk_fixed_factor("spi_ssi_clk", "video_pll_fout1ph0", 1, 1);
|
||||
clks[EMMC_SDIO_REF_CLK] = thead_light_clk_fixed_factor("emmc_sdio_ref_clk", "video_pll_foutpostdiv", 1, 4); /* Note: base clk is div 4 to 198M*/
|
||||
clks[EMMC_SDIO_REF_CLK] = thead_light_clk_fixed_factor("emmc_sdio_ref_clk", "video_pll_foutpostdiv", 1, 1); /* Note: no mux to select, use default value */
|
||||
clks[PWM_CCLK] = thead_light_clk_fixed_factor("pwm_cclk", "osc_24m", 1, 1);
|
||||
clks[CHIP_DBG_CCLK] = thead_light_clk_fixed_factor("chip_dbg_cclk", "osc_24m", 1, 1);
|
||||
clks[GMAC_CCLK] = thead_light_clk_fixed_factor("gmac_cclk", "gmac_pll_fout1ph0", 1, 1);
|
||||
@@ -569,8 +568,8 @@ static int light_clocks_probe(struct platform_device *pdev)
|
||||
clks[CLKGEN_UART2_SCLK] = thead_clk_light_gate_shared("clkgen_uart2_sclk", "uart_sclk", ap_base + 0x204, 12, &share_cnt_uart2_clk_en);
|
||||
clks[CLKGEN_I2C2_PCLK] = thead_clk_light_gate_shared("clkgen_i2c2_pclk", "perisys_apb_pclk", ap_base + 0x204, 3, &share_cnt_i2c2_clk_en);
|
||||
clks[CLKGEN_I2C2_IC_CLK] = thead_clk_light_gate_shared("clkgen_i2c2_ic_clk", "i2c_ic_clk", ap_base + 0x204, 3, &share_cnt_i2c2_clk_en);
|
||||
clks[CLKGEN_I2C3_PCLK] = thead_clk_light_gate_shared("clkgen_i2c3_pclk", "perisys_apb_pclk", ap_base + 0x204, 2, &share_cnt_i2c3_clk_en);
|
||||
clks[CLKGEN_I2C3_IC_CLK] = thead_clk_light_gate_shared("clkgen_i2c3_ic_clk", "i2c_ic_clk", ap_base + 0x204, 2, &share_cnt_i2c3_clk_en);
|
||||
clks[CLKGEN_I2C3_PCLK] = thead_clk_light_gate_shared("clkgen_i2c3_pclk", "perisys_apb_pclk", ap_base + 0x204, 2, &share_cnt_i2c2_clk_en);
|
||||
clks[CLKGEN_I2C3_IC_CLK] = thead_clk_light_gate_shared("clkgen_i2c3_ic_clk", "i2c_ic_clk", ap_base + 0x204, 2, &share_cnt_i2c2_clk_en);
|
||||
clks[CLKGEN_I2S_PCLK] = thead_clk_light_gate_shared("clkgen_i2s_pclk", "perisys_apb_pclk", ap_base + 0x1f0, 1, &share_cnt_peri_i2s_clk_en);
|
||||
clks[CLKGEN_I2S_SRC_CLK] = thead_clk_light_gate_shared("clkgen_i2s_src_clk", "peri_i2s_src_clk", ap_base + 0x1f0, 1, &share_cnt_peri_i2s_clk_en);
|
||||
clks[CLKGEN_QSPI1_PCLK] = thead_clk_light_gate_shared("clkgen_qspi1_pclk", "peri2sys_apb_pclk", ap_base + 0x204, 16, &share_cnt_qspi1_clk_en);
|
||||
|
||||
@@ -111,7 +111,7 @@ static inline struct clk *thead_light_clk_mux_flags(const char *name,
|
||||
unsigned long flags)
|
||||
{
|
||||
return clk_register_mux(NULL, name, parents, num_parents,
|
||||
flags , reg, shift, width, 0,
|
||||
flags | CLK_SET_RATE_NO_REPARENT, reg, shift, width, 0,
|
||||
&thead_light_clk_lock);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
obj-$(CONFIG_CLK_LIGHT_FM) += thead-gate.o visys-gate.o vpsys-gate.o vosys-gate.o dspsys-gate.o audiosys-gate.o miscsys-gate.o
|
||||
obj-$(CONFIG_CLK_LIGHT_FM) += thead-gate.o visys-gate.o vpsys-gate.o vosys-gate.o dspsys-gate.o audiosys-gate.o
|
||||
|
||||
@@ -20,16 +20,12 @@
|
||||
|
||||
static struct clk *gates[LIGHT_CLKGEN_DSPSYS_CLK_END];
|
||||
static struct clk_onecell_data clk_gate_data;
|
||||
static const char * const dsp0_cclk_sels[] = {"gmac_pll_foutpostdiv", "dspsys_dsp_clk"};
|
||||
static const char * const dsp1_cclk_sels[] = {"gmac_pll_foutpostdiv", "dspsys_dsp_clk"};
|
||||
|
||||
static int light_dspsys_clk_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *dspsys_regmap, *tee_dspsys_regmap;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
struct device_node *np_reg = of_parse_phandle(np, "dspsys-regmap", 0);
|
||||
void __iomem *gate_base;
|
||||
int ret;
|
||||
|
||||
dspsys_regmap = syscon_regmap_lookup_by_phandle(np, "dspsys-regmap");
|
||||
@@ -43,24 +39,14 @@ static int light_dspsys_clk_probe(struct platform_device *pdev)
|
||||
dev_warn(&pdev->dev, "cannot find regmap for tee dsp system register\n");
|
||||
tee_dspsys_regmap = NULL;
|
||||
}
|
||||
gate_base = of_iomap(np_reg,0);
|
||||
// MUX
|
||||
gates[DSPSYS_DSP0_CLK_SWITCH] = thead_light_clk_mux_flags("dspsys_dsp0_clk_switch", gate_base + 0x1c, 0, 1, dsp0_cclk_sels, ARRAY_SIZE(dsp0_cclk_sels), 0);
|
||||
gates[DSPSYS_DSP1_CLK_SWITCH] = thead_light_clk_mux_flags("dspsys_dsp1_clk_switch", gate_base + 0x20, 0, 1, dsp1_cclk_sels, ARRAY_SIZE(dsp1_cclk_sels), 0);
|
||||
|
||||
// DIV & CDE
|
||||
gates[DSPSYS_DSP_CLK] = thead_light_clk_fixed_factor("dspsys_dsp_clk", "video_pll_foutvco", 1, 3);
|
||||
gates[DSPSYS_DSP0_CLK_CDE] = thead_clk_light_divider("dspsys_dsp0_clk_cde", "dspsys_dsp0_clk_switch", gate_base + 0x0, 0, 3, 4, MUX_TYPE_CDE, 0, 7);
|
||||
gates[DSPSYS_DSP1_CLK_CDE] = thead_clk_light_divider("dspsys_dsp1_clk_cde", "dspsys_dsp1_clk_switch", gate_base + 0x4, 0, 3, 4, MUX_TYPE_CDE, 0, 7);
|
||||
|
||||
// gate
|
||||
gates[CLKGEN_DSP0_PCLK] = thead_gate_clk_register("clkgen_dsp0_pclk", NULL, dspsys_regmap,
|
||||
0x24, 0, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_DSP1_PCLK] = thead_gate_clk_register("clkgen_dsp1_pclk", NULL, dspsys_regmap,
|
||||
0x24, 1, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_DSP1_CCLK] = thead_gate_clk_register("clkgen_dsp1_cclk", "dspsys_dsp1_clk_cde", dspsys_regmap,
|
||||
gates[CLKGEN_DSP1_CCLK] = thead_gate_clk_register("clkgen_dsp1_cclk", NULL, dspsys_regmap,
|
||||
0x24, 2, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_DSP0_CCLK] = thead_gate_clk_register("clkgen_dsp0_cclk", "dspsys_dsp0_clk_cde", dspsys_regmap,
|
||||
gates[CLKGEN_DSP0_CCLK] = thead_gate_clk_register("clkgen_dsp0_cclk", NULL, dspsys_regmap,
|
||||
0x24, 3, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_X2X_DSP2_ACLK_S] = thead_gate_clk_register("clkgen_x2x_dsp2_aclk_s", NULL, dspsys_regmap,
|
||||
0x24, 4, GATE_NOT_SHARED, NULL, dev);
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2022 Alibaba Group Holding Limited.
|
||||
*/
|
||||
#include <dt-bindings/clock/light-miscsys.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/types.h>
|
||||
#include "clk-gate.h"
|
||||
#include "../clk.h"
|
||||
static struct clk *gates[CLKGEN_MISCSYS_CLK_END];
|
||||
static struct clk_onecell_data clk_gate_data;
|
||||
static int light_miscsys_clk_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *miscsys_regmap, *tee_miscsys_regmap = NULL;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
int ret;
|
||||
|
||||
miscsys_regmap = syscon_regmap_lookup_by_phandle(np, "miscsys-regmap");
|
||||
if (IS_ERR(miscsys_regmap)) {
|
||||
dev_err(&pdev->dev, "cannot find regmap for misc system register\n");
|
||||
return PTR_ERR(miscsys_regmap);
|
||||
}
|
||||
tee_miscsys_regmap = syscon_regmap_lookup_by_phandle(np, "tee-miscsys-regmap");
|
||||
if (IS_ERR(tee_miscsys_regmap)) {
|
||||
dev_err(&pdev->dev, "cannot find regmap for tee misc system register\n");
|
||||
return PTR_ERR(tee_miscsys_regmap);
|
||||
}
|
||||
/* we assume that the gate clock is a root clock */
|
||||
gates[CLKGEN_MISCSYS_MISCSYS_ACLK] = thead_gate_clk_register("clkgen_missys_aclk", NULL,
|
||||
miscsys_regmap, 0x100, 0, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_USB3_DRD_CLK] = thead_gate_clk_register("clkgen_usb3_drd_clk", NULL,
|
||||
miscsys_regmap, 0x104, 0, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_USB3_DRD_CTRL_REF_CLK] = thead_gate_clk_register("clkgen_usb3_drd_ctrl_ref_clk", "osc_24m",
|
||||
miscsys_regmap, 0x104, 1, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_USB3_DRD_PHY_REF_CLK] = thead_gate_clk_register("clkgen_usb3_drd_phy_ref_clk", "osc_24m",
|
||||
miscsys_regmap, 0x104, 2, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_USB3_DRD_SUSPEND_CLK] = thead_gate_clk_register("clkgen_usb3_drd_suspend_clk", NULL,
|
||||
miscsys_regmap, 0x104, 3, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_EMMC_CLK] = thead_gate_clk_register("clkgen_emmc_clk", "osc_24m",
|
||||
miscsys_regmap, 0x108, 0, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_SDIO0_CLK] = thead_gate_clk_register("clkgen_sdio0_clk", "osc_24m",
|
||||
miscsys_regmap, 0x10c, 0, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_SDIO1_CLK] = thead_gate_clk_register("clkgen_sdio1_clk", "osc_24m",
|
||||
miscsys_regmap, 0x110, 0, GATE_NOT_SHARED, NULL, dev);
|
||||
if (tee_miscsys_regmap) {
|
||||
gates[CLKGEN_MISCSYS_AHB2_TEESYS_HCLK] = thead_gate_clk_register("clkgen_ahb2_teesys_hclk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 0, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_APB3_TEESYS_HCLK] = thead_gate_clk_register("clkgen_apb3_teesys_hclk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 1, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_AXI4_TEESYS_ACLK] = thead_gate_clk_register("clkgen_axi4_teesys_aclk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 2, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_EIP120SI_CLK] = thead_gate_clk_register("clkgen_eip120si_clk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 3, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_EIP120SII_CLK] = thead_gate_clk_register("clkgen_eip120sii_clk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 4, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_EIP120SIII_CLK] = thead_gate_clk_register("clkgen_eip120siii_clk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 5, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_TEEDMAC_CLK] = thead_gate_clk_register("clkgen_teedmac_clk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 6, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_EIP150B_HCLK] = thead_gate_clk_register("clkgen_eip150b_hclk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 7, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_OCRAM_HCLK] = thead_gate_clk_register("clkgen_ocram_hclk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 8, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_EFUSE_PCLK] = thead_gate_clk_register("clkgen_efuse_pclk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 9, GATE_NOT_SHARED, NULL, dev);
|
||||
gates[CLKGEN_MISCSYS_TEE_SYSREG_PCLK] = thead_gate_clk_register("clkgen_tee_sysreg_pclk", NULL,
|
||||
tee_miscsys_regmap, 0x120, 10, GATE_NOT_SHARED, NULL, dev);
|
||||
}
|
||||
clk_gate_data.clks = gates;
|
||||
clk_gate_data.clk_num = ARRAY_SIZE(gates);
|
||||
ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_gate_data);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to register gate clks for light miscsys\n");
|
||||
goto unregister_clks;
|
||||
}
|
||||
dev_info(dev, "succeed to register miscsys gate clock provider\n");
|
||||
return 0;
|
||||
unregister_clks:
|
||||
thead_unregister_clocks(gates, ARRAY_SIZE(gates));
|
||||
return ret;
|
||||
}
|
||||
static const struct of_device_id miscsys_clk_gate_of_match[] = {
|
||||
{ .compatible = "thead,miscsys-gate-controller" },
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, miscsys_clk_gate_of_match);
|
||||
static struct platform_driver light_miscsys_clk_driver = {
|
||||
.probe = light_miscsys_clk_probe,
|
||||
.driver = {
|
||||
.name = "miscsys-clk-gate-provider",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(miscsys_clk_gate_of_match),
|
||||
},
|
||||
};
|
||||
module_platform_driver(light_miscsys_clk_driver);
|
||||
MODULE_AUTHOR("wei.liu <lw312886@linux.alibaba.com>");
|
||||
MODULE_AUTHOR("Esther.Z <Esther.Z@linux.alibaba.com>");
|
||||
MODULE_DESCRIPTION("Thead Light Fullmask miscsys clock gate provider");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
@@ -34,18 +34,15 @@ static int light_vpsys_clk_probe(struct platform_device *pdev)
|
||||
if (WARN_ON(IS_ERR(gate_base)))
|
||||
return PTR_ERR(gate_base);
|
||||
|
||||
// DIV & CDE
|
||||
gates[LIGHT_VPSYS_G2D_CCLK_DIV] = thead_clk_light_divider("light_vpsys_g2d_cclk_div", "video_pll_foutvco", gate_base + 0x30, 0, 4, 4, MUX_TYPE_DIV, 3, 9);
|
||||
|
||||
/* G2D clock configuration : Completed the upward configuration of CCLK */
|
||||
/* we assume that the gate clock is a root clock */
|
||||
gates[LIGHT_VPSYS_G2D_PCLK] = thead_clk_light_gate_shared("clkgen_vpsys_g2d_pclk", NULL,
|
||||
gate_base + 0x20, 3, &share_cnt_g2d_clk_en);
|
||||
gates[LIGHT_VPSYS_G2D_ACLK] = thead_clk_light_gate_shared("clkgen_vpsys_g2d_aclk", NULL,
|
||||
gate_base + 0x20, 3, &share_cnt_g2d_clk_en);
|
||||
gates[LIGHT_VPSYS_G2D_CCLK] = thead_clk_light_gate_shared("clkgen_vpsys_g2d_cclk", "light_vpsys_g2d_cclk_div",
|
||||
gates[LIGHT_VPSYS_G2D_CCLK] = thead_clk_light_gate_shared("clkgen_vpsys_g2d_cclk", NULL,
|
||||
gate_base + 0x20, 3, &share_cnt_g2d_clk_en);
|
||||
|
||||
/* we assume that the gate clock is a root clock */
|
||||
|
||||
gates[LIGHT_VPSYS_FCE_PCLK] = thead_clk_light_gate_shared("clkgen_vpsys_fce_pclk", NULL,
|
||||
gate_base + 0x20, 2, &share_cnt_fce_clk_en);
|
||||
gates[LIGHT_VPSYS_FCE_ACLK] = thead_clk_light_gate_shared("clkgen_vpsys_fce_aclk", NULL,
|
||||
|
||||
@@ -34,15 +34,12 @@ enum LIGHT_MPW_CPUFREQ_CLKS {
|
||||
};
|
||||
|
||||
#define LIGHT_MPW_CPUFREQ_CLK_NUM 4
|
||||
#define LIGHT_CPUFREQ_THRE 1500000
|
||||
#define LIGHT_CPUFREQ_THRE 2000000
|
||||
#define LIGHT_C910_BUS_CLK_SYNC BIT(11)
|
||||
#define LIGHT_C910_BUS_CLK_RATIO_MASK 0x700
|
||||
#define LIGHT_C910_BUS_CLK_DIV_RATIO_2 0x100
|
||||
#define LIGHT_C910_BUS_CLK_DIV_RATIO_3 0x200
|
||||
|
||||
#define LIGHT_CPU_PLL_IDX(x) (x)
|
||||
#define LIGHT_CPU_PLL_COUNT 2
|
||||
|
||||
static int num_clks;
|
||||
static struct clk_bulk_data clks[] = {
|
||||
{ .id = "c910_cclk" },
|
||||
@@ -54,7 +51,6 @@ static struct clk_bulk_data clks[] = {
|
||||
static struct device *cpu_dev;
|
||||
static struct cpufreq_frequency_table *freq_table;
|
||||
static unsigned int max_freq;
|
||||
static unsigned int min_freq;
|
||||
static unsigned int transition_latency;
|
||||
static void __iomem *ap_sys_reg;
|
||||
static bool light_dvfs_sv = false;
|
||||
@@ -62,40 +58,6 @@ static bool light_dvfs_sv = false;
|
||||
static u32 *light_dvddm_volt;
|
||||
static u32 soc_opp_count = 0;
|
||||
|
||||
static int _light_get_pllid(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!strcmp(__clk_get_name(clk_get_parent(clks[LIGHT_C910_CCLK].clk)),
|
||||
__clk_get_name(clks[LIGHT_C910_CCLK_I0].clk))) // pll index 0
|
||||
ret = LIGHT_CPU_PLL_IDX(0);
|
||||
else // pll index 1
|
||||
ret = LIGHT_CPU_PLL_IDX(1);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int _light_switch_pllid(int pllid, int target_freq)
|
||||
{
|
||||
pr_debug("[%s] switchto pll[%d], freq[%u]\n", __func__, pllid, target_freq);
|
||||
if (pllid == LIGHT_CPU_PLL_IDX(1)) {
|
||||
clk_prepare_enable(clks[LIGHT_CPU_PLL1_FOUTPOSTDIV].clk);
|
||||
clk_set_rate(clks[LIGHT_CPU_PLL1_FOUTPOSTDIV].clk, target_freq * 1000);
|
||||
clk_set_parent(clks[LIGHT_C910_CCLK].clk, clks[LIGHT_CPU_PLL1_FOUTPOSTDIV].clk);
|
||||
udelay(1);
|
||||
clk_disable_unprepare(clks[LIGHT_CPU_PLL0_FOUTPOSTDIV].clk);
|
||||
} else {
|
||||
clk_prepare_enable(clks[LIGHT_CPU_PLL0_FOUTPOSTDIV].clk);
|
||||
clk_set_rate(clks[LIGHT_CPU_PLL0_FOUTPOSTDIV].clk, target_freq * 1000);
|
||||
clk_set_parent(clks[LIGHT_C910_CCLK].clk, clks[LIGHT_C910_CCLK_I0].clk);
|
||||
udelay(1);
|
||||
clk_disable_unprepare(clks[LIGHT_CPU_PLL1_FOUTPOSTDIV].clk);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int light_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
{
|
||||
struct dev_pm_opp *opp;
|
||||
@@ -178,8 +140,20 @@ static int light_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
}
|
||||
}
|
||||
|
||||
/* switch pll */
|
||||
_light_switch_pllid((_light_get_pllid()+1)&(LIGHT_CPU_PLL_COUNT-1), new_freq);
|
||||
if (!strcmp(__clk_get_name(clk_get_parent(clks[LIGHT_C910_CCLK].clk)),
|
||||
__clk_get_name(clks[LIGHT_C910_CCLK_I0].clk))) {
|
||||
clk_prepare_enable(clks[LIGHT_CPU_PLL1_FOUTPOSTDIV].clk);
|
||||
clk_set_rate(clks[LIGHT_CPU_PLL1_FOUTPOSTDIV].clk, new_freq * 1000);
|
||||
ret = clk_set_parent(clks[LIGHT_C910_CCLK].clk, clks[LIGHT_CPU_PLL1_FOUTPOSTDIV].clk);
|
||||
udelay(1);
|
||||
clk_disable_unprepare(clks[LIGHT_CPU_PLL0_FOUTPOSTDIV].clk);
|
||||
} else {
|
||||
clk_prepare_enable(clks[LIGHT_CPU_PLL0_FOUTPOSTDIV].clk);
|
||||
clk_set_rate(clks[LIGHT_CPU_PLL0_FOUTPOSTDIV].clk, new_freq * 1000);
|
||||
ret = clk_set_parent(clks[LIGHT_C910_CCLK].clk, clks[LIGHT_C910_CCLK_I0].clk);
|
||||
udelay(1);
|
||||
clk_disable_unprepare(clks[LIGHT_CPU_PLL1_FOUTPOSTDIV].clk);
|
||||
}
|
||||
|
||||
/*add delay for clk-switch*/
|
||||
udelay(1);
|
||||
@@ -226,35 +200,6 @@ static int light_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int light_cpufreq_suspend(struct cpufreq_policy *policy)
|
||||
{
|
||||
int ret;
|
||||
int index;
|
||||
|
||||
pr_debug("%s: cpu: %d, %u KHz to %u KHz\n",
|
||||
__func__, policy->cpu, policy->cur, policy->suspend_freq);
|
||||
|
||||
ret = cpufreq_generic_suspend(policy);
|
||||
if (ret) {
|
||||
pr_err("%s: failed\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Only CPU PLL0 would be active after STR resume. We should switch
|
||||
* CPU PLL to be PLL0 after policy stopped.
|
||||
*/
|
||||
if (_light_get_pllid() == LIGHT_CPU_PLL_IDX(1))
|
||||
_light_switch_pllid(LIGHT_CPU_PLL_IDX(0), policy->suspend_freq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int light_cpufreq_resume(struct cpufreq_policy *policy)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int light_cpufreq_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
policy->clk = clks[LIGHT_C910_CCLK].clk;
|
||||
@@ -289,8 +234,7 @@ static struct cpufreq_driver light_cpufreq_driver = {
|
||||
.init = light_cpufreq_init,
|
||||
.name = "light-cpufreq",
|
||||
.attr = cpufreq_generic_attr,
|
||||
.suspend = light_cpufreq_suspend,
|
||||
.resume = light_cpufreq_resume,
|
||||
.suspend = cpufreq_generic_suspend,
|
||||
};
|
||||
|
||||
static int light_cpufreq_pm_notify(struct notifier_block *nb,
|
||||
@@ -330,9 +274,15 @@ static int panic_cpufreq_notifier_call(struct notifier_block *nb,
|
||||
* set CPU PLL1's frequency as minimum to compatible voltage
|
||||
* becarefull if the PLL1 is serving the cpu core, swith to PLL0 first
|
||||
*/
|
||||
if (_light_get_pllid() == LIGHT_CPU_PLL_IDX(1)) {
|
||||
if (strcmp(__clk_get_name(clk_get_parent(clks[LIGHT_C910_CCLK].clk)),
|
||||
__clk_get_name(clks[LIGHT_C910_CCLK_I0].clk))) {
|
||||
pr_debug("[%s,%d]\n", __func__, __LINE__);
|
||||
clk_prepare_enable(clks[LIGHT_CPU_PLL0_FOUTPOSTDIV].clk);
|
||||
clk_set_rate(clks[LIGHT_CPU_PLL0_FOUTPOSTDIV].clk, policy->min * 1000);
|
||||
udelay(1);
|
||||
clk_set_parent(clks[LIGHT_C910_CCLK].clk, clks[LIGHT_C910_CCLK_I0].clk);
|
||||
|
||||
pr_debug("[%s,%d]\n", __func__, __LINE__);
|
||||
_light_switch_pllid(LIGHT_CPU_PLL_IDX(0), policy->min);
|
||||
}
|
||||
|
||||
pr_debug("[%s,%d]\n", __func__, __LINE__);
|
||||
@@ -342,7 +292,9 @@ static int panic_cpufreq_notifier_call(struct notifier_block *nb,
|
||||
* set the CPU PLL1's frequency as minimum in advance, otherwise the
|
||||
* system may crash in crash kernel stage.
|
||||
*/
|
||||
_light_switch_pllid(LIGHT_CPU_PLL_IDX(1), policy->min);
|
||||
clk_prepare_enable(clks[LIGHT_CPU_PLL1_FOUTPOSTDIV].clk);
|
||||
clk_set_rate(clks[LIGHT_CPU_PLL1_FOUTPOSTDIV].clk, policy->min * 1000);
|
||||
udelay(1);
|
||||
|
||||
pr_info("finish to execute cpufreq notifier callback on panic\n");
|
||||
|
||||
@@ -459,7 +411,6 @@ soc_opp_out:
|
||||
transition_latency = CPUFREQ_ETERNAL;
|
||||
|
||||
max_freq = freq_table[--num].frequency;
|
||||
min_freq = freq_table[0].frequency;
|
||||
|
||||
ret = cpufreq_register_driver(&light_cpufreq_driver);
|
||||
if (ret) {
|
||||
|
||||
@@ -47,10 +47,6 @@ config CPU_IDLE_GOV_HALTPOLL
|
||||
config DT_IDLE_STATES
|
||||
bool
|
||||
|
||||
config DT_IDLE_GENPD
|
||||
depends on PM_GENERIC_DOMAINS_OF
|
||||
bool
|
||||
|
||||
menu "ARM CPU Idle Drivers"
|
||||
depends on ARM || ARM64
|
||||
source "drivers/cpuidle/Kconfig.arm"
|
||||
|
||||
@@ -27,7 +27,6 @@ config ARM_PSCI_CPUIDLE_DOMAIN
|
||||
bool "PSCI CPU idle Domain"
|
||||
depends on ARM_PSCI_CPUIDLE
|
||||
depends on PM_GENERIC_DOMAINS_OF
|
||||
select DT_IDLE_GENPD
|
||||
default y
|
||||
help
|
||||
Select this to enable the PSCI based CPUidle driver to use PM domains,
|
||||
|
||||
@@ -11,13 +11,3 @@ config LIGHT_CPUIDLE
|
||||
Select this option to enable processor idle state management
|
||||
through cpuidle subsystem.
|
||||
|
||||
config RISCV_SBI_CPUIDLE
|
||||
bool "RISC-V SBI CPU idle Driver"
|
||||
depends on RISCV_SBI
|
||||
select DT_IDLE_STATES
|
||||
select CPU_IDLE_MULTIPLE_DRIVERS
|
||||
select DT_IDLE_GENPD if PM_GENERIC_DOMAINS_OF
|
||||
help
|
||||
Select this option to enable RISC-V SBI firmware based CPU idle
|
||||
driver for RISC-V systems. This drivers also supports hierarchical
|
||||
DT based layout of the idle state.
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
obj-y += cpuidle.o driver.o governor.o sysfs.o governors/
|
||||
obj-$(CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED) += coupled.o
|
||||
obj-$(CONFIG_DT_IDLE_STATES) += dt_idle_states.o
|
||||
obj-$(CONFIG_DT_IDLE_GENPD) += dt_idle_genpd.o
|
||||
obj-$(CONFIG_ARCH_HAS_CPU_RELAX) += poll_state.o
|
||||
obj-$(CONFIG_HALTPOLL_CPUIDLE) += cpuidle-haltpoll.o
|
||||
|
||||
@@ -35,8 +34,6 @@ obj-$(CONFIG_MIPS_CPS_CPUIDLE) += cpuidle-cps.o
|
||||
# POWERPC drivers
|
||||
obj-$(CONFIG_PSERIES_CPUIDLE) += cpuidle-pseries.o
|
||||
obj-$(CONFIG_POWERNV_CPUIDLE) += cpuidle-powernv.o
|
||||
|
||||
###############################################################################
|
||||
# RISC-V drivers
|
||||
obj-$(CONFIG_LIGHT_CPUIDLE) += cpuidle-light.o
|
||||
obj-$(CONFIG_RISCV_SBI_CPUIDLE) += cpuidle-riscv-sbi.o
|
||||
|
||||
@@ -47,14 +47,73 @@ static int psci_pd_power_off(struct generic_pm_domain *pd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int psci_pd_parse_state_nodes(struct genpd_power_state *states,
|
||||
int state_count)
|
||||
{
|
||||
int i, ret;
|
||||
u32 psci_state, *psci_state_buf;
|
||||
|
||||
for (i = 0; i < state_count; i++) {
|
||||
ret = psci_dt_parse_state_node(to_of_node(states[i].fwnode),
|
||||
&psci_state);
|
||||
if (ret)
|
||||
goto free_state;
|
||||
|
||||
psci_state_buf = kmalloc(sizeof(u32), GFP_KERNEL);
|
||||
if (!psci_state_buf) {
|
||||
ret = -ENOMEM;
|
||||
goto free_state;
|
||||
}
|
||||
*psci_state_buf = psci_state;
|
||||
states[i].data = psci_state_buf;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
free_state:
|
||||
i--;
|
||||
for (; i >= 0; i--)
|
||||
kfree(states[i].data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int psci_pd_parse_states(struct device_node *np,
|
||||
struct genpd_power_state **states, int *state_count)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Parse the domain idle states. */
|
||||
ret = of_genpd_parse_idle_states(np, states, state_count);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Fill out the PSCI specifics for each found state. */
|
||||
ret = psci_pd_parse_state_nodes(*states, *state_count);
|
||||
if (ret)
|
||||
kfree(*states);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void psci_pd_free_states(struct genpd_power_state *states,
|
||||
unsigned int state_count)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < state_count; i++)
|
||||
kfree(states[i].data);
|
||||
kfree(states);
|
||||
}
|
||||
|
||||
static int psci_pd_init(struct device_node *np, bool use_osi)
|
||||
{
|
||||
struct generic_pm_domain *pd;
|
||||
struct psci_pd_provider *pd_provider;
|
||||
struct dev_power_governor *pd_gov;
|
||||
struct genpd_power_state *states = NULL;
|
||||
int ret = -ENOMEM, state_count = 0;
|
||||
|
||||
pd = dt_idle_pd_alloc(np, psci_dt_parse_state_node);
|
||||
pd = kzalloc(sizeof(*pd), GFP_KERNEL);
|
||||
if (!pd)
|
||||
goto out;
|
||||
|
||||
@@ -62,6 +121,22 @@ static int psci_pd_init(struct device_node *np, bool use_osi)
|
||||
if (!pd_provider)
|
||||
goto free_pd;
|
||||
|
||||
pd->name = kasprintf(GFP_KERNEL, "%pOF", np);
|
||||
if (!pd->name)
|
||||
goto free_pd_prov;
|
||||
|
||||
/*
|
||||
* Parse the domain idle states and let genpd manage the state selection
|
||||
* for those being compatible with "domain-idle-state".
|
||||
*/
|
||||
ret = psci_pd_parse_states(np, &states, &state_count);
|
||||
if (ret)
|
||||
goto free_name;
|
||||
|
||||
pd->free_states = psci_pd_free_states;
|
||||
pd->name = kbasename(pd->name);
|
||||
pd->states = states;
|
||||
pd->state_count = state_count;
|
||||
pd->flags |= GENPD_FLAG_IRQ_SAFE | GENPD_FLAG_CPU_DOMAIN;
|
||||
|
||||
/* Allow power off when OSI has been successfully enabled. */
|
||||
@@ -74,8 +149,10 @@ static int psci_pd_init(struct device_node *np, bool use_osi)
|
||||
pd_gov = state_count > 0 ? &pm_domain_cpu_gov : NULL;
|
||||
|
||||
ret = pm_genpd_init(pd, pd_gov, false);
|
||||
if (ret)
|
||||
goto free_pd_prov;
|
||||
if (ret) {
|
||||
psci_pd_free_states(states, state_count);
|
||||
goto free_name;
|
||||
}
|
||||
|
||||
ret = of_genpd_add_provider_simple(np, pd);
|
||||
if (ret)
|
||||
@@ -89,10 +166,12 @@ static int psci_pd_init(struct device_node *np, bool use_osi)
|
||||
|
||||
remove_pd:
|
||||
pm_genpd_remove(pd);
|
||||
free_name:
|
||||
kfree(pd->name);
|
||||
free_pd_prov:
|
||||
kfree(pd_provider);
|
||||
free_pd:
|
||||
dt_idle_pd_free(pd);
|
||||
kfree(pd);
|
||||
out:
|
||||
pr_err("failed to init PM domain ret=%d %pOF\n", ret, np);
|
||||
return ret;
|
||||
@@ -116,6 +195,30 @@ static void psci_pd_remove(void)
|
||||
}
|
||||
}
|
||||
|
||||
static int psci_pd_init_topology(struct device_node *np)
|
||||
{
|
||||
struct device_node *node;
|
||||
struct of_phandle_args child, parent;
|
||||
int ret;
|
||||
|
||||
for_each_child_of_node(np, node) {
|
||||
if (of_parse_phandle_with_args(node, "power-domains",
|
||||
"#power-domain-cells", 0, &parent))
|
||||
continue;
|
||||
|
||||
child.np = node;
|
||||
child.args_count = 0;
|
||||
ret = of_genpd_add_subdomain(&parent, &child);
|
||||
of_node_put(parent.np);
|
||||
if (ret) {
|
||||
of_node_put(node);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool psci_pd_try_set_osi_mode(void)
|
||||
{
|
||||
int ret;
|
||||
@@ -179,7 +282,7 @@ static int psci_cpuidle_domain_probe(struct platform_device *pdev)
|
||||
goto no_pd;
|
||||
|
||||
/* Link genpd masters/subdomains to model the CPU topology. */
|
||||
ret = dt_idle_pd_init_topology(np);
|
||||
ret = psci_pd_init_topology(np);
|
||||
if (ret)
|
||||
goto remove_pd;
|
||||
|
||||
@@ -211,3 +314,28 @@ static int __init psci_idle_init_domains(void)
|
||||
return platform_driver_register(&psci_cpuidle_domain_driver);
|
||||
}
|
||||
subsys_initcall(psci_idle_init_domains);
|
||||
|
||||
struct device *psci_dt_attach_cpu(int cpu)
|
||||
{
|
||||
struct device *dev;
|
||||
|
||||
dev = dev_pm_domain_attach_by_name(get_cpu_device(cpu), "psci");
|
||||
if (IS_ERR_OR_NULL(dev))
|
||||
return dev;
|
||||
|
||||
pm_runtime_irq_safe(dev);
|
||||
if (cpu_online(cpu))
|
||||
pm_runtime_get_sync(dev);
|
||||
|
||||
dev_pm_syscore_device(dev, true);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
void psci_dt_detach_cpu(struct device *dev)
|
||||
{
|
||||
if (IS_ERR_OR_NULL(dev))
|
||||
return;
|
||||
|
||||
dev_pm_domain_detach(dev, false);
|
||||
}
|
||||
|
||||
@@ -10,19 +10,8 @@ void psci_set_domain_state(u32 state);
|
||||
int psci_dt_parse_state_node(struct device_node *np, u32 *state);
|
||||
|
||||
#ifdef CONFIG_ARM_PSCI_CPUIDLE_DOMAIN
|
||||
|
||||
#include "dt_idle_genpd.h"
|
||||
|
||||
static inline struct device *psci_dt_attach_cpu(int cpu)
|
||||
{
|
||||
return dt_idle_attach_cpu(cpu, "psci");
|
||||
}
|
||||
|
||||
static inline void psci_dt_detach_cpu(struct device *dev)
|
||||
{
|
||||
dt_idle_detach_cpu(dev);
|
||||
}
|
||||
|
||||
struct device *psci_dt_attach_cpu(int cpu);
|
||||
void psci_dt_detach_cpu(struct device *dev);
|
||||
#else
|
||||
static inline struct device *psci_dt_attach_cpu(int cpu) { return NULL; }
|
||||
static inline void psci_dt_detach_cpu(struct device *dev) { }
|
||||
|
||||
@@ -1,639 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* RISC-V SBI CPU idle driver.
|
||||
*
|
||||
* Copyright (c) 2021 Western Digital Corporation or its affiliates.
|
||||
* Copyright (c) 2022 Ventana Micro Systems Inc.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "cpuidle-riscv-sbi: " fmt
|
||||
|
||||
#include <linux/cpuidle.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/cpu_pm.h>
|
||||
#include <linux/cpu_cooling.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_domain.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <asm/cpuidle.h>
|
||||
#include <asm/sbi.h>
|
||||
#include <asm/suspend.h>
|
||||
|
||||
#include "dt_idle_states.h"
|
||||
#include "dt_idle_genpd.h"
|
||||
|
||||
struct sbi_cpuidle_data {
|
||||
u32 *states;
|
||||
struct device *dev;
|
||||
};
|
||||
|
||||
struct sbi_domain_state {
|
||||
bool available;
|
||||
u32 state;
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU_READ_MOSTLY(struct sbi_cpuidle_data, sbi_cpuidle_data);
|
||||
static DEFINE_PER_CPU(struct sbi_domain_state, domain_state);
|
||||
static bool sbi_cpuidle_use_osi;
|
||||
static bool sbi_cpuidle_use_cpuhp;
|
||||
static bool sbi_cpuidle_pd_allow_domain_state;
|
||||
|
||||
extern void arch_cpu_idle(void);
|
||||
|
||||
static inline void sbi_set_domain_state(u32 state)
|
||||
{
|
||||
struct sbi_domain_state *data = this_cpu_ptr(&domain_state);
|
||||
|
||||
data->available = true;
|
||||
data->state = state;
|
||||
}
|
||||
|
||||
static inline u32 sbi_get_domain_state(void)
|
||||
{
|
||||
struct sbi_domain_state *data = this_cpu_ptr(&domain_state);
|
||||
|
||||
return data->state;
|
||||
}
|
||||
|
||||
static inline void sbi_clear_domain_state(void)
|
||||
{
|
||||
struct sbi_domain_state *data = this_cpu_ptr(&domain_state);
|
||||
|
||||
data->available = false;
|
||||
}
|
||||
|
||||
static inline bool sbi_is_domain_state_available(void)
|
||||
{
|
||||
struct sbi_domain_state *data = this_cpu_ptr(&domain_state);
|
||||
|
||||
return data->available;
|
||||
}
|
||||
|
||||
/* Actual code that puts the SoC in different idle states */
|
||||
static int light_enter_idle(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv,
|
||||
int index)
|
||||
{
|
||||
arch_cpu_idle();
|
||||
return index;
|
||||
}
|
||||
|
||||
static int sbi_suspend_finisher(unsigned long suspend_type,
|
||||
unsigned long resume_addr,
|
||||
unsigned long opaque)
|
||||
{
|
||||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_SUSPEND,
|
||||
suspend_type, resume_addr, opaque, 0, 0, 0);
|
||||
|
||||
return (ret.error) ? sbi_err_map_linux_errno(ret.error) : 0;
|
||||
}
|
||||
|
||||
static int sbi_suspend(u32 state)
|
||||
{
|
||||
if (state & SBI_HSM_SUSP_NON_RET_BIT)
|
||||
return cpu_suspend(state, sbi_suspend_finisher);
|
||||
else
|
||||
return sbi_suspend_finisher(state, 0, 0);
|
||||
}
|
||||
|
||||
static int sbi_cpuidle_enter_state(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int idx)
|
||||
{
|
||||
u32 *states = __this_cpu_read(sbi_cpuidle_data.states);
|
||||
|
||||
return CPU_PM_CPU_IDLE_ENTER_PARAM(sbi_suspend, idx, states[idx]);
|
||||
}
|
||||
|
||||
static int __sbi_enter_domain_idle_state(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int idx,
|
||||
bool s2idle)
|
||||
{
|
||||
struct sbi_cpuidle_data *data = this_cpu_ptr(&sbi_cpuidle_data);
|
||||
u32 *states = data->states;
|
||||
struct device *pd_dev = data->dev;
|
||||
u32 state;
|
||||
int ret;
|
||||
|
||||
ret = cpu_pm_enter();
|
||||
if (ret)
|
||||
return -1;
|
||||
|
||||
/* Do runtime PM to manage a hierarchical CPU toplogy. */
|
||||
rcu_irq_enter_irqson();
|
||||
if (s2idle)
|
||||
dev_pm_genpd_suspend(pd_dev);
|
||||
else
|
||||
pm_runtime_put_sync_suspend(pd_dev);
|
||||
rcu_irq_exit_irqson();
|
||||
|
||||
if (sbi_is_domain_state_available())
|
||||
state = sbi_get_domain_state();
|
||||
else
|
||||
state = states[idx];
|
||||
|
||||
ret = sbi_suspend(state) ? -1 : idx;
|
||||
|
||||
rcu_irq_enter_irqson();
|
||||
if (s2idle)
|
||||
dev_pm_genpd_resume(pd_dev);
|
||||
else
|
||||
pm_runtime_get_sync(pd_dev);
|
||||
rcu_irq_exit_irqson();
|
||||
|
||||
cpu_pm_exit();
|
||||
|
||||
/* Clear the domain state to start fresh when back from idle. */
|
||||
sbi_clear_domain_state();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sbi_enter_domain_idle_state(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int idx)
|
||||
{
|
||||
return __sbi_enter_domain_idle_state(dev, drv, idx, false);
|
||||
}
|
||||
|
||||
static int sbi_enter_s2idle_domain_idle_state(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv,
|
||||
int idx)
|
||||
{
|
||||
return __sbi_enter_domain_idle_state(dev, drv, idx, true);
|
||||
}
|
||||
|
||||
static int sbi_cpuidle_cpuhp_up(unsigned int cpu)
|
||||
{
|
||||
struct device *pd_dev = __this_cpu_read(sbi_cpuidle_data.dev);
|
||||
|
||||
if (pd_dev)
|
||||
pm_runtime_get_sync(pd_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sbi_cpuidle_cpuhp_down(unsigned int cpu)
|
||||
{
|
||||
struct device *pd_dev = __this_cpu_read(sbi_cpuidle_data.dev);
|
||||
|
||||
if (pd_dev) {
|
||||
pm_runtime_put_sync(pd_dev);
|
||||
/* Clear domain state to start fresh at next online. */
|
||||
sbi_clear_domain_state();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sbi_idle_init_cpuhp(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!sbi_cpuidle_use_cpuhp)
|
||||
return;
|
||||
|
||||
err = cpuhp_setup_state_nocalls(CPUHP_AP_CPU_PM_STARTING,
|
||||
"cpuidle/sbi:online",
|
||||
sbi_cpuidle_cpuhp_up,
|
||||
sbi_cpuidle_cpuhp_down);
|
||||
if (err)
|
||||
pr_warn("Failed %d while setup cpuhp state\n", err);
|
||||
}
|
||||
|
||||
static const struct of_device_id sbi_cpuidle_state_match[] = {
|
||||
{ .compatible = "riscv,idle-state",
|
||||
.data = sbi_cpuidle_enter_state },
|
||||
{ },
|
||||
};
|
||||
|
||||
static bool sbi_suspend_state_is_valid(u32 state)
|
||||
{
|
||||
if (state > SBI_HSM_SUSPEND_RET_DEFAULT &&
|
||||
state < SBI_HSM_SUSPEND_RET_PLATFORM)
|
||||
return false;
|
||||
if (state > SBI_HSM_SUSPEND_NON_RET_DEFAULT &&
|
||||
state < SBI_HSM_SUSPEND_NON_RET_PLATFORM)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
static int sbi_dt_parse_state_node(struct device_node *np, u32 *state)
|
||||
{
|
||||
int err = of_property_read_u32(np, "riscv,sbi-suspend-param", state);
|
||||
|
||||
if (err) {
|
||||
pr_warn("%pOF missing riscv,sbi-suspend-param property\n", np);
|
||||
return err;
|
||||
}
|
||||
|
||||
if (!sbi_suspend_state_is_valid(*state)) {
|
||||
pr_warn("Invalid SBI suspend state %#x\n", *state);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sbi_dt_cpu_init_topology(struct cpuidle_driver *drv,
|
||||
struct sbi_cpuidle_data *data,
|
||||
unsigned int state_count, int cpu)
|
||||
{
|
||||
/* Currently limit the hierarchical topology to be used in OSI mode. */
|
||||
if (!sbi_cpuidle_use_osi)
|
||||
return 0;
|
||||
|
||||
data->dev = dt_idle_attach_cpu(cpu, "sbi");
|
||||
if (IS_ERR_OR_NULL(data->dev))
|
||||
return PTR_ERR_OR_ZERO(data->dev);
|
||||
|
||||
/*
|
||||
* Using the deepest state for the CPU to trigger a potential selection
|
||||
* of a shared state for the domain, assumes the domain states are all
|
||||
* deeper states.
|
||||
*/
|
||||
drv->states[state_count - 1].enter = sbi_enter_domain_idle_state;
|
||||
drv->states[state_count - 1].enter_s2idle =
|
||||
sbi_enter_s2idle_domain_idle_state;
|
||||
sbi_cpuidle_use_cpuhp = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sbi_cpuidle_dt_init_states(struct device *dev,
|
||||
struct cpuidle_driver *drv,
|
||||
unsigned int cpu,
|
||||
unsigned int state_count)
|
||||
{
|
||||
struct sbi_cpuidle_data *data = per_cpu_ptr(&sbi_cpuidle_data, cpu);
|
||||
struct device_node *state_node;
|
||||
struct device_node *cpu_node;
|
||||
u32 *states;
|
||||
int i, ret;
|
||||
|
||||
cpu_node = of_cpu_device_node_get(cpu);
|
||||
if (!cpu_node)
|
||||
return -ENODEV;
|
||||
|
||||
states = devm_kcalloc(dev, state_count, sizeof(*states), GFP_KERNEL);
|
||||
if (!states) {
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Parse SBI specific details from state DT nodes */
|
||||
for (i = 1; i < state_count; i++) {
|
||||
state_node = of_get_cpu_state_node(cpu_node, i - 1);
|
||||
if (!state_node)
|
||||
break;
|
||||
|
||||
ret = sbi_dt_parse_state_node(state_node, &states[i]);
|
||||
of_node_put(state_node);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pr_debug("sbi-state %#x index %d\n", states[i], i);
|
||||
}
|
||||
if (i != state_count) {
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Initialize optional data, used for the hierarchical topology. */
|
||||
ret = sbi_dt_cpu_init_topology(drv, data, state_count, cpu);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Store states in the per-cpu struct. */
|
||||
data->states = states;
|
||||
|
||||
fail:
|
||||
of_node_put(cpu_node);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void sbi_cpuidle_deinit_cpu(int cpu)
|
||||
{
|
||||
struct sbi_cpuidle_data *data = per_cpu_ptr(&sbi_cpuidle_data, cpu);
|
||||
|
||||
dt_idle_detach_cpu(data->dev);
|
||||
sbi_cpuidle_use_cpuhp = false;
|
||||
}
|
||||
|
||||
static int sbi_cpuidle_init_cpu(struct device *dev, int cpu)
|
||||
{
|
||||
struct cpuidle_driver *drv;
|
||||
unsigned int state_count = 0;
|
||||
int ret = 0;
|
||||
|
||||
drv = devm_kzalloc(dev, sizeof(*drv), GFP_KERNEL);
|
||||
if (!drv)
|
||||
return -ENOMEM;
|
||||
|
||||
drv->name = "sbi_cpuidle";
|
||||
drv->owner = THIS_MODULE;
|
||||
drv->cpumask = (struct cpumask *)cpumask_of(cpu);
|
||||
|
||||
/* RISC-V architectural WFI to be represented as state index 0. */
|
||||
drv->states[0].enter = sbi_cpuidle_enter_state;
|
||||
drv->states[0].exit_latency = 1;
|
||||
drv->states[0].target_residency = 1;
|
||||
drv->states[0].power_usage = UINT_MAX;
|
||||
strcpy(drv->states[0].name, "WFI");
|
||||
strcpy(drv->states[0].desc, "RISC-V WFI");
|
||||
|
||||
/*
|
||||
* If no DT idle states are detected (ret == 0) let the driver
|
||||
* initialization fail accordingly since there is no reason to
|
||||
* initialize the idle driver if only wfi is supported, the
|
||||
* default archictectural back-end already executes wfi
|
||||
* on idle entry.
|
||||
*/
|
||||
ret = dt_init_idle_driver(drv, sbi_cpuidle_state_match, 1);
|
||||
if (ret <= 0) {
|
||||
pr_debug("HART%ld: failed to parse DT idle states\n",
|
||||
cpuid_to_hartid_map(cpu));
|
||||
return ret ? : -ENODEV;
|
||||
}
|
||||
state_count = ret + 1; /* Include WFI state as well */
|
||||
|
||||
/* Initialize idle states from DT. */
|
||||
ret = sbi_cpuidle_dt_init_states(dev, drv, cpu, state_count);
|
||||
if (ret) {
|
||||
pr_err("HART%ld: failed to init idle states\n",
|
||||
cpuid_to_hartid_map(cpu));
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = cpuidle_register(drv, NULL);
|
||||
if (ret)
|
||||
goto deinit;
|
||||
|
||||
cpuidle_cooling_register(drv);
|
||||
|
||||
return 0;
|
||||
deinit:
|
||||
sbi_cpuidle_deinit_cpu(cpu);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void sbi_cpuidle_domain_sync_state(struct device *dev)
|
||||
{
|
||||
/*
|
||||
* All devices have now been attached/probed to the PM domain
|
||||
* topology, hence it's fine to allow domain states to be picked.
|
||||
*/
|
||||
sbi_cpuidle_pd_allow_domain_state = true;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DT_IDLE_GENPD
|
||||
|
||||
static int sbi_cpuidle_pd_power_off(struct generic_pm_domain *pd)
|
||||
{
|
||||
struct genpd_power_state *state = &pd->states[pd->state_idx];
|
||||
u32 *pd_state;
|
||||
|
||||
if (!state->data)
|
||||
return 0;
|
||||
|
||||
if (!sbi_cpuidle_pd_allow_domain_state)
|
||||
return -EBUSY;
|
||||
|
||||
/* OSI mode is enabled, set the corresponding domain state. */
|
||||
pd_state = state->data;
|
||||
sbi_set_domain_state(*pd_state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct sbi_pd_provider {
|
||||
struct list_head link;
|
||||
struct device_node *node;
|
||||
};
|
||||
|
||||
static LIST_HEAD(sbi_pd_providers);
|
||||
|
||||
static int sbi_pd_init(struct device_node *np)
|
||||
{
|
||||
struct generic_pm_domain *pd;
|
||||
struct sbi_pd_provider *pd_provider;
|
||||
struct dev_power_governor *pd_gov;
|
||||
int ret = -ENOMEM, state_count = 0;
|
||||
|
||||
pd = dt_idle_pd_alloc(np, sbi_dt_parse_state_node);
|
||||
if (!pd)
|
||||
goto out;
|
||||
|
||||
pd_provider = kzalloc(sizeof(*pd_provider), GFP_KERNEL);
|
||||
if (!pd_provider)
|
||||
goto free_pd;
|
||||
|
||||
pd->flags |= GENPD_FLAG_IRQ_SAFE | GENPD_FLAG_CPU_DOMAIN;
|
||||
|
||||
/* Allow power off when OSI is available. */
|
||||
if (sbi_cpuidle_use_osi)
|
||||
pd->power_off = sbi_cpuidle_pd_power_off;
|
||||
else
|
||||
pd->flags |= GENPD_FLAG_ALWAYS_ON;
|
||||
|
||||
/* Use governor for CPU PM domains if it has some states to manage. */
|
||||
pd_gov = state_count > 0 ? &pm_domain_cpu_gov : NULL;
|
||||
|
||||
ret = pm_genpd_init(pd, pd_gov, false);
|
||||
if (ret)
|
||||
goto free_pd_prov;
|
||||
|
||||
ret = of_genpd_add_provider_simple(np, pd);
|
||||
if (ret)
|
||||
goto remove_pd;
|
||||
|
||||
pd_provider->node = of_node_get(np);
|
||||
list_add(&pd_provider->link, &sbi_pd_providers);
|
||||
|
||||
pr_debug("init PM domain %s\n", pd->name);
|
||||
return 0;
|
||||
|
||||
remove_pd:
|
||||
pm_genpd_remove(pd);
|
||||
free_pd_prov:
|
||||
kfree(pd_provider);
|
||||
free_pd:
|
||||
dt_idle_pd_free(pd);
|
||||
out:
|
||||
pr_err("failed to init PM domain ret=%d %pOF\n", ret, np);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void sbi_pd_remove(void)
|
||||
{
|
||||
struct sbi_pd_provider *pd_provider, *it;
|
||||
struct generic_pm_domain *genpd;
|
||||
|
||||
list_for_each_entry_safe(pd_provider, it, &sbi_pd_providers, link) {
|
||||
of_genpd_del_provider(pd_provider->node);
|
||||
|
||||
genpd = of_genpd_remove_last(pd_provider->node);
|
||||
if (!IS_ERR(genpd))
|
||||
kfree(genpd);
|
||||
|
||||
of_node_put(pd_provider->node);
|
||||
list_del(&pd_provider->link);
|
||||
kfree(pd_provider);
|
||||
}
|
||||
}
|
||||
|
||||
static int sbi_genpd_probe(struct device_node *np)
|
||||
{
|
||||
struct device_node *node;
|
||||
int ret = 0, pd_count = 0;
|
||||
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* Parse child nodes for the "#power-domain-cells" property and
|
||||
* initialize a genpd/genpd-of-provider pair when it's found.
|
||||
*/
|
||||
for_each_child_of_node(np, node) {
|
||||
if (!of_find_property(node, "#power-domain-cells", NULL))
|
||||
continue;
|
||||
|
||||
ret = sbi_pd_init(node);
|
||||
if (ret)
|
||||
goto put_node;
|
||||
|
||||
pd_count++;
|
||||
}
|
||||
|
||||
/* Bail out if not using the hierarchical CPU topology. */
|
||||
if (!pd_count)
|
||||
goto no_pd;
|
||||
|
||||
/* Link genpd masters/subdomains to model the CPU topology. */
|
||||
ret = dt_idle_pd_init_topology(np);
|
||||
if (ret)
|
||||
goto remove_pd;
|
||||
|
||||
return 0;
|
||||
|
||||
put_node:
|
||||
of_node_put(node);
|
||||
remove_pd:
|
||||
sbi_pd_remove();
|
||||
pr_err("failed to create CPU PM domains ret=%d\n", ret);
|
||||
no_pd:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline int sbi_genpd_probe(struct device_node *np)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int sbi_cpuidle_probe(struct platform_device *pdev)
|
||||
{
|
||||
int cpu, ret;
|
||||
struct cpuidle_driver *drv;
|
||||
struct cpuidle_device *dev;
|
||||
struct device_node *np, *pds_node;
|
||||
|
||||
/* Detect OSI support based on CPU DT nodes */
|
||||
sbi_cpuidle_use_osi = true;
|
||||
for_each_possible_cpu(cpu) {
|
||||
np = of_cpu_device_node_get(cpu);
|
||||
if (np &&
|
||||
of_find_property(np, "power-domains", NULL) &&
|
||||
of_find_property(np, "power-domain-names", NULL)) {
|
||||
continue;
|
||||
} else {
|
||||
sbi_cpuidle_use_osi = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Populate generic power domains from DT nodes */
|
||||
pds_node = of_find_node_by_path("/cpus/power-domains");
|
||||
if (pds_node) {
|
||||
ret = sbi_genpd_probe(pds_node);
|
||||
of_node_put(pds_node);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Initialize CPU idle driver for each CPU */
|
||||
for_each_possible_cpu(cpu) {
|
||||
ret = sbi_cpuidle_init_cpu(&pdev->dev, cpu);
|
||||
if (ret) {
|
||||
pr_debug("HART%ld: idle driver init failed\n",
|
||||
cpuid_to_hartid_map(cpu));
|
||||
goto out_fail;
|
||||
}
|
||||
}
|
||||
|
||||
/* Setup CPU hotplut notifiers */
|
||||
sbi_idle_init_cpuhp();
|
||||
|
||||
pr_info("idle driver registered for all CPUs\n");
|
||||
|
||||
return 0;
|
||||
|
||||
out_fail:
|
||||
while (--cpu >= 0) {
|
||||
dev = per_cpu(cpuidle_devices, cpu);
|
||||
drv = cpuidle_get_cpu_driver(dev);
|
||||
cpuidle_unregister(drv);
|
||||
sbi_cpuidle_deinit_cpu(cpu);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct platform_driver sbi_cpuidle_driver = {
|
||||
.probe = sbi_cpuidle_probe,
|
||||
.driver = {
|
||||
.name = "sbi-cpuidle",
|
||||
.sync_state = sbi_cpuidle_domain_sync_state,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init sbi_cpuidle_init(void)
|
||||
{
|
||||
int ret;
|
||||
struct platform_device *pdev;
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* The SBI HSM suspend function is only available when:
|
||||
* 1) SBI version is 0.3 or higher
|
||||
* 2) SBI HSM extension is available
|
||||
*/
|
||||
if ((sbi_spec_version < sbi_mk_version(0, 3)) ||
|
||||
sbi_probe_extension(SBI_EXT_HSM) <= 0) {
|
||||
pr_info("HSM suspend not available\n");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
ret = platform_driver_register(&sbi_cpuidle_driver);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pdev = platform_device_register_simple("sbi-cpuidle",
|
||||
-1, NULL, 0);
|
||||
if (IS_ERR(pdev)) {
|
||||
platform_driver_unregister(&sbi_cpuidle_driver);
|
||||
return PTR_ERR(pdev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
device_initcall(sbi_cpuidle_init);
|
||||
@@ -1,178 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* PM domains for CPUs via genpd.
|
||||
*
|
||||
* Copyright (C) 2019 Linaro Ltd.
|
||||
* Author: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
*
|
||||
* Copyright (c) 2021 Western Digital Corporation or its affiliates.
|
||||
* Copyright (c) 2022 Ventana Micro Systems Inc.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "dt-idle-genpd: " fmt
|
||||
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pm_domain.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include "dt_idle_genpd.h"
|
||||
|
||||
static int pd_parse_state_nodes(
|
||||
int (*parse_state)(struct device_node *, u32 *),
|
||||
struct genpd_power_state *states, int state_count)
|
||||
{
|
||||
int i, ret;
|
||||
u32 state, *state_buf;
|
||||
|
||||
for (i = 0; i < state_count; i++) {
|
||||
ret = parse_state(to_of_node(states[i].fwnode), &state);
|
||||
if (ret)
|
||||
goto free_state;
|
||||
|
||||
state_buf = kmalloc(sizeof(u32), GFP_KERNEL);
|
||||
if (!state_buf) {
|
||||
ret = -ENOMEM;
|
||||
goto free_state;
|
||||
}
|
||||
*state_buf = state;
|
||||
states[i].data = state_buf;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
free_state:
|
||||
i--;
|
||||
for (; i >= 0; i--)
|
||||
kfree(states[i].data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pd_parse_states(struct device_node *np,
|
||||
int (*parse_state)(struct device_node *, u32 *),
|
||||
struct genpd_power_state **states,
|
||||
int *state_count)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Parse the domain idle states. */
|
||||
ret = of_genpd_parse_idle_states(np, states, state_count);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Fill out the dt specifics for each found state. */
|
||||
ret = pd_parse_state_nodes(parse_state, *states, *state_count);
|
||||
if (ret)
|
||||
kfree(*states);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void pd_free_states(struct genpd_power_state *states,
|
||||
unsigned int state_count)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < state_count; i++)
|
||||
kfree(states[i].data);
|
||||
kfree(states);
|
||||
}
|
||||
|
||||
void dt_idle_pd_free(struct generic_pm_domain *pd)
|
||||
{
|
||||
pd_free_states(pd->states, pd->state_count);
|
||||
kfree(pd->name);
|
||||
kfree(pd);
|
||||
}
|
||||
|
||||
struct generic_pm_domain *dt_idle_pd_alloc(struct device_node *np,
|
||||
int (*parse_state)(struct device_node *, u32 *))
|
||||
{
|
||||
struct generic_pm_domain *pd;
|
||||
struct genpd_power_state *states = NULL;
|
||||
int ret, state_count = 0;
|
||||
|
||||
pd = kzalloc(sizeof(*pd), GFP_KERNEL);
|
||||
if (!pd)
|
||||
goto out;
|
||||
|
||||
pd->name = kasprintf(GFP_KERNEL, "%pOF", np);
|
||||
if (!pd->name)
|
||||
goto free_pd;
|
||||
|
||||
/*
|
||||
* Parse the domain idle states and let genpd manage the state selection
|
||||
* for those being compatible with "domain-idle-state".
|
||||
*/
|
||||
ret = pd_parse_states(np, parse_state, &states, &state_count);
|
||||
if (ret)
|
||||
goto free_name;
|
||||
|
||||
pd->free_states = pd_free_states;
|
||||
pd->name = kbasename(pd->name);
|
||||
pd->states = states;
|
||||
pd->state_count = state_count;
|
||||
|
||||
pr_debug("alloc PM domain %s\n", pd->name);
|
||||
return pd;
|
||||
|
||||
free_name:
|
||||
kfree(pd->name);
|
||||
free_pd:
|
||||
kfree(pd);
|
||||
out:
|
||||
pr_err("failed to alloc PM domain %pOF\n", np);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int dt_idle_pd_init_topology(struct device_node *np)
|
||||
{
|
||||
struct device_node *node;
|
||||
struct of_phandle_args child, parent;
|
||||
int ret;
|
||||
|
||||
for_each_child_of_node(np, node) {
|
||||
if (of_parse_phandle_with_args(node, "power-domains",
|
||||
"#power-domain-cells", 0, &parent))
|
||||
continue;
|
||||
|
||||
child.np = node;
|
||||
child.args_count = 0;
|
||||
ret = of_genpd_add_subdomain(&parent, &child);
|
||||
of_node_put(parent.np);
|
||||
if (ret) {
|
||||
of_node_put(node);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct device *dt_idle_attach_cpu(int cpu, const char *name)
|
||||
{
|
||||
struct device *dev;
|
||||
|
||||
dev = dev_pm_domain_attach_by_name(get_cpu_device(cpu), name);
|
||||
if (IS_ERR_OR_NULL(dev))
|
||||
return dev;
|
||||
|
||||
pm_runtime_irq_safe(dev);
|
||||
if (cpu_online(cpu))
|
||||
pm_runtime_get_sync(dev);
|
||||
|
||||
dev_pm_syscore_device(dev, true);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
void dt_idle_detach_cpu(struct device *dev)
|
||||
{
|
||||
if (IS_ERR_OR_NULL(dev))
|
||||
return;
|
||||
|
||||
dev_pm_domain_detach(dev, false);
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __DT_IDLE_GENPD
|
||||
#define __DT_IDLE_GENPD
|
||||
|
||||
struct device_node;
|
||||
struct generic_pm_domain;
|
||||
|
||||
#ifdef CONFIG_DT_IDLE_GENPD
|
||||
|
||||
void dt_idle_pd_free(struct generic_pm_domain *pd);
|
||||
|
||||
struct generic_pm_domain *dt_idle_pd_alloc(struct device_node *np,
|
||||
int (*parse_state)(struct device_node *, u32 *));
|
||||
|
||||
int dt_idle_pd_init_topology(struct device_node *np);
|
||||
|
||||
struct device *dt_idle_attach_cpu(int cpu, const char *name);
|
||||
|
||||
void dt_idle_detach_cpu(struct device *dev);
|
||||
|
||||
#else
|
||||
|
||||
static inline void dt_idle_pd_free(struct generic_pm_domain *pd)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct generic_pm_domain *dt_idle_pd_alloc(
|
||||
struct device_node *np,
|
||||
int (*parse_state)(struct device_node *, u32 *))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int dt_idle_pd_init_topology(struct device_node *np)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct device *dt_idle_attach_cpu(int cpu, const char *name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void dt_idle_detach_cpu(struct device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -467,7 +467,7 @@ static int dma_chan_alloc_chan_resources(struct dma_chan *dchan)
|
||||
}
|
||||
dev_vdbg(dchan2dev(dchan), "%s: allocating\n", axi_chan_name(chan));
|
||||
|
||||
pm_runtime_get_sync(chan->chip->dev);
|
||||
pm_runtime_get(chan->chip->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -492,7 +492,7 @@ static void dma_chan_free_chan_resources(struct dma_chan *dchan)
|
||||
"%s: free resources, descriptor still allocated: %u\n",
|
||||
axi_chan_name(chan), atomic_read(&chan->descs_allocated));
|
||||
|
||||
pm_runtime_put_sync(chan->chip->dev);
|
||||
pm_runtime_put(chan->chip->dev);
|
||||
}
|
||||
|
||||
static void dw_axi_dma_set_hw_channel(struct axi_dma_chan *chan, bool set)
|
||||
@@ -1111,8 +1111,7 @@ static int dma_chan_terminate_all(struct dma_chan *dchan)
|
||||
axi_chan_disable(chan);
|
||||
|
||||
ret = readl_poll_timeout_atomic(chan->chip->regs + DMAC_CHEN, val,
|
||||
!(val & chan_active), 1000, 100000);
|
||||
|
||||
!(val & chan_active), 1000, 10000);
|
||||
if (ret == -ETIMEDOUT)
|
||||
dev_warn(dchan2dev(dchan),
|
||||
"%s failed to stop\n", axi_chan_name(chan));
|
||||
@@ -1142,8 +1141,6 @@ static int dma_chan_pause(struct dma_chan *dchan)
|
||||
unsigned long flags;
|
||||
unsigned int timeout = 20; /* timeout iterations */
|
||||
u32 val;
|
||||
int ret;
|
||||
u32 chan_active = BIT(chan->id) << DMAC_CHAN_EN_SHIFT;
|
||||
|
||||
spin_lock_irqsave(&chan->vc.lock, flags);
|
||||
|
||||
@@ -1171,48 +1168,13 @@ static int dma_chan_pause(struct dma_chan *dchan)
|
||||
|
||||
spin_unlock_irqrestore(&chan->vc.lock, flags);
|
||||
|
||||
chan->ch_sar = axi_chan_ioread32(chan, CH_SAR);
|
||||
chan->ch_dar = axi_chan_ioread32(chan, CH_DAR);
|
||||
chan->ch_dar_h = axi_chan_ioread32(chan, CH_DAR_H);
|
||||
chan->ch_block_ts = axi_chan_ioread32(chan, CH_BLOCK_TS);
|
||||
chan->ch_ctl_l = axi_chan_ioread32(chan, CH_CTL_L);
|
||||
chan->ch_ctl_h = axi_chan_ioread32(chan, CH_CTL_H);
|
||||
chan->ch_cfg_l = axi_chan_ioread32(chan, CH_CFG_L);
|
||||
chan->ch_cfg_h = axi_chan_ioread32(chan, CH_CFG_H);
|
||||
chan->ch_llp = axi_chan_ioread32(chan, CH_LLP);
|
||||
//printk("%s for %s ch_sar=0x%x ch_dar=0x%x ch_dar_h=0x%x ch_block_ts=0x%x ch_ctl_l=0x%x ch_ctl_h=0x%x ch_cfg_l=0x%x ch_cfg_h=0x%x ch_llp=0x%x\n", __func__,
|
||||
// axi_chan_name(chan), chan->ch_sar, chan->ch_dar, chan->ch_dar_h, chan->ch_block_ts, chan->ch_ctl_l, chan->ch_ctl_h, chan->ch_cfg_l, chan->ch_cfg_h, chan->ch_llp);
|
||||
|
||||
axi_chan_disable(chan);
|
||||
ret = readl_poll_timeout_atomic(chan->chip->regs + DMAC_CHEN, val,
|
||||
!(val & chan_active), 1000, 100000);
|
||||
if (ret == -ETIMEDOUT)
|
||||
printk("%s %s failed to stop\n", __func__, axi_chan_name(chan));
|
||||
|
||||
return timeout ? 0 : -EAGAIN;
|
||||
}
|
||||
|
||||
/* Called in chan locked context */
|
||||
static inline void axi_chan_resume(struct axi_dma_chan *chan)
|
||||
{
|
||||
u32 val, irq_mask;
|
||||
struct axi_dma_desc *desc = chan->desc;
|
||||
struct axi_dma_hw_desc *hw_desc = desc->hw_desc;
|
||||
|
||||
axi_chan_iowrite32(chan, CH_SAR, chan->ch_sar);
|
||||
axi_chan_iowrite32(chan, CH_DAR, chan->ch_dar);
|
||||
axi_chan_iowrite32(chan, CH_DAR_H, chan->ch_dar_h);
|
||||
axi_chan_iowrite32(chan, CH_BLOCK_TS, chan->ch_block_ts);
|
||||
axi_chan_iowrite32(chan, CH_CTL_L, chan->ch_ctl_l);
|
||||
axi_chan_iowrite32(chan, CH_CTL_H, chan->ch_ctl_h);
|
||||
axi_chan_iowrite32(chan, CH_CFG_L, chan->ch_cfg_l);
|
||||
axi_chan_iowrite32(chan, CH_CFG_H, chan->ch_cfg_h);
|
||||
axi_chan_iowrite32(chan, CH_LLP, chan->ch_llp);
|
||||
irq_mask = DWAXIDMAC_IRQ_DMA_TRF | DWAXIDMAC_IRQ_ALL_ERR;
|
||||
axi_chan_irq_sig_set(chan, irq_mask);
|
||||
/* Generate 'suspend' status but don't generate interrupt */
|
||||
irq_mask |= DWAXIDMAC_IRQ_SUSPENDED;
|
||||
axi_chan_irq_set(chan, irq_mask);
|
||||
u32 val;
|
||||
|
||||
val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
|
||||
if (chan->chip->dw->hdata->reg_map_8_channels) {
|
||||
@@ -1225,11 +1187,7 @@ static inline void axi_chan_resume(struct axi_dma_chan *chan)
|
||||
axi_dma_iowrite32(chan->chip, DMAC_CHSUSPREG, val);
|
||||
}
|
||||
|
||||
axi_chan_enable(chan);
|
||||
|
||||
chan->is_paused = false;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static int dma_chan_resume(struct dma_chan *dchan)
|
||||
@@ -1276,21 +1234,6 @@ static int axi_dma_resume(struct axi_dma_chip *chip)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void axi_dma_dump(struct axi_dma_chip *chip)
|
||||
{
|
||||
struct dw_axi_dma *dw = chip->dw;
|
||||
struct axi_dma_chan *chan;
|
||||
u32 i;
|
||||
struct virt_dma_desc *vd;
|
||||
for (i = 0; i < dw->hdata->nr_channels; i++) {
|
||||
chan = &dw->chan[i];
|
||||
printk("%s chan name %s\n", __func__, axi_chan_name(chan));
|
||||
vd = vchan_next_desc(&chan->vc);
|
||||
axi_chan_list_dump_lli(chan, vd_to_axi_desc(vd));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
static int __maybe_unused axi_dma_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct axi_dma_chip *chip = dev_get_drvdata(dev);
|
||||
@@ -1305,42 +1248,6 @@ static int __maybe_unused axi_dma_runtime_resume(struct device *dev)
|
||||
return axi_dma_resume(chip);
|
||||
}
|
||||
|
||||
static int __maybe_unused axi_dma_sleep_suspend(struct device *dev)
|
||||
{
|
||||
|
||||
//struct axi_dma_chip *chip = dev_get_drvdata(dev);
|
||||
//axi_dma_irq_disable(chip);
|
||||
//axi_dma_disable(chip);
|
||||
|
||||
//clk_disable_unprepare(chip->core_clk);
|
||||
//clk_disable_unprepare(chip->cfgr_clk);
|
||||
|
||||
|
||||
dev_err(dev, "%s, %d\n", __func__, __LINE__);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __maybe_unused axi_dma_sleep_resume(struct device *dev)
|
||||
{
|
||||
struct axi_dma_chip *chip = dev_get_drvdata(dev);
|
||||
int ret = 0;
|
||||
|
||||
ret = clk_prepare_enable(chip->cfgr_clk);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = clk_prepare_enable(chip->core_clk);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
axi_dma_enable(chip);
|
||||
axi_dma_irq_enable(chip);
|
||||
dev_err(dev, "%s, %d\n", __func__, __LINE__);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dma_chan *dw_axi_dma_of_xlate(struct of_phandle_args *dma_spec,
|
||||
struct of_dma *ofdma)
|
||||
{
|
||||
@@ -1614,16 +1521,9 @@ static int dw_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static const struct dev_pm_ops dw_axi_dma_pm_ops = {
|
||||
SET_LATE_SYSTEM_SLEEP_PM_OPS(axi_dma_sleep_suspend, axi_dma_sleep_resume)
|
||||
SET_RUNTIME_PM_OPS(axi_dma_runtime_suspend, axi_dma_runtime_resume, NULL)
|
||||
SET_RUNTIME_PM_OPS(axi_dma_runtime_suspend, axi_dma_runtime_resume, NULL)
|
||||
};
|
||||
#else
|
||||
static const struct dev_pm_ops dw_axi_dma_pm_ops = {
|
||||
SET_RUNTIME_PM_OPS(axi_dma_runtime_suspend, axi_dma_runtime_resume, NULL)
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct of_device_id dw_dma_of_id_table[] = {
|
||||
{ .compatible = "snps,axi-dma-1.01a" },
|
||||
|
||||
@@ -51,15 +51,6 @@ struct axi_dma_chan {
|
||||
bool cyclic;
|
||||
/* these other elements are all protected by vc.lock */
|
||||
bool is_paused;
|
||||
u32 ch_sar;
|
||||
u32 ch_dar;
|
||||
u32 ch_dar_h;
|
||||
u32 ch_block_ts;
|
||||
u32 ch_ctl_l;
|
||||
u32 ch_ctl_h;
|
||||
u32 ch_cfg_l;
|
||||
u32 ch_cfg_h;
|
||||
u32 ch_llp;
|
||||
};
|
||||
|
||||
struct dw_axi_dma {
|
||||
@@ -162,7 +153,6 @@ static inline struct axi_dma_chan *dchan_to_axi_dma_chan(struct dma_chan *dchan)
|
||||
/* DMA channel registers offset */
|
||||
#define CH_SAR 0x000 /* R/W Chan Source Address */
|
||||
#define CH_DAR 0x008 /* R/W Chan Destination Address */
|
||||
#define CH_DAR_H 0x00C
|
||||
#define CH_BLOCK_TS 0x010 /* R/W Chan Block Transfer Size */
|
||||
#define CH_CTL 0x018 /* R/W Chan Control */
|
||||
#define CH_CTL_L 0x018 /* R/W Chan Control 00-31 */
|
||||
|
||||
@@ -230,26 +230,10 @@ static const struct of_device_id light_aon_match[] = {
|
||||
{ /* Sentinel */ }
|
||||
};
|
||||
|
||||
static int __maybe_unused light_aon_resume_noirq(struct device *dev)
|
||||
{
|
||||
struct light_aon_chan *aon_chan;
|
||||
int ret;
|
||||
|
||||
aon_chan = &light_aon_ipc_handle->chans;
|
||||
|
||||
complete(&aon_chan->tx_done);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops light_aon_pm_ops = {
|
||||
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(NULL,
|
||||
light_aon_resume_noirq)
|
||||
};
|
||||
static struct platform_driver light_aon_driver = {
|
||||
.driver = {
|
||||
.name = "light-aon",
|
||||
.of_match_table = light_aon_match,
|
||||
.pm = &light_aon_pm_ops,
|
||||
},
|
||||
.probe = light_aon_probe,
|
||||
};
|
||||
|
||||
@@ -1242,20 +1242,12 @@ static const struct of_device_id pca953x_dt_ids[] = {
|
||||
|
||||
MODULE_DEVICE_TABLE(of, pca953x_dt_ids);
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static const struct dev_pm_ops pca953x_pm_ops = {
|
||||
SET_LATE_SYSTEM_SLEEP_PM_OPS(pca953x_suspend,
|
||||
pca953x_resume)
|
||||
};
|
||||
static SIMPLE_DEV_PM_OPS(pca953x_pm_ops, pca953x_suspend, pca953x_resume);
|
||||
|
||||
#define PCA593X_PM_OPS &pca953x_pm_ops
|
||||
#else
|
||||
#define PCA593X_PM_OPS NULL
|
||||
#endif
|
||||
static struct i2c_driver pca953x_driver = {
|
||||
.driver = {
|
||||
.name = "pca953x",
|
||||
.pm = PCA593X_PM_OPS,
|
||||
.pm = &pca953x_pm_ops,
|
||||
.of_match_table = pca953x_dt_ids,
|
||||
.acpi_match_table = pca953x_acpi_ids,
|
||||
},
|
||||
|
||||
@@ -1380,7 +1380,6 @@ static int gc_poweroff_timeout_show(void* m, void* data)
|
||||
gckGALDEVICE device = galDevice;
|
||||
gckHARDWARE hardware;
|
||||
int len = 0;
|
||||
int i;
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
void* ptr = m;
|
||||
#else
|
||||
@@ -1390,19 +1389,14 @@ static int gc_poweroff_timeout_show(void* m, void* data)
|
||||
if (!device)
|
||||
return -ENXIO;
|
||||
|
||||
for (i = 0; i < gcvCORE_COUNT; ++i)
|
||||
{
|
||||
if (!device->kernels[i])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
hardware = device->kernels[i]->hardware;
|
||||
hardware = device->kernels[0]->hardware;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
len += fs_printf(ptr + len, "power off timeout: %d ms.\n", hardware->powerOffTimeout);
|
||||
len += fs_printf(ptr + len, "power off timeout: %d ms.\n", hardware->powerOffTimeout);
|
||||
#else
|
||||
len += sprintf(ptr + len, "power off timeout: %d ms.\n", hardware->powerOffTimeout);
|
||||
len += sprintf(ptr + len, "power off timeout: %d ms.\n", hardware->powerOffTimeout);
|
||||
#endif
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
@@ -394,6 +394,8 @@ source "drivers/gpu/drm/xlnx/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/verisilicon/Kconfig"
|
||||
|
||||
source "drivers/gpu/drm/img-rogue/Kconfig"
|
||||
|
||||
# Keep legacy drivers last
|
||||
|
||||
menuconfig DRM_LEGACY
|
||||
|
||||
@@ -57,6 +57,8 @@ drm_kms_helper-$(CONFIG_DRM_DP_CEC) += drm_dp_cec.o
|
||||
obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
|
||||
obj-$(CONFIG_DRM_DEBUG_SELFTEST) += selftests/
|
||||
|
||||
obj-$(CONFIG_DRM_POWERVR_ROGUE) += img-rogue/
|
||||
|
||||
obj-$(CONFIG_DRM) += drm.o
|
||||
obj-$(CONFIG_DRM_MIPI_DBI) += drm_mipi_dbi.o
|
||||
obj-$(CONFIG_DRM_MIPI_DSI) += drm_mipi_dsi.o
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <media/cec-notifier.h>
|
||||
|
||||
#include <uapi/linux/media-bus-format.h>
|
||||
@@ -3398,6 +3399,13 @@ struct dw_hdmi *dw_hdmi_probe(struct platform_device *pdev,
|
||||
goto err_res;
|
||||
}
|
||||
|
||||
hdmi->i2s_clk = devm_clk_get_optional(hdmi->dev, "i2s");
|
||||
if (IS_ERR(hdmi->i2s_clk)) {
|
||||
ret = PTR_ERR(hdmi->i2s_clk);
|
||||
dev_err(hdmi->dev, "Unable to get HDMI i2s clk: %d\n", ret);
|
||||
goto err_res;
|
||||
}
|
||||
|
||||
clk_prepare_enable(hdmi->iahb_clk);
|
||||
clk_prepare_enable(hdmi->isfr_clk);
|
||||
|
||||
@@ -3610,15 +3618,16 @@ EXPORT_SYMBOL_GPL(dw_hdmi_unbind);
|
||||
void dw_hdmi_resume(struct dw_hdmi *hdmi)
|
||||
{
|
||||
dw_hdmi_init_hw(hdmi);
|
||||
hdmi_init_clk_regenerator(hdmi);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dw_hdmi_resume);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
int dw_hdmi_runtime_suspend(struct dw_hdmi *hdmi)
|
||||
{
|
||||
clk_disable_unprepare(hdmi->i2s_clk);
|
||||
clk_disable_unprepare(hdmi->pix_clk);
|
||||
clk_disable_unprepare(hdmi->cec_clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dw_hdmi_runtime_suspend);
|
||||
@@ -3627,12 +3636,13 @@ int dw_hdmi_runtime_resume(struct dw_hdmi *hdmi)
|
||||
{
|
||||
clk_prepare_enable(hdmi->cec_clk);
|
||||
clk_prepare_enable(hdmi->pix_clk);
|
||||
clk_prepare_enable(hdmi->i2s_clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dw_hdmi_runtime_resume);
|
||||
#endif
|
||||
|
||||
|
||||
MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
|
||||
MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com>");
|
||||
MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>");
|
||||
|
||||
24
drivers/gpu/drm/img-rogue/Kconfig
Normal file
24
drivers/gpu/drm/img-rogue/Kconfig
Normal file
@@ -0,0 +1,24 @@
|
||||
config DRM_POWERVR_ROGUE
|
||||
tristate "PowerVR Rogue"
|
||||
depends on HAS_IOMEM
|
||||
depends on DRM
|
||||
select DRM_KMS_HELPER
|
||||
select PM_DEVFREQ
|
||||
select DEVFREQ_GOV_SIMPLE_ONDEMAND
|
||||
select PM_OPP
|
||||
select DEVFREQ_THERMAL
|
||||
select SYNC_FILE
|
||||
help
|
||||
Driver for PowerVR Rogue graphics hardware.
|
||||
|
||||
Say Y here if your SoC contains a PowerVR Rogue GPU. For more
|
||||
information, see <http://www.imgtec.com/powervr/>.
|
||||
|
||||
config DRM_POWERVR_ROGUE_DEBUG
|
||||
bool "Enable PowerVR Rogue debug features"
|
||||
depends on DRM_POWERVR_ROGUE
|
||||
default n
|
||||
help
|
||||
Add additional debug features to the PowerVR Rogue driver.
|
||||
To build a matching userspace, enable the following build options:
|
||||
BUILD=debug SUPPORT_PAGE_FAULT_DEBUG=1 PVRSRV_ENABLE_GPU_MEMORY_INFO=1
|
||||
19
drivers/gpu/drm/img-rogue/Makefile
Normal file
19
drivers/gpu/drm/img-rogue/Makefile
Normal file
@@ -0,0 +1,19 @@
|
||||
img_basedir := drivers/gpu/drm/img-rogue
|
||||
include $(img_basedir)/config_kernel.mk
|
||||
|
||||
obj-$(CONFIG_DRM_POWERVR_ROGUE) += pvrsrvkm.o
|
||||
|
||||
ccflags-y += \
|
||||
-include config_kernel.h \
|
||||
-I$(img_basedir)/include/drm \
|
||||
-I$(img_basedir) \
|
||||
-I$(img_basedir)/include \
|
||||
-I$(img_basedir)/km \
|
||||
-I$(img_basedir)/system \
|
||||
-D__linux__
|
||||
|
||||
include $(img_basedir)/pvrsrvkm.mk
|
||||
|
||||
obj-$(CONFIG_DRM_POWERVR_ROGUE) += drm_nulldisp.o
|
||||
|
||||
drm_nulldisp-y += drm_nulldisp_drv.o drm_nulldisp_netlink.o drm_netlink_gem.o drm_nulldisp_gem.o
|
||||
422
drivers/gpu/drm/img-rogue/allocmem.c
Normal file
422
drivers/gpu/drm/img-rogue/allocmem.c
Normal file
@@ -0,0 +1,422 @@
|
||||
/*************************************************************************/ /*!
|
||||
@File
|
||||
@Title Host memory management implementation for Linux
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/ /**************************************************************************/
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include "img_defs.h"
|
||||
#include "allocmem.h"
|
||||
#include "pvr_debug.h"
|
||||
#include "process_stats.h"
|
||||
#if defined(DEBUG) && defined(SUPPORT_VALIDATION)
|
||||
#include "pvrsrv.h"
|
||||
#endif
|
||||
#include "osfunc.h"
|
||||
|
||||
|
||||
/*
|
||||
* When memory statistics are disabled, memory records are used instead.
|
||||
* In order for these to work, the PID of the process that requested the
|
||||
* allocation needs to be stored at the end of the kmalloc'd memory, making
|
||||
* sure 4 extra bytes are allocated to fit the PID.
|
||||
*
|
||||
* There is no need for this extra allocation when memory statistics are
|
||||
* enabled, since all allocations are tracked in DebugFS mem_area files.
|
||||
*/
|
||||
#if defined(PVRSRV_ENABLE_PROCESS_STATS) && !defined(PVRSRV_ENABLE_MEMORY_STATS)
|
||||
#define ALLOCMEM_MEMSTATS_PADDING sizeof(IMG_UINT32)
|
||||
#else
|
||||
#define ALLOCMEM_MEMSTATS_PADDING 0UL
|
||||
#endif
|
||||
|
||||
/* How many times kmalloc can fail before the allocation threshold is reduced */
|
||||
static const IMG_UINT32 g_ui32kmallocFailLimit = 10;
|
||||
/* How many kmalloc failures happened since the last allocation threshold change */
|
||||
static IMG_UINT32 g_ui32kmallocFailCount = 0;
|
||||
/* Current kmalloc threshold value in bytes */
|
||||
static IMG_UINT32 g_ui32kmallocThreshold = PVR_LINUX_KMALLOC_ALLOCATION_THRESHOLD;
|
||||
/* Spinlock used so that the global variables above may not be modified by more than 1 thread at a time */
|
||||
static DEFINE_SPINLOCK(kmalloc_lock);
|
||||
|
||||
#if defined(DEBUG) && defined(SUPPORT_VALIDATION)
|
||||
static DEFINE_SPINLOCK(kmalloc_leak_lock);
|
||||
static IMG_UINT32 g_ui32kmallocLeakCounter = 0;
|
||||
#endif
|
||||
|
||||
static inline void OSTryDecreaseKmallocThreshold(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&kmalloc_lock, flags);
|
||||
|
||||
g_ui32kmallocFailCount++;
|
||||
|
||||
if (g_ui32kmallocFailCount >= g_ui32kmallocFailLimit)
|
||||
{
|
||||
g_ui32kmallocFailCount = 0;
|
||||
if (g_ui32kmallocThreshold > PAGE_SIZE)
|
||||
{
|
||||
g_ui32kmallocThreshold >>= 1;
|
||||
printk(KERN_INFO "Threshold is now set to %d\n", g_ui32kmallocThreshold);
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&kmalloc_lock, flags);
|
||||
}
|
||||
|
||||
static inline void OSResetKmallocFailCount(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&kmalloc_lock, flags);
|
||||
|
||||
g_ui32kmallocFailCount = 0;
|
||||
|
||||
spin_unlock_irqrestore(&kmalloc_lock, flags);
|
||||
}
|
||||
|
||||
static inline void _pvr_vfree(const void* pvAddr)
|
||||
{
|
||||
#if defined(DEBUG)
|
||||
/* Size harder to come by for vmalloc and since vmalloc allocates
|
||||
* a whole number of pages, poison the minimum size known to have
|
||||
* been allocated.
|
||||
*/
|
||||
OSCachedMemSet((void*)pvAddr, PVRSRV_POISON_ON_ALLOC_VALUE,
|
||||
PAGE_SIZE);
|
||||
#endif
|
||||
vfree(pvAddr);
|
||||
}
|
||||
|
||||
static inline void _pvr_kfree(const void* pvAddr)
|
||||
{
|
||||
#if defined(DEBUG)
|
||||
/* Poison whole memory block */
|
||||
OSCachedMemSet((void*)pvAddr, PVRSRV_POISON_ON_ALLOC_VALUE,
|
||||
ksize(pvAddr));
|
||||
#endif
|
||||
kfree(pvAddr);
|
||||
}
|
||||
|
||||
static inline void _pvr_alloc_stats_add(void *pvAddr, IMG_UINT32 ui32Size DEBUG_MEMSTATS_PARAMS)
|
||||
{
|
||||
#if !defined(PVRSRV_ENABLE_PROCESS_STATS)
|
||||
PVR_UNREFERENCED_PARAMETER(pvAddr);
|
||||
#else
|
||||
if (!is_vmalloc_addr(pvAddr))
|
||||
{
|
||||
#if defined(PVRSRV_ENABLE_MEMORY_STATS)
|
||||
IMG_CPU_PHYADDR sCpuPAddr;
|
||||
sCpuPAddr.uiAddr = 0;
|
||||
|
||||
PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE_KMALLOC,
|
||||
pvAddr,
|
||||
sCpuPAddr,
|
||||
ksize(pvAddr),
|
||||
NULL,
|
||||
OSGetCurrentClientProcessIDKM()
|
||||
DEBUG_MEMSTATS_ARGS);
|
||||
#else
|
||||
{
|
||||
/* Store the PID in the final additional 4 bytes allocated */
|
||||
IMG_UINT32 *puiTemp = IMG_OFFSET_ADDR(pvAddr, ksize(pvAddr) - ALLOCMEM_MEMSTATS_PADDING);
|
||||
*puiTemp = OSGetCurrentClientProcessIDKM();
|
||||
}
|
||||
PVRSRVStatsIncrMemAllocStat(PVRSRV_MEM_ALLOC_TYPE_KMALLOC, ksize(pvAddr), OSGetCurrentClientProcessIDKM());
|
||||
#endif /* defined(PVRSRV_ENABLE_MEMORY_STATS) */
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(PVRSRV_ENABLE_MEMORY_STATS)
|
||||
IMG_CPU_PHYADDR sCpuPAddr;
|
||||
sCpuPAddr.uiAddr = 0;
|
||||
|
||||
PVRSRVStatsAddMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE_VMALLOC,
|
||||
pvAddr,
|
||||
sCpuPAddr,
|
||||
((ui32Size + PAGE_SIZE-1) & ~(PAGE_SIZE-1)),
|
||||
NULL,
|
||||
OSGetCurrentClientProcessIDKM()
|
||||
DEBUG_MEMSTATS_ARGS);
|
||||
#else
|
||||
PVRSRVStatsIncrMemAllocStatAndTrack(PVRSRV_MEM_ALLOC_TYPE_VMALLOC,
|
||||
((ui32Size + PAGE_SIZE-1) & ~(PAGE_SIZE-1)),
|
||||
(IMG_UINT64)(uintptr_t) pvAddr,
|
||||
OSGetCurrentClientProcessIDKM());
|
||||
#endif /* defined(PVRSRV_ENABLE_MEMORY_STATS) */
|
||||
}
|
||||
#endif /* !defined(PVRSRV_ENABLE_PROCESS_STATS) */
|
||||
}
|
||||
|
||||
static inline void _pvr_alloc_stats_remove(void *pvAddr)
|
||||
{
|
||||
#if !defined(PVRSRV_ENABLE_PROCESS_STATS)
|
||||
PVR_UNREFERENCED_PARAMETER(pvAddr);
|
||||
#else
|
||||
if (!is_vmalloc_addr(pvAddr))
|
||||
{
|
||||
#if !defined(PVRSRV_ENABLE_MEMORY_STATS)
|
||||
{
|
||||
IMG_UINT32 *puiTemp = IMG_OFFSET_ADDR(pvAddr, ksize(pvAddr) - ALLOCMEM_MEMSTATS_PADDING);
|
||||
PVRSRVStatsDecrMemKAllocStat(ksize(pvAddr), *puiTemp);
|
||||
}
|
||||
#else
|
||||
PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE_KMALLOC,
|
||||
(IMG_UINT64)(uintptr_t) pvAddr,
|
||||
OSGetCurrentClientProcessIDKM());
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#if !defined(PVRSRV_ENABLE_MEMORY_STATS)
|
||||
PVRSRVStatsDecrMemAllocStatAndUntrack(PVRSRV_MEM_ALLOC_TYPE_VMALLOC,
|
||||
(IMG_UINT64)(uintptr_t) pvAddr);
|
||||
#else
|
||||
PVRSRVStatsRemoveMemAllocRecord(PVRSRV_MEM_ALLOC_TYPE_VMALLOC,
|
||||
(IMG_UINT64)(uintptr_t) pvAddr,
|
||||
OSGetCurrentClientProcessIDKM());
|
||||
#endif
|
||||
}
|
||||
#endif /* !defined(PVRSRV_ENABLE_PROCESS_STATS) */
|
||||
}
|
||||
|
||||
void *(OSAllocMem)(IMG_UINT32 ui32Size DEBUG_MEMSTATS_PARAMS)
|
||||
{
|
||||
void *pvRet = NULL;
|
||||
|
||||
if ((ui32Size + ALLOCMEM_MEMSTATS_PADDING) <= g_ui32kmallocThreshold)
|
||||
{
|
||||
pvRet = kmalloc(ui32Size + ALLOCMEM_MEMSTATS_PADDING, GFP_KERNEL);
|
||||
if (pvRet == NULL)
|
||||
{
|
||||
OSTryDecreaseKmallocThreshold();
|
||||
}
|
||||
else
|
||||
{
|
||||
OSResetKmallocFailCount();
|
||||
}
|
||||
}
|
||||
|
||||
if (pvRet == NULL)
|
||||
{
|
||||
pvRet = vmalloc(ui32Size);
|
||||
}
|
||||
|
||||
if (pvRet != NULL)
|
||||
{
|
||||
_pvr_alloc_stats_add(pvRet, ui32Size DEBUG_MEMSTATS_ARGS);
|
||||
}
|
||||
|
||||
return pvRet;
|
||||
}
|
||||
|
||||
void *(OSAllocZMem)(IMG_UINT32 ui32Size DEBUG_MEMSTATS_PARAMS)
|
||||
{
|
||||
void *pvRet = NULL;
|
||||
|
||||
if ((ui32Size + ALLOCMEM_MEMSTATS_PADDING) <= g_ui32kmallocThreshold)
|
||||
{
|
||||
pvRet = kzalloc(ui32Size + ALLOCMEM_MEMSTATS_PADDING, GFP_KERNEL);
|
||||
if (pvRet == NULL)
|
||||
{
|
||||
OSTryDecreaseKmallocThreshold();
|
||||
}
|
||||
else
|
||||
{
|
||||
OSResetKmallocFailCount();
|
||||
}
|
||||
}
|
||||
|
||||
if (pvRet == NULL)
|
||||
{
|
||||
pvRet = vzalloc(ui32Size);
|
||||
}
|
||||
|
||||
if (pvRet != NULL)
|
||||
{
|
||||
_pvr_alloc_stats_add(pvRet, ui32Size DEBUG_MEMSTATS_ARGS);
|
||||
}
|
||||
|
||||
return pvRet;
|
||||
}
|
||||
|
||||
/*
|
||||
* The parentheses around OSFreeMem prevent the macro in allocmem.h from
|
||||
* applying, as it would break the function's definition.
|
||||
*/
|
||||
void (OSFreeMem)(void *pvMem)
|
||||
{
|
||||
#if defined(DEBUG) && defined(SUPPORT_VALIDATION)
|
||||
unsigned long flags;
|
||||
PVRSRV_DATA *psPVRSRVData = PVRSRVGetPVRSRVData();
|
||||
|
||||
if (psPVRSRVData)
|
||||
{
|
||||
IMG_UINT32 ui32kmallocLeakMax = psPVRSRVData->sMemLeakIntervals.ui32OSAlloc;
|
||||
|
||||
spin_lock_irqsave(&kmalloc_leak_lock, flags);
|
||||
|
||||
g_ui32kmallocLeakCounter++;
|
||||
if (ui32kmallocLeakMax && (g_ui32kmallocLeakCounter >= ui32kmallocLeakMax))
|
||||
{
|
||||
g_ui32kmallocLeakCounter = 0;
|
||||
spin_unlock_irqrestore(&kmalloc_leak_lock, flags);
|
||||
|
||||
PVR_DPF((PVR_DBG_WARNING,
|
||||
"%s: Skipped freeing of pointer 0x%p to trigger memory leak.",
|
||||
__func__,
|
||||
pvMem));
|
||||
return;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&kmalloc_leak_lock, flags);
|
||||
}
|
||||
#endif
|
||||
if (pvMem != NULL)
|
||||
{
|
||||
_pvr_alloc_stats_remove(pvMem);
|
||||
|
||||
if (!is_vmalloc_addr(pvMem))
|
||||
{
|
||||
_pvr_kfree(pvMem);
|
||||
}
|
||||
else
|
||||
{
|
||||
_pvr_vfree(pvMem);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void *OSAllocMemNoStats(IMG_UINT32 ui32Size)
|
||||
{
|
||||
void *pvRet = NULL;
|
||||
|
||||
if (ui32Size <= g_ui32kmallocThreshold)
|
||||
{
|
||||
pvRet = kmalloc(ui32Size, GFP_KERNEL);
|
||||
if (pvRet == NULL)
|
||||
{
|
||||
OSTryDecreaseKmallocThreshold();
|
||||
}
|
||||
else
|
||||
{
|
||||
OSResetKmallocFailCount();
|
||||
}
|
||||
}
|
||||
|
||||
if (pvRet == NULL)
|
||||
{
|
||||
pvRet = vmalloc(ui32Size);
|
||||
}
|
||||
|
||||
return pvRet;
|
||||
}
|
||||
|
||||
void *OSAllocZMemNoStats(IMG_UINT32 ui32Size)
|
||||
{
|
||||
void *pvRet = NULL;
|
||||
|
||||
if (ui32Size <= g_ui32kmallocThreshold)
|
||||
{
|
||||
pvRet = kzalloc(ui32Size, GFP_KERNEL);
|
||||
if (pvRet == NULL)
|
||||
{
|
||||
OSTryDecreaseKmallocThreshold();
|
||||
}
|
||||
else
|
||||
{
|
||||
OSResetKmallocFailCount();
|
||||
}
|
||||
}
|
||||
|
||||
if (pvRet == NULL)
|
||||
{
|
||||
pvRet = vzalloc(ui32Size);
|
||||
}
|
||||
|
||||
return pvRet;
|
||||
}
|
||||
|
||||
/*
|
||||
* The parentheses around OSFreeMemNoStats prevent the macro in allocmem.h from
|
||||
* applying, as it would break the function's definition.
|
||||
*/
|
||||
void (OSFreeMemNoStats)(void *pvMem)
|
||||
{
|
||||
#if defined(DEBUG) && defined(SUPPORT_VALIDATION)
|
||||
unsigned long flags;
|
||||
PVRSRV_DATA *psPVRSRVData = PVRSRVGetPVRSRVData();
|
||||
|
||||
if (psPVRSRVData)
|
||||
{
|
||||
IMG_UINT32 ui32kmallocLeakMax = psPVRSRVData->sMemLeakIntervals.ui32OSAlloc;
|
||||
|
||||
spin_lock_irqsave(&kmalloc_leak_lock, flags);
|
||||
|
||||
g_ui32kmallocLeakCounter++;
|
||||
if (ui32kmallocLeakMax && (g_ui32kmallocLeakCounter >= ui32kmallocLeakMax))
|
||||
{
|
||||
g_ui32kmallocLeakCounter = 0;
|
||||
spin_unlock_irqrestore(&kmalloc_leak_lock, flags);
|
||||
|
||||
PVR_DPF((PVR_DBG_WARNING,
|
||||
"%s: Skipped freeing of pointer 0x%p to trigger memory leak.",
|
||||
__func__,
|
||||
pvMem));
|
||||
return;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&kmalloc_leak_lock, flags);
|
||||
}
|
||||
#endif
|
||||
if (pvMem != NULL)
|
||||
{
|
||||
if (!is_vmalloc_addr(pvMem))
|
||||
{
|
||||
_pvr_kfree(pvMem);
|
||||
}
|
||||
else
|
||||
{
|
||||
_pvr_vfree(pvMem);
|
||||
}
|
||||
}
|
||||
}
|
||||
224
drivers/gpu/drm/img-rogue/allocmem.h
Normal file
224
drivers/gpu/drm/img-rogue/allocmem.h
Normal file
@@ -0,0 +1,224 @@
|
||||
/*************************************************************************/ /*!
|
||||
@File allocmem.h
|
||||
@Title memory allocation header
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Memory-Allocation API definitions
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/ /**************************************************************************/
|
||||
|
||||
#ifndef ALLOCMEM_H
|
||||
#define ALLOCMEM_H
|
||||
|
||||
#include "img_types.h"
|
||||
#include "pvr_debug.h"
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PVRSRV_ENABLE_PROCESS_STATS enables process statistics regarding events,
|
||||
* resources and memory across all processes
|
||||
* PVRSRV_ENABLE_MEMORY_STATS enables recording of Linux kernel memory
|
||||
* allocations, provided that PVRSRV_ENABLE_PROCESS_STATS is enabled
|
||||
* - Output can be found in:
|
||||
* /(sys/kernel/debug|proc)/pvr/proc_stats/[live|retired]_pids_stats/mem_area
|
||||
* PVRSRV_DEBUG_LINUX_MEMORY_STATS provides more details about memory
|
||||
* statistics in conjunction with PVRSRV_ENABLE_MEMORY_STATS
|
||||
* PVRSRV_DEBUG_LINUX_MEMORY_STATS_ON is defined to encompass both memory
|
||||
* allocation statistics functionalities described above in a single macro
|
||||
*/
|
||||
#if defined(PVRSRV_ENABLE_PROCESS_STATS) && defined(PVRSRV_ENABLE_MEMORY_STATS) && defined(PVRSRV_DEBUG_LINUX_MEMORY_STATS) && defined(DEBUG)
|
||||
#define PVRSRV_DEBUG_LINUX_MEMORY_STATS_ON
|
||||
#endif
|
||||
|
||||
/*
|
||||
* When using detailed memory allocation statistics, the line number and
|
||||
* file name where the allocation happened are also provided.
|
||||
* When this feature is not used, these parameters are not needed.
|
||||
*/
|
||||
#if defined(PVRSRV_DEBUG_LINUX_MEMORY_STATS_ON)
|
||||
#define DEBUG_MEMSTATS_PARAMS ,void *pvAllocFromFile, IMG_UINT32 ui32AllocFromLine
|
||||
#define DEBUG_MEMSTATS_ARGS ,pvAllocFromFile, ui32AllocFromLine
|
||||
#define DEBUG_MEMSTATS_UNREF (void)pvAllocFromFile; (void)ui32AllocFromLine;
|
||||
#define DEBUG_MEMSTATS_VALUES ,__FILE__, __LINE__
|
||||
#else
|
||||
#define DEBUG_MEMSTATS_PARAMS /*!<
|
||||
* Used for PVRSRV_DEBUG_LINUX_MEMORY_STATS_ON
|
||||
* build option. */
|
||||
#define DEBUG_MEMSTATS_ARGS /*!<
|
||||
* Used for PVRSRV_DEBUG_LINUX_MEMORY_STATS_ON
|
||||
* build option. */
|
||||
#define DEBUG_MEMSTATS_UNREF /*!<
|
||||
* Used for PVRSRV_DEBUG_LINUX_MEMORY_STATS_ON
|
||||
* build option. */
|
||||
#define DEBUG_MEMSTATS_VALUES /*!<
|
||||
* Used for PVRSRV_DEBUG_LINUX_MEMORY_STATS_ON
|
||||
* build option. */
|
||||
#endif
|
||||
|
||||
|
||||
/**************************************************************************/ /*!
|
||||
@Function OSAllocMem
|
||||
@Description Allocates CPU memory. Contents are uninitialized.
|
||||
If passed a size of zero, function should not assert,
|
||||
but just return a NULL pointer.
|
||||
@Input ui32Size Size of required allocation (in bytes)
|
||||
@Return Pointer to allocated memory on success.
|
||||
Otherwise NULL.
|
||||
*/ /**************************************************************************/
|
||||
#if defined(DOXYGEN)
|
||||
void *OSAllocMem(IMG_UINT32 ui32Size);
|
||||
#else
|
||||
void *OSAllocMem(IMG_UINT32 ui32Size DEBUG_MEMSTATS_PARAMS);
|
||||
#define OSAllocMem(_size) (OSAllocMem)((_size) DEBUG_MEMSTATS_VALUES)
|
||||
#endif
|
||||
|
||||
/**************************************************************************/ /*!
|
||||
@Function OSAllocZMem
|
||||
@Description Allocates CPU memory and initializes the contents to zero.
|
||||
If passed a size of zero, function should not assert,
|
||||
but just return a NULL pointer.
|
||||
@Input ui32Size Size of required allocation (in bytes)
|
||||
@Return Pointer to allocated memory on success.
|
||||
Otherwise NULL.
|
||||
*/ /**************************************************************************/
|
||||
#if defined(DOXYGEN)
|
||||
void *OSAllocZMem(IMG_UINT32 ui32Size);
|
||||
#else
|
||||
void *OSAllocZMem(IMG_UINT32 ui32Size DEBUG_MEMSTATS_PARAMS);
|
||||
#define OSAllocZMem(_size) (OSAllocZMem)((_size) DEBUG_MEMSTATS_VALUES)
|
||||
#endif
|
||||
|
||||
|
||||
/**************************************************************************/ /*!
|
||||
@Function OSAllocMemNoStats
|
||||
@Description Allocates CPU memory. Contents are uninitialized.
|
||||
If passed a size of zero, function should not assert,
|
||||
but just return a NULL pointer.
|
||||
The allocated memory is not accounted for by process stats.
|
||||
Process stats are an optional feature (enabled only when
|
||||
PVRSRV_ENABLE_PROCESS_STATS is defined) which track the amount
|
||||
of memory allocated to help in debugging. Where this is not
|
||||
required, OSAllocMem() and OSAllocMemNoStats() equate to
|
||||
the same operation.
|
||||
@Input ui32Size Size of required allocation (in bytes)
|
||||
@Return Pointer to allocated memory on success.
|
||||
Otherwise NULL.
|
||||
*/ /**************************************************************************/
|
||||
void *OSAllocMemNoStats(IMG_UINT32 ui32Size);
|
||||
|
||||
/**************************************************************************/ /*!
|
||||
@Function OSAllocZMemNoStats
|
||||
@Description Allocates CPU memory and initializes the contents to zero.
|
||||
If passed a size of zero, function should not assert,
|
||||
but just return a NULL pointer.
|
||||
The allocated memory is not accounted for by process stats.
|
||||
Process stats are an optional feature (enabled only when
|
||||
PVRSRV_ENABLE_PROCESS_STATS is defined) which track the amount
|
||||
of memory allocated to help in debugging. Where this is not
|
||||
required, OSAllocZMem() and OSAllocZMemNoStats() equate to
|
||||
the same operation.
|
||||
@Input ui32Size Size of required allocation (in bytes)
|
||||
@Return Pointer to allocated memory on success.
|
||||
Otherwise NULL.
|
||||
*/ /**************************************************************************/
|
||||
void *OSAllocZMemNoStats(IMG_UINT32 ui32Size);
|
||||
|
||||
/**************************************************************************/ /*!
|
||||
@Function OSFreeMem
|
||||
@Description Frees previously allocated CPU memory.
|
||||
@Input pvCpuVAddr Pointer to the memory to be freed.
|
||||
@Return None.
|
||||
*/ /**************************************************************************/
|
||||
void OSFreeMem(void *pvCpuVAddr);
|
||||
|
||||
/**************************************************************************/ /*!
|
||||
@Function OSFreeMemNoStats
|
||||
@Description Frees previously allocated CPU memory.
|
||||
The freed memory does not update the figures in process stats.
|
||||
Process stats are an optional feature (enabled only when
|
||||
PVRSRV_ENABLE_PROCESS_STATS is defined) which track the amount
|
||||
of memory allocated to help in debugging. Where this is not
|
||||
required, OSFreeMem() and OSFreeMemNoStats() equate to the
|
||||
same operation.
|
||||
@Input pvCpuVAddr Pointer to the memory to be freed.
|
||||
@Return None.
|
||||
*/ /**************************************************************************/
|
||||
void OSFreeMemNoStats(void *pvCpuVAddr);
|
||||
|
||||
/*
|
||||
* These macros allow us to catch double-free bugs on DEBUG builds and
|
||||
* prevent crashes on RELEASE builds.
|
||||
*/
|
||||
|
||||
/*! @cond Doxygen_Suppress */
|
||||
#if defined(DEBUG)
|
||||
#define double_free_sentinel ((void *)&OSFreeMem)
|
||||
#define ALLOCMEM_ASSERT(exp) PVR_ASSERT(exp)
|
||||
#else
|
||||
#define double_free_sentinel NULL
|
||||
#define ALLOCMEM_ASSERT(exp) do {} while (0)
|
||||
#endif
|
||||
/*! @endcond */
|
||||
|
||||
/*! Frees memory allocated by OSAllocMem(). */
|
||||
#define OSFreeMem(_ptr) do { \
|
||||
ALLOCMEM_ASSERT((_ptr) != double_free_sentinel); \
|
||||
(OSFreeMem)(_ptr); \
|
||||
(_ptr) = double_free_sentinel; \
|
||||
MSC_SUPPRESS_4127 \
|
||||
} while (0)
|
||||
|
||||
/*! Frees memory allocated by OSAllocMemNoStats(). */
|
||||
#define OSFreeMemNoStats(_ptr) do { \
|
||||
ALLOCMEM_ASSERT((_ptr) != double_free_sentinel); \
|
||||
(OSFreeMemNoStats)(_ptr); \
|
||||
(_ptr) = double_free_sentinel; \
|
||||
MSC_SUPPRESS_4127 \
|
||||
} while (0)
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ALLOCMEM_H */
|
||||
|
||||
/******************************************************************************
|
||||
End of file (allocmem.h)
|
||||
******************************************************************************/
|
||||
1630
drivers/gpu/drm/img-rogue/cache_km.c
Normal file
1630
drivers/gpu/drm/img-rogue/cache_km.c
Normal file
File diff suppressed because it is too large
Load Diff
151
drivers/gpu/drm/img-rogue/cache_km.h
Normal file
151
drivers/gpu/drm/img-rogue/cache_km.h
Normal file
@@ -0,0 +1,151 @@
|
||||
/*************************************************************************/ /*!
|
||||
@File cache_km.h
|
||||
@Title CPU cache management header
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/ /**************************************************************************/
|
||||
|
||||
#ifndef CACHE_KM_H
|
||||
#define CACHE_KM_H
|
||||
|
||||
#if defined(__linux__)
|
||||
#include <linux/version.h>
|
||||
#else
|
||||
#define KERNEL_VERSION
|
||||
#endif
|
||||
|
||||
#include "pvrsrv_error.h"
|
||||
#include "os_cpu_cache.h"
|
||||
#include "img_types.h"
|
||||
#include "cache_ops.h"
|
||||
#include "device.h"
|
||||
#include "pmr.h"
|
||||
|
||||
typedef IMG_UINT32 PVRSRV_CACHE_OP_ADDR_TYPE; /*!< Represents CPU address type required for CPU d-cache maintenance */
|
||||
#define PVRSRV_CACHE_OP_ADDR_TYPE_VIRTUAL 0x1 /*!< Operation requires CPU virtual address only */
|
||||
#define PVRSRV_CACHE_OP_ADDR_TYPE_PHYSICAL 0x2 /*!< Operation requires CPU physical address only */
|
||||
#define PVRSRV_CACHE_OP_ADDR_TYPE_BOTH 0x3 /*!< Operation requires both CPU virtual & physical addresses */
|
||||
|
||||
#include "connection_server.h"
|
||||
|
||||
/*
|
||||
* CacheOpInit() & CacheOpDeInit()
|
||||
*
|
||||
* This must be called to initialise the KM cache maintenance framework.
|
||||
* This is called early during the driver/module (un)loading phase.
|
||||
*/
|
||||
PVRSRV_ERROR CacheOpInit(void);
|
||||
void CacheOpDeInit(void);
|
||||
|
||||
/*
|
||||
* CacheOpInit2() & CacheOpDeInit2()
|
||||
*
|
||||
* This must be called to initialise the UM cache maintenance framework.
|
||||
* This is called when the driver is loaded/unloaded from the kernel.
|
||||
*/
|
||||
PVRSRV_ERROR CacheOpInit2(void);
|
||||
void CacheOpDeInit2(void);
|
||||
|
||||
/*
|
||||
* CacheOpExec()
|
||||
*
|
||||
* This is the primary CPU data-cache maintenance interface and it is
|
||||
* always guaranteed to be synchronous; the arguments supplied must be
|
||||
* pre-validated for performance reasons else the d-cache maintenance
|
||||
* operation might cause the underlying OS kernel to fault.
|
||||
*/
|
||||
PVRSRV_ERROR CacheOpExec(PPVRSRV_DEVICE_NODE psDevNode,
|
||||
void *pvVirtStart,
|
||||
void *pvVirtEnd,
|
||||
IMG_CPU_PHYADDR sCPUPhysStart,
|
||||
IMG_CPU_PHYADDR sCPUPhysEnd,
|
||||
PVRSRV_CACHE_OP uiCacheOp);
|
||||
|
||||
/*
|
||||
* CacheOpValExec()
|
||||
*
|
||||
* Same as CacheOpExec(), except arguments are _Validated_ before being
|
||||
* presented to the underlying OS kernel for CPU data-cache maintenance.
|
||||
* The uiAddress is the start CPU virtual address for the to-be d-cache
|
||||
* maintained PMR, it can be NULL in which case a remap will be performed
|
||||
* internally, if required for cache maintenance. This is primarily used
|
||||
* as the services client bridge call handler for synchronous user-mode
|
||||
* cache maintenance requests.
|
||||
*/
|
||||
PVRSRV_ERROR CacheOpValExec(PMR *psPMR,
|
||||
IMG_UINT64 uiAddress,
|
||||
IMG_DEVMEM_OFFSET_T uiOffset,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
PVRSRV_CACHE_OP uiCacheOp);
|
||||
|
||||
/*
|
||||
* CacheOpQueue()
|
||||
*
|
||||
* This is the secondary cache maintenance interface and it is not
|
||||
* guaranteed to be synchronous in that requests could be deferred
|
||||
* and executed asynchronously. This interface is primarily meant
|
||||
* as services client bridge call handler. Both uiInfoPgGFSeqNum
|
||||
* and ui32[Current,Next]FenceSeqNum implements an internal client
|
||||
* server queueing protocol so making use of this interface outside
|
||||
* of services client is not recommended and should not be done.
|
||||
*/
|
||||
PVRSRV_ERROR CacheOpQueue(CONNECTION_DATA *psConnection,
|
||||
PPVRSRV_DEVICE_NODE psDevNode,
|
||||
IMG_UINT32 ui32OpCount,
|
||||
PMR **ppsPMR,
|
||||
IMG_UINT64 *puiAddress,
|
||||
IMG_DEVMEM_OFFSET_T *puiOffset,
|
||||
IMG_DEVMEM_SIZE_T *puiSize,
|
||||
PVRSRV_CACHE_OP *puiCacheOp,
|
||||
IMG_UINT32 ui32OpTimeline);
|
||||
|
||||
/*
|
||||
* CacheOpLog()
|
||||
*
|
||||
* This is used for logging client cache maintenance operations that
|
||||
* was executed in user-space.
|
||||
*/
|
||||
PVRSRV_ERROR CacheOpLog(PMR *psPMR,
|
||||
IMG_UINT64 uiAddress,
|
||||
IMG_DEVMEM_OFFSET_T uiOffset,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
IMG_UINT64 ui64StartTime,
|
||||
IMG_UINT64 ui64EndTime,
|
||||
PVRSRV_CACHE_OP uiCacheOp);
|
||||
|
||||
#endif /* CACHE_KM_H */
|
||||
61
drivers/gpu/drm/img-rogue/cache_ops.h
Normal file
61
drivers/gpu/drm/img-rogue/cache_ops.h
Normal file
@@ -0,0 +1,61 @@
|
||||
/*************************************************************************/ /*!
|
||||
@File
|
||||
@Title Services cache management header
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Defines for cache management which are visible internally
|
||||
and externally
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/ /**************************************************************************/
|
||||
|
||||
#ifndef CACHE_OPS_H
|
||||
#define CACHE_OPS_H
|
||||
#include "img_types.h"
|
||||
/*!
|
||||
* @Defgroup CPUCacheAPIs
|
||||
* @{
|
||||
*/
|
||||
#define CACHE_BATCH_MAX (8U)
|
||||
#define MAX_DMA_OPS (34)
|
||||
typedef IMG_UINT32 PVRSRV_CACHE_OP; /*!< Type represents cache maintenance operation */
|
||||
#define PVRSRV_CACHE_OP_NONE 0x0U /*!< No operation */
|
||||
#define PVRSRV_CACHE_OP_CLEAN 0x1U /*!< Flush w/o invalidate */
|
||||
#define PVRSRV_CACHE_OP_INVALIDATE 0x2U /*!< Invalidate w/o flush */
|
||||
#define PVRSRV_CACHE_OP_FLUSH 0x3U /*!< Flush w/ invalidate */
|
||||
/*! @} End of Defgroup CPUCacheAPIs */
|
||||
|
||||
#endif /* CACHE_OPS_H */
|
||||
80
drivers/gpu/drm/img-rogue/client_cache_bridge.h
Normal file
80
drivers/gpu/drm/img-rogue/client_cache_bridge.h
Normal file
@@ -0,0 +1,80 @@
|
||||
/*******************************************************************************
|
||||
@File
|
||||
@Title Client bridge header for cache
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Exports the client bridge functions for cache
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef CLIENT_CACHE_BRIDGE_H
|
||||
#define CLIENT_CACHE_BRIDGE_H
|
||||
|
||||
#include "img_defs.h"
|
||||
#include "pvrsrv_error.h"
|
||||
|
||||
#if defined(PVR_INDIRECT_BRIDGE_CLIENTS)
|
||||
#include "pvr_bridge_client.h"
|
||||
#include "pvr_bridge.h"
|
||||
#endif
|
||||
|
||||
#include "common_cache_bridge.h"
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeCacheOpQueue(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32NumCacheOps,
|
||||
IMG_HANDLE * phPMR,
|
||||
IMG_UINT64 * pui64Address,
|
||||
IMG_DEVMEM_OFFSET_T * puiOffset,
|
||||
IMG_DEVMEM_SIZE_T * puiSize,
|
||||
PVRSRV_CACHE_OP * piuCacheOp,
|
||||
IMG_UINT32 ui32OpTimeline);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeCacheOpExec(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_UINT64 ui64Address,
|
||||
IMG_DEVMEM_OFFSET_T uiOffset,
|
||||
IMG_DEVMEM_SIZE_T uiSize, PVRSRV_CACHE_OP iuCacheOp);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeCacheOpLog(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_UINT64 ui64Address,
|
||||
IMG_DEVMEM_OFFSET_T uiOffset,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
IMG_INT64 i64StartTime,
|
||||
IMG_INT64 i64EndTime, PVRSRV_CACHE_OP iuCacheOp);
|
||||
|
||||
#endif /* CLIENT_CACHE_BRIDGE_H */
|
||||
112
drivers/gpu/drm/img-rogue/client_cache_direct_bridge.c
Normal file
112
drivers/gpu/drm/img-rogue/client_cache_direct_bridge.c
Normal file
@@ -0,0 +1,112 @@
|
||||
/*******************************************************************************
|
||||
@File
|
||||
@Title Direct client bridge for cache
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Implements the client side of the bridge for cache
|
||||
which is used in calls from Server context.
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*******************************************************************************/
|
||||
|
||||
#include "client_cache_bridge.h"
|
||||
#include "img_defs.h"
|
||||
#include "pvr_debug.h"
|
||||
|
||||
/* Module specific includes */
|
||||
#include "cache_ops.h"
|
||||
|
||||
#include "cache_km.h"
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeCacheOpQueue(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32NumCacheOps,
|
||||
IMG_HANDLE * phPMR,
|
||||
IMG_UINT64 * pui64Address,
|
||||
IMG_DEVMEM_OFFSET_T * puiOffset,
|
||||
IMG_DEVMEM_SIZE_T * puiSize,
|
||||
PVRSRV_CACHE_OP * piuCacheOp,
|
||||
IMG_UINT32 ui32OpTimeline)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR **psPMRInt;
|
||||
|
||||
psPMRInt = (PMR **) phPMR;
|
||||
|
||||
eError =
|
||||
CacheOpQueue(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
ui32NumCacheOps,
|
||||
psPMRInt, pui64Address, puiOffset, puiSize, piuCacheOp, ui32OpTimeline);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeCacheOpExec(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_UINT64 ui64Address,
|
||||
IMG_DEVMEM_OFFSET_T uiOffset,
|
||||
IMG_DEVMEM_SIZE_T uiSize, PVRSRV_CACHE_OP iuCacheOp)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError = CacheOpValExec(psPMRInt, ui64Address, uiOffset, uiSize, iuCacheOp);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeCacheOpLog(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_UINT64 ui64Address,
|
||||
IMG_DEVMEM_OFFSET_T uiOffset,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
IMG_INT64 i64StartTime,
|
||||
IMG_INT64 i64EndTime, PVRSRV_CACHE_OP iuCacheOp)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError =
|
||||
CacheOpLog(psPMRInt,
|
||||
ui64Address, uiOffset, uiSize, i64StartTime, i64EndTime, iuCacheOp);
|
||||
|
||||
return eError;
|
||||
}
|
||||
111
drivers/gpu/drm/img-rogue/client_devicememhistory_bridge.h
Normal file
111
drivers/gpu/drm/img-rogue/client_devicememhistory_bridge.h
Normal file
@@ -0,0 +1,111 @@
|
||||
/*******************************************************************************
|
||||
@File
|
||||
@Title Client bridge header for devicememhistory
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Exports the client bridge functions for devicememhistory
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef CLIENT_DEVICEMEMHISTORY_BRIDGE_H
|
||||
#define CLIENT_DEVICEMEMHISTORY_BRIDGE_H
|
||||
|
||||
#include "img_defs.h"
|
||||
#include "pvrsrv_error.h"
|
||||
|
||||
#if defined(PVR_INDIRECT_BRIDGE_CLIENTS)
|
||||
#include "pvr_bridge_client.h"
|
||||
#include "pvr_bridge.h"
|
||||
#endif
|
||||
|
||||
#include "common_devicememhistory_bridge.h"
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevicememHistoryMap(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_DEVMEM_SIZE_T uiOffset,
|
||||
IMG_DEV_VIRTADDR sDevVAddr,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
const IMG_CHAR * puiText,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
IMG_UINT32 ui32AllocationIndex,
|
||||
IMG_UINT32 * pui32AllocationIndexOut);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevicememHistoryUnmap(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_DEVMEM_SIZE_T uiOffset,
|
||||
IMG_DEV_VIRTADDR sDevVAddr,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
const IMG_CHAR * puiText,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
IMG_UINT32 ui32AllocationIndex,
|
||||
IMG_UINT32 * pui32AllocationIndexOut);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevicememHistoryMapVRange(IMG_HANDLE hBridge,
|
||||
IMG_DEV_VIRTADDR sBaseDevVAddr,
|
||||
IMG_UINT32 ui32ui32StartPage,
|
||||
IMG_UINT32 ui32NumPages,
|
||||
IMG_DEVMEM_SIZE_T uiAllocSize,
|
||||
const IMG_CHAR * puiText,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
IMG_UINT32 ui32AllocationIndex,
|
||||
IMG_UINT32 * pui32AllocationIndexOut);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevicememHistoryUnmapVRange(IMG_HANDLE hBridge,
|
||||
IMG_DEV_VIRTADDR sBaseDevVAddr,
|
||||
IMG_UINT32 ui32ui32StartPage,
|
||||
IMG_UINT32 ui32NumPages,
|
||||
IMG_DEVMEM_SIZE_T uiAllocSize,
|
||||
const IMG_CHAR * puiText,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
IMG_UINT32 ui32AllocationIndex,
|
||||
IMG_UINT32 * pui32AllocationIndexOut);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevicememHistorySparseChange(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_DEVMEM_SIZE_T uiOffset,
|
||||
IMG_DEV_VIRTADDR sDevVAddr,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
const IMG_CHAR * puiText,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
IMG_UINT32 ui32AllocPageCount,
|
||||
IMG_UINT32 * pui32AllocPageIndices,
|
||||
IMG_UINT32 ui32FreePageCount,
|
||||
IMG_UINT32 * pui32FreePageIndices,
|
||||
IMG_UINT32 ui32AllocationIndex,
|
||||
IMG_UINT32 * pui32AllocationIndexOut);
|
||||
|
||||
#endif /* CLIENT_DEVICEMEMHISTORY_BRIDGE_H */
|
||||
@@ -0,0 +1,194 @@
|
||||
/*******************************************************************************
|
||||
@File
|
||||
@Title Direct client bridge for devicememhistory
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Implements the client side of the bridge for devicememhistory
|
||||
which is used in calls from Server context.
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*******************************************************************************/
|
||||
|
||||
#include "client_devicememhistory_bridge.h"
|
||||
#include "img_defs.h"
|
||||
#include "pvr_debug.h"
|
||||
|
||||
/* Module specific includes */
|
||||
#include "img_types.h"
|
||||
#include "img_defs.h"
|
||||
#include "devicemem_typedefs.h"
|
||||
|
||||
#include "devicemem_history_server.h"
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevicememHistoryMap(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_DEVMEM_SIZE_T uiOffset,
|
||||
IMG_DEV_VIRTADDR sDevVAddr,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
const IMG_CHAR * puiText,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
IMG_UINT32 ui32AllocationIndex,
|
||||
IMG_UINT32 * pui32AllocationIndexOut)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError =
|
||||
DevicememHistoryMapKM(psPMRInt,
|
||||
uiOffset,
|
||||
sDevVAddr,
|
||||
uiSize,
|
||||
puiText,
|
||||
ui32Log2PageSize, ui32AllocationIndex, pui32AllocationIndexOut);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevicememHistoryUnmap(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_DEVMEM_SIZE_T uiOffset,
|
||||
IMG_DEV_VIRTADDR sDevVAddr,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
const IMG_CHAR * puiText,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
IMG_UINT32 ui32AllocationIndex,
|
||||
IMG_UINT32 * pui32AllocationIndexOut)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError =
|
||||
DevicememHistoryUnmapKM(psPMRInt,
|
||||
uiOffset,
|
||||
sDevVAddr,
|
||||
uiSize,
|
||||
puiText,
|
||||
ui32Log2PageSize, ui32AllocationIndex, pui32AllocationIndexOut);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevicememHistoryMapVRange(IMG_HANDLE hBridge,
|
||||
IMG_DEV_VIRTADDR sBaseDevVAddr,
|
||||
IMG_UINT32 ui32ui32StartPage,
|
||||
IMG_UINT32 ui32NumPages,
|
||||
IMG_DEVMEM_SIZE_T uiAllocSize,
|
||||
const IMG_CHAR * puiText,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
IMG_UINT32 ui32AllocationIndex,
|
||||
IMG_UINT32 * pui32AllocationIndexOut)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
DevicememHistoryMapVRangeKM(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
sBaseDevVAddr,
|
||||
ui32ui32StartPage,
|
||||
ui32NumPages,
|
||||
uiAllocSize,
|
||||
puiText,
|
||||
ui32Log2PageSize,
|
||||
ui32AllocationIndex, pui32AllocationIndexOut);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevicememHistoryUnmapVRange(IMG_HANDLE hBridge,
|
||||
IMG_DEV_VIRTADDR sBaseDevVAddr,
|
||||
IMG_UINT32 ui32ui32StartPage,
|
||||
IMG_UINT32 ui32NumPages,
|
||||
IMG_DEVMEM_SIZE_T uiAllocSize,
|
||||
const IMG_CHAR * puiText,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
IMG_UINT32 ui32AllocationIndex,
|
||||
IMG_UINT32 * pui32AllocationIndexOut)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
DevicememHistoryUnmapVRangeKM(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
sBaseDevVAddr,
|
||||
ui32ui32StartPage,
|
||||
ui32NumPages,
|
||||
uiAllocSize,
|
||||
puiText,
|
||||
ui32Log2PageSize,
|
||||
ui32AllocationIndex, pui32AllocationIndexOut);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevicememHistorySparseChange(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_DEVMEM_SIZE_T uiOffset,
|
||||
IMG_DEV_VIRTADDR sDevVAddr,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
const IMG_CHAR * puiText,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
IMG_UINT32 ui32AllocPageCount,
|
||||
IMG_UINT32 * pui32AllocPageIndices,
|
||||
IMG_UINT32 ui32FreePageCount,
|
||||
IMG_UINT32 * pui32FreePageIndices,
|
||||
IMG_UINT32 ui32AllocationIndex,
|
||||
IMG_UINT32 * pui32AllocationIndexOut)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError =
|
||||
DevicememHistorySparseChangeKM(psPMRInt,
|
||||
uiOffset,
|
||||
sDevVAddr,
|
||||
uiSize,
|
||||
puiText,
|
||||
ui32Log2PageSize,
|
||||
ui32AllocPageCount,
|
||||
pui32AllocPageIndices,
|
||||
ui32FreePageCount,
|
||||
pui32FreePageIndices,
|
||||
ui32AllocationIndex, pui32AllocationIndexOut);
|
||||
|
||||
return eError;
|
||||
}
|
||||
71
drivers/gpu/drm/img-rogue/client_htbuffer_bridge.h
Normal file
71
drivers/gpu/drm/img-rogue/client_htbuffer_bridge.h
Normal file
@@ -0,0 +1,71 @@
|
||||
/*******************************************************************************
|
||||
@File
|
||||
@Title Client bridge header for htbuffer
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Exports the client bridge functions for htbuffer
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef CLIENT_HTBUFFER_BRIDGE_H
|
||||
#define CLIENT_HTBUFFER_BRIDGE_H
|
||||
|
||||
#include "img_defs.h"
|
||||
#include "pvrsrv_error.h"
|
||||
|
||||
#if defined(PVR_INDIRECT_BRIDGE_CLIENTS)
|
||||
#include "pvr_bridge_client.h"
|
||||
#include "pvr_bridge.h"
|
||||
#endif
|
||||
|
||||
#include "common_htbuffer_bridge.h"
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHTBControl(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32NumGroups,
|
||||
IMG_UINT32 * pui32GroupEnable,
|
||||
IMG_UINT32 ui32LogLevel,
|
||||
IMG_UINT32 ui32EnablePID,
|
||||
IMG_UINT32 ui32LogMode, IMG_UINT32 ui32OpMode);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHTBLog(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32PID,
|
||||
IMG_UINT32 ui32TID,
|
||||
IMG_UINT64 ui64TimeStamp,
|
||||
IMG_UINT32 ui32SF,
|
||||
IMG_UINT32 ui32NumArgs, IMG_UINT32 * pui32Args);
|
||||
|
||||
#endif /* CLIENT_HTBUFFER_BRIDGE_H */
|
||||
85
drivers/gpu/drm/img-rogue/client_htbuffer_direct_bridge.c
Normal file
85
drivers/gpu/drm/img-rogue/client_htbuffer_direct_bridge.c
Normal file
@@ -0,0 +1,85 @@
|
||||
/*******************************************************************************
|
||||
@File
|
||||
@Title Direct client bridge for htbuffer
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Implements the client side of the bridge for htbuffer
|
||||
which is used in calls from Server context.
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*******************************************************************************/
|
||||
|
||||
#include "client_htbuffer_bridge.h"
|
||||
#include "img_defs.h"
|
||||
#include "pvr_debug.h"
|
||||
|
||||
/* Module specific includes */
|
||||
#include "devicemem_typedefs.h"
|
||||
#include "htbuffer_types.h"
|
||||
|
||||
#include "htbserver.h"
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHTBControl(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32NumGroups,
|
||||
IMG_UINT32 * pui32GroupEnable,
|
||||
IMG_UINT32 ui32LogLevel,
|
||||
IMG_UINT32 ui32EnablePID,
|
||||
IMG_UINT32 ui32LogMode, IMG_UINT32 ui32OpMode)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
eError =
|
||||
HTBControlKM(ui32NumGroups,
|
||||
pui32GroupEnable, ui32LogLevel, ui32EnablePID, ui32LogMode, ui32OpMode);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHTBLog(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32PID,
|
||||
IMG_UINT32 ui32TID,
|
||||
IMG_UINT64 ui64TimeStamp,
|
||||
IMG_UINT32 ui32SF,
|
||||
IMG_UINT32 ui32NumArgs, IMG_UINT32 * pui32Args)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
eError = HTBLogKM(ui32PID, ui32TID, ui64TimeStamp, ui32SF, ui32NumArgs, pui32Args);
|
||||
|
||||
return eError;
|
||||
}
|
||||
265
drivers/gpu/drm/img-rogue/client_mm_bridge.h
Normal file
265
drivers/gpu/drm/img-rogue/client_mm_bridge.h
Normal file
@@ -0,0 +1,265 @@
|
||||
/*******************************************************************************
|
||||
@File
|
||||
@Title Client bridge header for mm
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Exports the client bridge functions for mm
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef CLIENT_MM_BRIDGE_H
|
||||
#define CLIENT_MM_BRIDGE_H
|
||||
|
||||
#include "img_defs.h"
|
||||
#include "pvrsrv_error.h"
|
||||
|
||||
#if defined(PVR_INDIRECT_BRIDGE_CLIENTS)
|
||||
#include "pvr_bridge_client.h"
|
||||
#include "pvr_bridge.h"
|
||||
#endif
|
||||
|
||||
#include "common_mm_bridge.h"
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRExportPMR(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_HANDLE * phPMRExport,
|
||||
IMG_UINT64 * pui64Size,
|
||||
IMG_UINT32 * pui32Log2Contig,
|
||||
IMG_UINT64 * pui64Password);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRUnexportPMR(IMG_HANDLE hBridge, IMG_HANDLE hPMRExport);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRGetUID(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR, IMG_UINT64 * pui64UID);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRMakeLocalImportHandle(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hBuffer, IMG_HANDLE * phExtMem);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRUnmakeLocalImportHandle(IMG_HANDLE hBridge, IMG_HANDLE hExtMem);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRImportPMR(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMRExport,
|
||||
IMG_UINT64 ui64uiPassword,
|
||||
IMG_UINT64 ui64uiSize,
|
||||
IMG_UINT32 ui32uiLog2Contig, IMG_HANDLE * phPMR);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRLocalImportPMR(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hExtHandle,
|
||||
IMG_HANDLE * phPMR,
|
||||
IMG_DEVMEM_SIZE_T * puiSize,
|
||||
IMG_DEVMEM_ALIGN_T * puiAlign);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRUnrefPMR(IMG_HANDLE hBridge, IMG_HANDLE hPMR);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRUnrefUnlockPMR(IMG_HANDLE hBridge, IMG_HANDLE hPMR);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePhysmemNewRamBackedPMR(IMG_HANDLE hBridge,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
IMG_DEVMEM_SIZE_T uiChunkSize,
|
||||
IMG_UINT32 ui32NumPhysChunks,
|
||||
IMG_UINT32 ui32NumVirtChunks,
|
||||
IMG_UINT32 * pui32MappingTable,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
PVRSRV_MEMALLOCFLAGS_T uiFlags,
|
||||
IMG_UINT32 ui32AnnotationLength,
|
||||
const IMG_CHAR * puiAnnotation,
|
||||
IMG_PID ui32PID,
|
||||
IMG_HANDLE * phPMRPtr,
|
||||
IMG_UINT32 ui32PDumpFlags,
|
||||
PVRSRV_MEMALLOCFLAGS_T * puiOutFlags);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePhysmemNewRamBackedLockedPMR(IMG_HANDLE hBridge,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
IMG_DEVMEM_SIZE_T uiChunkSize,
|
||||
IMG_UINT32 ui32NumPhysChunks,
|
||||
IMG_UINT32 ui32NumVirtChunks,
|
||||
IMG_UINT32 * pui32MappingTable,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
PVRSRV_MEMALLOCFLAGS_T uiFlags,
|
||||
IMG_UINT32 ui32AnnotationLength,
|
||||
const IMG_CHAR * puiAnnotation,
|
||||
IMG_PID ui32PID,
|
||||
IMG_HANDLE * phPMRPtr,
|
||||
IMG_UINT32 ui32PDumpFlags,
|
||||
PVRSRV_MEMALLOCFLAGS_T * puiOutFlags);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntPin(IMG_HANDLE hBridge, IMG_HANDLE hPMR);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntUnpin(IMG_HANDLE hBridge, IMG_HANDLE hPMR);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntPinValidate(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hMapping, IMG_HANDLE hPMR);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntUnpinInvalidate(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hMapping, IMG_HANDLE hPMR);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntCtxCreate(IMG_HANDLE hBridge,
|
||||
IMG_BOOL bbKernelMemoryCtx,
|
||||
IMG_HANDLE * phDevMemServerContext,
|
||||
IMG_HANDLE * phPrivData,
|
||||
IMG_UINT32 * pui32CPUCacheLineSize);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntCtxDestroy(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemServerContext);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntHeapCreate(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemCtx,
|
||||
IMG_DEV_VIRTADDR sHeapBaseAddr,
|
||||
IMG_DEVMEM_SIZE_T uiHeapLength,
|
||||
IMG_UINT32 ui32Log2DataPageSize,
|
||||
IMG_HANDLE * phDevmemHeapPtr);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntHeapDestroy(IMG_HANDLE hBridge, IMG_HANDLE hDevmemHeap);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntMapPMR(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemServerHeap,
|
||||
IMG_HANDLE hReservation,
|
||||
IMG_HANDLE hPMR,
|
||||
PVRSRV_MEMALLOCFLAGS_T uiMapFlags,
|
||||
IMG_HANDLE * phMapping);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntUnmapPMR(IMG_HANDLE hBridge, IMG_HANDLE hMapping);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntReserveRange(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemServerHeap,
|
||||
IMG_DEV_VIRTADDR sAddress,
|
||||
IMG_DEVMEM_SIZE_T uiLength,
|
||||
IMG_HANDLE * phReservation);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntUnreserveRange(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hReservation);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeChangeSparseMem(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSrvDevMemHeap,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_UINT32 ui32AllocPageCount,
|
||||
IMG_UINT32 * pui32AllocPageIndices,
|
||||
IMG_UINT32 ui32FreePageCount,
|
||||
IMG_UINT32 * pui32FreePageIndices,
|
||||
IMG_UINT32 ui32SparseFlags,
|
||||
PVRSRV_MEMALLOCFLAGS_T uiFlags,
|
||||
IMG_DEV_VIRTADDR sDevVAddr,
|
||||
IMG_UINT64 ui64CPUVAddr);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntMapPages(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hReservation,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_UINT32 ui32PageCount,
|
||||
IMG_UINT32 ui32PhysicalPgOffset,
|
||||
PVRSRV_MEMALLOCFLAGS_T uiFlags,
|
||||
IMG_DEV_VIRTADDR sDevVAddr);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntUnmapPages(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hReservation,
|
||||
IMG_DEV_VIRTADDR sDevVAddr,
|
||||
IMG_UINT32 ui32PageCount);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIsVDevAddrValid(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemCtx,
|
||||
IMG_DEV_VIRTADDR sAddress);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemFlushDevSLCRange(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemCtx,
|
||||
IMG_DEV_VIRTADDR sAddress,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
IMG_BOOL bInvalidate);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemInvalidateFBSCTable(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemCtx,
|
||||
IMG_UINT64 ui64FBSCEntries);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHeapCfgHeapConfigCount(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 * pui32NumHeapConfigs);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHeapCfgHeapCount(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32HeapConfigIndex,
|
||||
IMG_UINT32 * pui32NumHeaps);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHeapCfgHeapConfigName(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32HeapConfigIndex,
|
||||
IMG_UINT32 ui32HeapConfigNameBufSz,
|
||||
IMG_CHAR * puiHeapConfigName);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHeapCfgHeapDetails(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32HeapConfigIndex,
|
||||
IMG_UINT32 ui32HeapIndex,
|
||||
IMG_UINT32 ui32HeapNameBufSz,
|
||||
IMG_CHAR * puiHeapNameOut,
|
||||
IMG_DEV_VIRTADDR * psDevVAddrBase,
|
||||
IMG_DEVMEM_SIZE_T * puiHeapLength,
|
||||
IMG_DEVMEM_SIZE_T * puiReservedRegionLength,
|
||||
IMG_UINT32 * pui32Log2DataPageSizeOut,
|
||||
IMG_UINT32 * pui32Log2ImportAlignmentOut);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntRegisterPFNotifyKM(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevm,
|
||||
IMG_UINT32 ui32PID, IMG_BOOL bRegister);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeGetMaxPhysHeapCount(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 * pui32PhysHeapCount);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePhysHeapGetMemInfo(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32PhysHeapCount,
|
||||
PVRSRV_PHYS_HEAP * peaPhysHeapID,
|
||||
PHYS_HEAP_MEM_STATS * pasapPhysHeapMemStats);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeGetDefaultPhysicalHeap(IMG_HANDLE hBridge,
|
||||
PVRSRV_PHYS_HEAP * peHeap);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeGetHeapPhysMemUsage(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32PhysHeapCount,
|
||||
PHYS_HEAP_MEM_STATS * pasapPhysHeapMemStats);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemGetFaultAddress(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemCtx,
|
||||
IMG_DEV_VIRTADDR * psFaultAddress);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePVRSRVUpdateOOMStats(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32ui32StatType, IMG_PID ui32pid);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePhysHeapGetMemInfoPkd(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32PhysHeapCount,
|
||||
PVRSRV_PHYS_HEAP * peaPhysHeapID,
|
||||
PHYS_HEAP_MEM_STATS_PKD *
|
||||
psapPhysHeapMemStats);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeGetHeapPhysMemUsagePkd(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32PhysHeapCount,
|
||||
PHYS_HEAP_MEM_STATS_PKD *
|
||||
psapPhysHeapMemStats);
|
||||
|
||||
#endif /* CLIENT_MM_BRIDGE_H */
|
||||
804
drivers/gpu/drm/img-rogue/client_mm_direct_bridge.c
Normal file
804
drivers/gpu/drm/img-rogue/client_mm_direct_bridge.c
Normal file
@@ -0,0 +1,804 @@
|
||||
/*******************************************************************************
|
||||
@File
|
||||
@Title Direct client bridge for mm
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Implements the client side of the bridge for mm
|
||||
which is used in calls from Server context.
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*******************************************************************************/
|
||||
|
||||
#include "client_mm_bridge.h"
|
||||
#include "img_defs.h"
|
||||
#include "pvr_debug.h"
|
||||
|
||||
/* Module specific includes */
|
||||
#include "pvrsrv_memallocflags.h"
|
||||
#include "pvrsrv_memalloc_physheap.h"
|
||||
#include "devicemem_typedefs.h"
|
||||
|
||||
#include "pvrsrv_memalloc_physheap.h"
|
||||
#include "devicemem.h"
|
||||
#include "devicemem_server.h"
|
||||
#include "pmr.h"
|
||||
#include "devicemem_heapcfg.h"
|
||||
#include "physmem.h"
|
||||
#include "devicemem_utils.h"
|
||||
#include "process_stats.h"
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRExportPMR(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_HANDLE * phPMRExport,
|
||||
IMG_UINT64 * pui64Size,
|
||||
IMG_UINT32 * pui32Log2Contig,
|
||||
IMG_UINT64 * pui64Password)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PMR_EXPORT *psPMRExportInt = NULL;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError = PMRExportPMR(psPMRInt, &psPMRExportInt, pui64Size, pui32Log2Contig, pui64Password);
|
||||
|
||||
*phPMRExport = psPMRExportInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRUnexportPMR(IMG_HANDLE hBridge, IMG_HANDLE hPMRExport)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR_EXPORT *psPMRExportInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRExportInt = (PMR_EXPORT *) hPMRExport;
|
||||
|
||||
eError = PMRUnexportPMR(psPMRExportInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRGetUID(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMR, IMG_UINT64 * pui64UID)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError = PMRGetUID(psPMRInt, pui64UID);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRMakeLocalImportHandle(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hBuffer, IMG_HANDLE * phExtMem)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psBufferInt;
|
||||
PMR *psExtMemInt = NULL;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psBufferInt = (PMR *) hBuffer;
|
||||
|
||||
eError = PMRMakeLocalImportHandle(psBufferInt, &psExtMemInt);
|
||||
|
||||
*phExtMem = psExtMemInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRUnmakeLocalImportHandle(IMG_HANDLE hBridge, IMG_HANDLE hExtMem)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psExtMemInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psExtMemInt = (PMR *) hExtMem;
|
||||
|
||||
eError = PMRUnmakeLocalImportHandle(psExtMemInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRImportPMR(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hPMRExport,
|
||||
IMG_UINT64 ui64uiPassword,
|
||||
IMG_UINT64 ui64uiSize,
|
||||
IMG_UINT32 ui32uiLog2Contig, IMG_HANDLE * phPMR)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR_EXPORT *psPMRExportInt;
|
||||
PMR *psPMRInt = NULL;
|
||||
|
||||
psPMRExportInt = (PMR_EXPORT *) hPMRExport;
|
||||
|
||||
eError =
|
||||
PhysmemImportPMR(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
psPMRExportInt,
|
||||
ui64uiPassword, ui64uiSize, ui32uiLog2Contig, &psPMRInt);
|
||||
|
||||
*phPMR = psPMRInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRLocalImportPMR(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hExtHandle,
|
||||
IMG_HANDLE * phPMR,
|
||||
IMG_DEVMEM_SIZE_T * puiSize,
|
||||
IMG_DEVMEM_ALIGN_T * puiAlign)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psExtHandleInt;
|
||||
PMR *psPMRInt = NULL;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psExtHandleInt = (PMR *) hExtHandle;
|
||||
|
||||
eError = PMRLocalImportPMR(psExtHandleInt, &psPMRInt, puiSize, puiAlign);
|
||||
|
||||
*phPMR = psPMRInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRUnrefPMR(IMG_HANDLE hBridge, IMG_HANDLE hPMR)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError = PMRUnrefPMR(psPMRInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePMRUnrefUnlockPMR(IMG_HANDLE hBridge, IMG_HANDLE hPMR)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError = PMRUnrefUnlockPMR(psPMRInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePhysmemNewRamBackedPMR(IMG_HANDLE hBridge,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
IMG_DEVMEM_SIZE_T uiChunkSize,
|
||||
IMG_UINT32 ui32NumPhysChunks,
|
||||
IMG_UINT32 ui32NumVirtChunks,
|
||||
IMG_UINT32 * pui32MappingTable,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
PVRSRV_MEMALLOCFLAGS_T uiFlags,
|
||||
IMG_UINT32 ui32AnnotationLength,
|
||||
const IMG_CHAR * puiAnnotation,
|
||||
IMG_PID ui32PID,
|
||||
IMG_HANDLE * phPMRPtr,
|
||||
IMG_UINT32 ui32PDumpFlags,
|
||||
PVRSRV_MEMALLOCFLAGS_T * puiOutFlags)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRPtrInt = NULL;
|
||||
|
||||
eError =
|
||||
PhysmemNewRamBackedPMR_direct(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
uiSize,
|
||||
uiChunkSize,
|
||||
ui32NumPhysChunks,
|
||||
ui32NumVirtChunks,
|
||||
pui32MappingTable,
|
||||
ui32Log2PageSize,
|
||||
uiFlags,
|
||||
ui32AnnotationLength,
|
||||
puiAnnotation,
|
||||
ui32PID, &psPMRPtrInt, ui32PDumpFlags, puiOutFlags);
|
||||
|
||||
*phPMRPtr = psPMRPtrInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePhysmemNewRamBackedLockedPMR(IMG_HANDLE hBridge,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
IMG_DEVMEM_SIZE_T uiChunkSize,
|
||||
IMG_UINT32 ui32NumPhysChunks,
|
||||
IMG_UINT32 ui32NumVirtChunks,
|
||||
IMG_UINT32 * pui32MappingTable,
|
||||
IMG_UINT32 ui32Log2PageSize,
|
||||
PVRSRV_MEMALLOCFLAGS_T uiFlags,
|
||||
IMG_UINT32 ui32AnnotationLength,
|
||||
const IMG_CHAR * puiAnnotation,
|
||||
IMG_PID ui32PID,
|
||||
IMG_HANDLE * phPMRPtr,
|
||||
IMG_UINT32 ui32PDumpFlags,
|
||||
PVRSRV_MEMALLOCFLAGS_T * puiOutFlags)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRPtrInt = NULL;
|
||||
|
||||
eError =
|
||||
PhysmemNewRamBackedLockedPMR(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
uiSize,
|
||||
uiChunkSize,
|
||||
ui32NumPhysChunks,
|
||||
ui32NumVirtChunks,
|
||||
pui32MappingTable,
|
||||
ui32Log2PageSize,
|
||||
uiFlags,
|
||||
ui32AnnotationLength,
|
||||
puiAnnotation,
|
||||
ui32PID, &psPMRPtrInt, ui32PDumpFlags, puiOutFlags);
|
||||
|
||||
*phPMRPtr = psPMRPtrInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntPin(IMG_HANDLE hBridge, IMG_HANDLE hPMR)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError = DevmemIntPin(psPMRInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntUnpin(IMG_HANDLE hBridge, IMG_HANDLE hPMR)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError = DevmemIntUnpin(psPMRInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntPinValidate(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hMapping, IMG_HANDLE hPMR)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_MAPPING *psMappingInt;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psMappingInt = (DEVMEMINT_MAPPING *) hMapping;
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError = DevmemIntPinValidate(psMappingInt, psPMRInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntUnpinInvalidate(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hMapping, IMG_HANDLE hPMR)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_MAPPING *psMappingInt;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psMappingInt = (DEVMEMINT_MAPPING *) hMapping;
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError = DevmemIntUnpinInvalidate(psMappingInt, psPMRInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntCtxCreate(IMG_HANDLE hBridge,
|
||||
IMG_BOOL bbKernelMemoryCtx,
|
||||
IMG_HANDLE * phDevMemServerContext,
|
||||
IMG_HANDLE * phPrivData,
|
||||
IMG_UINT32 * pui32CPUCacheLineSize)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_CTX *psDevMemServerContextInt = NULL;
|
||||
IMG_HANDLE hPrivDataInt = NULL;
|
||||
|
||||
eError =
|
||||
DevmemIntCtxCreate(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
bbKernelMemoryCtx,
|
||||
&psDevMemServerContextInt, &hPrivDataInt, pui32CPUCacheLineSize);
|
||||
|
||||
*phDevMemServerContext = psDevMemServerContextInt;
|
||||
*phPrivData = hPrivDataInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntCtxDestroy(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemServerContext)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_CTX *psDevmemServerContextInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psDevmemServerContextInt = (DEVMEMINT_CTX *) hDevmemServerContext;
|
||||
|
||||
eError = DevmemIntCtxDestroy(psDevmemServerContextInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntHeapCreate(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemCtx,
|
||||
IMG_DEV_VIRTADDR sHeapBaseAddr,
|
||||
IMG_DEVMEM_SIZE_T uiHeapLength,
|
||||
IMG_UINT32 ui32Log2DataPageSize,
|
||||
IMG_HANDLE * phDevmemHeapPtr)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_CTX *psDevmemCtxInt;
|
||||
DEVMEMINT_HEAP *psDevmemHeapPtrInt = NULL;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psDevmemCtxInt = (DEVMEMINT_CTX *) hDevmemCtx;
|
||||
|
||||
eError =
|
||||
DevmemIntHeapCreate(psDevmemCtxInt,
|
||||
sHeapBaseAddr,
|
||||
uiHeapLength, ui32Log2DataPageSize, &psDevmemHeapPtrInt);
|
||||
|
||||
*phDevmemHeapPtr = psDevmemHeapPtrInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntHeapDestroy(IMG_HANDLE hBridge, IMG_HANDLE hDevmemHeap)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_HEAP *psDevmemHeapInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psDevmemHeapInt = (DEVMEMINT_HEAP *) hDevmemHeap;
|
||||
|
||||
eError = DevmemIntHeapDestroy(psDevmemHeapInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntMapPMR(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemServerHeap,
|
||||
IMG_HANDLE hReservation,
|
||||
IMG_HANDLE hPMR,
|
||||
PVRSRV_MEMALLOCFLAGS_T uiMapFlags,
|
||||
IMG_HANDLE * phMapping)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_HEAP *psDevmemServerHeapInt;
|
||||
DEVMEMINT_RESERVATION *psReservationInt;
|
||||
PMR *psPMRInt;
|
||||
DEVMEMINT_MAPPING *psMappingInt = NULL;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psDevmemServerHeapInt = (DEVMEMINT_HEAP *) hDevmemServerHeap;
|
||||
psReservationInt = (DEVMEMINT_RESERVATION *) hReservation;
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError =
|
||||
DevmemIntMapPMR(psDevmemServerHeapInt,
|
||||
psReservationInt, psPMRInt, uiMapFlags, &psMappingInt);
|
||||
|
||||
*phMapping = psMappingInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntUnmapPMR(IMG_HANDLE hBridge, IMG_HANDLE hMapping)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_MAPPING *psMappingInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psMappingInt = (DEVMEMINT_MAPPING *) hMapping;
|
||||
|
||||
eError = DevmemIntUnmapPMR(psMappingInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntReserveRange(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemServerHeap,
|
||||
IMG_DEV_VIRTADDR sAddress,
|
||||
IMG_DEVMEM_SIZE_T uiLength,
|
||||
IMG_HANDLE * phReservation)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_HEAP *psDevmemServerHeapInt;
|
||||
DEVMEMINT_RESERVATION *psReservationInt = NULL;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psDevmemServerHeapInt = (DEVMEMINT_HEAP *) hDevmemServerHeap;
|
||||
|
||||
eError =
|
||||
DevmemIntReserveRange(psDevmemServerHeapInt, sAddress, uiLength, &psReservationInt);
|
||||
|
||||
*phReservation = psReservationInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntUnreserveRange(IMG_HANDLE hBridge, IMG_HANDLE hReservation)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_RESERVATION *psReservationInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psReservationInt = (DEVMEMINT_RESERVATION *) hReservation;
|
||||
|
||||
eError = DevmemIntUnreserveRange(psReservationInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeChangeSparseMem(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSrvDevMemHeap,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_UINT32 ui32AllocPageCount,
|
||||
IMG_UINT32 * pui32AllocPageIndices,
|
||||
IMG_UINT32 ui32FreePageCount,
|
||||
IMG_UINT32 * pui32FreePageIndices,
|
||||
IMG_UINT32 ui32SparseFlags,
|
||||
PVRSRV_MEMALLOCFLAGS_T uiFlags,
|
||||
IMG_DEV_VIRTADDR sDevVAddr, IMG_UINT64 ui64CPUVAddr)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_HEAP *psSrvDevMemHeapInt;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psSrvDevMemHeapInt = (DEVMEMINT_HEAP *) hSrvDevMemHeap;
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError =
|
||||
DevmemIntChangeSparse(psSrvDevMemHeapInt,
|
||||
psPMRInt,
|
||||
ui32AllocPageCount,
|
||||
pui32AllocPageIndices,
|
||||
ui32FreePageCount,
|
||||
pui32FreePageIndices,
|
||||
ui32SparseFlags, uiFlags, sDevVAddr, ui64CPUVAddr);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntMapPages(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hReservation,
|
||||
IMG_HANDLE hPMR,
|
||||
IMG_UINT32 ui32PageCount,
|
||||
IMG_UINT32 ui32PhysicalPgOffset,
|
||||
PVRSRV_MEMALLOCFLAGS_T uiFlags,
|
||||
IMG_DEV_VIRTADDR sDevVAddr)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_RESERVATION *psReservationInt;
|
||||
PMR *psPMRInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psReservationInt = (DEVMEMINT_RESERVATION *) hReservation;
|
||||
psPMRInt = (PMR *) hPMR;
|
||||
|
||||
eError =
|
||||
DevmemIntMapPages(psReservationInt,
|
||||
psPMRInt, ui32PageCount, ui32PhysicalPgOffset, uiFlags, sDevVAddr);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntUnmapPages(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hReservation,
|
||||
IMG_DEV_VIRTADDR sDevVAddr,
|
||||
IMG_UINT32 ui32PageCount)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_RESERVATION *psReservationInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psReservationInt = (DEVMEMINT_RESERVATION *) hReservation;
|
||||
|
||||
eError = DevmemIntUnmapPages(psReservationInt, sDevVAddr, ui32PageCount);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIsVDevAddrValid(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemCtx,
|
||||
IMG_DEV_VIRTADDR sAddress)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_CTX *psDevmemCtxInt;
|
||||
|
||||
psDevmemCtxInt = (DEVMEMINT_CTX *) hDevmemCtx;
|
||||
|
||||
eError =
|
||||
DevmemIntIsVDevAddrValid(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
psDevmemCtxInt, sAddress);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemFlushDevSLCRange(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemCtx,
|
||||
IMG_DEV_VIRTADDR sAddress,
|
||||
IMG_DEVMEM_SIZE_T uiSize,
|
||||
IMG_BOOL bInvalidate)
|
||||
{
|
||||
#if defined(RGX_SRV_SLC_RANGEBASED_CFI_SUPPORTED)
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_CTX *psDevmemCtxInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psDevmemCtxInt = (DEVMEMINT_CTX *) hDevmemCtx;
|
||||
|
||||
eError = DevmemIntFlushDevSLCRange(psDevmemCtxInt, sAddress, uiSize, bInvalidate);
|
||||
|
||||
return eError;
|
||||
#else
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
PVR_UNREFERENCED_PARAMETER(hDevmemCtx);
|
||||
PVR_UNREFERENCED_PARAMETER(sAddress);
|
||||
PVR_UNREFERENCED_PARAMETER(uiSize);
|
||||
PVR_UNREFERENCED_PARAMETER(bInvalidate);
|
||||
|
||||
return PVRSRV_ERROR_NOT_IMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemInvalidateFBSCTable(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemCtx,
|
||||
IMG_UINT64 ui64FBSCEntries)
|
||||
{
|
||||
#if defined(RGX_FEATURE_FBCDC)
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_CTX *psDevmemCtxInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psDevmemCtxInt = (DEVMEMINT_CTX *) hDevmemCtx;
|
||||
|
||||
eError = DevmemIntInvalidateFBSCTable(psDevmemCtxInt, ui64FBSCEntries);
|
||||
|
||||
return eError;
|
||||
#else
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
PVR_UNREFERENCED_PARAMETER(hDevmemCtx);
|
||||
PVR_UNREFERENCED_PARAMETER(ui64FBSCEntries);
|
||||
|
||||
return PVRSRV_ERROR_NOT_IMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHeapCfgHeapConfigCount(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 * pui32NumHeapConfigs)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
HeapCfgHeapConfigCount(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
pui32NumHeapConfigs);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHeapCfgHeapCount(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32HeapConfigIndex,
|
||||
IMG_UINT32 * pui32NumHeaps)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
HeapCfgHeapCount(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
ui32HeapConfigIndex, pui32NumHeaps);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHeapCfgHeapConfigName(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32HeapConfigIndex,
|
||||
IMG_UINT32 ui32HeapConfigNameBufSz,
|
||||
IMG_CHAR * puiHeapConfigName)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
HeapCfgHeapConfigName(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
ui32HeapConfigIndex, ui32HeapConfigNameBufSz, puiHeapConfigName);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeHeapCfgHeapDetails(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32HeapConfigIndex,
|
||||
IMG_UINT32 ui32HeapIndex,
|
||||
IMG_UINT32 ui32HeapNameBufSz,
|
||||
IMG_CHAR * puiHeapNameOut,
|
||||
IMG_DEV_VIRTADDR * psDevVAddrBase,
|
||||
IMG_DEVMEM_SIZE_T * puiHeapLength,
|
||||
IMG_DEVMEM_SIZE_T * puiReservedRegionLength,
|
||||
IMG_UINT32 * pui32Log2DataPageSizeOut,
|
||||
IMG_UINT32 * pui32Log2ImportAlignmentOut)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
HeapCfgHeapDetails(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
ui32HeapConfigIndex,
|
||||
ui32HeapIndex,
|
||||
ui32HeapNameBufSz,
|
||||
puiHeapNameOut,
|
||||
psDevVAddrBase,
|
||||
puiHeapLength,
|
||||
puiReservedRegionLength,
|
||||
pui32Log2DataPageSizeOut, pui32Log2ImportAlignmentOut);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemIntRegisterPFNotifyKM(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevm,
|
||||
IMG_UINT32 ui32PID, IMG_BOOL bRegister)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_CTX *psDevmInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psDevmInt = (DEVMEMINT_CTX *) hDevm;
|
||||
|
||||
eError = DevmemIntRegisterPFNotifyKM(psDevmInt, ui32PID, bRegister);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeGetMaxPhysHeapCount(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 * pui32PhysHeapCount)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
PVRSRVGetMaxPhysHeapCountKM(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
pui32PhysHeapCount);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePhysHeapGetMemInfo(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32PhysHeapCount,
|
||||
PVRSRV_PHYS_HEAP * peaPhysHeapID,
|
||||
PHYS_HEAP_MEM_STATS * pasapPhysHeapMemStats)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
PVRSRVPhysHeapGetMemInfoKM(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
ui32PhysHeapCount, peaPhysHeapID, pasapPhysHeapMemStats);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeGetDefaultPhysicalHeap(IMG_HANDLE hBridge,
|
||||
PVRSRV_PHYS_HEAP * peHeap)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
PVRSRVGetDefaultPhysicalHeapKM(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge), peHeap);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeGetHeapPhysMemUsage(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32PhysHeapCount,
|
||||
PHYS_HEAP_MEM_STATS * pasapPhysHeapMemStats)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
PVRSRVGetHeapPhysMemUsageKM(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
ui32PhysHeapCount, pasapPhysHeapMemStats);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeDevmemGetFaultAddress(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hDevmemCtx,
|
||||
IMG_DEV_VIRTADDR * psFaultAddress)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
DEVMEMINT_CTX *psDevmemCtxInt;
|
||||
|
||||
psDevmemCtxInt = (DEVMEMINT_CTX *) hDevmemCtx;
|
||||
|
||||
eError =
|
||||
DevmemIntGetFaultAddress(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
psDevmemCtxInt, psFaultAddress);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePVRSRVUpdateOOMStats(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32ui32StatType, IMG_PID ui32pid)
|
||||
{
|
||||
#if defined(PVRSRV_ENABLE_PROCESS_STATS)
|
||||
PVRSRV_ERROR eError;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
eError = PVRSRVServerUpdateOOMStats(ui32ui32StatType, ui32pid);
|
||||
|
||||
return eError;
|
||||
#else
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
PVR_UNREFERENCED_PARAMETER(ui32ui32StatType);
|
||||
PVR_UNREFERENCED_PARAMETER(ui32pid);
|
||||
|
||||
return PVRSRV_ERROR_NOT_IMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgePhysHeapGetMemInfoPkd(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32PhysHeapCount,
|
||||
PVRSRV_PHYS_HEAP * peaPhysHeapID,
|
||||
PHYS_HEAP_MEM_STATS_PKD *
|
||||
psapPhysHeapMemStats)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
PVRSRVPhysHeapGetMemInfoPkdKM(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
ui32PhysHeapCount, peaPhysHeapID, psapPhysHeapMemStats);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeGetHeapPhysMemUsagePkd(IMG_HANDLE hBridge,
|
||||
IMG_UINT32 ui32PhysHeapCount,
|
||||
PHYS_HEAP_MEM_STATS_PKD *
|
||||
psapPhysHeapMemStats)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
|
||||
eError =
|
||||
PVRSRVGetHeapPhysMemUsagePkdKM(NULL, (PVRSRV_DEVICE_NODE *) ((void *)hBridge),
|
||||
ui32PhysHeapCount, psapPhysHeapMemStats);
|
||||
|
||||
return eError;
|
||||
}
|
||||
93
drivers/gpu/drm/img-rogue/client_pvrtl_bridge.h
Normal file
93
drivers/gpu/drm/img-rogue/client_pvrtl_bridge.h
Normal file
@@ -0,0 +1,93 @@
|
||||
/*******************************************************************************
|
||||
@File
|
||||
@Title Client bridge header for pvrtl
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Exports the client bridge functions for pvrtl
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef CLIENT_PVRTL_BRIDGE_H
|
||||
#define CLIENT_PVRTL_BRIDGE_H
|
||||
|
||||
#include "img_defs.h"
|
||||
#include "pvrsrv_error.h"
|
||||
|
||||
#if defined(PVR_INDIRECT_BRIDGE_CLIENTS)
|
||||
#include "pvr_bridge_client.h"
|
||||
#include "pvr_bridge.h"
|
||||
#endif
|
||||
|
||||
#include "common_pvrtl_bridge.h"
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLOpenStream(IMG_HANDLE hBridge,
|
||||
const IMG_CHAR * puiName,
|
||||
IMG_UINT32 ui32Mode,
|
||||
IMG_HANDLE * phSD, IMG_HANDLE * phTLPMR);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLCloseStream(IMG_HANDLE hBridge, IMG_HANDLE hSD);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLAcquireData(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSD,
|
||||
IMG_UINT32 * pui32ReadOffset,
|
||||
IMG_UINT32 * pui32ReadLen);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLReleaseData(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSD,
|
||||
IMG_UINT32 ui32ReadOffset, IMG_UINT32 ui32ReadLen);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLDiscoverStreams(IMG_HANDLE hBridge,
|
||||
const IMG_CHAR * puiNamePattern,
|
||||
IMG_UINT32 ui32Size,
|
||||
IMG_CHAR * puiStreams,
|
||||
IMG_UINT32 * pui32NumFound);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLReserveStream(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSD,
|
||||
IMG_UINT32 * pui32BufferOffset,
|
||||
IMG_UINT32 ui32Size,
|
||||
IMG_UINT32 ui32SizeMin,
|
||||
IMG_UINT32 * pui32Available);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLCommitStream(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSD, IMG_UINT32 ui32ReqSize);
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLWriteData(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSD,
|
||||
IMG_UINT32 ui32Size, IMG_BYTE * pui8Data);
|
||||
|
||||
#endif /* CLIENT_PVRTL_BRIDGE_H */
|
||||
175
drivers/gpu/drm/img-rogue/client_pvrtl_direct_bridge.c
Normal file
175
drivers/gpu/drm/img-rogue/client_pvrtl_direct_bridge.c
Normal file
@@ -0,0 +1,175 @@
|
||||
/*******************************************************************************
|
||||
@File
|
||||
@Title Direct client bridge for pvrtl
|
||||
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
||||
@Description Implements the client side of the bridge for pvrtl
|
||||
which is used in calls from Server context.
|
||||
@License Dual MIT/GPLv2
|
||||
|
||||
The contents of this file are subject to the MIT license as set out below.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
Alternatively, the contents of this file may be used under the terms of
|
||||
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
||||
of GPL are applicable instead of those above.
|
||||
|
||||
If you wish to allow use of your version of this file only under the terms of
|
||||
GPL, and not to allow others to use your version of this file under the terms
|
||||
of the MIT license, indicate your decision by deleting the provisions above
|
||||
and replace them with the notice and other provisions required by GPL as set
|
||||
out in the file called "GPL-COPYING" included in this distribution. If you do
|
||||
not delete the provisions above, a recipient may use your version of this file
|
||||
under the terms of either the MIT license or GPL.
|
||||
|
||||
This License is also included in this distribution in the file called
|
||||
"MIT-COPYING".
|
||||
|
||||
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
||||
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*******************************************************************************/
|
||||
|
||||
#include "client_pvrtl_bridge.h"
|
||||
#include "img_defs.h"
|
||||
#include "pvr_debug.h"
|
||||
|
||||
/* Module specific includes */
|
||||
#include "devicemem_typedefs.h"
|
||||
#include "pvrsrv_tlcommon.h"
|
||||
|
||||
#include "tlserver.h"
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLOpenStream(IMG_HANDLE hBridge,
|
||||
const IMG_CHAR * puiName,
|
||||
IMG_UINT32 ui32Mode,
|
||||
IMG_HANDLE * phSD, IMG_HANDLE * phTLPMR)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
TL_STREAM_DESC *psSDInt = NULL;
|
||||
PMR *psTLPMRInt = NULL;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
eError = TLServerOpenStreamKM(puiName, ui32Mode, &psSDInt, &psTLPMRInt);
|
||||
|
||||
*phSD = psSDInt;
|
||||
*phTLPMR = psTLPMRInt;
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLCloseStream(IMG_HANDLE hBridge, IMG_HANDLE hSD)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
TL_STREAM_DESC *psSDInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psSDInt = (TL_STREAM_DESC *) hSD;
|
||||
|
||||
eError = TLServerCloseStreamKM(psSDInt);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLAcquireData(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSD,
|
||||
IMG_UINT32 * pui32ReadOffset,
|
||||
IMG_UINT32 * pui32ReadLen)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
TL_STREAM_DESC *psSDInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psSDInt = (TL_STREAM_DESC *) hSD;
|
||||
|
||||
eError = TLServerAcquireDataKM(psSDInt, pui32ReadOffset, pui32ReadLen);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLReleaseData(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSD,
|
||||
IMG_UINT32 ui32ReadOffset, IMG_UINT32 ui32ReadLen)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
TL_STREAM_DESC *psSDInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psSDInt = (TL_STREAM_DESC *) hSD;
|
||||
|
||||
eError = TLServerReleaseDataKM(psSDInt, ui32ReadOffset, ui32ReadLen);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLDiscoverStreams(IMG_HANDLE hBridge,
|
||||
const IMG_CHAR * puiNamePattern,
|
||||
IMG_UINT32 ui32Size,
|
||||
IMG_CHAR * puiStreams, IMG_UINT32 * pui32NumFound)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
eError = TLServerDiscoverStreamsKM(puiNamePattern, ui32Size, puiStreams, pui32NumFound);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLReserveStream(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSD,
|
||||
IMG_UINT32 * pui32BufferOffset,
|
||||
IMG_UINT32 ui32Size,
|
||||
IMG_UINT32 ui32SizeMin, IMG_UINT32 * pui32Available)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
TL_STREAM_DESC *psSDInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psSDInt = (TL_STREAM_DESC *) hSD;
|
||||
|
||||
eError =
|
||||
TLServerReserveStreamKM(psSDInt,
|
||||
pui32BufferOffset, ui32Size, ui32SizeMin, pui32Available);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLCommitStream(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSD, IMG_UINT32 ui32ReqSize)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
TL_STREAM_DESC *psSDInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psSDInt = (TL_STREAM_DESC *) hSD;
|
||||
|
||||
eError = TLServerCommitStreamKM(psSDInt, ui32ReqSize);
|
||||
|
||||
return eError;
|
||||
}
|
||||
|
||||
IMG_INTERNAL PVRSRV_ERROR BridgeTLWriteData(IMG_HANDLE hBridge,
|
||||
IMG_HANDLE hSD,
|
||||
IMG_UINT32 ui32Size, IMG_BYTE * pui8Data)
|
||||
{
|
||||
PVRSRV_ERROR eError;
|
||||
TL_STREAM_DESC *psSDInt;
|
||||
PVR_UNREFERENCED_PARAMETER(hBridge);
|
||||
|
||||
psSDInt = (TL_STREAM_DESC *) hSD;
|
||||
|
||||
eError = TLServerWriteDataKM(psSDInt, ui32Size, pui8Data);
|
||||
|
||||
return eError;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user