mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 05:55:44 +02:00
Linux 5.9-rc8
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAl96VQIeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGDS0H/0cyFcn/c8PYitdj C5p8/1KUmXOJsHeRjZ6rZPExVL4bp88/xxMkzLspD6INJsoqfyrj1wbJfHIrYSYt 6Ps5NoWl9woJlyD4H7cyoXmGfb0DiVRjCWU7VK7fwxQy4W97A/eLgNEj1WMZ5kzC FWT4bI7Kwo7tdcBeU52RkzZfeW59HU8667CO3FXr8yPySlUSZMoWeypQfCbHnqVG WOEAJbbxklPzUbABcTF23lUMl1saOZ30T+hlXddolHq4clvhKf2b3lLbTCUcM1Yj P+I7/K3bDdbpmaYNqNs8LCEiVhZBGK7CJViJvWAus/U7ccMNlJO4xJQV5C7oq85K DSXVIYU= =RqRn -----END PGP SIGNATURE----- Merge 5.9-rc8 into android-mainline Linux 5.9-rc8 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I4a03857522443f5d032a0cc1ecdced3675255d5e
This commit is contained in:
commit
114c58d041
|
|
@ -690,7 +690,7 @@ which of the two parameters is added to the kernel command line. In the
|
|||
instruction of the CPUs (which, as a rule, suspends the execution of the program
|
||||
and causes the hardware to attempt to enter the shallowest available idle state)
|
||||
for this purpose, and if ``idle=poll`` is used, idle CPUs will execute a
|
||||
more or less ``lightweight'' sequence of instructions in a tight loop. [Note
|
||||
more or less "lightweight" sequence of instructions in a tight loop. [Note
|
||||
that using ``idle=poll`` is somewhat drastic in many cases, as preventing idle
|
||||
CPUs from saving almost any energy at all may not be the only effect of it.
|
||||
For example, on Intel hardware it effectively prevents CPUs from using
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ properties:
|
|||
compatible:
|
||||
items:
|
||||
- const: raspberrypi,bcm2835-firmware
|
||||
- const: simple-bus
|
||||
- const: simple-mfd
|
||||
|
||||
mboxes:
|
||||
$ref: '/schemas/types.yaml#/definitions/phandle'
|
||||
|
|
@ -57,7 +57,7 @@ required:
|
|||
examples:
|
||||
- |
|
||||
firmware {
|
||||
compatible = "raspberrypi,bcm2835-firmware", "simple-bus";
|
||||
compatible = "raspberrypi,bcm2835-firmware", "simple-mfd";
|
||||
mboxes = <&mailbox>;
|
||||
|
||||
firmware_clocks: clocks {
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ examples:
|
|||
|
||||
main_crypto: crypto@4e00000 {
|
||||
compatible = "ti,j721-sa2ul";
|
||||
reg = <0x0 0x4e00000 0x0 0x1200>;
|
||||
reg = <0x4e00000 0x1200>;
|
||||
power-domains = <&k3_pds 264 TI_SCI_PD_EXCLUSIVE>;
|
||||
dmas = <&main_udmap 0xc000>, <&main_udmap 0x4000>,
|
||||
<&main_udmap 0x4001>;
|
||||
|
|
|
|||
|
|
@ -145,10 +145,10 @@ examples:
|
|||
|
||||
display@fd4a0000 {
|
||||
compatible = "xlnx,zynqmp-dpsub-1.7";
|
||||
reg = <0x0 0xfd4a0000 0x0 0x1000>,
|
||||
<0x0 0xfd4aa000 0x0 0x1000>,
|
||||
<0x0 0xfd4ab000 0x0 0x1000>,
|
||||
<0x0 0xfd4ac000 0x0 0x1000>;
|
||||
reg = <0xfd4a0000 0x1000>,
|
||||
<0xfd4aa000 0x1000>,
|
||||
<0xfd4ab000 0x1000>,
|
||||
<0xfd4ac000 0x1000>;
|
||||
reg-names = "dp", "blend", "av_buf", "aud";
|
||||
interrupts = <0 119 4>;
|
||||
interrupt-parent = <&gic>;
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ examples:
|
|||
|
||||
dma: dma-controller@fd4c0000 {
|
||||
compatible = "xlnx,zynqmp-dpdma";
|
||||
reg = <0x0 0xfd4c0000 0x0 0x1000>;
|
||||
reg = <0xfd4c0000 0x1000>;
|
||||
interrupts = <GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-parent = <&gic>;
|
||||
clocks = <&dpdma_clk>;
|
||||
|
|
|
|||
|
|
@ -20,8 +20,9 @@ Required properties:
|
|||
- gpio-controller : Marks the device node as a GPIO controller
|
||||
- interrupts : Interrupt specifier, see interrupt-controller/interrupts.txt
|
||||
- interrupt-controller : Mark the GPIO controller as an interrupt-controller
|
||||
- ngpios : number of GPIO lines, see gpio.txt
|
||||
(should be multiple of 8, up to 80 pins)
|
||||
- ngpios : number of *hardware* GPIO lines, see gpio.txt. This will expose
|
||||
2 software GPIOs per hardware GPIO: one for hardware input, one for hardware
|
||||
output. Up to 80 pins, must be a multiple of 8.
|
||||
- clocks : A phandle to the APB clock for SGPM clock division
|
||||
- bus-frequency : SGPM CLK frequency
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ properties:
|
|||
const: 0
|
||||
|
||||
patternProperties:
|
||||
"^multi-led[0-9a-f]$":
|
||||
"^multi-led@[0-9a-b]$":
|
||||
type: object
|
||||
allOf:
|
||||
- $ref: leds-class-multicolor.yaml#
|
||||
|
|
|
|||
|
|
@ -13195,6 +13195,7 @@ F: drivers/firmware/pcdp.*
|
|||
|
||||
PCI DRIVER FOR AARDVARK (Marvell Armada 3700)
|
||||
M: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
||||
M: Pali Rohár <pali@kernel.org>
|
||||
L: linux-pci@vger.kernel.org
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -2,7 +2,7 @@
|
|||
VERSION = 5
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc7
|
||||
EXTRAVERSION = -rc8
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ act {
|
|||
|
||||
soc {
|
||||
firmware: firmware {
|
||||
compatible = "raspberrypi,bcm2835-firmware", "simple-bus";
|
||||
compatible = "raspberrypi,bcm2835-firmware", "simple-mfd";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,9 @@ static int imx6q_enter_wait(struct cpuidle_device *dev,
|
|||
imx6_set_lpm(WAIT_UNCLOCKED);
|
||||
raw_spin_unlock(&cpuidle_lock);
|
||||
|
||||
rcu_idle_enter();
|
||||
cpu_do_idle();
|
||||
rcu_idle_exit();
|
||||
|
||||
raw_spin_lock(&cpuidle_lock);
|
||||
if (num_idle_cpus-- == num_online_cpus())
|
||||
|
|
@ -44,7 +46,7 @@ static struct cpuidle_driver imx6q_cpuidle_driver = {
|
|||
{
|
||||
.exit_latency = 50,
|
||||
.target_residency = 75,
|
||||
.flags = CPUIDLE_FLAG_TIMER_STOP,
|
||||
.flags = CPUIDLE_FLAG_TIMER_STOP | CPUIDLE_FLAG_RCU_IDLE,
|
||||
.enter = imx6q_enter_wait,
|
||||
.name = "WAIT",
|
||||
.desc = "Clock off",
|
||||
|
|
|
|||
|
|
@ -298,8 +298,21 @@ void __iomem *acpi_os_ioremap(acpi_physical_address phys, acpi_size size)
|
|||
case EFI_BOOT_SERVICES_DATA:
|
||||
case EFI_CONVENTIONAL_MEMORY:
|
||||
case EFI_PERSISTENT_MEMORY:
|
||||
pr_warn(FW_BUG "requested region covers kernel memory @ %pa\n", &phys);
|
||||
return NULL;
|
||||
if (memblock_is_map_memory(phys) ||
|
||||
!memblock_is_region_memory(phys, size)) {
|
||||
pr_warn(FW_BUG "requested region covers kernel memory @ %pa\n", &phys);
|
||||
return NULL;
|
||||
}
|
||||
/*
|
||||
* Mapping kernel memory is permitted if the region in
|
||||
* question is covered by a single memblock with the
|
||||
* NOMAP attribute set: this enables the use of ACPI
|
||||
* table overrides passed via initramfs, which are
|
||||
* reserved in memory using arch_reserve_mem_area()
|
||||
* below. As this particular use case only requires
|
||||
* read access, fall through to the R/O mapping case.
|
||||
*/
|
||||
fallthrough;
|
||||
|
||||
case EFI_RUNTIME_SERVICES_CODE:
|
||||
/*
|
||||
|
|
@ -388,3 +401,8 @@ int apei_claim_sea(struct pt_regs *regs)
|
|||
|
||||
return err;
|
||||
}
|
||||
|
||||
void arch_reserve_mem_area(acpi_physical_address addr, size_t size)
|
||||
{
|
||||
memblock_mark_nomap(addr, size);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,14 @@ static void __tlb_switch_to_guest(struct kvm_s2_mmu *mmu,
|
|||
isb();
|
||||
}
|
||||
|
||||
/*
|
||||
* __load_guest_stage2() includes an ISB only when the AT
|
||||
* workaround is applied. Take care of the opposite condition,
|
||||
* ensuring that we always have an ISB, but not two ISBs back
|
||||
* to back.
|
||||
*/
|
||||
__load_guest_stage2(mmu);
|
||||
asm(ALTERNATIVE("isb", "nop", ARM64_WORKAROUND_SPECULATIVE_AT));
|
||||
}
|
||||
|
||||
static void __tlb_switch_to_host(struct tlb_inv_context *cxt)
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@
|
|||
|
||||
#include <linux/random.h>
|
||||
#include <linux/version.h>
|
||||
#include <asm/timex.h>
|
||||
|
||||
extern unsigned long __stack_chk_guard;
|
||||
|
||||
|
|
@ -18,12 +17,9 @@ extern unsigned long __stack_chk_guard;
|
|||
static __always_inline void boot_init_stack_canary(void)
|
||||
{
|
||||
unsigned long canary;
|
||||
unsigned long tsc;
|
||||
|
||||
/* Try to get a semi random initial value. */
|
||||
get_random_bytes(&canary, sizeof(canary));
|
||||
tsc = get_cycles();
|
||||
canary += tsc + (tsc << BITS_PER_LONG/2);
|
||||
canary ^= LINUX_VERSION_CODE;
|
||||
canary &= CANARY_MASK;
|
||||
|
||||
|
|
|
|||
|
|
@ -33,6 +33,19 @@ static inline u32 get_cycles_hi(void)
|
|||
#define get_cycles_hi get_cycles_hi
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
/*
|
||||
* Much like MIPS, we may not have a viable counter to use at an early point
|
||||
* in the boot process. Unfortunately we don't have a fallback, so instead
|
||||
* we just return 0.
|
||||
*/
|
||||
static inline unsigned long random_get_entropy(void)
|
||||
{
|
||||
if (unlikely(clint_time_val == NULL))
|
||||
return 0;
|
||||
return get_cycles();
|
||||
}
|
||||
#define random_get_entropy() random_get_entropy()
|
||||
|
||||
#else /* CONFIG_RISCV_M_MODE */
|
||||
|
||||
static inline cycles_t get_cycles(void)
|
||||
|
|
|
|||
|
|
@ -794,6 +794,18 @@ void update_exception_bitmap(struct kvm_vcpu *vcpu)
|
|||
*/
|
||||
if (is_guest_mode(vcpu))
|
||||
eb |= get_vmcs12(vcpu)->exception_bitmap;
|
||||
else {
|
||||
/*
|
||||
* If EPT is enabled, #PF is only trapped if MAXPHYADDR is mismatched
|
||||
* between guest and host. In that case we only care about present
|
||||
* faults. For vmcs02, however, PFEC_MASK and PFEC_MATCH are set in
|
||||
* prepare_vmcs02_rare.
|
||||
*/
|
||||
bool selective_pf_trap = enable_ept && (eb & (1u << PF_VECTOR));
|
||||
int mask = selective_pf_trap ? PFERR_PRESENT_MASK : 0;
|
||||
vmcs_write32(PAGE_FAULT_ERROR_CODE_MASK, mask);
|
||||
vmcs_write32(PAGE_FAULT_ERROR_CODE_MATCH, mask);
|
||||
}
|
||||
|
||||
vmcs_write32(EXCEPTION_BITMAP, eb);
|
||||
}
|
||||
|
|
@ -4355,16 +4367,6 @@ static void init_vmcs(struct vcpu_vmx *vmx)
|
|||
vmx->pt_desc.guest.output_mask = 0x7F;
|
||||
vmcs_write64(GUEST_IA32_RTIT_CTL, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* If EPT is enabled, #PF is only trapped if MAXPHYADDR is mismatched
|
||||
* between guest and host. In that case we only care about present
|
||||
* faults.
|
||||
*/
|
||||
if (enable_ept) {
|
||||
vmcs_write32(PAGE_FAULT_ERROR_CODE_MASK, PFERR_PRESENT_MASK);
|
||||
vmcs_write32(PAGE_FAULT_ERROR_CODE_MATCH, PFERR_PRESENT_MASK);
|
||||
}
|
||||
}
|
||||
|
||||
static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
|
||||
|
|
|
|||
|
|
@ -1412,6 +1412,11 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list,
|
|||
|
||||
hctx->dispatched[queued_to_index(queued)]++;
|
||||
|
||||
/* If we didn't flush the entire list, we could have told the driver
|
||||
* there was more coming, but that turned out to be a lie.
|
||||
*/
|
||||
if ((!list_empty(list) || errors) && q->mq_ops->commit_rqs && queued)
|
||||
q->mq_ops->commit_rqs(hctx);
|
||||
/*
|
||||
* Any items that need requeuing? Stuff them into hctx->dispatch,
|
||||
* that is where we will continue on next queue run.
|
||||
|
|
@ -1425,14 +1430,6 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list,
|
|||
|
||||
blk_mq_release_budgets(q, nr_budgets);
|
||||
|
||||
/*
|
||||
* If we didn't flush the entire list, we could have told
|
||||
* the driver there was more coming, but that turned out to
|
||||
* be a lie.
|
||||
*/
|
||||
if (q->mq_ops->commit_rqs && queued)
|
||||
q->mq_ops->commit_rqs(hctx);
|
||||
|
||||
spin_lock(&hctx->lock);
|
||||
list_splice_tail_init(list, &hctx->dispatch);
|
||||
spin_unlock(&hctx->lock);
|
||||
|
|
@ -2079,6 +2076,7 @@ void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,
|
|||
struct list_head *list)
|
||||
{
|
||||
int queued = 0;
|
||||
int errors = 0;
|
||||
|
||||
while (!list_empty(list)) {
|
||||
blk_status_t ret;
|
||||
|
|
@ -2095,6 +2093,7 @@ void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,
|
|||
break;
|
||||
}
|
||||
blk_mq_end_request(rq, ret);
|
||||
errors++;
|
||||
} else
|
||||
queued++;
|
||||
}
|
||||
|
|
@ -2104,7 +2103,8 @@ void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,
|
|||
* the driver there was more coming, but that turned out to
|
||||
* be a lie.
|
||||
*/
|
||||
if (!list_empty(list) && hctx->queue->mq_ops->commit_rqs && queued)
|
||||
if ((!list_empty(list) || errors) &&
|
||||
hctx->queue->mq_ops->commit_rqs && queued)
|
||||
hctx->queue->mq_ops->commit_rqs(hctx);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -927,7 +927,7 @@ static const struct samsung_gate_clock exynos4210_gate_clks[] __initconst = {
|
|||
GATE(CLK_PCIE, "pcie", "aclk133", GATE_IP_FSYS, 14, 0, 0),
|
||||
GATE(CLK_SMMU_PCIE, "smmu_pcie", "aclk133", GATE_IP_FSYS, 18, 0, 0),
|
||||
GATE(CLK_MODEMIF, "modemif", "aclk100", GATE_IP_PERIL, 28, 0, 0),
|
||||
GATE(CLK_CHIPID, "chipid", "aclk100", E4210_GATE_IP_PERIR, 0, 0, 0),
|
||||
GATE(CLK_CHIPID, "chipid", "aclk100", E4210_GATE_IP_PERIR, 0, CLK_IGNORE_UNUSED, 0),
|
||||
GATE(CLK_SYSREG, "sysreg", "aclk100", E4210_GATE_IP_PERIR, 0,
|
||||
CLK_IGNORE_UNUSED, 0),
|
||||
GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk100", E4210_GATE_IP_PERIR, 11, 0,
|
||||
|
|
@ -969,7 +969,7 @@ static const struct samsung_gate_clock exynos4x12_gate_clks[] __initconst = {
|
|||
0),
|
||||
GATE(CLK_TSADC, "tsadc", "aclk133", E4X12_GATE_BUS_FSYS1, 16, 0, 0),
|
||||
GATE(CLK_MIPI_HSI, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0),
|
||||
GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, 0, 0),
|
||||
GATE(CLK_CHIPID, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, CLK_IGNORE_UNUSED, 0),
|
||||
GATE(CLK_SYSREG, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1,
|
||||
CLK_IGNORE_UNUSED, 0),
|
||||
GATE(CLK_HDMI_CEC, "hdmi_cec", "aclk100", E4X12_GATE_IP_PERIR, 11, 0,
|
||||
|
|
|
|||
|
|
@ -1655,6 +1655,11 @@ static void __init exynos5x_clk_init(struct device_node *np,
|
|||
* main G3D clock enablement status.
|
||||
*/
|
||||
clk_prepare_enable(__clk_lookup("mout_sw_aclk_g3d"));
|
||||
/*
|
||||
* Keep top BPLL mux enabled permanently to ensure that DRAM operates
|
||||
* properly.
|
||||
*/
|
||||
clk_prepare_enable(__clk_lookup("mout_bpll"));
|
||||
|
||||
samsung_clk_of_add_provider(np, ctx);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -209,7 +209,7 @@ static const struct stratix10_perip_cnt_clock s10_main_perip_cnt_clks[] = {
|
|||
{ STRATIX10_EMAC_B_FREE_CLK, "emacb_free_clk", NULL, emacb_free_mux, ARRAY_SIZE(emacb_free_mux),
|
||||
0, 0, 2, 0xB0, 1},
|
||||
{ STRATIX10_EMAC_PTP_FREE_CLK, "emac_ptp_free_clk", NULL, emac_ptp_free_mux,
|
||||
ARRAY_SIZE(emac_ptp_free_mux), 0, 0, 4, 0xB0, 2},
|
||||
ARRAY_SIZE(emac_ptp_free_mux), 0, 0, 2, 0xB0, 2},
|
||||
{ STRATIX10_GPIO_DB_FREE_CLK, "gpio_db_free_clk", NULL, gpio_db_free_mux,
|
||||
ARRAY_SIZE(gpio_db_free_mux), 0, 0, 0, 0xB0, 3},
|
||||
{ STRATIX10_SDMMC_FREE_CLK, "sdmmc_free_clk", NULL, sdmmc_free_mux,
|
||||
|
|
|
|||
|
|
@ -1611,9 +1611,6 @@ static int clk_plle_tegra114_enable(struct clk_hw *hw)
|
|||
unsigned long flags = 0;
|
||||
unsigned long input_rate;
|
||||
|
||||
if (clk_pll_is_enabled(hw))
|
||||
return 0;
|
||||
|
||||
input_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
|
||||
|
||||
if (_get_table_rate(hw, &sel, pll->params->fixed_rate, input_rate))
|
||||
|
|
@ -1673,7 +1670,7 @@ static int clk_plle_tegra114_enable(struct clk_hw *hw)
|
|||
pll_writel(val, PLLE_SS_CTRL, pll);
|
||||
udelay(1);
|
||||
|
||||
/* Enable hw control of xusb brick pll */
|
||||
/* Enable HW control of XUSB brick PLL */
|
||||
val = pll_readl_misc(pll);
|
||||
val &= ~PLLE_MISC_IDDQ_SW_CTRL;
|
||||
pll_writel_misc(val, pll);
|
||||
|
|
@ -1696,7 +1693,7 @@ static int clk_plle_tegra114_enable(struct clk_hw *hw)
|
|||
val |= XUSBIO_PLL_CFG0_SEQ_ENABLE;
|
||||
pll_writel(val, XUSBIO_PLL_CFG0, pll);
|
||||
|
||||
/* Enable hw control of SATA pll */
|
||||
/* Enable HW control of SATA PLL */
|
||||
val = pll_readl(SATA_PLL_CFG0, pll);
|
||||
val &= ~SATA_PLL_CFG0_PADPLL_RESET_SWCTL;
|
||||
val |= SATA_PLL_CFG0_PADPLL_USE_LOCKDET;
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "clk.h"
|
||||
|
||||
#define CLK_SOURCE_EMC 0x19c
|
||||
#define CLK_SOURCE_EMC_2X_CLK_SRC GENMASK(31, 29)
|
||||
#define CLK_SOURCE_EMC_MC_EMC_SAME_FREQ BIT(16)
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ static unsigned int clint_timer_irq;
|
|||
|
||||
#ifdef CONFIG_RISCV_M_MODE
|
||||
u64 __iomem *clint_time_val;
|
||||
EXPORT_SYMBOL(clint_time_val);
|
||||
#endif
|
||||
|
||||
static void clint_send_ipi(const struct cpumask *target)
|
||||
|
|
|
|||
|
|
@ -2781,6 +2781,7 @@ static int intel_pstate_update_status(const char *buf, size_t size)
|
|||
|
||||
cpufreq_unregister_driver(intel_pstate_driver);
|
||||
intel_pstate_driver_cleanup();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (size == 6 && !strncmp(buf, "active", size)) {
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@ struct dmatest_params {
|
|||
* @nr_channels: number of channels under test
|
||||
* @lock: access protection to the fields of this structure
|
||||
* @did_init: module has been initialized completely
|
||||
* @last_error: test has faced configuration issues
|
||||
*/
|
||||
static struct dmatest_info {
|
||||
/* Test parameters */
|
||||
|
|
@ -137,6 +138,7 @@ static struct dmatest_info {
|
|||
/* Internal state */
|
||||
struct list_head channels;
|
||||
unsigned int nr_channels;
|
||||
int last_error;
|
||||
struct mutex lock;
|
||||
bool did_init;
|
||||
} test_info = {
|
||||
|
|
@ -1184,10 +1186,22 @@ static int dmatest_run_set(const char *val, const struct kernel_param *kp)
|
|||
return ret;
|
||||
} else if (dmatest_run) {
|
||||
if (!is_threaded_test_pending(info)) {
|
||||
pr_info("No channels configured, continue with any\n");
|
||||
if (!is_threaded_test_run(info))
|
||||
stop_threaded_test(info);
|
||||
add_threaded_test(info);
|
||||
/*
|
||||
* We have nothing to run. This can be due to:
|
||||
*/
|
||||
ret = info->last_error;
|
||||
if (ret) {
|
||||
/* 1) Misconfiguration */
|
||||
pr_err("Channel misconfigured, can't continue\n");
|
||||
mutex_unlock(&info->lock);
|
||||
return ret;
|
||||
} else {
|
||||
/* 2) We rely on defaults */
|
||||
pr_info("No channels configured, continue with any\n");
|
||||
if (!is_threaded_test_run(info))
|
||||
stop_threaded_test(info);
|
||||
add_threaded_test(info);
|
||||
}
|
||||
}
|
||||
start_threaded_tests(info);
|
||||
} else {
|
||||
|
|
@ -1204,7 +1218,7 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp)
|
|||
struct dmatest_info *info = &test_info;
|
||||
struct dmatest_chan *dtc;
|
||||
char chan_reset_val[20];
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&info->lock);
|
||||
ret = param_set_copystring(val, kp);
|
||||
|
|
@ -1259,12 +1273,14 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp)
|
|||
goto add_chan_err;
|
||||
}
|
||||
|
||||
info->last_error = ret;
|
||||
mutex_unlock(&info->lock);
|
||||
|
||||
return ret;
|
||||
|
||||
add_chan_err:
|
||||
param_set_copystring(chan_reset_val, kp);
|
||||
info->last_error = ret;
|
||||
mutex_unlock(&info->lock);
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ static int amd_fch_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio)
|
|||
ret = (readl_relaxed(ptr) & AMD_FCH_GPIO_FLAG_DIRECTION);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
return ret ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
|
||||
return ret ? GPIO_LINE_DIRECTION_OUT : GPIO_LINE_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static void amd_fch_gpio_set(struct gpio_chip *gc,
|
||||
|
|
|
|||
|
|
@ -17,7 +17,17 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#define MAX_NR_SGPIO 80
|
||||
/*
|
||||
* MAX_NR_HW_GPIO represents the number of actual hardware-supported GPIOs (ie,
|
||||
* slots within the clocked serial GPIO data). Since each HW GPIO is both an
|
||||
* input and an output, we provide MAX_NR_HW_GPIO * 2 lines on our gpiochip
|
||||
* device.
|
||||
*
|
||||
* We use SGPIO_OUTPUT_OFFSET to define the split between the inputs and
|
||||
* outputs; the inputs start at line 0, the outputs start at OUTPUT_OFFSET.
|
||||
*/
|
||||
#define MAX_NR_HW_SGPIO 80
|
||||
#define SGPIO_OUTPUT_OFFSET MAX_NR_HW_SGPIO
|
||||
|
||||
#define ASPEED_SGPIO_CTRL 0x54
|
||||
|
||||
|
|
@ -30,8 +40,8 @@ struct aspeed_sgpio {
|
|||
struct clk *pclk;
|
||||
spinlock_t lock;
|
||||
void __iomem *base;
|
||||
uint32_t dir_in[3];
|
||||
int irq;
|
||||
int n_sgpio;
|
||||
};
|
||||
|
||||
struct aspeed_sgpio_bank {
|
||||
|
|
@ -111,31 +121,69 @@ static void __iomem *bank_reg(struct aspeed_sgpio *gpio,
|
|||
}
|
||||
}
|
||||
|
||||
#define GPIO_BANK(x) ((x) >> 5)
|
||||
#define GPIO_OFFSET(x) ((x) & 0x1f)
|
||||
#define GPIO_BANK(x) ((x % SGPIO_OUTPUT_OFFSET) >> 5)
|
||||
#define GPIO_OFFSET(x) ((x % SGPIO_OUTPUT_OFFSET) & 0x1f)
|
||||
#define GPIO_BIT(x) BIT(GPIO_OFFSET(x))
|
||||
|
||||
static const struct aspeed_sgpio_bank *to_bank(unsigned int offset)
|
||||
{
|
||||
unsigned int bank = GPIO_BANK(offset);
|
||||
unsigned int bank;
|
||||
|
||||
bank = GPIO_BANK(offset);
|
||||
|
||||
WARN_ON(bank >= ARRAY_SIZE(aspeed_sgpio_banks));
|
||||
return &aspeed_sgpio_banks[bank];
|
||||
}
|
||||
|
||||
static int aspeed_sgpio_init_valid_mask(struct gpio_chip *gc,
|
||||
unsigned long *valid_mask, unsigned int ngpios)
|
||||
{
|
||||
struct aspeed_sgpio *sgpio = gpiochip_get_data(gc);
|
||||
int n = sgpio->n_sgpio;
|
||||
int c = SGPIO_OUTPUT_OFFSET - n;
|
||||
|
||||
WARN_ON(ngpios < MAX_NR_HW_SGPIO * 2);
|
||||
|
||||
/* input GPIOs in the lower range */
|
||||
bitmap_set(valid_mask, 0, n);
|
||||
bitmap_clear(valid_mask, n, c);
|
||||
|
||||
/* output GPIOS above SGPIO_OUTPUT_OFFSET */
|
||||
bitmap_set(valid_mask, SGPIO_OUTPUT_OFFSET, n);
|
||||
bitmap_clear(valid_mask, SGPIO_OUTPUT_OFFSET + n, c);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void aspeed_sgpio_irq_init_valid_mask(struct gpio_chip *gc,
|
||||
unsigned long *valid_mask, unsigned int ngpios)
|
||||
{
|
||||
struct aspeed_sgpio *sgpio = gpiochip_get_data(gc);
|
||||
int n = sgpio->n_sgpio;
|
||||
|
||||
WARN_ON(ngpios < MAX_NR_HW_SGPIO * 2);
|
||||
|
||||
/* input GPIOs in the lower range */
|
||||
bitmap_set(valid_mask, 0, n);
|
||||
bitmap_clear(valid_mask, n, ngpios - n);
|
||||
}
|
||||
|
||||
static bool aspeed_sgpio_is_input(unsigned int offset)
|
||||
{
|
||||
return offset < SGPIO_OUTPUT_OFFSET;
|
||||
}
|
||||
|
||||
static int aspeed_sgpio_get(struct gpio_chip *gc, unsigned int offset)
|
||||
{
|
||||
struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
|
||||
const struct aspeed_sgpio_bank *bank = to_bank(offset);
|
||||
unsigned long flags;
|
||||
enum aspeed_sgpio_reg reg;
|
||||
bool is_input;
|
||||
int rc = 0;
|
||||
|
||||
spin_lock_irqsave(&gpio->lock, flags);
|
||||
|
||||
is_input = gpio->dir_in[GPIO_BANK(offset)] & GPIO_BIT(offset);
|
||||
reg = is_input ? reg_val : reg_rdata;
|
||||
reg = aspeed_sgpio_is_input(offset) ? reg_val : reg_rdata;
|
||||
rc = !!(ioread32(bank_reg(gpio, bank, reg)) & GPIO_BIT(offset));
|
||||
|
||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
||||
|
|
@ -143,22 +191,31 @@ static int aspeed_sgpio_get(struct gpio_chip *gc, unsigned int offset)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static void sgpio_set_value(struct gpio_chip *gc, unsigned int offset, int val)
|
||||
static int sgpio_set_value(struct gpio_chip *gc, unsigned int offset, int val)
|
||||
{
|
||||
struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
|
||||
const struct aspeed_sgpio_bank *bank = to_bank(offset);
|
||||
void __iomem *addr;
|
||||
void __iomem *addr_r, *addr_w;
|
||||
u32 reg = 0;
|
||||
|
||||
addr = bank_reg(gpio, bank, reg_val);
|
||||
reg = ioread32(addr);
|
||||
if (aspeed_sgpio_is_input(offset))
|
||||
return -EINVAL;
|
||||
|
||||
/* Since this is an output, read the cached value from rdata, then
|
||||
* update val. */
|
||||
addr_r = bank_reg(gpio, bank, reg_rdata);
|
||||
addr_w = bank_reg(gpio, bank, reg_val);
|
||||
|
||||
reg = ioread32(addr_r);
|
||||
|
||||
if (val)
|
||||
reg |= GPIO_BIT(offset);
|
||||
else
|
||||
reg &= ~GPIO_BIT(offset);
|
||||
|
||||
iowrite32(reg, addr);
|
||||
iowrite32(reg, addr_w);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void aspeed_sgpio_set(struct gpio_chip *gc, unsigned int offset, int val)
|
||||
|
|
@ -175,43 +232,28 @@ static void aspeed_sgpio_set(struct gpio_chip *gc, unsigned int offset, int val)
|
|||
|
||||
static int aspeed_sgpio_dir_in(struct gpio_chip *gc, unsigned int offset)
|
||||
{
|
||||
struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&gpio->lock, flags);
|
||||
gpio->dir_in[GPIO_BANK(offset)] |= GPIO_BIT(offset);
|
||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
||||
|
||||
return 0;
|
||||
return aspeed_sgpio_is_input(offset) ? 0 : -EINVAL;
|
||||
}
|
||||
|
||||
static int aspeed_sgpio_dir_out(struct gpio_chip *gc, unsigned int offset, int val)
|
||||
{
|
||||
struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
/* No special action is required for setting the direction; we'll
|
||||
* error-out in sgpio_set_value if this isn't an output GPIO */
|
||||
|
||||
spin_lock_irqsave(&gpio->lock, flags);
|
||||
|
||||
gpio->dir_in[GPIO_BANK(offset)] &= ~GPIO_BIT(offset);
|
||||
sgpio_set_value(gc, offset, val);
|
||||
|
||||
rc = sgpio_set_value(gc, offset, val);
|
||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
||||
|
||||
return 0;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int aspeed_sgpio_get_direction(struct gpio_chip *gc, unsigned int offset)
|
||||
{
|
||||
int dir_status;
|
||||
struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&gpio->lock, flags);
|
||||
dir_status = gpio->dir_in[GPIO_BANK(offset)] & GPIO_BIT(offset);
|
||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
||||
|
||||
return dir_status;
|
||||
|
||||
return !!aspeed_sgpio_is_input(offset);
|
||||
}
|
||||
|
||||
static void irqd_to_aspeed_sgpio_data(struct irq_data *d,
|
||||
|
|
@ -402,6 +444,7 @@ static int aspeed_sgpio_setup_irqs(struct aspeed_sgpio *gpio,
|
|||
|
||||
irq = &gpio->chip.irq;
|
||||
irq->chip = &aspeed_sgpio_irqchip;
|
||||
irq->init_valid_mask = aspeed_sgpio_irq_init_valid_mask;
|
||||
irq->handler = handle_bad_irq;
|
||||
irq->default_type = IRQ_TYPE_NONE;
|
||||
irq->parent_handler = aspeed_sgpio_irq_handler;
|
||||
|
|
@ -409,17 +452,15 @@ static int aspeed_sgpio_setup_irqs(struct aspeed_sgpio *gpio,
|
|||
irq->parents = &gpio->irq;
|
||||
irq->num_parents = 1;
|
||||
|
||||
/* set IRQ settings and Enable Interrupt */
|
||||
/* Apply default IRQ settings */
|
||||
for (i = 0; i < ARRAY_SIZE(aspeed_sgpio_banks); i++) {
|
||||
bank = &aspeed_sgpio_banks[i];
|
||||
/* set falling or level-low irq */
|
||||
iowrite32(0x00000000, bank_reg(gpio, bank, reg_irq_type0));
|
||||
/* trigger type is edge */
|
||||
iowrite32(0x00000000, bank_reg(gpio, bank, reg_irq_type1));
|
||||
/* dual edge trigger mode. */
|
||||
iowrite32(0xffffffff, bank_reg(gpio, bank, reg_irq_type2));
|
||||
/* enable irq */
|
||||
iowrite32(0xffffffff, bank_reg(gpio, bank, reg_irq_enable));
|
||||
/* single edge trigger */
|
||||
iowrite32(0x00000000, bank_reg(gpio, bank, reg_irq_type2));
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -452,11 +493,12 @@ static int __init aspeed_sgpio_probe(struct platform_device *pdev)
|
|||
if (rc < 0) {
|
||||
dev_err(&pdev->dev, "Could not read ngpios property\n");
|
||||
return -EINVAL;
|
||||
} else if (nr_gpios > MAX_NR_SGPIO) {
|
||||
} else if (nr_gpios > MAX_NR_HW_SGPIO) {
|
||||
dev_err(&pdev->dev, "Number of GPIOs exceeds the maximum of %d: %d\n",
|
||||
MAX_NR_SGPIO, nr_gpios);
|
||||
MAX_NR_HW_SGPIO, nr_gpios);
|
||||
return -EINVAL;
|
||||
}
|
||||
gpio->n_sgpio = nr_gpios;
|
||||
|
||||
rc = of_property_read_u32(pdev->dev.of_node, "bus-frequency", &sgpio_freq);
|
||||
if (rc < 0) {
|
||||
|
|
@ -497,7 +539,8 @@ static int __init aspeed_sgpio_probe(struct platform_device *pdev)
|
|||
spin_lock_init(&gpio->lock);
|
||||
|
||||
gpio->chip.parent = &pdev->dev;
|
||||
gpio->chip.ngpio = nr_gpios;
|
||||
gpio->chip.ngpio = MAX_NR_HW_SGPIO * 2;
|
||||
gpio->chip.init_valid_mask = aspeed_sgpio_init_valid_mask;
|
||||
gpio->chip.direction_input = aspeed_sgpio_dir_in;
|
||||
gpio->chip.direction_output = aspeed_sgpio_dir_out;
|
||||
gpio->chip.get_direction = aspeed_sgpio_get_direction;
|
||||
|
|
@ -509,9 +552,6 @@ static int __init aspeed_sgpio_probe(struct platform_device *pdev)
|
|||
gpio->chip.label = dev_name(&pdev->dev);
|
||||
gpio->chip.base = -1;
|
||||
|
||||
/* set all SGPIO pins as input (1). */
|
||||
memset(gpio->dir_in, 0xff, sizeof(gpio->dir_in));
|
||||
|
||||
aspeed_sgpio_setup_irqs(gpio, pdev);
|
||||
|
||||
rc = devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio);
|
||||
|
|
|
|||
|
|
@ -1114,8 +1114,8 @@ static const struct aspeed_gpio_config ast2500_config =
|
|||
|
||||
static const struct aspeed_bank_props ast2600_bank_props[] = {
|
||||
/* input output */
|
||||
{5, 0xffffffff, 0x0000ffff}, /* U/V/W/X */
|
||||
{6, 0xffff0000, 0x0fff0000}, /* Y/Z */
|
||||
{5, 0xffffffff, 0xffffff00}, /* U/V/W/X */
|
||||
{6, 0x0000ffff, 0x0000ffff}, /* Y/Z */
|
||||
{ },
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -552,6 +552,7 @@ static int __init gpio_mockup_init(void)
|
|||
err = platform_driver_register(&gpio_mockup_driver);
|
||||
if (err) {
|
||||
gpio_mockup_err("error registering platform driver\n");
|
||||
debugfs_remove_recursive(gpio_mockup_dbg_dir);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -582,6 +583,7 @@ static int __init gpio_mockup_init(void)
|
|||
gpio_mockup_err("error registering device");
|
||||
platform_driver_unregister(&gpio_mockup_driver);
|
||||
gpio_mockup_unregister_pdevs();
|
||||
debugfs_remove_recursive(gpio_mockup_dbg_dir);
|
||||
return PTR_ERR(pdev);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1516,7 +1516,7 @@ static int __maybe_unused omap_gpio_runtime_resume(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int omap_gpio_suspend(struct device *dev)
|
||||
static int __maybe_unused omap_gpio_suspend(struct device *dev)
|
||||
{
|
||||
struct gpio_bank *bank = dev_get_drvdata(dev);
|
||||
|
||||
|
|
@ -1528,7 +1528,7 @@ static int omap_gpio_suspend(struct device *dev)
|
|||
return omap_gpio_runtime_suspend(dev);
|
||||
}
|
||||
|
||||
static int omap_gpio_resume(struct device *dev)
|
||||
static int __maybe_unused omap_gpio_resume(struct device *dev)
|
||||
{
|
||||
struct gpio_bank *bank = dev_get_drvdata(dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -818,6 +818,8 @@ static irqreturn_t pca953x_irq_handler(int irq, void *devid)
|
|||
int level;
|
||||
bool ret;
|
||||
|
||||
bitmap_zero(pending, MAX_LINE);
|
||||
|
||||
mutex_lock(&chip->i2c_lock);
|
||||
ret = pca953x_irq_pending(chip, pending);
|
||||
mutex_unlock(&chip->i2c_lock);
|
||||
|
|
@ -940,6 +942,7 @@ static int device_pca95xx_init(struct pca953x_chip *chip, u32 invert)
|
|||
static int device_pca957x_init(struct pca953x_chip *chip, u32 invert)
|
||||
{
|
||||
DECLARE_BITMAP(val, MAX_LINE);
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
ret = device_pca95xx_init(chip, invert);
|
||||
|
|
@ -947,7 +950,9 @@ static int device_pca957x_init(struct pca953x_chip *chip, u32 invert)
|
|||
goto out;
|
||||
|
||||
/* To enable register 6, 7 to control pull up and pull down */
|
||||
memset(val, 0x02, NBANK(chip));
|
||||
for (i = 0; i < NBANK(chip); i++)
|
||||
bitmap_set_value8(val, 0x02, i * BANK_SZ);
|
||||
|
||||
ret = pca953x_write_regs(chip, PCA957X_BKEN, val);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -245,6 +245,7 @@ static int gpio_siox_probe(struct siox_device *sdevice)
|
|||
girq->chip = &ddata->ichip;
|
||||
girq->default_type = IRQ_TYPE_NONE;
|
||||
girq->handler = handle_level_irq;
|
||||
girq->threaded = true;
|
||||
|
||||
ret = devm_gpiochip_add_data(dev, &ddata->gchip, NULL);
|
||||
if (ret)
|
||||
|
|
|
|||
|
|
@ -149,17 +149,20 @@ static int sprd_gpio_irq_set_type(struct irq_data *data,
|
|||
sprd_gpio_update(chip, offset, SPRD_GPIO_IS, 0);
|
||||
sprd_gpio_update(chip, offset, SPRD_GPIO_IBE, 0);
|
||||
sprd_gpio_update(chip, offset, SPRD_GPIO_IEV, 1);
|
||||
sprd_gpio_update(chip, offset, SPRD_GPIO_IC, 1);
|
||||
irq_set_handler_locked(data, handle_edge_irq);
|
||||
break;
|
||||
case IRQ_TYPE_EDGE_FALLING:
|
||||
sprd_gpio_update(chip, offset, SPRD_GPIO_IS, 0);
|
||||
sprd_gpio_update(chip, offset, SPRD_GPIO_IBE, 0);
|
||||
sprd_gpio_update(chip, offset, SPRD_GPIO_IEV, 0);
|
||||
sprd_gpio_update(chip, offset, SPRD_GPIO_IC, 1);
|
||||
irq_set_handler_locked(data, handle_edge_irq);
|
||||
break;
|
||||
case IRQ_TYPE_EDGE_BOTH:
|
||||
sprd_gpio_update(chip, offset, SPRD_GPIO_IS, 0);
|
||||
sprd_gpio_update(chip, offset, SPRD_GPIO_IBE, 1);
|
||||
sprd_gpio_update(chip, offset, SPRD_GPIO_IC, 1);
|
||||
irq_set_handler_locked(data, handle_edge_irq);
|
||||
break;
|
||||
case IRQ_TYPE_LEVEL_HIGH:
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ static void tc3589x_gpio_irq_sync_unlock(struct irq_data *d)
|
|||
continue;
|
||||
|
||||
tc3589x_gpio->oldregs[i][j] = new;
|
||||
tc3589x_reg_write(tc3589x, regmap[i] + j * 8, new);
|
||||
tc3589x_reg_write(tc3589x, regmap[i] + j, new);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -423,6 +423,21 @@ static __poll_t lineevent_poll(struct file *file,
|
|||
return events;
|
||||
}
|
||||
|
||||
static ssize_t lineevent_get_size(void)
|
||||
{
|
||||
#ifdef __x86_64__
|
||||
/* i386 has no padding after 'id' */
|
||||
if (in_ia32_syscall()) {
|
||||
struct compat_gpioeevent_data {
|
||||
compat_u64 timestamp;
|
||||
u32 id;
|
||||
};
|
||||
|
||||
return sizeof(struct compat_gpioeevent_data);
|
||||
}
|
||||
#endif
|
||||
return sizeof(struct gpioevent_data);
|
||||
}
|
||||
|
||||
static ssize_t lineevent_read(struct file *file,
|
||||
char __user *buf,
|
||||
|
|
@ -432,9 +447,20 @@ static ssize_t lineevent_read(struct file *file,
|
|||
struct lineevent_state *le = file->private_data;
|
||||
struct gpioevent_data ge;
|
||||
ssize_t bytes_read = 0;
|
||||
ssize_t ge_size;
|
||||
int ret;
|
||||
|
||||
if (count < sizeof(ge))
|
||||
/*
|
||||
* When compatible system call is being used the struct gpioevent_data,
|
||||
* in case of at least ia32, has different size due to the alignment
|
||||
* differences. Because we have first member 64 bits followed by one of
|
||||
* 32 bits there is no gap between them. The only difference is the
|
||||
* padding at the end of the data structure. Hence, we calculate the
|
||||
* actual sizeof() and pass this as an argument to copy_to_user() to
|
||||
* drop unneeded bytes from the output.
|
||||
*/
|
||||
ge_size = lineevent_get_size();
|
||||
if (count < ge_size)
|
||||
return -EINVAL;
|
||||
|
||||
do {
|
||||
|
|
@ -470,10 +496,10 @@ static ssize_t lineevent_read(struct file *file,
|
|||
break;
|
||||
}
|
||||
|
||||
if (copy_to_user(buf + bytes_read, &ge, sizeof(ge)))
|
||||
if (copy_to_user(buf + bytes_read, &ge, ge_size))
|
||||
return -EFAULT;
|
||||
bytes_read += sizeof(ge);
|
||||
} while (count >= bytes_read + sizeof(ge));
|
||||
bytes_read += ge_size;
|
||||
} while (count >= bytes_read + ge_size);
|
||||
|
||||
return bytes_read;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,8 +80,6 @@ MODULE_FIRMWARE("amdgpu/renoir_gpu_info.bin");
|
|||
MODULE_FIRMWARE("amdgpu/navi10_gpu_info.bin");
|
||||
MODULE_FIRMWARE("amdgpu/navi14_gpu_info.bin");
|
||||
MODULE_FIRMWARE("amdgpu/navi12_gpu_info.bin");
|
||||
MODULE_FIRMWARE("amdgpu/sienna_cichlid_gpu_info.bin");
|
||||
MODULE_FIRMWARE("amdgpu/navy_flounder_gpu_info.bin");
|
||||
|
||||
#define AMDGPU_RESUME_MS 2000
|
||||
|
||||
|
|
@ -1600,6 +1598,8 @@ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
|
|||
case CHIP_CARRIZO:
|
||||
case CHIP_STONEY:
|
||||
case CHIP_VEGA20:
|
||||
case CHIP_SIENNA_CICHLID:
|
||||
case CHIP_NAVY_FLOUNDER:
|
||||
default:
|
||||
return 0;
|
||||
case CHIP_VEGA10:
|
||||
|
|
@ -1631,12 +1631,6 @@ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)
|
|||
case CHIP_NAVI12:
|
||||
chip_name = "navi12";
|
||||
break;
|
||||
case CHIP_SIENNA_CICHLID:
|
||||
chip_name = "sienna_cichlid";
|
||||
break;
|
||||
case CHIP_NAVY_FLOUNDER:
|
||||
chip_name = "navy_flounder";
|
||||
break;
|
||||
}
|
||||
|
||||
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_gpu_info.bin", chip_name);
|
||||
|
|
|
|||
|
|
@ -297,7 +297,7 @@ int amdgpu_display_crtc_set_config(struct drm_mode_set *set,
|
|||
take the current one */
|
||||
if (active && !adev->have_disp_power_ref) {
|
||||
adev->have_disp_power_ref = true;
|
||||
goto out;
|
||||
return ret;
|
||||
}
|
||||
/* if we have no active crtcs, then drop the power ref
|
||||
we got before */
|
||||
|
|
|
|||
|
|
@ -1044,8 +1044,16 @@ static const struct pci_device_id pciidlist[] = {
|
|||
{0x1002, 0x1636, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RENOIR|AMD_IS_APU},
|
||||
|
||||
/* Navi12 */
|
||||
{0x1002, 0x7360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12|AMD_EXP_HW_SUPPORT},
|
||||
{0x1002, 0x7362, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12|AMD_EXP_HW_SUPPORT},
|
||||
{0x1002, 0x7360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12},
|
||||
{0x1002, 0x7362, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI12},
|
||||
|
||||
/* Sienna_Cichlid */
|
||||
{0x1002, 0x73A0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
|
||||
{0x1002, 0x73A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
|
||||
{0x1002, 0x73A3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
|
||||
{0x1002, 0x73AB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
|
||||
{0x1002, 0x73AE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
|
||||
{0x1002, 0x73BF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SIENNA_CICHLID},
|
||||
|
||||
{0, 0, 0}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1076,6 +1076,7 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm)
|
|||
|
||||
release_sg:
|
||||
kfree(ttm->sg);
|
||||
ttm->sg = NULL;
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3595,6 +3595,9 @@ static void gfx_v10_0_check_gfxoff_flag(struct amdgpu_device *adev)
|
|||
if (!gfx_v10_0_navi10_gfxoff_should_enable(adev))
|
||||
adev->pm.pp_feature &= ~PP_GFXOFF_MASK;
|
||||
break;
|
||||
case CHIP_NAVY_FLOUNDER:
|
||||
adev->pm.pp_feature &= ~PP_GFXOFF_MASK;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -746,18 +746,18 @@ static void vcn_v3_0_disable_clock_gating(struct amdgpu_device *adev, int inst)
|
|||
| UVD_SUVD_CGC_GATE__IME_HEVC_MASK
|
||||
| UVD_SUVD_CGC_GATE__EFC_MASK
|
||||
| UVD_SUVD_CGC_GATE__SAOE_MASK
|
||||
| 0x08000000
|
||||
| UVD_SUVD_CGC_GATE__SRE_AV1_MASK
|
||||
| UVD_SUVD_CGC_GATE__FBC_PCLK_MASK
|
||||
| UVD_SUVD_CGC_GATE__FBC_CCLK_MASK
|
||||
| 0x40000000
|
||||
| UVD_SUVD_CGC_GATE__SCM_AV1_MASK
|
||||
| UVD_SUVD_CGC_GATE__SMPA_MASK);
|
||||
WREG32_SOC15(VCN, inst, mmUVD_SUVD_CGC_GATE, data);
|
||||
|
||||
data = RREG32_SOC15(VCN, inst, mmUVD_SUVD_CGC_GATE2);
|
||||
data |= (UVD_SUVD_CGC_GATE2__MPBE0_MASK
|
||||
| UVD_SUVD_CGC_GATE2__MPBE1_MASK
|
||||
| 0x00000004
|
||||
| 0x00000008
|
||||
| UVD_SUVD_CGC_GATE2__SIT_AV1_MASK
|
||||
| UVD_SUVD_CGC_GATE2__SDB_AV1_MASK
|
||||
| UVD_SUVD_CGC_GATE2__MPC1_MASK);
|
||||
WREG32_SOC15(VCN, inst, mmUVD_SUVD_CGC_GATE2, data);
|
||||
|
||||
|
|
@ -776,8 +776,8 @@ static void vcn_v3_0_disable_clock_gating(struct amdgpu_device *adev, int inst)
|
|||
| UVD_SUVD_CGC_CTRL__SMPA_MODE_MASK
|
||||
| UVD_SUVD_CGC_CTRL__MPBE0_MODE_MASK
|
||||
| UVD_SUVD_CGC_CTRL__MPBE1_MODE_MASK
|
||||
| 0x00008000
|
||||
| 0x00010000
|
||||
| UVD_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK
|
||||
| UVD_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK
|
||||
| UVD_SUVD_CGC_CTRL__MPC1_MODE_MASK
|
||||
| UVD_SUVD_CGC_CTRL__FBC_PCLK_MASK
|
||||
| UVD_SUVD_CGC_CTRL__FBC_CCLK_MASK);
|
||||
|
|
@ -892,8 +892,8 @@ static void vcn_v3_0_enable_clock_gating(struct amdgpu_device *adev, int inst)
|
|||
| UVD_SUVD_CGC_CTRL__SMPA_MODE_MASK
|
||||
| UVD_SUVD_CGC_CTRL__MPBE0_MODE_MASK
|
||||
| UVD_SUVD_CGC_CTRL__MPBE1_MODE_MASK
|
||||
| 0x00008000
|
||||
| 0x00010000
|
||||
| UVD_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK
|
||||
| UVD_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK
|
||||
| UVD_SUVD_CGC_CTRL__MPC1_MODE_MASK
|
||||
| UVD_SUVD_CGC_CTRL__FBC_PCLK_MASK
|
||||
| UVD_SUVD_CGC_CTRL__FBC_CCLK_MASK);
|
||||
|
|
|
|||
|
|
@ -604,7 +604,7 @@ struct hdcp_workqueue *hdcp_create_workqueue(struct amdgpu_device *adev, struct
|
|||
int i = 0;
|
||||
|
||||
hdcp_work = kcalloc(max_caps, sizeof(*hdcp_work), GFP_KERNEL);
|
||||
if (hdcp_work == NULL)
|
||||
if (ZERO_OR_NULL_PTR(hdcp_work))
|
||||
return NULL;
|
||||
|
||||
hdcp_work->srm = kcalloc(PSP_HDCP_SRM_FIRST_GEN_MAX_SIZE, sizeof(*hdcp_work->srm), GFP_KERNEL);
|
||||
|
|
|
|||
|
|
@ -783,7 +783,6 @@ void rn_clk_mgr_construct(
|
|||
} else {
|
||||
struct clk_log_info log_info = {0};
|
||||
|
||||
clk_mgr->smu_ver = rn_vbios_smu_get_smu_version(clk_mgr);
|
||||
clk_mgr->periodic_retraining_disabled = rn_vbios_smu_is_periodic_retraining_disabled(clk_mgr);
|
||||
|
||||
/* SMU Version 55.51.0 and up no longer have an issue
|
||||
|
|
|
|||
|
|
@ -31,9 +31,21 @@ DCN30 = dcn30_init.o dcn30_hubbub.o dcn30_hubp.o dcn30_dpp.o dcn30_optc.o \
|
|||
dcn30_dio_link_encoder.o dcn30_resource.o
|
||||
|
||||
|
||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_optc.o := -mhard-float -msse -mpreferred-stack-boundary=4
|
||||
|
||||
ifdef CONFIG_X86
|
||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_resource.o := -mhard-float -msse
|
||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_optc.o := -mhard-float -msse
|
||||
endif
|
||||
|
||||
ifdef CONFIG_PPC64
|
||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_resource.o := -mhard-float -maltivec
|
||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_optc.o := -mhard-float -maltivec
|
||||
endif
|
||||
|
||||
ifdef CONFIG_ARM64
|
||||
CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn30/dcn30_resource.o := -mgeneral-regs-only
|
||||
CFLAGS_REMOVE_$(AMDDALPATH)/dc/dcn30/dcn30_optc.o := -mgeneral-regs-only
|
||||
endif
|
||||
|
||||
ifdef CONFIG_CC_IS_GCC
|
||||
ifeq ($(call cc-ifversion, -lt, 0701, y), y)
|
||||
IS_OLD_GCC = 1
|
||||
|
|
@ -45,8 +57,10 @@ ifdef IS_OLD_GCC
|
|||
# GCC < 7.1 cannot compile code using `double` and -mpreferred-stack-boundary=3
|
||||
# (8B stack alignment).
|
||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_resource.o += -mpreferred-stack-boundary=4
|
||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_optc.o += -mpreferred-stack-boundary=4
|
||||
else
|
||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_resource.o += -msse2
|
||||
CFLAGS_$(AMDDALPATH)/dc/dcn30/dcn30_optc.o += -msse2
|
||||
endif
|
||||
|
||||
AMD_DAL_DCN30 = $(addprefix $(AMDDALPATH)/dc/dcn30/,$(DCN30))
|
||||
|
|
|
|||
|
|
@ -2727,6 +2727,7 @@
|
|||
#define mmDB_STENCIL_WRITE_BASE_DEFAULT 0x00000000
|
||||
#define mmDB_RESERVED_REG_1_DEFAULT 0x00000000
|
||||
#define mmDB_RESERVED_REG_3_DEFAULT 0x00000000
|
||||
#define mmDB_VRS_OVERRIDE_CNTL_DEFAULT 0x00000000
|
||||
#define mmDB_Z_READ_BASE_HI_DEFAULT 0x00000000
|
||||
#define mmDB_STENCIL_READ_BASE_HI_DEFAULT 0x00000000
|
||||
#define mmDB_Z_WRITE_BASE_HI_DEFAULT 0x00000000
|
||||
|
|
@ -3062,6 +3063,7 @@
|
|||
#define mmPA_SU_OVER_RASTERIZATION_CNTL_DEFAULT 0x00000000
|
||||
#define mmPA_STEREO_CNTL_DEFAULT 0x00000000
|
||||
#define mmPA_STATE_STEREO_X_DEFAULT 0x00000000
|
||||
#define mmPA_CL_VRS_CNTL_DEFAULT 0x00000000
|
||||
#define mmPA_SU_POINT_SIZE_DEFAULT 0x00000000
|
||||
#define mmPA_SU_POINT_MINMAX_DEFAULT 0x00000000
|
||||
#define mmPA_SU_LINE_CNTL_DEFAULT 0x00000000
|
||||
|
|
|
|||
|
|
@ -5379,6 +5379,8 @@
|
|||
#define mmDB_RESERVED_REG_1_BASE_IDX 1
|
||||
#define mmDB_RESERVED_REG_3 0x0017
|
||||
#define mmDB_RESERVED_REG_3_BASE_IDX 1
|
||||
#define mmDB_VRS_OVERRIDE_CNTL 0x0019
|
||||
#define mmDB_VRS_OVERRIDE_CNTL_BASE_IDX 1
|
||||
#define mmDB_Z_READ_BASE_HI 0x001a
|
||||
#define mmDB_Z_READ_BASE_HI_BASE_IDX 1
|
||||
#define mmDB_STENCIL_READ_BASE_HI 0x001b
|
||||
|
|
@ -6049,6 +6051,8 @@
|
|||
#define mmPA_STEREO_CNTL_BASE_IDX 1
|
||||
#define mmPA_STATE_STEREO_X 0x0211
|
||||
#define mmPA_STATE_STEREO_X_BASE_IDX 1
|
||||
#define mmPA_CL_VRS_CNTL 0x0212
|
||||
#define mmPA_CL_VRS_CNTL_BASE_IDX 1
|
||||
#define mmPA_SU_POINT_SIZE 0x0280
|
||||
#define mmPA_SU_POINT_SIZE_BASE_IDX 1
|
||||
#define mmPA_SU_POINT_MINMAX 0x0281
|
||||
|
|
|
|||
|
|
@ -9777,6 +9777,7 @@
|
|||
#define DB_EXCEPTION_CONTROL__AUTO_FLUSH_HTILE__SHIFT 0x3
|
||||
#define DB_EXCEPTION_CONTROL__AUTO_FLUSH_QUAD__SHIFT 0x4
|
||||
#define DB_EXCEPTION_CONTROL__FORCE_SUMMARIZE__SHIFT 0x8
|
||||
#define DB_EXCEPTION_CONTROL__FORCE_VRS_RATE_FINE__SHIFT 0x10
|
||||
#define DB_EXCEPTION_CONTROL__DTAG_WATERMARK__SHIFT 0x18
|
||||
#define DB_EXCEPTION_CONTROL__EARLY_Z_PANIC_DISABLE_MASK 0x00000001L
|
||||
#define DB_EXCEPTION_CONTROL__LATE_Z_PANIC_DISABLE_MASK 0x00000002L
|
||||
|
|
@ -9784,6 +9785,7 @@
|
|||
#define DB_EXCEPTION_CONTROL__AUTO_FLUSH_HTILE_MASK 0x00000008L
|
||||
#define DB_EXCEPTION_CONTROL__AUTO_FLUSH_QUAD_MASK 0x00000010L
|
||||
#define DB_EXCEPTION_CONTROL__FORCE_SUMMARIZE_MASK 0x00000F00L
|
||||
#define DB_EXCEPTION_CONTROL__FORCE_VRS_RATE_FINE_MASK 0x00FF0000L
|
||||
#define DB_EXCEPTION_CONTROL__DTAG_WATERMARK_MASK 0x7F000000L
|
||||
//DB_DFSM_CONFIG
|
||||
#define DB_DFSM_CONFIG__BYPASS_DFSM__SHIFT 0x0
|
||||
|
|
@ -10076,6 +10078,7 @@
|
|||
#define CB_HW_CONTROL_3__DISABLE_NACK_PROCESSING_CM__SHIFT 0x18
|
||||
#define CB_HW_CONTROL_3__DISABLE_NACK_COLOR_RD_WR_OPT__SHIFT 0x19
|
||||
#define CB_HW_CONTROL_3__DISABLE_BLENDER_CLOCK_GATING__SHIFT 0x1a
|
||||
#define CB_HW_CONTROL_3__DISABLE_DCC_VRS_OPT__SHIFT 0x1c
|
||||
#define CB_HW_CONTROL_3__DISABLE_FMASK_NOFETCH_OPT__SHIFT 0x1e
|
||||
#define CB_HW_CONTROL_3__DISABLE_FMASK_NOFETCH_OPT_BC__SHIFT 0x1f
|
||||
#define CB_HW_CONTROL_3__DISABLE_SLOW_MODE_EMPTY_HALF_QUAD_KILL_MASK 0x00000001L
|
||||
|
|
@ -10103,12 +10106,15 @@
|
|||
#define CB_HW_CONTROL_3__DISABLE_NACK_PROCESSING_CM_MASK 0x01000000L
|
||||
#define CB_HW_CONTROL_3__DISABLE_NACK_COLOR_RD_WR_OPT_MASK 0x02000000L
|
||||
#define CB_HW_CONTROL_3__DISABLE_BLENDER_CLOCK_GATING_MASK 0x04000000L
|
||||
#define CB_HW_CONTROL_3__DISABLE_DCC_VRS_OPT_MASK 0x10000000L
|
||||
#define CB_HW_CONTROL_3__DISABLE_FMASK_NOFETCH_OPT_MASK 0x40000000L
|
||||
#define CB_HW_CONTROL_3__DISABLE_FMASK_NOFETCH_OPT_BC_MASK 0x80000000L
|
||||
//CB_HW_CONTROL
|
||||
#define CB_HW_CONTROL__ALLOW_MRT_WITH_DUAL_SOURCE__SHIFT 0x0
|
||||
#define CB_HW_CONTROL__DISABLE_VRS_FILLRATE_OPTIMIZATION__SHIFT 0x1
|
||||
#define CB_HW_CONTROL__DISABLE_FILLRATE_OPT_FIX_WITH_CFC__SHIFT 0x3
|
||||
#define CB_HW_CONTROL__DISABLE_POST_DCC_WITH_CFC_FIX__SHIFT 0x4
|
||||
#define CB_HW_CONTROL__DISABLE_COMPRESS_1FRAG_WHEN_VRS_RATE_HINT_EN__SHIFT 0x5
|
||||
#define CB_HW_CONTROL__RMI_CREDITS__SHIFT 0x6
|
||||
#define CB_HW_CONTROL__CHICKEN_BITS__SHIFT 0xc
|
||||
#define CB_HW_CONTROL__DISABLE_FMASK_MULTI_MGCG_DOMAINS__SHIFT 0xf
|
||||
|
|
@ -10129,8 +10135,10 @@
|
|||
#define CB_HW_CONTROL__DISABLE_CC_IB_SERIALIZER_STATE_OPT__SHIFT 0x1e
|
||||
#define CB_HW_CONTROL__DISABLE_PIXEL_IN_QUAD_FIX_FOR_LINEAR_SURFACE__SHIFT 0x1f
|
||||
#define CB_HW_CONTROL__ALLOW_MRT_WITH_DUAL_SOURCE_MASK 0x00000001L
|
||||
#define CB_HW_CONTROL__DISABLE_VRS_FILLRATE_OPTIMIZATION_MASK 0x00000002L
|
||||
#define CB_HW_CONTROL__DISABLE_FILLRATE_OPT_FIX_WITH_CFC_MASK 0x00000008L
|
||||
#define CB_HW_CONTROL__DISABLE_POST_DCC_WITH_CFC_FIX_MASK 0x00000010L
|
||||
#define CB_HW_CONTROL__DISABLE_COMPRESS_1FRAG_WHEN_VRS_RATE_HINT_EN_MASK 0x00000020L
|
||||
#define CB_HW_CONTROL__RMI_CREDITS_MASK 0x00000FC0L
|
||||
#define CB_HW_CONTROL__CHICKEN_BITS_MASK 0x00007000L
|
||||
#define CB_HW_CONTROL__DISABLE_FMASK_MULTI_MGCG_DOMAINS_MASK 0x00008000L
|
||||
|
|
@ -19881,6 +19889,7 @@
|
|||
#define DB_RENDER_OVERRIDE2__PRESERVE_SRESULTS__SHIFT 0x16
|
||||
#define DB_RENDER_OVERRIDE2__DISABLE_FAST_PASS__SHIFT 0x17
|
||||
#define DB_RENDER_OVERRIDE2__ALLOW_PARTIAL_RES_HIER_KILL__SHIFT 0x19
|
||||
#define DB_RENDER_OVERRIDE2__FORCE_VRS_RATE_FINE__SHIFT 0x1a
|
||||
#define DB_RENDER_OVERRIDE2__CENTROID_COMPUTATION_MODE__SHIFT 0x1b
|
||||
#define DB_RENDER_OVERRIDE2__PARTIAL_SQUAD_LAUNCH_CONTROL_MASK 0x00000003L
|
||||
#define DB_RENDER_OVERRIDE2__PARTIAL_SQUAD_LAUNCH_COUNTDOWN_MASK 0x0000001CL
|
||||
|
|
@ -19898,6 +19907,7 @@
|
|||
#define DB_RENDER_OVERRIDE2__PRESERVE_SRESULTS_MASK 0x00400000L
|
||||
#define DB_RENDER_OVERRIDE2__DISABLE_FAST_PASS_MASK 0x00800000L
|
||||
#define DB_RENDER_OVERRIDE2__ALLOW_PARTIAL_RES_HIER_KILL_MASK 0x02000000L
|
||||
#define DB_RENDER_OVERRIDE2__FORCE_VRS_RATE_FINE_MASK 0x04000000L
|
||||
#define DB_RENDER_OVERRIDE2__CENTROID_COMPUTATION_MODE_MASK 0x18000000L
|
||||
//DB_HTILE_DATA_BASE
|
||||
#define DB_HTILE_DATA_BASE__BASE_256B__SHIFT 0x0
|
||||
|
|
@ -20021,6 +20031,13 @@
|
|||
//DB_RESERVED_REG_3
|
||||
#define DB_RESERVED_REG_3__FIELD_1__SHIFT 0x0
|
||||
#define DB_RESERVED_REG_3__FIELD_1_MASK 0x003FFFFFL
|
||||
//DB_VRS_OVERRIDE_CNTL
|
||||
#define DB_VRS_OVERRIDE_CNTL__VRS_OVERRIDE_RATE_COMBINER_MODE__SHIFT 0x0
|
||||
#define DB_VRS_OVERRIDE_CNTL__VRS_OVERRIDE_RATE_X__SHIFT 0x4
|
||||
#define DB_VRS_OVERRIDE_CNTL__VRS_OVERRIDE_RATE_Y__SHIFT 0x6
|
||||
#define DB_VRS_OVERRIDE_CNTL__VRS_OVERRIDE_RATE_COMBINER_MODE_MASK 0x00000007L
|
||||
#define DB_VRS_OVERRIDE_CNTL__VRS_OVERRIDE_RATE_X_MASK 0x00000030L
|
||||
#define DB_VRS_OVERRIDE_CNTL__VRS_OVERRIDE_RATE_Y_MASK 0x000000C0L
|
||||
//DB_Z_READ_BASE_HI
|
||||
#define DB_Z_READ_BASE_HI__BASE_HI__SHIFT 0x0
|
||||
#define DB_Z_READ_BASE_HI__BASE_HI_MASK 0x000000FFL
|
||||
|
|
@ -22598,6 +22615,7 @@
|
|||
#define PA_CL_VS_OUT_CNTL__VS_OUT_MISC_SIDE_BUS_ENA__SHIFT 0x18
|
||||
#define PA_CL_VS_OUT_CNTL__USE_VTX_GS_CUT_FLAG__SHIFT 0x19
|
||||
#define PA_CL_VS_OUT_CNTL__USE_VTX_LINE_WIDTH__SHIFT 0x1b
|
||||
#define PA_CL_VS_OUT_CNTL__USE_VTX_VRS_RATE__SHIFT 0x1c
|
||||
#define PA_CL_VS_OUT_CNTL__BYPASS_VTX_RATE_COMBINER__SHIFT 0x1d
|
||||
#define PA_CL_VS_OUT_CNTL__BYPASS_PRIM_RATE_COMBINER__SHIFT 0x1e
|
||||
#define PA_CL_VS_OUT_CNTL__CLIP_DIST_ENA_0_MASK 0x00000001L
|
||||
|
|
@ -22627,6 +22645,7 @@
|
|||
#define PA_CL_VS_OUT_CNTL__VS_OUT_MISC_SIDE_BUS_ENA_MASK 0x01000000L
|
||||
#define PA_CL_VS_OUT_CNTL__USE_VTX_GS_CUT_FLAG_MASK 0x02000000L
|
||||
#define PA_CL_VS_OUT_CNTL__USE_VTX_LINE_WIDTH_MASK 0x08000000L
|
||||
#define PA_CL_VS_OUT_CNTL__USE_VTX_VRS_RATE_MASK 0x10000000L
|
||||
#define PA_CL_VS_OUT_CNTL__BYPASS_VTX_RATE_COMBINER_MASK 0x20000000L
|
||||
#define PA_CL_VS_OUT_CNTL__BYPASS_PRIM_RATE_COMBINER_MASK 0x40000000L
|
||||
//PA_CL_NANINF_CNTL
|
||||
|
|
@ -22740,6 +22759,19 @@
|
|||
//PA_STATE_STEREO_X
|
||||
#define PA_STATE_STEREO_X__STEREO_X_OFFSET__SHIFT 0x0
|
||||
#define PA_STATE_STEREO_X__STEREO_X_OFFSET_MASK 0xFFFFFFFFL
|
||||
//PA_CL_VRS_CNTL
|
||||
#define PA_CL_VRS_CNTL__VERTEX_RATE_COMBINER_MODE__SHIFT 0x0
|
||||
#define PA_CL_VRS_CNTL__PRIMITIVE_RATE_COMBINER_MODE__SHIFT 0x3
|
||||
#define PA_CL_VRS_CNTL__HTILE_RATE_COMBINER_MODE__SHIFT 0x6
|
||||
#define PA_CL_VRS_CNTL__SAMPLE_ITER_COMBINER_MODE__SHIFT 0x9
|
||||
#define PA_CL_VRS_CNTL__EXPOSE_VRS_PIXELS_MASK__SHIFT 0xd
|
||||
#define PA_CL_VRS_CNTL__CMASK_RATE_HINT_FORCE_ZERO__SHIFT 0xe
|
||||
#define PA_CL_VRS_CNTL__VERTEX_RATE_COMBINER_MODE_MASK 0x00000007L
|
||||
#define PA_CL_VRS_CNTL__PRIMITIVE_RATE_COMBINER_MODE_MASK 0x00000038L
|
||||
#define PA_CL_VRS_CNTL__HTILE_RATE_COMBINER_MODE_MASK 0x000001C0L
|
||||
#define PA_CL_VRS_CNTL__SAMPLE_ITER_COMBINER_MODE_MASK 0x00000E00L
|
||||
#define PA_CL_VRS_CNTL__EXPOSE_VRS_PIXELS_MASK_MASK 0x00002000L
|
||||
#define PA_CL_VRS_CNTL__CMASK_RATE_HINT_FORCE_ZERO_MASK 0x00004000L
|
||||
//PA_SU_POINT_SIZE
|
||||
#define PA_SU_POINT_SIZE__HEIGHT__SHIFT 0x0
|
||||
#define PA_SU_POINT_SIZE__WIDTH__SHIFT 0x10
|
||||
|
|
@ -23088,6 +23120,7 @@
|
|||
#define DB_HTILE_SURFACE__DST_OUTSIDE_ZERO_TO_ONE__SHIFT 0x10
|
||||
#define DB_HTILE_SURFACE__RESERVED_FIELD_6__SHIFT 0x11
|
||||
#define DB_HTILE_SURFACE__PIPE_ALIGNED__SHIFT 0x12
|
||||
#define DB_HTILE_SURFACE__VRS_HTILE_ENCODING__SHIFT 0x13
|
||||
#define DB_HTILE_SURFACE__RESERVED_FIELD_1_MASK 0x00000001L
|
||||
#define DB_HTILE_SURFACE__FULL_CACHE_MASK 0x00000002L
|
||||
#define DB_HTILE_SURFACE__RESERVED_FIELD_2_MASK 0x00000004L
|
||||
|
|
@ -23097,6 +23130,7 @@
|
|||
#define DB_HTILE_SURFACE__DST_OUTSIDE_ZERO_TO_ONE_MASK 0x00010000L
|
||||
#define DB_HTILE_SURFACE__RESERVED_FIELD_6_MASK 0x00020000L
|
||||
#define DB_HTILE_SURFACE__PIPE_ALIGNED_MASK 0x00040000L
|
||||
#define DB_HTILE_SURFACE__VRS_HTILE_ENCODING_MASK 0x00180000L
|
||||
//DB_SRESULTS_COMPARE_STATE0
|
||||
#define DB_SRESULTS_COMPARE_STATE0__COMPAREFUNC0__SHIFT 0x0
|
||||
#define DB_SRESULTS_COMPARE_STATE0__COMPAREVALUE0__SHIFT 0x4
|
||||
|
|
@ -24954,6 +24988,7 @@
|
|||
#define CB_COLOR0_ATTRIB3__CMASK_PIPE_ALIGNED__SHIFT 0x1a
|
||||
#define CB_COLOR0_ATTRIB3__RESOURCE_LEVEL__SHIFT 0x1b
|
||||
#define CB_COLOR0_ATTRIB3__DCC_PIPE_ALIGNED__SHIFT 0x1e
|
||||
#define CB_COLOR0_ATTRIB3__VRS_RATE_HINT_ENABLE__SHIFT 0x1f
|
||||
#define CB_COLOR0_ATTRIB3__MIP0_DEPTH_MASK 0x00001FFFL
|
||||
#define CB_COLOR0_ATTRIB3__META_LINEAR_MASK 0x00002000L
|
||||
#define CB_COLOR0_ATTRIB3__COLOR_SW_MODE_MASK 0x0007C000L
|
||||
|
|
@ -24962,6 +24997,7 @@
|
|||
#define CB_COLOR0_ATTRIB3__CMASK_PIPE_ALIGNED_MASK 0x04000000L
|
||||
#define CB_COLOR0_ATTRIB3__RESOURCE_LEVEL_MASK 0x38000000L
|
||||
#define CB_COLOR0_ATTRIB3__DCC_PIPE_ALIGNED_MASK 0x40000000L
|
||||
#define CB_COLOR0_ATTRIB3__VRS_RATE_HINT_ENABLE_MASK 0x80000000L
|
||||
//CB_COLOR1_ATTRIB3
|
||||
#define CB_COLOR1_ATTRIB3__MIP0_DEPTH__SHIFT 0x0
|
||||
#define CB_COLOR1_ATTRIB3__META_LINEAR__SHIFT 0xd
|
||||
|
|
@ -24971,6 +25007,7 @@
|
|||
#define CB_COLOR1_ATTRIB3__CMASK_PIPE_ALIGNED__SHIFT 0x1a
|
||||
#define CB_COLOR1_ATTRIB3__RESOURCE_LEVEL__SHIFT 0x1b
|
||||
#define CB_COLOR1_ATTRIB3__DCC_PIPE_ALIGNED__SHIFT 0x1e
|
||||
#define CB_COLOR1_ATTRIB3__VRS_RATE_HINT_ENABLE__SHIFT 0x1f
|
||||
#define CB_COLOR1_ATTRIB3__MIP0_DEPTH_MASK 0x00001FFFL
|
||||
#define CB_COLOR1_ATTRIB3__META_LINEAR_MASK 0x00002000L
|
||||
#define CB_COLOR1_ATTRIB3__COLOR_SW_MODE_MASK 0x0007C000L
|
||||
|
|
@ -24979,6 +25016,7 @@
|
|||
#define CB_COLOR1_ATTRIB3__CMASK_PIPE_ALIGNED_MASK 0x04000000L
|
||||
#define CB_COLOR1_ATTRIB3__RESOURCE_LEVEL_MASK 0x38000000L
|
||||
#define CB_COLOR1_ATTRIB3__DCC_PIPE_ALIGNED_MASK 0x40000000L
|
||||
#define CB_COLOR1_ATTRIB3__VRS_RATE_HINT_ENABLE_MASK 0x80000000L
|
||||
//CB_COLOR2_ATTRIB3
|
||||
#define CB_COLOR2_ATTRIB3__MIP0_DEPTH__SHIFT 0x0
|
||||
#define CB_COLOR2_ATTRIB3__META_LINEAR__SHIFT 0xd
|
||||
|
|
@ -24988,6 +25026,7 @@
|
|||
#define CB_COLOR2_ATTRIB3__CMASK_PIPE_ALIGNED__SHIFT 0x1a
|
||||
#define CB_COLOR2_ATTRIB3__RESOURCE_LEVEL__SHIFT 0x1b
|
||||
#define CB_COLOR2_ATTRIB3__DCC_PIPE_ALIGNED__SHIFT 0x1e
|
||||
#define CB_COLOR2_ATTRIB3__VRS_RATE_HINT_ENABLE__SHIFT 0x1f
|
||||
#define CB_COLOR2_ATTRIB3__MIP0_DEPTH_MASK 0x00001FFFL
|
||||
#define CB_COLOR2_ATTRIB3__META_LINEAR_MASK 0x00002000L
|
||||
#define CB_COLOR2_ATTRIB3__COLOR_SW_MODE_MASK 0x0007C000L
|
||||
|
|
@ -24996,6 +25035,7 @@
|
|||
#define CB_COLOR2_ATTRIB3__CMASK_PIPE_ALIGNED_MASK 0x04000000L
|
||||
#define CB_COLOR2_ATTRIB3__RESOURCE_LEVEL_MASK 0x38000000L
|
||||
#define CB_COLOR2_ATTRIB3__DCC_PIPE_ALIGNED_MASK 0x40000000L
|
||||
#define CB_COLOR2_ATTRIB3__VRS_RATE_HINT_ENABLE_MASK 0x80000000L
|
||||
//CB_COLOR3_ATTRIB3
|
||||
#define CB_COLOR3_ATTRIB3__MIP0_DEPTH__SHIFT 0x0
|
||||
#define CB_COLOR3_ATTRIB3__META_LINEAR__SHIFT 0xd
|
||||
|
|
@ -25005,6 +25045,7 @@
|
|||
#define CB_COLOR3_ATTRIB3__CMASK_PIPE_ALIGNED__SHIFT 0x1a
|
||||
#define CB_COLOR3_ATTRIB3__RESOURCE_LEVEL__SHIFT 0x1b
|
||||
#define CB_COLOR3_ATTRIB3__DCC_PIPE_ALIGNED__SHIFT 0x1e
|
||||
#define CB_COLOR3_ATTRIB3__VRS_RATE_HINT_ENABLE__SHIFT 0x1f
|
||||
#define CB_COLOR3_ATTRIB3__MIP0_DEPTH_MASK 0x00001FFFL
|
||||
#define CB_COLOR3_ATTRIB3__META_LINEAR_MASK 0x00002000L
|
||||
#define CB_COLOR3_ATTRIB3__COLOR_SW_MODE_MASK 0x0007C000L
|
||||
|
|
@ -25013,6 +25054,7 @@
|
|||
#define CB_COLOR3_ATTRIB3__CMASK_PIPE_ALIGNED_MASK 0x04000000L
|
||||
#define CB_COLOR3_ATTRIB3__RESOURCE_LEVEL_MASK 0x38000000L
|
||||
#define CB_COLOR3_ATTRIB3__DCC_PIPE_ALIGNED_MASK 0x40000000L
|
||||
#define CB_COLOR3_ATTRIB3__VRS_RATE_HINT_ENABLE_MASK 0x80000000L
|
||||
//CB_COLOR4_ATTRIB3
|
||||
#define CB_COLOR4_ATTRIB3__MIP0_DEPTH__SHIFT 0x0
|
||||
#define CB_COLOR4_ATTRIB3__META_LINEAR__SHIFT 0xd
|
||||
|
|
@ -25022,6 +25064,7 @@
|
|||
#define CB_COLOR4_ATTRIB3__CMASK_PIPE_ALIGNED__SHIFT 0x1a
|
||||
#define CB_COLOR4_ATTRIB3__RESOURCE_LEVEL__SHIFT 0x1b
|
||||
#define CB_COLOR4_ATTRIB3__DCC_PIPE_ALIGNED__SHIFT 0x1e
|
||||
#define CB_COLOR4_ATTRIB3__VRS_RATE_HINT_ENABLE__SHIFT 0x1f
|
||||
#define CB_COLOR4_ATTRIB3__MIP0_DEPTH_MASK 0x00001FFFL
|
||||
#define CB_COLOR4_ATTRIB3__META_LINEAR_MASK 0x00002000L
|
||||
#define CB_COLOR4_ATTRIB3__COLOR_SW_MODE_MASK 0x0007C000L
|
||||
|
|
@ -25030,6 +25073,7 @@
|
|||
#define CB_COLOR4_ATTRIB3__CMASK_PIPE_ALIGNED_MASK 0x04000000L
|
||||
#define CB_COLOR4_ATTRIB3__RESOURCE_LEVEL_MASK 0x38000000L
|
||||
#define CB_COLOR4_ATTRIB3__DCC_PIPE_ALIGNED_MASK 0x40000000L
|
||||
#define CB_COLOR4_ATTRIB3__VRS_RATE_HINT_ENABLE_MASK 0x80000000L
|
||||
//CB_COLOR5_ATTRIB3
|
||||
#define CB_COLOR5_ATTRIB3__MIP0_DEPTH__SHIFT 0x0
|
||||
#define CB_COLOR5_ATTRIB3__META_LINEAR__SHIFT 0xd
|
||||
|
|
@ -25039,6 +25083,7 @@
|
|||
#define CB_COLOR5_ATTRIB3__CMASK_PIPE_ALIGNED__SHIFT 0x1a
|
||||
#define CB_COLOR5_ATTRIB3__RESOURCE_LEVEL__SHIFT 0x1b
|
||||
#define CB_COLOR5_ATTRIB3__DCC_PIPE_ALIGNED__SHIFT 0x1e
|
||||
#define CB_COLOR5_ATTRIB3__VRS_RATE_HINT_ENABLE__SHIFT 0x1f
|
||||
#define CB_COLOR5_ATTRIB3__MIP0_DEPTH_MASK 0x00001FFFL
|
||||
#define CB_COLOR5_ATTRIB3__META_LINEAR_MASK 0x00002000L
|
||||
#define CB_COLOR5_ATTRIB3__COLOR_SW_MODE_MASK 0x0007C000L
|
||||
|
|
@ -25047,6 +25092,7 @@
|
|||
#define CB_COLOR5_ATTRIB3__CMASK_PIPE_ALIGNED_MASK 0x04000000L
|
||||
#define CB_COLOR5_ATTRIB3__RESOURCE_LEVEL_MASK 0x38000000L
|
||||
#define CB_COLOR5_ATTRIB3__DCC_PIPE_ALIGNED_MASK 0x40000000L
|
||||
#define CB_COLOR5_ATTRIB3__VRS_RATE_HINT_ENABLE_MASK 0x80000000L
|
||||
//CB_COLOR6_ATTRIB3
|
||||
#define CB_COLOR6_ATTRIB3__MIP0_DEPTH__SHIFT 0x0
|
||||
#define CB_COLOR6_ATTRIB3__META_LINEAR__SHIFT 0xd
|
||||
|
|
@ -25056,6 +25102,7 @@
|
|||
#define CB_COLOR6_ATTRIB3__CMASK_PIPE_ALIGNED__SHIFT 0x1a
|
||||
#define CB_COLOR6_ATTRIB3__RESOURCE_LEVEL__SHIFT 0x1b
|
||||
#define CB_COLOR6_ATTRIB3__DCC_PIPE_ALIGNED__SHIFT 0x1e
|
||||
#define CB_COLOR6_ATTRIB3__VRS_RATE_HINT_ENABLE__SHIFT 0x1f
|
||||
#define CB_COLOR6_ATTRIB3__MIP0_DEPTH_MASK 0x00001FFFL
|
||||
#define CB_COLOR6_ATTRIB3__META_LINEAR_MASK 0x00002000L
|
||||
#define CB_COLOR6_ATTRIB3__COLOR_SW_MODE_MASK 0x0007C000L
|
||||
|
|
@ -25064,6 +25111,7 @@
|
|||
#define CB_COLOR6_ATTRIB3__CMASK_PIPE_ALIGNED_MASK 0x04000000L
|
||||
#define CB_COLOR6_ATTRIB3__RESOURCE_LEVEL_MASK 0x38000000L
|
||||
#define CB_COLOR6_ATTRIB3__DCC_PIPE_ALIGNED_MASK 0x40000000L
|
||||
#define CB_COLOR6_ATTRIB3__VRS_RATE_HINT_ENABLE_MASK 0x80000000L
|
||||
//CB_COLOR7_ATTRIB3
|
||||
#define CB_COLOR7_ATTRIB3__MIP0_DEPTH__SHIFT 0x0
|
||||
#define CB_COLOR7_ATTRIB3__META_LINEAR__SHIFT 0xd
|
||||
|
|
@ -25073,6 +25121,7 @@
|
|||
#define CB_COLOR7_ATTRIB3__CMASK_PIPE_ALIGNED__SHIFT 0x1a
|
||||
#define CB_COLOR7_ATTRIB3__RESOURCE_LEVEL__SHIFT 0x1b
|
||||
#define CB_COLOR7_ATTRIB3__DCC_PIPE_ALIGNED__SHIFT 0x1e
|
||||
#define CB_COLOR7_ATTRIB3__VRS_RATE_HINT_ENABLE__SHIFT 0x1f
|
||||
#define CB_COLOR7_ATTRIB3__MIP0_DEPTH_MASK 0x00001FFFL
|
||||
#define CB_COLOR7_ATTRIB3__META_LINEAR_MASK 0x00002000L
|
||||
#define CB_COLOR7_ATTRIB3__COLOR_SW_MODE_MASK 0x0007C000L
|
||||
|
|
@ -25081,6 +25130,7 @@
|
|||
#define CB_COLOR7_ATTRIB3__CMASK_PIPE_ALIGNED_MASK 0x04000000L
|
||||
#define CB_COLOR7_ATTRIB3__RESOURCE_LEVEL_MASK 0x38000000L
|
||||
#define CB_COLOR7_ATTRIB3__DCC_PIPE_ALIGNED_MASK 0x40000000L
|
||||
#define CB_COLOR7_ATTRIB3__VRS_RATE_HINT_ENABLE_MASK 0x80000000L
|
||||
|
||||
|
||||
// addressBlock: gc_gfxudec
|
||||
|
|
|
|||
|
|
@ -2393,6 +2393,7 @@
|
|||
#define VCN_FEATURES__HAS_MJPEG2_IDCT_DEC__SHIFT 0x7
|
||||
#define VCN_FEATURES__HAS_SCLR_DEC__SHIFT 0x8
|
||||
#define VCN_FEATURES__HAS_VP9_DEC__SHIFT 0x9
|
||||
#define VCN_FEATURES__HAS_AV1_DEC__SHIFT 0xa
|
||||
#define VCN_FEATURES__HAS_EFC_ENC__SHIFT 0xb
|
||||
#define VCN_FEATURES__HAS_EFC_HDR2SDR_ENC__SHIFT 0xc
|
||||
#define VCN_FEATURES__HAS_DUAL_MJPEG_DEC__SHIFT 0xd
|
||||
|
|
@ -2407,6 +2408,7 @@
|
|||
#define VCN_FEATURES__HAS_MJPEG2_IDCT_DEC_MASK 0x00000080L
|
||||
#define VCN_FEATURES__HAS_SCLR_DEC_MASK 0x00000100L
|
||||
#define VCN_FEATURES__HAS_VP9_DEC_MASK 0x00000200L
|
||||
#define VCN_FEATURES__HAS_AV1_DEC_MASK 0x00000400L
|
||||
#define VCN_FEATURES__HAS_EFC_ENC_MASK 0x00000800L
|
||||
#define VCN_FEATURES__HAS_EFC_HDR2SDR_ENC_MASK 0x00001000L
|
||||
#define VCN_FEATURES__HAS_DUAL_MJPEG_DEC_MASK 0x00002000L
|
||||
|
|
@ -2809,8 +2811,10 @@
|
|||
#define UVD_SUVD_CGC_GATE__IME_HEVC__SHIFT 0x18
|
||||
#define UVD_SUVD_CGC_GATE__EFC__SHIFT 0x19
|
||||
#define UVD_SUVD_CGC_GATE__SAOE__SHIFT 0x1a
|
||||
#define UVD_SUVD_CGC_GATE__SRE_AV1__SHIFT 0x1b
|
||||
#define UVD_SUVD_CGC_GATE__FBC_PCLK__SHIFT 0x1c
|
||||
#define UVD_SUVD_CGC_GATE__FBC_CCLK__SHIFT 0x1d
|
||||
#define UVD_SUVD_CGC_GATE__SCM_AV1__SHIFT 0x1e
|
||||
#define UVD_SUVD_CGC_GATE__SMPA__SHIFT 0x1f
|
||||
#define UVD_SUVD_CGC_GATE__SRE_MASK 0x00000001L
|
||||
#define UVD_SUVD_CGC_GATE__SIT_MASK 0x00000002L
|
||||
|
|
@ -2839,8 +2843,10 @@
|
|||
#define UVD_SUVD_CGC_GATE__IME_HEVC_MASK 0x01000000L
|
||||
#define UVD_SUVD_CGC_GATE__EFC_MASK 0x02000000L
|
||||
#define UVD_SUVD_CGC_GATE__SAOE_MASK 0x04000000L
|
||||
#define UVD_SUVD_CGC_GATE__SRE_AV1_MASK 0x08000000L
|
||||
#define UVD_SUVD_CGC_GATE__FBC_PCLK_MASK 0x10000000L
|
||||
#define UVD_SUVD_CGC_GATE__FBC_CCLK_MASK 0x20000000L
|
||||
#define UVD_SUVD_CGC_GATE__SCM_AV1_MASK 0x40000000L
|
||||
#define UVD_SUVD_CGC_GATE__SMPA_MASK 0x80000000L
|
||||
//UVD_SUVD_CGC_STATUS
|
||||
#define UVD_SUVD_CGC_STATUS__SRE_VCLK__SHIFT 0x0
|
||||
|
|
@ -2873,6 +2879,8 @@
|
|||
#define UVD_SUVD_CGC_STATUS__IME_HEVC_DCLK__SHIFT 0x1b
|
||||
#define UVD_SUVD_CGC_STATUS__EFC_DCLK__SHIFT 0x1c
|
||||
#define UVD_SUVD_CGC_STATUS__SAOE_DCLK__SHIFT 0x1d
|
||||
#define UVD_SUVD_CGC_STATUS__SRE_AV1_VCLK__SHIFT 0x1e
|
||||
#define UVD_SUVD_CGC_STATUS__SCM_AV1_DCLK__SHIFT 0x1f
|
||||
#define UVD_SUVD_CGC_STATUS__SRE_VCLK_MASK 0x00000001L
|
||||
#define UVD_SUVD_CGC_STATUS__SRE_DCLK_MASK 0x00000002L
|
||||
#define UVD_SUVD_CGC_STATUS__SIT_DCLK_MASK 0x00000004L
|
||||
|
|
@ -2903,6 +2911,8 @@
|
|||
#define UVD_SUVD_CGC_STATUS__IME_HEVC_DCLK_MASK 0x08000000L
|
||||
#define UVD_SUVD_CGC_STATUS__EFC_DCLK_MASK 0x10000000L
|
||||
#define UVD_SUVD_CGC_STATUS__SAOE_DCLK_MASK 0x20000000L
|
||||
#define UVD_SUVD_CGC_STATUS__SRE_AV1_VCLK_MASK 0x40000000L
|
||||
#define UVD_SUVD_CGC_STATUS__SCM_AV1_DCLK_MASK 0x80000000L
|
||||
//UVD_SUVD_CGC_CTRL
|
||||
#define UVD_SUVD_CGC_CTRL__SRE_MODE__SHIFT 0x0
|
||||
#define UVD_SUVD_CGC_CTRL__SIT_MODE__SHIFT 0x1
|
||||
|
|
@ -2919,6 +2929,8 @@
|
|||
#define UVD_SUVD_CGC_CTRL__SMPA_MODE__SHIFT 0xc
|
||||
#define UVD_SUVD_CGC_CTRL__MPBE0_MODE__SHIFT 0xd
|
||||
#define UVD_SUVD_CGC_CTRL__MPBE1_MODE__SHIFT 0xe
|
||||
#define UVD_SUVD_CGC_CTRL__SIT_AV1_MODE__SHIFT 0xf
|
||||
#define UVD_SUVD_CGC_CTRL__SDB_AV1_MODE__SHIFT 0x10
|
||||
#define UVD_SUVD_CGC_CTRL__MPC1_MODE__SHIFT 0x11
|
||||
#define UVD_SUVD_CGC_CTRL__FBC_PCLK__SHIFT 0x1c
|
||||
#define UVD_SUVD_CGC_CTRL__FBC_CCLK__SHIFT 0x1d
|
||||
|
|
@ -2937,6 +2949,8 @@
|
|||
#define UVD_SUVD_CGC_CTRL__SMPA_MODE_MASK 0x00001000L
|
||||
#define UVD_SUVD_CGC_CTRL__MPBE0_MODE_MASK 0x00002000L
|
||||
#define UVD_SUVD_CGC_CTRL__MPBE1_MODE_MASK 0x00004000L
|
||||
#define UVD_SUVD_CGC_CTRL__SIT_AV1_MODE_MASK 0x00008000L
|
||||
#define UVD_SUVD_CGC_CTRL__SDB_AV1_MODE_MASK 0x00010000L
|
||||
#define UVD_SUVD_CGC_CTRL__MPC1_MODE_MASK 0x00020000L
|
||||
#define UVD_SUVD_CGC_CTRL__FBC_PCLK_MASK 0x10000000L
|
||||
#define UVD_SUVD_CGC_CTRL__FBC_CCLK_MASK 0x20000000L
|
||||
|
|
@ -3658,6 +3672,8 @@
|
|||
#define UVD_SUVD_CGC_STATUS2__SMPA_VCLK__SHIFT 0x0
|
||||
#define UVD_SUVD_CGC_STATUS2__SMPA_DCLK__SHIFT 0x1
|
||||
#define UVD_SUVD_CGC_STATUS2__MPBE1_DCLK__SHIFT 0x3
|
||||
#define UVD_SUVD_CGC_STATUS2__SIT_AV1_DCLK__SHIFT 0x4
|
||||
#define UVD_SUVD_CGC_STATUS2__SDB_AV1_DCLK__SHIFT 0x5
|
||||
#define UVD_SUVD_CGC_STATUS2__MPC1_DCLK__SHIFT 0x6
|
||||
#define UVD_SUVD_CGC_STATUS2__MPC1_SCLK__SHIFT 0x7
|
||||
#define UVD_SUVD_CGC_STATUS2__MPC1_VCLK__SHIFT 0x8
|
||||
|
|
@ -3666,6 +3682,8 @@
|
|||
#define UVD_SUVD_CGC_STATUS2__SMPA_VCLK_MASK 0x00000001L
|
||||
#define UVD_SUVD_CGC_STATUS2__SMPA_DCLK_MASK 0x00000002L
|
||||
#define UVD_SUVD_CGC_STATUS2__MPBE1_DCLK_MASK 0x00000008L
|
||||
#define UVD_SUVD_CGC_STATUS2__SIT_AV1_DCLK_MASK 0x00000010L
|
||||
#define UVD_SUVD_CGC_STATUS2__SDB_AV1_DCLK_MASK 0x00000020L
|
||||
#define UVD_SUVD_CGC_STATUS2__MPC1_DCLK_MASK 0x00000040L
|
||||
#define UVD_SUVD_CGC_STATUS2__MPC1_SCLK_MASK 0x00000080L
|
||||
#define UVD_SUVD_CGC_STATUS2__MPC1_VCLK_MASK 0x00000100L
|
||||
|
|
@ -3674,25 +3692,41 @@
|
|||
//UVD_SUVD_CGC_GATE2
|
||||
#define UVD_SUVD_CGC_GATE2__MPBE0__SHIFT 0x0
|
||||
#define UVD_SUVD_CGC_GATE2__MPBE1__SHIFT 0x1
|
||||
#define UVD_SUVD_CGC_GATE2__SIT_AV1__SHIFT 0x2
|
||||
#define UVD_SUVD_CGC_GATE2__SDB_AV1__SHIFT 0x3
|
||||
#define UVD_SUVD_CGC_GATE2__MPC1__SHIFT 0x4
|
||||
#define UVD_SUVD_CGC_GATE2__MPBE0_MASK 0x00000001L
|
||||
#define UVD_SUVD_CGC_GATE2__MPBE1_MASK 0x00000002L
|
||||
#define UVD_SUVD_CGC_GATE2__SIT_AV1_MASK 0x00000004L
|
||||
#define UVD_SUVD_CGC_GATE2__SDB_AV1_MASK 0x00000008L
|
||||
#define UVD_SUVD_CGC_GATE2__MPC1_MASK 0x00000010L
|
||||
//UVD_SUVD_INT_STATUS2
|
||||
#define UVD_SUVD_INT_STATUS2__SMPA_FUNC_INT__SHIFT 0x0
|
||||
#define UVD_SUVD_INT_STATUS2__SMPA_ERR_INT__SHIFT 0x5
|
||||
#define UVD_SUVD_INT_STATUS2__SDB_AV1_FUNC_INT__SHIFT 0x6
|
||||
#define UVD_SUVD_INT_STATUS2__SDB_AV1_ERR_INT__SHIFT 0xb
|
||||
#define UVD_SUVD_INT_STATUS2__SMPA_FUNC_INT_MASK 0x0000001FL
|
||||
#define UVD_SUVD_INT_STATUS2__SMPA_ERR_INT_MASK 0x00000020L
|
||||
#define UVD_SUVD_INT_STATUS2__SDB_AV1_FUNC_INT_MASK 0x000007C0L
|
||||
#define UVD_SUVD_INT_STATUS2__SDB_AV1_ERR_INT_MASK 0x00000800L
|
||||
//UVD_SUVD_INT_EN2
|
||||
#define UVD_SUVD_INT_EN2__SMPA_FUNC_INT_EN__SHIFT 0x0
|
||||
#define UVD_SUVD_INT_EN2__SMPA_ERR_INT_EN__SHIFT 0x5
|
||||
#define UVD_SUVD_INT_EN2__SDB_AV1_FUNC_INT_EN__SHIFT 0x6
|
||||
#define UVD_SUVD_INT_EN2__SDB_AV1_ERR_INT_EN__SHIFT 0xb
|
||||
#define UVD_SUVD_INT_EN2__SMPA_FUNC_INT_EN_MASK 0x0000001FL
|
||||
#define UVD_SUVD_INT_EN2__SMPA_ERR_INT_EN_MASK 0x00000020L
|
||||
#define UVD_SUVD_INT_EN2__SDB_AV1_FUNC_INT_EN_MASK 0x000007C0L
|
||||
#define UVD_SUVD_INT_EN2__SDB_AV1_ERR_INT_EN_MASK 0x00000800L
|
||||
//UVD_SUVD_INT_ACK2
|
||||
#define UVD_SUVD_INT_ACK2__SMPA_FUNC_INT_ACK__SHIFT 0x0
|
||||
#define UVD_SUVD_INT_ACK2__SMPA_ERR_INT_ACK__SHIFT 0x5
|
||||
#define UVD_SUVD_INT_ACK2__SDB_AV1_FUNC_INT_ACK__SHIFT 0x6
|
||||
#define UVD_SUVD_INT_ACK2__SDB_AV1_ERR_INT_ACK__SHIFT 0xb
|
||||
#define UVD_SUVD_INT_ACK2__SMPA_FUNC_INT_ACK_MASK 0x0000001FL
|
||||
#define UVD_SUVD_INT_ACK2__SMPA_ERR_INT_ACK_MASK 0x00000020L
|
||||
#define UVD_SUVD_INT_ACK2__SDB_AV1_FUNC_INT_ACK_MASK 0x000007C0L
|
||||
#define UVD_SUVD_INT_ACK2__SDB_AV1_ERR_INT_ACK_MASK 0x00000800L
|
||||
|
||||
|
||||
// addressBlock: uvd0_ecpudec
|
||||
|
|
|
|||
|
|
@ -479,17 +479,6 @@ static int smu_late_init(void *handle)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set initialized values (get from vbios) to dpm tables context such as
|
||||
* gfxclk, memclk, dcefclk, and etc. And enable the DPM feature for each
|
||||
* type of clks.
|
||||
*/
|
||||
ret = smu_set_default_dpm_table(smu);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Failed to setup default dpm clock tables!\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = smu_populate_umd_state_clk(smu);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Failed to populate UMD state clocks!\n");
|
||||
|
|
@ -984,6 +973,17 @@ static int smu_smc_hw_setup(struct smu_context *smu)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set initialized values (get from vbios) to dpm tables context such as
|
||||
* gfxclk, memclk, dcefclk, and etc. And enable the DPM feature for each
|
||||
* type of clks.
|
||||
*/
|
||||
ret = smu_set_default_dpm_table(smu);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Failed to setup default dpm clock tables!\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = smu_notify_display_change(smu);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -563,6 +563,8 @@ static int smu10_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
|
|||
struct smu10_hwmgr *data = hwmgr->backend;
|
||||
uint32_t min_sclk = hwmgr->display_config->min_core_set_clock;
|
||||
uint32_t min_mclk = hwmgr->display_config->min_mem_set_clock/100;
|
||||
uint32_t index_fclk = data->clock_vol_info.vdd_dep_on_fclk->count - 1;
|
||||
uint32_t index_socclk = data->clock_vol_info.vdd_dep_on_socclk->count - 1;
|
||||
|
||||
if (hwmgr->smu_version < 0x1E3700) {
|
||||
pr_info("smu firmware version too old, can not set dpm level\n");
|
||||
|
|
@ -676,13 +678,13 @@ static int smu10_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
|
|||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetHardMinFclkByFreq,
|
||||
hwmgr->display_config->num_display > 3 ?
|
||||
SMU10_UMD_PSTATE_PEAK_FCLK :
|
||||
data->clock_vol_info.vdd_dep_on_fclk->entries[0].clk :
|
||||
min_mclk,
|
||||
NULL);
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetHardMinSocclkByFreq,
|
||||
SMU10_UMD_PSTATE_MIN_SOCCLK,
|
||||
data->clock_vol_info.vdd_dep_on_socclk->entries[0].clk,
|
||||
NULL);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetHardMinVcn,
|
||||
|
|
@ -695,11 +697,11 @@ static int smu10_dpm_force_dpm_level(struct pp_hwmgr *hwmgr,
|
|||
NULL);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSoftMaxFclkByFreq,
|
||||
SMU10_UMD_PSTATE_PEAK_FCLK,
|
||||
data->clock_vol_info.vdd_dep_on_fclk->entries[index_fclk].clk,
|
||||
NULL);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSoftMaxSocclkByFreq,
|
||||
SMU10_UMD_PSTATE_PEAK_SOCCLK,
|
||||
data->clock_vol_info.vdd_dep_on_socclk->entries[index_socclk].clk,
|
||||
NULL);
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetSoftMaxVcn,
|
||||
|
|
|
|||
|
|
@ -232,14 +232,16 @@ static int renoir_get_profiling_clk_mask(struct smu_context *smu,
|
|||
*sclk_mask = 0;
|
||||
} else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK) {
|
||||
if (mclk_mask)
|
||||
*mclk_mask = 0;
|
||||
/* mclk levels are in reverse order */
|
||||
*mclk_mask = NUM_MEMCLK_DPM_LEVELS - 1;
|
||||
} else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) {
|
||||
if(sclk_mask)
|
||||
/* The sclk as gfxclk and has three level about max/min/current */
|
||||
*sclk_mask = 3 - 1;
|
||||
|
||||
if(mclk_mask)
|
||||
*mclk_mask = NUM_MEMCLK_DPM_LEVELS - 1;
|
||||
/* mclk levels are in reverse order */
|
||||
*mclk_mask = 0;
|
||||
|
||||
if(soc_mask)
|
||||
*soc_mask = NUM_SOCCLK_DPM_LEVELS - 1;
|
||||
|
|
@ -333,7 +335,7 @@ static int renoir_get_dpm_ultimate_freq(struct smu_context *smu,
|
|||
case SMU_UCLK:
|
||||
case SMU_FCLK:
|
||||
case SMU_MCLK:
|
||||
ret = renoir_get_dpm_clk_limited(smu, clk_type, 0, min);
|
||||
ret = renoir_get_dpm_clk_limited(smu, clk_type, NUM_MEMCLK_DPM_LEVELS - 1, min);
|
||||
if (ret)
|
||||
goto failed;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man,
|
|||
|
||||
id = ida_alloc_max(&gman->gmr_ida, gman->max_gmr_ids - 1, GFP_KERNEL);
|
||||
if (id < 0)
|
||||
return (id != -ENOMEM ? 0 : id);
|
||||
return id;
|
||||
|
||||
spin_lock(&gman->lock);
|
||||
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ static int vmw_thp_get_node(struct ttm_mem_type_manager *man,
|
|||
mem->start = node->start;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,9 @@ struct i2c_ram {
|
|||
char res1[4]; /* Reserved */
|
||||
ushort rpbase; /* Relocation pointer */
|
||||
char res2[2]; /* Reserved */
|
||||
/* The following elements are only for CPM2 */
|
||||
char res3[4]; /* Reserved */
|
||||
uint sdmatmp; /* Internal */
|
||||
};
|
||||
|
||||
#define I2COM_START 0x80
|
||||
|
|
|
|||
|
|
@ -1917,6 +1917,7 @@ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
|
||||
pci_set_drvdata(dev, priv);
|
||||
|
||||
dev_pm_set_driver_flags(&dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);
|
||||
pm_runtime_set_autosuspend_delay(&dev->dev, 1000);
|
||||
pm_runtime_use_autosuspend(&dev->dev);
|
||||
pm_runtime_put_autosuspend(&dev->dev);
|
||||
|
|
|
|||
|
|
@ -2163,6 +2163,15 @@ static int npcm_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
|
|||
if (bus->cmd_err == -EAGAIN)
|
||||
ret = i2c_recover_bus(adap);
|
||||
|
||||
/*
|
||||
* After any type of error, check if LAST bit is still set,
|
||||
* due to a HW issue.
|
||||
* It cannot be cleared without resetting the module.
|
||||
*/
|
||||
if (bus->cmd_err &&
|
||||
(NPCM_I2CRXF_CTL_LAST_PEC & ioread8(bus->reg + NPCM_I2CRXF_CTL)))
|
||||
npcm_i2c_reset(bus);
|
||||
|
||||
#if IS_ENABLED(CONFIG_I2C_SLAVE)
|
||||
/* reenable slave if it was enabled */
|
||||
if (bus->slave)
|
||||
|
|
|
|||
|
|
@ -177,12 +177,12 @@ static const struct iio_chan_spec ad7124_channel_template = {
|
|||
|
||||
static struct ad7124_chip_info ad7124_chip_info_tbl[] = {
|
||||
[ID_AD7124_4] = {
|
||||
.name = "ad7127-4",
|
||||
.name = "ad7124-4",
|
||||
.chip_id = CHIPID_AD7124_4,
|
||||
.num_inputs = 8,
|
||||
},
|
||||
[ID_AD7124_8] = {
|
||||
.name = "ad7127-8",
|
||||
.name = "ad7124-8",
|
||||
.chip_id = CHIPID_AD7124_8,
|
||||
.num_inputs = 16,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -982,7 +982,7 @@ static int adc5_probe(struct platform_device *pdev)
|
|||
|
||||
static struct platform_driver adc5_driver = {
|
||||
.driver = {
|
||||
.name = "qcom-spmi-adc5.c",
|
||||
.name = "qcom-spmi-adc5",
|
||||
.of_match_table = adc5_match_table,
|
||||
},
|
||||
.probe = adc5_probe,
|
||||
|
|
|
|||
|
|
@ -282,6 +282,8 @@ static int trackpoint_start_protocol(struct psmouse *psmouse,
|
|||
case TP_VARIANT_ALPS:
|
||||
case TP_VARIANT_ELAN:
|
||||
case TP_VARIANT_NXP:
|
||||
case TP_VARIANT_JYT_SYNAPTICS:
|
||||
case TP_VARIANT_SYNAPTICS:
|
||||
if (variant_id)
|
||||
*variant_id = param[0];
|
||||
if (firmware_id)
|
||||
|
|
|
|||
|
|
@ -721,6 +721,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = {
|
|||
DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Acer Aspire 5 A515 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Grumpy_PK"),
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "PK"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1103,25 +1103,6 @@ static int __init add_early_maps(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reads the device exclusion range from ACPI and initializes the IOMMU with
|
||||
* it
|
||||
*/
|
||||
static void __init set_device_exclusion_range(u16 devid, struct ivmd_header *m)
|
||||
{
|
||||
if (!(m->flags & IVMD_FLAG_EXCL_RANGE))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Treat per-device exclusion ranges as r/w unity-mapped regions
|
||||
* since some buggy BIOSes might lead to the overwritten exclusion
|
||||
* range (exclusion_start and exclusion_length members). This
|
||||
* happens when there are multiple exclusion ranges (IVMD entries)
|
||||
* defined in ACPI table.
|
||||
*/
|
||||
m->flags = (IVMD_FLAG_IW | IVMD_FLAG_IR | IVMD_FLAG_UNITY_MAP);
|
||||
}
|
||||
|
||||
/*
|
||||
* Takes a pointer to an AMD IOMMU entry in the ACPI table and
|
||||
* initializes the hardware and our data structures with it.
|
||||
|
|
@ -2073,30 +2054,6 @@ static void __init free_unity_maps(void)
|
|||
}
|
||||
}
|
||||
|
||||
/* called when we find an exclusion range definition in ACPI */
|
||||
static int __init init_exclusion_range(struct ivmd_header *m)
|
||||
{
|
||||
int i;
|
||||
|
||||
switch (m->type) {
|
||||
case ACPI_IVMD_TYPE:
|
||||
set_device_exclusion_range(m->devid, m);
|
||||
break;
|
||||
case ACPI_IVMD_TYPE_ALL:
|
||||
for (i = 0; i <= amd_iommu_last_bdf; ++i)
|
||||
set_device_exclusion_range(i, m);
|
||||
break;
|
||||
case ACPI_IVMD_TYPE_RANGE:
|
||||
for (i = m->devid; i <= m->aux; ++i)
|
||||
set_device_exclusion_range(i, m);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* called for unity map ACPI definition */
|
||||
static int __init init_unity_map_range(struct ivmd_header *m)
|
||||
{
|
||||
|
|
@ -2107,9 +2064,6 @@ static int __init init_unity_map_range(struct ivmd_header *m)
|
|||
if (e == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (m->flags & IVMD_FLAG_EXCL_RANGE)
|
||||
init_exclusion_range(m);
|
||||
|
||||
switch (m->type) {
|
||||
default:
|
||||
kfree(e);
|
||||
|
|
@ -2133,6 +2087,16 @@ static int __init init_unity_map_range(struct ivmd_header *m)
|
|||
e->address_end = e->address_start + PAGE_ALIGN(m->range_length);
|
||||
e->prot = m->flags >> 1;
|
||||
|
||||
/*
|
||||
* Treat per-device exclusion ranges as r/w unity-mapped regions
|
||||
* since some buggy BIOSes might lead to the overwritten exclusion
|
||||
* range (exclusion_start and exclusion_length members). This
|
||||
* happens when there are multiple exclusion ranges (IVMD entries)
|
||||
* defined in ACPI table.
|
||||
*/
|
||||
if (m->flags & IVMD_FLAG_EXCL_RANGE)
|
||||
e->prot = (IVMD_FLAG_IW | IVMD_FLAG_IR) >> 1;
|
||||
|
||||
DUMP_printk("%s devid_start: %02x:%02x.%x devid_end: %02x:%02x.%x"
|
||||
" range_start: %016llx range_end: %016llx flags: %x\n", s,
|
||||
PCI_BUS_NUM(e->devid_start), PCI_SLOT(e->devid_start),
|
||||
|
|
|
|||
|
|
@ -1295,13 +1295,17 @@ static int exynos_iommu_of_xlate(struct device *dev,
|
|||
return -ENODEV;
|
||||
|
||||
data = platform_get_drvdata(sysmmu);
|
||||
if (!data)
|
||||
if (!data) {
|
||||
put_device(&sysmmu->dev);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!owner) {
|
||||
owner = kzalloc(sizeof(*owner), GFP_KERNEL);
|
||||
if (!owner)
|
||||
if (!owner) {
|
||||
put_device(&sysmmu->dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&owner->controllers);
|
||||
mutex_init(&owner->rpm_lock);
|
||||
|
|
|
|||
|
|
@ -2664,7 +2664,7 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,
|
|||
}
|
||||
|
||||
/* Setup the PASID entry for requests without PASID: */
|
||||
spin_lock(&iommu->lock);
|
||||
spin_lock_irqsave(&iommu->lock, flags);
|
||||
if (hw_pass_through && domain_type_is_si(domain))
|
||||
ret = intel_pasid_setup_pass_through(iommu, domain,
|
||||
dev, PASID_RID2PASID);
|
||||
|
|
@ -2674,7 +2674,7 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,
|
|||
else
|
||||
ret = intel_pasid_setup_second_level(iommu, domain,
|
||||
dev, PASID_RID2PASID);
|
||||
spin_unlock(&iommu->lock);
|
||||
spin_unlock_irqrestore(&iommu->lock, flags);
|
||||
if (ret) {
|
||||
dev_err(dev, "Setup RID2PASID failed\n");
|
||||
dmar_remove_one_dev_info(dev);
|
||||
|
|
|
|||
|
|
@ -441,6 +441,9 @@ static void memstick_check(struct work_struct *work)
|
|||
} else if (host->card->stop)
|
||||
host->card->stop(host->card);
|
||||
|
||||
if (host->removing)
|
||||
goto out_power_off;
|
||||
|
||||
card = memstick_alloc_card(host);
|
||||
|
||||
if (!card) {
|
||||
|
|
@ -545,6 +548,7 @@ EXPORT_SYMBOL(memstick_add_host);
|
|||
*/
|
||||
void memstick_remove_host(struct memstick_host *host)
|
||||
{
|
||||
host->removing = 1;
|
||||
flush_workqueue(workqueue);
|
||||
mutex_lock(&host->lock);
|
||||
if (host->card)
|
||||
|
|
|
|||
|
|
@ -794,7 +794,8 @@ static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot)
|
|||
static bool glk_broken_cqhci(struct sdhci_pci_slot *slot)
|
||||
{
|
||||
return slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_GLK_EMMC &&
|
||||
dmi_match(DMI_BIOS_VENDOR, "LENOVO");
|
||||
(dmi_match(DMI_BIOS_VENDOR, "LENOVO") ||
|
||||
dmi_match(DMI_SYS_VENDOR, "IRBIS"));
|
||||
}
|
||||
|
||||
static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot)
|
||||
|
|
|
|||
|
|
@ -71,16 +71,13 @@ static void rockchip_pcie_update_txcredit_mui(struct rockchip_pcie *rockchip)
|
|||
static int rockchip_pcie_valid_device(struct rockchip_pcie *rockchip,
|
||||
struct pci_bus *bus, int dev)
|
||||
{
|
||||
/* access only one slot on each root port */
|
||||
if (pci_is_root_bus(bus) && dev > 0)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* do not read more than one device on the bus directly attached
|
||||
* Access only one slot on each root port.
|
||||
* Do not read more than one device on the bus directly attached
|
||||
* to RC's downstream side.
|
||||
*/
|
||||
if (pci_is_root_bus(bus->parent) && dev > 0)
|
||||
return 0;
|
||||
if (pci_is_root_bus(bus) || pci_is_root_bus(bus->parent))
|
||||
return dev == 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -725,8 +725,10 @@ static int serdes_am654_probe(struct platform_device *pdev)
|
|||
pm_runtime_enable(dev);
|
||||
|
||||
phy = devm_phy_create(dev, NULL, &ops);
|
||||
if (IS_ERR(phy))
|
||||
return PTR_ERR(phy);
|
||||
if (IS_ERR(phy)) {
|
||||
ret = PTR_ERR(phy);
|
||||
goto clk_err;
|
||||
}
|
||||
|
||||
phy_set_drvdata(phy, am654_phy);
|
||||
phy_provider = devm_of_phy_provider_register(dev, serdes_am654_xlate);
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@
|
|||
#define CHV_PADCTRL1_CFGLOCK BIT(31)
|
||||
#define CHV_PADCTRL1_INVRXTX_SHIFT 4
|
||||
#define CHV_PADCTRL1_INVRXTX_MASK GENMASK(7, 4)
|
||||
#define CHV_PADCTRL1_INVRXTX_TXDATA BIT(7)
|
||||
#define CHV_PADCTRL1_INVRXTX_RXDATA BIT(6)
|
||||
#define CHV_PADCTRL1_INVRXTX_TXENABLE BIT(5)
|
||||
#define CHV_PADCTRL1_ODEN BIT(3)
|
||||
|
|
@ -792,11 +793,22 @@ static int chv_pinmux_set_mux(struct pinctrl_dev *pctldev,
|
|||
static void chv_gpio_clear_triggering(struct chv_pinctrl *pctrl,
|
||||
unsigned int offset)
|
||||
{
|
||||
u32 invrxtx_mask = CHV_PADCTRL1_INVRXTX_MASK;
|
||||
u32 value;
|
||||
|
||||
/*
|
||||
* One some devices the GPIO should output the inverted value from what
|
||||
* device-drivers / ACPI code expects (inverted external buffer?). The
|
||||
* BIOS makes this work by setting the CHV_PADCTRL1_INVRXTX_TXDATA flag,
|
||||
* preserve this flag if the pin is already setup as GPIO.
|
||||
*/
|
||||
value = chv_readl(pctrl, offset, CHV_PADCTRL0);
|
||||
if (value & CHV_PADCTRL0_GPIOEN)
|
||||
invrxtx_mask &= ~CHV_PADCTRL1_INVRXTX_TXDATA;
|
||||
|
||||
value = chv_readl(pctrl, offset, CHV_PADCTRL1);
|
||||
value &= ~CHV_PADCTRL1_INTWAKECFG_MASK;
|
||||
value &= ~CHV_PADCTRL1_INVRXTX_MASK;
|
||||
value &= ~invrxtx_mask;
|
||||
chv_writel(pctrl, offset, CHV_PADCTRL1, value);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -259,6 +259,10 @@ bool mtk_is_virt_gpio(struct mtk_pinctrl *hw, unsigned int gpio_n)
|
|||
|
||||
desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio_n];
|
||||
|
||||
/* if the GPIO is not supported for eint mode */
|
||||
if (desc->eint.eint_m == NO_EINT_SUPPORT)
|
||||
return virt_gpio;
|
||||
|
||||
if (desc->funcs && !desc->funcs[desc->eint.eint_m].name)
|
||||
virt_gpio = true;
|
||||
|
||||
|
|
|
|||
|
|
@ -414,7 +414,7 @@ static struct mvebu_mpp_mode mv98dx3236_mpp_modes[] = {
|
|||
MPP_VAR_FUNCTION(0x1, "i2c0", "sck", V_98DX3236_PLUS)),
|
||||
MPP_MODE(15,
|
||||
MPP_VAR_FUNCTION(0x0, "gpio", NULL, V_98DX3236_PLUS),
|
||||
MPP_VAR_FUNCTION(0x4, "i2c0", "sda", V_98DX3236_PLUS)),
|
||||
MPP_VAR_FUNCTION(0x1, "i2c0", "sda", V_98DX3236_PLUS)),
|
||||
MPP_MODE(16,
|
||||
MPP_VAR_FUNCTION(0x0, "gpo", NULL, V_98DX3236_PLUS),
|
||||
MPP_VAR_FUNCTION(0x4, "dev", "oe", V_98DX3236_PLUS)),
|
||||
|
|
|
|||
|
|
@ -1308,7 +1308,7 @@ static const struct msm_pingroup sm8250_groups[] = {
|
|||
[178] = PINGROUP(178, WEST, _, _, _, _, _, _, _, _, _),
|
||||
[179] = PINGROUP(179, WEST, _, _, _, _, _, _, _, _, _),
|
||||
[180] = UFS_RESET(ufs_reset, 0xb8000),
|
||||
[181] = SDC_PINGROUP(sdc2_clk, 0x7000, 14, 6),
|
||||
[181] = SDC_PINGROUP(sdc2_clk, 0xb7000, 14, 6),
|
||||
[182] = SDC_PINGROUP(sdc2_cmd, 0xb7000, 11, 3),
|
||||
[183] = SDC_PINGROUP(sdc2_data, 0xb7000, 9, 0),
|
||||
};
|
||||
|
|
|
|||
|
|
@ -736,6 +736,7 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
|
|||
struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
|
||||
struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
|
||||
struct sockaddr_in6 addr;
|
||||
struct socket *sock;
|
||||
int rc;
|
||||
|
||||
switch(param) {
|
||||
|
|
@ -747,13 +748,17 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
|
|||
spin_unlock_bh(&conn->session->frwd_lock);
|
||||
return -ENOTCONN;
|
||||
}
|
||||
sock = tcp_sw_conn->sock;
|
||||
sock_hold(sock->sk);
|
||||
spin_unlock_bh(&conn->session->frwd_lock);
|
||||
|
||||
if (param == ISCSI_PARAM_LOCAL_PORT)
|
||||
rc = kernel_getsockname(tcp_sw_conn->sock,
|
||||
rc = kernel_getsockname(sock,
|
||||
(struct sockaddr *)&addr);
|
||||
else
|
||||
rc = kernel_getpeername(tcp_sw_conn->sock,
|
||||
rc = kernel_getpeername(sock,
|
||||
(struct sockaddr *)&addr);
|
||||
spin_unlock_bh(&conn->session->frwd_lock);
|
||||
sock_put(sock->sk);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
|
|
@ -775,6 +780,7 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
|
|||
struct iscsi_tcp_conn *tcp_conn;
|
||||
struct iscsi_sw_tcp_conn *tcp_sw_conn;
|
||||
struct sockaddr_in6 addr;
|
||||
struct socket *sock;
|
||||
int rc;
|
||||
|
||||
switch (param) {
|
||||
|
|
@ -789,16 +795,18 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
|
|||
return -ENOTCONN;
|
||||
}
|
||||
tcp_conn = conn->dd_data;
|
||||
|
||||
tcp_sw_conn = tcp_conn->dd_data;
|
||||
if (!tcp_sw_conn->sock) {
|
||||
sock = tcp_sw_conn->sock;
|
||||
if (!sock) {
|
||||
spin_unlock_bh(&session->frwd_lock);
|
||||
return -ENOTCONN;
|
||||
}
|
||||
|
||||
rc = kernel_getsockname(tcp_sw_conn->sock,
|
||||
(struct sockaddr *)&addr);
|
||||
sock_hold(sock->sk);
|
||||
spin_unlock_bh(&session->frwd_lock);
|
||||
|
||||
rc = kernel_getsockname(sock,
|
||||
(struct sockaddr *)&addr);
|
||||
sock_put(sock->sk);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
|
||||
|
|
|
|||
|
|
@ -1840,7 +1840,8 @@ int target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess,
|
|||
* out unpacked_lun for the original se_cmd.
|
||||
*/
|
||||
if (tm_type == TMR_ABORT_TASK && (flags & TARGET_SCF_LOOKUP_LUN_FROM_TAG)) {
|
||||
if (!target_lookup_lun_from_tag(se_sess, tag, &unpacked_lun))
|
||||
if (!target_lookup_lun_from_tag(se_sess, tag,
|
||||
&se_cmd->orig_fe_lun))
|
||||
goto failure;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -269,8 +269,30 @@ static int usb_probe_device(struct device *dev)
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
/* Probe the USB device with the driver in hand, but only
|
||||
* defer to a generic driver in case the current USB
|
||||
* device driver has an id_table or a match function; i.e.,
|
||||
* when the device driver was explicitly matched against
|
||||
* a device.
|
||||
*
|
||||
* If the device driver does not have either of these,
|
||||
* then we assume that it can bind to any device and is
|
||||
* not truly a more specialized/non-generic driver, so a
|
||||
* return value of -ENODEV should not force the device
|
||||
* to be handled by the generic USB driver, as there
|
||||
* can still be another, more specialized, device driver.
|
||||
*
|
||||
* This accommodates the usbip driver.
|
||||
*
|
||||
* TODO: What if, in the future, there are multiple
|
||||
* specialized USB device drivers for a particular device?
|
||||
* In such cases, there is a need to try all matching
|
||||
* specialised device drivers prior to setting the
|
||||
* use_generic_driver bit.
|
||||
*/
|
||||
error = udriver->probe(udev);
|
||||
if (error == -ENODEV && udriver != &usb_generic_driver) {
|
||||
if (error == -ENODEV && udriver != &usb_generic_driver &&
|
||||
(udriver->id_table || udriver->match)) {
|
||||
udev->use_generic_driver = 1;
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
|
|
@ -831,14 +853,17 @@ static int usb_device_match(struct device *dev, struct device_driver *drv)
|
|||
udev = to_usb_device(dev);
|
||||
udrv = to_usb_device_driver(drv);
|
||||
|
||||
if (udrv->id_table &&
|
||||
usb_device_match_id(udev, udrv->id_table) != NULL) {
|
||||
return 1;
|
||||
}
|
||||
if (udrv->id_table)
|
||||
return usb_device_match_id(udev, udrv->id_table) != NULL;
|
||||
|
||||
if (udrv->match)
|
||||
return udrv->match(udev);
|
||||
return 0;
|
||||
|
||||
/* If the device driver under consideration does not have a
|
||||
* id_table or a match function, then let the driver's probe
|
||||
* function decide.
|
||||
*/
|
||||
return 1;
|
||||
|
||||
} else if (is_usb_interface(dev)) {
|
||||
struct usb_interface *intf;
|
||||
|
|
@ -905,26 +930,19 @@ static int usb_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static bool is_dev_usb_generic_driver(struct device *dev)
|
||||
{
|
||||
struct usb_device_driver *udd = dev->driver ?
|
||||
to_usb_device_driver(dev->driver) : NULL;
|
||||
|
||||
return udd == &usb_generic_driver;
|
||||
}
|
||||
|
||||
static int __usb_bus_reprobe_drivers(struct device *dev, void *data)
|
||||
{
|
||||
struct usb_device_driver *new_udriver = data;
|
||||
struct usb_device *udev;
|
||||
int ret;
|
||||
|
||||
if (!is_dev_usb_generic_driver(dev))
|
||||
/* Don't reprobe if current driver isn't usb_generic_driver */
|
||||
if (dev->driver != &usb_generic_driver.drvwrap.driver)
|
||||
return 0;
|
||||
|
||||
udev = to_usb_device(dev);
|
||||
if (usb_device_match_id(udev, new_udriver->id_table) == NULL &&
|
||||
(!new_udriver->match || new_udriver->match(udev) != 0))
|
||||
(!new_udriver->match || new_udriver->match(udev) == 0))
|
||||
return 0;
|
||||
|
||||
ret = device_reprobe(dev);
|
||||
|
|
|
|||
|
|
@ -1189,7 +1189,6 @@ static int ncm_unwrap_ntb(struct gether *port,
|
|||
const struct ndp_parser_opts *opts = ncm->parser_opts;
|
||||
unsigned crc_len = ncm->is_crc ? sizeof(uint32_t) : 0;
|
||||
int dgram_counter;
|
||||
bool ndp_after_header;
|
||||
|
||||
/* dwSignature */
|
||||
if (get_unaligned_le32(tmp) != opts->nth_sign) {
|
||||
|
|
@ -1216,7 +1215,6 @@ static int ncm_unwrap_ntb(struct gether *port,
|
|||
}
|
||||
|
||||
ndp_index = get_ncm(&tmp, opts->ndp_index);
|
||||
ndp_after_header = false;
|
||||
|
||||
/* Run through all the NDP's in the NTB */
|
||||
do {
|
||||
|
|
@ -1232,8 +1230,6 @@ static int ncm_unwrap_ntb(struct gether *port,
|
|||
ndp_index);
|
||||
goto err;
|
||||
}
|
||||
if (ndp_index == opts->nth_size)
|
||||
ndp_after_header = true;
|
||||
|
||||
/*
|
||||
* walk through NDP
|
||||
|
|
@ -1312,37 +1308,13 @@ static int ncm_unwrap_ntb(struct gether *port,
|
|||
index2 = get_ncm(&tmp, opts->dgram_item_len);
|
||||
dg_len2 = get_ncm(&tmp, opts->dgram_item_len);
|
||||
|
||||
if (index2 == 0 || dg_len2 == 0)
|
||||
break;
|
||||
|
||||
/* wDatagramIndex[1] */
|
||||
if (ndp_after_header) {
|
||||
if (index2 < opts->nth_size + opts->ndp_size) {
|
||||
INFO(port->func.config->cdev,
|
||||
"Bad index: %#X\n", index2);
|
||||
goto err;
|
||||
}
|
||||
} else {
|
||||
if (index2 < opts->nth_size + opts->dpe_size) {
|
||||
INFO(port->func.config->cdev,
|
||||
"Bad index: %#X\n", index2);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
if (index2 > block_len - opts->dpe_size) {
|
||||
INFO(port->func.config->cdev,
|
||||
"Bad index: %#X\n", index2);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* wDatagramLength[1] */
|
||||
if ((dg_len2 < 14 + crc_len) ||
|
||||
(dg_len2 > frame_max)) {
|
||||
INFO(port->func.config->cdev,
|
||||
"Bad dgram length: %#X\n", dg_len);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the data into a new skb.
|
||||
* This ensures the truesize is correct
|
||||
|
|
@ -1359,6 +1331,8 @@ static int ncm_unwrap_ntb(struct gether *port,
|
|||
ndp_len -= 2 * (opts->dgram_item_len * 2);
|
||||
|
||||
dgram_counter++;
|
||||
if (index2 == 0 || dg_len2 == 0)
|
||||
break;
|
||||
} while (ndp_len > 2 * (opts->dgram_item_len * 2));
|
||||
} while (ndp_index);
|
||||
|
||||
|
|
|
|||
|
|
@ -461,11 +461,6 @@ static void stub_disconnect(struct usb_device *udev)
|
|||
return;
|
||||
}
|
||||
|
||||
static bool usbip_match(struct usb_device *udev)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
/* These functions need usb_port_suspend and usb_port_resume,
|
||||
|
|
@ -491,7 +486,6 @@ struct usb_device_driver stub_driver = {
|
|||
.name = "usbip-host",
|
||||
.probe = stub_probe,
|
||||
.disconnect = stub_disconnect,
|
||||
.match = usbip_match,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = stub_suspend,
|
||||
.resume = stub_resume,
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ EXPORT_SYMBOL_GPL(vhost_iotlb_free);
|
|||
* vhost_iotlb_itree_first - return the first overlapped range
|
||||
* @iotlb: the IOTLB
|
||||
* @start: start of IOVA range
|
||||
* @end: end of IOVA range
|
||||
* @last: last byte in IOVA range
|
||||
*/
|
||||
struct vhost_iotlb_map *
|
||||
vhost_iotlb_itree_first(struct vhost_iotlb *iotlb, u64 start, u64 last)
|
||||
|
|
@ -162,7 +162,7 @@ EXPORT_SYMBOL_GPL(vhost_iotlb_itree_first);
|
|||
* vhost_iotlb_itree_next - return the next overlapped range
|
||||
* @map: the starting map node
|
||||
* @start: start of IOVA range
|
||||
* @end: end of IOVA range
|
||||
* @last: last byte IOVA range
|
||||
*/
|
||||
struct vhost_iotlb_map *
|
||||
vhost_iotlb_itree_next(struct vhost_iotlb_map *map, u64 start, u64 last)
|
||||
|
|
|
|||
|
|
@ -353,8 +353,6 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd,
|
|||
struct vdpa_callback cb;
|
||||
struct vhost_virtqueue *vq;
|
||||
struct vhost_vring_state s;
|
||||
u64 __user *featurep = argp;
|
||||
u64 features;
|
||||
u32 idx;
|
||||
long r;
|
||||
|
||||
|
|
@ -381,18 +379,6 @@ static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd,
|
|||
|
||||
vq->last_avail_idx = vq_state.avail_index;
|
||||
break;
|
||||
case VHOST_GET_BACKEND_FEATURES:
|
||||
features = VHOST_VDPA_BACKEND_FEATURES;
|
||||
if (copy_to_user(featurep, &features, sizeof(features)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
case VHOST_SET_BACKEND_FEATURES:
|
||||
if (copy_from_user(&features, featurep, sizeof(features)))
|
||||
return -EFAULT;
|
||||
if (features & ~VHOST_VDPA_BACKEND_FEATURES)
|
||||
return -EOPNOTSUPP;
|
||||
vhost_set_backend_features(&v->vdev, features);
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = vhost_vring_ioctl(&v->vdev, cmd, argp);
|
||||
|
|
@ -440,8 +426,20 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep,
|
|||
struct vhost_vdpa *v = filep->private_data;
|
||||
struct vhost_dev *d = &v->vdev;
|
||||
void __user *argp = (void __user *)arg;
|
||||
u64 __user *featurep = argp;
|
||||
u64 features;
|
||||
long r;
|
||||
|
||||
if (cmd == VHOST_SET_BACKEND_FEATURES) {
|
||||
r = copy_from_user(&features, featurep, sizeof(features));
|
||||
if (r)
|
||||
return r;
|
||||
if (features & ~VHOST_VDPA_BACKEND_FEATURES)
|
||||
return -EOPNOTSUPP;
|
||||
vhost_set_backend_features(&v->vdev, features);
|
||||
return 0;
|
||||
}
|
||||
|
||||
mutex_lock(&d->mutex);
|
||||
|
||||
switch (cmd) {
|
||||
|
|
@ -476,6 +474,10 @@ static long vhost_vdpa_unlocked_ioctl(struct file *filep,
|
|||
case VHOST_VDPA_SET_CONFIG_CALL:
|
||||
r = vhost_vdpa_set_config_call(v, argp);
|
||||
break;
|
||||
case VHOST_GET_BACKEND_FEATURES:
|
||||
features = VHOST_VDPA_BACKEND_FEATURES;
|
||||
r = copy_to_user(featurep, &features, sizeof(features));
|
||||
break;
|
||||
default:
|
||||
r = vhost_dev_ioctl(&v->vdev, cmd, argp);
|
||||
if (r == -ENOIOCTLCMD)
|
||||
|
|
|
|||
|
|
@ -92,6 +92,8 @@ static bool (*pirq_needs_eoi)(unsigned irq);
|
|||
/* Xen will never allocate port zero for any purpose. */
|
||||
#define VALID_EVTCHN(chn) ((chn) != 0)
|
||||
|
||||
static struct irq_info *legacy_info_ptrs[NR_IRQS_LEGACY];
|
||||
|
||||
static struct irq_chip xen_dynamic_chip;
|
||||
static struct irq_chip xen_percpu_chip;
|
||||
static struct irq_chip xen_pirq_chip;
|
||||
|
|
@ -156,7 +158,18 @@ int get_evtchn_to_irq(evtchn_port_t evtchn)
|
|||
/* Get info for IRQ */
|
||||
struct irq_info *info_for_irq(unsigned irq)
|
||||
{
|
||||
return irq_get_chip_data(irq);
|
||||
if (irq < nr_legacy_irqs())
|
||||
return legacy_info_ptrs[irq];
|
||||
else
|
||||
return irq_get_chip_data(irq);
|
||||
}
|
||||
|
||||
static void set_info_for_irq(unsigned int irq, struct irq_info *info)
|
||||
{
|
||||
if (irq < nr_legacy_irqs())
|
||||
legacy_info_ptrs[irq] = info;
|
||||
else
|
||||
irq_set_chip_data(irq, info);
|
||||
}
|
||||
|
||||
/* Constructors for packed IRQ information. */
|
||||
|
|
@ -377,7 +390,7 @@ static void xen_irq_init(unsigned irq)
|
|||
info->type = IRQT_UNBOUND;
|
||||
info->refcnt = -1;
|
||||
|
||||
irq_set_chip_data(irq, info);
|
||||
set_info_for_irq(irq, info);
|
||||
|
||||
list_add_tail(&info->list, &xen_irq_list_head);
|
||||
}
|
||||
|
|
@ -426,14 +439,14 @@ static int __must_check xen_allocate_irq_gsi(unsigned gsi)
|
|||
|
||||
static void xen_free_irq(unsigned irq)
|
||||
{
|
||||
struct irq_info *info = irq_get_chip_data(irq);
|
||||
struct irq_info *info = info_for_irq(irq);
|
||||
|
||||
if (WARN_ON(!info))
|
||||
return;
|
||||
|
||||
list_del(&info->list);
|
||||
|
||||
irq_set_chip_data(irq, NULL);
|
||||
set_info_for_irq(irq, NULL);
|
||||
|
||||
WARN_ON(info->refcnt > 0);
|
||||
|
||||
|
|
@ -603,7 +616,7 @@ EXPORT_SYMBOL_GPL(xen_irq_from_gsi);
|
|||
static void __unbind_from_irq(unsigned int irq)
|
||||
{
|
||||
evtchn_port_t evtchn = evtchn_from_irq(irq);
|
||||
struct irq_info *info = irq_get_chip_data(irq);
|
||||
struct irq_info *info = info_for_irq(irq);
|
||||
|
||||
if (info->refcnt > 0) {
|
||||
info->refcnt--;
|
||||
|
|
@ -1108,7 +1121,7 @@ int bind_ipi_to_irqhandler(enum ipi_vector ipi,
|
|||
|
||||
void unbind_from_irqhandler(unsigned int irq, void *dev_id)
|
||||
{
|
||||
struct irq_info *info = irq_get_chip_data(irq);
|
||||
struct irq_info *info = info_for_irq(irq);
|
||||
|
||||
if (WARN_ON(!info))
|
||||
return;
|
||||
|
|
@ -1142,7 +1155,7 @@ int evtchn_make_refcounted(evtchn_port_t evtchn)
|
|||
if (irq == -1)
|
||||
return -ENOENT;
|
||||
|
||||
info = irq_get_chip_data(irq);
|
||||
info = info_for_irq(irq);
|
||||
|
||||
if (!info)
|
||||
return -ENOENT;
|
||||
|
|
@ -1170,7 +1183,7 @@ int evtchn_get(evtchn_port_t evtchn)
|
|||
if (irq == -1)
|
||||
goto done;
|
||||
|
||||
info = irq_get_chip_data(irq);
|
||||
info = info_for_irq(irq);
|
||||
|
||||
if (!info)
|
||||
goto done;
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ static int autofs_write(struct autofs_sb_info *sbi,
|
|||
|
||||
mutex_lock(&sbi->pipe_mutex);
|
||||
while (bytes) {
|
||||
wr = kernel_write(file, data, bytes, &file->f_pos);
|
||||
wr = __kernel_write(file, data, bytes, NULL);
|
||||
if (wr <= 0)
|
||||
break;
|
||||
data += wr;
|
||||
|
|
|
|||
|
|
@ -599,6 +599,37 @@ static void btrfs_rm_dev_replace_unblocked(struct btrfs_fs_info *fs_info)
|
|||
wake_up(&fs_info->dev_replace.replace_wait);
|
||||
}
|
||||
|
||||
/*
|
||||
* When finishing the device replace, before swapping the source device with the
|
||||
* target device we must update the chunk allocation state in the target device,
|
||||
* as it is empty because replace works by directly copying the chunks and not
|
||||
* through the normal chunk allocation path.
|
||||
*/
|
||||
static int btrfs_set_target_alloc_state(struct btrfs_device *srcdev,
|
||||
struct btrfs_device *tgtdev)
|
||||
{
|
||||
struct extent_state *cached_state = NULL;
|
||||
u64 start = 0;
|
||||
u64 found_start;
|
||||
u64 found_end;
|
||||
int ret = 0;
|
||||
|
||||
lockdep_assert_held(&srcdev->fs_info->chunk_mutex);
|
||||
|
||||
while (!find_first_extent_bit(&srcdev->alloc_state, start,
|
||||
&found_start, &found_end,
|
||||
CHUNK_ALLOCATED, &cached_state)) {
|
||||
ret = set_extent_bits(&tgtdev->alloc_state, found_start,
|
||||
found_end, CHUNK_ALLOCATED);
|
||||
if (ret)
|
||||
break;
|
||||
start = found_end + 1;
|
||||
}
|
||||
|
||||
free_extent_state(cached_state);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
|
||||
int scrub_ret)
|
||||
{
|
||||
|
|
@ -673,8 +704,14 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
|
|||
dev_replace->time_stopped = ktime_get_real_seconds();
|
||||
dev_replace->item_needs_writeback = 1;
|
||||
|
||||
/* replace old device with new one in mapping tree */
|
||||
/*
|
||||
* Update allocation state in the new device and replace the old device
|
||||
* with the new one in the mapping tree.
|
||||
*/
|
||||
if (!scrub_ret) {
|
||||
scrub_ret = btrfs_set_target_alloc_state(src_device, tgt_device);
|
||||
if (scrub_ret)
|
||||
goto error;
|
||||
btrfs_dev_replace_update_device_in_mapping_tree(fs_info,
|
||||
src_device,
|
||||
tgt_device);
|
||||
|
|
@ -685,6 +722,7 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
|
|||
btrfs_dev_name(src_device),
|
||||
src_device->devid,
|
||||
rcu_str_deref(tgt_device->name), scrub_ret);
|
||||
error:
|
||||
up_write(&dev_replace->rwsem);
|
||||
mutex_unlock(&fs_info->chunk_mutex);
|
||||
mutex_unlock(&fs_info->fs_devices->device_list_mutex);
|
||||
|
|
@ -745,7 +783,9 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
|
|||
/* replace the sysfs entry */
|
||||
btrfs_sysfs_remove_devices_dir(fs_info->fs_devices, src_device);
|
||||
btrfs_sysfs_update_devid(tgt_device);
|
||||
btrfs_rm_dev_replace_free_srcdev(src_device);
|
||||
if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &src_device->dev_state))
|
||||
btrfs_scratch_superblocks(fs_info, src_device->bdev,
|
||||
src_device->name->str);
|
||||
|
||||
/* write back the superblocks */
|
||||
trans = btrfs_start_transaction(root, 0);
|
||||
|
|
@ -754,6 +794,8 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
|
|||
|
||||
mutex_unlock(&dev_replace->lock_finishing_cancel_unmount);
|
||||
|
||||
btrfs_rm_dev_replace_free_srcdev(src_device);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1999,9 +1999,9 @@ static u64 btrfs_num_devices(struct btrfs_fs_info *fs_info)
|
|||
return num_devices;
|
||||
}
|
||||
|
||||
static void btrfs_scratch_superblocks(struct btrfs_fs_info *fs_info,
|
||||
struct block_device *bdev,
|
||||
const char *device_path)
|
||||
void btrfs_scratch_superblocks(struct btrfs_fs_info *fs_info,
|
||||
struct block_device *bdev,
|
||||
const char *device_path)
|
||||
{
|
||||
struct btrfs_super_block *disk_super;
|
||||
int copy_num;
|
||||
|
|
@ -2224,11 +2224,7 @@ void btrfs_rm_dev_replace_free_srcdev(struct btrfs_device *srcdev)
|
|||
struct btrfs_fs_info *fs_info = srcdev->fs_info;
|
||||
struct btrfs_fs_devices *fs_devices = srcdev->fs_devices;
|
||||
|
||||
if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &srcdev->dev_state)) {
|
||||
/* zero out the old super if it is writable */
|
||||
btrfs_scratch_superblocks(fs_info, srcdev->bdev,
|
||||
srcdev->name->str);
|
||||
}
|
||||
mutex_lock(&uuid_mutex);
|
||||
|
||||
btrfs_close_bdev(srcdev);
|
||||
synchronize_rcu();
|
||||
|
|
@ -2258,6 +2254,7 @@ void btrfs_rm_dev_replace_free_srcdev(struct btrfs_device *srcdev)
|
|||
close_fs_devices(fs_devices);
|
||||
free_fs_devices(fs_devices);
|
||||
}
|
||||
mutex_unlock(&uuid_mutex);
|
||||
}
|
||||
|
||||
void btrfs_destroy_dev_replace_tgtdev(struct btrfs_device *tgtdev)
|
||||
|
|
|
|||
|
|
@ -573,6 +573,9 @@ void btrfs_set_fs_info_ptr(struct btrfs_fs_info *fs_info);
|
|||
void btrfs_reset_fs_info_ptr(struct btrfs_fs_info *fs_info);
|
||||
bool btrfs_check_rw_degradable(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_device *failing_dev);
|
||||
void btrfs_scratch_superblocks(struct btrfs_fs_info *fs_info,
|
||||
struct block_device *bdev,
|
||||
const char *device_path);
|
||||
|
||||
int btrfs_bg_type_to_factor(u64 flags);
|
||||
const char *btrfs_bg_type_to_raid_name(u64 flags);
|
||||
|
|
|
|||
|
|
@ -219,8 +219,7 @@ struct eventpoll {
|
|||
struct file *file;
|
||||
|
||||
/* used to optimize loop detection check */
|
||||
struct list_head visited_list_link;
|
||||
int visited;
|
||||
u64 gen;
|
||||
|
||||
#ifdef CONFIG_NET_RX_BUSY_POLL
|
||||
/* used to track busy poll napi_id */
|
||||
|
|
@ -275,6 +274,8 @@ static long max_user_watches __read_mostly;
|
|||
*/
|
||||
static DEFINE_MUTEX(epmutex);
|
||||
|
||||
static u64 loop_check_gen = 0;
|
||||
|
||||
/* Used to check for epoll file descriptor inclusion loops */
|
||||
static struct nested_calls poll_loop_ncalls;
|
||||
|
||||
|
|
@ -284,9 +285,6 @@ static struct kmem_cache *epi_cache __read_mostly;
|
|||
/* Slab cache used to allocate "struct eppoll_entry" */
|
||||
static struct kmem_cache *pwq_cache __read_mostly;
|
||||
|
||||
/* Visited nodes during ep_loop_check(), so we can unset them when we finish */
|
||||
static LIST_HEAD(visited_list);
|
||||
|
||||
/*
|
||||
* List of files with newly added links, where we may need to limit the number
|
||||
* of emanating paths. Protected by the epmutex.
|
||||
|
|
@ -1451,7 +1449,7 @@ static int reverse_path_check(void)
|
|||
|
||||
static int ep_create_wakeup_source(struct epitem *epi)
|
||||
{
|
||||
const char *name;
|
||||
struct name_snapshot n;
|
||||
struct wakeup_source *ws;
|
||||
|
||||
if (!epi->ep->ws) {
|
||||
|
|
@ -1460,8 +1458,9 @@ static int ep_create_wakeup_source(struct epitem *epi)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
name = epi->ffd.file->f_path.dentry->d_name.name;
|
||||
ws = wakeup_source_register(NULL, name);
|
||||
take_dentry_name_snapshot(&n, epi->ffd.file->f_path.dentry);
|
||||
ws = wakeup_source_register(NULL, n.name.name);
|
||||
release_dentry_name_snapshot(&n);
|
||||
|
||||
if (!ws)
|
||||
return -ENOMEM;
|
||||
|
|
@ -1523,6 +1522,22 @@ static int ep_insert(struct eventpoll *ep, const struct epoll_event *event,
|
|||
RCU_INIT_POINTER(epi->ws, NULL);
|
||||
}
|
||||
|
||||
/* Add the current item to the list of active epoll hook for this file */
|
||||
spin_lock(&tfile->f_lock);
|
||||
list_add_tail_rcu(&epi->fllink, &tfile->f_ep_links);
|
||||
spin_unlock(&tfile->f_lock);
|
||||
|
||||
/*
|
||||
* Add the current item to the RB tree. All RB tree operations are
|
||||
* protected by "mtx", and ep_insert() is called with "mtx" held.
|
||||
*/
|
||||
ep_rbtree_insert(ep, epi);
|
||||
|
||||
/* now check if we've created too many backpaths */
|
||||
error = -EINVAL;
|
||||
if (full_check && reverse_path_check())
|
||||
goto error_remove_epi;
|
||||
|
||||
/* Initialize the poll table using the queue callback */
|
||||
epq.epi = epi;
|
||||
init_poll_funcptr(&epq.pt, ep_ptable_queue_proc);
|
||||
|
|
@ -1545,22 +1560,6 @@ static int ep_insert(struct eventpoll *ep, const struct epoll_event *event,
|
|||
if (epi->nwait < 0)
|
||||
goto error_unregister;
|
||||
|
||||
/* Add the current item to the list of active epoll hook for this file */
|
||||
spin_lock(&tfile->f_lock);
|
||||
list_add_tail_rcu(&epi->fllink, &tfile->f_ep_links);
|
||||
spin_unlock(&tfile->f_lock);
|
||||
|
||||
/*
|
||||
* Add the current item to the RB tree. All RB tree operations are
|
||||
* protected by "mtx", and ep_insert() is called with "mtx" held.
|
||||
*/
|
||||
ep_rbtree_insert(ep, epi);
|
||||
|
||||
/* now check if we've created too many backpaths */
|
||||
error = -EINVAL;
|
||||
if (full_check && reverse_path_check())
|
||||
goto error_remove_epi;
|
||||
|
||||
/* We have to drop the new item inside our item list to keep track of it */
|
||||
write_lock_irq(&ep->lock);
|
||||
|
||||
|
|
@ -1589,6 +1588,8 @@ static int ep_insert(struct eventpoll *ep, const struct epoll_event *event,
|
|||
|
||||
return 0;
|
||||
|
||||
error_unregister:
|
||||
ep_unregister_pollwait(ep, epi);
|
||||
error_remove_epi:
|
||||
spin_lock(&tfile->f_lock);
|
||||
list_del_rcu(&epi->fllink);
|
||||
|
|
@ -1596,9 +1597,6 @@ static int ep_insert(struct eventpoll *ep, const struct epoll_event *event,
|
|||
|
||||
rb_erase_cached(&epi->rbn, &ep->rbr);
|
||||
|
||||
error_unregister:
|
||||
ep_unregister_pollwait(ep, epi);
|
||||
|
||||
/*
|
||||
* We need to do this because an event could have been arrived on some
|
||||
* allocated wait queue. Note that we don't care about the ep->ovflist
|
||||
|
|
@ -1974,13 +1972,12 @@ static int ep_loop_check_proc(void *priv, void *cookie, int call_nests)
|
|||
struct epitem *epi;
|
||||
|
||||
mutex_lock_nested(&ep->mtx, call_nests + 1);
|
||||
ep->visited = 1;
|
||||
list_add(&ep->visited_list_link, &visited_list);
|
||||
ep->gen = loop_check_gen;
|
||||
for (rbp = rb_first_cached(&ep->rbr); rbp; rbp = rb_next(rbp)) {
|
||||
epi = rb_entry(rbp, struct epitem, rbn);
|
||||
if (unlikely(is_file_epoll(epi->ffd.file))) {
|
||||
ep_tovisit = epi->ffd.file->private_data;
|
||||
if (ep_tovisit->visited)
|
||||
if (ep_tovisit->gen == loop_check_gen)
|
||||
continue;
|
||||
error = ep_call_nested(&poll_loop_ncalls,
|
||||
ep_loop_check_proc, epi->ffd.file,
|
||||
|
|
@ -2021,18 +2018,8 @@ static int ep_loop_check_proc(void *priv, void *cookie, int call_nests)
|
|||
*/
|
||||
static int ep_loop_check(struct eventpoll *ep, struct file *file)
|
||||
{
|
||||
int ret;
|
||||
struct eventpoll *ep_cur, *ep_next;
|
||||
|
||||
ret = ep_call_nested(&poll_loop_ncalls,
|
||||
return ep_call_nested(&poll_loop_ncalls,
|
||||
ep_loop_check_proc, file, ep, current);
|
||||
/* clear visited list */
|
||||
list_for_each_entry_safe(ep_cur, ep_next, &visited_list,
|
||||
visited_list_link) {
|
||||
ep_cur->visited = 0;
|
||||
list_del(&ep_cur->visited_list_link);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void clear_tfile_check_list(void)
|
||||
|
|
@ -2197,11 +2184,13 @@ int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds,
|
|||
goto error_tgt_fput;
|
||||
if (op == EPOLL_CTL_ADD) {
|
||||
if (!list_empty(&f.file->f_ep_links) ||
|
||||
ep->gen == loop_check_gen ||
|
||||
is_file_epoll(tf.file)) {
|
||||
mutex_unlock(&ep->mtx);
|
||||
error = epoll_mutex_lock(&epmutex, 0, nonblock);
|
||||
if (error)
|
||||
goto error_tgt_fput;
|
||||
loop_check_gen++;
|
||||
full_check = 1;
|
||||
if (is_file_epoll(tf.file)) {
|
||||
error = -ELOOP;
|
||||
|
|
@ -2265,6 +2254,7 @@ int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds,
|
|||
error_tgt_fput:
|
||||
if (full_check) {
|
||||
clear_tfile_check_list();
|
||||
loop_check_gen++;
|
||||
mutex_unlock(&epmutex);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3049,6 +3049,7 @@ static int io_async_buf_func(struct wait_queue_entry *wait, unsigned mode,
|
|||
if (!wake_page_match(wpq, key))
|
||||
return 0;
|
||||
|
||||
req->rw.kiocb.ki_flags &= ~IOCB_WAITQ;
|
||||
list_del_init(&wait->entry);
|
||||
|
||||
init_task_work(&req->task_work, io_req_task_submit);
|
||||
|
|
@ -3106,6 +3107,7 @@ static bool io_rw_should_retry(struct io_kiocb *req)
|
|||
wait->wait.flags = 0;
|
||||
INIT_LIST_HEAD(&wait->wait.entry);
|
||||
kiocb->ki_flags |= IOCB_WAITQ;
|
||||
kiocb->ki_flags &= ~IOCB_NOWAIT;
|
||||
kiocb->ki_waitq = wait;
|
||||
|
||||
io_get_req_task(req);
|
||||
|
|
@ -4743,6 +4745,8 @@ static int io_poll_double_wake(struct wait_queue_entry *wait, unsigned mode,
|
|||
if (mask && !(mask & poll->events))
|
||||
return 0;
|
||||
|
||||
list_del_init(&wait->entry);
|
||||
|
||||
if (poll && poll->head) {
|
||||
bool done;
|
||||
|
||||
|
|
@ -8412,11 +8416,19 @@ static int io_uring_show_cred(int id, void *p, void *data)
|
|||
|
||||
static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
|
||||
{
|
||||
bool has_lock;
|
||||
int i;
|
||||
|
||||
mutex_lock(&ctx->uring_lock);
|
||||
/*
|
||||
* Avoid ABBA deadlock between the seq lock and the io_uring mutex,
|
||||
* since fdinfo case grabs it in the opposite direction of normal use
|
||||
* cases. If we fail to get the lock, we just don't iterate any
|
||||
* structures that could be going away outside the io_uring mutex.
|
||||
*/
|
||||
has_lock = mutex_trylock(&ctx->uring_lock);
|
||||
|
||||
seq_printf(m, "UserFiles:\t%u\n", ctx->nr_user_files);
|
||||
for (i = 0; i < ctx->nr_user_files; i++) {
|
||||
for (i = 0; has_lock && i < ctx->nr_user_files; i++) {
|
||||
struct fixed_file_table *table;
|
||||
struct file *f;
|
||||
|
||||
|
|
@ -8428,13 +8440,13 @@ static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
|
|||
seq_printf(m, "%5u: <none>\n", i);
|
||||
}
|
||||
seq_printf(m, "UserBufs:\t%u\n", ctx->nr_user_bufs);
|
||||
for (i = 0; i < ctx->nr_user_bufs; i++) {
|
||||
for (i = 0; has_lock && i < ctx->nr_user_bufs; i++) {
|
||||
struct io_mapped_ubuf *buf = &ctx->user_bufs[i];
|
||||
|
||||
seq_printf(m, "%5u: 0x%llx/%u\n", i, buf->ubuf,
|
||||
(unsigned int) buf->len);
|
||||
}
|
||||
if (!idr_is_empty(&ctx->personality_idr)) {
|
||||
if (has_lock && !idr_is_empty(&ctx->personality_idr)) {
|
||||
seq_printf(m, "Personalities:\n");
|
||||
idr_for_each(&ctx->personality_idr, io_uring_show_cred, m);
|
||||
}
|
||||
|
|
@ -8449,7 +8461,8 @@ static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
|
|||
req->task->task_works != NULL);
|
||||
}
|
||||
spin_unlock_irq(&ctx->completion_lock);
|
||||
mutex_unlock(&ctx->uring_lock);
|
||||
if (has_lock)
|
||||
mutex_unlock(&ctx->uring_lock);
|
||||
}
|
||||
|
||||
static void io_uring_show_fdinfo(struct seq_file *m, struct file *f)
|
||||
|
|
|
|||
|
|
@ -579,6 +579,9 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en
|
|||
xdr_set_scratch_buffer(&stream, page_address(scratch), PAGE_SIZE);
|
||||
|
||||
do {
|
||||
if (entry->label)
|
||||
entry->label->len = NFS4_MAXLABELLEN;
|
||||
|
||||
status = xdr_decode(desc, entry, &stream);
|
||||
if (status != 0) {
|
||||
if (status == -EAGAIN)
|
||||
|
|
|
|||
|
|
@ -715,7 +715,7 @@ nfs4_ff_layout_stat_io_end_write(struct rpc_task *task,
|
|||
}
|
||||
|
||||
static void
|
||||
ff_layout_mark_ds_unreachable(struct pnfs_layout_segment *lseg, int idx)
|
||||
ff_layout_mark_ds_unreachable(struct pnfs_layout_segment *lseg, u32 idx)
|
||||
{
|
||||
struct nfs4_deviceid_node *devid = FF_LAYOUT_DEVID_NODE(lseg, idx);
|
||||
|
||||
|
|
@ -724,7 +724,7 @@ ff_layout_mark_ds_unreachable(struct pnfs_layout_segment *lseg, int idx)
|
|||
}
|
||||
|
||||
static void
|
||||
ff_layout_mark_ds_reachable(struct pnfs_layout_segment *lseg, int idx)
|
||||
ff_layout_mark_ds_reachable(struct pnfs_layout_segment *lseg, u32 idx)
|
||||
{
|
||||
struct nfs4_deviceid_node *devid = FF_LAYOUT_DEVID_NODE(lseg, idx);
|
||||
|
||||
|
|
@ -734,14 +734,14 @@ ff_layout_mark_ds_reachable(struct pnfs_layout_segment *lseg, int idx)
|
|||
|
||||
static struct nfs4_pnfs_ds *
|
||||
ff_layout_choose_ds_for_read(struct pnfs_layout_segment *lseg,
|
||||
int start_idx, int *best_idx,
|
||||
u32 start_idx, u32 *best_idx,
|
||||
bool check_device)
|
||||
{
|
||||
struct nfs4_ff_layout_segment *fls = FF_LAYOUT_LSEG(lseg);
|
||||
struct nfs4_ff_layout_mirror *mirror;
|
||||
struct nfs4_pnfs_ds *ds;
|
||||
bool fail_return = false;
|
||||
int idx;
|
||||
u32 idx;
|
||||
|
||||
/* mirrors are initially sorted by efficiency */
|
||||
for (idx = start_idx; idx < fls->mirror_array_cnt; idx++) {
|
||||
|
|
@ -766,21 +766,21 @@ ff_layout_choose_ds_for_read(struct pnfs_layout_segment *lseg,
|
|||
|
||||
static struct nfs4_pnfs_ds *
|
||||
ff_layout_choose_any_ds_for_read(struct pnfs_layout_segment *lseg,
|
||||
int start_idx, int *best_idx)
|
||||
u32 start_idx, u32 *best_idx)
|
||||
{
|
||||
return ff_layout_choose_ds_for_read(lseg, start_idx, best_idx, false);
|
||||
}
|
||||
|
||||
static struct nfs4_pnfs_ds *
|
||||
ff_layout_choose_valid_ds_for_read(struct pnfs_layout_segment *lseg,
|
||||
int start_idx, int *best_idx)
|
||||
u32 start_idx, u32 *best_idx)
|
||||
{
|
||||
return ff_layout_choose_ds_for_read(lseg, start_idx, best_idx, true);
|
||||
}
|
||||
|
||||
static struct nfs4_pnfs_ds *
|
||||
ff_layout_choose_best_ds_for_read(struct pnfs_layout_segment *lseg,
|
||||
int start_idx, int *best_idx)
|
||||
u32 start_idx, u32 *best_idx)
|
||||
{
|
||||
struct nfs4_pnfs_ds *ds;
|
||||
|
||||
|
|
@ -791,7 +791,8 @@ ff_layout_choose_best_ds_for_read(struct pnfs_layout_segment *lseg,
|
|||
}
|
||||
|
||||
static struct nfs4_pnfs_ds *
|
||||
ff_layout_get_ds_for_read(struct nfs_pageio_descriptor *pgio, int *best_idx)
|
||||
ff_layout_get_ds_for_read(struct nfs_pageio_descriptor *pgio,
|
||||
u32 *best_idx)
|
||||
{
|
||||
struct pnfs_layout_segment *lseg = pgio->pg_lseg;
|
||||
struct nfs4_pnfs_ds *ds;
|
||||
|
|
@ -837,7 +838,7 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
|
|||
struct nfs_pgio_mirror *pgm;
|
||||
struct nfs4_ff_layout_mirror *mirror;
|
||||
struct nfs4_pnfs_ds *ds;
|
||||
int ds_idx;
|
||||
u32 ds_idx, i;
|
||||
|
||||
retry:
|
||||
ff_layout_pg_check_layout(pgio, req);
|
||||
|
|
@ -863,14 +864,14 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
|
|||
goto retry;
|
||||
}
|
||||
|
||||
mirror = FF_LAYOUT_COMP(pgio->pg_lseg, ds_idx);
|
||||
for (i = 0; i < pgio->pg_mirror_count; i++) {
|
||||
mirror = FF_LAYOUT_COMP(pgio->pg_lseg, i);
|
||||
pgm = &pgio->pg_mirrors[i];
|
||||
pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].rsize;
|
||||
}
|
||||
|
||||
pgio->pg_mirror_idx = ds_idx;
|
||||
|
||||
/* read always uses only one mirror - idx 0 for pgio layer */
|
||||
pgm = &pgio->pg_mirrors[0];
|
||||
pgm->pg_bsize = mirror->mirror_ds->ds_versions[0].rsize;
|
||||
|
||||
if (NFS_SERVER(pgio->pg_inode)->flags &
|
||||
(NFS_MOUNT_SOFT|NFS_MOUNT_SOFTERR))
|
||||
pgio->pg_maxretrans = io_maxretrans;
|
||||
|
|
@ -894,7 +895,7 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
|
|||
struct nfs4_ff_layout_mirror *mirror;
|
||||
struct nfs_pgio_mirror *pgm;
|
||||
struct nfs4_pnfs_ds *ds;
|
||||
int i;
|
||||
u32 i;
|
||||
|
||||
retry:
|
||||
ff_layout_pg_check_layout(pgio, req);
|
||||
|
|
@ -1038,7 +1039,7 @@ static void ff_layout_reset_write(struct nfs_pgio_header *hdr, bool retry_pnfs)
|
|||
static void ff_layout_resend_pnfs_read(struct nfs_pgio_header *hdr)
|
||||
{
|
||||
u32 idx = hdr->pgio_mirror_idx + 1;
|
||||
int new_idx = 0;
|
||||
u32 new_idx = 0;
|
||||
|
||||
if (ff_layout_choose_any_ds_for_read(hdr->lseg, idx + 1, &new_idx))
|
||||
ff_layout_send_layouterror(hdr->lseg);
|
||||
|
|
@ -1075,7 +1076,7 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task,
|
|||
struct nfs4_state *state,
|
||||
struct nfs_client *clp,
|
||||
struct pnfs_layout_segment *lseg,
|
||||
int idx)
|
||||
u32 idx)
|
||||
{
|
||||
struct pnfs_layout_hdr *lo = lseg->pls_layout;
|
||||
struct inode *inode = lo->plh_inode;
|
||||
|
|
@ -1149,7 +1150,7 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task,
|
|||
/* Retry all errors through either pNFS or MDS except for -EJUKEBOX */
|
||||
static int ff_layout_async_handle_error_v3(struct rpc_task *task,
|
||||
struct pnfs_layout_segment *lseg,
|
||||
int idx)
|
||||
u32 idx)
|
||||
{
|
||||
struct nfs4_deviceid_node *devid = FF_LAYOUT_DEVID_NODE(lseg, idx);
|
||||
|
||||
|
|
@ -1184,7 +1185,7 @@ static int ff_layout_async_handle_error(struct rpc_task *task,
|
|||
struct nfs4_state *state,
|
||||
struct nfs_client *clp,
|
||||
struct pnfs_layout_segment *lseg,
|
||||
int idx)
|
||||
u32 idx)
|
||||
{
|
||||
int vers = clp->cl_nfs_mod->rpc_vers->number;
|
||||
|
||||
|
|
@ -1211,7 +1212,7 @@ static int ff_layout_async_handle_error(struct rpc_task *task,
|
|||
}
|
||||
|
||||
static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg,
|
||||
int idx, u64 offset, u64 length,
|
||||
u32 idx, u64 offset, u64 length,
|
||||
u32 *op_status, int opnum, int error)
|
||||
{
|
||||
struct nfs4_ff_layout_mirror *mirror;
|
||||
|
|
@ -1809,7 +1810,7 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
|
|||
loff_t offset = hdr->args.offset;
|
||||
int vers;
|
||||
struct nfs_fh *fh;
|
||||
int idx = hdr->pgio_mirror_idx;
|
||||
u32 idx = hdr->pgio_mirror_idx;
|
||||
|
||||
mirror = FF_LAYOUT_COMP(lseg, idx);
|
||||
ds = nfs4_ff_layout_prepare_ds(lseg, mirror, true);
|
||||
|
|
|
|||
|
|
@ -356,7 +356,15 @@ static ssize_t _nfs42_proc_copy(struct file *src,
|
|||
|
||||
truncate_pagecache_range(dst_inode, pos_dst,
|
||||
pos_dst + res->write_res.count);
|
||||
|
||||
spin_lock(&dst_inode->i_lock);
|
||||
NFS_I(dst_inode)->cache_validity |= (NFS_INO_REVAL_PAGECACHE |
|
||||
NFS_INO_REVAL_FORCED | NFS_INO_INVALID_SIZE |
|
||||
NFS_INO_INVALID_ATTR | NFS_INO_INVALID_DATA);
|
||||
spin_unlock(&dst_inode->i_lock);
|
||||
spin_lock(&src_inode->i_lock);
|
||||
NFS_I(src_inode)->cache_validity |= (NFS_INO_REVAL_PAGECACHE |
|
||||
NFS_INO_REVAL_FORCED | NFS_INO_INVALID_ATIME);
|
||||
spin_unlock(&src_inode->i_lock);
|
||||
status = res->write_res.count;
|
||||
out:
|
||||
if (args->sync)
|
||||
|
|
|
|||
62
fs/pipe.c
62
fs/pipe.c
|
|
@ -106,25 +106,6 @@ void pipe_double_lock(struct pipe_inode_info *pipe1,
|
|||
}
|
||||
}
|
||||
|
||||
/* Drop the inode semaphore and wait for a pipe event, atomically */
|
||||
void pipe_wait(struct pipe_inode_info *pipe)
|
||||
{
|
||||
DEFINE_WAIT(rdwait);
|
||||
DEFINE_WAIT(wrwait);
|
||||
|
||||
/*
|
||||
* Pipes are system-local resources, so sleeping on them
|
||||
* is considered a noninteractive wait:
|
||||
*/
|
||||
prepare_to_wait(&pipe->rd_wait, &rdwait, TASK_INTERRUPTIBLE);
|
||||
prepare_to_wait(&pipe->wr_wait, &wrwait, TASK_INTERRUPTIBLE);
|
||||
pipe_unlock(pipe);
|
||||
schedule();
|
||||
finish_wait(&pipe->rd_wait, &rdwait);
|
||||
finish_wait(&pipe->wr_wait, &wrwait);
|
||||
pipe_lock(pipe);
|
||||
}
|
||||
|
||||
static void anon_pipe_buf_release(struct pipe_inode_info *pipe,
|
||||
struct pipe_buffer *buf)
|
||||
{
|
||||
|
|
@ -1035,12 +1016,52 @@ SYSCALL_DEFINE1(pipe, int __user *, fildes)
|
|||
return do_pipe2(fildes, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the stupid "wait for pipe to be readable or writable"
|
||||
* model.
|
||||
*
|
||||
* See pipe_read/write() for the proper kind of exclusive wait,
|
||||
* but that requires that we wake up any other readers/writers
|
||||
* if we then do not end up reading everything (ie the whole
|
||||
* "wake_next_reader/writer" logic in pipe_read/write()).
|
||||
*/
|
||||
void pipe_wait_readable(struct pipe_inode_info *pipe)
|
||||
{
|
||||
pipe_unlock(pipe);
|
||||
wait_event_interruptible(pipe->rd_wait, pipe_readable(pipe));
|
||||
pipe_lock(pipe);
|
||||
}
|
||||
|
||||
void pipe_wait_writable(struct pipe_inode_info *pipe)
|
||||
{
|
||||
pipe_unlock(pipe);
|
||||
wait_event_interruptible(pipe->wr_wait, pipe_writable(pipe));
|
||||
pipe_lock(pipe);
|
||||
}
|
||||
|
||||
/*
|
||||
* This depends on both the wait (here) and the wakeup (wake_up_partner)
|
||||
* holding the pipe lock, so "*cnt" is stable and we know a wakeup cannot
|
||||
* race with the count check and waitqueue prep.
|
||||
*
|
||||
* Normally in order to avoid races, you'd do the prepare_to_wait() first,
|
||||
* then check the condition you're waiting for, and only then sleep. But
|
||||
* because of the pipe lock, we can check the condition before being on
|
||||
* the wait queue.
|
||||
*
|
||||
* We use the 'rd_wait' waitqueue for pipe partner waiting.
|
||||
*/
|
||||
static int wait_for_partner(struct pipe_inode_info *pipe, unsigned int *cnt)
|
||||
{
|
||||
DEFINE_WAIT(rdwait);
|
||||
int cur = *cnt;
|
||||
|
||||
while (cur == *cnt) {
|
||||
pipe_wait(pipe);
|
||||
prepare_to_wait(&pipe->rd_wait, &rdwait, TASK_INTERRUPTIBLE);
|
||||
pipe_unlock(pipe);
|
||||
schedule();
|
||||
finish_wait(&pipe->rd_wait, &rdwait);
|
||||
pipe_lock(pipe);
|
||||
if (signal_pending(current))
|
||||
break;
|
||||
}
|
||||
|
|
@ -1050,7 +1071,6 @@ static int wait_for_partner(struct pipe_inode_info *pipe, unsigned int *cnt)
|
|||
static void wake_up_partner(struct pipe_inode_info *pipe)
|
||||
{
|
||||
wake_up_interruptible_all(&pipe->rd_wait);
|
||||
wake_up_interruptible_all(&pipe->wr_wait);
|
||||
}
|
||||
|
||||
static int fifo_open(struct inode *inode, struct file *filp)
|
||||
|
|
|
|||
|
|
@ -538,6 +538,14 @@ ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t
|
|||
inc_syscw(current);
|
||||
return ret;
|
||||
}
|
||||
/*
|
||||
* This "EXPORT_SYMBOL_GPL()" is more of a "EXPORT_SYMBOL_DONTUSE()",
|
||||
* but autofs is one of the few internal kernel users that actually
|
||||
* wants this _and_ can be built as a module. So we need to export
|
||||
* this symbol for autofs, even though it really isn't appropriate
|
||||
* for any other kernel modules.
|
||||
*/
|
||||
EXPORT_SYMBOL_GPL(__kernel_write);
|
||||
|
||||
ssize_t kernel_write(struct file *file, const void *buf, size_t count,
|
||||
loff_t *pos)
|
||||
|
|
|
|||
|
|
@ -563,7 +563,7 @@ static int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_des
|
|||
sd->need_wakeup = false;
|
||||
}
|
||||
|
||||
pipe_wait(pipe);
|
||||
pipe_wait_readable(pipe);
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
|
@ -1077,7 +1077,7 @@ static int wait_for_space(struct pipe_inode_info *pipe, unsigned flags)
|
|||
return -EAGAIN;
|
||||
if (signal_pending(current))
|
||||
return -ERESTARTSYS;
|
||||
pipe_wait(pipe);
|
||||
pipe_wait_writable(pipe);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1454,7 +1454,7 @@ static int ipipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
|
|||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
pipe_wait(pipe);
|
||||
pipe_wait_readable(pipe);
|
||||
}
|
||||
|
||||
pipe_unlock(pipe);
|
||||
|
|
@ -1493,7 +1493,7 @@ static int opipe_prep(struct pipe_inode_info *pipe, unsigned int flags)
|
|||
ret = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
pipe_wait(pipe);
|
||||
pipe_wait_writable(pipe);
|
||||
}
|
||||
|
||||
pipe_unlock(pipe);
|
||||
|
|
|
|||
|
|
@ -958,7 +958,7 @@ void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state,
|
|||
acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state,
|
||||
u32 val_a, u32 val_b);
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#ifndef CONFIG_IA64
|
||||
void arch_reserve_mem_area(acpi_physical_address addr, size_t size);
|
||||
#else
|
||||
static inline void arch_reserve_mem_area(acpi_physical_address addr,
|
||||
|
|
|
|||
|
|
@ -281,6 +281,7 @@ struct memstick_host {
|
|||
|
||||
struct memstick_dev *card;
|
||||
unsigned int retries;
|
||||
bool removing;
|
||||
|
||||
/* Notify the host that some requests are pending. */
|
||||
void (*request)(struct memstick_host *host);
|
||||
|
|
|
|||
|
|
@ -1611,8 +1611,8 @@ struct nfs_pgio_header {
|
|||
__u64 mds_offset; /* Filelayout dense stripe */
|
||||
struct nfs_page_array page_array;
|
||||
struct nfs_client *ds_clp; /* pNFS data server */
|
||||
int ds_commit_idx; /* ds index if ds_clp is set */
|
||||
int pgio_mirror_idx;/* mirror index in pgio layer */
|
||||
u32 ds_commit_idx; /* ds index if ds_clp is set */
|
||||
u32 pgio_mirror_idx;/* mirror index in pgio layer */
|
||||
};
|
||||
|
||||
struct nfs_mds_commit_info {
|
||||
|
|
|
|||
|
|
@ -240,8 +240,9 @@ extern unsigned int pipe_max_size;
|
|||
extern unsigned long pipe_user_pages_hard;
|
||||
extern unsigned long pipe_user_pages_soft;
|
||||
|
||||
/* Drop the inode semaphore and wait for a pipe event, atomically */
|
||||
void pipe_wait(struct pipe_inode_info *pipe);
|
||||
/* Wait for a pipe to be readable/writable while dropping the pipe lock */
|
||||
void pipe_wait_readable(struct pipe_inode_info *);
|
||||
void pipe_wait_writable(struct pipe_inode_info *);
|
||||
|
||||
struct pipe_inode_info *alloc_pipe_info(void);
|
||||
void free_pipe_info(struct pipe_inode_info *);
|
||||
|
|
|
|||
|
|
@ -312,6 +312,11 @@ static inline void __mod_zone_page_state(struct zone *zone,
|
|||
static inline void __mod_node_page_state(struct pglist_data *pgdat,
|
||||
enum node_stat_item item, int delta)
|
||||
{
|
||||
if (vmstat_item_in_bytes(item)) {
|
||||
VM_WARN_ON_ONCE(delta & (PAGE_SIZE - 1));
|
||||
delta >>= PAGE_SHIFT;
|
||||
}
|
||||
|
||||
node_page_state_add(delta, pgdat, item);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6993,16 +6993,14 @@ static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip,
|
|||
{
|
||||
int bit;
|
||||
|
||||
if ((op->flags & FTRACE_OPS_FL_RCU) && !rcu_is_watching())
|
||||
return;
|
||||
|
||||
bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX);
|
||||
if (bit < 0)
|
||||
return;
|
||||
|
||||
preempt_disable_notrace();
|
||||
|
||||
op->func(ip, parent_ip, op, regs);
|
||||
if (!(op->flags & FTRACE_OPS_FL_RCU) || rcu_is_watching())
|
||||
op->func(ip, parent_ip, op, regs);
|
||||
|
||||
preempt_enable_notrace();
|
||||
trace_clear_recursion(bit);
|
||||
|
|
|
|||
|
|
@ -3564,13 +3564,15 @@ struct trace_entry *trace_find_next_entry(struct trace_iterator *iter,
|
|||
if (iter->ent && iter->ent != iter->temp) {
|
||||
if ((!iter->temp || iter->temp_size < iter->ent_size) &&
|
||||
!WARN_ON_ONCE(iter->temp == static_temp_buf)) {
|
||||
kfree(iter->temp);
|
||||
iter->temp = kmalloc(iter->ent_size, GFP_KERNEL);
|
||||
if (!iter->temp)
|
||||
void *temp;
|
||||
temp = kmalloc(iter->ent_size, GFP_KERNEL);
|
||||
if (!temp)
|
||||
return NULL;
|
||||
kfree(iter->temp);
|
||||
iter->temp = temp;
|
||||
iter->temp_size = iter->ent_size;
|
||||
}
|
||||
memcpy(iter->temp, iter->ent, iter->ent_size);
|
||||
iter->temp_size = iter->ent_size;
|
||||
iter->ent = iter->temp;
|
||||
}
|
||||
entry = __find_next_entry(iter, ent_cpu, NULL, ent_ts);
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ static inline void prandom_state_selftest(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
DEFINE_PER_CPU(struct rnd_state, net_rand_state);
|
||||
DEFINE_PER_CPU(struct rnd_state, net_rand_state) __latent_entropy;
|
||||
|
||||
/**
|
||||
* prandom_u32_state - seeded pseudo-random number generator.
|
||||
|
|
|
|||
|
|
@ -2365,7 +2365,11 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
|
|||
}
|
||||
|
||||
if (!PageUptodate(page)) {
|
||||
error = lock_page_killable(page);
|
||||
if (iocb->ki_flags & IOCB_WAITQ)
|
||||
error = lock_page_async(page, iocb->ki_waitq);
|
||||
else
|
||||
error = lock_page_killable(page);
|
||||
|
||||
if (unlikely(error))
|
||||
goto readpage_error;
|
||||
if (!PageUptodate(page)) {
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user