Merge 4.8-rc5 into driver-core-next
We want the sysfs and kernfs in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Коммит
2f5bb02ff2
2
.mailmap
2
.mailmap
|
@ -158,6 +158,8 @@ Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
|
|||
Viresh Kumar <vireshk@kernel.org> <viresh.kumar@st.com>
|
||||
Viresh Kumar <vireshk@kernel.org> <viresh.linux@gmail.com>
|
||||
Viresh Kumar <vireshk@kernel.org> <viresh.kumar2@arm.com>
|
||||
Vladimir Davydov <vdavydov.dev@gmail.com> <vdavydov@virtuozzo.com>
|
||||
Vladimir Davydov <vdavydov.dev@gmail.com> <vdavydov@parallels.com>
|
||||
Takashi YOSHII <takashi.yoshii.zj@renesas.com>
|
||||
Yusuke Goda <goda.yusuke@renesas.com>
|
||||
Gustavo Padovan <gustavo@las.ic.unicamp.br>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Note: This documents additional properties of any device beyond what
|
||||
# is documented in Documentation/sysfs-rules.txt
|
||||
|
||||
What: /sys/devices/*/of_path
|
||||
What: /sys/devices/*/of_node
|
||||
Date: February 2015
|
||||
Contact: Device Tree mailing list <devicetree@vger.kernel.org>
|
||||
Description:
|
||||
|
|
|
@ -124,7 +124,6 @@ initialization with a pointer to a structure describing the driver
|
|||
|
||||
The ID table is an array of struct pci_device_id entries ending with an
|
||||
all-zero entry. Definitions with static const are generally preferred.
|
||||
Use of the deprecated macro DEFINE_PCI_DEVICE_TABLE should be avoided.
|
||||
|
||||
Each entry consists of:
|
||||
|
||||
|
|
|
@ -16,6 +16,11 @@ Required properties:
|
|||
- vref-supply: The regulator supply ADC reference voltage.
|
||||
- #io-channel-cells: Should be 1, see ../iio-bindings.txt
|
||||
|
||||
Optional properties:
|
||||
- resets: Must contain an entry for each entry in reset-names if need support
|
||||
this option. See ../reset/reset.txt for details.
|
||||
- reset-names: Must include the name "saradc-apb".
|
||||
|
||||
Example:
|
||||
saradc: saradc@2006c000 {
|
||||
compatible = "rockchip,saradc";
|
||||
|
@ -23,6 +28,8 @@ Example:
|
|||
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||
clock-names = "saradc", "apb_pclk";
|
||||
resets = <&cru SRST_SARADC>;
|
||||
reset-names = "saradc-apb";
|
||||
#io-channel-cells = <1>;
|
||||
vref-supply = <&vcc18>;
|
||||
};
|
||||
|
|
|
@ -42,9 +42,6 @@ Optional properties:
|
|||
- auto-flow-control: one way to enable automatic flow control support. The
|
||||
driver is allowed to detect support for the capability even without this
|
||||
property.
|
||||
- {rts,cts,dtr,dsr,rng,dcd}-gpios: specify a GPIO for RTS/CTS/DTR/DSR/RI/DCD
|
||||
line respectively. It will use specified GPIO instead of the peripheral
|
||||
function pin for the UART feature. If unsure, don't specify this property.
|
||||
|
||||
Note:
|
||||
* fsl,ns16550:
|
||||
|
@ -66,19 +63,3 @@ Example:
|
|||
interrupts = <10>;
|
||||
reg-shift = <2>;
|
||||
};
|
||||
|
||||
Example for OMAP UART using GPIO-based modem control signals:
|
||||
|
||||
uart4: serial@49042000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
reg = <0x49042000 0x400>;
|
||||
interrupts = <80>;
|
||||
ti,hwmods = "uart4";
|
||||
clock-frequency = <48000000>;
|
||||
cts-gpios = <&gpio3 5 GPIO_ACTIVE_LOW>;
|
||||
rts-gpios = <&gpio3 6 GPIO_ACTIVE_LOW>;
|
||||
dtr-gpios = <&gpio1 12 GPIO_ACTIVE_LOW>;
|
||||
dsr-gpios = <&gpio1 13 GPIO_ACTIVE_LOW>;
|
||||
dcd-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>;
|
||||
rng-gpios = <&gpio1 15 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
|
|
@ -183,12 +183,10 @@ The copy_up operation essentially creates a new, identical file and
|
|||
moves it over to the old name. The new file may be on a different
|
||||
filesystem, so both st_dev and st_ino of the file may change.
|
||||
|
||||
Any open files referring to this inode will access the old data and
|
||||
metadata. Similarly any file locks obtained before copy_up will not
|
||||
apply to the copied up file.
|
||||
Any open files referring to this inode will access the old data.
|
||||
|
||||
On a file opened with O_RDONLY fchmod(2), fchown(2), futimesat(2) and
|
||||
fsetxattr(2) will fail with EROFS.
|
||||
Any file locks (and leases) obtained before copy_up will not apply
|
||||
to the copied up file.
|
||||
|
||||
If a file with multiple hard links is copied up, then this will
|
||||
"break" the link. Changes will not be propagated to other names
|
||||
|
|
|
@ -587,26 +587,6 @@ of DSA, would be the its port-based VLAN, used by the associated bridge device.
|
|||
TODO
|
||||
====
|
||||
|
||||
The platform device problem
|
||||
---------------------------
|
||||
DSA is currently implemented as a platform device driver which is far from ideal
|
||||
as was discussed in this thread:
|
||||
|
||||
http://permalink.gmane.org/gmane.linux.network/329848
|
||||
|
||||
This basically prevents the device driver model to be properly used and applied,
|
||||
and support non-MDIO, non-MMIO Ethernet connected switches.
|
||||
|
||||
Another problem with the platform device driver approach is that it prevents the
|
||||
use of a modular switch drivers build due to a circular dependency, illustrated
|
||||
here:
|
||||
|
||||
http://comments.gmane.org/gmane.linux.network/345803
|
||||
|
||||
Attempts of reworking this has been done here:
|
||||
|
||||
https://lwn.net/Articles/643149/
|
||||
|
||||
Making SWITCHDEV and DSA converge towards an unified codebase
|
||||
-------------------------------------------------------------
|
||||
|
||||
|
|
|
@ -167,6 +167,8 @@ signal will be rolled back anyway.
|
|||
For signals taken in non-TM or suspended mode, we use the
|
||||
normal/non-checkpointed stack pointer.
|
||||
|
||||
Any transaction initiated inside a sighandler and suspended on return
|
||||
from the sighandler to the kernel will get reclaimed and discarded.
|
||||
|
||||
Failure cause codes used by kernel
|
||||
==================================
|
||||
|
|
|
@ -80,6 +80,10 @@ functionality of their platform when planning to use this driver:
|
|||
|
||||
III. Module parameters
|
||||
|
||||
- 'dma_timeout' - DMA transfer completion timeout (in msec, default value 3000).
|
||||
This parameter set a maximum completion wait time for SYNC mode DMA
|
||||
transfer requests and for RIO_WAIT_FOR_ASYNC ioctl requests.
|
||||
|
||||
- 'dbg_level' - This parameter allows to control amount of debug information
|
||||
generated by this device driver. This parameter is formed by set of
|
||||
bit masks that correspond to the specific functional blocks.
|
||||
|
|
11
MAINTAINERS
11
MAINTAINERS
|
@ -798,6 +798,7 @@ M: Laura Abbott <labbott@redhat.com>
|
|||
M: Sumit Semwal <sumit.semwal@linaro.org>
|
||||
L: devel@driverdev.osuosl.org
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/staging/ion/
|
||||
F: drivers/staging/android/ion
|
||||
F: drivers/staging/android/uapi/ion.h
|
||||
F: drivers/staging/android/uapi/ion_test.h
|
||||
|
@ -3247,7 +3248,7 @@ F: kernel/cpuset.c
|
|||
CONTROL GROUP - MEMORY RESOURCE CONTROLLER (MEMCG)
|
||||
M: Johannes Weiner <hannes@cmpxchg.org>
|
||||
M: Michal Hocko <mhocko@kernel.org>
|
||||
M: Vladimir Davydov <vdavydov@virtuozzo.com>
|
||||
M: Vladimir Davydov <vdavydov.dev@gmail.com>
|
||||
L: cgroups@vger.kernel.org
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
|
@ -11232,12 +11233,8 @@ S: Odd Fixes
|
|||
F: drivers/staging/vt665?/
|
||||
|
||||
STAGING - WILC1000 WIFI DRIVER
|
||||
M: Johnny Kim <johnny.kim@atmel.com>
|
||||
M: Austin Shin <austin.shin@atmel.com>
|
||||
M: Chris Park <chris.park@atmel.com>
|
||||
M: Tony Cho <tony.cho@atmel.com>
|
||||
M: Glen Lee <glen.lee@atmel.com>
|
||||
M: Leo Kim <leo.kim@atmel.com>
|
||||
M: Aditya Shankar <aditya.shankar@microchip.com>
|
||||
M: Ganesh Krishna <ganesh.krishna@microchip.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/staging/wilc1000/
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 8
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Psychotic Stoned Sheep
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -197,6 +197,8 @@
|
|||
clock-names = "saradc", "apb_pclk";
|
||||
interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#io-channel-cells = <1>;
|
||||
resets = <&cru SRST_SARADC>;
|
||||
reset-names = "saradc-apb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -279,6 +279,8 @@
|
|||
#io-channel-cells = <1>;
|
||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||
clock-names = "saradc", "apb_pclk";
|
||||
resets = <&cru SRST_SARADC>;
|
||||
reset-names = "saradc-apb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -399,6 +399,8 @@
|
|||
#io-channel-cells = <1>;
|
||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||
clock-names = "saradc", "apb_pclk";
|
||||
resets = <&cru SRST_SARADC>;
|
||||
reset-names = "saradc-apb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -83,7 +83,8 @@ static struct resource smc91x_resources[] = {
|
|||
};
|
||||
|
||||
static struct smc91x_platdata smc91x_platdata = {
|
||||
.flags = SMC91X_USE_32BIT | SMC91X_USE_DMA | SMC91X_NOWAIT,
|
||||
.flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
|
||||
SMC91X_USE_DMA | SMC91X_NOWAIT,
|
||||
};
|
||||
|
||||
static struct platform_device smc91x_device = {
|
||||
|
|
|
@ -120,7 +120,8 @@ static struct resource smc91x_resources[] = {
|
|||
};
|
||||
|
||||
static struct smc91x_platdata xcep_smc91x_info = {
|
||||
.flags = SMC91X_USE_32BIT | SMC91X_NOWAIT | SMC91X_USE_DMA,
|
||||
.flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
|
||||
SMC91X_NOWAIT | SMC91X_USE_DMA,
|
||||
};
|
||||
|
||||
static struct platform_device smc91x_device = {
|
||||
|
|
|
@ -93,7 +93,8 @@ static struct smsc911x_platform_config smsc911x_config = {
|
|||
};
|
||||
|
||||
static struct smc91x_platdata smc91x_platdata = {
|
||||
.flags = SMC91X_USE_32BIT | SMC91X_NOWAIT,
|
||||
.flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
|
||||
SMC91X_NOWAIT,
|
||||
};
|
||||
|
||||
static struct platform_device realview_eth_device = {
|
||||
|
|
|
@ -45,7 +45,7 @@ static struct resource smc91x_resources[] = {
|
|||
};
|
||||
|
||||
static struct smc91x_platdata smc91x_platdata = {
|
||||
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||
.flags = SMC91X_USE_16BIT | SMC91X_USE_8BIT | SMC91X_NOWAIT,
|
||||
};
|
||||
|
||||
static struct platform_device smc91x_device = {
|
||||
|
|
|
@ -270,6 +270,8 @@
|
|||
#io-channel-cells = <1>;
|
||||
clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;
|
||||
clock-names = "saradc", "apb_pclk";
|
||||
resets = <&cru SRST_SARADC>;
|
||||
reset-names = "saradc-apb";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
|
|
@ -100,7 +100,16 @@ ENTRY(cpu_do_resume)
|
|||
|
||||
msr tcr_el1, x8
|
||||
msr vbar_el1, x9
|
||||
|
||||
/*
|
||||
* __cpu_setup() cleared MDSCR_EL1.MDE and friends, before unmasking
|
||||
* debug exceptions. By restoring MDSCR_EL1 here, we may take a debug
|
||||
* exception. Mask them until local_dbg_restore() in cpu_suspend()
|
||||
* resets them.
|
||||
*/
|
||||
disable_dbg
|
||||
msr mdscr_el1, x10
|
||||
|
||||
msr sctlr_el1, x12
|
||||
/*
|
||||
* Restore oslsr_el1 by writing oslar_el1
|
||||
|
|
|
@ -146,7 +146,8 @@ static struct platform_device hitachi_fb_device = {
|
|||
#include <linux/smc91x.h>
|
||||
|
||||
static struct smc91x_platdata smc91x_info = {
|
||||
.flags = SMC91X_USE_32BIT | SMC91X_NOWAIT,
|
||||
.flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
|
||||
SMC91X_NOWAIT,
|
||||
.leda = RPC_LED_100_10,
|
||||
.ledb = RPC_LED_TX_RX,
|
||||
};
|
||||
|
|
|
@ -134,7 +134,8 @@ static struct platform_device net2272_bfin_device = {
|
|||
#include <linux/smc91x.h>
|
||||
|
||||
static struct smc91x_platdata smc91x_info = {
|
||||
.flags = SMC91X_USE_32BIT | SMC91X_NOWAIT,
|
||||
.flags = SMC91X_USE_8BIT | SMC91X_USE_16BIT | SMC91X_USE_32BIT |
|
||||
SMC91X_NOWAIT,
|
||||
.leda = RPC_LED_100_10,
|
||||
.ledb = RPC_LED_TX_RX,
|
||||
};
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
config PARISC
|
||||
def_bool y
|
||||
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||
select HAVE_IDE
|
||||
select HAVE_OPROFILE
|
||||
|
|
|
@ -245,7 +245,6 @@ CONFIG_DEBUG_RT_MUTEXES=y
|
|||
CONFIG_PROVE_RCU_DELAY=y
|
||||
CONFIG_DEBUG_BLOCK_EXT_DEVT=y
|
||||
CONFIG_LATENCYTOP=y
|
||||
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y
|
||||
CONFIG_KEYS=y
|
||||
# CONFIG_CRYPTO_HW is not set
|
||||
CONFIG_FONTS=y
|
||||
|
|
|
@ -291,7 +291,6 @@ CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
|
|||
CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y
|
||||
CONFIG_CRYPTO_MANAGER=y
|
||||
CONFIG_CRYPTO_ECB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
|
|
|
@ -208,13 +208,13 @@ unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned lo
|
|||
#define __copy_to_user_inatomic __copy_to_user
|
||||
#define __copy_from_user_inatomic __copy_from_user
|
||||
|
||||
extern void copy_from_user_overflow(void)
|
||||
#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
__compiletime_error("copy_from_user() buffer size is not provably correct")
|
||||
#else
|
||||
__compiletime_warning("copy_from_user() buffer size is not provably correct")
|
||||
#endif
|
||||
;
|
||||
extern void __compiletime_error("usercopy buffer size is too small")
|
||||
__bad_copy_user(void);
|
||||
|
||||
static inline void copy_user_overflow(int size, unsigned long count)
|
||||
{
|
||||
WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count);
|
||||
}
|
||||
|
||||
static inline unsigned long __must_check copy_from_user(void *to,
|
||||
const void __user *from,
|
||||
|
@ -223,10 +223,12 @@ static inline unsigned long __must_check copy_from_user(void *to,
|
|||
int sz = __compiletime_object_size(to);
|
||||
int ret = -EFAULT;
|
||||
|
||||
if (likely(sz == -1 || !__builtin_constant_p(n) || sz >= n))
|
||||
if (likely(sz == -1 || sz >= n))
|
||||
ret = __copy_from_user(to, from, n);
|
||||
else
|
||||
copy_from_user_overflow();
|
||||
else if (!__builtin_constant_p(n))
|
||||
copy_user_overflow(sz, n);
|
||||
else
|
||||
__bad_copy_user();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/cpumask.h>
|
||||
#include <asm/cpu_has_feature.h>
|
||||
|
||||
/*
|
||||
* Mapping of threads to cores
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#ifndef __ASM_PPC64_HMI_H__
|
||||
#define __ASM_PPC64_HMI_H__
|
||||
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||
|
||||
#define CORE_TB_RESYNC_REQ_BIT 63
|
||||
#define MAX_SUBCORE_PER_CORE 4
|
||||
|
|
|
@ -183,11 +183,6 @@ struct paca_struct {
|
|||
*/
|
||||
u16 in_mce;
|
||||
u8 hmi_event_available; /* HMI event is available */
|
||||
/*
|
||||
* Bitmap for sibling subcore status. See kvm/book3s_hv_ras.c for
|
||||
* more details
|
||||
*/
|
||||
struct sibling_subcore_state *sibling_subcore_state;
|
||||
#endif
|
||||
|
||||
/* Stuff for accurate time accounting */
|
||||
|
@ -202,6 +197,13 @@ struct paca_struct {
|
|||
struct kvmppc_book3s_shadow_vcpu shadow_vcpu;
|
||||
#endif
|
||||
struct kvmppc_host_state kvm_hstate;
|
||||
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||
/*
|
||||
* Bitmap for sibling subcore status. See kvm/book3s_hv_ras.c for
|
||||
* more details
|
||||
*/
|
||||
struct sibling_subcore_state *sibling_subcore_state;
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -301,6 +301,7 @@ extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,
|
|||
/* Allocate & free a PCI host bridge structure */
|
||||
extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);
|
||||
extern void pcibios_free_controller(struct pci_controller *phb);
|
||||
extern void pcibios_free_controller_deferred(struct pci_host_bridge *bridge);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
extern int pcibios_vaddr_is_ioport(void __iomem *address);
|
||||
|
|
|
@ -41,7 +41,7 @@ obj-$(CONFIG_VDSO32) += vdso32/
|
|||
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
|
||||
obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o
|
||||
obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_power.o
|
||||
obj-$(CONFIG_PPC_BOOK3S_64) += mce.o mce_power.o hmi.o
|
||||
obj-$(CONFIG_PPC_BOOK3S_64) += mce.o mce_power.o
|
||||
obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o idle_book3e.o
|
||||
obj-$(CONFIG_PPC64) += vdso64/
|
||||
obj-$(CONFIG_ALTIVEC) += vecemu.o
|
||||
|
|
|
@ -368,13 +368,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
|||
tabort_syscall:
|
||||
/* Firstly we need to enable TM in the kernel */
|
||||
mfmsr r10
|
||||
li r13, 1
|
||||
rldimi r10, r13, MSR_TM_LG, 63-MSR_TM_LG
|
||||
li r9, 1
|
||||
rldimi r10, r9, MSR_TM_LG, 63-MSR_TM_LG
|
||||
mtmsrd r10, 0
|
||||
|
||||
/* tabort, this dooms the transaction, nothing else */
|
||||
li r13, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT)
|
||||
TABORT(R13)
|
||||
li r9, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT)
|
||||
TABORT(R9)
|
||||
|
||||
/*
|
||||
* Return directly to userspace. We have corrupted user register state,
|
||||
|
@ -382,8 +382,8 @@ tabort_syscall:
|
|||
* resume after the tbegin of the aborted transaction with the
|
||||
* checkpointed register state.
|
||||
*/
|
||||
li r13, MSR_RI
|
||||
andc r10, r10, r13
|
||||
li r9, MSR_RI
|
||||
andc r10, r10, r9
|
||||
mtmsrd r10, 1
|
||||
mtspr SPRN_SRR0, r11
|
||||
mtspr SPRN_SRR1, r12
|
||||
|
|
|
@ -485,7 +485,23 @@ machine_check_fwnmi:
|
|||
EXCEPTION_PROLOG_0(PACA_EXMC)
|
||||
machine_check_pSeries_0:
|
||||
EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200)
|
||||
EXCEPTION_PROLOG_PSERIES_1(machine_check_common, EXC_STD)
|
||||
/*
|
||||
* The following is essentially EXCEPTION_PROLOG_PSERIES_1 with the
|
||||
* difference that MSR_RI is not enabled, because PACA_EXMC is being
|
||||
* used, so nested machine check corrupts it. machine_check_common
|
||||
* enables MSR_RI.
|
||||
*/
|
||||
ld r12,PACAKBASE(r13)
|
||||
ld r10,PACAKMSR(r13)
|
||||
xori r10,r10,MSR_RI
|
||||
mfspr r11,SPRN_SRR0
|
||||
LOAD_HANDLER(r12, machine_check_common)
|
||||
mtspr SPRN_SRR0,r12
|
||||
mfspr r12,SPRN_SRR1
|
||||
mtspr SPRN_SRR1,r10
|
||||
rfid
|
||||
b . /* prevent speculative execution */
|
||||
|
||||
KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200)
|
||||
KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300)
|
||||
KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380)
|
||||
|
@ -969,14 +985,17 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
|
|||
machine_check_common:
|
||||
|
||||
mfspr r10,SPRN_DAR
|
||||
std r10,PACA_EXGEN+EX_DAR(r13)
|
||||
std r10,PACA_EXMC+EX_DAR(r13)
|
||||
mfspr r10,SPRN_DSISR
|
||||
stw r10,PACA_EXGEN+EX_DSISR(r13)
|
||||
stw r10,PACA_EXMC+EX_DSISR(r13)
|
||||
EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC)
|
||||
FINISH_NAP
|
||||
RECONCILE_IRQ_STATE(r10, r11)
|
||||
ld r3,PACA_EXGEN+EX_DAR(r13)
|
||||
lwz r4,PACA_EXGEN+EX_DSISR(r13)
|
||||
ld r3,PACA_EXMC+EX_DAR(r13)
|
||||
lwz r4,PACA_EXMC+EX_DSISR(r13)
|
||||
/* Enable MSR_RI when finished with PACA_EXMC */
|
||||
li r10,MSR_RI
|
||||
mtmsrd r10,1
|
||||
std r3,_DAR(r1)
|
||||
std r4,_DSISR(r1)
|
||||
bl save_nvgprs
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#include <linux/kprobes.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/preempt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/code-patching.h>
|
||||
|
|
|
@ -153,6 +153,42 @@ void pcibios_free_controller(struct pci_controller *phb)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(pcibios_free_controller);
|
||||
|
||||
/*
|
||||
* This function is used to call pcibios_free_controller()
|
||||
* in a deferred manner: a callback from the PCI subsystem.
|
||||
*
|
||||
* _*DO NOT*_ call pcibios_free_controller() explicitly if
|
||||
* this is used (or it may access an invalid *phb pointer).
|
||||
*
|
||||
* The callback occurs when all references to the root bus
|
||||
* are dropped (e.g., child buses/devices and their users).
|
||||
*
|
||||
* It's called as .release_fn() of 'struct pci_host_bridge'
|
||||
* which is associated with the 'struct pci_controller.bus'
|
||||
* (root bus) - it expects .release_data to hold a pointer
|
||||
* to 'struct pci_controller'.
|
||||
*
|
||||
* In order to use it, register .release_fn()/release_data
|
||||
* like this:
|
||||
*
|
||||
* pci_set_host_bridge_release(bridge,
|
||||
* pcibios_free_controller_deferred
|
||||
* (void *) phb);
|
||||
*
|
||||
* e.g. in the pcibios_root_bridge_prepare() callback from
|
||||
* pci_create_root_bus().
|
||||
*/
|
||||
void pcibios_free_controller_deferred(struct pci_host_bridge *bridge)
|
||||
{
|
||||
struct pci_controller *phb = (struct pci_controller *)
|
||||
bridge->release_data;
|
||||
|
||||
pr_debug("domain %d, dynamic %d\n", phb->global_number, phb->is_dynamic);
|
||||
|
||||
pcibios_free_controller(phb);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pcibios_free_controller_deferred);
|
||||
|
||||
/*
|
||||
* The function is used to return the minimal alignment
|
||||
* for memory or I/O windows of the associated P2P bridge.
|
||||
|
|
|
@ -695,7 +695,7 @@ unsigned char ibm_architecture_vec[] = {
|
|||
OV4_MIN_ENT_CAP, /* minimum VP entitled capacity */
|
||||
|
||||
/* option vector 5: PAPR/OF options */
|
||||
VECTOR_LENGTH(18), /* length */
|
||||
VECTOR_LENGTH(21), /* length */
|
||||
0, /* don't ignore, don't halt */
|
||||
OV5_FEAT(OV5_LPAR) | OV5_FEAT(OV5_SPLPAR) | OV5_FEAT(OV5_LARGE_PAGES) |
|
||||
OV5_FEAT(OV5_DRCONF_MEMORY) | OV5_FEAT(OV5_DONATE_DEDICATE_CPU) |
|
||||
|
@ -726,8 +726,11 @@ unsigned char ibm_architecture_vec[] = {
|
|||
0,
|
||||
0,
|
||||
OV5_FEAT(OV5_PFO_HW_RNG) | OV5_FEAT(OV5_PFO_HW_ENCR) |
|
||||
OV5_FEAT(OV5_PFO_HW_842),
|
||||
OV5_FEAT(OV5_SUB_PROCESSORS),
|
||||
OV5_FEAT(OV5_PFO_HW_842), /* Byte 17 */
|
||||
0, /* Byte 18 */
|
||||
0, /* Byte 19 */
|
||||
0, /* Byte 20 */
|
||||
OV5_FEAT(OV5_SUB_PROCESSORS), /* Byte 21 */
|
||||
|
||||
/* option vector 6: IBM PAPR hints */
|
||||
VECTOR_LENGTH(3), /* length */
|
||||
|
|
|
@ -1226,7 +1226,21 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
|
|||
(regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
|
||||
if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
|
||||
goto bad;
|
||||
|
||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||
/*
|
||||
* If there is a transactional state then throw it away.
|
||||
* The purpose of a sigreturn is to destroy all traces of the
|
||||
* signal frame, this includes any transactional state created
|
||||
* within in. We only check for suspended as we can never be
|
||||
* active in the kernel, we are active, there is nothing better to
|
||||
* do than go ahead and Bad Thing later.
|
||||
* The cause is not important as there will never be a
|
||||
* recheckpoint so it's not user visible.
|
||||
*/
|
||||
if (MSR_TM_SUSPENDED(mfmsr()))
|
||||
tm_reclaim_current(0);
|
||||
|
||||
if (__get_user(tmp, &rt_sf->uc.uc_link))
|
||||
goto bad;
|
||||
uc_transact = (struct ucontext __user *)(uintptr_t)tmp;
|
||||
|
|
|
@ -676,7 +676,21 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5,
|
|||
if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set)))
|
||||
goto badframe;
|
||||
set_current_blocked(&set);
|
||||
|
||||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||
/*
|
||||
* If there is a transactional state then throw it away.
|
||||
* The purpose of a sigreturn is to destroy all traces of the
|
||||
* signal frame, this includes any transactional state created
|
||||
* within in. We only check for suspended as we can never be
|
||||
* active in the kernel, we are active, there is nothing better to
|
||||
* do than go ahead and Bad Thing later.
|
||||
* The cause is not important as there will never be a
|
||||
* recheckpoint so it's not user visible.
|
||||
*/
|
||||
if (MSR_TM_SUSPENDED(mfmsr()))
|
||||
tm_reclaim_current(0);
|
||||
|
||||
if (__get_user(msr, &uc->uc_mcontext.gp_regs[PT_MSR]))
|
||||
goto badframe;
|
||||
if (MSR_TM_ACTIVE(msr)) {
|
||||
|
|
|
@ -830,7 +830,7 @@ int __cpu_disable(void)
|
|||
|
||||
/* Update sibling maps */
|
||||
base = cpu_first_thread_sibling(cpu);
|
||||
for (i = 0; i < threads_per_core; i++) {
|
||||
for (i = 0; i < threads_per_core && base + i < nr_cpu_ids; i++) {
|
||||
cpumask_clear_cpu(cpu, cpu_sibling_mask(base + i));
|
||||
cpumask_clear_cpu(base + i, cpu_sibling_mask(cpu));
|
||||
cpumask_clear_cpu(cpu, cpu_core_mask(base + i));
|
||||
|
|
|
@ -25,7 +25,8 @@
|
|||
#include <linux/user.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/module.h> /* print_modules */
|
||||
#include <linux/prctl.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kprobes.h>
|
||||
|
|
|
@ -78,6 +78,7 @@ kvm-book3s_64-builtin-xics-objs-$(CONFIG_KVM_XICS) := \
|
|||
|
||||
ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||
kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) += \
|
||||
book3s_hv_hmi.o \
|
||||
book3s_hv_rmhandlers.o \
|
||||
book3s_hv_rm_mmu.o \
|
||||
book3s_hv_ras.o \
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/perf_event.h>
|
||||
|
|
|
@ -528,7 +528,6 @@ static struct platform_driver mpc512x_lpbfifo_driver = {
|
|||
.remove = mpc512x_lpbfifo_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mpc512x_lpbfifo_match,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -222,7 +222,6 @@ static const struct of_device_id mcu_of_match_table[] = {
|
|||
static struct i2c_driver mcu_driver = {
|
||||
.driver = {
|
||||
.name = "mcu-mpc8349emitx",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = mcu_of_match_table,
|
||||
},
|
||||
.probe = mcu_probe,
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
#include <linux/tty.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
|
||||
#include <asm/time.h>
|
||||
#include <asm/machdep.h>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include <linux/pci.h>
|
||||
#include <linux/kdev_t.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
|
|
@ -370,6 +370,7 @@ static irqreturn_t process_dump(int irq, void *data)
|
|||
uint32_t dump_id, dump_size, dump_type;
|
||||
struct dump_obj *dump;
|
||||
char name[22];
|
||||
struct kobject *kobj;
|
||||
|
||||
rc = dump_read_info(&dump_id, &dump_size, &dump_type);
|
||||
if (rc != OPAL_SUCCESS)
|
||||
|
@ -381,8 +382,12 @@ static irqreturn_t process_dump(int irq, void *data)
|
|||
* that gracefully and not create two conflicting
|
||||
* entries.
|
||||
*/
|
||||
if (kset_find_obj(dump_kset, name))
|
||||
kobj = kset_find_obj(dump_kset, name);
|
||||
if (kobj) {
|
||||
/* Drop reference added by kset_find_obj() */
|
||||
kobject_put(kobj);
|
||||
return 0;
|
||||
}
|
||||
|
||||
dump = create_dump_obj(dump_id, dump_size, dump_type);
|
||||
if (!dump)
|
||||
|
|
|
@ -247,6 +247,7 @@ static irqreturn_t elog_event(int irq, void *data)
|
|||
uint64_t elog_type;
|
||||
int rc;
|
||||
char name[2+16+1];
|
||||
struct kobject *kobj;
|
||||
|
||||
rc = opal_get_elog_size(&id, &size, &type);
|
||||
if (rc != OPAL_SUCCESS) {
|
||||
|
@ -269,8 +270,12 @@ static irqreturn_t elog_event(int irq, void *data)
|
|||
* that gracefully and not create two conflicting
|
||||
* entries.
|
||||
*/
|
||||
if (kset_find_obj(elog_kset, name))
|
||||
kobj = kset_find_obj(elog_kset, name);
|
||||
if (kobj) {
|
||||
/* Drop reference added by kset_find_obj() */
|
||||
kobject_put(kobj);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
create_elog_obj(log_id, elog_size, elog_type);
|
||||
|
||||
|
|
|
@ -149,7 +149,7 @@ static void pnv_ioda_reserve_pe(struct pnv_phb *phb, int pe_no)
|
|||
|
||||
static struct pnv_ioda_pe *pnv_ioda_alloc_pe(struct pnv_phb *phb)
|
||||
{
|
||||
unsigned long pe = phb->ioda.total_pe_num - 1;
|
||||
long pe;
|
||||
|
||||
for (pe = phb->ioda.total_pe_num - 1; pe >= 0; pe--) {
|
||||
if (!test_and_set_bit(pe, phb->ioda.pe_alloc))
|
||||
|
|
|
@ -119,6 +119,10 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge)
|
|||
|
||||
bus = bridge->bus;
|
||||
|
||||
/* Rely on the pcibios_free_controller_deferred() callback. */
|
||||
pci_set_host_bridge_release(bridge, pcibios_free_controller_deferred,
|
||||
(void *) pci_bus_to_host(bus));
|
||||
|
||||
dn = pcibios_get_phb_of_node(bus);
|
||||
if (!dn)
|
||||
return 0;
|
||||
|
|
|
@ -106,8 +106,11 @@ int remove_phb_dynamic(struct pci_controller *phb)
|
|||
release_resource(res);
|
||||
}
|
||||
|
||||
/* Free pci_controller data structure */
|
||||
pcibios_free_controller(phb);
|
||||
/*
|
||||
* The pci_controller data structure is freed by
|
||||
* the pcibios_free_controller_deferred() callback;
|
||||
* see pseries_root_bridge_prepare().
|
||||
*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -534,7 +534,8 @@ struct cpm1_gpio16_chip {
|
|||
|
||||
static void cpm1_gpio16_save_regs(struct of_mm_gpio_chip *mm_gc)
|
||||
{
|
||||
struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
|
||||
struct cpm1_gpio16_chip *cpm1_gc =
|
||||
container_of(mm_gc, struct cpm1_gpio16_chip, mm_gc);
|
||||
struct cpm_ioport16 __iomem *iop = mm_gc->regs;
|
||||
|
||||
cpm1_gc->cpdata = in_be16(&iop->dat);
|
||||
|
@ -649,7 +650,8 @@ struct cpm1_gpio32_chip {
|
|||
|
||||
static void cpm1_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
|
||||
{
|
||||
struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(&mm_gc->gc);
|
||||
struct cpm1_gpio32_chip *cpm1_gc =
|
||||
container_of(mm_gc, struct cpm1_gpio32_chip, mm_gc);
|
||||
struct cpm_ioport32b __iomem *iop = mm_gc->regs;
|
||||
|
||||
cpm1_gc->cpdata = in_be32(&iop->dat);
|
||||
|
|
|
@ -94,7 +94,8 @@ struct cpm2_gpio32_chip {
|
|||
|
||||
static void cpm2_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
|
||||
{
|
||||
struct cpm2_gpio32_chip *cpm2_gc = gpiochip_get_data(&mm_gc->gc);
|
||||
struct cpm2_gpio32_chip *cpm2_gc =
|
||||
container_of(mm_gc, struct cpm2_gpio32_chip, mm_gc);
|
||||
struct cpm2_ioports __iomem *iop = mm_gc->regs;
|
||||
|
||||
cpm2_gc->cpdata = in_be32(&iop->dat);
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/extable.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
|
|
@ -68,7 +68,6 @@ config DEBUG_RODATA
|
|||
config S390
|
||||
def_bool y
|
||||
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
||||
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||
select ARCH_HAS_ELF_RANDOMIZE
|
||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||
|
|
|
@ -602,7 +602,6 @@ CONFIG_FAIL_FUTEX=y
|
|||
CONFIG_FAULT_INJECTION_DEBUG_FS=y
|
||||
CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y
|
||||
CONFIG_LATENCYTOP=y
|
||||
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y
|
||||
CONFIG_IRQSOFF_TRACER=y
|
||||
CONFIG_PREEMPT_TRACER=y
|
||||
CONFIG_SCHED_TRACER=y
|
||||
|
|
|
@ -552,7 +552,6 @@ CONFIG_NOTIFIER_ERROR_INJECTION=m
|
|||
CONFIG_CPU_NOTIFIER_ERROR_INJECT=m
|
||||
CONFIG_PM_NOTIFIER_ERROR_INJECT=m
|
||||
CONFIG_LATENCYTOP=y
|
||||
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y
|
||||
CONFIG_BLK_DEV_IO_TRACE=y
|
||||
# CONFIG_KPROBE_EVENT is not set
|
||||
CONFIG_TRACE_ENUM_MAP_FILE=y
|
||||
|
|
|
@ -549,7 +549,6 @@ CONFIG_TIMER_STATS=y
|
|||
CONFIG_RCU_TORTURE_TEST=m
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=60
|
||||
CONFIG_LATENCYTOP=y
|
||||
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y
|
||||
CONFIG_SCHED_TRACER=y
|
||||
CONFIG_FTRACE_SYSCALLS=y
|
||||
CONFIG_STACK_TRACER=y
|
||||
|
|
|
@ -172,7 +172,6 @@ CONFIG_DEBUG_NOTIFIERS=y
|
|||
CONFIG_RCU_CPU_STALL_TIMEOUT=60
|
||||
CONFIG_RCU_TRACE=y
|
||||
CONFIG_LATENCYTOP=y
|
||||
CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y
|
||||
CONFIG_SCHED_TRACER=y
|
||||
CONFIG_FTRACE_SYSCALLS=y
|
||||
CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y
|
||||
|
|
|
@ -311,6 +311,14 @@ int __get_user_bad(void) __attribute__((noreturn));
|
|||
#define __put_user_unaligned __put_user
|
||||
#define __get_user_unaligned __get_user
|
||||
|
||||
extern void __compiletime_error("usercopy buffer size is too small")
|
||||
__bad_copy_user(void);
|
||||
|
||||
static inline void copy_user_overflow(int size, unsigned long count)
|
||||
{
|
||||
WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count);
|
||||
}
|
||||
|
||||
/**
|
||||
* copy_to_user: - Copy a block of data into user space.
|
||||
* @to: Destination address, in user space.
|
||||
|
@ -332,12 +340,6 @@ copy_to_user(void __user *to, const void *from, unsigned long n)
|
|||
return __copy_to_user(to, from, n);
|
||||
}
|
||||
|
||||
void copy_from_user_overflow(void)
|
||||
#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
__compiletime_warning("copy_from_user() buffer size is not provably correct")
|
||||
#endif
|
||||
;
|
||||
|
||||
/**
|
||||
* copy_from_user: - Copy a block of data from user space.
|
||||
* @to: Destination address, in kernel space.
|
||||
|
@ -362,7 +364,10 @@ copy_from_user(void *to, const void __user *from, unsigned long n)
|
|||
|
||||
might_fault();
|
||||
if (unlikely(sz != -1 && sz < n)) {
|
||||
copy_from_user_overflow();
|
||||
if (!__builtin_constant_p(n))
|
||||
copy_user_overflow(sz, n);
|
||||
else
|
||||
__bad_copy_user();
|
||||
return n;
|
||||
}
|
||||
return __copy_from_user(to, from, n);
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
config TILE
|
||||
def_bool y
|
||||
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
||||
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select ARCH_WANT_FRAME_POINTERS
|
||||
|
|
|
@ -416,14 +416,13 @@ _copy_from_user(void *to, const void __user *from, unsigned long n)
|
|||
return n;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
/*
|
||||
* There are still unprovable places in the generic code as of 2.6.34, so this
|
||||
* option is not really compatible with -Werror, which is more useful in
|
||||
* general.
|
||||
*/
|
||||
extern void copy_from_user_overflow(void)
|
||||
__compiletime_warning("copy_from_user() size is not provably correct");
|
||||
extern void __compiletime_error("usercopy buffer size is too small")
|
||||
__bad_copy_user(void);
|
||||
|
||||
static inline void copy_user_overflow(int size, unsigned long count)
|
||||
{
|
||||
WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count);
|
||||
}
|
||||
|
||||
static inline unsigned long __must_check copy_from_user(void *to,
|
||||
const void __user *from,
|
||||
|
@ -433,14 +432,13 @@ static inline unsigned long __must_check copy_from_user(void *to,
|
|||
|
||||
if (likely(sz == -1 || sz >= n))
|
||||
n = _copy_from_user(to, from, n);
|
||||
else if (!__builtin_constant_p(n))
|
||||
copy_user_overflow(sz, n);
|
||||
else
|
||||
copy_from_user_overflow();
|
||||
__bad_copy_user();
|
||||
|
||||
return n;
|
||||
}
|
||||
#else
|
||||
#define copy_from_user _copy_from_user
|
||||
#endif
|
||||
|
||||
#ifdef __tilegx__
|
||||
/**
|
||||
|
|
|
@ -24,7 +24,6 @@ config X86
|
|||
select ARCH_DISCARD_MEMBLOCK
|
||||
select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI
|
||||
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
||||
select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||
select ARCH_HAS_ELF_RANDOMIZE
|
||||
select ARCH_HAS_FAST_MULTIPLIER
|
||||
|
|
|
@ -1 +1,3 @@
|
|||
CONFIG_NOHIGHMEM=y
|
||||
# CONFIG_HIGHMEM4G is not set
|
||||
# CONFIG_HIGHMEM64G is not set
|
||||
|
|
|
@ -697,43 +697,14 @@ unsigned long __must_check _copy_from_user(void *to, const void __user *from,
|
|||
unsigned long __must_check _copy_to_user(void __user *to, const void *from,
|
||||
unsigned n);
|
||||
|
||||
#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
# define copy_user_diag __compiletime_error
|
||||
#else
|
||||
# define copy_user_diag __compiletime_warning
|
||||
#endif
|
||||
extern void __compiletime_error("usercopy buffer size is too small")
|
||||
__bad_copy_user(void);
|
||||
|
||||
extern void copy_user_diag("copy_from_user() buffer size is too small")
|
||||
copy_from_user_overflow(void);
|
||||
extern void copy_user_diag("copy_to_user() buffer size is too small")
|
||||
copy_to_user_overflow(void) __asm__("copy_from_user_overflow");
|
||||
|
||||
#undef copy_user_diag
|
||||
|
||||
#ifdef CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
|
||||
extern void
|
||||
__compiletime_warning("copy_from_user() buffer size is not provably correct")
|
||||
__copy_from_user_overflow(void) __asm__("copy_from_user_overflow");
|
||||
#define __copy_from_user_overflow(size, count) __copy_from_user_overflow()
|
||||
|
||||
extern void
|
||||
__compiletime_warning("copy_to_user() buffer size is not provably correct")
|
||||
__copy_to_user_overflow(void) __asm__("copy_from_user_overflow");
|
||||
#define __copy_to_user_overflow(size, count) __copy_to_user_overflow()
|
||||
|
||||
#else
|
||||
|
||||
static inline void
|
||||
__copy_from_user_overflow(int size, unsigned long count)
|
||||
static inline void copy_user_overflow(int size, unsigned long count)
|
||||
{
|
||||
WARN(1, "Buffer overflow detected (%d < %lu)!\n", size, count);
|
||||
}
|
||||
|
||||
#define __copy_to_user_overflow __copy_from_user_overflow
|
||||
|
||||
#endif
|
||||
|
||||
static inline unsigned long __must_check
|
||||
copy_from_user(void *to, const void __user *from, unsigned long n)
|
||||
{
|
||||
|
@ -743,31 +714,13 @@ copy_from_user(void *to, const void __user *from, unsigned long n)
|
|||
|
||||
kasan_check_write(to, n);
|
||||
|
||||
/*
|
||||
* While we would like to have the compiler do the checking for us
|
||||
* even in the non-constant size case, any false positives there are
|
||||
* a problem (especially when DEBUG_STRICT_USER_COPY_CHECKS, but even
|
||||
* without - the [hopefully] dangerous looking nature of the warning
|
||||
* would make people go look at the respecitive call sites over and
|
||||
* over again just to find that there's no problem).
|
||||
*
|
||||
* And there are cases where it's just not realistic for the compiler
|
||||
* to prove the count to be in range. For example when multiple call
|
||||
* sites of a helper function - perhaps in different source files -
|
||||
* all doing proper range checking, yet the helper function not doing
|
||||
* so again.
|
||||
*
|
||||
* Therefore limit the compile time checking to the constant size
|
||||
* case, and do only runtime checking for non-constant sizes.
|
||||
*/
|
||||
|
||||
if (likely(sz < 0 || sz >= n)) {
|
||||
check_object_size(to, n, false);
|
||||
n = _copy_from_user(to, from, n);
|
||||
} else if (__builtin_constant_p(n))
|
||||
copy_from_user_overflow();
|
||||
} else if (!__builtin_constant_p(n))
|
||||
copy_user_overflow(sz, n);
|
||||
else
|
||||
__copy_from_user_overflow(sz, n);
|
||||
__bad_copy_user();
|
||||
|
||||
return n;
|
||||
}
|
||||
|
@ -781,21 +734,17 @@ copy_to_user(void __user *to, const void *from, unsigned long n)
|
|||
|
||||
might_fault();
|
||||
|
||||
/* See the comment in copy_from_user() above. */
|
||||
if (likely(sz < 0 || sz >= n)) {
|
||||
check_object_size(from, n, true);
|
||||
n = _copy_to_user(to, from, n);
|
||||
} else if (__builtin_constant_p(n))
|
||||
copy_to_user_overflow();
|
||||
} else if (!__builtin_constant_p(n))
|
||||
copy_user_overflow(sz, n);
|
||||
else
|
||||
__copy_to_user_overflow(sz, n);
|
||||
__bad_copy_user();
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
#undef __copy_from_user_overflow
|
||||
#undef __copy_to_user_overflow
|
||||
|
||||
/*
|
||||
* We rely on the nested NMI work to allow atomic faults from the NMI path; the
|
||||
* nested NMI paths are careful to preserve CR2.
|
||||
|
|
|
@ -669,6 +669,17 @@ static void init_amd_gh(struct cpuinfo_x86 *c)
|
|||
set_cpu_bug(c, X86_BUG_AMD_TLB_MMATCH);
|
||||
}
|
||||
|
||||
#define MSR_AMD64_DE_CFG 0xC0011029
|
||||
|
||||
static void init_amd_ln(struct cpuinfo_x86 *c)
|
||||
{
|
||||
/*
|
||||
* Apply erratum 665 fix unconditionally so machines without a BIOS
|
||||
* fix work.
|
||||
*/
|
||||
msr_set_bit(MSR_AMD64_DE_CFG, 31);
|
||||
}
|
||||
|
||||
static void init_amd_bd(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u64 value;
|
||||
|
@ -726,6 +737,7 @@ static void init_amd(struct cpuinfo_x86 *c)
|
|||
case 6: init_amd_k7(c); break;
|
||||
case 0xf: init_amd_k8(c); break;
|
||||
case 0x10: init_amd_gh(c); break;
|
||||
case 0x12: init_amd_ln(c); break;
|
||||
case 0x15: init_amd_bd(c); break;
|
||||
}
|
||||
|
||||
|
|
|
@ -56,12 +56,12 @@ asm (".pushsection .entry.text, \"ax\"\n"
|
|||
".popsection");
|
||||
|
||||
/* identity function, which can be inlined */
|
||||
u32 _paravirt_ident_32(u32 x)
|
||||
u32 notrace _paravirt_ident_32(u32 x)
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
u64 _paravirt_ident_64(u64 x)
|
||||
u64 notrace _paravirt_ident_64(u64 x)
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
|
|
@ -2054,7 +2054,7 @@ int __init acpi_scan_init(void)
|
|||
|
||||
static struct acpi_probe_entry *ape;
|
||||
static int acpi_probe_count;
|
||||
static DEFINE_SPINLOCK(acpi_probe_lock);
|
||||
static DEFINE_MUTEX(acpi_probe_mutex);
|
||||
|
||||
static int __init acpi_match_madt(struct acpi_subtable_header *header,
|
||||
const unsigned long end)
|
||||
|
@ -2073,7 +2073,7 @@ int __init __acpi_probe_device_table(struct acpi_probe_entry *ap_head, int nr)
|
|||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
spin_lock(&acpi_probe_lock);
|
||||
mutex_lock(&acpi_probe_mutex);
|
||||
for (ape = ap_head; nr; ape++, nr--) {
|
||||
if (ACPI_COMPARE_NAME(ACPI_SIG_MADT, ape->id)) {
|
||||
acpi_probe_count = 0;
|
||||
|
@ -2086,7 +2086,7 @@ int __init __acpi_probe_device_table(struct acpi_probe_entry *ap_head, int nr)
|
|||
count++;
|
||||
}
|
||||
}
|
||||
spin_unlock(&acpi_probe_lock);
|
||||
mutex_unlock(&acpi_probe_mutex);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
|
@ -2524,7 +2524,7 @@ static int ahci_host_activate_multi_irqs(struct ata_host *host,
|
|||
|
||||
/* Do not receive interrupts sent by dummy ports */
|
||||
if (!pp) {
|
||||
disable_irq(irq + i);
|
||||
disable_irq(irq);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -144,7 +144,7 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
ap->ioaddr.altstatus_addr = base + 0x1E;
|
||||
ap->ioaddr.bmdma_addr = base;
|
||||
ata_sff_std_ports(&ap->ioaddr);
|
||||
ap->pflags = ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE;
|
||||
ap->pflags |= ATA_PFLAG_PIO32 | ATA_PFLAG_PIO32CHANGE;
|
||||
|
||||
ninja32_program(base);
|
||||
/* FIXME: Should we disable them at remove ? */
|
||||
|
|
|
@ -301,7 +301,7 @@ static int rpm_idle(struct device *dev, int rpmflags)
|
|||
int (*callback)(struct device *);
|
||||
int retval;
|
||||
|
||||
trace_rpm_idle(dev, rpmflags);
|
||||
trace_rpm_idle_rcuidle(dev, rpmflags);
|
||||
retval = rpm_check_suspend_allowed(dev);
|
||||
if (retval < 0)
|
||||
; /* Conditions are wrong. */
|
||||
|
@ -337,7 +337,7 @@ static int rpm_idle(struct device *dev, int rpmflags)
|
|||
dev->power.request_pending = true;
|
||||
queue_work(pm_wq, &dev->power.work);
|
||||
}
|
||||
trace_rpm_return_int(dev, _THIS_IP_, 0);
|
||||
trace_rpm_return_int_rcuidle(dev, _THIS_IP_, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -352,7 +352,7 @@ static int rpm_idle(struct device *dev, int rpmflags)
|
|||
wake_up_all(&dev->power.wait_queue);
|
||||
|
||||
out:
|
||||
trace_rpm_return_int(dev, _THIS_IP_, retval);
|
||||
trace_rpm_return_int_rcuidle(dev, _THIS_IP_, retval);
|
||||
return retval ? retval : rpm_suspend(dev, rpmflags | RPM_AUTO);
|
||||
}
|
||||
|
||||
|
@ -601,7 +601,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
|
|||
struct device *parent = NULL;
|
||||
int retval = 0;
|
||||
|
||||
trace_rpm_resume(dev, rpmflags);
|
||||
trace_rpm_resume_rcuidle(dev, rpmflags);
|
||||
|
||||
repeat:
|
||||
if (dev->power.runtime_error)
|
||||
|
@ -764,7 +764,7 @@ static int rpm_resume(struct device *dev, int rpmflags)
|
|||
spin_lock_irq(&dev->power.lock);
|
||||
}
|
||||
|
||||
trace_rpm_return_int(dev, _THIS_IP_, retval);
|
||||
trace_rpm_return_int_rcuidle(dev, _THIS_IP_, retval);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
|
|
@ -244,7 +244,7 @@ config HW_RANDOM_TX4939
|
|||
|
||||
config HW_RANDOM_MXC_RNGA
|
||||
tristate "Freescale i.MX RNGA Random Number Generator"
|
||||
depends on ARCH_HAS_RNGA
|
||||
depends on SOC_IMX31
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
|
@ -957,7 +957,7 @@ int tpm2_auto_startup(struct tpm_chip *chip)
|
|||
goto out;
|
||||
|
||||
rc = tpm2_do_selftest(chip);
|
||||
if (rc != TPM2_RC_INITIALIZE) {
|
||||
if (rc != 0 && rc != TPM2_RC_INITIALIZE) {
|
||||
dev_err(&chip->dev, "TPM self test failed\n");
|
||||
goto out;
|
||||
}
|
||||
|
@ -974,7 +974,6 @@ int tpm2_auto_startup(struct tpm_chip *chip)
|
|||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
out:
|
||||
if (rc > 0)
|
||||
rc = -ENODEV;
|
||||
|
|
|
@ -69,6 +69,7 @@ static const struct cpg_core_clk r8a7795_core_clks[] __initconst = {
|
|||
DEF_FIXED(".s1", CLK_S1, CLK_PLL1_DIV2, 3, 1),
|
||||
DEF_FIXED(".s2", CLK_S2, CLK_PLL1_DIV2, 4, 1),
|
||||
DEF_FIXED(".s3", CLK_S3, CLK_PLL1_DIV2, 6, 1),
|
||||
DEF_FIXED(".sdsrc", CLK_SDSRC, CLK_PLL1_DIV2, 2, 1),
|
||||
|
||||
/* Core Clock Outputs */
|
||||
DEF_FIXED("ztr", R8A7795_CLK_ZTR, CLK_PLL1_DIV2, 6, 1),
|
||||
|
@ -87,10 +88,10 @@ static const struct cpg_core_clk r8a7795_core_clks[] __initconst = {
|
|||
DEF_FIXED("s3d2", R8A7795_CLK_S3D2, CLK_S3, 2, 1),
|
||||
DEF_FIXED("s3d4", R8A7795_CLK_S3D4, CLK_S3, 4, 1),
|
||||
|
||||
DEF_GEN3_SD("sd0", R8A7795_CLK_SD0, CLK_PLL1_DIV2, 0x0074),
|
||||
DEF_GEN3_SD("sd1", R8A7795_CLK_SD1, CLK_PLL1_DIV2, 0x0078),
|
||||
DEF_GEN3_SD("sd2", R8A7795_CLK_SD2, CLK_PLL1_DIV2, 0x0268),
|
||||
DEF_GEN3_SD("sd3", R8A7795_CLK_SD3, CLK_PLL1_DIV2, 0x026c),
|
||||
DEF_GEN3_SD("sd0", R8A7795_CLK_SD0, CLK_SDSRC, 0x0074),
|
||||
DEF_GEN3_SD("sd1", R8A7795_CLK_SD1, CLK_SDSRC, 0x0078),
|
||||
DEF_GEN3_SD("sd2", R8A7795_CLK_SD2, CLK_SDSRC, 0x0268),
|
||||
DEF_GEN3_SD("sd3", R8A7795_CLK_SD3, CLK_SDSRC, 0x026c),
|
||||
|
||||
DEF_FIXED("cl", R8A7795_CLK_CL, CLK_PLL1_DIV2, 48, 1),
|
||||
DEF_FIXED("cp", R8A7795_CLK_CP, CLK_EXTAL, 2, 1),
|
||||
|
|
|
@ -833,9 +833,9 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = {
|
|||
|
||||
/* perihp */
|
||||
GATE(0, "cpll_aclk_perihp_src", "cpll", CLK_IGNORE_UNUSED,
|
||||
RK3399_CLKGATE_CON(5), 0, GFLAGS),
|
||||
GATE(0, "gpll_aclk_perihp_src", "gpll", CLK_IGNORE_UNUSED,
|
||||
RK3399_CLKGATE_CON(5), 1, GFLAGS),
|
||||
GATE(0, "gpll_aclk_perihp_src", "gpll", CLK_IGNORE_UNUSED,
|
||||
RK3399_CLKGATE_CON(5), 0, GFLAGS),
|
||||
COMPOSITE(ACLK_PERIHP, "aclk_perihp", mux_aclk_perihp_p, CLK_IGNORE_UNUSED,
|
||||
RK3399_CLKSEL_CON(14), 7, 1, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3399_CLKGATE_CON(5), 2, GFLAGS),
|
||||
|
@ -923,9 +923,9 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = {
|
|||
RK3399_CLKGATE_CON(6), 14, GFLAGS),
|
||||
|
||||
GATE(0, "cpll_aclk_emmc_src", "cpll", CLK_IGNORE_UNUSED,
|
||||
RK3399_CLKGATE_CON(6), 12, GFLAGS),
|
||||
GATE(0, "gpll_aclk_emmc_src", "gpll", CLK_IGNORE_UNUSED,
|
||||
RK3399_CLKGATE_CON(6), 13, GFLAGS),
|
||||
GATE(0, "gpll_aclk_emmc_src", "gpll", CLK_IGNORE_UNUSED,
|
||||
RK3399_CLKGATE_CON(6), 12, GFLAGS),
|
||||
COMPOSITE_NOGATE(ACLK_EMMC, "aclk_emmc", mux_aclk_emmc_p, CLK_IGNORE_UNUSED,
|
||||
RK3399_CLKSEL_CON(21), 7, 1, MFLAGS, 0, 5, DFLAGS),
|
||||
GATE(ACLK_EMMC_CORE, "aclk_emmccore", "aclk_emmc", CLK_IGNORE_UNUSED,
|
||||
|
@ -1071,7 +1071,7 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = {
|
|||
/* vio */
|
||||
COMPOSITE(ACLK_VIO, "aclk_vio", mux_pll_src_cpll_gpll_ppll_p, CLK_IGNORE_UNUSED,
|
||||
RK3399_CLKSEL_CON(42), 6, 2, MFLAGS, 0, 5, DFLAGS,
|
||||
RK3399_CLKGATE_CON(11), 10, GFLAGS),
|
||||
RK3399_CLKGATE_CON(11), 0, GFLAGS),
|
||||
COMPOSITE_NOMUX(PCLK_VIO, "pclk_vio", "aclk_vio", 0,
|
||||
RK3399_CLKSEL_CON(43), 0, 5, DFLAGS,
|
||||
RK3399_CLKGATE_CON(11), 1, GFLAGS),
|
||||
|
@ -1484,6 +1484,7 @@ static const char *const rk3399_cru_critical_clocks[] __initconst = {
|
|||
"hclk_perilp1",
|
||||
"hclk_perilp1_noc",
|
||||
"aclk_dmac0_perilp",
|
||||
"aclk_emmc_noc",
|
||||
"gpll_hclk_perilp1_src",
|
||||
"gpll_aclk_perilp0_src",
|
||||
"gpll_aclk_perihp_src",
|
||||
|
|
|
@ -31,7 +31,7 @@ void ccu_helper_wait_for_lock(struct ccu_common *common, u32 lock)
|
|||
return;
|
||||
|
||||
WARN_ON(readl_relaxed_poll_timeout(common->base + common->reg, reg,
|
||||
!(reg & lock), 100, 70000));
|
||||
reg & lock, 100, 70000));
|
||||
}
|
||||
|
||||
int sunxi_ccu_probe(struct device_node *node, void __iomem *reg,
|
||||
|
|
|
@ -428,7 +428,7 @@ static struct tegra_clk_pll_params pll_d_params = {
|
|||
.div_nmp = &pllp_nmp,
|
||||
.freq_table = pll_d_freq_table,
|
||||
.flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
|
||||
TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
};
|
||||
|
||||
static struct tegra_clk_pll_params pll_d2_params = {
|
||||
|
@ -446,7 +446,7 @@ static struct tegra_clk_pll_params pll_d2_params = {
|
|||
.div_nmp = &pllp_nmp,
|
||||
.freq_table = pll_d_freq_table,
|
||||
.flags = TEGRA_PLL_HAS_CPCON | TEGRA_PLL_SET_LFCON |
|
||||
TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
};
|
||||
|
||||
static const struct pdiv_map pllu_p[] = {
|
||||
|
|
|
@ -240,6 +240,7 @@ static int __init at91sam926x_pit_common_init(struct pit_data *data)
|
|||
static int __init at91sam926x_pit_dt_init(struct device_node *node)
|
||||
{
|
||||
struct pit_data *data;
|
||||
int ret;
|
||||
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
|
|
|
@ -74,6 +74,8 @@ static const struct of_device_id machines[] __initconst = {
|
|||
{ .compatible = "ti,omap5", },
|
||||
|
||||
{ .compatible = "xlnx,zynq-7000", },
|
||||
|
||||
{ }
|
||||
};
|
||||
|
||||
static int __init cpufreq_dt_platdev_init(void)
|
||||
|
|
|
@ -1260,8 +1260,8 @@ static struct crypto_alg qat_algs[] = { {
|
|||
.setkey = qat_alg_ablkcipher_xts_setkey,
|
||||
.decrypt = qat_alg_ablkcipher_decrypt,
|
||||
.encrypt = qat_alg_ablkcipher_encrypt,
|
||||
.min_keysize = AES_MIN_KEY_SIZE,
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
.min_keysize = 2 * AES_MIN_KEY_SIZE,
|
||||
.max_keysize = 2 * AES_MAX_KEY_SIZE,
|
||||
.ivsize = AES_BLOCK_SIZE,
|
||||
},
|
||||
},
|
||||
|
|
|
@ -129,8 +129,8 @@ static int p8_aes_xts_crypt(struct blkcipher_desc *desc,
|
|||
|
||||
blkcipher_walk_init(&walk, dst, src, nbytes);
|
||||
|
||||
iv = (u8 *)walk.iv;
|
||||
ret = blkcipher_walk_virt(desc, &walk);
|
||||
iv = walk.iv;
|
||||
memset(tweak, 0, AES_BLOCK_SIZE);
|
||||
aes_p8_encrypt(iv, tweak, &ctx->tweak_key);
|
||||
|
||||
|
|
|
@ -2067,7 +2067,7 @@ err_dma_unregister:
|
|||
err_clk_disable:
|
||||
clk_disable_unprepare(atxdmac->clk);
|
||||
err_free_irq:
|
||||
free_irq(atxdmac->irq, atxdmac->dma.dev);
|
||||
free_irq(atxdmac->irq, atxdmac);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2081,7 +2081,7 @@ static int at_xdmac_remove(struct platform_device *pdev)
|
|||
dma_async_device_unregister(&atxdmac->dma);
|
||||
clk_disable_unprepare(atxdmac->clk);
|
||||
|
||||
free_irq(atxdmac->irq, atxdmac->dma.dev);
|
||||
free_irq(atxdmac->irq, atxdmac);
|
||||
|
||||
for (i = 0; i < atxdmac->dma.chancnt; i++) {
|
||||
struct at_xdmac_chan *atchan = &atxdmac->chan[i];
|
||||
|
|
|
@ -836,6 +836,7 @@ static int fsl_re_probe(struct platform_device *ofdev)
|
|||
rc = of_property_read_u32(np, "reg", &off);
|
||||
if (rc) {
|
||||
dev_err(dev, "Reg property not found in JQ node\n");
|
||||
of_node_put(np);
|
||||
return -ENODEV;
|
||||
}
|
||||
/* Find out the Job Rings present under each JQ */
|
||||
|
|
|
@ -861,7 +861,6 @@ static int mdc_dma_probe(struct platform_device *pdev)
|
|||
{
|
||||
struct mdc_dma *mdma;
|
||||
struct resource *res;
|
||||
const struct of_device_id *match;
|
||||
unsigned int i;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
@ -871,8 +870,7 @@ static int mdc_dma_probe(struct platform_device *pdev)
|
|||
return -ENOMEM;
|
||||
platform_set_drvdata(pdev, mdma);
|
||||
|
||||
match = of_match_device(mdc_dma_of_match, &pdev->dev);
|
||||
mdma->soc = match->data;
|
||||
mdma->soc = of_device_get_match_data(&pdev->dev);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
mdma->regs = devm_ioremap_resource(&pdev->dev, res);
|
||||
|
|
|
@ -638,7 +638,7 @@ static bool pxad_try_hotchain(struct virt_dma_chan *vc,
|
|||
vd_last_issued = list_entry(vc->desc_issued.prev,
|
||||
struct virt_dma_desc, node);
|
||||
pxad_desc_chain(vd_last_issued, vd);
|
||||
if (is_chan_running(chan) || is_desc_completed(vd_last_issued))
|
||||
if (is_chan_running(chan) || is_desc_completed(vd))
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -671,6 +671,7 @@ static irqreturn_t pxad_chan_handler(int irq, void *dev_id)
|
|||
struct virt_dma_desc *vd, *tmp;
|
||||
unsigned int dcsr;
|
||||
unsigned long flags;
|
||||
bool vd_completed;
|
||||
dma_cookie_t last_started = 0;
|
||||
|
||||
BUG_ON(!chan);
|
||||
|
@ -681,15 +682,17 @@ static irqreturn_t pxad_chan_handler(int irq, void *dev_id)
|
|||
|
||||
spin_lock_irqsave(&chan->vc.lock, flags);
|
||||
list_for_each_entry_safe(vd, tmp, &chan->vc.desc_issued, node) {
|
||||
vd_completed = is_desc_completed(vd);
|
||||
dev_dbg(&chan->vc.chan.dev->device,
|
||||
"%s(): checking txd %p[%x]: completed=%d\n",
|
||||
__func__, vd, vd->tx.cookie, is_desc_completed(vd));
|
||||
"%s(): checking txd %p[%x]: completed=%d dcsr=0x%x\n",
|
||||
__func__, vd, vd->tx.cookie, vd_completed,
|
||||
dcsr);
|
||||
last_started = vd->tx.cookie;
|
||||
if (to_pxad_sw_desc(vd)->cyclic) {
|
||||
vchan_cyclic_callback(vd);
|
||||
break;
|
||||
}
|
||||
if (is_desc_completed(vd)) {
|
||||
if (vd_completed) {
|
||||
list_del(&vd->node);
|
||||
vchan_cookie_complete(vd);
|
||||
} else {
|
||||
|
|
|
@ -600,27 +600,30 @@ static irqreturn_t usb_dmac_isr_channel(int irq, void *dev)
|
|||
{
|
||||
struct usb_dmac_chan *chan = dev;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
u32 mask = USB_DMACHCR_TE;
|
||||
u32 check_bits = USB_DMACHCR_TE | USB_DMACHCR_SP;
|
||||
u32 mask = 0;
|
||||
u32 chcr;
|
||||
bool xfer_end = false;
|
||||
|
||||
spin_lock(&chan->vc.lock);
|
||||
|
||||
chcr = usb_dmac_chan_read(chan, USB_DMACHCR);
|
||||
if (chcr & check_bits)
|
||||
mask |= USB_DMACHCR_DE | check_bits;
|
||||
if (chcr & (USB_DMACHCR_TE | USB_DMACHCR_SP)) {
|
||||
mask |= USB_DMACHCR_DE | USB_DMACHCR_TE | USB_DMACHCR_SP;
|
||||
if (chcr & USB_DMACHCR_DE)
|
||||
xfer_end = true;
|
||||
ret |= IRQ_HANDLED;
|
||||
}
|
||||
if (chcr & USB_DMACHCR_NULL) {
|
||||
/* An interruption of TE will happen after we set FTE */
|
||||
mask |= USB_DMACHCR_NULL;
|
||||
chcr |= USB_DMACHCR_FTE;
|
||||
ret |= IRQ_HANDLED;
|
||||
}
|
||||
usb_dmac_chan_write(chan, USB_DMACHCR, chcr & ~mask);
|
||||
if (mask)
|
||||
usb_dmac_chan_write(chan, USB_DMACHCR, chcr & ~mask);
|
||||
|
||||
if (chcr & check_bits) {
|
||||
if (xfer_end)
|
||||
usb_dmac_isr_transfer_end(chan);
|
||||
ret |= IRQ_HANDLED;
|
||||
}
|
||||
|
||||
spin_unlock(&chan->vc.lock);
|
||||
|
||||
|
|
|
@ -280,7 +280,7 @@ void amdgpu_ib_pool_fini(struct amdgpu_device *adev)
|
|||
int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
|
||||
{
|
||||
unsigned i;
|
||||
int r;
|
||||
int r, ret = 0;
|
||||
|
||||
for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
|
||||
struct amdgpu_ring *ring = adev->rings[i];
|
||||
|
@ -301,10 +301,11 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
|
|||
} else {
|
||||
/* still not good, but we can live with it */
|
||||
DRM_ERROR("amdgpu: failed testing IB on ring %d (%d).\n", i, r);
|
||||
ret = r;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -52,6 +52,7 @@ static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev);
|
|||
static void cik_sdma_set_irq_funcs(struct amdgpu_device *adev);
|
||||
static void cik_sdma_set_buffer_funcs(struct amdgpu_device *adev);
|
||||
static void cik_sdma_set_vm_pte_funcs(struct amdgpu_device *adev);
|
||||
static int cik_sdma_soft_reset(void *handle);
|
||||
|
||||
MODULE_FIRMWARE("radeon/bonaire_sdma.bin");
|
||||
MODULE_FIRMWARE("radeon/bonaire_sdma1.bin");
|
||||
|
@ -1037,6 +1038,8 @@ static int cik_sdma_resume(void *handle)
|
|||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
cik_sdma_soft_reset(handle);
|
||||
|
||||
return cik_sdma_hw_init(adev);
|
||||
}
|
||||
|
||||
|
|
|
@ -2755,8 +2755,7 @@ static int gfx_v7_0_cp_compute_resume(struct amdgpu_device *adev)
|
|||
u64 wb_gpu_addr;
|
||||
u32 *buf;
|
||||
struct bonaire_mqd *mqd;
|
||||
|
||||
gfx_v7_0_cp_compute_enable(adev, true);
|
||||
struct amdgpu_ring *ring;
|
||||
|
||||
/* fix up chicken bits */
|
||||
tmp = RREG32(mmCP_CPF_DEBUG);
|
||||
|
@ -2791,7 +2790,7 @@ static int gfx_v7_0_cp_compute_resume(struct amdgpu_device *adev)
|
|||
|
||||
/* init the queues. Just two for now. */
|
||||
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
|
||||
struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
|
||||
ring = &adev->gfx.compute_ring[i];
|
||||
|
||||
if (ring->mqd_obj == NULL) {
|
||||
r = amdgpu_bo_create(adev,
|
||||
|
@ -2970,6 +2969,13 @@ static int gfx_v7_0_cp_compute_resume(struct amdgpu_device *adev)
|
|||
amdgpu_bo_unreserve(ring->mqd_obj);
|
||||
|
||||
ring->ready = true;
|
||||
}
|
||||
|
||||
gfx_v7_0_cp_compute_enable(adev, true);
|
||||
|
||||
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
|
||||
ring = &adev->gfx.compute_ring[i];
|
||||
|
||||
r = amdgpu_ring_test_ring(ring);
|
||||
if (r)
|
||||
ring->ready = false;
|
||||
|
|
|
@ -171,10 +171,34 @@ static void imx_drm_output_poll_changed(struct drm_device *drm)
|
|||
drm_fbdev_cma_hotplug_event(imxdrm->fbhelper);
|
||||
}
|
||||
|
||||
static int imx_drm_atomic_check(struct drm_device *dev,
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = drm_atomic_helper_check_modeset(dev, state);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = drm_atomic_helper_check_planes(dev, state);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Check modeset again in case crtc_state->mode_changed is
|
||||
* updated in plane's ->atomic_check callback.
|
||||
*/
|
||||
ret = drm_atomic_helper_check_modeset(dev, state);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct drm_mode_config_funcs imx_drm_mode_config_funcs = {
|
||||
.fb_create = drm_fb_cma_create,
|
||||
.output_poll_changed = imx_drm_output_poll_changed,
|
||||
.atomic_check = drm_atomic_helper_check,
|
||||
.atomic_check = imx_drm_atomic_check,
|
||||
.atomic_commit = drm_atomic_helper_commit,
|
||||
};
|
||||
|
||||
|
|
|
@ -76,6 +76,8 @@ static void ipu_crtc_disable(struct drm_crtc *crtc)
|
|||
crtc->state->event = NULL;
|
||||
}
|
||||
spin_unlock_irq(&crtc->dev->event_lock);
|
||||
|
||||
drm_crtc_vblank_off(crtc);
|
||||
}
|
||||
|
||||
static void imx_drm_crtc_reset(struct drm_crtc *crtc)
|
||||
|
@ -175,6 +177,8 @@ static int ipu_crtc_atomic_check(struct drm_crtc *crtc,
|
|||
static void ipu_crtc_atomic_begin(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *old_crtc_state)
|
||||
{
|
||||
drm_crtc_vblank_on(crtc);
|
||||
|
||||
spin_lock_irq(&crtc->dev->event_lock);
|
||||
if (crtc->state->event) {
|
||||
WARN_ON(drm_crtc_vblank_get(crtc));
|
||||
|
|
|
@ -319,13 +319,14 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
|
|||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* since we cannot touch active IDMAC channels, we do not support
|
||||
* resizing the enabled plane or changing its format
|
||||
* We support resizing active plane or changing its format by
|
||||
* forcing CRTC mode change and disabling-enabling plane in plane's
|
||||
* ->atomic_update callback.
|
||||
*/
|
||||
if (old_fb && (state->src_w != old_state->src_w ||
|
||||
state->src_h != old_state->src_h ||
|
||||
fb->pixel_format != old_fb->pixel_format))
|
||||
return -EINVAL;
|
||||
crtc_state->mode_changed = true;
|
||||
|
||||
eba = drm_plane_state_to_eba(state);
|
||||
|
||||
|
@ -336,7 +337,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
|
|||
return -EINVAL;
|
||||
|
||||
if (old_fb && fb->pitches[0] != old_fb->pitches[0])
|
||||
return -EINVAL;
|
||||
crtc_state->mode_changed = true;
|
||||
|
||||
switch (fb->pixel_format) {
|
||||
case DRM_FORMAT_YUV420:
|
||||
|
@ -372,7 +373,7 @@ static int ipu_plane_atomic_check(struct drm_plane *plane,
|
|||
return -EINVAL;
|
||||
|
||||
if (old_fb && old_fb->pitches[1] != fb->pitches[1])
|
||||
return -EINVAL;
|
||||
crtc_state->mode_changed = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -392,8 +393,14 @@ static void ipu_plane_atomic_update(struct drm_plane *plane,
|
|||
enum ipu_color_space ics;
|
||||
|
||||
if (old_state->fb) {
|
||||
ipu_plane_atomic_set_base(ipu_plane, old_state);
|
||||
return;
|
||||
struct drm_crtc_state *crtc_state = state->crtc->state;
|
||||
|
||||
if (!crtc_state->mode_changed) {
|
||||
ipu_plane_atomic_set_base(ipu_plane, old_state);
|
||||
return;
|
||||
}
|
||||
|
||||
ipu_disable_plane(plane);
|
||||
}
|
||||
|
||||
switch (ipu_plane->dp_flow) {
|
||||
|
|
|
@ -157,6 +157,12 @@ struct msm_drm_private {
|
|||
struct shrinker shrinker;
|
||||
|
||||
struct msm_vblank_ctrl vblank_ctrl;
|
||||
|
||||
/* task holding struct_mutex.. currently only used in submit path
|
||||
* to detect and reject faults from copy_from_user() for submit
|
||||
* ioctl.
|
||||
*/
|
||||
struct task_struct *struct_mutex_task;
|
||||
};
|
||||
|
||||
struct msm_format {
|
||||
|
|
|
@ -196,11 +196,20 @@ int msm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||
{
|
||||
struct drm_gem_object *obj = vma->vm_private_data;
|
||||
struct drm_device *dev = obj->dev;
|
||||
struct msm_drm_private *priv = dev->dev_private;
|
||||
struct page **pages;
|
||||
unsigned long pfn;
|
||||
pgoff_t pgoff;
|
||||
int ret;
|
||||
|
||||
/* This should only happen if userspace tries to pass a mmap'd
|
||||
* but unfaulted gem bo vaddr into submit ioctl, triggering
|
||||
* a page fault while struct_mutex is already held. This is
|
||||
* not a valid use-case so just bail.
|
||||
*/
|
||||
if (priv->struct_mutex_task == current)
|
||||
return VM_FAULT_SIGBUS;
|
||||
|
||||
/* Make sure we don't parallel update on a fault, nor move or remove
|
||||
* something from beneath our feet
|
||||
*/
|
||||
|
|
|
@ -64,6 +64,14 @@ void msm_gem_submit_free(struct msm_gem_submit *submit)
|
|||
kfree(submit);
|
||||
}
|
||||
|
||||
static inline unsigned long __must_check
|
||||
copy_from_user_inatomic(void *to, const void __user *from, unsigned long n)
|
||||
{
|
||||
if (access_ok(VERIFY_READ, from, n))
|
||||
return __copy_from_user_inatomic(to, from, n);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
static int submit_lookup_objects(struct msm_gem_submit *submit,
|
||||
struct drm_msm_gem_submit *args, struct drm_file *file)
|
||||
{
|
||||
|
@ -71,6 +79,7 @@ static int submit_lookup_objects(struct msm_gem_submit *submit,
|
|||
int ret = 0;
|
||||
|
||||
spin_lock(&file->table_lock);
|
||||
pagefault_disable();
|
||||
|
||||
for (i = 0; i < args->nr_bos; i++) {
|
||||
struct drm_msm_gem_submit_bo submit_bo;
|
||||
|
@ -84,10 +93,15 @@ static int submit_lookup_objects(struct msm_gem_submit *submit,
|
|||
*/
|
||||
submit->bos[i].flags = 0;
|
||||
|
||||
ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo));
|
||||
if (ret) {
|
||||
ret = -EFAULT;
|
||||
goto out_unlock;
|
||||
ret = copy_from_user_inatomic(&submit_bo, userptr, sizeof(submit_bo));
|
||||
if (unlikely(ret)) {
|
||||
pagefault_enable();
|
||||
spin_unlock(&file->table_lock);
|
||||
ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo));
|
||||
if (ret)
|
||||
goto out;
|
||||
spin_lock(&file->table_lock);
|
||||
pagefault_disable();
|
||||
}
|
||||
|
||||
if (submit_bo.flags & ~MSM_SUBMIT_BO_FLAGS) {
|
||||
|
@ -127,9 +141,12 @@ static int submit_lookup_objects(struct msm_gem_submit *submit,
|
|||
}
|
||||
|
||||
out_unlock:
|
||||
submit->nr_bos = i;
|
||||
pagefault_enable();
|
||||
spin_unlock(&file->table_lock);
|
||||
|
||||
out:
|
||||
submit->nr_bos = i;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -377,6 +394,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv->struct_mutex_task = current;
|
||||
|
||||
submit = submit_create(dev, gpu, args->nr_bos, args->nr_cmds);
|
||||
if (!submit) {
|
||||
ret = -ENOMEM;
|
||||
|
@ -468,6 +487,7 @@ out:
|
|||
if (ret)
|
||||
msm_gem_submit_free(submit);
|
||||
out_unlock:
|
||||
priv->struct_mutex_task = NULL;
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -225,6 +225,17 @@ static bool nouveau_pr3_present(struct pci_dev *pdev)
|
|||
if (!parent_pdev)
|
||||
return false;
|
||||
|
||||
if (!parent_pdev->bridge_d3) {
|
||||
/*
|
||||
* Parent PCI bridge is currently not power managed.
|
||||
* Since userspace can change these afterwards to be on
|
||||
* the safe side we stick with _DSM and prevent usage of
|
||||
* _PR3 from the bridge.
|
||||
*/
|
||||
pci_d3cold_disable(pdev);
|
||||
return false;
|
||||
}
|
||||
|
||||
parent_adev = ACPI_COMPANION(&parent_pdev->dev);
|
||||
if (!parent_adev)
|
||||
return false;
|
||||
|
|
|
@ -57,21 +57,21 @@ static int vc4_get_param_ioctl(struct drm_device *dev, void *data,
|
|||
switch (args->param) {
|
||||
case DRM_VC4_PARAM_V3D_IDENT0:
|
||||
ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
args->value = V3D_READ(V3D_IDENT0);
|
||||
pm_runtime_put(&vc4->v3d->pdev->dev);
|
||||
break;
|
||||
case DRM_VC4_PARAM_V3D_IDENT1:
|
||||
ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
args->value = V3D_READ(V3D_IDENT1);
|
||||
pm_runtime_put(&vc4->v3d->pdev->dev);
|
||||
break;
|
||||
case DRM_VC4_PARAM_V3D_IDENT2:
|
||||
ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
args->value = V3D_READ(V3D_IDENT2);
|
||||
pm_runtime_put(&vc4->v3d->pdev->dev);
|
||||
|
|
|
@ -321,6 +321,15 @@ vc4_first_render_job(struct vc4_dev *vc4)
|
|||
struct vc4_exec_info, head);
|
||||
}
|
||||
|
||||
static inline struct vc4_exec_info *
|
||||
vc4_last_render_job(struct vc4_dev *vc4)
|
||||
{
|
||||
if (list_empty(&vc4->render_job_list))
|
||||
return NULL;
|
||||
return list_last_entry(&vc4->render_job_list,
|
||||
struct vc4_exec_info, head);
|
||||
}
|
||||
|
||||
/**
|
||||
* struct vc4_texture_sample_info - saves the offsets into the UBO for texture
|
||||
* setup parameters.
|
||||
|
|
|
@ -534,8 +534,8 @@ vc4_cl_lookup_bos(struct drm_device *dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
exec->bo = kcalloc(exec->bo_count, sizeof(struct drm_gem_cma_object *),
|
||||
GFP_KERNEL);
|
||||
exec->bo = drm_calloc_large(exec->bo_count,
|
||||
sizeof(struct drm_gem_cma_object *));
|
||||
if (!exec->bo) {
|
||||
DRM_ERROR("Failed to allocate validated BO pointers\n");
|
||||
return -ENOMEM;
|
||||
|
@ -572,8 +572,8 @@ vc4_cl_lookup_bos(struct drm_device *dev,
|
|||
spin_unlock(&file_priv->table_lock);
|
||||
|
||||
fail:
|
||||
kfree(handles);
|
||||
return 0;
|
||||
drm_free_large(handles);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -608,7 +608,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)
|
|||
* read the contents back for validation, and I think the
|
||||
* bo->vaddr is uncached access.
|
||||
*/
|
||||
temp = kmalloc(temp_size, GFP_KERNEL);
|
||||
temp = drm_malloc_ab(temp_size, 1);
|
||||
if (!temp) {
|
||||
DRM_ERROR("Failed to allocate storage for copying "
|
||||
"in bin/render CLs.\n");
|
||||
|
@ -675,7 +675,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)
|
|||
ret = vc4_validate_shader_recs(dev, exec);
|
||||
|
||||
fail:
|
||||
kfree(temp);
|
||||
drm_free_large(temp);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -688,7 +688,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)
|
|||
if (exec->bo) {
|
||||
for (i = 0; i < exec->bo_count; i++)
|
||||
drm_gem_object_unreference_unlocked(&exec->bo[i]->base);
|
||||
kfree(exec->bo);
|
||||
drm_free_large(exec->bo);
|
||||
}
|
||||
|
||||
while (!list_empty(&exec->unref_list)) {
|
||||
|
@ -942,8 +942,8 @@ vc4_gem_destroy(struct drm_device *dev)
|
|||
vc4->overflow_mem = NULL;
|
||||
}
|
||||
|
||||
vc4_bo_cache_destroy(dev);
|
||||
|
||||
if (vc4->hang_state)
|
||||
vc4_free_hang_state(dev, vc4->hang_state);
|
||||
|
||||
vc4_bo_cache_destroy(dev);
|
||||
}
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче