mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 16:50:54 +07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Filling in the padding slot in the bpf structure as a bug fix in 'ne' overlapped with actually using that padding area for something in 'net-next'. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
9c54aeb03a
@ -10,6 +10,7 @@ Required properties:
|
|||||||
"brcm,bcm53128"
|
"brcm,bcm53128"
|
||||||
"brcm,bcm5365"
|
"brcm,bcm5365"
|
||||||
"brcm,bcm5395"
|
"brcm,bcm5395"
|
||||||
|
"brcm,bcm5389"
|
||||||
"brcm,bcm5397"
|
"brcm,bcm5397"
|
||||||
"brcm,bcm5398"
|
"brcm,bcm5398"
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ Kernel driver i2c-ocores
|
|||||||
|
|
||||||
Supported adapters:
|
Supported adapters:
|
||||||
* OpenCores.org I2C controller by Richard Herveille (see datasheet link)
|
* OpenCores.org I2C controller by Richard Herveille (see datasheet link)
|
||||||
Datasheet: http://www.opencores.org/projects.cgi/web/i2c/overview
|
https://opencores.org/project/i2c/overview
|
||||||
|
|
||||||
Author: Peter Korsgaard <jacmet@sunsite.dk>
|
Author: Peter Korsgaard <jacmet@sunsite.dk>
|
||||||
|
|
||||||
|
@ -15554,6 +15554,14 @@ L: linux-kernel@vger.kernel.org
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/char/xillybus/
|
F: drivers/char/xillybus/
|
||||||
|
|
||||||
|
XLP9XX I2C DRIVER
|
||||||
|
M: George Cherian <george.cherian@cavium.com>
|
||||||
|
M: Jan Glauber <jglauber@cavium.com>
|
||||||
|
L: linux-i2c@vger.kernel.org
|
||||||
|
W: http://www.cavium.com
|
||||||
|
S: Supported
|
||||||
|
F: drivers/i2c/busses/i2c-xlp9xx.c
|
||||||
|
|
||||||
XRA1403 GPIO EXPANDER
|
XRA1403 GPIO EXPANDER
|
||||||
M: Nandor Han <nandor.han@ge.com>
|
M: Nandor Han <nandor.han@ge.com>
|
||||||
M: Semi Malinen <semi.malinen@ge.com>
|
M: Semi Malinen <semi.malinen@ge.com>
|
||||||
|
11
Makefile
11
Makefile
@ -2,7 +2,7 @@
|
|||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 17
|
PATCHLEVEL = 17
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc6
|
EXTRAVERSION = -rc7
|
||||||
NAME = Merciless Moray
|
NAME = Merciless Moray
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@ -500,6 +500,9 @@ RETPOLINE_CFLAGS_CLANG := -mretpoline-external-thunk
|
|||||||
RETPOLINE_CFLAGS := $(call cc-option,$(RETPOLINE_CFLAGS_GCC),$(call cc-option,$(RETPOLINE_CFLAGS_CLANG)))
|
RETPOLINE_CFLAGS := $(call cc-option,$(RETPOLINE_CFLAGS_GCC),$(call cc-option,$(RETPOLINE_CFLAGS_CLANG)))
|
||||||
export RETPOLINE_CFLAGS
|
export RETPOLINE_CFLAGS
|
||||||
|
|
||||||
|
KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
|
||||||
|
KBUILD_AFLAGS += $(call cc-option,-fno-PIE)
|
||||||
|
|
||||||
# check for 'asm goto'
|
# check for 'asm goto'
|
||||||
ifeq ($(call shell-cached,$(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLAGS)), y)
|
ifeq ($(call shell-cached,$(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLAGS)), y)
|
||||||
CC_HAVE_ASM_GOTO := 1
|
CC_HAVE_ASM_GOTO := 1
|
||||||
@ -621,9 +624,9 @@ endif # $(dot-config)
|
|||||||
# Defaults to vmlinux, but the arch makefile usually adds further targets
|
# Defaults to vmlinux, but the arch makefile usually adds further targets
|
||||||
all: vmlinux
|
all: vmlinux
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
|
CFLAGS_GCOV := -fprofile-arcs -ftest-coverage \
|
||||||
KBUILD_AFLAGS += $(call cc-option,-fno-PIE)
|
$(call cc-option,-fno-tree-loop-im) \
|
||||||
CFLAGS_GCOV := -fprofile-arcs -ftest-coverage -fno-tree-loop-im $(call cc-disable-warning,maybe-uninitialized,)
|
$(call cc-disable-warning,maybe-uninitialized,)
|
||||||
export CFLAGS_GCOV CFLAGS_KCOV
|
export CFLAGS_GCOV CFLAGS_KCOV
|
||||||
|
|
||||||
# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
|
# The arch Makefile can set ARCH_{CPP,A,C}FLAGS to override the default
|
||||||
|
@ -76,7 +76,7 @@ framebuffer-fe0-lcd0-hdmi {
|
|||||||
allwinner,pipeline = "de_fe0-de_be0-lcd0-hdmi";
|
allwinner,pipeline = "de_fe0-de_be0-lcd0-hdmi";
|
||||||
clocks = <&ccu CLK_AHB_LCD0>, <&ccu CLK_AHB_HDMI0>,
|
clocks = <&ccu CLK_AHB_LCD0>, <&ccu CLK_AHB_HDMI0>,
|
||||||
<&ccu CLK_AHB_DE_BE0>, <&ccu CLK_AHB_DE_FE0>,
|
<&ccu CLK_AHB_DE_BE0>, <&ccu CLK_AHB_DE_FE0>,
|
||||||
<&ccu CLK_DE_BE0>, <&ccu CLK_AHB_DE_FE0>,
|
<&ccu CLK_DE_BE0>, <&ccu CLK_DE_FE0>,
|
||||||
<&ccu CLK_TCON0_CH1>, <&ccu CLK_HDMI>,
|
<&ccu CLK_TCON0_CH1>, <&ccu CLK_HDMI>,
|
||||||
<&ccu CLK_DRAM_DE_FE0>, <&ccu CLK_DRAM_DE_BE0>;
|
<&ccu CLK_DRAM_DE_FE0>, <&ccu CLK_DRAM_DE_BE0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
@ -88,7 +88,7 @@ framebuffer-fe0-lcd0 {
|
|||||||
allwinner,pipeline = "de_fe0-de_be0-lcd0";
|
allwinner,pipeline = "de_fe0-de_be0-lcd0";
|
||||||
clocks = <&ccu CLK_AHB_LCD0>, <&ccu CLK_AHB_DE_BE0>,
|
clocks = <&ccu CLK_AHB_LCD0>, <&ccu CLK_AHB_DE_BE0>,
|
||||||
<&ccu CLK_AHB_DE_FE0>, <&ccu CLK_DE_BE0>,
|
<&ccu CLK_AHB_DE_FE0>, <&ccu CLK_DE_BE0>,
|
||||||
<&ccu CLK_AHB_DE_FE0>, <&ccu CLK_TCON0_CH0>,
|
<&ccu CLK_DE_FE0>, <&ccu CLK_TCON0_CH0>,
|
||||||
<&ccu CLK_DRAM_DE_FE0>, <&ccu CLK_DRAM_DE_BE0>;
|
<&ccu CLK_DRAM_DE_FE0>, <&ccu CLK_DRAM_DE_BE0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
@ -99,7 +99,7 @@ framebuffer-fe0-lcd0-tve0 {
|
|||||||
allwinner,pipeline = "de_fe0-de_be0-lcd0-tve0";
|
allwinner,pipeline = "de_fe0-de_be0-lcd0-tve0";
|
||||||
clocks = <&ccu CLK_AHB_TVE0>, <&ccu CLK_AHB_LCD0>,
|
clocks = <&ccu CLK_AHB_TVE0>, <&ccu CLK_AHB_LCD0>,
|
||||||
<&ccu CLK_AHB_DE_BE0>, <&ccu CLK_AHB_DE_FE0>,
|
<&ccu CLK_AHB_DE_BE0>, <&ccu CLK_AHB_DE_FE0>,
|
||||||
<&ccu CLK_DE_BE0>, <&ccu CLK_AHB_DE_FE0>,
|
<&ccu CLK_DE_BE0>, <&ccu CLK_DE_FE0>,
|
||||||
<&ccu CLK_TCON0_CH1>, <&ccu CLK_DRAM_TVE0>,
|
<&ccu CLK_TCON0_CH1>, <&ccu CLK_DRAM_TVE0>,
|
||||||
<&ccu CLK_DRAM_DE_FE0>, <&ccu CLK_DRAM_DE_BE0>;
|
<&ccu CLK_DRAM_DE_FE0>, <&ccu CLK_DRAM_DE_BE0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
@ -117,6 +117,7 @@ &emac {
|
|||||||
phy-handle = <&int_mii_phy>;
|
phy-handle = <&int_mii_phy>;
|
||||||
phy-mode = "mii";
|
phy-mode = "mii";
|
||||||
allwinner,leds-active-low;
|
allwinner,leds-active-low;
|
||||||
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
&hdmi {
|
&hdmi {
|
||||||
|
@ -51,7 +51,7 @@ / {
|
|||||||
|
|
||||||
leds {
|
leds {
|
||||||
/* The LEDs use PG0~2 pins, which conflict with MMC1 */
|
/* The LEDs use PG0~2 pins, which conflict with MMC1 */
|
||||||
status = "disbaled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -323,7 +323,7 @@ void __init ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr)
|
|||||||
|
|
||||||
/* All EP93xx devices use the same two GPIO pins for I2C bit-banging */
|
/* All EP93xx devices use the same two GPIO pins for I2C bit-banging */
|
||||||
static struct gpiod_lookup_table ep93xx_i2c_gpiod_table = {
|
static struct gpiod_lookup_table ep93xx_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.0",
|
||||||
.table = {
|
.table = {
|
||||||
/* Use local offsets on gpiochip/port "G" */
|
/* Use local offsets on gpiochip/port "G" */
|
||||||
GPIO_LOOKUP_IDX("G", 1, NULL, 0,
|
GPIO_LOOKUP_IDX("G", 1, NULL, 0,
|
||||||
|
@ -51,7 +51,7 @@ static struct platform_device avila_flash = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct gpiod_lookup_table avila_i2c_gpiod_table = {
|
static struct gpiod_lookup_table avila_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.0",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", AVILA_SDA_PIN,
|
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", AVILA_SDA_PIN,
|
||||||
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
|
@ -70,7 +70,7 @@ static struct platform_device dsmg600_flash = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct gpiod_lookup_table dsmg600_i2c_gpiod_table = {
|
static struct gpiod_lookup_table dsmg600_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.0",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", DSMG600_SDA_PIN,
|
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", DSMG600_SDA_PIN,
|
||||||
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
|
@ -56,7 +56,7 @@ static struct platform_device fsg_flash = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct gpiod_lookup_table fsg_i2c_gpiod_table = {
|
static struct gpiod_lookup_table fsg_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.0",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", FSG_SDA_PIN,
|
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", FSG_SDA_PIN,
|
||||||
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
|
@ -124,7 +124,7 @@ static struct platform_device ixdp425_flash_nand = {
|
|||||||
#endif /* CONFIG_MTD_NAND_PLATFORM */
|
#endif /* CONFIG_MTD_NAND_PLATFORM */
|
||||||
|
|
||||||
static struct gpiod_lookup_table ixdp425_i2c_gpiod_table = {
|
static struct gpiod_lookup_table ixdp425_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.0",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", IXDP425_SDA_PIN,
|
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", IXDP425_SDA_PIN,
|
||||||
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
|
@ -102,7 +102,7 @@ static struct platform_device nas100d_leds = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct gpiod_lookup_table nas100d_i2c_gpiod_table = {
|
static struct gpiod_lookup_table nas100d_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.0",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", NAS100D_SDA_PIN,
|
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", NAS100D_SDA_PIN,
|
||||||
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
|
@ -70,7 +70,7 @@ static struct platform_device nslu2_flash = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct gpiod_lookup_table nslu2_i2c_gpiod_table = {
|
static struct gpiod_lookup_table nslu2_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.0",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", NSLU2_SDA_PIN,
|
GPIO_LOOKUP_IDX("IXP4XX_GPIO_CHIP", NSLU2_SDA_PIN,
|
||||||
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
|
@ -322,7 +322,7 @@ static struct soc_camera_link palmz72_iclink = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct gpiod_lookup_table palmz72_i2c_gpiod_table = {
|
static struct gpiod_lookup_table palmz72_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.0",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP_IDX("gpio-pxa", 118, NULL, 0,
|
GPIO_LOOKUP_IDX("gpio-pxa", 118, NULL, 0,
|
||||||
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
|
@ -460,7 +460,7 @@ static struct platform_device smc91x_device = {
|
|||||||
|
|
||||||
/* i2c */
|
/* i2c */
|
||||||
static struct gpiod_lookup_table viper_i2c_gpiod_table = {
|
static struct gpiod_lookup_table viper_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.1",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP_IDX("gpio-pxa", VIPER_RTC_I2C_SDA_GPIO,
|
GPIO_LOOKUP_IDX("gpio-pxa", VIPER_RTC_I2C_SDA_GPIO,
|
||||||
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
@ -789,7 +789,7 @@ static int __init viper_tpm_setup(char *str)
|
|||||||
__setup("tpm=", viper_tpm_setup);
|
__setup("tpm=", viper_tpm_setup);
|
||||||
|
|
||||||
struct gpiod_lookup_table viper_tpm_i2c_gpiod_table = {
|
struct gpiod_lookup_table viper_tpm_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.2",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP_IDX("gpio-pxa", VIPER_TPM_I2C_SDA_GPIO,
|
GPIO_LOOKUP_IDX("gpio-pxa", VIPER_TPM_I2C_SDA_GPIO,
|
||||||
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
NULL, 0, GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
|
@ -327,7 +327,7 @@ static struct platform_device simpad_gpio_leds = {
|
|||||||
* i2c
|
* i2c
|
||||||
*/
|
*/
|
||||||
static struct gpiod_lookup_table simpad_i2c_gpiod_table = {
|
static struct gpiod_lookup_table simpad_i2c_gpiod_table = {
|
||||||
.dev_id = "i2c-gpio",
|
.dev_id = "i2c-gpio.0",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP_IDX("gpio", 21, NULL, 0,
|
GPIO_LOOKUP_IDX("gpio", 21, NULL, 0,
|
||||||
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
|
@ -299,7 +299,6 @@ gpio15: gpio@f702b000 {
|
|||||||
/* GPIO blocks 16 thru 19 do not appear to be routed to pins */
|
/* GPIO blocks 16 thru 19 do not appear to be routed to pins */
|
||||||
|
|
||||||
dwmmc_0: dwmmc0@f723d000 {
|
dwmmc_0: dwmmc0@f723d000 {
|
||||||
max-frequency = <150000000>;
|
|
||||||
cap-mmc-highspeed;
|
cap-mmc-highspeed;
|
||||||
mmc-hs200-1_8v;
|
mmc-hs200-1_8v;
|
||||||
non-removable;
|
non-removable;
|
||||||
|
@ -721,6 +721,10 @@ int mips_set_process_fp_mode(struct task_struct *task, unsigned int value)
|
|||||||
if (value & ~known_bits)
|
if (value & ~known_bits)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
/* Setting FRE without FR is not supported. */
|
||||||
|
if ((value & (PR_FP_MODE_FR | PR_FP_MODE_FRE)) == PR_FP_MODE_FRE)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
/* Avoid inadvertently triggering emulation */
|
/* Avoid inadvertently triggering emulation */
|
||||||
if ((value & PR_FP_MODE_FR) && raw_cpu_has_fpu &&
|
if ((value & PR_FP_MODE_FR) && raw_cpu_has_fpu &&
|
||||||
!(raw_current_cpu_data.fpu_id & MIPS_FPIR_F64))
|
!(raw_current_cpu_data.fpu_id & MIPS_FPIR_F64))
|
||||||
|
@ -818,7 +818,7 @@ long arch_ptrace(struct task_struct *child, long request,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
tmp = get_fpr32(&fregs[addr - FPR_BASE], 0);
|
tmp = get_fpr64(&fregs[addr - FPR_BASE], 0);
|
||||||
break;
|
break;
|
||||||
case PC:
|
case PC:
|
||||||
tmp = regs->cp0_epc;
|
tmp = regs->cp0_epc;
|
||||||
|
@ -109,7 +109,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
|
|||||||
addr & 1);
|
addr & 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tmp = get_fpr32(&fregs[addr - FPR_BASE], 0);
|
tmp = get_fpr64(&fregs[addr - FPR_BASE], 0);
|
||||||
break;
|
break;
|
||||||
case PC:
|
case PC:
|
||||||
tmp = regs->cp0_epc;
|
tmp = regs->cp0_epc;
|
||||||
|
@ -9,6 +9,12 @@ config NDS32
|
|||||||
select CLKSRC_MMIO
|
select CLKSRC_MMIO
|
||||||
select CLONE_BACKWARDS
|
select CLONE_BACKWARDS
|
||||||
select COMMON_CLK
|
select COMMON_CLK
|
||||||
|
select GENERIC_ASHLDI3
|
||||||
|
select GENERIC_ASHRDI3
|
||||||
|
select GENERIC_LSHRDI3
|
||||||
|
select GENERIC_CMPDI2
|
||||||
|
select GENERIC_MULDI3
|
||||||
|
select GENERIC_UCMPDI2
|
||||||
select GENERIC_ATOMIC64
|
select GENERIC_ATOMIC64
|
||||||
select GENERIC_CPU_DEVICES
|
select GENERIC_CPU_DEVICES
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
@ -82,6 +88,7 @@ endmenu
|
|||||||
|
|
||||||
menu "Kernel Features"
|
menu "Kernel Features"
|
||||||
source "kernel/Kconfig.preempt"
|
source "kernel/Kconfig.preempt"
|
||||||
|
source "kernel/Kconfig.freezer"
|
||||||
source "mm/Kconfig"
|
source "mm/Kconfig"
|
||||||
source "kernel/Kconfig.hz"
|
source "kernel/Kconfig.hz"
|
||||||
endmenu
|
endmenu
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
comment "Processor Features"
|
comment "Processor Features"
|
||||||
|
|
||||||
config CPU_BIG_ENDIAN
|
config CPU_BIG_ENDIAN
|
||||||
bool "Big endian"
|
def_bool !CPU_LITTLE_ENDIAN
|
||||||
|
|
||||||
config CPU_LITTLE_ENDIAN
|
config CPU_LITTLE_ENDIAN
|
||||||
def_bool !CPU_BIG_ENDIAN
|
bool "Little endian"
|
||||||
|
default y
|
||||||
|
|
||||||
config HWZOL
|
config HWZOL
|
||||||
bool "hardware zero overhead loop support"
|
bool "hardware zero overhead loop support"
|
||||||
|
@ -23,9 +23,6 @@ export TEXTADDR
|
|||||||
# If we have a machine-specific directory, then include it in the build.
|
# If we have a machine-specific directory, then include it in the build.
|
||||||
core-y += arch/nds32/kernel/ arch/nds32/mm/
|
core-y += arch/nds32/kernel/ arch/nds32/mm/
|
||||||
libs-y += arch/nds32/lib/
|
libs-y += arch/nds32/lib/
|
||||||
LIBGCC_PATH := \
|
|
||||||
$(shell $(CC) $(KBUILD_CFLAGS) $(KCFLAGS) -print-libgcc-file-name)
|
|
||||||
libs-y += $(LIBGCC_PATH)
|
|
||||||
|
|
||||||
ifneq '$(CONFIG_NDS32_BUILTIN_DTB)' '""'
|
ifneq '$(CONFIG_NDS32_BUILTIN_DTB)' '""'
|
||||||
BUILTIN_DTB := y
|
BUILTIN_DTB := y
|
||||||
@ -35,8 +32,12 @@ endif
|
|||||||
|
|
||||||
ifdef CONFIG_CPU_LITTLE_ENDIAN
|
ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||||
KBUILD_CFLAGS += $(call cc-option, -EL)
|
KBUILD_CFLAGS += $(call cc-option, -EL)
|
||||||
|
KBUILD_AFLAGS += $(call cc-option, -EL)
|
||||||
|
LDFLAGS += $(call cc-option, -EL)
|
||||||
else
|
else
|
||||||
KBUILD_CFLAGS += $(call cc-option, -EB)
|
KBUILD_CFLAGS += $(call cc-option, -EB)
|
||||||
|
KBUILD_AFLAGS += $(call cc-option, -EB)
|
||||||
|
LDFLAGS += $(call cc-option, -EB)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
boot := arch/nds32/boot
|
boot := arch/nds32/boot
|
||||||
|
@ -16,6 +16,7 @@ generic-y += dma.h
|
|||||||
generic-y += emergency-restart.h
|
generic-y += emergency-restart.h
|
||||||
generic-y += errno.h
|
generic-y += errno.h
|
||||||
generic-y += exec.h
|
generic-y += exec.h
|
||||||
|
generic-y += export.h
|
||||||
generic-y += fb.h
|
generic-y += fb.h
|
||||||
generic-y += fcntl.h
|
generic-y += fcntl.h
|
||||||
generic-y += ftrace.h
|
generic-y += ftrace.h
|
||||||
@ -49,6 +50,7 @@ generic-y += switch_to.h
|
|||||||
generic-y += timex.h
|
generic-y += timex.h
|
||||||
generic-y += topology.h
|
generic-y += topology.h
|
||||||
generic-y += trace_clock.h
|
generic-y += trace_clock.h
|
||||||
|
generic-y += xor.h
|
||||||
generic-y += unaligned.h
|
generic-y += unaligned.h
|
||||||
generic-y += user.h
|
generic-y += user.h
|
||||||
generic-y += vga.h
|
generic-y += vga.h
|
||||||
|
@ -336,7 +336,7 @@
|
|||||||
#define INT_MASK_mskIDIVZE ( 0x1 << INT_MASK_offIDIVZE )
|
#define INT_MASK_mskIDIVZE ( 0x1 << INT_MASK_offIDIVZE )
|
||||||
#define INT_MASK_mskDSSIM ( 0x1 << INT_MASK_offDSSIM )
|
#define INT_MASK_mskDSSIM ( 0x1 << INT_MASK_offDSSIM )
|
||||||
|
|
||||||
#define INT_MASK_INITAIAL_VAL 0x10003
|
#define INT_MASK_INITAIAL_VAL (INT_MASK_mskDSSIM|INT_MASK_mskIDIVZE)
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* ir15: INT_PEND (Interrupt Pending Register)
|
* ir15: INT_PEND (Interrupt Pending Register)
|
||||||
@ -396,6 +396,7 @@
|
|||||||
#define MMU_CTL_D8KB 1
|
#define MMU_CTL_D8KB 1
|
||||||
#define MMU_CTL_UNA ( 0x1 << MMU_CTL_offUNA )
|
#define MMU_CTL_UNA ( 0x1 << MMU_CTL_offUNA )
|
||||||
|
|
||||||
|
#define MMU_CTL_CACHEABLE_NON 0
|
||||||
#define MMU_CTL_CACHEABLE_WB 2
|
#define MMU_CTL_CACHEABLE_WB 2
|
||||||
#define MMU_CTL_CACHEABLE_WT 3
|
#define MMU_CTL_CACHEABLE_WT 3
|
||||||
|
|
||||||
|
@ -32,6 +32,8 @@ void flush_anon_page(struct vm_area_struct *vma,
|
|||||||
|
|
||||||
#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
|
#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
|
||||||
void flush_kernel_dcache_page(struct page *page);
|
void flush_kernel_dcache_page(struct page *page);
|
||||||
|
void flush_kernel_vmap_range(void *addr, int size);
|
||||||
|
void invalidate_kernel_vmap_range(void *addr, int size);
|
||||||
void flush_icache_range(unsigned long start, unsigned long end);
|
void flush_icache_range(unsigned long start, unsigned long end);
|
||||||
void flush_icache_page(struct vm_area_struct *vma, struct page *page);
|
void flush_icache_page(struct vm_area_struct *vma, struct page *page);
|
||||||
#define flush_dcache_mmap_lock(mapping) xa_lock_irq(&(mapping)->i_pages)
|
#define flush_dcache_mmap_lock(mapping) xa_lock_irq(&(mapping)->i_pages)
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
#ifndef __ASM_NDS32_IO_H
|
#ifndef __ASM_NDS32_IO_H
|
||||||
#define __ASM_NDS32_IO_H
|
#define __ASM_NDS32_IO_H
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
extern void iounmap(volatile void __iomem *addr);
|
extern void iounmap(volatile void __iomem *addr);
|
||||||
#define __raw_writeb __raw_writeb
|
#define __raw_writeb __raw_writeb
|
||||||
static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
|
static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
|
||||||
|
@ -27,6 +27,9 @@ extern void copy_user_highpage(struct page *to, struct page *from,
|
|||||||
unsigned long vaddr, struct vm_area_struct *vma);
|
unsigned long vaddr, struct vm_area_struct *vma);
|
||||||
extern void clear_user_highpage(struct page *page, unsigned long vaddr);
|
extern void clear_user_highpage(struct page *page, unsigned long vaddr);
|
||||||
|
|
||||||
|
void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
||||||
|
struct page *to);
|
||||||
|
void clear_user_page(void *addr, unsigned long vaddr, struct page *page);
|
||||||
#define __HAVE_ARCH_COPY_USER_HIGHPAGE
|
#define __HAVE_ARCH_COPY_USER_HIGHPAGE
|
||||||
#define clear_user_highpage clear_user_highpage
|
#define clear_user_highpage clear_user_highpage
|
||||||
#else
|
#else
|
||||||
|
@ -152,6 +152,7 @@ extern void __pgd_error(const char *file, int line, unsigned long val);
|
|||||||
#define PAGE_CACHE_L1 __pgprot(_HAVE_PAGE_L | _PAGE_V | _PAGE_M_KRW | _PAGE_D | _PAGE_E | _PAGE_G | _PAGE_CACHE)
|
#define PAGE_CACHE_L1 __pgprot(_HAVE_PAGE_L | _PAGE_V | _PAGE_M_KRW | _PAGE_D | _PAGE_E | _PAGE_G | _PAGE_CACHE)
|
||||||
#define PAGE_MEMORY __pgprot(_HAVE_PAGE_L | _PAGE_V | _PAGE_M_KRW | _PAGE_D | _PAGE_E | _PAGE_G | _PAGE_CACHE_SHRD)
|
#define PAGE_MEMORY __pgprot(_HAVE_PAGE_L | _PAGE_V | _PAGE_M_KRW | _PAGE_D | _PAGE_E | _PAGE_G | _PAGE_CACHE_SHRD)
|
||||||
#define PAGE_KERNEL __pgprot(_PAGE_V | _PAGE_M_KRW | _PAGE_D | _PAGE_E | _PAGE_G | _PAGE_CACHE_SHRD)
|
#define PAGE_KERNEL __pgprot(_PAGE_V | _PAGE_M_KRW | _PAGE_D | _PAGE_E | _PAGE_G | _PAGE_CACHE_SHRD)
|
||||||
|
#define PAGE_SHARED __pgprot(_PAGE_V | _PAGE_M_URW_KRW | _PAGE_D | _PAGE_CACHE_SHRD)
|
||||||
#define PAGE_DEVICE __pgprot(_PAGE_V | _PAGE_M_KRW | _PAGE_D | _PAGE_G | _PAGE_C_DEV)
|
#define PAGE_DEVICE __pgprot(_PAGE_V | _PAGE_M_KRW | _PAGE_D | _PAGE_G | _PAGE_C_DEV)
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ common_exception_handler:
|
|||||||
/* interrupt */
|
/* interrupt */
|
||||||
2:
|
2:
|
||||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||||
jal arch_trace_hardirqs_off
|
jal trace_hardirqs_off
|
||||||
#endif
|
#endif
|
||||||
move $r0, $sp
|
move $r0, $sp
|
||||||
sethi $lp, hi20(ret_from_intr)
|
sethi $lp, hi20(ret_from_intr)
|
||||||
|
@ -57,14 +57,32 @@ _nodtb:
|
|||||||
isb
|
isb
|
||||||
mtsr $r4, $L1_PPTB ! load page table pointer\n"
|
mtsr $r4, $L1_PPTB ! load page table pointer\n"
|
||||||
|
|
||||||
/* set NTC0 cacheable/writeback, mutliple page size in use */
|
#ifdef CONFIG_CPU_DCACHE_DISABLE
|
||||||
mfsr $r3, $MMU_CTL
|
#define MMU_CTL_NTCC MMU_CTL_CACHEABLE_NON
|
||||||
li $r0, #~MMU_CTL_mskNTC0
|
|
||||||
and $r3, $r3, $r0
|
|
||||||
#ifdef CONFIG_ANDES_PAGE_SIZE_4KB
|
|
||||||
ori $r3, $r3, #(MMU_CTL_mskMPZIU|(MMU_CTL_CACHEABLE_WB << MMU_CTL_offNTC0))
|
|
||||||
#else
|
#else
|
||||||
ori $r3, $r3, #(MMU_CTL_mskMPZIU|(MMU_CTL_CACHEABLE_WB << MMU_CTL_offNTC0)|MMU_CTL_D8KB)
|
#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||||
|
#define MMU_CTL_NTCC MMU_CTL_CACHEABLE_WT
|
||||||
|
#else
|
||||||
|
#define MMU_CTL_NTCC MMU_CTL_CACHEABLE_WB
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* set NTC cacheability, mutliple page size in use */
|
||||||
|
mfsr $r3, $MMU_CTL
|
||||||
|
#if CONFIG_MEMORY_START >= 0xc0000000
|
||||||
|
ori $r3, $r3, (MMU_CTL_NTCC << MMU_CTL_offNTC3)
|
||||||
|
#elif CONFIG_MEMORY_START >= 0x80000000
|
||||||
|
ori $r3, $r3, (MMU_CTL_NTCC << MMU_CTL_offNTC2)
|
||||||
|
#elif CONFIG_MEMORY_START >= 0x40000000
|
||||||
|
ori $r3, $r3, (MMU_CTL_NTCC << MMU_CTL_offNTC1)
|
||||||
|
#else
|
||||||
|
ori $r3, $r3, (MMU_CTL_NTCC << MMU_CTL_offNTC0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_ANDES_PAGE_SIZE_4KB
|
||||||
|
ori $r3, $r3, #(MMU_CTL_mskMPZIU)
|
||||||
|
#else
|
||||||
|
ori $r3, $r3, #(MMU_CTL_mskMPZIU|MMU_CTL_D8KB)
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_HW_SUPPORT_UNALIGNMENT_ACCESS
|
#ifdef CONFIG_HW_SUPPORT_UNALIGNMENT_ACCESS
|
||||||
li $r0, #MMU_CTL_UNA
|
li $r0, #MMU_CTL_UNA
|
||||||
|
@ -293,6 +293,9 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
/* paging_init() sets up the MMU and marks all pages as reserved */
|
/* paging_init() sets up the MMU and marks all pages as reserved */
|
||||||
paging_init();
|
paging_init();
|
||||||
|
|
||||||
|
/* invalidate all TLB entries because the new mapping is created */
|
||||||
|
__nds32__tlbop_flua();
|
||||||
|
|
||||||
/* use generic way to parse */
|
/* use generic way to parse */
|
||||||
parse_early_param();
|
parse_early_param();
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ void save_stack_trace(struct stack_trace *trace)
|
|||||||
{
|
{
|
||||||
save_stack_trace_tsk(current, trace);
|
save_stack_trace_tsk(current, trace);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(save_stack_trace);
|
||||||
|
|
||||||
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||||
{
|
{
|
||||||
@ -45,3 +46,4 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
|||||||
fpn = (unsigned long *)fpp;
|
fpn = (unsigned long *)fpp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#include <asm/vdso_timer_info.h>
|
#include <asm/vdso_timer_info.h>
|
||||||
#include <asm/cache_info.h>
|
#include <asm/cache_info.h>
|
||||||
extern struct cache_info L1_cache_info[2];
|
extern struct cache_info L1_cache_info[2];
|
||||||
extern char vdso_start, vdso_end;
|
extern char vdso_start[], vdso_end[];
|
||||||
static unsigned long vdso_pages __ro_after_init;
|
static unsigned long vdso_pages __ro_after_init;
|
||||||
static unsigned long timer_mapping_base;
|
static unsigned long timer_mapping_base;
|
||||||
|
|
||||||
@ -66,16 +66,16 @@ static int __init vdso_init(void)
|
|||||||
int i;
|
int i;
|
||||||
struct page **vdso_pagelist;
|
struct page **vdso_pagelist;
|
||||||
|
|
||||||
if (memcmp(&vdso_start, "\177ELF", 4)) {
|
if (memcmp(vdso_start, "\177ELF", 4)) {
|
||||||
pr_err("vDSO is not a valid ELF object!\n");
|
pr_err("vDSO is not a valid ELF object!\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
/* Creat a timer io mapping to get clock cycles counter */
|
/* Creat a timer io mapping to get clock cycles counter */
|
||||||
get_timer_node_info();
|
get_timer_node_info();
|
||||||
|
|
||||||
vdso_pages = (&vdso_end - &vdso_start) >> PAGE_SHIFT;
|
vdso_pages = (vdso_end - vdso_start) >> PAGE_SHIFT;
|
||||||
pr_info("vdso: %ld pages (%ld code @ %p, %ld data @ %p)\n",
|
pr_info("vdso: %ld pages (%ld code @ %p, %ld data @ %p)\n",
|
||||||
vdso_pages + 1, vdso_pages, &vdso_start, 1L, vdso_data);
|
vdso_pages + 1, vdso_pages, vdso_start, 1L, vdso_data);
|
||||||
|
|
||||||
/* Allocate the vDSO pagelist */
|
/* Allocate the vDSO pagelist */
|
||||||
vdso_pagelist = kcalloc(vdso_pages, sizeof(struct page *), GFP_KERNEL);
|
vdso_pagelist = kcalloc(vdso_pages, sizeof(struct page *), GFP_KERNEL);
|
||||||
@ -83,7 +83,7 @@ static int __init vdso_init(void)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
for (i = 0; i < vdso_pages; i++)
|
for (i = 0; i < vdso_pages; i++)
|
||||||
vdso_pagelist[i] = virt_to_page(&vdso_start + i * PAGE_SIZE);
|
vdso_pagelist[i] = virt_to_page(vdso_start + i * PAGE_SIZE);
|
||||||
vdso_spec[1].pages = &vdso_pagelist[0];
|
vdso_spec[1].pages = &vdso_pagelist[0];
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// Copyright (C) 2005-2017 Andes Technology Corporation
|
// Copyright (C) 2005-2017 Andes Technology Corporation
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
#include <asm/export.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
|
||||||
.text
|
.text
|
||||||
@ -16,6 +17,7 @@ ENTRY(copy_page)
|
|||||||
popm $r2, $r10
|
popm $r2, $r10
|
||||||
ret
|
ret
|
||||||
ENDPROC(copy_page)
|
ENDPROC(copy_page)
|
||||||
|
EXPORT_SYMBOL(copy_page)
|
||||||
|
|
||||||
ENTRY(clear_page)
|
ENTRY(clear_page)
|
||||||
pushm $r1, $r9
|
pushm $r1, $r9
|
||||||
@ -35,3 +37,4 @@ ENTRY(clear_page)
|
|||||||
popm $r1, $r9
|
popm $r1, $r9
|
||||||
ret
|
ret
|
||||||
ENDPROC(clear_page)
|
ENDPROC(clear_page)
|
||||||
|
EXPORT_SYMBOL(clear_page)
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#define RA(inst) (((inst) >> 15) & 0x1FUL)
|
#define RA(inst) (((inst) >> 15) & 0x1FUL)
|
||||||
#define RB(inst) (((inst) >> 10) & 0x1FUL)
|
#define RB(inst) (((inst) >> 10) & 0x1FUL)
|
||||||
#define SV(inst) (((inst) >> 8) & 0x3UL)
|
#define SV(inst) (((inst) >> 8) & 0x3UL)
|
||||||
#define IMM(inst) (((inst) >> 0) & 0x3FFFUL)
|
#define IMM(inst) (((inst) >> 0) & 0x7FFFUL)
|
||||||
|
|
||||||
#define RA3(inst) (((inst) >> 3) & 0x7UL)
|
#define RA3(inst) (((inst) >> 3) & 0x7UL)
|
||||||
#define RT3(inst) (((inst) >> 6) & 0x7UL)
|
#define RT3(inst) (((inst) >> 6) & 0x7UL)
|
||||||
@ -28,6 +28,9 @@
|
|||||||
#define RA5(inst) (((inst) >> 0) & 0x1FUL)
|
#define RA5(inst) (((inst) >> 0) & 0x1FUL)
|
||||||
#define RT4(inst) (((inst) >> 5) & 0xFUL)
|
#define RT4(inst) (((inst) >> 5) & 0xFUL)
|
||||||
|
|
||||||
|
#define GET_IMMSVAL(imm_value) \
|
||||||
|
(((imm_value >> 14) & 0x1) ? (imm_value - 0x8000) : imm_value)
|
||||||
|
|
||||||
#define __get8_data(val,addr,err) \
|
#define __get8_data(val,addr,err) \
|
||||||
__asm__( \
|
__asm__( \
|
||||||
"1: lbi.bi %1, [%2], #1\n" \
|
"1: lbi.bi %1, [%2], #1\n" \
|
||||||
@ -467,7 +470,7 @@ static inline int do_32(unsigned long inst, struct pt_regs *regs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (imm)
|
if (imm)
|
||||||
shift = IMM(inst) * len;
|
shift = GET_IMMSVAL(IMM(inst)) * len;
|
||||||
else
|
else
|
||||||
shift = *idx_to_addr(regs, RB(inst)) << SV(inst);
|
shift = *idx_to_addr(regs, RB(inst)) << SV(inst);
|
||||||
|
|
||||||
@ -552,7 +555,7 @@ static struct ctl_table alignment_tbl[3] = {
|
|||||||
|
|
||||||
static struct ctl_table nds32_sysctl_table[2] = {
|
static struct ctl_table nds32_sysctl_table[2] = {
|
||||||
{
|
{
|
||||||
.procname = "unaligned_acess",
|
.procname = "unaligned_access",
|
||||||
.mode = 0555,
|
.mode = 0555,
|
||||||
.child = alignment_tbl},
|
.child = alignment_tbl},
|
||||||
{}
|
{}
|
||||||
|
@ -147,6 +147,25 @@ void flush_cache_vunmap(unsigned long start, unsigned long end)
|
|||||||
cpu_icache_inval_all();
|
cpu_icache_inval_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
||||||
|
struct page *to)
|
||||||
|
{
|
||||||
|
cpu_dcache_wbinval_page((unsigned long)vaddr);
|
||||||
|
cpu_icache_inval_page((unsigned long)vaddr);
|
||||||
|
copy_page(vto, vfrom);
|
||||||
|
cpu_dcache_wbinval_page((unsigned long)vto);
|
||||||
|
cpu_icache_inval_page((unsigned long)vto);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_user_page(void *addr, unsigned long vaddr, struct page *page)
|
||||||
|
{
|
||||||
|
cpu_dcache_wbinval_page((unsigned long)vaddr);
|
||||||
|
cpu_icache_inval_page((unsigned long)vaddr);
|
||||||
|
clear_page(addr);
|
||||||
|
cpu_dcache_wbinval_page((unsigned long)addr);
|
||||||
|
cpu_icache_inval_page((unsigned long)addr);
|
||||||
|
}
|
||||||
|
|
||||||
void copy_user_highpage(struct page *to, struct page *from,
|
void copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long vaddr, struct vm_area_struct *vma)
|
unsigned long vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
@ -156,11 +175,9 @@ void copy_user_highpage(struct page *to, struct page *from,
|
|||||||
pto = page_to_phys(to);
|
pto = page_to_phys(to);
|
||||||
pfrom = page_to_phys(from);
|
pfrom = page_to_phys(from);
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
if (aliasing(vaddr, (unsigned long)kfrom))
|
if (aliasing(vaddr, (unsigned long)kfrom))
|
||||||
cpu_dcache_wb_page((unsigned long)kfrom);
|
cpu_dcache_wb_page((unsigned long)kfrom);
|
||||||
if (aliasing(vaddr, (unsigned long)kto))
|
|
||||||
cpu_dcache_inval_page((unsigned long)kto);
|
|
||||||
local_irq_save(flags);
|
|
||||||
vto = kremap0(vaddr, pto);
|
vto = kremap0(vaddr, pto);
|
||||||
vfrom = kremap1(vaddr, pfrom);
|
vfrom = kremap1(vaddr, pfrom);
|
||||||
copy_page((void *)vto, (void *)vfrom);
|
copy_page((void *)vto, (void *)vfrom);
|
||||||
@ -198,21 +215,25 @@ void flush_dcache_page(struct page *page)
|
|||||||
if (mapping && !mapping_mapped(mapping))
|
if (mapping && !mapping_mapped(mapping))
|
||||||
set_bit(PG_dcache_dirty, &page->flags);
|
set_bit(PG_dcache_dirty, &page->flags);
|
||||||
else {
|
else {
|
||||||
int i, pc;
|
unsigned long kaddr, flags;
|
||||||
unsigned long vto, kaddr, flags;
|
|
||||||
kaddr = (unsigned long)page_address(page);
|
kaddr = (unsigned long)page_address(page);
|
||||||
cpu_dcache_wbinval_page(kaddr);
|
|
||||||
pc = CACHE_SET(DCACHE) * CACHE_LINE_SIZE(DCACHE) / PAGE_SIZE;
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
for (i = 0; i < pc; i++) {
|
cpu_dcache_wbinval_page(kaddr);
|
||||||
vto =
|
if (mapping) {
|
||||||
kremap0(kaddr + i * PAGE_SIZE, page_to_phys(page));
|
unsigned long vaddr, kto;
|
||||||
cpu_dcache_wbinval_page(vto);
|
|
||||||
kunmap01(vto);
|
vaddr = page->index << PAGE_SHIFT;
|
||||||
|
if (aliasing(vaddr, kaddr)) {
|
||||||
|
kto = kremap0(vaddr, page_to_phys(page));
|
||||||
|
cpu_dcache_wbinval_page(kto);
|
||||||
|
kunmap01(kto);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(flush_dcache_page);
|
||||||
|
|
||||||
void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
|
void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
|
||||||
unsigned long vaddr, void *dst, void *src, int len)
|
unsigned long vaddr, void *dst, void *src, int len)
|
||||||
@ -251,7 +272,7 @@ void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
|
|||||||
void flush_anon_page(struct vm_area_struct *vma,
|
void flush_anon_page(struct vm_area_struct *vma,
|
||||||
struct page *page, unsigned long vaddr)
|
struct page *page, unsigned long vaddr)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long kaddr, flags, ktmp;
|
||||||
if (!PageAnon(page))
|
if (!PageAnon(page))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -261,7 +282,12 @@ void flush_anon_page(struct vm_area_struct *vma,
|
|||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
if (vma->vm_flags & VM_EXEC)
|
if (vma->vm_flags & VM_EXEC)
|
||||||
cpu_icache_inval_page(vaddr & PAGE_MASK);
|
cpu_icache_inval_page(vaddr & PAGE_MASK);
|
||||||
cpu_dcache_wbinval_page((unsigned long)page_address(page));
|
kaddr = (unsigned long)page_address(page);
|
||||||
|
if (aliasing(vaddr, kaddr)) {
|
||||||
|
ktmp = kremap0(vaddr, page_to_phys(page));
|
||||||
|
cpu_dcache_wbinval_page(ktmp);
|
||||||
|
kunmap01(ktmp);
|
||||||
|
}
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,6 +298,25 @@ void flush_kernel_dcache_page(struct page *page)
|
|||||||
cpu_dcache_wbinval_page((unsigned long)page_address(page));
|
cpu_dcache_wbinval_page((unsigned long)page_address(page));
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(flush_kernel_dcache_page);
|
||||||
|
|
||||||
|
void flush_kernel_vmap_range(void *addr, int size)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
local_irq_save(flags);
|
||||||
|
cpu_dcache_wb_range((unsigned long)addr, (unsigned long)addr + size);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(flush_kernel_vmap_range);
|
||||||
|
|
||||||
|
void invalidate_kernel_vmap_range(void *addr, int size)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
local_irq_save(flags);
|
||||||
|
cpu_dcache_inval_range((unsigned long)addr, (unsigned long)addr + size);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(invalidate_kernel_vmap_range);
|
||||||
|
|
||||||
void flush_icache_range(unsigned long start, unsigned long end)
|
void flush_icache_range(unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
@ -283,6 +328,7 @@ void flush_icache_range(unsigned long start, unsigned long end)
|
|||||||
cpu_cache_wbinval_range(start, end, 1);
|
cpu_cache_wbinval_range(start, end, 1);
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(flush_icache_range);
|
||||||
|
|
||||||
void flush_icache_page(struct vm_area_struct *vma, struct page *page)
|
void flush_icache_page(struct vm_area_struct *vma, struct page *page)
|
||||||
{
|
{
|
||||||
|
@ -30,6 +30,7 @@ extern unsigned long phys_initrd_size;
|
|||||||
* zero-initialized data and COW.
|
* zero-initialized data and COW.
|
||||||
*/
|
*/
|
||||||
struct page *empty_zero_page;
|
struct page *empty_zero_page;
|
||||||
|
EXPORT_SYMBOL(empty_zero_page);
|
||||||
|
|
||||||
static void __init zone_sizes_init(void)
|
static void __init zone_sizes_init(void)
|
||||||
{
|
{
|
||||||
|
@ -96,6 +96,7 @@ struct kvmppc_vcore {
|
|||||||
struct kvm_vcpu *runner;
|
struct kvm_vcpu *runner;
|
||||||
struct kvm *kvm;
|
struct kvm *kvm;
|
||||||
u64 tb_offset; /* guest timebase - host timebase */
|
u64 tb_offset; /* guest timebase - host timebase */
|
||||||
|
u64 tb_offset_applied; /* timebase offset currently in force */
|
||||||
ulong lpcr;
|
ulong lpcr;
|
||||||
u32 arch_compat;
|
u32 arch_compat;
|
||||||
ulong pcr;
|
ulong pcr;
|
||||||
|
@ -562,6 +562,7 @@ int main(void)
|
|||||||
OFFSET(VCORE_NAPPING_THREADS, kvmppc_vcore, napping_threads);
|
OFFSET(VCORE_NAPPING_THREADS, kvmppc_vcore, napping_threads);
|
||||||
OFFSET(VCORE_KVM, kvmppc_vcore, kvm);
|
OFFSET(VCORE_KVM, kvmppc_vcore, kvm);
|
||||||
OFFSET(VCORE_TB_OFFSET, kvmppc_vcore, tb_offset);
|
OFFSET(VCORE_TB_OFFSET, kvmppc_vcore, tb_offset);
|
||||||
|
OFFSET(VCORE_TB_OFFSET_APPL, kvmppc_vcore, tb_offset_applied);
|
||||||
OFFSET(VCORE_LPCR, kvmppc_vcore, lpcr);
|
OFFSET(VCORE_LPCR, kvmppc_vcore, lpcr);
|
||||||
OFFSET(VCORE_PCR, kvmppc_vcore, pcr);
|
OFFSET(VCORE_PCR, kvmppc_vcore, pcr);
|
||||||
OFFSET(VCORE_DPDES, kvmppc_vcore, dpdes);
|
OFFSET(VCORE_DPDES, kvmppc_vcore, dpdes);
|
||||||
|
@ -162,7 +162,7 @@ static void kvmppc_radix_tlbie_page(struct kvm *kvm, unsigned long addr,
|
|||||||
if (cpu_has_feature(CPU_FTR_P9_TLBIE_BUG))
|
if (cpu_has_feature(CPU_FTR_P9_TLBIE_BUG))
|
||||||
asm volatile(PPC_TLBIE_5(%0, %1, 0, 0, 1)
|
asm volatile(PPC_TLBIE_5(%0, %1, 0, 0, 1)
|
||||||
: : "r" (addr), "r" (kvm->arch.lpid) : "memory");
|
: : "r" (addr), "r" (kvm->arch.lpid) : "memory");
|
||||||
asm volatile("ptesync": : :"memory");
|
asm volatile("eieio ; tlbsync ; ptesync": : :"memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void kvmppc_radix_flush_pwc(struct kvm *kvm, unsigned long addr)
|
static void kvmppc_radix_flush_pwc(struct kvm *kvm, unsigned long addr)
|
||||||
@ -173,7 +173,7 @@ static void kvmppc_radix_flush_pwc(struct kvm *kvm, unsigned long addr)
|
|||||||
/* RIC=1 PRS=0 R=1 IS=2 */
|
/* RIC=1 PRS=0 R=1 IS=2 */
|
||||||
asm volatile(PPC_TLBIE_5(%0, %1, 1, 0, 1)
|
asm volatile(PPC_TLBIE_5(%0, %1, 1, 0, 1)
|
||||||
: : "r" (rb), "r" (kvm->arch.lpid) : "memory");
|
: : "r" (rb), "r" (kvm->arch.lpid) : "memory");
|
||||||
asm volatile("ptesync": : :"memory");
|
asm volatile("eieio ; tlbsync ; ptesync": : :"memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long kvmppc_radix_update_pte(struct kvm *kvm, pte_t *ptep,
|
unsigned long kvmppc_radix_update_pte(struct kvm *kvm, pte_t *ptep,
|
||||||
@ -584,7 +584,7 @@ int kvm_unmap_radix(struct kvm *kvm, struct kvm_memory_slot *memslot,
|
|||||||
|
|
||||||
ptep = __find_linux_pte(kvm->arch.pgtable, gpa, NULL, &shift);
|
ptep = __find_linux_pte(kvm->arch.pgtable, gpa, NULL, &shift);
|
||||||
if (ptep && pte_present(*ptep)) {
|
if (ptep && pte_present(*ptep)) {
|
||||||
old = kvmppc_radix_update_pte(kvm, ptep, _PAGE_PRESENT, 0,
|
old = kvmppc_radix_update_pte(kvm, ptep, ~0UL, 0,
|
||||||
gpa, shift);
|
gpa, shift);
|
||||||
kvmppc_radix_tlbie_page(kvm, gpa, shift);
|
kvmppc_radix_tlbie_page(kvm, gpa, shift);
|
||||||
if ((old & _PAGE_DIRTY) && memslot->dirty_bitmap) {
|
if ((old & _PAGE_DIRTY) && memslot->dirty_bitmap) {
|
||||||
|
@ -2441,6 +2441,7 @@ static void init_vcore_to_run(struct kvmppc_vcore *vc)
|
|||||||
vc->in_guest = 0;
|
vc->in_guest = 0;
|
||||||
vc->napping_threads = 0;
|
vc->napping_threads = 0;
|
||||||
vc->conferring_threads = 0;
|
vc->conferring_threads = 0;
|
||||||
|
vc->tb_offset_applied = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool can_dynamic_split(struct kvmppc_vcore *vc, struct core_info *cip)
|
static bool can_dynamic_split(struct kvmppc_vcore *vc, struct core_info *cip)
|
||||||
|
@ -692,6 +692,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
|
|||||||
22: ld r8,VCORE_TB_OFFSET(r5)
|
22: ld r8,VCORE_TB_OFFSET(r5)
|
||||||
cmpdi r8,0
|
cmpdi r8,0
|
||||||
beq 37f
|
beq 37f
|
||||||
|
std r8, VCORE_TB_OFFSET_APPL(r5)
|
||||||
mftb r6 /* current host timebase */
|
mftb r6 /* current host timebase */
|
||||||
add r8,r8,r6
|
add r8,r8,r6
|
||||||
mtspr SPRN_TBU40,r8 /* update upper 40 bits */
|
mtspr SPRN_TBU40,r8 /* update upper 40 bits */
|
||||||
@ -940,18 +941,6 @@ FTR_SECTION_ELSE
|
|||||||
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300)
|
ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300)
|
||||||
8:
|
8:
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the decrementer to the guest decrementer.
|
|
||||||
*/
|
|
||||||
ld r8,VCPU_DEC_EXPIRES(r4)
|
|
||||||
/* r8 is a host timebase value here, convert to guest TB */
|
|
||||||
ld r5,HSTATE_KVM_VCORE(r13)
|
|
||||||
ld r6,VCORE_TB_OFFSET(r5)
|
|
||||||
add r8,r8,r6
|
|
||||||
mftb r7
|
|
||||||
subf r3,r7,r8
|
|
||||||
mtspr SPRN_DEC,r3
|
|
||||||
|
|
||||||
ld r5, VCPU_SPRG0(r4)
|
ld r5, VCPU_SPRG0(r4)
|
||||||
ld r6, VCPU_SPRG1(r4)
|
ld r6, VCPU_SPRG1(r4)
|
||||||
ld r7, VCPU_SPRG2(r4)
|
ld r7, VCPU_SPRG2(r4)
|
||||||
@ -1005,6 +994,18 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_300)
|
|||||||
mtspr SPRN_LPCR,r8
|
mtspr SPRN_LPCR,r8
|
||||||
isync
|
isync
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the decrementer to the guest decrementer.
|
||||||
|
*/
|
||||||
|
ld r8,VCPU_DEC_EXPIRES(r4)
|
||||||
|
/* r8 is a host timebase value here, convert to guest TB */
|
||||||
|
ld r5,HSTATE_KVM_VCORE(r13)
|
||||||
|
ld r6,VCORE_TB_OFFSET_APPL(r5)
|
||||||
|
add r8,r8,r6
|
||||||
|
mftb r7
|
||||||
|
subf r3,r7,r8
|
||||||
|
mtspr SPRN_DEC,r3
|
||||||
|
|
||||||
/* Check if HDEC expires soon */
|
/* Check if HDEC expires soon */
|
||||||
mfspr r3, SPRN_HDEC
|
mfspr r3, SPRN_HDEC
|
||||||
EXTEND_HDEC(r3)
|
EXTEND_HDEC(r3)
|
||||||
@ -1597,8 +1598,27 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_RADIX)
|
|||||||
|
|
||||||
guest_bypass:
|
guest_bypass:
|
||||||
stw r12, STACK_SLOT_TRAP(r1)
|
stw r12, STACK_SLOT_TRAP(r1)
|
||||||
mr r3, r12
|
|
||||||
|
/* Save DEC */
|
||||||
|
/* Do this before kvmhv_commence_exit so we know TB is guest TB */
|
||||||
|
ld r3, HSTATE_KVM_VCORE(r13)
|
||||||
|
mfspr r5,SPRN_DEC
|
||||||
|
mftb r6
|
||||||
|
/* On P9, if the guest has large decr enabled, don't sign extend */
|
||||||
|
BEGIN_FTR_SECTION
|
||||||
|
ld r4, VCORE_LPCR(r3)
|
||||||
|
andis. r4, r4, LPCR_LD@h
|
||||||
|
bne 16f
|
||||||
|
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
|
||||||
|
extsw r5,r5
|
||||||
|
16: add r5,r5,r6
|
||||||
|
/* r5 is a guest timebase value here, convert to host TB */
|
||||||
|
ld r4,VCORE_TB_OFFSET_APPL(r3)
|
||||||
|
subf r5,r4,r5
|
||||||
|
std r5,VCPU_DEC_EXPIRES(r9)
|
||||||
|
|
||||||
/* Increment exit count, poke other threads to exit */
|
/* Increment exit count, poke other threads to exit */
|
||||||
|
mr r3, r12
|
||||||
bl kvmhv_commence_exit
|
bl kvmhv_commence_exit
|
||||||
nop
|
nop
|
||||||
ld r9, HSTATE_KVM_VCPU(r13)
|
ld r9, HSTATE_KVM_VCPU(r13)
|
||||||
@ -1639,23 +1659,6 @@ guest_bypass:
|
|||||||
mtspr SPRN_PURR,r3
|
mtspr SPRN_PURR,r3
|
||||||
mtspr SPRN_SPURR,r4
|
mtspr SPRN_SPURR,r4
|
||||||
|
|
||||||
/* Save DEC */
|
|
||||||
ld r3, HSTATE_KVM_VCORE(r13)
|
|
||||||
mfspr r5,SPRN_DEC
|
|
||||||
mftb r6
|
|
||||||
/* On P9, if the guest has large decr enabled, don't sign extend */
|
|
||||||
BEGIN_FTR_SECTION
|
|
||||||
ld r4, VCORE_LPCR(r3)
|
|
||||||
andis. r4, r4, LPCR_LD@h
|
|
||||||
bne 16f
|
|
||||||
END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
|
|
||||||
extsw r5,r5
|
|
||||||
16: add r5,r5,r6
|
|
||||||
/* r5 is a guest timebase value here, convert to host TB */
|
|
||||||
ld r4,VCORE_TB_OFFSET(r3)
|
|
||||||
subf r5,r4,r5
|
|
||||||
std r5,VCPU_DEC_EXPIRES(r9)
|
|
||||||
|
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
b 8f
|
b 8f
|
||||||
END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
|
END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
|
||||||
@ -1905,6 +1908,14 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
|
|||||||
cmpwi cr2, r0, 0
|
cmpwi cr2, r0, 0
|
||||||
beq cr2, 4f
|
beq cr2, 4f
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Radix: do eieio; tlbsync; ptesync sequence in case we
|
||||||
|
* interrupted the guest between a tlbie and a ptesync.
|
||||||
|
*/
|
||||||
|
eieio
|
||||||
|
tlbsync
|
||||||
|
ptesync
|
||||||
|
|
||||||
/* Radix: Handle the case where the guest used an illegal PID */
|
/* Radix: Handle the case where the guest used an illegal PID */
|
||||||
LOAD_REG_ADDR(r4, mmu_base_pid)
|
LOAD_REG_ADDR(r4, mmu_base_pid)
|
||||||
lwz r3, VCPU_GUEST_PID(r9)
|
lwz r3, VCPU_GUEST_PID(r9)
|
||||||
@ -2017,9 +2028,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S)
|
|||||||
|
|
||||||
27:
|
27:
|
||||||
/* Subtract timebase offset from timebase */
|
/* Subtract timebase offset from timebase */
|
||||||
ld r8,VCORE_TB_OFFSET(r5)
|
ld r8, VCORE_TB_OFFSET_APPL(r5)
|
||||||
cmpdi r8,0
|
cmpdi r8,0
|
||||||
beq 17f
|
beq 17f
|
||||||
|
li r0, 0
|
||||||
|
std r0, VCORE_TB_OFFSET_APPL(r5)
|
||||||
mftb r6 /* current guest timebase */
|
mftb r6 /* current guest timebase */
|
||||||
subf r8,r8,r6
|
subf r8,r8,r6
|
||||||
mtspr SPRN_TBU40,r8 /* update upper 40 bits */
|
mtspr SPRN_TBU40,r8 /* update upper 40 bits */
|
||||||
@ -2700,7 +2713,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
|
|||||||
add r3, r3, r5
|
add r3, r3, r5
|
||||||
ld r4, HSTATE_KVM_VCPU(r13)
|
ld r4, HSTATE_KVM_VCPU(r13)
|
||||||
ld r5, HSTATE_KVM_VCORE(r13)
|
ld r5, HSTATE_KVM_VCORE(r13)
|
||||||
ld r6, VCORE_TB_OFFSET(r5)
|
ld r6, VCORE_TB_OFFSET_APPL(r5)
|
||||||
subf r3, r6, r3 /* convert to host TB value */
|
subf r3, r6, r3 /* convert to host TB value */
|
||||||
std r3, VCPU_DEC_EXPIRES(r4)
|
std r3, VCPU_DEC_EXPIRES(r4)
|
||||||
|
|
||||||
@ -2799,7 +2812,7 @@ END_FTR_SECTION(CPU_FTR_TM | CPU_FTR_P9_TM_HV_ASSIST, 0)
|
|||||||
/* Restore guest decrementer */
|
/* Restore guest decrementer */
|
||||||
ld r3, VCPU_DEC_EXPIRES(r4)
|
ld r3, VCPU_DEC_EXPIRES(r4)
|
||||||
ld r5, HSTATE_KVM_VCORE(r13)
|
ld r5, HSTATE_KVM_VCORE(r13)
|
||||||
ld r6, VCORE_TB_OFFSET(r5)
|
ld r6, VCORE_TB_OFFSET_APPL(r5)
|
||||||
add r3, r3, r6 /* convert host TB to guest TB value */
|
add r3, r3, r6 /* convert host TB to guest TB value */
|
||||||
mftb r7
|
mftb r7
|
||||||
subf r3, r7, r3
|
subf r3, r7, r3
|
||||||
@ -3606,12 +3619,9 @@ kvmppc_fix_pmao:
|
|||||||
*/
|
*/
|
||||||
kvmhv_start_timing:
|
kvmhv_start_timing:
|
||||||
ld r5, HSTATE_KVM_VCORE(r13)
|
ld r5, HSTATE_KVM_VCORE(r13)
|
||||||
lbz r6, VCORE_IN_GUEST(r5)
|
ld r6, VCORE_TB_OFFSET_APPL(r5)
|
||||||
cmpwi r6, 0
|
mftb r5
|
||||||
beq 5f /* if in guest, need to */
|
subf r5, r6, r5 /* subtract current timebase offset */
|
||||||
ld r6, VCORE_TB_OFFSET(r5) /* subtract timebase offset */
|
|
||||||
5: mftb r5
|
|
||||||
subf r5, r6, r5
|
|
||||||
std r3, VCPU_CUR_ACTIVITY(r4)
|
std r3, VCPU_CUR_ACTIVITY(r4)
|
||||||
std r5, VCPU_ACTIVITY_START(r4)
|
std r5, VCPU_ACTIVITY_START(r4)
|
||||||
blr
|
blr
|
||||||
@ -3622,15 +3632,12 @@ kvmhv_start_timing:
|
|||||||
*/
|
*/
|
||||||
kvmhv_accumulate_time:
|
kvmhv_accumulate_time:
|
||||||
ld r5, HSTATE_KVM_VCORE(r13)
|
ld r5, HSTATE_KVM_VCORE(r13)
|
||||||
lbz r8, VCORE_IN_GUEST(r5)
|
ld r8, VCORE_TB_OFFSET_APPL(r5)
|
||||||
cmpwi r8, 0
|
ld r5, VCPU_CUR_ACTIVITY(r4)
|
||||||
beq 4f /* if in guest, need to */
|
|
||||||
ld r8, VCORE_TB_OFFSET(r5) /* subtract timebase offset */
|
|
||||||
4: ld r5, VCPU_CUR_ACTIVITY(r4)
|
|
||||||
ld r6, VCPU_ACTIVITY_START(r4)
|
ld r6, VCPU_ACTIVITY_START(r4)
|
||||||
std r3, VCPU_CUR_ACTIVITY(r4)
|
std r3, VCPU_CUR_ACTIVITY(r4)
|
||||||
mftb r7
|
mftb r7
|
||||||
subf r7, r8, r7
|
subf r7, r8, r7 /* subtract current timebase offset */
|
||||||
std r7, VCPU_ACTIVITY_START(r4)
|
std r7, VCPU_ACTIVITY_START(r4)
|
||||||
cmpdi r5, 0
|
cmpdi r5, 0
|
||||||
beqlr
|
beqlr
|
||||||
|
@ -11,6 +11,9 @@
|
|||||||
#define XGLUE(a,b) a##b
|
#define XGLUE(a,b) a##b
|
||||||
#define GLUE(a,b) XGLUE(a,b)
|
#define GLUE(a,b) XGLUE(a,b)
|
||||||
|
|
||||||
|
/* Dummy interrupt used when taking interrupts out of a queue in H_CPPR */
|
||||||
|
#define XICS_DUMMY 1
|
||||||
|
|
||||||
static void GLUE(X_PFX,ack_pending)(struct kvmppc_xive_vcpu *xc)
|
static void GLUE(X_PFX,ack_pending)(struct kvmppc_xive_vcpu *xc)
|
||||||
{
|
{
|
||||||
u8 cppr;
|
u8 cppr;
|
||||||
@ -205,6 +208,10 @@ static u32 GLUE(X_PFX,scan_interrupts)(struct kvmppc_xive_vcpu *xc,
|
|||||||
goto skip_ipi;
|
goto skip_ipi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If it's the dummy interrupt, continue searching */
|
||||||
|
if (hirq == XICS_DUMMY)
|
||||||
|
goto skip_ipi;
|
||||||
|
|
||||||
/* If fetching, update queue pointers */
|
/* If fetching, update queue pointers */
|
||||||
if (scan_type == scan_fetch) {
|
if (scan_type == scan_fetch) {
|
||||||
q->idx = idx;
|
q->idx = idx;
|
||||||
@ -385,9 +392,76 @@ static void GLUE(X_PFX,push_pending_to_hw)(struct kvmppc_xive_vcpu *xc)
|
|||||||
__x_writeb(prio, __x_tima + TM_SPC_SET_OS_PENDING);
|
__x_writeb(prio, __x_tima + TM_SPC_SET_OS_PENDING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void GLUE(X_PFX,scan_for_rerouted_irqs)(struct kvmppc_xive *xive,
|
||||||
|
struct kvmppc_xive_vcpu *xc)
|
||||||
|
{
|
||||||
|
unsigned int prio;
|
||||||
|
|
||||||
|
/* For each priority that is now masked */
|
||||||
|
for (prio = xc->cppr; prio < KVMPPC_XIVE_Q_COUNT; prio++) {
|
||||||
|
struct xive_q *q = &xc->queues[prio];
|
||||||
|
struct kvmppc_xive_irq_state *state;
|
||||||
|
struct kvmppc_xive_src_block *sb;
|
||||||
|
u32 idx, toggle, entry, irq, hw_num;
|
||||||
|
struct xive_irq_data *xd;
|
||||||
|
__be32 *qpage;
|
||||||
|
u16 src;
|
||||||
|
|
||||||
|
idx = q->idx;
|
||||||
|
toggle = q->toggle;
|
||||||
|
qpage = READ_ONCE(q->qpage);
|
||||||
|
if (!qpage)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* For each interrupt in the queue */
|
||||||
|
for (;;) {
|
||||||
|
entry = be32_to_cpup(qpage + idx);
|
||||||
|
|
||||||
|
/* No more ? */
|
||||||
|
if ((entry >> 31) == toggle)
|
||||||
|
break;
|
||||||
|
irq = entry & 0x7fffffff;
|
||||||
|
|
||||||
|
/* Skip dummies and IPIs */
|
||||||
|
if (irq == XICS_DUMMY || irq == XICS_IPI)
|
||||||
|
goto next;
|
||||||
|
sb = kvmppc_xive_find_source(xive, irq, &src);
|
||||||
|
if (!sb)
|
||||||
|
goto next;
|
||||||
|
state = &sb->irq_state[src];
|
||||||
|
|
||||||
|
/* Has it been rerouted ? */
|
||||||
|
if (xc->server_num == state->act_server)
|
||||||
|
goto next;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allright, it *has* been re-routed, kill it from
|
||||||
|
* the queue.
|
||||||
|
*/
|
||||||
|
qpage[idx] = cpu_to_be32((entry & 0x80000000) | XICS_DUMMY);
|
||||||
|
|
||||||
|
/* Find the HW interrupt */
|
||||||
|
kvmppc_xive_select_irq(state, &hw_num, &xd);
|
||||||
|
|
||||||
|
/* If it's not an LSI, set PQ to 11 the EOI will force a resend */
|
||||||
|
if (!(xd->flags & XIVE_IRQ_FLAG_LSI))
|
||||||
|
GLUE(X_PFX,esb_load)(xd, XIVE_ESB_SET_PQ_11);
|
||||||
|
|
||||||
|
/* EOI the source */
|
||||||
|
GLUE(X_PFX,source_eoi)(hw_num, xd);
|
||||||
|
|
||||||
|
next:
|
||||||
|
idx = (idx + 1) & q->msk;
|
||||||
|
if (idx == 0)
|
||||||
|
toggle ^= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
X_STATIC int GLUE(X_PFX,h_cppr)(struct kvm_vcpu *vcpu, unsigned long cppr)
|
X_STATIC int GLUE(X_PFX,h_cppr)(struct kvm_vcpu *vcpu, unsigned long cppr)
|
||||||
{
|
{
|
||||||
struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
|
struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
|
||||||
|
struct kvmppc_xive *xive = vcpu->kvm->arch.xive;
|
||||||
u8 old_cppr;
|
u8 old_cppr;
|
||||||
|
|
||||||
pr_devel("H_CPPR(cppr=%ld)\n", cppr);
|
pr_devel("H_CPPR(cppr=%ld)\n", cppr);
|
||||||
@ -407,14 +481,34 @@ X_STATIC int GLUE(X_PFX,h_cppr)(struct kvm_vcpu *vcpu, unsigned long cppr)
|
|||||||
*/
|
*/
|
||||||
smp_mb();
|
smp_mb();
|
||||||
|
|
||||||
/*
|
if (cppr > old_cppr) {
|
||||||
* We are masking less, we need to look for pending things
|
/*
|
||||||
* to deliver and set VP pending bits accordingly to trigger
|
* We are masking less, we need to look for pending things
|
||||||
* a new interrupt otherwise we might miss MFRR changes for
|
* to deliver and set VP pending bits accordingly to trigger
|
||||||
* which we have optimized out sending an IPI signal.
|
* a new interrupt otherwise we might miss MFRR changes for
|
||||||
*/
|
* which we have optimized out sending an IPI signal.
|
||||||
if (cppr > old_cppr)
|
*/
|
||||||
GLUE(X_PFX,push_pending_to_hw)(xc);
|
GLUE(X_PFX,push_pending_to_hw)(xc);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* We are masking more, we need to check the queue for any
|
||||||
|
* interrupt that has been routed to another CPU, take
|
||||||
|
* it out (replace it with the dummy) and retrigger it.
|
||||||
|
*
|
||||||
|
* This is necessary since those interrupts may otherwise
|
||||||
|
* never be processed, at least not until this CPU restores
|
||||||
|
* its CPPR.
|
||||||
|
*
|
||||||
|
* This is in theory racy vs. HW adding new interrupts to
|
||||||
|
* the queue. In practice this works because the interesting
|
||||||
|
* cases are when the guest has done a set_xive() to move the
|
||||||
|
* interrupt away, which flushes the xive, followed by the
|
||||||
|
* target CPU doing a H_CPPR. So any new interrupt coming into
|
||||||
|
* the queue must still be routed to us and isn't a source
|
||||||
|
* of concern.
|
||||||
|
*/
|
||||||
|
GLUE(X_PFX,scan_for_rerouted_irqs)(xive, xc);
|
||||||
|
}
|
||||||
|
|
||||||
/* Apply new CPPR */
|
/* Apply new CPPR */
|
||||||
xc->hw_cppr = cppr;
|
xc->hw_cppr = cppr;
|
||||||
|
@ -578,7 +578,7 @@ static int pin_blocks(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
|
|||||||
|
|
||||||
gpa = READ_ONCE(scb_o->itdba) & ~0xffUL;
|
gpa = READ_ONCE(scb_o->itdba) & ~0xffUL;
|
||||||
if (gpa && (scb_s->ecb & ECB_TE)) {
|
if (gpa && (scb_s->ecb & ECB_TE)) {
|
||||||
if (!(gpa & ~0x1fffU)) {
|
if (!(gpa & ~0x1fffUL)) {
|
||||||
rc = set_validity_icpt(scb_s, 0x0080U);
|
rc = set_validity_icpt(scb_s, 0x0080U);
|
||||||
goto unpin;
|
goto unpin;
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ LDFLAGS_purgatory.ro += -z nodefaultlib
|
|||||||
KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes
|
KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes
|
||||||
KBUILD_CFLAGS += -Wno-pointer-sign -Wno-sign-compare
|
KBUILD_CFLAGS += -Wno-pointer-sign -Wno-sign-compare
|
||||||
KBUILD_CFLAGS += -fno-zero-initialized-in-bss -fno-builtin -ffreestanding
|
KBUILD_CFLAGS += -fno-zero-initialized-in-bss -fno-builtin -ffreestanding
|
||||||
KBUILD_CFLAGS += -c -MD -Os -m64
|
KBUILD_CFLAGS += -c -MD -Os -m64 -msoft-float
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
|
KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
|
||||||
|
|
||||||
$(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE
|
$(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE
|
||||||
|
@ -942,12 +942,8 @@ static const __initconst struct x86_cpu_id cpu_no_meltdown[] = {
|
|||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Only list CPUs which speculate but are non susceptible to SSB */
|
||||||
static const __initconst struct x86_cpu_id cpu_no_spec_store_bypass[] = {
|
static const __initconst struct x86_cpu_id cpu_no_spec_store_bypass[] = {
|
||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_PINEVIEW },
|
|
||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_LINCROFT },
|
|
||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_PENWELL },
|
|
||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_CLOVERVIEW },
|
|
||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_CEDARVIEW },
|
|
||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_SILVERMONT1 },
|
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_SILVERMONT1 },
|
||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_AIRMONT },
|
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_AIRMONT },
|
||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_SILVERMONT2 },
|
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_SILVERMONT2 },
|
||||||
@ -955,14 +951,10 @@ static const __initconst struct x86_cpu_id cpu_no_spec_store_bypass[] = {
|
|||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_CORE_YONAH },
|
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_CORE_YONAH },
|
||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_XEON_PHI_KNL },
|
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_XEON_PHI_KNL },
|
||||||
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_XEON_PHI_KNM },
|
{ X86_VENDOR_INTEL, 6, INTEL_FAM6_XEON_PHI_KNM },
|
||||||
{ X86_VENDOR_CENTAUR, 5, },
|
|
||||||
{ X86_VENDOR_INTEL, 5, },
|
|
||||||
{ X86_VENDOR_NSC, 5, },
|
|
||||||
{ X86_VENDOR_AMD, 0x12, },
|
{ X86_VENDOR_AMD, 0x12, },
|
||||||
{ X86_VENDOR_AMD, 0x11, },
|
{ X86_VENDOR_AMD, 0x11, },
|
||||||
{ X86_VENDOR_AMD, 0x10, },
|
{ X86_VENDOR_AMD, 0x10, },
|
||||||
{ X86_VENDOR_AMD, 0xf, },
|
{ X86_VENDOR_AMD, 0xf, },
|
||||||
{ X86_VENDOR_ANY, 4, },
|
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -970,6 +962,12 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)
|
|||||||
{
|
{
|
||||||
u64 ia32_cap = 0;
|
u64 ia32_cap = 0;
|
||||||
|
|
||||||
|
if (x86_match_cpu(cpu_no_speculation))
|
||||||
|
return;
|
||||||
|
|
||||||
|
setup_force_cpu_bug(X86_BUG_SPECTRE_V1);
|
||||||
|
setup_force_cpu_bug(X86_BUG_SPECTRE_V2);
|
||||||
|
|
||||||
if (cpu_has(c, X86_FEATURE_ARCH_CAPABILITIES))
|
if (cpu_has(c, X86_FEATURE_ARCH_CAPABILITIES))
|
||||||
rdmsrl(MSR_IA32_ARCH_CAPABILITIES, ia32_cap);
|
rdmsrl(MSR_IA32_ARCH_CAPABILITIES, ia32_cap);
|
||||||
|
|
||||||
@ -977,12 +975,6 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)
|
|||||||
!(ia32_cap & ARCH_CAP_SSB_NO))
|
!(ia32_cap & ARCH_CAP_SSB_NO))
|
||||||
setup_force_cpu_bug(X86_BUG_SPEC_STORE_BYPASS);
|
setup_force_cpu_bug(X86_BUG_SPEC_STORE_BYPASS);
|
||||||
|
|
||||||
if (x86_match_cpu(cpu_no_speculation))
|
|
||||||
return;
|
|
||||||
|
|
||||||
setup_force_cpu_bug(X86_BUG_SPECTRE_V1);
|
|
||||||
setup_force_cpu_bug(X86_BUG_SPECTRE_V2);
|
|
||||||
|
|
||||||
if (x86_match_cpu(cpu_no_meltdown))
|
if (x86_match_cpu(cpu_no_meltdown))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -407,8 +407,8 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|||||||
|
|
||||||
/* cpuid 7.0.edx*/
|
/* cpuid 7.0.edx*/
|
||||||
const u32 kvm_cpuid_7_0_edx_x86_features =
|
const u32 kvm_cpuid_7_0_edx_x86_features =
|
||||||
F(AVX512_4VNNIW) | F(AVX512_4FMAPS) | F(SPEC_CTRL) | F(SSBD) |
|
F(AVX512_4VNNIW) | F(AVX512_4FMAPS) | F(SPEC_CTRL) |
|
||||||
F(ARCH_CAPABILITIES);
|
F(SPEC_CTRL_SSBD) | F(ARCH_CAPABILITIES);
|
||||||
|
|
||||||
/* all calls to cpuid_count() should be made on the same cpu */
|
/* all calls to cpuid_count() should be made on the same cpu */
|
||||||
get_cpu();
|
get_cpu();
|
||||||
@ -495,6 +495,11 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
|
|||||||
entry->ecx &= ~F(PKU);
|
entry->ecx &= ~F(PKU);
|
||||||
entry->edx &= kvm_cpuid_7_0_edx_x86_features;
|
entry->edx &= kvm_cpuid_7_0_edx_x86_features;
|
||||||
cpuid_mask(&entry->edx, CPUID_7_EDX);
|
cpuid_mask(&entry->edx, CPUID_7_EDX);
|
||||||
|
/*
|
||||||
|
* We emulate ARCH_CAPABILITIES in software even
|
||||||
|
* if the host doesn't support it.
|
||||||
|
*/
|
||||||
|
entry->edx |= F(ARCH_CAPABILITIES);
|
||||||
} else {
|
} else {
|
||||||
entry->ebx = 0;
|
entry->ebx = 0;
|
||||||
entry->ecx = 0;
|
entry->ecx = 0;
|
||||||
|
@ -1260,12 +1260,16 @@ static void kvm_hv_hypercall_set_result(struct kvm_vcpu *vcpu, u64 result)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int kvm_hv_hypercall_complete(struct kvm_vcpu *vcpu, u64 result)
|
||||||
|
{
|
||||||
|
kvm_hv_hypercall_set_result(vcpu, result);
|
||||||
|
++vcpu->stat.hypercalls;
|
||||||
|
return kvm_skip_emulated_instruction(vcpu);
|
||||||
|
}
|
||||||
|
|
||||||
static int kvm_hv_hypercall_complete_userspace(struct kvm_vcpu *vcpu)
|
static int kvm_hv_hypercall_complete_userspace(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
struct kvm_run *run = vcpu->run;
|
return kvm_hv_hypercall_complete(vcpu, vcpu->run->hyperv.u.hcall.result);
|
||||||
|
|
||||||
kvm_hv_hypercall_set_result(vcpu, run->hyperv.u.hcall.result);
|
|
||||||
return kvm_skip_emulated_instruction(vcpu);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, bool fast, u64 param)
|
static u16 kvm_hvcall_signal_event(struct kvm_vcpu *vcpu, bool fast, u64 param)
|
||||||
@ -1350,7 +1354,7 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
|
|||||||
/* Hypercall continuation is not supported yet */
|
/* Hypercall continuation is not supported yet */
|
||||||
if (rep_cnt || rep_idx) {
|
if (rep_cnt || rep_idx) {
|
||||||
ret = HV_STATUS_INVALID_HYPERCALL_CODE;
|
ret = HV_STATUS_INVALID_HYPERCALL_CODE;
|
||||||
goto set_result;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
@ -1381,9 +1385,8 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_result:
|
out:
|
||||||
kvm_hv_hypercall_set_result(vcpu, ret);
|
return kvm_hv_hypercall_complete(vcpu, ret);
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_hv_init_vm(struct kvm *kvm)
|
void kvm_hv_init_vm(struct kvm *kvm)
|
||||||
|
@ -1522,11 +1522,23 @@ static bool set_target_expiration(struct kvm_lapic *apic)
|
|||||||
|
|
||||||
static void advance_periodic_target_expiration(struct kvm_lapic *apic)
|
static void advance_periodic_target_expiration(struct kvm_lapic *apic)
|
||||||
{
|
{
|
||||||
apic->lapic_timer.tscdeadline +=
|
ktime_t now = ktime_get();
|
||||||
nsec_to_cycles(apic->vcpu, apic->lapic_timer.period);
|
u64 tscl = rdtsc();
|
||||||
|
ktime_t delta;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Synchronize both deadlines to the same time source or
|
||||||
|
* differences in the periods (caused by differences in the
|
||||||
|
* underlying clocks or numerical approximation errors) will
|
||||||
|
* cause the two to drift apart over time as the errors
|
||||||
|
* accumulate.
|
||||||
|
*/
|
||||||
apic->lapic_timer.target_expiration =
|
apic->lapic_timer.target_expiration =
|
||||||
ktime_add_ns(apic->lapic_timer.target_expiration,
|
ktime_add_ns(apic->lapic_timer.target_expiration,
|
||||||
apic->lapic_timer.period);
|
apic->lapic_timer.period);
|
||||||
|
delta = ktime_sub(apic->lapic_timer.target_expiration, now);
|
||||||
|
apic->lapic_timer.tscdeadline = kvm_read_l1_tsc(apic->vcpu, tscl) +
|
||||||
|
nsec_to_cycles(apic->vcpu, delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void start_sw_period(struct kvm_lapic *apic)
|
static void start_sw_period(struct kvm_lapic *apic)
|
||||||
|
@ -6671,11 +6671,8 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
|
|||||||
unsigned long nr, a0, a1, a2, a3, ret;
|
unsigned long nr, a0, a1, a2, a3, ret;
|
||||||
int op_64_bit;
|
int op_64_bit;
|
||||||
|
|
||||||
if (kvm_hv_hypercall_enabled(vcpu->kvm)) {
|
if (kvm_hv_hypercall_enabled(vcpu->kvm))
|
||||||
if (!kvm_hv_hypercall(vcpu))
|
return kvm_hv_hypercall(vcpu);
|
||||||
return 0;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
nr = kvm_register_read(vcpu, VCPU_REGS_RAX);
|
nr = kvm_register_read(vcpu, VCPU_REGS_RAX);
|
||||||
a0 = kvm_register_read(vcpu, VCPU_REGS_RBX);
|
a0 = kvm_register_read(vcpu, VCPU_REGS_RBX);
|
||||||
@ -6696,7 +6693,7 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
if (kvm_x86_ops->get_cpl(vcpu) != 0) {
|
if (kvm_x86_ops->get_cpl(vcpu) != 0) {
|
||||||
ret = -KVM_EPERM;
|
ret = -KVM_EPERM;
|
||||||
goto out_error;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (nr) {
|
switch (nr) {
|
||||||
@ -6716,12 +6713,11 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
|
|||||||
ret = -KVM_ENOSYS;
|
ret = -KVM_ENOSYS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
out_error:
|
out:
|
||||||
if (!op_64_bit)
|
if (!op_64_bit)
|
||||||
ret = (u32)ret;
|
ret = (u32)ret;
|
||||||
kvm_register_write(vcpu, VCPU_REGS_RAX, ret);
|
kvm_register_write(vcpu, VCPU_REGS_RAX, ret);
|
||||||
|
|
||||||
out:
|
|
||||||
++vcpu->stat.hypercalls;
|
++vcpu->stat.hypercalls;
|
||||||
return kvm_skip_emulated_instruction(vcpu);
|
return kvm_skip_emulated_instruction(vcpu);
|
||||||
}
|
}
|
||||||
@ -7980,6 +7976,7 @@ static int __set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
|
|||||||
{
|
{
|
||||||
struct msr_data apic_base_msr;
|
struct msr_data apic_base_msr;
|
||||||
int mmu_reset_needed = 0;
|
int mmu_reset_needed = 0;
|
||||||
|
int cpuid_update_needed = 0;
|
||||||
int pending_vec, max_bits, idx;
|
int pending_vec, max_bits, idx;
|
||||||
struct desc_ptr dt;
|
struct desc_ptr dt;
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
@ -8018,8 +8015,10 @@ static int __set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
|
|||||||
vcpu->arch.cr0 = sregs->cr0;
|
vcpu->arch.cr0 = sregs->cr0;
|
||||||
|
|
||||||
mmu_reset_needed |= kvm_read_cr4(vcpu) != sregs->cr4;
|
mmu_reset_needed |= kvm_read_cr4(vcpu) != sregs->cr4;
|
||||||
|
cpuid_update_needed |= ((kvm_read_cr4(vcpu) ^ sregs->cr4) &
|
||||||
|
(X86_CR4_OSXSAVE | X86_CR4_PKE));
|
||||||
kvm_x86_ops->set_cr4(vcpu, sregs->cr4);
|
kvm_x86_ops->set_cr4(vcpu, sregs->cr4);
|
||||||
if (sregs->cr4 & (X86_CR4_OSXSAVE | X86_CR4_PKE))
|
if (cpuid_update_needed)
|
||||||
kvm_update_cpuid(vcpu);
|
kvm_update_cpuid(vcpu);
|
||||||
|
|
||||||
idx = srcu_read_lock(&vcpu->kvm->srcu);
|
idx = srcu_read_lock(&vcpu->kvm->srcu);
|
||||||
|
@ -1151,8 +1151,8 @@ static void eprom_get_byte(struct zatm_dev *zatm_dev, unsigned char *byte,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static unsigned char eprom_try_esi(struct atm_dev *dev, unsigned short cmd,
|
static int eprom_try_esi(struct atm_dev *dev, unsigned short cmd, int offset,
|
||||||
int offset, int swap)
|
int swap)
|
||||||
{
|
{
|
||||||
unsigned char buf[ZEPROM_SIZE];
|
unsigned char buf[ZEPROM_SIZE];
|
||||||
struct zatm_dev *zatm_dev;
|
struct zatm_dev *zatm_dev;
|
||||||
|
@ -152,8 +152,8 @@ static int eip197_load_firmwares(struct safexcel_crypto_priv *priv)
|
|||||||
EIP197_PE_ICE_SCRATCH_CTRL_CHANGE_ACCESS;
|
EIP197_PE_ICE_SCRATCH_CTRL_CHANGE_ACCESS;
|
||||||
writel(val, EIP197_PE(priv) + EIP197_PE_ICE_SCRATCH_CTRL);
|
writel(val, EIP197_PE(priv) + EIP197_PE_ICE_SCRATCH_CTRL);
|
||||||
|
|
||||||
memset(EIP197_PE(priv) + EIP197_PE_ICE_SCRATCH_RAM, 0,
|
memset_io(EIP197_PE(priv) + EIP197_PE_ICE_SCRATCH_RAM, 0,
|
||||||
EIP197_NUM_OF_SCRATCH_BLOCKS * sizeof(u32));
|
EIP197_NUM_OF_SCRATCH_BLOCKS * sizeof(u32));
|
||||||
|
|
||||||
eip197_write_firmware(priv, fw[FW_IFPP], EIP197_PE_ICE_FPP_CTRL,
|
eip197_write_firmware(priv, fw[FW_IFPP], EIP197_PE_ICE_FPP_CTRL,
|
||||||
EIP197_PE_ICE_RAM_CTRL_FPP_PROG_EN);
|
EIP197_PE_ICE_RAM_CTRL_FPP_PROG_EN);
|
||||||
|
@ -147,7 +147,7 @@ static u32 smc(u32 cmd_addr)
|
|||||||
"smc #0 @ switch to secure world\n"
|
"smc #0 @ switch to secure world\n"
|
||||||
: "=r" (r0)
|
: "=r" (r0)
|
||||||
: "r" (r0), "r" (r1), "r" (r2)
|
: "r" (r0), "r" (r1), "r" (r2)
|
||||||
: "r3");
|
: "r3", "r12");
|
||||||
} while (r0 == QCOM_SCM_INTERRUPTED);
|
} while (r0 == QCOM_SCM_INTERRUPTED);
|
||||||
|
|
||||||
return r0;
|
return r0;
|
||||||
@ -263,7 +263,7 @@ static s32 qcom_scm_call_atomic1(u32 svc, u32 cmd, u32 arg1)
|
|||||||
"smc #0 @ switch to secure world\n"
|
"smc #0 @ switch to secure world\n"
|
||||||
: "=r" (r0)
|
: "=r" (r0)
|
||||||
: "r" (r0), "r" (r1), "r" (r2)
|
: "r" (r0), "r" (r1), "r" (r2)
|
||||||
: "r3");
|
: "r3", "r12");
|
||||||
return r0;
|
return r0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,7 +298,7 @@ static s32 qcom_scm_call_atomic2(u32 svc, u32 cmd, u32 arg1, u32 arg2)
|
|||||||
"smc #0 @ switch to secure world\n"
|
"smc #0 @ switch to secure world\n"
|
||||||
: "=r" (r0)
|
: "=r" (r0)
|
||||||
: "r" (r0), "r" (r1), "r" (r2), "r" (r3)
|
: "r" (r0), "r" (r1), "r" (r2), "r" (r3)
|
||||||
);
|
: "r12");
|
||||||
return r0;
|
return r0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,7 +328,7 @@ u32 qcom_scm_get_version(void)
|
|||||||
"smc #0 @ switch to secure world\n"
|
"smc #0 @ switch to secure world\n"
|
||||||
: "=r" (r0), "=r" (r1)
|
: "=r" (r0), "=r" (r1)
|
||||||
: "r" (r0), "r" (r1)
|
: "r" (r0), "r" (r1)
|
||||||
: "r2", "r3");
|
: "r2", "r3", "r12");
|
||||||
} while (r0 == QCOM_SCM_INTERRUPTED);
|
} while (r0 == QCOM_SCM_INTERRUPTED);
|
||||||
|
|
||||||
version = r1;
|
version = r1;
|
||||||
|
@ -4555,8 +4555,8 @@ static int dm_update_crtcs_state(struct dc *dc,
|
|||||||
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
||||||
struct amdgpu_crtc *acrtc = NULL;
|
struct amdgpu_crtc *acrtc = NULL;
|
||||||
struct amdgpu_dm_connector *aconnector = NULL;
|
struct amdgpu_dm_connector *aconnector = NULL;
|
||||||
struct drm_connector_state *new_con_state = NULL;
|
struct drm_connector_state *drm_new_conn_state = NULL, *drm_old_conn_state = NULL;
|
||||||
struct dm_connector_state *dm_conn_state = NULL;
|
struct dm_connector_state *dm_new_conn_state = NULL, *dm_old_conn_state = NULL;
|
||||||
struct drm_plane_state *new_plane_state = NULL;
|
struct drm_plane_state *new_plane_state = NULL;
|
||||||
|
|
||||||
new_stream = NULL;
|
new_stream = NULL;
|
||||||
@ -4577,19 +4577,23 @@ static int dm_update_crtcs_state(struct dc *dc,
|
|||||||
/* TODO This hack should go away */
|
/* TODO This hack should go away */
|
||||||
if (aconnector && enable) {
|
if (aconnector && enable) {
|
||||||
// Make sure fake sink is created in plug-in scenario
|
// Make sure fake sink is created in plug-in scenario
|
||||||
new_con_state = drm_atomic_get_connector_state(state,
|
drm_new_conn_state = drm_atomic_get_new_connector_state(state,
|
||||||
&aconnector->base);
|
&aconnector->base);
|
||||||
|
drm_old_conn_state = drm_atomic_get_old_connector_state(state,
|
||||||
|
&aconnector->base);
|
||||||
|
|
||||||
if (IS_ERR(new_con_state)) {
|
|
||||||
ret = PTR_ERR_OR_ZERO(new_con_state);
|
if (IS_ERR(drm_new_conn_state)) {
|
||||||
|
ret = PTR_ERR_OR_ZERO(drm_new_conn_state);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
dm_conn_state = to_dm_connector_state(new_con_state);
|
dm_new_conn_state = to_dm_connector_state(drm_new_conn_state);
|
||||||
|
dm_old_conn_state = to_dm_connector_state(drm_old_conn_state);
|
||||||
|
|
||||||
new_stream = create_stream_for_sink(aconnector,
|
new_stream = create_stream_for_sink(aconnector,
|
||||||
&new_crtc_state->mode,
|
&new_crtc_state->mode,
|
||||||
dm_conn_state);
|
dm_new_conn_state);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* we can have no stream on ACTION_SET if a display
|
* we can have no stream on ACTION_SET if a display
|
||||||
@ -4695,20 +4699,30 @@ static int dm_update_crtcs_state(struct dc *dc,
|
|||||||
* We want to do dc stream updates that do not require a
|
* We want to do dc stream updates that do not require a
|
||||||
* full modeset below.
|
* full modeset below.
|
||||||
*/
|
*/
|
||||||
if (!enable || !aconnector || modereset_required(new_crtc_state))
|
if (!(enable && aconnector && new_crtc_state->enable &&
|
||||||
|
new_crtc_state->active))
|
||||||
continue;
|
continue;
|
||||||
/*
|
/*
|
||||||
* Given above conditions, the dc state cannot be NULL because:
|
* Given above conditions, the dc state cannot be NULL because:
|
||||||
* 1. We're attempting to enable a CRTC. Which has a...
|
* 1. We're in the process of enabling CRTCs (just been added
|
||||||
* 2. Valid connector attached, and
|
* to the dc context, or already is on the context)
|
||||||
* 3. User does not want to reset it (disable or mark inactive,
|
* 2. Has a valid connector attached, and
|
||||||
* which can happen on a CRTC that's already disabled).
|
* 3. Is currently active and enabled.
|
||||||
* => It currently exists.
|
* => The dc stream state currently exists.
|
||||||
*/
|
*/
|
||||||
BUG_ON(dm_new_crtc_state->stream == NULL);
|
BUG_ON(dm_new_crtc_state->stream == NULL);
|
||||||
|
|
||||||
/* Color managment settings */
|
/* Scaling or underscan settings */
|
||||||
if (dm_new_crtc_state->base.color_mgmt_changed) {
|
if (is_scaling_state_different(dm_old_conn_state, dm_new_conn_state))
|
||||||
|
update_stream_scaling_settings(
|
||||||
|
&new_crtc_state->mode, dm_new_conn_state, dm_new_crtc_state->stream);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Color management settings. We also update color properties
|
||||||
|
* when a modeset is needed, to ensure it gets reprogrammed.
|
||||||
|
*/
|
||||||
|
if (dm_new_crtc_state->base.color_mgmt_changed ||
|
||||||
|
drm_atomic_crtc_needs_modeset(new_crtc_state)) {
|
||||||
ret = amdgpu_dm_set_regamma_lut(dm_new_crtc_state);
|
ret = amdgpu_dm_set_regamma_lut(dm_new_crtc_state);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -2077,7 +2077,7 @@ static irqreturn_t dw_hdmi_hardirq(int irq, void *dev_id)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense)
|
void dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense)
|
||||||
{
|
{
|
||||||
mutex_lock(&hdmi->mutex);
|
mutex_lock(&hdmi->mutex);
|
||||||
|
|
||||||
@ -2103,13 +2103,6 @@ void __dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense)
|
|||||||
}
|
}
|
||||||
mutex_unlock(&hdmi->mutex);
|
mutex_unlock(&hdmi->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dw_hdmi_setup_rx_sense(struct device *dev, bool hpd, bool rx_sense)
|
|
||||||
{
|
|
||||||
struct dw_hdmi *hdmi = dev_get_drvdata(dev);
|
|
||||||
|
|
||||||
__dw_hdmi_setup_rx_sense(hdmi, hpd, rx_sense);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(dw_hdmi_setup_rx_sense);
|
EXPORT_SYMBOL_GPL(dw_hdmi_setup_rx_sense);
|
||||||
|
|
||||||
static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
|
static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
|
||||||
@ -2145,9 +2138,9 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
|
|||||||
*/
|
*/
|
||||||
if (intr_stat &
|
if (intr_stat &
|
||||||
(HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD)) {
|
(HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD)) {
|
||||||
__dw_hdmi_setup_rx_sense(hdmi,
|
dw_hdmi_setup_rx_sense(hdmi,
|
||||||
phy_stat & HDMI_PHY_HPD,
|
phy_stat & HDMI_PHY_HPD,
|
||||||
phy_stat & HDMI_PHY_RX_SENSE);
|
phy_stat & HDMI_PHY_RX_SENSE);
|
||||||
|
|
||||||
if ((phy_stat & (HDMI_PHY_RX_SENSE | HDMI_PHY_HPD)) == 0)
|
if ((phy_stat & (HDMI_PHY_RX_SENSE | HDMI_PHY_HPD)) == 0)
|
||||||
cec_notifier_set_phys_addr(hdmi->cec_notifier,
|
cec_notifier_set_phys_addr(hdmi->cec_notifier,
|
||||||
|
@ -1145,6 +1145,7 @@ int drm_dp_psr_setup_time(const u8 psr_cap[EDP_PSR_RECEIVER_CAP_SIZE])
|
|||||||
static const u16 psr_setup_time_us[] = {
|
static const u16 psr_setup_time_us[] = {
|
||||||
PSR_SETUP_TIME(330),
|
PSR_SETUP_TIME(330),
|
||||||
PSR_SETUP_TIME(275),
|
PSR_SETUP_TIME(275),
|
||||||
|
PSR_SETUP_TIME(220),
|
||||||
PSR_SETUP_TIME(165),
|
PSR_SETUP_TIME(165),
|
||||||
PSR_SETUP_TIME(110),
|
PSR_SETUP_TIME(110),
|
||||||
PSR_SETUP_TIME(55),
|
PSR_SETUP_TIME(55),
|
||||||
|
@ -4,6 +4,8 @@
|
|||||||
* Copyright © 2018 Intel Corporation
|
* Copyright © 2018 Intel Corporation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/nospec.h>
|
||||||
|
|
||||||
#include "i915_drv.h"
|
#include "i915_drv.h"
|
||||||
#include "i915_query.h"
|
#include "i915_query.h"
|
||||||
#include <uapi/drm/i915_drm.h>
|
#include <uapi/drm/i915_drm.h>
|
||||||
@ -100,7 +102,7 @@ int i915_query_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
|||||||
|
|
||||||
for (i = 0; i < args->num_items; i++, user_item_ptr++) {
|
for (i = 0; i < args->num_items; i++, user_item_ptr++) {
|
||||||
struct drm_i915_query_item item;
|
struct drm_i915_query_item item;
|
||||||
u64 func_idx;
|
unsigned long func_idx;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (copy_from_user(&item, user_item_ptr, sizeof(item)))
|
if (copy_from_user(&item, user_item_ptr, sizeof(item)))
|
||||||
@ -109,12 +111,17 @@ int i915_query_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
|
|||||||
if (item.query_id == 0)
|
if (item.query_id == 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (overflows_type(item.query_id - 1, unsigned long))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
func_idx = item.query_id - 1;
|
func_idx = item.query_id - 1;
|
||||||
|
|
||||||
if (func_idx < ARRAY_SIZE(i915_query_funcs))
|
ret = -EINVAL;
|
||||||
|
if (func_idx < ARRAY_SIZE(i915_query_funcs)) {
|
||||||
|
func_idx = array_index_nospec(func_idx,
|
||||||
|
ARRAY_SIZE(i915_query_funcs));
|
||||||
ret = i915_query_funcs[func_idx](dev_priv, &item);
|
ret = i915_query_funcs[func_idx](dev_priv, &item);
|
||||||
else
|
}
|
||||||
ret = -EINVAL;
|
|
||||||
|
|
||||||
/* Only write the length back to userspace if they differ. */
|
/* Only write the length back to userspace if they differ. */
|
||||||
if (ret != item.length && put_user(ret, &user_item_ptr->length))
|
if (ret != item.length && put_user(ret, &user_item_ptr->length))
|
||||||
|
@ -574,6 +574,36 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val,
|
|||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
intel_lvds_connector_register(struct drm_connector *connector)
|
||||||
|
{
|
||||||
|
struct intel_lvds_connector *lvds = to_lvds_connector(connector);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = intel_connector_register(connector);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
lvds->lid_notifier.notifier_call = intel_lid_notify;
|
||||||
|
if (acpi_lid_notifier_register(&lvds->lid_notifier)) {
|
||||||
|
DRM_DEBUG_KMS("lid notifier registration failed\n");
|
||||||
|
lvds->lid_notifier.notifier_call = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
intel_lvds_connector_unregister(struct drm_connector *connector)
|
||||||
|
{
|
||||||
|
struct intel_lvds_connector *lvds = to_lvds_connector(connector);
|
||||||
|
|
||||||
|
if (lvds->lid_notifier.notifier_call)
|
||||||
|
acpi_lid_notifier_unregister(&lvds->lid_notifier);
|
||||||
|
|
||||||
|
intel_connector_unregister(connector);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* intel_lvds_destroy - unregister and free LVDS structures
|
* intel_lvds_destroy - unregister and free LVDS structures
|
||||||
* @connector: connector to free
|
* @connector: connector to free
|
||||||
@ -586,9 +616,6 @@ static void intel_lvds_destroy(struct drm_connector *connector)
|
|||||||
struct intel_lvds_connector *lvds_connector =
|
struct intel_lvds_connector *lvds_connector =
|
||||||
to_lvds_connector(connector);
|
to_lvds_connector(connector);
|
||||||
|
|
||||||
if (lvds_connector->lid_notifier.notifier_call)
|
|
||||||
acpi_lid_notifier_unregister(&lvds_connector->lid_notifier);
|
|
||||||
|
|
||||||
if (!IS_ERR_OR_NULL(lvds_connector->base.edid))
|
if (!IS_ERR_OR_NULL(lvds_connector->base.edid))
|
||||||
kfree(lvds_connector->base.edid);
|
kfree(lvds_connector->base.edid);
|
||||||
|
|
||||||
@ -609,8 +636,8 @@ static const struct drm_connector_funcs intel_lvds_connector_funcs = {
|
|||||||
.fill_modes = drm_helper_probe_single_connector_modes,
|
.fill_modes = drm_helper_probe_single_connector_modes,
|
||||||
.atomic_get_property = intel_digital_connector_atomic_get_property,
|
.atomic_get_property = intel_digital_connector_atomic_get_property,
|
||||||
.atomic_set_property = intel_digital_connector_atomic_set_property,
|
.atomic_set_property = intel_digital_connector_atomic_set_property,
|
||||||
.late_register = intel_connector_register,
|
.late_register = intel_lvds_connector_register,
|
||||||
.early_unregister = intel_connector_unregister,
|
.early_unregister = intel_lvds_connector_unregister,
|
||||||
.destroy = intel_lvds_destroy,
|
.destroy = intel_lvds_destroy,
|
||||||
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
|
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
|
||||||
.atomic_duplicate_state = intel_digital_connector_duplicate_state,
|
.atomic_duplicate_state = intel_digital_connector_duplicate_state,
|
||||||
@ -827,6 +854,14 @@ static const struct dmi_system_id intel_no_lvds[] = {
|
|||||||
DMI_EXACT_MATCH(DMI_BOARD_NAME, "D525MW"),
|
DMI_EXACT_MATCH(DMI_BOARD_NAME, "D525MW"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.callback = intel_no_lvds_dmi_callback,
|
||||||
|
.ident = "Radiant P845",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Radiant Systems Inc"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "P845"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
{ } /* terminating entry */
|
{ } /* terminating entry */
|
||||||
};
|
};
|
||||||
@ -1150,12 +1185,6 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
|
|||||||
|
|
||||||
lvds_encoder->a3_power = lvds & LVDS_A3_POWER_MASK;
|
lvds_encoder->a3_power = lvds & LVDS_A3_POWER_MASK;
|
||||||
|
|
||||||
lvds_connector->lid_notifier.notifier_call = intel_lid_notify;
|
|
||||||
if (acpi_lid_notifier_register(&lvds_connector->lid_notifier)) {
|
|
||||||
DRM_DEBUG_KMS("lid notifier registration failed\n");
|
|
||||||
lvds_connector->lid_notifier.notifier_call = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
|
@ -529,7 +529,7 @@ static irqreturn_t dw_hdmi_top_thread_irq(int irq, void *dev_id)
|
|||||||
if (stat & HDMITX_TOP_INTR_HPD_RISE)
|
if (stat & HDMITX_TOP_INTR_HPD_RISE)
|
||||||
hpd_connected = true;
|
hpd_connected = true;
|
||||||
|
|
||||||
dw_hdmi_setup_rx_sense(dw_hdmi->dev, hpd_connected,
|
dw_hdmi_setup_rx_sense(dw_hdmi->hdmi, hpd_connected,
|
||||||
hpd_connected);
|
hpd_connected);
|
||||||
|
|
||||||
drm_helper_hpd_irq_event(dw_hdmi->encoder.dev);
|
drm_helper_hpd_irq_event(dw_hdmi->encoder.dev);
|
||||||
|
@ -82,7 +82,7 @@ static int sdi_calc_clock_div(struct sdi_device *sdi, unsigned long pclk,
|
|||||||
struct dispc_clock_info *dispc_cinfo)
|
struct dispc_clock_info *dispc_cinfo)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct sdi_clk_calc_ctx ctx = { .sdi = sdi };
|
struct sdi_clk_calc_ctx ctx;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DSS fclk gives us very few possibilities, so finding a good pixel
|
* DSS fclk gives us very few possibilities, so finding a good pixel
|
||||||
@ -95,6 +95,9 @@ static int sdi_calc_clock_div(struct sdi_device *sdi, unsigned long pclk,
|
|||||||
bool ok;
|
bool ok;
|
||||||
|
|
||||||
memset(&ctx, 0, sizeof(ctx));
|
memset(&ctx, 0, sizeof(ctx));
|
||||||
|
|
||||||
|
ctx.sdi = sdi;
|
||||||
|
|
||||||
if (pclk > 1000 * i * i * i)
|
if (pclk > 1000 * i * i * i)
|
||||||
ctx.pck_min = max(pclk - 1000 * i * i * i, 0lu);
|
ctx.pck_min = max(pclk - 1000 * i * i * i, 0lu);
|
||||||
else
|
else
|
||||||
|
@ -733,8 +733,8 @@ static int msc_buffer_win_alloc(struct msc *msc, unsigned int nr_blocks)
|
|||||||
/* Reset the page to write-back before releasing */
|
/* Reset the page to write-back before releasing */
|
||||||
set_memory_wb((unsigned long)win->block[i].bdesc, 1);
|
set_memory_wb((unsigned long)win->block[i].bdesc, 1);
|
||||||
#endif
|
#endif
|
||||||
dma_free_coherent(msc_dev(msc), size, win->block[i].bdesc,
|
dma_free_coherent(msc_dev(msc)->parent->parent, size,
|
||||||
win->block[i].addr);
|
win->block[i].bdesc, win->block[i].addr);
|
||||||
}
|
}
|
||||||
kfree(win);
|
kfree(win);
|
||||||
|
|
||||||
@ -769,7 +769,7 @@ static void msc_buffer_win_free(struct msc *msc, struct msc_window *win)
|
|||||||
/* Reset the page to write-back before releasing */
|
/* Reset the page to write-back before releasing */
|
||||||
set_memory_wb((unsigned long)win->block[i].bdesc, 1);
|
set_memory_wb((unsigned long)win->block[i].bdesc, 1);
|
||||||
#endif
|
#endif
|
||||||
dma_free_coherent(msc_dev(win->msc), PAGE_SIZE,
|
dma_free_coherent(msc_dev(win->msc)->parent->parent, PAGE_SIZE,
|
||||||
win->block[i].bdesc, win->block[i].addr);
|
win->block[i].bdesc, win->block[i].addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <linux/stm.h>
|
#include <linux/stm.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
#include <linux/vmalloc.h>
|
||||||
#include "stm.h"
|
#include "stm.h"
|
||||||
|
|
||||||
#include <uapi/linux/stm.h>
|
#include <uapi/linux/stm.h>
|
||||||
@ -674,7 +675,7 @@ static void stm_device_release(struct device *dev)
|
|||||||
{
|
{
|
||||||
struct stm_device *stm = to_stm_device(dev);
|
struct stm_device *stm = to_stm_device(dev);
|
||||||
|
|
||||||
kfree(stm);
|
vfree(stm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int stm_register_device(struct device *parent, struct stm_data *stm_data,
|
int stm_register_device(struct device *parent, struct stm_data *stm_data,
|
||||||
@ -691,7 +692,7 @@ int stm_register_device(struct device *parent, struct stm_data *stm_data,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
nmasters = stm_data->sw_end - stm_data->sw_start + 1;
|
nmasters = stm_data->sw_end - stm_data->sw_start + 1;
|
||||||
stm = kzalloc(sizeof(*stm) + nmasters * sizeof(void *), GFP_KERNEL);
|
stm = vzalloc(sizeof(*stm) + nmasters * sizeof(void *));
|
||||||
if (!stm)
|
if (!stm)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
@ -744,7 +745,7 @@ int stm_register_device(struct device *parent, struct stm_data *stm_data,
|
|||||||
/* matches device_initialize() above */
|
/* matches device_initialize() above */
|
||||||
put_device(&stm->dev);
|
put_device(&stm->dev);
|
||||||
err_free:
|
err_free:
|
||||||
kfree(stm);
|
vfree(stm);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* i2c-ocores.c: I2C bus driver for OpenCores I2C controller
|
* i2c-ocores.c: I2C bus driver for OpenCores I2C controller
|
||||||
* (http://www.opencores.org/projects.cgi/web/i2c/overview).
|
* (https://opencores.org/project/i2c/overview)
|
||||||
*
|
*
|
||||||
* Peter Korsgaard <jacmet@sunsite.dk>
|
* Peter Korsgaard <jacmet@sunsite.dk>
|
||||||
*
|
*
|
||||||
|
@ -158,6 +158,7 @@ config AT91_SAMA5D2_ADC
|
|||||||
depends on ARCH_AT91 || COMPILE_TEST
|
depends on ARCH_AT91 || COMPILE_TEST
|
||||||
depends on HAS_IOMEM
|
depends on HAS_IOMEM
|
||||||
depends on HAS_DMA
|
depends on HAS_DMA
|
||||||
|
select IIO_BUFFER
|
||||||
select IIO_TRIGGERED_BUFFER
|
select IIO_TRIGGERED_BUFFER
|
||||||
help
|
help
|
||||||
Say yes here to build support for Atmel SAMA5D2 ADC which is
|
Say yes here to build support for Atmel SAMA5D2 ADC which is
|
||||||
|
@ -348,55 +348,6 @@ static const u16 ad7793_sample_freq_avail[16] = {0, 470, 242, 123, 62, 50, 39,
|
|||||||
static const u16 ad7797_sample_freq_avail[16] = {0, 0, 0, 123, 62, 50, 0,
|
static const u16 ad7797_sample_freq_avail[16] = {0, 0, 0, 123, 62, 50, 0,
|
||||||
33, 0, 17, 16, 12, 10, 8, 6, 4};
|
33, 0, 17, 16, 12, 10, 8, 6, 4};
|
||||||
|
|
||||||
static ssize_t ad7793_read_frequency(struct device *dev,
|
|
||||||
struct device_attribute *attr,
|
|
||||||
char *buf)
|
|
||||||
{
|
|
||||||
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
|
|
||||||
struct ad7793_state *st = iio_priv(indio_dev);
|
|
||||||
|
|
||||||
return sprintf(buf, "%d\n",
|
|
||||||
st->chip_info->sample_freq_avail[AD7793_MODE_RATE(st->mode)]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t ad7793_write_frequency(struct device *dev,
|
|
||||||
struct device_attribute *attr,
|
|
||||||
const char *buf,
|
|
||||||
size_t len)
|
|
||||||
{
|
|
||||||
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
|
|
||||||
struct ad7793_state *st = iio_priv(indio_dev);
|
|
||||||
long lval;
|
|
||||||
int i, ret;
|
|
||||||
|
|
||||||
ret = kstrtol(buf, 10, &lval);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (lval == 0)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
if (lval == st->chip_info->sample_freq_avail[i])
|
|
||||||
break;
|
|
||||||
if (i == 16)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
ret = iio_device_claim_direct_mode(indio_dev);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
st->mode &= ~AD7793_MODE_RATE(-1);
|
|
||||||
st->mode |= AD7793_MODE_RATE(i);
|
|
||||||
ad_sd_write_reg(&st->sd, AD7793_REG_MODE, sizeof(st->mode), st->mode);
|
|
||||||
iio_device_release_direct_mode(indio_dev);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
|
|
||||||
ad7793_read_frequency,
|
|
||||||
ad7793_write_frequency);
|
|
||||||
|
|
||||||
static IIO_CONST_ATTR_SAMP_FREQ_AVAIL(
|
static IIO_CONST_ATTR_SAMP_FREQ_AVAIL(
|
||||||
"470 242 123 62 50 39 33 19 17 16 12 10 8 6 4");
|
"470 242 123 62 50 39 33 19 17 16 12 10 8 6 4");
|
||||||
|
|
||||||
@ -424,7 +375,6 @@ static IIO_DEVICE_ATTR_NAMED(in_m_in_scale_available,
|
|||||||
ad7793_show_scale_available, NULL, 0);
|
ad7793_show_scale_available, NULL, 0);
|
||||||
|
|
||||||
static struct attribute *ad7793_attributes[] = {
|
static struct attribute *ad7793_attributes[] = {
|
||||||
&iio_dev_attr_sampling_frequency.dev_attr.attr,
|
|
||||||
&iio_const_attr_sampling_frequency_available.dev_attr.attr,
|
&iio_const_attr_sampling_frequency_available.dev_attr.attr,
|
||||||
&iio_dev_attr_in_m_in_scale_available.dev_attr.attr,
|
&iio_dev_attr_in_m_in_scale_available.dev_attr.attr,
|
||||||
NULL
|
NULL
|
||||||
@ -435,7 +385,6 @@ static const struct attribute_group ad7793_attribute_group = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct attribute *ad7797_attributes[] = {
|
static struct attribute *ad7797_attributes[] = {
|
||||||
&iio_dev_attr_sampling_frequency.dev_attr.attr,
|
|
||||||
&iio_const_attr_sampling_frequency_available_ad7797.dev_attr.attr,
|
&iio_const_attr_sampling_frequency_available_ad7797.dev_attr.attr,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -505,6 +454,10 @@ static int ad7793_read_raw(struct iio_dev *indio_dev,
|
|||||||
*val -= offset;
|
*val -= offset;
|
||||||
}
|
}
|
||||||
return IIO_VAL_INT;
|
return IIO_VAL_INT;
|
||||||
|
case IIO_CHAN_INFO_SAMP_FREQ:
|
||||||
|
*val = st->chip_info
|
||||||
|
->sample_freq_avail[AD7793_MODE_RATE(st->mode)];
|
||||||
|
return IIO_VAL_INT;
|
||||||
}
|
}
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@ -542,6 +495,26 @@ static int ad7793_write_raw(struct iio_dev *indio_dev,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case IIO_CHAN_INFO_SAMP_FREQ:
|
||||||
|
if (!val) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
if (val == st->chip_info->sample_freq_avail[i])
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (i == 16) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
st->mode &= ~AD7793_MODE_RATE(-1);
|
||||||
|
st->mode |= AD7793_MODE_RATE(i);
|
||||||
|
ad_sd_write_reg(&st->sd, AD7793_REG_MODE, sizeof(st->mode),
|
||||||
|
st->mode);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -333,6 +333,27 @@ static const struct iio_chan_spec at91_adc_channels[] = {
|
|||||||
+ AT91_SAMA5D2_DIFF_CHAN_CNT + 1),
|
+ AT91_SAMA5D2_DIFF_CHAN_CNT + 1),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int at91_adc_chan_xlate(struct iio_dev *indio_dev, int chan)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < indio_dev->num_channels; i++) {
|
||||||
|
if (indio_dev->channels[i].scan_index == chan)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct iio_chan_spec const *
|
||||||
|
at91_adc_chan_get(struct iio_dev *indio_dev, int chan)
|
||||||
|
{
|
||||||
|
int index = at91_adc_chan_xlate(indio_dev, chan);
|
||||||
|
|
||||||
|
if (index < 0)
|
||||||
|
return NULL;
|
||||||
|
return indio_dev->channels + index;
|
||||||
|
}
|
||||||
|
|
||||||
static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state)
|
static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state)
|
||||||
{
|
{
|
||||||
struct iio_dev *indio = iio_trigger_get_drvdata(trig);
|
struct iio_dev *indio = iio_trigger_get_drvdata(trig);
|
||||||
@ -350,8 +371,10 @@ static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state)
|
|||||||
at91_adc_writel(st, AT91_SAMA5D2_TRGR, status);
|
at91_adc_writel(st, AT91_SAMA5D2_TRGR, status);
|
||||||
|
|
||||||
for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) {
|
for_each_set_bit(bit, indio->active_scan_mask, indio->num_channels) {
|
||||||
struct iio_chan_spec const *chan = indio->channels + bit;
|
struct iio_chan_spec const *chan = at91_adc_chan_get(indio, bit);
|
||||||
|
|
||||||
|
if (!chan)
|
||||||
|
continue;
|
||||||
if (state) {
|
if (state) {
|
||||||
at91_adc_writel(st, AT91_SAMA5D2_CHER,
|
at91_adc_writel(st, AT91_SAMA5D2_CHER,
|
||||||
BIT(chan->channel));
|
BIT(chan->channel));
|
||||||
@ -448,7 +471,11 @@ static int at91_adc_dma_start(struct iio_dev *indio_dev)
|
|||||||
|
|
||||||
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
||||||
indio_dev->num_channels) {
|
indio_dev->num_channels) {
|
||||||
struct iio_chan_spec const *chan = indio_dev->channels + bit;
|
struct iio_chan_spec const *chan =
|
||||||
|
at91_adc_chan_get(indio_dev, bit);
|
||||||
|
|
||||||
|
if (!chan)
|
||||||
|
continue;
|
||||||
|
|
||||||
st->dma_st.rx_buf_sz += chan->scan_type.storagebits / 8;
|
st->dma_st.rx_buf_sz += chan->scan_type.storagebits / 8;
|
||||||
}
|
}
|
||||||
@ -526,8 +553,11 @@ static int at91_adc_buffer_predisable(struct iio_dev *indio_dev)
|
|||||||
*/
|
*/
|
||||||
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
||||||
indio_dev->num_channels) {
|
indio_dev->num_channels) {
|
||||||
struct iio_chan_spec const *chan = indio_dev->channels + bit;
|
struct iio_chan_spec const *chan =
|
||||||
|
at91_adc_chan_get(indio_dev, bit);
|
||||||
|
|
||||||
|
if (!chan)
|
||||||
|
continue;
|
||||||
if (st->dma_st.dma_chan)
|
if (st->dma_st.dma_chan)
|
||||||
at91_adc_readl(st, chan->address);
|
at91_adc_readl(st, chan->address);
|
||||||
}
|
}
|
||||||
@ -587,8 +617,11 @@ static void at91_adc_trigger_handler_nodma(struct iio_dev *indio_dev,
|
|||||||
|
|
||||||
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
||||||
indio_dev->num_channels) {
|
indio_dev->num_channels) {
|
||||||
struct iio_chan_spec const *chan = indio_dev->channels + bit;
|
struct iio_chan_spec const *chan =
|
||||||
|
at91_adc_chan_get(indio_dev, bit);
|
||||||
|
|
||||||
|
if (!chan)
|
||||||
|
continue;
|
||||||
st->buffer[i] = at91_adc_readl(st, chan->address);
|
st->buffer[i] = at91_adc_readl(st, chan->address);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
@ -144,6 +144,7 @@ static int stm32_dfsdm_set_osrs(struct stm32_dfsdm_filter *fl,
|
|||||||
* Leave as soon as if exact resolution if reached.
|
* Leave as soon as if exact resolution if reached.
|
||||||
* Otherwise the higher resolution below 32 bits is kept.
|
* Otherwise the higher resolution below 32 bits is kept.
|
||||||
*/
|
*/
|
||||||
|
fl->res = 0;
|
||||||
for (fosr = 1; fosr <= DFSDM_MAX_FL_OVERSAMPLING; fosr++) {
|
for (fosr = 1; fosr <= DFSDM_MAX_FL_OVERSAMPLING; fosr++) {
|
||||||
for (iosr = 1; iosr <= DFSDM_MAX_INT_OVERSAMPLING; iosr++) {
|
for (iosr = 1; iosr <= DFSDM_MAX_INT_OVERSAMPLING; iosr++) {
|
||||||
if (fast)
|
if (fast)
|
||||||
@ -193,7 +194,7 @@ static int stm32_dfsdm_set_osrs(struct stm32_dfsdm_filter *fl,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fl->fosr)
|
if (!fl->res)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -770,7 +771,7 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
|
|||||||
struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
|
struct stm32_dfsdm_adc *adc = iio_priv(indio_dev);
|
||||||
struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id];
|
struct stm32_dfsdm_filter *fl = &adc->dfsdm->fl_list[adc->fl_id];
|
||||||
struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[chan->channel];
|
struct stm32_dfsdm_channel *ch = &adc->dfsdm->ch_list[chan->channel];
|
||||||
unsigned int spi_freq = adc->spi_freq;
|
unsigned int spi_freq;
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
|
|
||||||
switch (mask) {
|
switch (mask) {
|
||||||
@ -784,8 +785,18 @@ static int stm32_dfsdm_write_raw(struct iio_dev *indio_dev,
|
|||||||
case IIO_CHAN_INFO_SAMP_FREQ:
|
case IIO_CHAN_INFO_SAMP_FREQ:
|
||||||
if (!val)
|
if (!val)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (ch->src != DFSDM_CHANNEL_SPI_CLOCK_EXTERNAL)
|
|
||||||
|
switch (ch->src) {
|
||||||
|
case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL:
|
||||||
spi_freq = adc->dfsdm->spi_master_freq;
|
spi_freq = adc->dfsdm->spi_master_freq;
|
||||||
|
break;
|
||||||
|
case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_FALLING:
|
||||||
|
case DFSDM_CHANNEL_SPI_CLOCK_INTERNAL_DIV2_RISING:
|
||||||
|
spi_freq = adc->dfsdm->spi_master_freq / 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
spi_freq = adc->spi_freq;
|
||||||
|
}
|
||||||
|
|
||||||
if (spi_freq % val)
|
if (spi_freq % val)
|
||||||
dev_warn(&indio_dev->dev,
|
dev_warn(&indio_dev->dev,
|
||||||
|
@ -587,7 +587,7 @@ EXPORT_SYMBOL_GPL(iio_dma_buffer_set_bytes_per_datum);
|
|||||||
* Should be used as the set_length callback for iio_buffer_access_ops
|
* Should be used as the set_length callback for iio_buffer_access_ops
|
||||||
* struct for DMA buffers.
|
* struct for DMA buffers.
|
||||||
*/
|
*/
|
||||||
int iio_dma_buffer_set_length(struct iio_buffer *buffer, int length)
|
int iio_dma_buffer_set_length(struct iio_buffer *buffer, unsigned int length)
|
||||||
{
|
{
|
||||||
/* Avoid an invalid state */
|
/* Avoid an invalid state */
|
||||||
if (length < 2)
|
if (length < 2)
|
||||||
|
@ -22,11 +22,18 @@ struct iio_kfifo {
|
|||||||
#define iio_to_kfifo(r) container_of(r, struct iio_kfifo, buffer)
|
#define iio_to_kfifo(r) container_of(r, struct iio_kfifo, buffer)
|
||||||
|
|
||||||
static inline int __iio_allocate_kfifo(struct iio_kfifo *buf,
|
static inline int __iio_allocate_kfifo(struct iio_kfifo *buf,
|
||||||
int bytes_per_datum, int length)
|
size_t bytes_per_datum, unsigned int length)
|
||||||
{
|
{
|
||||||
if ((length == 0) || (bytes_per_datum == 0))
|
if ((length == 0) || (bytes_per_datum == 0))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure we don't overflow an unsigned int after kfifo rounds up to
|
||||||
|
* the next power of 2.
|
||||||
|
*/
|
||||||
|
if (roundup_pow_of_two(length) > UINT_MAX / bytes_per_datum)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
return __kfifo_alloc((struct __kfifo *)&buf->kf, length,
|
return __kfifo_alloc((struct __kfifo *)&buf->kf, length,
|
||||||
bytes_per_datum, GFP_KERNEL);
|
bytes_per_datum, GFP_KERNEL);
|
||||||
}
|
}
|
||||||
@ -67,7 +74,7 @@ static int iio_set_bytes_per_datum_kfifo(struct iio_buffer *r, size_t bpd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int iio_set_length_kfifo(struct iio_buffer *r, int length)
|
static int iio_set_length_kfifo(struct iio_buffer *r, unsigned int length)
|
||||||
{
|
{
|
||||||
/* Avoid an invalid state */
|
/* Avoid an invalid state */
|
||||||
if (length < 2)
|
if (length < 2)
|
||||||
|
@ -178,14 +178,14 @@ int hid_sensor_power_state(struct hid_sensor_common *st, bool state)
|
|||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
atomic_set(&st->user_requested_state, state);
|
|
||||||
|
|
||||||
if (atomic_add_unless(&st->runtime_pm_enable, 1, 1))
|
if (atomic_add_unless(&st->runtime_pm_enable, 1, 1))
|
||||||
pm_runtime_enable(&st->pdev->dev);
|
pm_runtime_enable(&st->pdev->dev);
|
||||||
|
|
||||||
if (state)
|
if (state) {
|
||||||
|
atomic_inc(&st->user_requested_state);
|
||||||
ret = pm_runtime_get_sync(&st->pdev->dev);
|
ret = pm_runtime_get_sync(&st->pdev->dev);
|
||||||
else {
|
} else {
|
||||||
|
atomic_dec(&st->user_requested_state);
|
||||||
pm_runtime_mark_last_busy(&st->pdev->dev);
|
pm_runtime_mark_last_busy(&st->pdev->dev);
|
||||||
pm_runtime_use_autosuspend(&st->pdev->dev);
|
pm_runtime_use_autosuspend(&st->pdev->dev);
|
||||||
ret = pm_runtime_put_autosuspend(&st->pdev->dev);
|
ret = pm_runtime_put_autosuspend(&st->pdev->dev);
|
||||||
|
@ -502,7 +502,7 @@ static int __ib_cache_gid_get(struct ib_device *ib_dev, u8 port, int index,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (table->data_vec[index].props & GID_TABLE_ENTRY_INVALID)
|
if (table->data_vec[index].props & GID_TABLE_ENTRY_INVALID)
|
||||||
return -EAGAIN;
|
return -EINVAL;
|
||||||
|
|
||||||
memcpy(gid, &table->data_vec[index].gid, sizeof(*gid));
|
memcpy(gid, &table->data_vec[index].gid, sizeof(*gid));
|
||||||
if (attr) {
|
if (attr) {
|
||||||
|
@ -185,12 +185,65 @@ static void bnxt_re_shutdown(void *p)
|
|||||||
bnxt_re_ib_unreg(rdev, false);
|
bnxt_re_ib_unreg(rdev, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void bnxt_re_stop_irq(void *handle)
|
||||||
|
{
|
||||||
|
struct bnxt_re_dev *rdev = (struct bnxt_re_dev *)handle;
|
||||||
|
struct bnxt_qplib_rcfw *rcfw = &rdev->rcfw;
|
||||||
|
struct bnxt_qplib_nq *nq;
|
||||||
|
int indx;
|
||||||
|
|
||||||
|
for (indx = BNXT_RE_NQ_IDX; indx < rdev->num_msix; indx++) {
|
||||||
|
nq = &rdev->nq[indx - 1];
|
||||||
|
bnxt_qplib_nq_stop_irq(nq, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
bnxt_qplib_rcfw_stop_irq(rcfw, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bnxt_re_start_irq(void *handle, struct bnxt_msix_entry *ent)
|
||||||
|
{
|
||||||
|
struct bnxt_re_dev *rdev = (struct bnxt_re_dev *)handle;
|
||||||
|
struct bnxt_msix_entry *msix_ent = rdev->msix_entries;
|
||||||
|
struct bnxt_qplib_rcfw *rcfw = &rdev->rcfw;
|
||||||
|
struct bnxt_qplib_nq *nq;
|
||||||
|
int indx, rc;
|
||||||
|
|
||||||
|
if (!ent) {
|
||||||
|
/* Not setting the f/w timeout bit in rcfw.
|
||||||
|
* During the driver unload the first command
|
||||||
|
* to f/w will timeout and that will set the
|
||||||
|
* timeout bit.
|
||||||
|
*/
|
||||||
|
dev_err(rdev_to_dev(rdev), "Failed to re-start IRQs\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vectors may change after restart, so update with new vectors
|
||||||
|
* in device sctructure.
|
||||||
|
*/
|
||||||
|
for (indx = 0; indx < rdev->num_msix; indx++)
|
||||||
|
rdev->msix_entries[indx].vector = ent[indx].vector;
|
||||||
|
|
||||||
|
bnxt_qplib_rcfw_start_irq(rcfw, msix_ent[BNXT_RE_AEQ_IDX].vector,
|
||||||
|
false);
|
||||||
|
for (indx = BNXT_RE_NQ_IDX ; indx < rdev->num_msix; indx++) {
|
||||||
|
nq = &rdev->nq[indx - 1];
|
||||||
|
rc = bnxt_qplib_nq_start_irq(nq, indx - 1,
|
||||||
|
msix_ent[indx].vector, false);
|
||||||
|
if (rc)
|
||||||
|
dev_warn(rdev_to_dev(rdev),
|
||||||
|
"Failed to reinit NQ index %d\n", indx - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct bnxt_ulp_ops bnxt_re_ulp_ops = {
|
static struct bnxt_ulp_ops bnxt_re_ulp_ops = {
|
||||||
.ulp_async_notifier = NULL,
|
.ulp_async_notifier = NULL,
|
||||||
.ulp_stop = bnxt_re_stop,
|
.ulp_stop = bnxt_re_stop,
|
||||||
.ulp_start = bnxt_re_start,
|
.ulp_start = bnxt_re_start,
|
||||||
.ulp_sriov_config = bnxt_re_sriov_config,
|
.ulp_sriov_config = bnxt_re_sriov_config,
|
||||||
.ulp_shutdown = bnxt_re_shutdown
|
.ulp_shutdown = bnxt_re_shutdown,
|
||||||
|
.ulp_irq_stop = bnxt_re_stop_irq,
|
||||||
|
.ulp_irq_restart = bnxt_re_start_irq
|
||||||
};
|
};
|
||||||
|
|
||||||
/* RoCE -> Net driver */
|
/* RoCE -> Net driver */
|
||||||
|
@ -336,22 +336,32 @@ static irqreturn_t bnxt_qplib_nq_irq(int irq, void *dev_instance)
|
|||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bnxt_qplib_nq_stop_irq(struct bnxt_qplib_nq *nq, bool kill)
|
||||||
|
{
|
||||||
|
tasklet_disable(&nq->worker);
|
||||||
|
/* Mask h/w interrupt */
|
||||||
|
NQ_DB(nq->bar_reg_iomem, nq->hwq.cons, nq->hwq.max_elements);
|
||||||
|
/* Sync with last running IRQ handler */
|
||||||
|
synchronize_irq(nq->vector);
|
||||||
|
if (kill)
|
||||||
|
tasklet_kill(&nq->worker);
|
||||||
|
if (nq->requested) {
|
||||||
|
irq_set_affinity_hint(nq->vector, NULL);
|
||||||
|
free_irq(nq->vector, nq);
|
||||||
|
nq->requested = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void bnxt_qplib_disable_nq(struct bnxt_qplib_nq *nq)
|
void bnxt_qplib_disable_nq(struct bnxt_qplib_nq *nq)
|
||||||
{
|
{
|
||||||
if (nq->cqn_wq) {
|
if (nq->cqn_wq) {
|
||||||
destroy_workqueue(nq->cqn_wq);
|
destroy_workqueue(nq->cqn_wq);
|
||||||
nq->cqn_wq = NULL;
|
nq->cqn_wq = NULL;
|
||||||
}
|
}
|
||||||
/* Make sure the HW is stopped! */
|
|
||||||
synchronize_irq(nq->vector);
|
|
||||||
tasklet_disable(&nq->worker);
|
|
||||||
tasklet_kill(&nq->worker);
|
|
||||||
|
|
||||||
if (nq->requested) {
|
/* Make sure the HW is stopped! */
|
||||||
irq_set_affinity_hint(nq->vector, NULL);
|
bnxt_qplib_nq_stop_irq(nq, true);
|
||||||
free_irq(nq->vector, nq);
|
|
||||||
nq->requested = false;
|
|
||||||
}
|
|
||||||
if (nq->bar_reg_iomem)
|
if (nq->bar_reg_iomem)
|
||||||
iounmap(nq->bar_reg_iomem);
|
iounmap(nq->bar_reg_iomem);
|
||||||
nq->bar_reg_iomem = NULL;
|
nq->bar_reg_iomem = NULL;
|
||||||
@ -361,6 +371,40 @@ void bnxt_qplib_disable_nq(struct bnxt_qplib_nq *nq)
|
|||||||
nq->vector = 0;
|
nq->vector = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bnxt_qplib_nq_start_irq(struct bnxt_qplib_nq *nq, int nq_indx,
|
||||||
|
int msix_vector, bool need_init)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (nq->requested)
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
nq->vector = msix_vector;
|
||||||
|
if (need_init)
|
||||||
|
tasklet_init(&nq->worker, bnxt_qplib_service_nq,
|
||||||
|
(unsigned long)nq);
|
||||||
|
else
|
||||||
|
tasklet_enable(&nq->worker);
|
||||||
|
|
||||||
|
snprintf(nq->name, sizeof(nq->name), "bnxt_qplib_nq-%d", nq_indx);
|
||||||
|
rc = request_irq(nq->vector, bnxt_qplib_nq_irq, 0, nq->name, nq);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
cpumask_clear(&nq->mask);
|
||||||
|
cpumask_set_cpu(nq_indx, &nq->mask);
|
||||||
|
rc = irq_set_affinity_hint(nq->vector, &nq->mask);
|
||||||
|
if (rc) {
|
||||||
|
dev_warn(&nq->pdev->dev,
|
||||||
|
"QPLIB: set affinity failed; vector: %d nq_idx: %d\n",
|
||||||
|
nq->vector, nq_indx);
|
||||||
|
}
|
||||||
|
nq->requested = true;
|
||||||
|
NQ_DB_REARM(nq->bar_reg_iomem, nq->hwq.cons, nq->hwq.max_elements);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
int bnxt_qplib_enable_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq,
|
int bnxt_qplib_enable_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq,
|
||||||
int nq_idx, int msix_vector, int bar_reg_offset,
|
int nq_idx, int msix_vector, int bar_reg_offset,
|
||||||
int (*cqn_handler)(struct bnxt_qplib_nq *nq,
|
int (*cqn_handler)(struct bnxt_qplib_nq *nq,
|
||||||
@ -372,41 +416,17 @@ int bnxt_qplib_enable_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq,
|
|||||||
resource_size_t nq_base;
|
resource_size_t nq_base;
|
||||||
int rc = -1;
|
int rc = -1;
|
||||||
|
|
||||||
nq->pdev = pdev;
|
|
||||||
nq->vector = msix_vector;
|
|
||||||
if (cqn_handler)
|
if (cqn_handler)
|
||||||
nq->cqn_handler = cqn_handler;
|
nq->cqn_handler = cqn_handler;
|
||||||
|
|
||||||
if (srqn_handler)
|
if (srqn_handler)
|
||||||
nq->srqn_handler = srqn_handler;
|
nq->srqn_handler = srqn_handler;
|
||||||
|
|
||||||
tasklet_init(&nq->worker, bnxt_qplib_service_nq, (unsigned long)nq);
|
|
||||||
|
|
||||||
/* Have a task to schedule CQ notifiers in post send case */
|
/* Have a task to schedule CQ notifiers in post send case */
|
||||||
nq->cqn_wq = create_singlethread_workqueue("bnxt_qplib_nq");
|
nq->cqn_wq = create_singlethread_workqueue("bnxt_qplib_nq");
|
||||||
if (!nq->cqn_wq)
|
if (!nq->cqn_wq)
|
||||||
goto fail;
|
return -ENOMEM;
|
||||||
|
|
||||||
nq->requested = false;
|
|
||||||
memset(nq->name, 0, 32);
|
|
||||||
sprintf(nq->name, "bnxt_qplib_nq-%d", nq_idx);
|
|
||||||
rc = request_irq(nq->vector, bnxt_qplib_nq_irq, 0, nq->name, nq);
|
|
||||||
if (rc) {
|
|
||||||
dev_err(&nq->pdev->dev,
|
|
||||||
"Failed to request IRQ for NQ: %#x", rc);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpumask_clear(&nq->mask);
|
|
||||||
cpumask_set_cpu(nq_idx, &nq->mask);
|
|
||||||
rc = irq_set_affinity_hint(nq->vector, &nq->mask);
|
|
||||||
if (rc) {
|
|
||||||
dev_warn(&nq->pdev->dev,
|
|
||||||
"QPLIB: set affinity failed; vector: %d nq_idx: %d\n",
|
|
||||||
nq->vector, nq_idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
nq->requested = true;
|
|
||||||
nq->bar_reg = NQ_CONS_PCI_BAR_REGION;
|
nq->bar_reg = NQ_CONS_PCI_BAR_REGION;
|
||||||
nq->bar_reg_off = bar_reg_offset;
|
nq->bar_reg_off = bar_reg_offset;
|
||||||
nq_base = pci_resource_start(pdev, nq->bar_reg);
|
nq_base = pci_resource_start(pdev, nq->bar_reg);
|
||||||
@ -419,7 +439,13 @@ int bnxt_qplib_enable_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq,
|
|||||||
rc = -ENOMEM;
|
rc = -ENOMEM;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
NQ_DB_REARM(nq->bar_reg_iomem, nq->hwq.cons, nq->hwq.max_elements);
|
|
||||||
|
rc = bnxt_qplib_nq_start_irq(nq, nq_idx, msix_vector, true);
|
||||||
|
if (rc) {
|
||||||
|
dev_err(&nq->pdev->dev,
|
||||||
|
"QPLIB: Failed to request irq for nq-idx %d", nq_idx);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
fail:
|
fail:
|
||||||
|
@ -467,7 +467,10 @@ struct bnxt_qplib_nq_work {
|
|||||||
struct bnxt_qplib_cq *cq;
|
struct bnxt_qplib_cq *cq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void bnxt_qplib_nq_stop_irq(struct bnxt_qplib_nq *nq, bool kill);
|
||||||
void bnxt_qplib_disable_nq(struct bnxt_qplib_nq *nq);
|
void bnxt_qplib_disable_nq(struct bnxt_qplib_nq *nq);
|
||||||
|
int bnxt_qplib_nq_start_irq(struct bnxt_qplib_nq *nq, int nq_indx,
|
||||||
|
int msix_vector, bool need_init);
|
||||||
int bnxt_qplib_enable_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq,
|
int bnxt_qplib_enable_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq,
|
||||||
int nq_idx, int msix_vector, int bar_reg_offset,
|
int nq_idx, int msix_vector, int bar_reg_offset,
|
||||||
int (*cqn_handler)(struct bnxt_qplib_nq *nq,
|
int (*cqn_handler)(struct bnxt_qplib_nq *nq,
|
||||||
|
@ -582,19 +582,29 @@ int bnxt_qplib_alloc_rcfw_channel(struct pci_dev *pdev,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bnxt_qplib_disable_rcfw_channel(struct bnxt_qplib_rcfw *rcfw)
|
void bnxt_qplib_rcfw_stop_irq(struct bnxt_qplib_rcfw *rcfw, bool kill)
|
||||||
{
|
{
|
||||||
unsigned long indx;
|
|
||||||
|
|
||||||
/* Make sure the HW channel is stopped! */
|
|
||||||
synchronize_irq(rcfw->vector);
|
|
||||||
tasklet_disable(&rcfw->worker);
|
tasklet_disable(&rcfw->worker);
|
||||||
tasklet_kill(&rcfw->worker);
|
/* Mask h/w interrupts */
|
||||||
|
CREQ_DB(rcfw->creq_bar_reg_iomem, rcfw->creq.cons,
|
||||||
|
rcfw->creq.max_elements);
|
||||||
|
/* Sync with last running IRQ-handler */
|
||||||
|
synchronize_irq(rcfw->vector);
|
||||||
|
if (kill)
|
||||||
|
tasklet_kill(&rcfw->worker);
|
||||||
|
|
||||||
if (rcfw->requested) {
|
if (rcfw->requested) {
|
||||||
free_irq(rcfw->vector, rcfw);
|
free_irq(rcfw->vector, rcfw);
|
||||||
rcfw->requested = false;
|
rcfw->requested = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void bnxt_qplib_disable_rcfw_channel(struct bnxt_qplib_rcfw *rcfw)
|
||||||
|
{
|
||||||
|
unsigned long indx;
|
||||||
|
|
||||||
|
bnxt_qplib_rcfw_stop_irq(rcfw, true);
|
||||||
|
|
||||||
if (rcfw->cmdq_bar_reg_iomem)
|
if (rcfw->cmdq_bar_reg_iomem)
|
||||||
iounmap(rcfw->cmdq_bar_reg_iomem);
|
iounmap(rcfw->cmdq_bar_reg_iomem);
|
||||||
rcfw->cmdq_bar_reg_iomem = NULL;
|
rcfw->cmdq_bar_reg_iomem = NULL;
|
||||||
@ -614,6 +624,31 @@ void bnxt_qplib_disable_rcfw_channel(struct bnxt_qplib_rcfw *rcfw)
|
|||||||
rcfw->vector = 0;
|
rcfw->vector = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bnxt_qplib_rcfw_start_irq(struct bnxt_qplib_rcfw *rcfw, int msix_vector,
|
||||||
|
bool need_init)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (rcfw->requested)
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
rcfw->vector = msix_vector;
|
||||||
|
if (need_init)
|
||||||
|
tasklet_init(&rcfw->worker,
|
||||||
|
bnxt_qplib_service_creq, (unsigned long)rcfw);
|
||||||
|
else
|
||||||
|
tasklet_enable(&rcfw->worker);
|
||||||
|
rc = request_irq(rcfw->vector, bnxt_qplib_creq_irq, 0,
|
||||||
|
"bnxt_qplib_creq", rcfw);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
rcfw->requested = true;
|
||||||
|
CREQ_DB_REARM(rcfw->creq_bar_reg_iomem, rcfw->creq.cons,
|
||||||
|
rcfw->creq.max_elements);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int bnxt_qplib_enable_rcfw_channel(struct pci_dev *pdev,
|
int bnxt_qplib_enable_rcfw_channel(struct pci_dev *pdev,
|
||||||
struct bnxt_qplib_rcfw *rcfw,
|
struct bnxt_qplib_rcfw *rcfw,
|
||||||
int msix_vector,
|
int msix_vector,
|
||||||
@ -675,27 +710,17 @@ int bnxt_qplib_enable_rcfw_channel(struct pci_dev *pdev,
|
|||||||
rcfw->creq_qp_event_processed = 0;
|
rcfw->creq_qp_event_processed = 0;
|
||||||
rcfw->creq_func_event_processed = 0;
|
rcfw->creq_func_event_processed = 0;
|
||||||
|
|
||||||
rcfw->vector = msix_vector;
|
|
||||||
if (aeq_handler)
|
if (aeq_handler)
|
||||||
rcfw->aeq_handler = aeq_handler;
|
rcfw->aeq_handler = aeq_handler;
|
||||||
|
init_waitqueue_head(&rcfw->waitq);
|
||||||
|
|
||||||
tasklet_init(&rcfw->worker, bnxt_qplib_service_creq,
|
rc = bnxt_qplib_rcfw_start_irq(rcfw, msix_vector, true);
|
||||||
(unsigned long)rcfw);
|
|
||||||
|
|
||||||
rcfw->requested = false;
|
|
||||||
rc = request_irq(rcfw->vector, bnxt_qplib_creq_irq, 0,
|
|
||||||
"bnxt_qplib_creq", rcfw);
|
|
||||||
if (rc) {
|
if (rc) {
|
||||||
dev_err(&rcfw->pdev->dev,
|
dev_err(&rcfw->pdev->dev,
|
||||||
"QPLIB: Failed to request IRQ for CREQ rc = 0x%x", rc);
|
"QPLIB: Failed to request IRQ for CREQ rc = 0x%x", rc);
|
||||||
bnxt_qplib_disable_rcfw_channel(rcfw);
|
bnxt_qplib_disable_rcfw_channel(rcfw);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
rcfw->requested = true;
|
|
||||||
|
|
||||||
init_waitqueue_head(&rcfw->waitq);
|
|
||||||
|
|
||||||
CREQ_DB_REARM(rcfw->creq_bar_reg_iomem, 0, rcfw->creq.max_elements);
|
|
||||||
|
|
||||||
init.cmdq_pbl = cpu_to_le64(rcfw->cmdq.pbl[PBL_LVL_0].pg_map_arr[0]);
|
init.cmdq_pbl = cpu_to_le64(rcfw->cmdq.pbl[PBL_LVL_0].pg_map_arr[0]);
|
||||||
init.cmdq_size_cmdq_lvl = cpu_to_le16(
|
init.cmdq_size_cmdq_lvl = cpu_to_le16(
|
||||||
|
@ -195,7 +195,10 @@ struct bnxt_qplib_rcfw {
|
|||||||
void bnxt_qplib_free_rcfw_channel(struct bnxt_qplib_rcfw *rcfw);
|
void bnxt_qplib_free_rcfw_channel(struct bnxt_qplib_rcfw *rcfw);
|
||||||
int bnxt_qplib_alloc_rcfw_channel(struct pci_dev *pdev,
|
int bnxt_qplib_alloc_rcfw_channel(struct pci_dev *pdev,
|
||||||
struct bnxt_qplib_rcfw *rcfw, int qp_tbl_sz);
|
struct bnxt_qplib_rcfw *rcfw, int qp_tbl_sz);
|
||||||
|
void bnxt_qplib_rcfw_stop_irq(struct bnxt_qplib_rcfw *rcfw, bool kill);
|
||||||
void bnxt_qplib_disable_rcfw_channel(struct bnxt_qplib_rcfw *rcfw);
|
void bnxt_qplib_disable_rcfw_channel(struct bnxt_qplib_rcfw *rcfw);
|
||||||
|
int bnxt_qplib_rcfw_start_irq(struct bnxt_qplib_rcfw *rcfw, int msix_vector,
|
||||||
|
bool need_init);
|
||||||
int bnxt_qplib_enable_rcfw_channel(struct pci_dev *pdev,
|
int bnxt_qplib_enable_rcfw_channel(struct pci_dev *pdev,
|
||||||
struct bnxt_qplib_rcfw *rcfw,
|
struct bnxt_qplib_rcfw *rcfw,
|
||||||
int msix_vector,
|
int msix_vector,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
config INFINIBAND_SRPT
|
config INFINIBAND_SRPT
|
||||||
tristate "InfiniBand SCSI RDMA Protocol target support"
|
tristate "InfiniBand SCSI RDMA Protocol target support"
|
||||||
depends on INFINIBAND_ADDR_TRANS && TARGET_CORE
|
depends on INFINIBAND && INFINIBAND_ADDR_TRANS && TARGET_CORE
|
||||||
---help---
|
---help---
|
||||||
|
|
||||||
Support for the SCSI RDMA Protocol (SRP) Target driver. The
|
Support for the SCSI RDMA Protocol (SRP) Target driver. The
|
||||||
|
@ -130,7 +130,7 @@ static int elan_smbus_get_baseline_data(struct i2c_client *client,
|
|||||||
bool max_baseline, u8 *value)
|
bool max_baseline, u8 *value)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
|
|
||||||
error = i2c_smbus_read_block_data(client,
|
error = i2c_smbus_read_block_data(client,
|
||||||
max_baseline ?
|
max_baseline ?
|
||||||
@ -149,7 +149,7 @@ static int elan_smbus_get_version(struct i2c_client *client,
|
|||||||
bool iap, u8 *version)
|
bool iap, u8 *version)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
|
|
||||||
error = i2c_smbus_read_block_data(client,
|
error = i2c_smbus_read_block_data(client,
|
||||||
iap ? ETP_SMBUS_IAP_VERSION_CMD :
|
iap ? ETP_SMBUS_IAP_VERSION_CMD :
|
||||||
@ -170,7 +170,7 @@ static int elan_smbus_get_sm_version(struct i2c_client *client,
|
|||||||
u8 *clickpad)
|
u8 *clickpad)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
|
|
||||||
error = i2c_smbus_read_block_data(client,
|
error = i2c_smbus_read_block_data(client,
|
||||||
ETP_SMBUS_SM_VERSION_CMD, val);
|
ETP_SMBUS_SM_VERSION_CMD, val);
|
||||||
@ -188,7 +188,7 @@ static int elan_smbus_get_sm_version(struct i2c_client *client,
|
|||||||
static int elan_smbus_get_product_id(struct i2c_client *client, u16 *id)
|
static int elan_smbus_get_product_id(struct i2c_client *client, u16 *id)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
|
|
||||||
error = i2c_smbus_read_block_data(client,
|
error = i2c_smbus_read_block_data(client,
|
||||||
ETP_SMBUS_UNIQUEID_CMD, val);
|
ETP_SMBUS_UNIQUEID_CMD, val);
|
||||||
@ -205,7 +205,7 @@ static int elan_smbus_get_checksum(struct i2c_client *client,
|
|||||||
bool iap, u16 *csum)
|
bool iap, u16 *csum)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
|
|
||||||
error = i2c_smbus_read_block_data(client,
|
error = i2c_smbus_read_block_data(client,
|
||||||
iap ? ETP_SMBUS_FW_CHECKSUM_CMD :
|
iap ? ETP_SMBUS_FW_CHECKSUM_CMD :
|
||||||
@ -226,7 +226,7 @@ static int elan_smbus_get_max(struct i2c_client *client,
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int error;
|
int error;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
|
|
||||||
ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val);
|
ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val);
|
||||||
if (ret != 3) {
|
if (ret != 3) {
|
||||||
@ -246,7 +246,7 @@ static int elan_smbus_get_resolution(struct i2c_client *client,
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int error;
|
int error;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
|
|
||||||
ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RESOLUTION_CMD, val);
|
ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RESOLUTION_CMD, val);
|
||||||
if (ret != 3) {
|
if (ret != 3) {
|
||||||
@ -267,7 +267,7 @@ static int elan_smbus_get_num_traces(struct i2c_client *client,
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int error;
|
int error;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
|
|
||||||
ret = i2c_smbus_read_block_data(client, ETP_SMBUS_XY_TRACENUM_CMD, val);
|
ret = i2c_smbus_read_block_data(client, ETP_SMBUS_XY_TRACENUM_CMD, val);
|
||||||
if (ret != 3) {
|
if (ret != 3) {
|
||||||
@ -294,7 +294,7 @@ static int elan_smbus_iap_get_mode(struct i2c_client *client,
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
u16 constant;
|
u16 constant;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
|
|
||||||
error = i2c_smbus_read_block_data(client, ETP_SMBUS_IAP_CTRL_CMD, val);
|
error = i2c_smbus_read_block_data(client, ETP_SMBUS_IAP_CTRL_CMD, val);
|
||||||
if (error < 0) {
|
if (error < 0) {
|
||||||
@ -345,7 +345,7 @@ static int elan_smbus_prepare_fw_update(struct i2c_client *client)
|
|||||||
int len;
|
int len;
|
||||||
int error;
|
int error;
|
||||||
enum tp_mode mode;
|
enum tp_mode mode;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
u8 cmd[4] = {0x0F, 0x78, 0x00, 0x06};
|
u8 cmd[4] = {0x0F, 0x78, 0x00, 0x06};
|
||||||
u16 password;
|
u16 password;
|
||||||
|
|
||||||
@ -419,7 +419,7 @@ static int elan_smbus_write_fw_block(struct i2c_client *client,
|
|||||||
struct device *dev = &client->dev;
|
struct device *dev = &client->dev;
|
||||||
int error;
|
int error;
|
||||||
u16 result;
|
u16 result;
|
||||||
u8 val[3];
|
u8 val[I2C_SMBUS_BLOCK_MAX] = {0};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Due to the limitation of smbus protocol limiting
|
* Due to the limitation of smbus protocol limiting
|
||||||
|
@ -172,6 +172,12 @@ static const char * const smbus_pnp_ids[] = {
|
|||||||
"LEN0048", /* X1 Carbon 3 */
|
"LEN0048", /* X1 Carbon 3 */
|
||||||
"LEN0046", /* X250 */
|
"LEN0046", /* X250 */
|
||||||
"LEN004a", /* W541 */
|
"LEN004a", /* W541 */
|
||||||
|
"LEN0071", /* T480 */
|
||||||
|
"LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */
|
||||||
|
"LEN0073", /* X1 Carbon G5 (Elantech) */
|
||||||
|
"LEN0092", /* X1 Carbon 6 */
|
||||||
|
"LEN0096", /* X280 */
|
||||||
|
"LEN0097", /* X280 -> ALPS trackpoint */
|
||||||
"LEN200f", /* T450s */
|
"LEN200f", /* T450s */
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
@ -1767,6 +1767,18 @@ static const struct b53_chip_data b53_switch_chips[] = {
|
|||||||
.cpu_port = B53_CPU_PORT_25,
|
.cpu_port = B53_CPU_PORT_25,
|
||||||
.duplex_reg = B53_DUPLEX_STAT_FE,
|
.duplex_reg = B53_DUPLEX_STAT_FE,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.chip_id = BCM5389_DEVICE_ID,
|
||||||
|
.dev_name = "BCM5389",
|
||||||
|
.vlans = 4096,
|
||||||
|
.enabled_ports = 0x1f,
|
||||||
|
.arl_entries = 4,
|
||||||
|
.cpu_port = B53_CPU_PORT,
|
||||||
|
.vta_regs = B53_VTA_REGS,
|
||||||
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
||||||
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
||||||
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.chip_id = BCM5395_DEVICE_ID,
|
.chip_id = BCM5395_DEVICE_ID,
|
||||||
.dev_name = "BCM5395",
|
.dev_name = "BCM5395",
|
||||||
@ -2099,6 +2111,7 @@ int b53_switch_detect(struct b53_device *dev)
|
|||||||
else
|
else
|
||||||
dev->chip_id = BCM5365_DEVICE_ID;
|
dev->chip_id = BCM5365_DEVICE_ID;
|
||||||
break;
|
break;
|
||||||
|
case BCM5389_DEVICE_ID:
|
||||||
case BCM5395_DEVICE_ID:
|
case BCM5395_DEVICE_ID:
|
||||||
case BCM5397_DEVICE_ID:
|
case BCM5397_DEVICE_ID:
|
||||||
case BCM5398_DEVICE_ID:
|
case BCM5398_DEVICE_ID:
|
||||||
|
@ -285,6 +285,7 @@ static const struct b53_io_ops b53_mdio_ops = {
|
|||||||
#define B53_BRCM_OUI_1 0x0143bc00
|
#define B53_BRCM_OUI_1 0x0143bc00
|
||||||
#define B53_BRCM_OUI_2 0x03625c00
|
#define B53_BRCM_OUI_2 0x03625c00
|
||||||
#define B53_BRCM_OUI_3 0x00406000
|
#define B53_BRCM_OUI_3 0x00406000
|
||||||
|
#define B53_BRCM_OUI_4 0x01410c00
|
||||||
|
|
||||||
static int b53_mdio_probe(struct mdio_device *mdiodev)
|
static int b53_mdio_probe(struct mdio_device *mdiodev)
|
||||||
{
|
{
|
||||||
@ -311,7 +312,8 @@ static int b53_mdio_probe(struct mdio_device *mdiodev)
|
|||||||
*/
|
*/
|
||||||
if ((phy_id & 0xfffffc00) != B53_BRCM_OUI_1 &&
|
if ((phy_id & 0xfffffc00) != B53_BRCM_OUI_1 &&
|
||||||
(phy_id & 0xfffffc00) != B53_BRCM_OUI_2 &&
|
(phy_id & 0xfffffc00) != B53_BRCM_OUI_2 &&
|
||||||
(phy_id & 0xfffffc00) != B53_BRCM_OUI_3) {
|
(phy_id & 0xfffffc00) != B53_BRCM_OUI_3 &&
|
||||||
|
(phy_id & 0xfffffc00) != B53_BRCM_OUI_4) {
|
||||||
dev_err(&mdiodev->dev, "Unsupported device: 0x%08x\n", phy_id);
|
dev_err(&mdiodev->dev, "Unsupported device: 0x%08x\n", phy_id);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
@ -360,6 +362,7 @@ static const struct of_device_id b53_of_match[] = {
|
|||||||
{ .compatible = "brcm,bcm53125" },
|
{ .compatible = "brcm,bcm53125" },
|
||||||
{ .compatible = "brcm,bcm53128" },
|
{ .compatible = "brcm,bcm53128" },
|
||||||
{ .compatible = "brcm,bcm5365" },
|
{ .compatible = "brcm,bcm5365" },
|
||||||
|
{ .compatible = "brcm,bcm5389" },
|
||||||
{ .compatible = "brcm,bcm5395" },
|
{ .compatible = "brcm,bcm5395" },
|
||||||
{ .compatible = "brcm,bcm5397" },
|
{ .compatible = "brcm,bcm5397" },
|
||||||
{ .compatible = "brcm,bcm5398" },
|
{ .compatible = "brcm,bcm5398" },
|
||||||
|
@ -48,6 +48,7 @@ struct b53_io_ops {
|
|||||||
enum {
|
enum {
|
||||||
BCM5325_DEVICE_ID = 0x25,
|
BCM5325_DEVICE_ID = 0x25,
|
||||||
BCM5365_DEVICE_ID = 0x65,
|
BCM5365_DEVICE_ID = 0x65,
|
||||||
|
BCM5389_DEVICE_ID = 0x89,
|
||||||
BCM5395_DEVICE_ID = 0x95,
|
BCM5395_DEVICE_ID = 0x95,
|
||||||
BCM5397_DEVICE_ID = 0x97,
|
BCM5397_DEVICE_ID = 0x97,
|
||||||
BCM5398_DEVICE_ID = 0x98,
|
BCM5398_DEVICE_ID = 0x98,
|
||||||
|
@ -3309,7 +3309,9 @@ void be_detect_error(struct be_adapter *adapter)
|
|||||||
if ((val & POST_STAGE_FAT_LOG_START)
|
if ((val & POST_STAGE_FAT_LOG_START)
|
||||||
!= POST_STAGE_FAT_LOG_START &&
|
!= POST_STAGE_FAT_LOG_START &&
|
||||||
(val & POST_STAGE_ARMFW_UE)
|
(val & POST_STAGE_ARMFW_UE)
|
||||||
!= POST_STAGE_ARMFW_UE)
|
!= POST_STAGE_ARMFW_UE &&
|
||||||
|
(val & POST_STAGE_RECOVERABLE_ERR)
|
||||||
|
!= POST_STAGE_RECOVERABLE_ERR)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9049,7 +9049,6 @@ static int parse_tc_actions(struct ixgbe_adapter *adapter,
|
|||||||
{
|
{
|
||||||
const struct tc_action *a;
|
const struct tc_action *a;
|
||||||
LIST_HEAD(actions);
|
LIST_HEAD(actions);
|
||||||
int err;
|
|
||||||
|
|
||||||
if (!tcf_exts_has_actions(exts))
|
if (!tcf_exts_has_actions(exts))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -9070,11 +9069,11 @@ static int parse_tc_actions(struct ixgbe_adapter *adapter,
|
|||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
err = handle_redirect_action(adapter, dev->ifindex, queue,
|
return handle_redirect_action(adapter, dev->ifindex,
|
||||||
action);
|
queue, action);
|
||||||
if (err == 0)
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -4422,6 +4422,11 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev,
|
|||||||
NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on an OVS port");
|
NL_SET_ERR_MSG_MOD(extack, "Can not put a VLAN on an OVS port");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
if (is_vlan_dev(upper_dev) &&
|
||||||
|
vlan_dev_vlan_id(upper_dev) == 1) {
|
||||||
|
NL_SET_ERR_MSG_MOD(extack, "Creating a VLAN device with VID 1 is unsupported: VLAN 1 carries untagged traffic");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case NETDEV_CHANGEUPPER:
|
case NETDEV_CHANGEUPPER:
|
||||||
upper_dev = info->upper_dev;
|
upper_dev = info->upper_dev;
|
||||||
|
@ -84,7 +84,7 @@ static int sonic_open(struct net_device *dev)
|
|||||||
for (i = 0; i < SONIC_NUM_RRS; i++) {
|
for (i = 0; i < SONIC_NUM_RRS; i++) {
|
||||||
dma_addr_t laddr = dma_map_single(lp->device, skb_put(lp->rx_skb[i], SONIC_RBSIZE),
|
dma_addr_t laddr = dma_map_single(lp->device, skb_put(lp->rx_skb[i], SONIC_RBSIZE),
|
||||||
SONIC_RBSIZE, DMA_FROM_DEVICE);
|
SONIC_RBSIZE, DMA_FROM_DEVICE);
|
||||||
if (!laddr) {
|
if (dma_mapping_error(lp->device, laddr)) {
|
||||||
while(i > 0) { /* free any that were mapped successfully */
|
while(i > 0) { /* free any that were mapped successfully */
|
||||||
i--;
|
i--;
|
||||||
dma_unmap_single(lp->device, lp->rx_laddr[i], SONIC_RBSIZE, DMA_FROM_DEVICE);
|
dma_unmap_single(lp->device, lp->rx_laddr[i], SONIC_RBSIZE, DMA_FROM_DEVICE);
|
||||||
|
@ -1681,8 +1681,8 @@ static int netsec_probe(struct platform_device *pdev)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto unreg_napi;
|
goto unreg_napi;
|
||||||
|
|
||||||
if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)))
|
if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40)))
|
||||||
dev_warn(&pdev->dev, "Failed to enable 64-bit DMA\n");
|
dev_warn(&pdev->dev, "Failed to set DMA mask\n");
|
||||||
|
|
||||||
ret = register_netdev(ndev);
|
ret = register_netdev(ndev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -1873,7 +1873,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(priv->txchan)) {
|
if (IS_ERR(priv->txchan)) {
|
||||||
dev_err(&pdev->dev, "error initializing tx dma channel\n");
|
dev_err(&pdev->dev, "error initializing tx dma channel\n");
|
||||||
rc = PTR_ERR(priv->txchan);
|
rc = PTR_ERR(priv->txchan);
|
||||||
goto no_cpdma_chan;
|
goto err_free_dma;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->rxchan = cpdma_chan_create(priv->dma, EMAC_DEF_RX_CH,
|
priv->rxchan = cpdma_chan_create(priv->dma, EMAC_DEF_RX_CH,
|
||||||
@ -1881,14 +1881,14 @@ static int davinci_emac_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(priv->rxchan)) {
|
if (IS_ERR(priv->rxchan)) {
|
||||||
dev_err(&pdev->dev, "error initializing rx dma channel\n");
|
dev_err(&pdev->dev, "error initializing rx dma channel\n");
|
||||||
rc = PTR_ERR(priv->rxchan);
|
rc = PTR_ERR(priv->rxchan);
|
||||||
goto no_cpdma_chan;
|
goto err_free_txchan;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||||
if (!res) {
|
if (!res) {
|
||||||
dev_err(&pdev->dev, "error getting irq res\n");
|
dev_err(&pdev->dev, "error getting irq res\n");
|
||||||
rc = -ENOENT;
|
rc = -ENOENT;
|
||||||
goto no_cpdma_chan;
|
goto err_free_rxchan;
|
||||||
}
|
}
|
||||||
ndev->irq = res->start;
|
ndev->irq = res->start;
|
||||||
|
|
||||||
@ -1914,7 +1914,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
|
|||||||
pm_runtime_put_noidle(&pdev->dev);
|
pm_runtime_put_noidle(&pdev->dev);
|
||||||
dev_err(&pdev->dev, "%s: failed to get_sync(%d)\n",
|
dev_err(&pdev->dev, "%s: failed to get_sync(%d)\n",
|
||||||
__func__, rc);
|
__func__, rc);
|
||||||
goto no_cpdma_chan;
|
goto err_napi_del;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* register the network device */
|
/* register the network device */
|
||||||
@ -1924,7 +1924,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
|
|||||||
dev_err(&pdev->dev, "error in register_netdev\n");
|
dev_err(&pdev->dev, "error in register_netdev\n");
|
||||||
rc = -ENODEV;
|
rc = -ENODEV;
|
||||||
pm_runtime_put(&pdev->dev);
|
pm_runtime_put(&pdev->dev);
|
||||||
goto no_cpdma_chan;
|
goto err_napi_del;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1937,11 +1937,13 @@ static int davinci_emac_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
no_cpdma_chan:
|
err_napi_del:
|
||||||
if (priv->txchan)
|
netif_napi_del(&priv->napi);
|
||||||
cpdma_chan_destroy(priv->txchan);
|
err_free_rxchan:
|
||||||
if (priv->rxchan)
|
cpdma_chan_destroy(priv->rxchan);
|
||||||
cpdma_chan_destroy(priv->rxchan);
|
err_free_txchan:
|
||||||
|
cpdma_chan_destroy(priv->txchan);
|
||||||
|
err_free_dma:
|
||||||
cpdma_ctlr_destroy(priv->dma);
|
cpdma_ctlr_destroy(priv->dma);
|
||||||
no_pdata:
|
no_pdata:
|
||||||
if (of_phy_is_fixed_link(np))
|
if (of_phy_is_fixed_link(np))
|
||||||
|
@ -1663,7 +1663,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
|
|||||||
else
|
else
|
||||||
*skb_xdp = 0;
|
*skb_xdp = 0;
|
||||||
|
|
||||||
preempt_disable();
|
local_bh_disable();
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
xdp_prog = rcu_dereference(tun->xdp_prog);
|
xdp_prog = rcu_dereference(tun->xdp_prog);
|
||||||
if (xdp_prog && !*skb_xdp) {
|
if (xdp_prog && !*skb_xdp) {
|
||||||
@ -1688,7 +1688,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
|
|||||||
if (err)
|
if (err)
|
||||||
goto err_redirect;
|
goto err_redirect;
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
preempt_enable();
|
local_bh_enable();
|
||||||
return NULL;
|
return NULL;
|
||||||
case XDP_TX:
|
case XDP_TX:
|
||||||
get_page(alloc_frag->page);
|
get_page(alloc_frag->page);
|
||||||
@ -1697,7 +1697,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
|
|||||||
goto err_redirect;
|
goto err_redirect;
|
||||||
tun_xdp_flush(tun->dev);
|
tun_xdp_flush(tun->dev);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
preempt_enable();
|
local_bh_enable();
|
||||||
return NULL;
|
return NULL;
|
||||||
case XDP_PASS:
|
case XDP_PASS:
|
||||||
delta = orig_data - xdp.data;
|
delta = orig_data - xdp.data;
|
||||||
@ -1717,7 +1717,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
|
|||||||
skb = build_skb(buf, buflen);
|
skb = build_skb(buf, buflen);
|
||||||
if (!skb) {
|
if (!skb) {
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
preempt_enable();
|
local_bh_enable();
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1727,7 +1727,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
|
|||||||
alloc_frag->offset += buflen;
|
alloc_frag->offset += buflen;
|
||||||
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
preempt_enable();
|
local_bh_enable();
|
||||||
|
|
||||||
return skb;
|
return skb;
|
||||||
|
|
||||||
@ -1735,7 +1735,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
|
|||||||
put_page(alloc_frag->page);
|
put_page(alloc_frag->page);
|
||||||
err_xdp:
|
err_xdp:
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
preempt_enable();
|
local_bh_enable();
|
||||||
this_cpu_inc(tun->pcpu_stats->rx_dropped);
|
this_cpu_inc(tun->pcpu_stats->rx_dropped);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1931,16 +1931,19 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
|
|||||||
struct bpf_prog *xdp_prog;
|
struct bpf_prog *xdp_prog;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
local_bh_disable();
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
xdp_prog = rcu_dereference(tun->xdp_prog);
|
xdp_prog = rcu_dereference(tun->xdp_prog);
|
||||||
if (xdp_prog) {
|
if (xdp_prog) {
|
||||||
ret = do_xdp_generic(xdp_prog, skb);
|
ret = do_xdp_generic(xdp_prog, skb);
|
||||||
if (ret != XDP_PASS) {
|
if (ret != XDP_PASS) {
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
local_bh_enable();
|
||||||
return total_len;
|
return total_len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
local_bh_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute the costly rx hash only if needed for flow updates.
|
/* Compute the costly rx hash only if needed for flow updates.
|
||||||
|
@ -609,7 +609,7 @@ static const struct driver_info cdc_mbim_info_ndp_to_end = {
|
|||||||
*/
|
*/
|
||||||
static const struct driver_info cdc_mbim_info_avoid_altsetting_toggle = {
|
static const struct driver_info cdc_mbim_info_avoid_altsetting_toggle = {
|
||||||
.description = "CDC MBIM",
|
.description = "CDC MBIM",
|
||||||
.flags = FLAG_NO_SETINT | FLAG_MULTI_PACKET | FLAG_WWAN,
|
.flags = FLAG_NO_SETINT | FLAG_MULTI_PACKET | FLAG_WWAN | FLAG_SEND_ZLP,
|
||||||
.bind = cdc_mbim_bind,
|
.bind = cdc_mbim_bind,
|
||||||
.unbind = cdc_mbim_unbind,
|
.unbind = cdc_mbim_unbind,
|
||||||
.manage_power = cdc_mbim_manage_power,
|
.manage_power = cdc_mbim_manage_power,
|
||||||
|
@ -1103,6 +1103,7 @@ static const struct usb_device_id products[] = {
|
|||||||
{QMI_FIXED_INTF(0x05c6, 0x920d, 5)},
|
{QMI_FIXED_INTF(0x05c6, 0x920d, 5)},
|
||||||
{QMI_QUIRK_SET_DTR(0x05c6, 0x9625, 4)}, /* YUGA CLM920-NC5 */
|
{QMI_QUIRK_SET_DTR(0x05c6, 0x9625, 4)}, /* YUGA CLM920-NC5 */
|
||||||
{QMI_FIXED_INTF(0x0846, 0x68a2, 8)},
|
{QMI_FIXED_INTF(0x0846, 0x68a2, 8)},
|
||||||
|
{QMI_FIXED_INTF(0x0846, 0x68d3, 8)}, /* Netgear Aircard 779S */
|
||||||
{QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */
|
{QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */
|
||||||
{QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */
|
{QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */
|
||||||
{QMI_FIXED_INTF(0x1435, 0xd181, 3)}, /* Wistron NeWeb D18Q1 */
|
{QMI_FIXED_INTF(0x1435, 0xd181, 3)}, /* Wistron NeWeb D18Q1 */
|
||||||
|
@ -1600,14 +1600,13 @@ static void iwl_pcie_set_interrupt_capa(struct pci_dev *pdev,
|
|||||||
struct iwl_trans *trans)
|
struct iwl_trans *trans)
|
||||||
{
|
{
|
||||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||||
int max_irqs, num_irqs, i, ret, nr_online_cpus;
|
int max_irqs, num_irqs, i, ret;
|
||||||
u16 pci_cmd;
|
u16 pci_cmd;
|
||||||
|
|
||||||
if (!trans->cfg->mq_rx_supported)
|
if (!trans->cfg->mq_rx_supported)
|
||||||
goto enable_msi;
|
goto enable_msi;
|
||||||
|
|
||||||
nr_online_cpus = num_online_cpus();
|
max_irqs = min_t(u32, num_online_cpus() + 2, IWL_MAX_RX_HW_QUEUES);
|
||||||
max_irqs = min_t(u32, nr_online_cpus + 2, IWL_MAX_RX_HW_QUEUES);
|
|
||||||
for (i = 0; i < max_irqs; i++)
|
for (i = 0; i < max_irqs; i++)
|
||||||
trans_pcie->msix_entries[i].entry = i;
|
trans_pcie->msix_entries[i].entry = i;
|
||||||
|
|
||||||
@ -1633,16 +1632,17 @@ static void iwl_pcie_set_interrupt_capa(struct pci_dev *pdev,
|
|||||||
* Two interrupts less: non rx causes shared with FBQ and RSS.
|
* Two interrupts less: non rx causes shared with FBQ and RSS.
|
||||||
* More than two interrupts: we will use fewer RSS queues.
|
* More than two interrupts: we will use fewer RSS queues.
|
||||||
*/
|
*/
|
||||||
if (num_irqs <= nr_online_cpus) {
|
if (num_irqs <= max_irqs - 2) {
|
||||||
trans_pcie->trans->num_rx_queues = num_irqs + 1;
|
trans_pcie->trans->num_rx_queues = num_irqs + 1;
|
||||||
trans_pcie->shared_vec_mask = IWL_SHARED_IRQ_NON_RX |
|
trans_pcie->shared_vec_mask = IWL_SHARED_IRQ_NON_RX |
|
||||||
IWL_SHARED_IRQ_FIRST_RSS;
|
IWL_SHARED_IRQ_FIRST_RSS;
|
||||||
} else if (num_irqs == nr_online_cpus + 1) {
|
} else if (num_irqs == max_irqs - 1) {
|
||||||
trans_pcie->trans->num_rx_queues = num_irqs;
|
trans_pcie->trans->num_rx_queues = num_irqs;
|
||||||
trans_pcie->shared_vec_mask = IWL_SHARED_IRQ_NON_RX;
|
trans_pcie->shared_vec_mask = IWL_SHARED_IRQ_NON_RX;
|
||||||
} else {
|
} else {
|
||||||
trans_pcie->trans->num_rx_queues = num_irqs - 1;
|
trans_pcie->trans->num_rx_queues = num_irqs - 1;
|
||||||
}
|
}
|
||||||
|
WARN_ON(trans_pcie->trans->num_rx_queues > IWL_MAX_RX_HW_QUEUES);
|
||||||
|
|
||||||
trans_pcie->alloc_vecs = num_irqs;
|
trans_pcie->alloc_vecs = num_irqs;
|
||||||
trans_pcie->msix_enabled = true;
|
trans_pcie->msix_enabled = true;
|
||||||
|
@ -372,16 +372,15 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Determine IFS values
|
* Determine IFS values
|
||||||
* - Use TXOP_BACKOFF for probe and management frames except beacons
|
* - Use TXOP_BACKOFF for management frames except beacons
|
||||||
* - Use TXOP_SIFS for fragment bursts
|
* - Use TXOP_SIFS for fragment bursts
|
||||||
* - Use TXOP_HTTXOP for everything else
|
* - Use TXOP_HTTXOP for everything else
|
||||||
*
|
*
|
||||||
* Note: rt2800 devices won't use CTS protection (if used)
|
* Note: rt2800 devices won't use CTS protection (if used)
|
||||||
* for frames not transmitted with TXOP_HTTXOP
|
* for frames not transmitted with TXOP_HTTXOP
|
||||||
*/
|
*/
|
||||||
if ((ieee80211_is_mgmt(hdr->frame_control) &&
|
if (ieee80211_is_mgmt(hdr->frame_control) &&
|
||||||
!ieee80211_is_beacon(hdr->frame_control)) ||
|
!ieee80211_is_beacon(hdr->frame_control))
|
||||||
(tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE))
|
|
||||||
txdesc->u.ht.txop = TXOP_BACKOFF;
|
txdesc->u.ht.txop = TXOP_BACKOFF;
|
||||||
else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT))
|
else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT))
|
||||||
txdesc->u.ht.txop = TXOP_SIFS;
|
txdesc->u.ht.txop = TXOP_SIFS;
|
||||||
|
@ -27,7 +27,7 @@ config NVME_FABRICS
|
|||||||
|
|
||||||
config NVME_RDMA
|
config NVME_RDMA
|
||||||
tristate "NVM Express over Fabrics RDMA host driver"
|
tristate "NVM Express over Fabrics RDMA host driver"
|
||||||
depends on INFINIBAND_ADDR_TRANS && BLOCK
|
depends on INFINIBAND && INFINIBAND_ADDR_TRANS && BLOCK
|
||||||
select NVME_CORE
|
select NVME_CORE
|
||||||
select NVME_FABRICS
|
select NVME_FABRICS
|
||||||
select SG_POOL
|
select SG_POOL
|
||||||
|
@ -1447,8 +1447,8 @@ static void __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id)
|
|||||||
if (ns->lba_shift == 0)
|
if (ns->lba_shift == 0)
|
||||||
ns->lba_shift = 9;
|
ns->lba_shift = 9;
|
||||||
ns->noiob = le16_to_cpu(id->noiob);
|
ns->noiob = le16_to_cpu(id->noiob);
|
||||||
ns->ext = ns->ms && (id->flbas & NVME_NS_FLBAS_META_EXT);
|
|
||||||
ns->ms = le16_to_cpu(id->lbaf[id->flbas & NVME_NS_FLBAS_LBA_MASK].ms);
|
ns->ms = le16_to_cpu(id->lbaf[id->flbas & NVME_NS_FLBAS_LBA_MASK].ms);
|
||||||
|
ns->ext = ns->ms && (id->flbas & NVME_NS_FLBAS_META_EXT);
|
||||||
/* the PI implementation requires metadata equal t10 pi tuple size */
|
/* the PI implementation requires metadata equal t10 pi tuple size */
|
||||||
if (ns->ms == sizeof(struct t10_pi_tuple))
|
if (ns->ms == sizeof(struct t10_pi_tuple))
|
||||||
ns->pi_type = id->dps & NVME_NS_DPS_PI_MASK;
|
ns->pi_type = id->dps & NVME_NS_DPS_PI_MASK;
|
||||||
|
@ -27,7 +27,7 @@ config NVME_TARGET_LOOP
|
|||||||
|
|
||||||
config NVME_TARGET_RDMA
|
config NVME_TARGET_RDMA
|
||||||
tristate "NVMe over Fabrics RDMA target support"
|
tristate "NVMe over Fabrics RDMA target support"
|
||||||
depends on INFINIBAND_ADDR_TRANS
|
depends on INFINIBAND && INFINIBAND_ADDR_TRANS
|
||||||
depends on NVME_TARGET
|
depends on NVME_TARGET
|
||||||
select SGL_ALLOC
|
select SGL_ALLOC
|
||||||
help
|
help
|
||||||
|
@ -163,6 +163,16 @@ MODULE_LICENSE("GPL");
|
|||||||
|
|
||||||
static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL };
|
static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL };
|
||||||
|
|
||||||
|
static bool ashs_present(void)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
while (ashs_ids[i]) {
|
||||||
|
if (acpi_dev_found(ashs_ids[i++]))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
struct bios_args {
|
struct bios_args {
|
||||||
u32 arg0;
|
u32 arg0;
|
||||||
u32 arg1;
|
u32 arg1;
|
||||||
@ -1025,6 +1035,9 @@ static int asus_new_rfkill(struct asus_wmi *asus,
|
|||||||
|
|
||||||
static void asus_wmi_rfkill_exit(struct asus_wmi *asus)
|
static void asus_wmi_rfkill_exit(struct asus_wmi *asus)
|
||||||
{
|
{
|
||||||
|
if (asus->driver->wlan_ctrl_by_user && ashs_present())
|
||||||
|
return;
|
||||||
|
|
||||||
asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
|
asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P5");
|
||||||
asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
|
asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P6");
|
||||||
asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
|
asus_unregister_rfkill_notifier(asus, "\\_SB.PCI0.P0P7");
|
||||||
@ -2121,16 +2134,6 @@ static int asus_wmi_fan_init(struct asus_wmi *asus)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ashs_present(void)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
while (ashs_ids[i]) {
|
|
||||||
if (acpi_dev_found(ashs_ids[i++]))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* WMI Driver
|
* WMI Driver
|
||||||
*/
|
*/
|
||||||
|
@ -3034,7 +3034,8 @@ static blk_status_t do_dasd_request(struct blk_mq_hw_ctx *hctx,
|
|||||||
cqr->callback_data = req;
|
cqr->callback_data = req;
|
||||||
cqr->status = DASD_CQR_FILLED;
|
cqr->status = DASD_CQR_FILLED;
|
||||||
cqr->dq = dq;
|
cqr->dq = dq;
|
||||||
req->completion_data = cqr;
|
*((struct dasd_ccw_req **) blk_mq_rq_to_pdu(req)) = cqr;
|
||||||
|
|
||||||
blk_mq_start_request(req);
|
blk_mq_start_request(req);
|
||||||
spin_lock(&block->queue_lock);
|
spin_lock(&block->queue_lock);
|
||||||
list_add_tail(&cqr->blocklist, &block->ccw_queue);
|
list_add_tail(&cqr->blocklist, &block->ccw_queue);
|
||||||
@ -3058,12 +3059,13 @@ static blk_status_t do_dasd_request(struct blk_mq_hw_ctx *hctx,
|
|||||||
*/
|
*/
|
||||||
enum blk_eh_timer_return dasd_times_out(struct request *req, bool reserved)
|
enum blk_eh_timer_return dasd_times_out(struct request *req, bool reserved)
|
||||||
{
|
{
|
||||||
struct dasd_ccw_req *cqr = req->completion_data;
|
|
||||||
struct dasd_block *block = req->q->queuedata;
|
struct dasd_block *block = req->q->queuedata;
|
||||||
struct dasd_device *device;
|
struct dasd_device *device;
|
||||||
|
struct dasd_ccw_req *cqr;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
|
cqr = *((struct dasd_ccw_req **) blk_mq_rq_to_pdu(req));
|
||||||
if (!cqr)
|
if (!cqr)
|
||||||
return BLK_EH_NOT_HANDLED;
|
return BLK_EH_NOT_HANDLED;
|
||||||
|
|
||||||
@ -3169,6 +3171,7 @@ static int dasd_alloc_queue(struct dasd_block *block)
|
|||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
block->tag_set.ops = &dasd_mq_ops;
|
block->tag_set.ops = &dasd_mq_ops;
|
||||||
|
block->tag_set.cmd_size = sizeof(struct dasd_ccw_req *);
|
||||||
block->tag_set.nr_hw_queues = DASD_NR_HW_QUEUES;
|
block->tag_set.nr_hw_queues = DASD_NR_HW_QUEUES;
|
||||||
block->tag_set.queue_depth = DASD_MAX_LCU_DEV * DASD_REQ_PER_DEV;
|
block->tag_set.queue_depth = DASD_MAX_LCU_DEV * DASD_REQ_PER_DEV;
|
||||||
block->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
|
block->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user