Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Cross-merge networking fixes after downstream PR. No conflicts. Adjacent changes: drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c35d92abfba
("net: hns3: fix kernel crash when devlink reload during initialization")2a1a1a7b5f
("net: hns3: add command queue trace for hns3") Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
e7073830cc
|
@ -4594,9 +4594,10 @@
|
|||
norid [S390] ignore the RID field and force use of
|
||||
one PCI domain per PCI function
|
||||
|
||||
pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
|
||||
pcie_aspm= [PCIE] Forcibly enable or ignore PCIe Active State Power
|
||||
Management.
|
||||
off Disable ASPM.
|
||||
off Don't touch ASPM configuration at all. Leave any
|
||||
configuration done by firmware unchanged.
|
||||
force Enable ASPM even on devices that claim not to support it.
|
||||
WARNING: Forcing ASPM on may cause system lockups.
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ allOf:
|
|||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: maxim,max30100
|
||||
const: maxim,max30102
|
||||
then:
|
||||
properties:
|
||||
maxim,green-led-current-microamp: false
|
||||
|
|
|
@ -337,8 +337,8 @@ allOf:
|
|||
minItems: 4
|
||||
|
||||
clocks:
|
||||
minItems: 34
|
||||
maxItems: 34
|
||||
minItems: 24
|
||||
maxItems: 24
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
|
@ -351,18 +351,6 @@ allOf:
|
|||
- const: ethwarp_wocpu1
|
||||
- const: ethwarp_wocpu0
|
||||
- const: esw
|
||||
- const: netsys0
|
||||
- const: netsys1
|
||||
- const: sgmii_tx250m
|
||||
- const: sgmii_rx250m
|
||||
- const: sgmii2_tx250m
|
||||
- const: sgmii2_rx250m
|
||||
- const: top_usxgmii0_sel
|
||||
- const: top_usxgmii1_sel
|
||||
- const: top_sgm0_sel
|
||||
- const: top_sgm1_sel
|
||||
- const: top_xfi_phy0_xtal_sel
|
||||
- const: top_xfi_phy1_xtal_sel
|
||||
- const: top_eth_gmii_sel
|
||||
- const: top_eth_refck_50m_sel
|
||||
- const: top_eth_sys_200m_sel
|
||||
|
@ -375,16 +363,10 @@ allOf:
|
|||
- const: top_netsys_sync_250m_sel
|
||||
- const: top_netsys_ppefb_250m_sel
|
||||
- const: top_netsys_warp_sel
|
||||
- const: wocpu1
|
||||
- const: wocpu0
|
||||
- const: xgp1
|
||||
- const: xgp2
|
||||
- const: xgp3
|
||||
|
||||
mediatek,sgmiisys:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
|
||||
patternProperties:
|
||||
"^mac@[0-1]$":
|
||||
type: object
|
||||
|
|
|
@ -20,6 +20,11 @@ Optional properties:
|
|||
a GPIO spec for the external headphone detect pin. If jd-mode = 0,
|
||||
we will get the JD status by getting the value of hp-detect-gpios.
|
||||
|
||||
- cbj-sleeve-gpios:
|
||||
a GPIO spec to control the external combo jack circuit to tie the sleeve/ring2
|
||||
contacts to the ground or floating. It could avoid some electric noise from the
|
||||
active speaker jacks.
|
||||
|
||||
- realtek,in2-differential
|
||||
Boolean. Indicate MIC2 input are differential, rather than single-ended.
|
||||
|
||||
|
@ -68,6 +73,7 @@ codec: rt5650@1a {
|
|||
compatible = "realtek,rt5650";
|
||||
reg = <0x1a>;
|
||||
hp-detect-gpios = <&gpio 19 0>;
|
||||
cbj-sleeve-gpios = <&gpio 20 0>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <7 IRQ_TYPE_EDGE_FALLING>;
|
||||
realtek,dmic-en = "true";
|
||||
|
|
|
@ -1576,6 +1576,12 @@ attribute-sets:
|
|||
-
|
||||
name: mcast-querier-state
|
||||
type: binary
|
||||
-
|
||||
name: fdb-n-learned
|
||||
type: u32
|
||||
-
|
||||
name: fdb-max-learned
|
||||
type: u32
|
||||
-
|
||||
name: linkinfo-brport-attrs
|
||||
name-prefix: ifla-brport-
|
||||
|
|
|
@ -5717,7 +5717,7 @@ Q: http://patchwork.linuxtv.org/project/linux-media/list/
|
|||
F: drivers/media/dvb-frontends/cxd2820r*
|
||||
|
||||
CXGB3 ETHERNET DRIVER (CXGB3)
|
||||
M: Raju Rangoju <rajur@chelsio.com>
|
||||
M: Potnuri Bharat Teja <bharat@chelsio.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.chelsio.com
|
||||
|
@ -5738,7 +5738,7 @@ W: http://www.chelsio.com
|
|||
F: drivers/crypto/chelsio
|
||||
|
||||
CXGB4 ETHERNET DRIVER (CXGB4)
|
||||
M: Raju Rangoju <rajur@chelsio.com>
|
||||
M: Potnuri Bharat Teja <bharat@chelsio.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.chelsio.com
|
||||
|
@ -5767,7 +5767,7 @@ F: drivers/infiniband/hw/cxgb4/
|
|||
F: include/uapi/rdma/cxgb4-abi.h
|
||||
|
||||
CXGB4VF ETHERNET DRIVER (CXGB4VF)
|
||||
M: Raju Rangoju <rajur@chelsio.com>
|
||||
M: Potnuri Bharat Teja <bharat@chelsio.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.chelsio.com
|
||||
|
|
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
|||
VERSION = 6
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Hurr durr I'ma ninja sloth
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -127,6 +127,10 @@ cpu_resume_after_mmu:
|
|||
instr_sync
|
||||
#endif
|
||||
bl cpu_init @ restore the und/abt/irq banked regs
|
||||
#if defined(CONFIG_KASAN) && defined(CONFIG_KASAN_STACK)
|
||||
mov r0, sp
|
||||
bl kasan_unpoison_task_stack_below
|
||||
#endif
|
||||
mov r0, #0 @ return zero on success
|
||||
ldmfd sp!, {r4 - r11, pc}
|
||||
ENDPROC(cpu_resume_after_mmu)
|
||||
|
|
|
@ -82,7 +82,8 @@
|
|||
};
|
||||
|
||||
&mmc1 {
|
||||
bt_reset: bt-reset {
|
||||
bluetooth@2 {
|
||||
reg = <2>;
|
||||
compatible = "mediatek,mt7921s-bluetooth";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&bt_pins_reset>;
|
||||
|
|
|
@ -367,6 +367,16 @@
|
|||
};
|
||||
};
|
||||
|
||||
&pmm8155au_1_gpios {
|
||||
pmm8155au_1_sdc2_cd: sdc2-cd-default-state {
|
||||
pins = "gpio4";
|
||||
function = "normal";
|
||||
input-enable;
|
||||
bias-pull-up;
|
||||
power-source = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&qupv3_id_1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -384,10 +394,10 @@
|
|||
&sdhc_2 {
|
||||
status = "okay";
|
||||
|
||||
cd-gpios = <&tlmm 4 GPIO_ACTIVE_LOW>;
|
||||
cd-gpios = <&pmm8155au_1_gpios 4 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&sdc2_on>;
|
||||
pinctrl-1 = <&sdc2_off>;
|
||||
pinctrl-0 = <&sdc2_on &pmm8155au_1_sdc2_cd>;
|
||||
pinctrl-1 = <&sdc2_off &pmm8155au_1_sdc2_cd>;
|
||||
vqmmc-supply = <&vreg_l13c_2p96>; /* IO line power */
|
||||
vmmc-supply = <&vreg_l17a_2p96>; /* Card power line */
|
||||
bus-width = <4>;
|
||||
|
@ -505,13 +515,6 @@
|
|||
bias-pull-up; /* pull up */
|
||||
drive-strength = <16>; /* 16 MA */
|
||||
};
|
||||
|
||||
sd-cd-pins {
|
||||
pins = "gpio96";
|
||||
function = "gpio";
|
||||
bias-pull-up; /* pull up */
|
||||
drive-strength = <2>; /* 2 MA */
|
||||
};
|
||||
};
|
||||
|
||||
sdc2_off: sdc2-off-state {
|
||||
|
@ -532,13 +535,6 @@
|
|||
bias-pull-up; /* pull up */
|
||||
drive-strength = <2>; /* 2 MA */
|
||||
};
|
||||
|
||||
sd-cd-pins {
|
||||
pins = "gpio96";
|
||||
function = "gpio";
|
||||
bias-pull-up; /* pull up */
|
||||
drive-strength = <2>; /* 2 MA */
|
||||
};
|
||||
};
|
||||
|
||||
usb2phy_ac_en1_default: usb2phy-ac-en1-default-state {
|
||||
|
|
|
@ -44,9 +44,8 @@
|
|||
#define PLPKS_MAX_DATA_SIZE 4000
|
||||
|
||||
// Timeouts for PLPKS operations
|
||||
#define PLPKS_MAX_TIMEOUT 5000 // msec
|
||||
#define PLPKS_FLUSH_SLEEP 10 // msec
|
||||
#define PLPKS_FLUSH_SLEEP_RANGE 400
|
||||
#define PLPKS_MAX_TIMEOUT (5 * USEC_PER_SEC)
|
||||
#define PLPKS_FLUSH_SLEEP 10000 // usec
|
||||
|
||||
struct plpks_var {
|
||||
char *component;
|
||||
|
|
|
@ -786,8 +786,16 @@ static void pci_dma_bus_setup_pSeriesLP(struct pci_bus *bus)
|
|||
* parent bus. During reboot, there will be ibm,dma-window property to
|
||||
* define DMA window. For kdump, there will at least be default window or DDW
|
||||
* or both.
|
||||
* There is an exception to the above. In case the PE goes into frozen
|
||||
* state, firmware may not provide ibm,dma-window property at the time
|
||||
* of LPAR boot up.
|
||||
*/
|
||||
|
||||
if (!pdn) {
|
||||
pr_debug(" no ibm,dma-window property !\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ppci = PCI_DN(pdn);
|
||||
|
||||
pr_debug(" parent is %pOF, iommu_table: 0x%p\n",
|
||||
|
|
|
@ -415,8 +415,7 @@ static int plpks_confirm_object_flushed(struct label *label,
|
|||
break;
|
||||
}
|
||||
|
||||
usleep_range(PLPKS_FLUSH_SLEEP,
|
||||
PLPKS_FLUSH_SLEEP + PLPKS_FLUSH_SLEEP_RANGE);
|
||||
fsleep(PLPKS_FLUSH_SLEEP);
|
||||
timeout = timeout + PLPKS_FLUSH_SLEEP;
|
||||
} while (timeout < PLPKS_MAX_TIMEOUT);
|
||||
|
||||
|
@ -464,9 +463,10 @@ int plpks_signed_update_var(struct plpks_var *var, u64 flags)
|
|||
|
||||
continuetoken = retbuf[0];
|
||||
if (pseries_status_to_err(rc) == -EBUSY) {
|
||||
int delay_ms = get_longbusy_msecs(rc);
|
||||
mdelay(delay_ms);
|
||||
timeout += delay_ms;
|
||||
int delay_us = get_longbusy_msecs(rc) * 1000;
|
||||
|
||||
fsleep(delay_us);
|
||||
timeout += delay_us;
|
||||
}
|
||||
rc = pseries_status_to_err(rc);
|
||||
} while (rc == -EBUSY && timeout < PLPKS_MAX_TIMEOUT);
|
||||
|
|
|
@ -125,8 +125,19 @@ struct s390_pxts_ctx {
|
|||
static inline int __paes_keyblob2pkey(struct key_blob *kb,
|
||||
struct pkey_protkey *pk)
|
||||
{
|
||||
return pkey_keyblob2pkey(kb->key, kb->keylen,
|
||||
pk->protkey, &pk->len, &pk->type);
|
||||
int i, ret = -EIO;
|
||||
|
||||
/* try three times in case of busy card */
|
||||
for (i = 0; ret && i < 3; i++) {
|
||||
if (ret == -EBUSY && in_task()) {
|
||||
if (msleep_interruptible(1000))
|
||||
return -EINTR;
|
||||
}
|
||||
ret = pkey_keyblob2pkey(kb->key, kb->keylen,
|
||||
pk->protkey, &pk->len, &pk->type);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int __paes_convert_key(struct s390_paes_ctx *ctx)
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset
|
||||
#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset
|
||||
#define CFI_RESTORE .cfi_restore
|
||||
#define CFI_REL_OFFSET .cfi_rel_offset
|
||||
|
||||
#ifdef CONFIG_AS_CFI_VAL_OFFSET
|
||||
#define CFI_VAL_OFFSET .cfi_val_offset
|
||||
|
|
|
@ -24,8 +24,10 @@ __kernel_\func:
|
|||
CFI_DEF_CFA_OFFSET (STACK_FRAME_OVERHEAD + WRAPPER_FRAME_SIZE)
|
||||
CFI_VAL_OFFSET 15, -STACK_FRAME_OVERHEAD
|
||||
stg %r14,STACK_FRAME_OVERHEAD(%r15)
|
||||
CFI_REL_OFFSET 14, STACK_FRAME_OVERHEAD
|
||||
brasl %r14,__s390_vdso_\func
|
||||
lg %r14,STACK_FRAME_OVERHEAD(%r15)
|
||||
CFI_RESTORE 14
|
||||
aghi %r15,WRAPPER_FRAME_SIZE
|
||||
CFI_DEF_CFA_OFFSET STACK_FRAME_OVERHEAD
|
||||
CFI_RESTORE 15
|
||||
|
|
|
@ -2661,7 +2661,7 @@ static int __s390_enable_skey_hugetlb(pte_t *pte, unsigned long addr,
|
|||
return 0;
|
||||
|
||||
start = pmd_val(*pmd) & HPAGE_MASK;
|
||||
end = start + HPAGE_SIZE - 1;
|
||||
end = start + HPAGE_SIZE;
|
||||
__storage_key_init_range(start, end);
|
||||
set_bit(PG_arch_1, &page->flags);
|
||||
cond_resched();
|
||||
|
|
|
@ -139,7 +139,7 @@ static void clear_huge_pte_skeys(struct mm_struct *mm, unsigned long rste)
|
|||
}
|
||||
|
||||
if (!test_and_set_bit(PG_arch_1, &page->flags))
|
||||
__storage_key_init_range(paddr, paddr + size - 1);
|
||||
__storage_key_init_range(paddr, paddr + size);
|
||||
}
|
||||
|
||||
void __set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
|
||||
|
|
|
@ -98,11 +98,6 @@ static int addr_to_vsyscall_nr(unsigned long addr)
|
|||
|
||||
static bool write_ok_or_segv(unsigned long ptr, size_t size)
|
||||
{
|
||||
/*
|
||||
* XXX: if access_ok, get_user, and put_user handled
|
||||
* sig_on_uaccess_err, this could go away.
|
||||
*/
|
||||
|
||||
if (!access_ok((void __user *)ptr, size)) {
|
||||
struct thread_struct *thread = ¤t->thread;
|
||||
|
||||
|
@ -120,10 +115,8 @@ static bool write_ok_or_segv(unsigned long ptr, size_t size)
|
|||
bool emulate_vsyscall(unsigned long error_code,
|
||||
struct pt_regs *regs, unsigned long address)
|
||||
{
|
||||
struct task_struct *tsk;
|
||||
unsigned long caller;
|
||||
int vsyscall_nr, syscall_nr, tmp;
|
||||
int prev_sig_on_uaccess_err;
|
||||
long ret;
|
||||
unsigned long orig_dx;
|
||||
|
||||
|
@ -172,8 +165,6 @@ bool emulate_vsyscall(unsigned long error_code,
|
|||
goto sigsegv;
|
||||
}
|
||||
|
||||
tsk = current;
|
||||
|
||||
/*
|
||||
* Check for access_ok violations and find the syscall nr.
|
||||
*
|
||||
|
@ -234,12 +225,8 @@ bool emulate_vsyscall(unsigned long error_code,
|
|||
goto do_ret; /* skip requested */
|
||||
|
||||
/*
|
||||
* With a real vsyscall, page faults cause SIGSEGV. We want to
|
||||
* preserve that behavior to make writing exploits harder.
|
||||
* With a real vsyscall, page faults cause SIGSEGV.
|
||||
*/
|
||||
prev_sig_on_uaccess_err = current->thread.sig_on_uaccess_err;
|
||||
current->thread.sig_on_uaccess_err = 1;
|
||||
|
||||
ret = -EFAULT;
|
||||
switch (vsyscall_nr) {
|
||||
case 0:
|
||||
|
@ -262,23 +249,12 @@ bool emulate_vsyscall(unsigned long error_code,
|
|||
break;
|
||||
}
|
||||
|
||||
current->thread.sig_on_uaccess_err = prev_sig_on_uaccess_err;
|
||||
|
||||
check_fault:
|
||||
if (ret == -EFAULT) {
|
||||
/* Bad news -- userspace fed a bad pointer to a vsyscall. */
|
||||
warn_bad_vsyscall(KERN_INFO, regs,
|
||||
"vsyscall fault (exploit attempt?)");
|
||||
|
||||
/*
|
||||
* If we failed to generate a signal for any reason,
|
||||
* generate one here. (This should be impossible.)
|
||||
*/
|
||||
if (WARN_ON_ONCE(!sigismember(&tsk->pending.signal, SIGBUS) &&
|
||||
!sigismember(&tsk->pending.signal, SIGSEGV)))
|
||||
goto sigsegv;
|
||||
|
||||
return true; /* Don't emulate the ret. */
|
||||
goto sigsegv;
|
||||
}
|
||||
|
||||
regs->ax = ret;
|
||||
|
|
|
@ -17,6 +17,7 @@ extern bool e820__mapped_all(u64 start, u64 end, enum e820_type type);
|
|||
extern void e820__range_add (u64 start, u64 size, enum e820_type type);
|
||||
extern u64 e820__range_update(u64 start, u64 size, enum e820_type old_type, enum e820_type new_type);
|
||||
extern u64 e820__range_remove(u64 start, u64 size, enum e820_type old_type, bool check_type);
|
||||
extern u64 e820__range_update_table(struct e820_table *t, u64 start, u64 size, enum e820_type old_type, enum e820_type new_type);
|
||||
|
||||
extern void e820__print_table(char *who);
|
||||
extern int e820__update_table(struct e820_table *table);
|
||||
|
|
|
@ -472,7 +472,6 @@ struct thread_struct {
|
|||
unsigned long iopl_emul;
|
||||
|
||||
unsigned int iopl_warn:1;
|
||||
unsigned int sig_on_uaccess_err:1;
|
||||
|
||||
/*
|
||||
* Protection Keys Register for Userspace. Loaded immediately on
|
||||
|
|
|
@ -269,6 +269,7 @@ int rmp_make_private(u64 pfn, u64 gpa, enum pg_level level, u32 asid, bool immut
|
|||
int rmp_make_shared(u64 pfn, enum pg_level level);
|
||||
void snp_leak_pages(u64 pfn, unsigned int npages);
|
||||
void kdump_sev_callback(void);
|
||||
void snp_fixup_e820_tables(void);
|
||||
#else
|
||||
static inline bool snp_probe_rmptable_info(void) { return false; }
|
||||
static inline int snp_lookup_rmpentry(u64 pfn, bool *assigned, int *level) { return -ENODEV; }
|
||||
|
@ -282,6 +283,7 @@ static inline int rmp_make_private(u64 pfn, u64 gpa, enum pg_level level, u32 as
|
|||
static inline int rmp_make_shared(u64 pfn, enum pg_level level) { return -ENODEV; }
|
||||
static inline void snp_leak_pages(u64 pfn, unsigned int npages) {}
|
||||
static inline void kdump_sev_callback(void) { }
|
||||
static inline void snp_fixup_e820_tables(void) {}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1771,7 +1771,7 @@ void x2apic_setup(void)
|
|||
__x2apic_enable();
|
||||
}
|
||||
|
||||
static __init void apic_set_fixmap(void);
|
||||
static __init void apic_set_fixmap(bool read_apic);
|
||||
|
||||
static __init void x2apic_disable(void)
|
||||
{
|
||||
|
@ -1793,7 +1793,12 @@ static __init void x2apic_disable(void)
|
|||
}
|
||||
|
||||
__x2apic_disable();
|
||||
apic_set_fixmap();
|
||||
/*
|
||||
* Don't reread the APIC ID as it was already done from
|
||||
* check_x2apic() and the APIC driver still is a x2APIC variant,
|
||||
* which fails to do the read after x2APIC was disabled.
|
||||
*/
|
||||
apic_set_fixmap(false);
|
||||
}
|
||||
|
||||
static __init void x2apic_enable(void)
|
||||
|
@ -2057,13 +2062,14 @@ void __init init_apic_mappings(void)
|
|||
}
|
||||
}
|
||||
|
||||
static __init void apic_set_fixmap(void)
|
||||
static __init void apic_set_fixmap(bool read_apic)
|
||||
{
|
||||
set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);
|
||||
apic_mmio_base = APIC_BASE;
|
||||
apic_printk(APIC_VERBOSE, "mapped APIC to %16lx (%16lx)\n",
|
||||
apic_mmio_base, mp_lapic_addr);
|
||||
apic_read_boot_cpu_id(false);
|
||||
if (read_apic)
|
||||
apic_read_boot_cpu_id(false);
|
||||
}
|
||||
|
||||
void __init register_lapic_address(unsigned long address)
|
||||
|
@ -2073,7 +2079,7 @@ void __init register_lapic_address(unsigned long address)
|
|||
mp_lapic_addr = address;
|
||||
|
||||
if (!x2apic_mode)
|
||||
apic_set_fixmap();
|
||||
apic_set_fixmap(true);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -532,9 +532,10 @@ u64 __init e820__range_update(u64 start, u64 size, enum e820_type old_type, enum
|
|||
return __e820__range_update(e820_table, start, size, old_type, new_type);
|
||||
}
|
||||
|
||||
static u64 __init e820__range_update_kexec(u64 start, u64 size, enum e820_type old_type, enum e820_type new_type)
|
||||
u64 __init e820__range_update_table(struct e820_table *t, u64 start, u64 size,
|
||||
enum e820_type old_type, enum e820_type new_type)
|
||||
{
|
||||
return __e820__range_update(e820_table_kexec, start, size, old_type, new_type);
|
||||
return __e820__range_update(t, start, size, old_type, new_type);
|
||||
}
|
||||
|
||||
/* Remove a range of memory from the E820 table: */
|
||||
|
@ -806,7 +807,7 @@ u64 __init e820__memblock_alloc_reserved(u64 size, u64 align)
|
|||
|
||||
addr = memblock_phys_alloc(size, align);
|
||||
if (addr) {
|
||||
e820__range_update_kexec(addr, size, E820_TYPE_RAM, E820_TYPE_RESERVED);
|
||||
e820__range_update_table(e820_table_kexec, addr, size, E820_TYPE_RAM, E820_TYPE_RESERVED);
|
||||
pr_info("update e820_table_kexec for e820__memblock_alloc_reserved()\n");
|
||||
e820__update_table_kexec();
|
||||
}
|
||||
|
|
|
@ -723,39 +723,8 @@ kernelmode_fixup_or_oops(struct pt_regs *regs, unsigned long error_code,
|
|||
WARN_ON_ONCE(user_mode(regs));
|
||||
|
||||
/* Are we prepared to handle this kernel fault? */
|
||||
if (fixup_exception(regs, X86_TRAP_PF, error_code, address)) {
|
||||
/*
|
||||
* Any interrupt that takes a fault gets the fixup. This makes
|
||||
* the below recursive fault logic only apply to a faults from
|
||||
* task context.
|
||||
*/
|
||||
if (in_interrupt())
|
||||
return;
|
||||
|
||||
/*
|
||||
* Per the above we're !in_interrupt(), aka. task context.
|
||||
*
|
||||
* In this case we need to make sure we're not recursively
|
||||
* faulting through the emulate_vsyscall() logic.
|
||||
*/
|
||||
if (current->thread.sig_on_uaccess_err && signal) {
|
||||
sanitize_error_code(address, &error_code);
|
||||
|
||||
set_signal_archinfo(address, error_code);
|
||||
|
||||
if (si_code == SEGV_PKUERR) {
|
||||
force_sig_pkuerr((void __user *)address, pkey);
|
||||
} else {
|
||||
/* XXX: hwpoison faults will set the wrong code. */
|
||||
force_sig_fault(signal, si_code, (void __user *)address);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Barring that, we can do the fixup and be happy.
|
||||
*/
|
||||
if (fixup_exception(regs, X86_TRAP_PF, error_code, address))
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* AMD erratum #91 manifests as a spurious page fault on a PREFETCH
|
||||
|
|
|
@ -102,6 +102,13 @@ void __init mem_encrypt_setup_arch(void)
|
|||
phys_addr_t total_mem = memblock_phys_mem_size();
|
||||
unsigned long size;
|
||||
|
||||
/*
|
||||
* Do RMP table fixups after the e820 tables have been setup by
|
||||
* e820__memory_setup().
|
||||
*/
|
||||
if (cc_platform_has(CC_ATTR_HOST_SEV_SNP))
|
||||
snp_fixup_e820_tables();
|
||||
|
||||
if (!cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT))
|
||||
return;
|
||||
|
||||
|
|
|
@ -163,6 +163,42 @@ bool snp_probe_rmptable_info(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void __init __snp_fixup_e820_tables(u64 pa)
|
||||
{
|
||||
if (IS_ALIGNED(pa, PMD_SIZE))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Handle cases where the RMP table placement by the BIOS is not
|
||||
* 2M aligned and the kexec kernel could try to allocate
|
||||
* from within that chunk which then causes a fatal RMP fault.
|
||||
*
|
||||
* The e820_table needs to be updated as it is converted to
|
||||
* kernel memory resources and used by KEXEC_FILE_LOAD syscall
|
||||
* to load kexec segments.
|
||||
*
|
||||
* The e820_table_firmware needs to be updated as it is exposed
|
||||
* to sysfs and used by the KEXEC_LOAD syscall to load kexec
|
||||
* segments.
|
||||
*
|
||||
* The e820_table_kexec needs to be updated as it passed to
|
||||
* the kexec-ed kernel.
|
||||
*/
|
||||
pa = ALIGN_DOWN(pa, PMD_SIZE);
|
||||
if (e820__mapped_any(pa, pa + PMD_SIZE, E820_TYPE_RAM)) {
|
||||
pr_info("Reserving start/end of RMP table on a 2MB boundary [0x%016llx]\n", pa);
|
||||
e820__range_update(pa, PMD_SIZE, E820_TYPE_RAM, E820_TYPE_RESERVED);
|
||||
e820__range_update_table(e820_table_kexec, pa, PMD_SIZE, E820_TYPE_RAM, E820_TYPE_RESERVED);
|
||||
e820__range_update_table(e820_table_firmware, pa, PMD_SIZE, E820_TYPE_RAM, E820_TYPE_RESERVED);
|
||||
}
|
||||
}
|
||||
|
||||
void __init snp_fixup_e820_tables(void)
|
||||
{
|
||||
__snp_fixup_e820_tables(probed_rmp_base);
|
||||
__snp_fixup_e820_tables(probed_rmp_base + probed_rmp_size);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do the necessary preparations which are verified by the firmware as
|
||||
* described in the SNP_INIT_EX firmware command description in the SNP
|
||||
|
|
|
@ -219,13 +219,21 @@ static __read_mostly unsigned int cpuid_leaf5_edx_val;
|
|||
static void xen_cpuid(unsigned int *ax, unsigned int *bx,
|
||||
unsigned int *cx, unsigned int *dx)
|
||||
{
|
||||
unsigned maskebx = ~0;
|
||||
unsigned int maskebx = ~0;
|
||||
unsigned int or_ebx = 0;
|
||||
|
||||
/*
|
||||
* Mask out inconvenient features, to try and disable as many
|
||||
* unsupported kernel subsystems as possible.
|
||||
*/
|
||||
switch (*ax) {
|
||||
case 0x1:
|
||||
/* Replace initial APIC ID in bits 24-31 of EBX. */
|
||||
/* See xen_pv_smp_config() for related topology preparations. */
|
||||
maskebx = 0x00ffffff;
|
||||
or_ebx = smp_processor_id() << 24;
|
||||
break;
|
||||
|
||||
case CPUID_MWAIT_LEAF:
|
||||
/* Synthesize the values.. */
|
||||
*ax = 0;
|
||||
|
@ -248,6 +256,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
|
|||
: "0" (*ax), "2" (*cx));
|
||||
|
||||
*bx &= maskebx;
|
||||
*bx |= or_ebx;
|
||||
}
|
||||
|
||||
static bool __init xen_check_mwait(void)
|
||||
|
|
|
@ -154,9 +154,9 @@ static void __init xen_pv_smp_config(void)
|
|||
u32 apicid = 0;
|
||||
int i;
|
||||
|
||||
topology_register_boot_apic(apicid++);
|
||||
topology_register_boot_apic(apicid);
|
||||
|
||||
for (i = 1; i < nr_cpu_ids; i++)
|
||||
for (i = 0; i < nr_cpu_ids; i++)
|
||||
topology_register_apic(apicid++, CPU_ACPIID_INVALID, true);
|
||||
|
||||
/* Pretend to be a proper enumerated system */
|
||||
|
|
|
@ -100,6 +100,10 @@ void flush_cache_range(struct vm_area_struct*, ulong, ulong);
|
|||
void flush_icache_range(unsigned long start, unsigned long end);
|
||||
void flush_cache_page(struct vm_area_struct*,
|
||||
unsigned long, unsigned long);
|
||||
#define flush_cache_all flush_cache_all
|
||||
#define flush_cache_range flush_cache_range
|
||||
#define flush_icache_range flush_icache_range
|
||||
#define flush_cache_page flush_cache_page
|
||||
#else
|
||||
#define flush_cache_all local_flush_cache_all
|
||||
#define flush_cache_range local_flush_cache_range
|
||||
|
@ -136,20 +140,7 @@ void local_flush_cache_page(struct vm_area_struct *vma,
|
|||
|
||||
#else
|
||||
|
||||
#define flush_cache_all() do { } while (0)
|
||||
#define flush_cache_mm(mm) do { } while (0)
|
||||
#define flush_cache_dup_mm(mm) do { } while (0)
|
||||
|
||||
#define flush_cache_vmap(start,end) do { } while (0)
|
||||
#define flush_cache_vmap_early(start,end) do { } while (0)
|
||||
#define flush_cache_vunmap(start,end) do { } while (0)
|
||||
|
||||
#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0
|
||||
#define flush_dcache_page(page) do { } while (0)
|
||||
|
||||
#define flush_icache_range local_flush_icache_range
|
||||
#define flush_cache_page(vma, addr, pfn) do { } while (0)
|
||||
#define flush_cache_range(vma, start, end) do { } while (0)
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -162,15 +153,14 @@ void local_flush_cache_page(struct vm_area_struct *vma,
|
|||
__invalidate_icache_range(start,(end) - (start)); \
|
||||
} while (0)
|
||||
|
||||
#define flush_dcache_mmap_lock(mapping) do { } while (0)
|
||||
#define flush_dcache_mmap_unlock(mapping) do { } while (0)
|
||||
|
||||
#if defined(CONFIG_MMU) && (DCACHE_WAY_SIZE > PAGE_SIZE)
|
||||
|
||||
extern void copy_to_user_page(struct vm_area_struct*, struct page*,
|
||||
unsigned long, void*, const void*, unsigned long);
|
||||
extern void copy_from_user_page(struct vm_area_struct*, struct page*,
|
||||
unsigned long, void*, const void*, unsigned long);
|
||||
#define copy_to_user_page copy_to_user_page
|
||||
#define copy_from_user_page copy_from_user_page
|
||||
|
||||
#else
|
||||
|
||||
|
@ -186,4 +176,6 @@ extern void copy_from_user_page(struct vm_area_struct*, struct page*,
|
|||
|
||||
#endif
|
||||
|
||||
#include <asm-generic/cacheflush.h>
|
||||
|
||||
#endif /* _XTENSA_CACHEFLUSH_H */
|
||||
|
|
|
@ -115,9 +115,9 @@
|
|||
#define MAKE_RA_FOR_CALL(ra,ws) (((ra) & 0x3fffffff) | (ws) << 30)
|
||||
|
||||
/* Convert return address to a valid pc
|
||||
* Note: We assume that the stack pointer is in the same 1GB ranges as the ra
|
||||
* Note: 'text' is the address within the same 1GB range as the ra
|
||||
*/
|
||||
#define MAKE_PC_FROM_RA(ra,sp) (((ra) & 0x3fffffff) | ((sp) & 0xc0000000))
|
||||
#define MAKE_PC_FROM_RA(ra, text) (((ra) & 0x3fffffff) | ((unsigned long)(text) & 0xc0000000))
|
||||
|
||||
#elif defined(__XTENSA_CALL0_ABI__)
|
||||
|
||||
|
@ -127,9 +127,9 @@
|
|||
#define MAKE_RA_FOR_CALL(ra, ws) (ra)
|
||||
|
||||
/* Convert return address to a valid pc
|
||||
* Note: We assume that the stack pointer is in the same 1GB ranges as the ra
|
||||
* Note: 'text' is not used as 'ra' is always the full address
|
||||
*/
|
||||
#define MAKE_PC_FROM_RA(ra, sp) (ra)
|
||||
#define MAKE_PC_FROM_RA(ra, text) (ra)
|
||||
|
||||
#else
|
||||
#error Unsupported Xtensa ABI
|
||||
|
|
|
@ -87,7 +87,7 @@ struct pt_regs {
|
|||
# define user_mode(regs) (((regs)->ps & 0x00000020)!=0)
|
||||
# define instruction_pointer(regs) ((regs)->pc)
|
||||
# define return_pointer(regs) (MAKE_PC_FROM_RA((regs)->areg[0], \
|
||||
(regs)->areg[1]))
|
||||
(regs)->pc))
|
||||
|
||||
# ifndef CONFIG_SMP
|
||||
# define profile_pc(regs) instruction_pointer(regs)
|
||||
|
|
|
@ -47,6 +47,7 @@
|
|||
#include <asm/asm-offsets.h>
|
||||
#include <asm/regs.h>
|
||||
#include <asm/hw_breakpoint.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/traps.h>
|
||||
|
||||
extern void ret_from_fork(void);
|
||||
|
@ -380,7 +381,7 @@ unsigned long __get_wchan(struct task_struct *p)
|
|||
int count = 0;
|
||||
|
||||
sp = p->thread.sp;
|
||||
pc = MAKE_PC_FROM_RA(p->thread.ra, p->thread.sp);
|
||||
pc = MAKE_PC_FROM_RA(p->thread.ra, _text);
|
||||
|
||||
do {
|
||||
if (sp < stack_page + sizeof(struct task_struct) ||
|
||||
|
@ -392,7 +393,7 @@ unsigned long __get_wchan(struct task_struct *p)
|
|||
|
||||
/* Stack layout: sp-4: ra, sp-3: sp' */
|
||||
|
||||
pc = MAKE_PC_FROM_RA(SPILL_SLOT(sp, 0), sp);
|
||||
pc = MAKE_PC_FROM_RA(SPILL_SLOT(sp, 0), _text);
|
||||
sp = SPILL_SLOT(sp, 1);
|
||||
} while (count++ < 16);
|
||||
return 0;
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/stacktrace.h>
|
||||
|
||||
#include <asm/ftrace.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/stacktrace.h>
|
||||
#include <asm/traps.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
@ -189,7 +190,7 @@ void walk_stackframe(unsigned long *sp,
|
|||
if (a1 <= (unsigned long)sp)
|
||||
break;
|
||||
|
||||
frame.pc = MAKE_PC_FROM_RA(a0, a1);
|
||||
frame.pc = MAKE_PC_FROM_RA(a0, _text);
|
||||
frame.sp = a1;
|
||||
|
||||
if (fn(&frame, data))
|
||||
|
|
|
@ -166,10 +166,8 @@ late_initcall(rs_init);
|
|||
|
||||
static void iss_console_write(struct console *co, const char *s, unsigned count)
|
||||
{
|
||||
if (s && *s != 0) {
|
||||
int len = strlen(s);
|
||||
simc_write(1, s, count < len ? count : len);
|
||||
}
|
||||
if (s && *s != 0)
|
||||
simc_write(1, s, min(count, strlen(s)));
|
||||
}
|
||||
|
||||
static struct tty_driver* iss_console_device(struct console *c, int *index)
|
||||
|
|
|
@ -16,6 +16,9 @@ menuconfig AUXDISPLAY
|
|||
|
||||
if AUXDISPLAY
|
||||
|
||||
#
|
||||
# Character LCD section
|
||||
#
|
||||
config CHARLCD
|
||||
tristate "Character LCD core support" if COMPILE_TEST
|
||||
help
|
||||
|
@ -25,12 +28,6 @@ config CHARLCD
|
|||
This is some character LCD core interface that multiple drivers can
|
||||
use.
|
||||
|
||||
config LINEDISP
|
||||
tristate "Character line display core support" if COMPILE_TEST
|
||||
help
|
||||
This is the core support for single-line character displays, to be
|
||||
selected by drivers that use it.
|
||||
|
||||
config HD44780_COMMON
|
||||
tristate "Common functions for HD44780 (and compatibles) LCD displays" if COMPILE_TEST
|
||||
select CHARLCD
|
||||
|
@ -52,145 +49,6 @@ config HD44780
|
|||
kernel and started at boot.
|
||||
If you don't understand what all this is about, say N.
|
||||
|
||||
config KS0108
|
||||
tristate "KS0108 LCD Controller"
|
||||
depends on PARPORT_PC
|
||||
default n
|
||||
help
|
||||
If you have a LCD controlled by one or more KS0108
|
||||
controllers, say Y. You will need also another more specific
|
||||
driver for your LCD.
|
||||
|
||||
Depends on Parallel Port support. If you say Y at
|
||||
parport, you will be able to compile this as a module (M)
|
||||
and built-in as well (Y).
|
||||
|
||||
To compile this as a module, choose M here:
|
||||
the module will be called ks0108.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config KS0108_PORT
|
||||
hex "Parallel port where the LCD is connected"
|
||||
depends on KS0108
|
||||
default 0x378
|
||||
help
|
||||
The address of the parallel port where the LCD is connected.
|
||||
|
||||
The first standard parallel port address is 0x378.
|
||||
The second standard parallel port address is 0x278.
|
||||
The third standard parallel port address is 0x3BC.
|
||||
|
||||
You can specify a different address if you need.
|
||||
|
||||
If you don't know what I'm talking about, load the parport module,
|
||||
and execute "dmesg" or "cat /proc/ioports". You can see there how
|
||||
many parallel ports are present and which address each one has.
|
||||
|
||||
Usually you only need to use 0x378.
|
||||
|
||||
If you compile this as a module, you can still override this
|
||||
using the module parameters.
|
||||
|
||||
config KS0108_DELAY
|
||||
int "Delay between each control writing (microseconds)"
|
||||
depends on KS0108
|
||||
default "2"
|
||||
help
|
||||
Amount of time the ks0108 should wait between each control write
|
||||
to the parallel port.
|
||||
|
||||
If your LCD seems to miss random writings, increment this.
|
||||
|
||||
If you don't know what I'm talking about, ignore it.
|
||||
|
||||
If you compile this as a module, you can still override this
|
||||
value using the module parameters.
|
||||
|
||||
config CFAG12864B
|
||||
tristate "CFAG12864B LCD"
|
||||
depends on X86
|
||||
depends on FB
|
||||
depends on KS0108
|
||||
select FB_SYSMEM_HELPERS
|
||||
default n
|
||||
help
|
||||
If you have a Crystalfontz 128x64 2-color LCD, cfag12864b Series,
|
||||
say Y. You also need the ks0108 LCD Controller driver.
|
||||
|
||||
For help about how to wire your LCD to the parallel port,
|
||||
check Documentation/admin-guide/auxdisplay/cfag12864b.rst
|
||||
|
||||
Depends on the x86 arch and the framebuffer support.
|
||||
|
||||
The LCD framebuffer driver can be attached to a console.
|
||||
It will work fine. However, you can't attach it to the fbdev driver
|
||||
of the xorg server.
|
||||
|
||||
To compile this as a module, choose M here:
|
||||
the modules will be called cfag12864b and cfag12864bfb.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config CFAG12864B_RATE
|
||||
int "Refresh rate (hertz)"
|
||||
depends on CFAG12864B
|
||||
default "20"
|
||||
help
|
||||
Refresh rate of the LCD.
|
||||
|
||||
As the LCD is not memory mapped, the driver has to make the work by
|
||||
software. This means you should be careful setting this value higher.
|
||||
If your CPUs are really slow or you feel the system is slowed down,
|
||||
decrease the value.
|
||||
|
||||
Be careful modifying this value to a very high value:
|
||||
You can freeze the computer, or the LCD maybe can't draw as fast as you
|
||||
are requesting.
|
||||
|
||||
If you don't know what I'm talking about, ignore it.
|
||||
|
||||
If you compile this as a module, you can still override this
|
||||
value using the module parameters.
|
||||
|
||||
config IMG_ASCII_LCD
|
||||
tristate "Imagination Technologies ASCII LCD Display"
|
||||
depends on HAS_IOMEM
|
||||
default y if MIPS_MALTA
|
||||
select MFD_SYSCON
|
||||
select LINEDISP
|
||||
help
|
||||
Enable this to support the simple ASCII LCD displays found on
|
||||
development boards such as the MIPS Boston, MIPS Malta & MIPS SEAD3
|
||||
from Imagination Technologies.
|
||||
|
||||
config HT16K33
|
||||
tristate "Holtek Ht16K33 LED controller with keyscan"
|
||||
depends on FB && I2C && INPUT
|
||||
select FB_SYSMEM_HELPERS
|
||||
select INPUT_MATRIXKMAP
|
||||
select FB_BACKLIGHT
|
||||
select NEW_LEDS
|
||||
select LEDS_CLASS
|
||||
select LINEDISP
|
||||
help
|
||||
Say yes here to add support for Holtek HT16K33, RAM mapping 16*8
|
||||
LED controller driver with keyscan.
|
||||
|
||||
config MAX6959
|
||||
tristate "Maxim MAX6958/6959 7-segment LED controller"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
select LINEDISP
|
||||
help
|
||||
If you say yes here you get support for the following Maxim chips
|
||||
(I2C 7-segment LED display controller):
|
||||
- MAX6958
|
||||
- MAX6959 (input support)
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called max6959.
|
||||
|
||||
config LCD2S
|
||||
tristate "lcd2s 20x4 character display over I2C console"
|
||||
depends on I2C
|
||||
|
@ -201,27 +59,6 @@ config LCD2S
|
|||
is a simple single color character display. You have to connect it
|
||||
to an I2C bus.
|
||||
|
||||
config ARM_CHARLCD
|
||||
bool "ARM Ltd. Character LCD Driver"
|
||||
depends on PLAT_VERSATILE
|
||||
help
|
||||
This is a driver for the character LCD found on the ARM Ltd.
|
||||
Versatile and RealView Platform Baseboards. It doesn't do
|
||||
very much more than display the text "ARM Linux" on the first
|
||||
line and the Linux version on the second line, but that's
|
||||
still useful.
|
||||
|
||||
config SEG_LED_GPIO
|
||||
tristate "Generic 7-segment LED display"
|
||||
depends on GPIOLIB || COMPILE_TEST
|
||||
select LINEDISP
|
||||
help
|
||||
This driver supports a generic 7-segment LED display made up
|
||||
of GPIO pins connected to the individual segments.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called seg-led-gpio.
|
||||
|
||||
menuconfig PARPORT_PANEL
|
||||
tristate "Parallel port LCD/Keypad Panel support"
|
||||
depends on PARPORT
|
||||
|
@ -480,7 +317,6 @@ endif # PARPORT_PANEL
|
|||
config PANEL_CHANGE_MESSAGE
|
||||
bool "Change LCD initialization message ?"
|
||||
depends on CHARLCD
|
||||
default "n"
|
||||
help
|
||||
This allows you to replace the boot message indicating the kernel version
|
||||
and the driver version with a custom message. This is useful on appliances
|
||||
|
@ -529,8 +365,184 @@ choice
|
|||
|
||||
endchoice
|
||||
|
||||
#
|
||||
# Samsung KS0108 LCD controller section
|
||||
#
|
||||
config KS0108
|
||||
tristate "KS0108 LCD Controller"
|
||||
depends on PARPORT_PC
|
||||
help
|
||||
If you have a LCD controlled by one or more KS0108
|
||||
controllers, say Y. You will need also another more specific
|
||||
driver for your LCD.
|
||||
|
||||
Depends on Parallel Port support. If you say Y at
|
||||
parport, you will be able to compile this as a module (M)
|
||||
and built-in as well (Y).
|
||||
|
||||
To compile this as a module, choose M here:
|
||||
the module will be called ks0108.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config KS0108_PORT
|
||||
hex "Parallel port where the LCD is connected"
|
||||
depends on KS0108
|
||||
default 0x378
|
||||
help
|
||||
The address of the parallel port where the LCD is connected.
|
||||
|
||||
The first standard parallel port address is 0x378.
|
||||
The second standard parallel port address is 0x278.
|
||||
The third standard parallel port address is 0x3BC.
|
||||
|
||||
You can specify a different address if you need.
|
||||
|
||||
If you don't know what I'm talking about, load the parport module,
|
||||
and execute "dmesg" or "cat /proc/ioports". You can see there how
|
||||
many parallel ports are present and which address each one has.
|
||||
|
||||
Usually you only need to use 0x378.
|
||||
|
||||
If you compile this as a module, you can still override this
|
||||
using the module parameters.
|
||||
|
||||
config KS0108_DELAY
|
||||
int "Delay between each control writing (microseconds)"
|
||||
depends on KS0108
|
||||
default "2"
|
||||
help
|
||||
Amount of time the ks0108 should wait between each control write
|
||||
to the parallel port.
|
||||
|
||||
If your LCD seems to miss random writings, increment this.
|
||||
|
||||
If you don't know what I'm talking about, ignore it.
|
||||
|
||||
If you compile this as a module, you can still override this
|
||||
value using the module parameters.
|
||||
|
||||
config CFAG12864B
|
||||
tristate "CFAG12864B LCD"
|
||||
depends on X86
|
||||
depends on FB
|
||||
depends on KS0108
|
||||
select FB_SYSMEM_HELPERS
|
||||
help
|
||||
If you have a Crystalfontz 128x64 2-color LCD, cfag12864b Series,
|
||||
say Y. You also need the ks0108 LCD Controller driver.
|
||||
|
||||
For help about how to wire your LCD to the parallel port,
|
||||
check Documentation/admin-guide/auxdisplay/cfag12864b.rst
|
||||
|
||||
Depends on the x86 arch and the framebuffer support.
|
||||
|
||||
The LCD framebuffer driver can be attached to a console.
|
||||
It will work fine. However, you can't attach it to the fbdev driver
|
||||
of the xorg server.
|
||||
|
||||
To compile this as a module, choose M here:
|
||||
the modules will be called cfag12864b and cfag12864bfb.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config CFAG12864B_RATE
|
||||
int "Refresh rate (hertz)"
|
||||
depends on CFAG12864B
|
||||
default "20"
|
||||
help
|
||||
Refresh rate of the LCD.
|
||||
|
||||
As the LCD is not memory mapped, the driver has to make the work by
|
||||
software. This means you should be careful setting this value higher.
|
||||
If your CPUs are really slow or you feel the system is slowed down,
|
||||
decrease the value.
|
||||
|
||||
Be careful modifying this value to a very high value:
|
||||
You can freeze the computer, or the LCD maybe can't draw as fast as you
|
||||
are requesting.
|
||||
|
||||
If you don't know what I'm talking about, ignore it.
|
||||
|
||||
If you compile this as a module, you can still override this
|
||||
value using the module parameters.
|
||||
|
||||
#
|
||||
# Single character line display section
|
||||
#
|
||||
config LINEDISP
|
||||
tristate "Character line display core support" if COMPILE_TEST
|
||||
help
|
||||
This is the core support for single-line character displays, to be
|
||||
selected by drivers that use it.
|
||||
|
||||
config IMG_ASCII_LCD
|
||||
tristate "Imagination Technologies ASCII LCD Display"
|
||||
depends on HAS_IOMEM
|
||||
default y if MIPS_MALTA
|
||||
select MFD_SYSCON
|
||||
select LINEDISP
|
||||
help
|
||||
Enable this to support the simple ASCII LCD displays found on
|
||||
development boards such as the MIPS Boston, MIPS Malta & MIPS SEAD3
|
||||
from Imagination Technologies.
|
||||
|
||||
config HT16K33
|
||||
tristate "Holtek Ht16K33 LED controller with keyscan"
|
||||
depends on FB && I2C && INPUT
|
||||
select FB_SYSMEM_HELPERS
|
||||
select INPUT_MATRIXKMAP
|
||||
select FB_BACKLIGHT
|
||||
select NEW_LEDS
|
||||
select LEDS_CLASS
|
||||
select LINEDISP
|
||||
help
|
||||
Say yes here to add support for Holtek HT16K33, RAM mapping 16*8
|
||||
LED controller driver with keyscan.
|
||||
|
||||
config MAX6959
|
||||
tristate "Maxim MAX6958/6959 7-segment LED controller"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
select LINEDISP
|
||||
help
|
||||
If you say yes here you get support for the following Maxim chips
|
||||
(I2C 7-segment LED display controller):
|
||||
- MAX6958
|
||||
- MAX6959 (input support)
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called max6959.
|
||||
|
||||
config SEG_LED_GPIO
|
||||
tristate "Generic 7-segment LED display"
|
||||
depends on GPIOLIB || COMPILE_TEST
|
||||
select LINEDISP
|
||||
help
|
||||
This driver supports a generic 7-segment LED display made up
|
||||
of GPIO pins connected to the individual segments.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called seg-led-gpio.
|
||||
|
||||
#
|
||||
# Character LCD with non-conforming interface section
|
||||
#
|
||||
config ARM_CHARLCD
|
||||
bool "ARM Ltd. Character LCD Driver"
|
||||
depends on PLAT_VERSATILE
|
||||
help
|
||||
This is a driver for the character LCD found on the ARM Ltd.
|
||||
Versatile and RealView Platform Baseboards. It doesn't do
|
||||
very much more than display the text "ARM Linux" on the first
|
||||
line and the Linux version on the second line, but that's
|
||||
still useful.
|
||||
|
||||
endif # AUXDISPLAY
|
||||
|
||||
#
|
||||
# Deprecated options
|
||||
#
|
||||
config PANEL
|
||||
tristate "Parallel port LCD/Keypad Panel support (OLD OPTION)"
|
||||
depends on PARPORT
|
||||
|
|
|
@ -3,16 +3,16 @@
|
|||
# Makefile for the kernel auxiliary displays device drivers.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_ARM_CHARLCD) += arm-charlcd.o
|
||||
obj-$(CONFIG_CFAG12864B) += cfag12864b.o cfag12864bfb.o
|
||||
obj-$(CONFIG_CHARLCD) += charlcd.o
|
||||
obj-$(CONFIG_HD44780_COMMON) += hd44780_common.o
|
||||
obj-$(CONFIG_ARM_CHARLCD) += arm-charlcd.o
|
||||
obj-$(CONFIG_KS0108) += ks0108.o
|
||||
obj-$(CONFIG_CFAG12864B) += cfag12864b.o cfag12864bfb.o
|
||||
obj-$(CONFIG_IMG_ASCII_LCD) += img-ascii-lcd.o
|
||||
obj-$(CONFIG_HD44780) += hd44780.o
|
||||
obj-$(CONFIG_HT16K33) += ht16k33.o
|
||||
obj-$(CONFIG_PARPORT_PANEL) += panel.o
|
||||
obj-$(CONFIG_IMG_ASCII_LCD) += img-ascii-lcd.o
|
||||
obj-$(CONFIG_KS0108) += ks0108.o
|
||||
obj-$(CONFIG_LCD2S) += lcd2s.o
|
||||
obj-$(CONFIG_LINEDISP) += line-display.o
|
||||
obj-$(CONFIG_MAX6959) += max6959.o
|
||||
obj-$(CONFIG_PARPORT_PANEL) += panel.o
|
||||
obj-$(CONFIG_SEG_LED_GPIO) += seg-led-gpio.o
|
||||
|
|
|
@ -17,7 +17,9 @@
|
|||
#include <linux/uaccess.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#ifndef CONFIG_PANEL_BOOT_MESSAGE
|
||||
#include <generated/utsrelease.h>
|
||||
#endif
|
||||
|
||||
#include "charlcd.h"
|
||||
|
||||
|
@ -678,4 +680,5 @@ int charlcd_unregister(struct charlcd *lcd)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(charlcd_unregister);
|
||||
|
||||
MODULE_DESCRIPTION("Character LCD core support");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -81,14 +81,12 @@ static int seg_led_probe(struct platform_device *pdev)
|
|||
return linedisp_register(&priv->linedisp, dev, 1, &seg_led_linedisp_ops);
|
||||
}
|
||||
|
||||
static int seg_led_remove(struct platform_device *pdev)
|
||||
static void seg_led_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct seg_led_priv *priv = platform_get_drvdata(pdev);
|
||||
|
||||
cancel_delayed_work_sync(&priv->work);
|
||||
linedisp_unregister(&priv->linedisp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id seg_led_of_match[] = {
|
||||
|
@ -99,7 +97,7 @@ MODULE_DEVICE_TABLE(of, seg_led_of_match);
|
|||
|
||||
static struct platform_driver seg_led_driver = {
|
||||
.probe = seg_led_probe,
|
||||
.remove = seg_led_remove,
|
||||
.remove_new = seg_led_remove,
|
||||
.driver = {
|
||||
.name = "seg-led-gpio",
|
||||
.of_match_table = seg_led_of_match,
|
||||
|
|
|
@ -2838,6 +2838,43 @@ int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_read);
|
||||
|
||||
/**
|
||||
* regmap_read_bypassed() - Read a value from a single register direct
|
||||
* from the device, bypassing the cache
|
||||
*
|
||||
* @map: Register map to read from
|
||||
* @reg: Register to be read from
|
||||
* @val: Pointer to store read value
|
||||
*
|
||||
* A value of zero will be returned on success, a negative errno will
|
||||
* be returned in error cases.
|
||||
*/
|
||||
int regmap_read_bypassed(struct regmap *map, unsigned int reg, unsigned int *val)
|
||||
{
|
||||
int ret;
|
||||
bool bypass, cache_only;
|
||||
|
||||
if (!IS_ALIGNED(reg, map->reg_stride))
|
||||
return -EINVAL;
|
||||
|
||||
map->lock(map->lock_arg);
|
||||
|
||||
bypass = map->cache_bypass;
|
||||
cache_only = map->cache_only;
|
||||
map->cache_bypass = true;
|
||||
map->cache_only = false;
|
||||
|
||||
ret = _regmap_read(map, reg, val);
|
||||
|
||||
map->cache_bypass = bypass;
|
||||
map->cache_only = cache_only;
|
||||
|
||||
map->unlock(map->lock_arg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_read_bypassed);
|
||||
|
||||
/**
|
||||
* regmap_raw_read() - Read raw data from the device
|
||||
*
|
||||
|
|
|
@ -2177,7 +2177,8 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub, struct io_uring_cmd *cmd)
|
|||
.max_hw_sectors = p->max_sectors,
|
||||
.chunk_sectors = p->chunk_sectors,
|
||||
.virt_boundary_mask = p->virt_boundary_mask,
|
||||
|
||||
.max_segments = USHRT_MAX,
|
||||
.max_segment_size = UINT_MAX,
|
||||
};
|
||||
struct gendisk *disk;
|
||||
int ret = -EINVAL;
|
||||
|
|
|
@ -15,8 +15,6 @@
|
|||
|
||||
#define VERSION "0.1"
|
||||
|
||||
#define QCA_BDADDR_DEFAULT (&(bdaddr_t) {{ 0xad, 0x5a, 0x00, 0x00, 0x00, 0x00 }})
|
||||
|
||||
int qca_read_soc_version(struct hci_dev *hdev, struct qca_btsoc_version *ver,
|
||||
enum qca_btsoc_type soc_type)
|
||||
{
|
||||
|
@ -101,7 +99,8 @@ static int qca_read_fw_build_info(struct hci_dev *hdev)
|
|||
{
|
||||
struct sk_buff *skb;
|
||||
struct edl_event_hdr *edl;
|
||||
char cmd, build_label[QCA_FW_BUILD_VER_LEN];
|
||||
char *build_label;
|
||||
char cmd;
|
||||
int build_lbl_len, err = 0;
|
||||
|
||||
bt_dev_dbg(hdev, "QCA read fw build info");
|
||||
|
@ -116,6 +115,11 @@ static int qca_read_fw_build_info(struct hci_dev *hdev)
|
|||
return err;
|
||||
}
|
||||
|
||||
if (skb->len < sizeof(*edl)) {
|
||||
err = -EILSEQ;
|
||||
goto out;
|
||||
}
|
||||
|
||||
edl = (struct edl_event_hdr *)(skb->data);
|
||||
if (!edl) {
|
||||
bt_dev_err(hdev, "QCA read fw build info with no header");
|
||||
|
@ -131,14 +135,25 @@ static int qca_read_fw_build_info(struct hci_dev *hdev)
|
|||
goto out;
|
||||
}
|
||||
|
||||
build_lbl_len = edl->data[0];
|
||||
if (build_lbl_len <= QCA_FW_BUILD_VER_LEN - 1) {
|
||||
memcpy(build_label, edl->data + 1, build_lbl_len);
|
||||
*(build_label + build_lbl_len) = '\0';
|
||||
if (skb->len < sizeof(*edl) + 1) {
|
||||
err = -EILSEQ;
|
||||
goto out;
|
||||
}
|
||||
|
||||
build_lbl_len = edl->data[0];
|
||||
|
||||
if (skb->len < sizeof(*edl) + 1 + build_lbl_len) {
|
||||
err = -EILSEQ;
|
||||
goto out;
|
||||
}
|
||||
|
||||
build_label = kstrndup(&edl->data[1], build_lbl_len, GFP_KERNEL);
|
||||
if (!build_label)
|
||||
goto out;
|
||||
|
||||
hci_set_fw_info(hdev, "%s", build_label);
|
||||
|
||||
kfree(build_label);
|
||||
out:
|
||||
kfree_skb(skb);
|
||||
return err;
|
||||
|
@ -237,6 +252,11 @@ static int qca_read_fw_board_id(struct hci_dev *hdev, u16 *bid)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (skb->len < 3) {
|
||||
err = -EILSEQ;
|
||||
goto out;
|
||||
}
|
||||
|
||||
*bid = (edl->data[1] << 8) + edl->data[2];
|
||||
bt_dev_dbg(hdev, "%s: bid = %x", __func__, *bid);
|
||||
|
||||
|
@ -267,9 +287,10 @@ int qca_send_pre_shutdown_cmd(struct hci_dev *hdev)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(qca_send_pre_shutdown_cmd);
|
||||
|
||||
static void qca_tlv_check_data(struct hci_dev *hdev,
|
||||
static int qca_tlv_check_data(struct hci_dev *hdev,
|
||||
struct qca_fw_config *config,
|
||||
u8 *fw_data, enum qca_btsoc_type soc_type)
|
||||
u8 *fw_data, size_t fw_size,
|
||||
enum qca_btsoc_type soc_type)
|
||||
{
|
||||
const u8 *data;
|
||||
u32 type_len;
|
||||
|
@ -279,12 +300,16 @@ static void qca_tlv_check_data(struct hci_dev *hdev,
|
|||
struct tlv_type_patch *tlv_patch;
|
||||
struct tlv_type_nvm *tlv_nvm;
|
||||
uint8_t nvm_baud_rate = config->user_baud_rate;
|
||||
u8 type;
|
||||
|
||||
config->dnld_mode = QCA_SKIP_EVT_NONE;
|
||||
config->dnld_type = QCA_SKIP_EVT_NONE;
|
||||
|
||||
switch (config->type) {
|
||||
case ELF_TYPE_PATCH:
|
||||
if (fw_size < 7)
|
||||
return -EINVAL;
|
||||
|
||||
config->dnld_mode = QCA_SKIP_EVT_VSE_CC;
|
||||
config->dnld_type = QCA_SKIP_EVT_VSE_CC;
|
||||
|
||||
|
@ -293,6 +318,9 @@ static void qca_tlv_check_data(struct hci_dev *hdev,
|
|||
bt_dev_dbg(hdev, "File version : 0x%x", fw_data[6]);
|
||||
break;
|
||||
case TLV_TYPE_PATCH:
|
||||
if (fw_size < sizeof(struct tlv_type_hdr) + sizeof(struct tlv_type_patch))
|
||||
return -EINVAL;
|
||||
|
||||
tlv = (struct tlv_type_hdr *)fw_data;
|
||||
type_len = le32_to_cpu(tlv->type_len);
|
||||
tlv_patch = (struct tlv_type_patch *)tlv->data;
|
||||
|
@ -332,25 +360,64 @@ static void qca_tlv_check_data(struct hci_dev *hdev,
|
|||
break;
|
||||
|
||||
case TLV_TYPE_NVM:
|
||||
if (fw_size < sizeof(struct tlv_type_hdr))
|
||||
return -EINVAL;
|
||||
|
||||
tlv = (struct tlv_type_hdr *)fw_data;
|
||||
|
||||
type_len = le32_to_cpu(tlv->type_len);
|
||||
length = (type_len >> 8) & 0x00ffffff;
|
||||
length = type_len >> 8;
|
||||
type = type_len & 0xff;
|
||||
|
||||
BT_DBG("TLV Type\t\t : 0x%x", type_len & 0x000000ff);
|
||||
/* Some NVM files have more than one set of tags, only parse
|
||||
* the first set when it has type 2 for now. When there is
|
||||
* more than one set there is an enclosing header of type 4.
|
||||
*/
|
||||
if (type == 4) {
|
||||
if (fw_size < 2 * sizeof(struct tlv_type_hdr))
|
||||
return -EINVAL;
|
||||
|
||||
tlv++;
|
||||
|
||||
type_len = le32_to_cpu(tlv->type_len);
|
||||
length = type_len >> 8;
|
||||
type = type_len & 0xff;
|
||||
}
|
||||
|
||||
BT_DBG("TLV Type\t\t : 0x%x", type);
|
||||
BT_DBG("Length\t\t : %d bytes", length);
|
||||
|
||||
if (type != 2)
|
||||
break;
|
||||
|
||||
if (fw_size < length + (tlv->data - fw_data))
|
||||
return -EINVAL;
|
||||
|
||||
idx = 0;
|
||||
data = tlv->data;
|
||||
while (idx < length) {
|
||||
while (idx < length - sizeof(struct tlv_type_nvm)) {
|
||||
tlv_nvm = (struct tlv_type_nvm *)(data + idx);
|
||||
|
||||
tag_id = le16_to_cpu(tlv_nvm->tag_id);
|
||||
tag_len = le16_to_cpu(tlv_nvm->tag_len);
|
||||
|
||||
if (length < idx + sizeof(struct tlv_type_nvm) + tag_len)
|
||||
return -EINVAL;
|
||||
|
||||
/* Update NVM tags as needed */
|
||||
switch (tag_id) {
|
||||
case EDL_TAG_ID_BD_ADDR:
|
||||
if (tag_len != sizeof(bdaddr_t))
|
||||
return -EINVAL;
|
||||
|
||||
memcpy(&config->bdaddr, tlv_nvm->data, sizeof(bdaddr_t));
|
||||
|
||||
break;
|
||||
|
||||
case EDL_TAG_ID_HCI:
|
||||
if (tag_len < 3)
|
||||
return -EINVAL;
|
||||
|
||||
/* HCI transport layer parameters
|
||||
* enabling software inband sleep
|
||||
* onto controller side.
|
||||
|
@ -366,6 +433,9 @@ static void qca_tlv_check_data(struct hci_dev *hdev,
|
|||
break;
|
||||
|
||||
case EDL_TAG_ID_DEEP_SLEEP:
|
||||
if (tag_len < 1)
|
||||
return -EINVAL;
|
||||
|
||||
/* Sleep enable mask
|
||||
* enabling deep sleep feature on controller.
|
||||
*/
|
||||
|
@ -374,14 +444,16 @@ static void qca_tlv_check_data(struct hci_dev *hdev,
|
|||
break;
|
||||
}
|
||||
|
||||
idx += (sizeof(u16) + sizeof(u16) + 8 + tag_len);
|
||||
idx += sizeof(struct tlv_type_nvm) + tag_len;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
BT_ERR("Unknown TLV type %d", config->type);
|
||||
break;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int qca_tlv_send_segment(struct hci_dev *hdev, int seg_size,
|
||||
|
@ -531,7 +603,9 @@ static int qca_download_firmware(struct hci_dev *hdev,
|
|||
memcpy(data, fw->data, size);
|
||||
release_firmware(fw);
|
||||
|
||||
qca_tlv_check_data(hdev, config, data, soc_type);
|
||||
ret = qca_tlv_check_data(hdev, config, data, size, soc_type);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
segment = data;
|
||||
remain = size;
|
||||
|
@ -614,7 +688,7 @@ int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(qca_set_bdaddr_rome);
|
||||
|
||||
static int qca_check_bdaddr(struct hci_dev *hdev)
|
||||
static int qca_check_bdaddr(struct hci_dev *hdev, const struct qca_fw_config *config)
|
||||
{
|
||||
struct hci_rp_read_bd_addr *bda;
|
||||
struct sk_buff *skb;
|
||||
|
@ -638,7 +712,7 @@ static int qca_check_bdaddr(struct hci_dev *hdev)
|
|||
}
|
||||
|
||||
bda = (struct hci_rp_read_bd_addr *)skb->data;
|
||||
if (!bacmp(&bda->bdaddr, QCA_BDADDR_DEFAULT))
|
||||
if (!bacmp(&bda->bdaddr, &config->bdaddr))
|
||||
set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks);
|
||||
|
||||
kfree_skb(skb);
|
||||
|
@ -667,7 +741,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
|
|||
enum qca_btsoc_type soc_type, struct qca_btsoc_version ver,
|
||||
const char *firmware_name)
|
||||
{
|
||||
struct qca_fw_config config;
|
||||
struct qca_fw_config config = {};
|
||||
int err;
|
||||
u8 rom_ver = 0;
|
||||
u32 soc_ver;
|
||||
|
@ -852,7 +926,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
|
|||
break;
|
||||
}
|
||||
|
||||
err = qca_check_bdaddr(hdev);
|
||||
err = qca_check_bdaddr(hdev, &config);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#define EDL_PATCH_CONFIG_RES_EVT (0x00)
|
||||
#define QCA_DISABLE_LOGGING_SUB_OP (0x14)
|
||||
|
||||
#define EDL_TAG_ID_BD_ADDR 2
|
||||
#define EDL_TAG_ID_HCI (17)
|
||||
#define EDL_TAG_ID_DEEP_SLEEP (27)
|
||||
|
||||
|
@ -47,7 +48,6 @@
|
|||
#define get_soc_ver(soc_id, rom_ver) \
|
||||
((le32_to_cpu(soc_id) << 16) | (le16_to_cpu(rom_ver)))
|
||||
|
||||
#define QCA_FW_BUILD_VER_LEN 255
|
||||
#define QCA_HSP_GF_SOC_ID 0x1200
|
||||
#define QCA_HSP_GF_SOC_MASK 0x0000ff00
|
||||
|
||||
|
@ -94,6 +94,7 @@ struct qca_fw_config {
|
|||
uint8_t user_baud_rate;
|
||||
enum qca_tlv_dnld_mode dnld_mode;
|
||||
enum qca_tlv_dnld_mode dnld_type;
|
||||
bdaddr_t bdaddr;
|
||||
};
|
||||
|
||||
struct edl_event_hdr {
|
||||
|
|
|
@ -290,7 +290,7 @@ static int __init sifive_ccache_init(void)
|
|||
struct device_node *np;
|
||||
struct resource res;
|
||||
const struct of_device_id *match;
|
||||
unsigned long quirks;
|
||||
unsigned long quirks __maybe_unused;
|
||||
int rc;
|
||||
|
||||
np = of_find_matching_node_and_match(NULL, sifive_ccache_ids, &match);
|
||||
|
|
|
@ -768,6 +768,7 @@ static struct clk_smd_rpm *msm8976_clks[] = {
|
|||
|
||||
static const struct rpm_smd_clk_desc rpm_clk_msm8976 = {
|
||||
.clks = msm8976_clks,
|
||||
.num_clks = ARRAY_SIZE(msm8976_clks),
|
||||
.icc_clks = bimc_pcnoc_snoc_smmnoc_icc_clks,
|
||||
.num_icc_clks = ARRAY_SIZE(bimc_pcnoc_snoc_smmnoc_icc_clks),
|
||||
};
|
||||
|
|
|
@ -487,9 +487,14 @@ int gdsc_register(struct gdsc_desc *desc,
|
|||
if (!scs[i] || !scs[i]->supply)
|
||||
continue;
|
||||
|
||||
scs[i]->rsupply = devm_regulator_get(dev, scs[i]->supply);
|
||||
if (IS_ERR(scs[i]->rsupply))
|
||||
return PTR_ERR(scs[i]->rsupply);
|
||||
scs[i]->rsupply = devm_regulator_get_optional(dev, scs[i]->supply);
|
||||
if (IS_ERR(scs[i]->rsupply)) {
|
||||
ret = PTR_ERR(scs[i]->rsupply);
|
||||
if (ret != -ENODEV)
|
||||
return ret;
|
||||
|
||||
scs[i]->rsupply = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
data->num_domains = num;
|
||||
|
|
|
@ -13,9 +13,9 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/property.h>
|
||||
|
||||
#define EXYNOS_CLKOUT_NR_CLKS 1
|
||||
#define EXYNOS_CLKOUT_PARENTS 32
|
||||
|
@ -84,17 +84,24 @@ MODULE_DEVICE_TABLE(of, exynos_clkout_ids);
|
|||
static int exynos_clkout_match_parent_dev(struct device *dev, u32 *mux_mask)
|
||||
{
|
||||
const struct exynos_clkout_variant *variant;
|
||||
const struct of_device_id *match;
|
||||
|
||||
if (!dev->parent) {
|
||||
dev_err(dev, "not instantiated from MFD\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
variant = device_get_match_data(dev->parent);
|
||||
if (!variant) {
|
||||
/*
|
||||
* 'exynos_clkout_ids' arrays is not the ids array matched by
|
||||
* the dev->parent driver, so of_device_get_match_data() or
|
||||
* device_get_match_data() cannot be used here.
|
||||
*/
|
||||
match = of_match_device(exynos_clkout_ids, dev->parent);
|
||||
if (!match) {
|
||||
dev_err(dev, "cannot match parent device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
variant = match->data;
|
||||
|
||||
*mux_mask = variant->mux_mask;
|
||||
|
||||
|
|
|
@ -182,6 +182,8 @@ static struct ccu_nkm pll_mipi_clk = {
|
|||
&ccu_nkm_ops,
|
||||
CLK_SET_RATE_UNGATE | CLK_SET_RATE_PARENT),
|
||||
.features = CCU_FEATURE_CLOSEST_RATE,
|
||||
.min_rate = 500000000,
|
||||
.max_rate = 1400000000,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -1181,11 +1181,18 @@ static const u32 usb2_clk_regs[] = {
|
|||
SUN50I_H6_USB3_CLK_REG,
|
||||
};
|
||||
|
||||
static struct ccu_mux_nb sun50i_h6_cpu_nb = {
|
||||
.common = &cpux_clk.common,
|
||||
.cm = &cpux_clk.mux,
|
||||
.delay_us = 1,
|
||||
.bypass_index = 0, /* index of 24 MHz oscillator */
|
||||
};
|
||||
|
||||
static int sun50i_h6_ccu_probe(struct platform_device *pdev)
|
||||
{
|
||||
void __iomem *reg;
|
||||
int i, ret;
|
||||
u32 val;
|
||||
int i;
|
||||
|
||||
reg = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(reg))
|
||||
|
@ -1252,7 +1259,15 @@ static int sun50i_h6_ccu_probe(struct platform_device *pdev)
|
|||
val |= BIT(24);
|
||||
writel(val, reg + SUN50I_H6_HDMI_CEC_CLK_REG);
|
||||
|
||||
return devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_h6_ccu_desc);
|
||||
ret = devm_sunxi_ccu_probe(&pdev->dev, reg, &sun50i_h6_ccu_desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Reparent CPU during PLL CPUX rate changes */
|
||||
ccu_mux_notifier_register(pll_cpux_clk.common.hw.clk,
|
||||
&sun50i_h6_cpu_nb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id sun50i_h6_ccu_ids[] = {
|
||||
|
|
|
@ -44,6 +44,16 @@ bool ccu_is_better_rate(struct ccu_common *common,
|
|||
unsigned long current_rate,
|
||||
unsigned long best_rate)
|
||||
{
|
||||
unsigned long min_rate, max_rate;
|
||||
|
||||
clk_hw_get_rate_range(&common->hw, &min_rate, &max_rate);
|
||||
|
||||
if (current_rate > max_rate)
|
||||
return false;
|
||||
|
||||
if (current_rate < min_rate)
|
||||
return false;
|
||||
|
||||
if (common->features & CCU_FEATURE_CLOSEST_RATE)
|
||||
return abs(current_rate - target_rate) < abs(best_rate - target_rate);
|
||||
|
||||
|
@ -122,6 +132,7 @@ static int sunxi_ccu_probe(struct sunxi_ccu *ccu, struct device *dev,
|
|||
|
||||
for (i = 0; i < desc->hw_clks->num ; i++) {
|
||||
struct clk_hw *hw = desc->hw_clks->hws[i];
|
||||
struct ccu_common *common = hw_to_ccu_common(hw);
|
||||
const char *name;
|
||||
|
||||
if (!hw)
|
||||
|
@ -136,6 +147,14 @@ static int sunxi_ccu_probe(struct sunxi_ccu *ccu, struct device *dev,
|
|||
pr_err("Couldn't register clock %d - %s\n", i, name);
|
||||
goto err_clk_unreg;
|
||||
}
|
||||
|
||||
if (common->max_rate)
|
||||
clk_hw_set_rate_range(hw, common->min_rate,
|
||||
common->max_rate);
|
||||
else
|
||||
WARN(common->min_rate,
|
||||
"No max_rate, ignoring min_rate of clock %d - %s\n",
|
||||
i, name);
|
||||
}
|
||||
|
||||
ret = of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
|
||||
|
|
|
@ -31,6 +31,9 @@ struct ccu_common {
|
|||
u16 lock_reg;
|
||||
u32 prediv;
|
||||
|
||||
unsigned long min_rate;
|
||||
unsigned long max_rate;
|
||||
|
||||
unsigned long features;
|
||||
spinlock_t *lock;
|
||||
struct clk_hw hw;
|
||||
|
|
|
@ -2184,6 +2184,7 @@ static bool parent_port_is_cxl_root(struct cxl_port *port)
|
|||
int cxl_endpoint_get_perf_coordinates(struct cxl_port *port,
|
||||
struct access_coordinate *coord)
|
||||
{
|
||||
struct cxl_memdev *cxlmd = to_cxl_memdev(port->uport_dev);
|
||||
struct access_coordinate c[] = {
|
||||
{
|
||||
.read_bandwidth = UINT_MAX,
|
||||
|
@ -2197,12 +2198,20 @@ int cxl_endpoint_get_perf_coordinates(struct cxl_port *port,
|
|||
struct cxl_port *iter = port;
|
||||
struct cxl_dport *dport;
|
||||
struct pci_dev *pdev;
|
||||
struct device *dev;
|
||||
unsigned int bw;
|
||||
bool is_cxl_root;
|
||||
|
||||
if (!is_cxl_endpoint(port))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Skip calculation for RCD. Expectation is HMAT already covers RCD case
|
||||
* since RCH does not support hotplug.
|
||||
*/
|
||||
if (cxlmd->cxlds->rcd)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Exit the loop when the parent port of the current iter port is cxl
|
||||
* root. The iterative loop starts at the endpoint and gathers the
|
||||
|
@ -2232,8 +2241,12 @@ int cxl_endpoint_get_perf_coordinates(struct cxl_port *port,
|
|||
return -EINVAL;
|
||||
cxl_coordinates_combine(c, c, dport->coord);
|
||||
|
||||
dev = port->uport_dev->parent;
|
||||
if (!dev_is_pci(dev))
|
||||
return -ENODEV;
|
||||
|
||||
/* Get the calculated PCI paths bandwidth */
|
||||
pdev = to_pci_dev(port->uport_dev->parent);
|
||||
pdev = to_pci_dev(dev);
|
||||
bw = pcie_bandwidth_available(pdev, NULL, NULL, NULL);
|
||||
if (bw == 0)
|
||||
return -ENXIO;
|
||||
|
|
|
@ -425,7 +425,7 @@ static void handle_error(struct mem_ctl_info *mci, struct ecc_status *stat)
|
|||
convert_to_physical(priv, pinf), pinf.burstpos);
|
||||
|
||||
edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci,
|
||||
priv->ce_cnt, 0, 0, 0, 0, 0, -1,
|
||||
1, 0, 0, 0, 0, 0, -1,
|
||||
priv->message, "");
|
||||
}
|
||||
|
||||
|
@ -438,7 +438,7 @@ static void handle_error(struct mem_ctl_info *mci, struct ecc_status *stat)
|
|||
convert_to_physical(priv, pinf), pinf.burstpos);
|
||||
|
||||
edac_mc_handle_error(HW_EVENT_ERR_UNCORRECTED, mci,
|
||||
priv->ue_cnt, 0, 0, 0, 0, 0, -1,
|
||||
1, 0, 0, 0, 0, 0, -1,
|
||||
priv->message, "");
|
||||
}
|
||||
|
||||
|
@ -865,6 +865,9 @@ static ssize_t inject_data_ue_store(struct file *file, const char __user *data,
|
|||
for (i = 0; i < NUM_UE_BITPOS; i++)
|
||||
token[i] = strsep(&pbuf, ",");
|
||||
|
||||
if (!token[0] || !token[1])
|
||||
return -EFAULT;
|
||||
|
||||
ret = kstrtou8(token[0], 0, &ue0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -1135,8 +1138,7 @@ static int mc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
rc = xlnx_register_event(PM_NOTIFY_CB, VERSAL_EVENT_ERROR_PMC_ERR1,
|
||||
XPM_EVENT_ERROR_MASK_DDRMC_CR | XPM_EVENT_ERROR_MASK_DDRMC_NCR |
|
||||
XPM_EVENT_ERROR_MASK_NOC_CR | XPM_EVENT_ERROR_MASK_NOC_NCR,
|
||||
XPM_EVENT_ERROR_MASK_DDRMC_CR | XPM_EVENT_ERROR_MASK_DDRMC_NCR,
|
||||
false, err_callback, mci);
|
||||
if (rc) {
|
||||
if (rc == -EACCES)
|
||||
|
@ -1173,8 +1175,6 @@ static void mc_remove(struct platform_device *pdev)
|
|||
|
||||
xlnx_unregister_event(PM_NOTIFY_CB, VERSAL_EVENT_ERROR_PMC_ERR1,
|
||||
XPM_EVENT_ERROR_MASK_DDRMC_CR |
|
||||
XPM_EVENT_ERROR_MASK_NOC_CR |
|
||||
XPM_EVENT_ERROR_MASK_NOC_NCR |
|
||||
XPM_EVENT_ERROR_MASK_DDRMC_NCR, err_callback, mci);
|
||||
edac_mc_del_mc(&pdev->dev);
|
||||
edac_mc_free(mci);
|
||||
|
|
|
@ -148,10 +148,12 @@ packet_buffer_get(struct client *client, char __user *data, size_t user_length)
|
|||
if (atomic_read(&buffer->size) == 0)
|
||||
return -ENODEV;
|
||||
|
||||
/* FIXME: Check length <= user_length. */
|
||||
length = buffer->head->length;
|
||||
|
||||
if (length > user_length)
|
||||
return 0;
|
||||
|
||||
end = buffer->data + buffer->capacity;
|
||||
length = buffer->head->length;
|
||||
|
||||
if (&buffer->head->data[length] < end) {
|
||||
if (copy_to_user(data, buffer->head->data, length))
|
||||
|
|
|
@ -1556,6 +1556,8 @@ static int handle_at_packet(struct context *context,
|
|||
#define HEADER_GET_DATA_LENGTH(q) (((q) >> 16) & 0xffff)
|
||||
#define HEADER_GET_EXTENDED_TCODE(q) (((q) >> 0) & 0xffff)
|
||||
|
||||
static u32 get_cycle_time(struct fw_ohci *ohci);
|
||||
|
||||
static void handle_local_rom(struct fw_ohci *ohci,
|
||||
struct fw_packet *packet, u32 csr)
|
||||
{
|
||||
|
@ -1580,6 +1582,8 @@ static void handle_local_rom(struct fw_ohci *ohci,
|
|||
(void *) ohci->config_rom + i, length);
|
||||
}
|
||||
|
||||
// Timestamping on behalf of the hardware.
|
||||
response.timestamp = cycle_time_to_ohci_tstamp(get_cycle_time(ohci));
|
||||
fw_core_handle_response(&ohci->card, &response);
|
||||
}
|
||||
|
||||
|
@ -1628,6 +1632,8 @@ static void handle_local_lock(struct fw_ohci *ohci,
|
|||
fw_fill_response(&response, packet->header, RCODE_BUSY, NULL, 0);
|
||||
|
||||
out:
|
||||
// Timestamping on behalf of the hardware.
|
||||
response.timestamp = cycle_time_to_ohci_tstamp(get_cycle_time(ohci));
|
||||
fw_core_handle_response(&ohci->card, &response);
|
||||
}
|
||||
|
||||
|
@ -1670,8 +1676,6 @@ static void handle_local_request(struct context *ctx, struct fw_packet *packet)
|
|||
}
|
||||
}
|
||||
|
||||
static u32 get_cycle_time(struct fw_ohci *ohci);
|
||||
|
||||
static void at_context_transmit(struct context *ctx, struct fw_packet *packet)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <linux/memblock.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/crash_dump.h>
|
||||
#include <linux/nmi.h>
|
||||
#include <asm/unaccepted_memory.h>
|
||||
|
||||
/* Protects unaccepted memory bitmap and accepting_list */
|
||||
|
@ -149,6 +150,9 @@ retry:
|
|||
}
|
||||
|
||||
list_del(&range.list);
|
||||
|
||||
touch_softlockup_watchdog();
|
||||
|
||||
spin_unlock_irqrestore(&unaccepted_memory_lock, flags);
|
||||
}
|
||||
|
||||
|
|
|
@ -206,10 +206,12 @@ static int mpfs_auto_update_verify_image(struct fw_upload *fw_uploader)
|
|||
if (ret | response->resp_status) {
|
||||
dev_warn(priv->dev, "Verification of Upgrade Image failed!\n");
|
||||
ret = ret ? ret : -EBADMSG;
|
||||
goto free_message;
|
||||
}
|
||||
|
||||
dev_info(priv->dev, "Verification of Upgrade Image passed!\n");
|
||||
|
||||
free_message:
|
||||
devm_kfree(priv->dev, message);
|
||||
free_response:
|
||||
devm_kfree(priv->dev, response);
|
||||
|
@ -265,7 +267,7 @@ static int mpfs_auto_update_set_image_address(struct mpfs_auto_update_priv *priv
|
|||
AUTO_UPDATE_DIRECTORY_WIDTH);
|
||||
memset(buffer + AUTO_UPDATE_BLANK_DIRECTORY, 0x0, AUTO_UPDATE_DIRECTORY_WIDTH);
|
||||
|
||||
dev_info(priv->dev, "Writing the image address (%x) to the flash directory (%llx)\n",
|
||||
dev_info(priv->dev, "Writing the image address (0x%x) to the flash directory (0x%llx)\n",
|
||||
image_address, directory_address);
|
||||
|
||||
ret = mtd_write(priv->flash, 0x0, erase_size, &bytes_written, (u_char *)buffer);
|
||||
|
@ -313,7 +315,7 @@ static int mpfs_auto_update_write_bitstream(struct fw_upload *fw_uploader, const
|
|||
erase.len = round_up(size, (size_t)priv->flash->erasesize);
|
||||
erase.addr = image_address;
|
||||
|
||||
dev_info(priv->dev, "Erasing the flash at address (%x)\n", image_address);
|
||||
dev_info(priv->dev, "Erasing the flash at address (0x%x)\n", image_address);
|
||||
ret = mtd_erase(priv->flash, &erase);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
@ -323,7 +325,7 @@ static int mpfs_auto_update_write_bitstream(struct fw_upload *fw_uploader, const
|
|||
* will do all of that itself - including verifying that the bitstream
|
||||
* is valid.
|
||||
*/
|
||||
dev_info(priv->dev, "Writing the image to the flash at address (%x)\n", image_address);
|
||||
dev_info(priv->dev, "Writing the image to the flash at address (0x%x)\n", image_address);
|
||||
ret = mtd_write(priv->flash, (loff_t)image_address, size, &bytes_written, data);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
|
|
@ -78,6 +78,7 @@ static void cci_pci_free_irq(struct pci_dev *pcidev)
|
|||
#define PCIE_DEVICE_ID_SILICOM_PAC_N5011 0x1001
|
||||
#define PCIE_DEVICE_ID_INTEL_DFL 0xbcce
|
||||
/* PCI Subdevice ID for PCIE_DEVICE_ID_INTEL_DFL */
|
||||
#define PCIE_SUBDEVICE_ID_INTEL_D5005 0x138d
|
||||
#define PCIE_SUBDEVICE_ID_INTEL_N6000 0x1770
|
||||
#define PCIE_SUBDEVICE_ID_INTEL_N6001 0x1771
|
||||
#define PCIE_SUBDEVICE_ID_INTEL_C6100 0x17d4
|
||||
|
@ -101,6 +102,8 @@ static struct pci_device_id cci_pcie_id_tbl[] = {
|
|||
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_PAC_D5005_VF),},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_SILICOM_DENMARK, PCIE_DEVICE_ID_SILICOM_PAC_N5010),},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_SILICOM_DENMARK, PCIE_DEVICE_ID_SILICOM_PAC_N5011),},
|
||||
{PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_DFL,
|
||||
PCI_VENDOR_ID_INTEL, PCIE_SUBDEVICE_ID_INTEL_D5005),},
|
||||
{PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_DFL,
|
||||
PCI_VENDOR_ID_INTEL, PCIE_SUBDEVICE_ID_INTEL_N6000),},
|
||||
{PCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_DFL_VF,
|
||||
|
|
|
@ -220,7 +220,7 @@ int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,
|
|||
(kfd_mem_limit.ttm_mem_used + ttm_mem_needed >
|
||||
kfd_mem_limit.max_ttm_mem_limit) ||
|
||||
(adev && xcp_id >= 0 && adev->kfd.vram_used[xcp_id] + vram_needed >
|
||||
vram_size - reserved_for_pt)) {
|
||||
vram_size - reserved_for_pt - atomic64_read(&adev->vram_pin_size))) {
|
||||
ret = -ENOMEM;
|
||||
goto release;
|
||||
}
|
||||
|
|
|
@ -1243,14 +1243,18 @@ int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,
|
|||
* amdgpu_bo_move_notify - notification about a memory move
|
||||
* @bo: pointer to a buffer object
|
||||
* @evict: if this move is evicting the buffer from the graphics address space
|
||||
* @new_mem: new resource for backing the BO
|
||||
*
|
||||
* Marks the corresponding &amdgpu_bo buffer object as invalid, also performs
|
||||
* bookkeeping.
|
||||
* TTM driver callback which is called when ttm moves a buffer.
|
||||
*/
|
||||
void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict)
|
||||
void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
|
||||
bool evict,
|
||||
struct ttm_resource *new_mem)
|
||||
{
|
||||
struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev);
|
||||
struct ttm_resource *old_mem = bo->resource;
|
||||
struct amdgpu_bo *abo;
|
||||
|
||||
if (!amdgpu_bo_is_amdgpu_bo(bo))
|
||||
|
@ -1262,12 +1266,12 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict)
|
|||
amdgpu_bo_kunmap(abo);
|
||||
|
||||
if (abo->tbo.base.dma_buf && !abo->tbo.base.import_attach &&
|
||||
bo->resource->mem_type != TTM_PL_SYSTEM)
|
||||
old_mem && old_mem->mem_type != TTM_PL_SYSTEM)
|
||||
dma_buf_move_notify(abo->tbo.base.dma_buf);
|
||||
|
||||
/* remember the eviction */
|
||||
if (evict)
|
||||
atomic64_inc(&adev->num_evictions);
|
||||
/* move_notify is called before move happens */
|
||||
trace_amdgpu_bo_move(abo, new_mem ? new_mem->mem_type : -1,
|
||||
old_mem ? old_mem->mem_type : -1);
|
||||
}
|
||||
|
||||
void amdgpu_bo_get_memory(struct amdgpu_bo *bo,
|
||||
|
|
|
@ -328,7 +328,9 @@ int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata,
|
|||
int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,
|
||||
size_t buffer_size, uint32_t *metadata_size,
|
||||
uint64_t *flags);
|
||||
void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict);
|
||||
void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,
|
||||
bool evict,
|
||||
struct ttm_resource *new_mem);
|
||||
void amdgpu_bo_release_notify(struct ttm_buffer_object *bo);
|
||||
vm_fault_t amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo);
|
||||
void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence,
|
||||
|
|
|
@ -419,7 +419,7 @@ bool amdgpu_res_cpu_visible(struct amdgpu_device *adev,
|
|||
return false;
|
||||
|
||||
if (res->mem_type == TTM_PL_SYSTEM || res->mem_type == TTM_PL_TT ||
|
||||
res->mem_type == AMDGPU_PL_PREEMPT)
|
||||
res->mem_type == AMDGPU_PL_PREEMPT || res->mem_type == AMDGPU_PL_DOORBELL)
|
||||
return true;
|
||||
|
||||
if (res->mem_type != TTM_PL_VRAM)
|
||||
|
@ -481,14 +481,16 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
|
|||
|
||||
if (!old_mem || (old_mem->mem_type == TTM_PL_SYSTEM &&
|
||||
bo->ttm == NULL)) {
|
||||
amdgpu_bo_move_notify(bo, evict, new_mem);
|
||||
ttm_bo_move_null(bo, new_mem);
|
||||
goto out;
|
||||
return 0;
|
||||
}
|
||||
if (old_mem->mem_type == TTM_PL_SYSTEM &&
|
||||
(new_mem->mem_type == TTM_PL_TT ||
|
||||
new_mem->mem_type == AMDGPU_PL_PREEMPT)) {
|
||||
amdgpu_bo_move_notify(bo, evict, new_mem);
|
||||
ttm_bo_move_null(bo, new_mem);
|
||||
goto out;
|
||||
return 0;
|
||||
}
|
||||
if ((old_mem->mem_type == TTM_PL_TT ||
|
||||
old_mem->mem_type == AMDGPU_PL_PREEMPT) &&
|
||||
|
@ -498,9 +500,10 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
|
|||
return r;
|
||||
|
||||
amdgpu_ttm_backend_unbind(bo->bdev, bo->ttm);
|
||||
amdgpu_bo_move_notify(bo, evict, new_mem);
|
||||
ttm_resource_free(bo, &bo->resource);
|
||||
ttm_bo_assign_mem(bo, new_mem);
|
||||
goto out;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (old_mem->mem_type == AMDGPU_PL_GDS ||
|
||||
|
@ -512,8 +515,9 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
|
|||
new_mem->mem_type == AMDGPU_PL_OA ||
|
||||
new_mem->mem_type == AMDGPU_PL_DOORBELL) {
|
||||
/* Nothing to save here */
|
||||
amdgpu_bo_move_notify(bo, evict, new_mem);
|
||||
ttm_bo_move_null(bo, new_mem);
|
||||
goto out;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (bo->type == ttm_bo_type_device &&
|
||||
|
@ -525,23 +529,24 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
|
|||
abo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
|
||||
}
|
||||
|
||||
if (adev->mman.buffer_funcs_enabled) {
|
||||
if (((old_mem->mem_type == TTM_PL_SYSTEM &&
|
||||
new_mem->mem_type == TTM_PL_VRAM) ||
|
||||
(old_mem->mem_type == TTM_PL_VRAM &&
|
||||
new_mem->mem_type == TTM_PL_SYSTEM))) {
|
||||
hop->fpfn = 0;
|
||||
hop->lpfn = 0;
|
||||
hop->mem_type = TTM_PL_TT;
|
||||
hop->flags = TTM_PL_FLAG_TEMPORARY;
|
||||
return -EMULTIHOP;
|
||||
}
|
||||
|
||||
r = amdgpu_move_blit(bo, evict, new_mem, old_mem);
|
||||
} else {
|
||||
r = -ENODEV;
|
||||
if (adev->mman.buffer_funcs_enabled &&
|
||||
((old_mem->mem_type == TTM_PL_SYSTEM &&
|
||||
new_mem->mem_type == TTM_PL_VRAM) ||
|
||||
(old_mem->mem_type == TTM_PL_VRAM &&
|
||||
new_mem->mem_type == TTM_PL_SYSTEM))) {
|
||||
hop->fpfn = 0;
|
||||
hop->lpfn = 0;
|
||||
hop->mem_type = TTM_PL_TT;
|
||||
hop->flags = TTM_PL_FLAG_TEMPORARY;
|
||||
return -EMULTIHOP;
|
||||
}
|
||||
|
||||
amdgpu_bo_move_notify(bo, evict, new_mem);
|
||||
if (adev->mman.buffer_funcs_enabled)
|
||||
r = amdgpu_move_blit(bo, evict, new_mem, old_mem);
|
||||
else
|
||||
r = -ENODEV;
|
||||
|
||||
if (r) {
|
||||
/* Check that all memory is CPU accessible */
|
||||
if (!amdgpu_res_copyable(adev, old_mem) ||
|
||||
|
@ -555,11 +560,10 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
|
|||
return r;
|
||||
}
|
||||
|
||||
trace_amdgpu_bo_move(abo, new_mem->mem_type, old_mem->mem_type);
|
||||
out:
|
||||
/* update statistics */
|
||||
/* update statistics after the move */
|
||||
if (evict)
|
||||
atomic64_inc(&adev->num_evictions);
|
||||
atomic64_add(bo->base.size, &adev->num_bytes_moved);
|
||||
amdgpu_bo_move_notify(bo, evict);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1559,7 +1563,7 @@ static int amdgpu_ttm_access_memory(struct ttm_buffer_object *bo,
|
|||
static void
|
||||
amdgpu_bo_delete_mem_notify(struct ttm_buffer_object *bo)
|
||||
{
|
||||
amdgpu_bo_move_notify(bo, false);
|
||||
amdgpu_bo_move_notify(bo, false, NULL);
|
||||
}
|
||||
|
||||
static struct ttm_device_funcs amdgpu_bo_driver = {
|
||||
|
|
|
@ -829,6 +829,14 @@ struct kfd_process *kfd_create_process(struct task_struct *thread)
|
|||
if (process) {
|
||||
pr_debug("Process already found\n");
|
||||
} else {
|
||||
/* If the process just called exec(3), it is possible that the
|
||||
* cleanup of the kfd_process (following the release of the mm
|
||||
* of the old process image) is still in the cleanup work queue.
|
||||
* Make sure to drain any job before trying to recreate any
|
||||
* resource for this process.
|
||||
*/
|
||||
flush_workqueue(kfd_process_wq);
|
||||
|
||||
process = create_process(thread);
|
||||
if (IS_ERR(process))
|
||||
goto out;
|
||||
|
|
|
@ -4537,15 +4537,18 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
|
|||
/* Determine whether to enable Replay support by default. */
|
||||
if (!(amdgpu_dc_debug_mask & DC_DISABLE_REPLAY)) {
|
||||
switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) {
|
||||
case IP_VERSION(3, 1, 4):
|
||||
case IP_VERSION(3, 1, 5):
|
||||
case IP_VERSION(3, 1, 6):
|
||||
case IP_VERSION(3, 2, 0):
|
||||
case IP_VERSION(3, 2, 1):
|
||||
case IP_VERSION(3, 5, 0):
|
||||
case IP_VERSION(3, 5, 1):
|
||||
replay_feature_enabled = true;
|
||||
break;
|
||||
/*
|
||||
* Disabled by default due to https://gitlab.freedesktop.org/drm/amd/-/issues/3344
|
||||
* case IP_VERSION(3, 1, 4):
|
||||
* case IP_VERSION(3, 1, 5):
|
||||
* case IP_VERSION(3, 1, 6):
|
||||
* case IP_VERSION(3, 2, 0):
|
||||
* case IP_VERSION(3, 2, 1):
|
||||
* case IP_VERSION(3, 5, 0):
|
||||
* case IP_VERSION(3, 5, 1):
|
||||
* replay_feature_enabled = true;
|
||||
* break;
|
||||
*/
|
||||
default:
|
||||
replay_feature_enabled = amdgpu_dc_feature_mask & DC_REPLAY_MASK;
|
||||
break;
|
||||
|
|
|
@ -1495,7 +1495,9 @@ static ssize_t dp_dsc_clock_en_read(struct file *f, char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1596,7 +1598,9 @@ static ssize_t dp_dsc_clock_en_write(struct file *f, const char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1681,7 +1685,9 @@ static ssize_t dp_dsc_slice_width_read(struct file *f, char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1780,7 +1786,9 @@ static ssize_t dp_dsc_slice_width_write(struct file *f, const char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1865,7 +1873,9 @@ static ssize_t dp_dsc_slice_height_read(struct file *f, char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1964,7 +1974,9 @@ static ssize_t dp_dsc_slice_height_write(struct file *f, const char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2045,7 +2057,9 @@ static ssize_t dp_dsc_bits_per_pixel_read(struct file *f, char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2141,7 +2155,9 @@ static ssize_t dp_dsc_bits_per_pixel_write(struct file *f, const char __user *bu
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2220,7 +2236,9 @@ static ssize_t dp_dsc_pic_width_read(struct file *f, char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2276,7 +2294,9 @@ static ssize_t dp_dsc_pic_height_read(struct file *f, char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2347,7 +2367,9 @@ static ssize_t dp_dsc_chunk_size_read(struct file *f, char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2418,7 +2440,9 @@ static ssize_t dp_dsc_slice_bpg_offset_read(struct file *f, char __user *buf,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe_ctx = &aconnector->dc_link->dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe_ctx->stream &&
|
||||
pipe_ctx->stream->link == aconnector->dc_link)
|
||||
pipe_ctx->stream->link == aconnector->dc_link &&
|
||||
pipe_ctx->stream->sink &&
|
||||
pipe_ctx->stream->sink == aconnector->dc_sink)
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -2948,6 +2948,7 @@ static enum bp_result construct_integrated_info(
|
|||
result = get_integrated_info_v2_1(bp, info);
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
result = get_integrated_info_v2_2(bp, info);
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -145,6 +145,10 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base,
|
|||
*/
|
||||
clk_mgr_base->clks.zstate_support = new_clocks->zstate_support;
|
||||
if (safe_to_lower) {
|
||||
if (clk_mgr_base->clks.dtbclk_en && !new_clocks->dtbclk_en) {
|
||||
dcn315_smu_set_dtbclk(clk_mgr, false);
|
||||
clk_mgr_base->clks.dtbclk_en = new_clocks->dtbclk_en;
|
||||
}
|
||||
/* check that we're not already in lower */
|
||||
if (clk_mgr_base->clks.pwr_state != DCN_PWR_STATE_LOW_POWER) {
|
||||
display_count = dcn315_get_active_display_cnt_wa(dc, context);
|
||||
|
@ -160,6 +164,10 @@ static void dcn315_update_clocks(struct clk_mgr *clk_mgr_base,
|
|||
}
|
||||
}
|
||||
} else {
|
||||
if (!clk_mgr_base->clks.dtbclk_en && new_clocks->dtbclk_en) {
|
||||
dcn315_smu_set_dtbclk(clk_mgr, true);
|
||||
clk_mgr_base->clks.dtbclk_en = new_clocks->dtbclk_en;
|
||||
}
|
||||
/* check that we're not already in D0 */
|
||||
if (clk_mgr_base->clks.pwr_state != DCN_PWR_STATE_MISSION_MODE) {
|
||||
union display_idle_optimization_u idle_info = { 0 };
|
||||
|
|
|
@ -712,8 +712,12 @@ static void dcn32_update_clocks(struct clk_mgr *clk_mgr_base,
|
|||
* since we calculate mode support based on softmax being the max UCLK
|
||||
* frequency.
|
||||
*/
|
||||
dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK,
|
||||
dc->clk_mgr->bw_params->dc_mode_softmax_memclk);
|
||||
if (dc->debug.disable_dc_mode_overwrite) {
|
||||
dcn30_smu_set_hard_max_by_freq(clk_mgr, PPCLK_UCLK, dc->clk_mgr->bw_params->max_memclk_mhz);
|
||||
dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, dc->clk_mgr->bw_params->max_memclk_mhz);
|
||||
} else
|
||||
dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK,
|
||||
dc->clk_mgr->bw_params->dc_mode_softmax_memclk);
|
||||
} else {
|
||||
dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, dc->clk_mgr->bw_params->max_memclk_mhz);
|
||||
}
|
||||
|
@ -746,8 +750,13 @@ static void dcn32_update_clocks(struct clk_mgr *clk_mgr_base,
|
|||
/* set UCLK to requested value if P-State switching is supported, or to re-enable P-State switching */
|
||||
if (clk_mgr_base->clks.p_state_change_support &&
|
||||
(update_uclk || !clk_mgr_base->clks.prev_p_state_change_support) &&
|
||||
!dc->work_arounds.clock_update_disable_mask.uclk)
|
||||
!dc->work_arounds.clock_update_disable_mask.uclk) {
|
||||
if (dc->clk_mgr->dc_mode_softmax_enabled && dc->debug.disable_dc_mode_overwrite)
|
||||
dcn30_smu_set_hard_max_by_freq(clk_mgr, PPCLK_UCLK,
|
||||
max((int)dc->clk_mgr->bw_params->dc_mode_softmax_memclk, khz_to_mhz_ceil(clk_mgr_base->clks.dramclk_khz)));
|
||||
|
||||
dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, khz_to_mhz_ceil(clk_mgr_base->clks.dramclk_khz));
|
||||
}
|
||||
|
||||
if (clk_mgr_base->clks.num_ways != new_clocks->num_ways &&
|
||||
clk_mgr_base->clks.num_ways > new_clocks->num_ways) {
|
||||
|
|
|
@ -1801,6 +1801,9 @@ bool dc_validate_boot_timing(const struct dc *dc,
|
|||
return false;
|
||||
}
|
||||
|
||||
if (link->dpcd_caps.channel_coding_cap.bits.DP_128b_132b_SUPPORTED)
|
||||
return false;
|
||||
|
||||
if (dc->link_srv->edp_is_ilr_optimization_required(link, crtc_timing)) {
|
||||
DC_LOG_EVENT_LINK_TRAINING("Seamless boot disabled to optimize eDP link rate\n");
|
||||
return false;
|
||||
|
|
|
@ -395,6 +395,12 @@ void dcn31_hpo_dp_link_enc_set_throttled_vcp_size(
|
|||
x),
|
||||
25));
|
||||
|
||||
// If y rounds up to integer, carry it over to x.
|
||||
if (y >> 25) {
|
||||
x += 1;
|
||||
y = 0;
|
||||
}
|
||||
|
||||
switch (stream_encoder_inst) {
|
||||
case 0:
|
||||
REG_SET_2(DP_DPHY_SYM32_VC_RATE_CNTL0, 0,
|
||||
|
|
|
@ -291,6 +291,7 @@ static struct _vcs_dpi_soc_bounding_box_st dcn3_15_soc = {
|
|||
.do_urgent_latency_adjustment = false,
|
||||
.urgent_latency_adjustment_fabric_clock_component_us = 0,
|
||||
.urgent_latency_adjustment_fabric_clock_reference_mhz = 0,
|
||||
.dispclk_dppclk_vco_speed_mhz = 2400.0,
|
||||
.num_chans = 4,
|
||||
.dummy_pstate_latency_us = 10.0
|
||||
};
|
||||
|
@ -438,6 +439,7 @@ static struct _vcs_dpi_soc_bounding_box_st dcn3_16_soc = {
|
|||
.do_urgent_latency_adjustment = false,
|
||||
.urgent_latency_adjustment_fabric_clock_component_us = 0,
|
||||
.urgent_latency_adjustment_fabric_clock_reference_mhz = 0,
|
||||
.dispclk_dppclk_vco_speed_mhz = 2500.0,
|
||||
};
|
||||
|
||||
void dcn31_zero_pipe_dcc_fraction(display_e2e_pipe_params_st *pipes,
|
||||
|
|
|
@ -270,7 +270,7 @@ static void set_usb4_req_bw_req(struct dc_link *link, int req_bw)
|
|||
|
||||
/* Error check whether requested and allocated are equal */
|
||||
req_bw = requested_bw * (Kbps_TO_Gbps / link->dpia_bw_alloc_config.bw_granularity);
|
||||
if (req_bw == link->dpia_bw_alloc_config.allocated_bw) {
|
||||
if (req_bw && (req_bw == link->dpia_bw_alloc_config.allocated_bw)) {
|
||||
DC_LOG_ERROR("%s: Request bw equals to allocated bw for link(%d)\n",
|
||||
__func__, link->link_index);
|
||||
}
|
||||
|
@ -341,6 +341,14 @@ bool link_dp_dpia_set_dptx_usb4_bw_alloc_support(struct dc_link *link)
|
|||
ret = true;
|
||||
init_usb4_bw_struct(link);
|
||||
link->dpia_bw_alloc_config.bw_alloc_enabled = true;
|
||||
|
||||
/*
|
||||
* During DP tunnel creation, CM preallocates BW and reduces estimated BW of other
|
||||
* DPIA. CM release preallocation only when allocation is complete. Do zero alloc
|
||||
* to make the CM to release preallocation and update estimated BW correctly for
|
||||
* all DPIAs per host router
|
||||
*/
|
||||
link_dp_dpia_allocate_usb4_bandwidth_for_stream(link, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2449,6 +2449,7 @@ static bool dcn20_resource_construct(
|
|||
dc->caps.post_blend_color_processing = true;
|
||||
dc->caps.force_dp_tps4_for_cp2520 = true;
|
||||
dc->caps.extended_aux_timeout_support = true;
|
||||
dc->caps.dmcub_support = true;
|
||||
|
||||
/* Color pipeline capabilities */
|
||||
dc->caps.color.dpp.dcn_arch = 1;
|
||||
|
|
|
@ -7,13 +7,14 @@
|
|||
#include "pvr_rogue_mips.h"
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <linux/math.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/* Forward declaration from pvr_gem.h. */
|
||||
struct pvr_gem_object;
|
||||
|
||||
#define PVR_MIPS_PT_PAGE_COUNT ((ROGUE_MIPSFW_MAX_NUM_PAGETABLE_PAGES * ROGUE_MIPSFW_PAGE_SIZE_4K) \
|
||||
>> PAGE_SHIFT)
|
||||
#define PVR_MIPS_PT_PAGE_COUNT DIV_ROUND_UP(ROGUE_MIPSFW_MAX_NUM_PAGETABLE_PAGES * ROGUE_MIPSFW_PAGE_SIZE_4K, PAGE_SIZE)
|
||||
|
||||
/**
|
||||
* struct pvr_fw_mips_data - MIPS-specific data
|
||||
*/
|
||||
|
|
|
@ -15,7 +15,9 @@ struct nvkm_gsp_mem {
|
|||
};
|
||||
|
||||
struct nvkm_gsp_radix3 {
|
||||
struct nvkm_gsp_mem mem[3];
|
||||
struct nvkm_gsp_mem lvl0;
|
||||
struct nvkm_gsp_mem lvl1;
|
||||
struct sg_table lvl2;
|
||||
};
|
||||
|
||||
int nvkm_gsp_sg(struct nvkm_device *, u64 size, struct sg_table *);
|
||||
|
|
|
@ -205,7 +205,9 @@ nvkm_firmware_dtor(struct nvkm_firmware *fw)
|
|||
break;
|
||||
case NVKM_FIRMWARE_IMG_DMA:
|
||||
nvkm_memory_unref(&memory);
|
||||
dma_free_coherent(fw->device->dev, sg_dma_len(&fw->mem.sgl), fw->img, fw->phys);
|
||||
dma_unmap_single(fw->device->dev, fw->phys, sg_dma_len(&fw->mem.sgl),
|
||||
DMA_TO_DEVICE);
|
||||
kfree(fw->img);
|
||||
break;
|
||||
case NVKM_FIRMWARE_IMG_SGT:
|
||||
nvkm_memory_unref(&memory);
|
||||
|
@ -235,14 +237,17 @@ nvkm_firmware_ctor(const struct nvkm_firmware_func *func, const char *name,
|
|||
fw->img = kmemdup(src, fw->len, GFP_KERNEL);
|
||||
break;
|
||||
case NVKM_FIRMWARE_IMG_DMA: {
|
||||
dma_addr_t addr;
|
||||
|
||||
len = ALIGN(fw->len, PAGE_SIZE);
|
||||
|
||||
fw->img = dma_alloc_coherent(fw->device->dev, len, &addr, GFP_KERNEL);
|
||||
if (fw->img) {
|
||||
memcpy(fw->img, src, fw->len);
|
||||
fw->phys = addr;
|
||||
fw->img = kmalloc(len, GFP_KERNEL);
|
||||
if (!fw->img)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy(fw->img, src, fw->len);
|
||||
fw->phys = dma_map_single(fw->device->dev, fw->img, len, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(fw->device->dev, fw->phys)) {
|
||||
kfree(fw->img);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
sg_init_one(&fw->mem.sgl, fw->img, len);
|
||||
|
|
|
@ -1624,7 +1624,7 @@ r535_gsp_wpr_meta_init(struct nvkm_gsp *gsp)
|
|||
meta->magic = GSP_FW_WPR_META_MAGIC;
|
||||
meta->revision = GSP_FW_WPR_META_REVISION;
|
||||
|
||||
meta->sysmemAddrOfRadix3Elf = gsp->radix3.mem[0].addr;
|
||||
meta->sysmemAddrOfRadix3Elf = gsp->radix3.lvl0.addr;
|
||||
meta->sizeOfRadix3Elf = gsp->fb.wpr2.elf.size;
|
||||
|
||||
meta->sysmemAddrOfBootloader = gsp->boot.fw.addr;
|
||||
|
@ -1919,8 +1919,9 @@ nvkm_gsp_sg(struct nvkm_device *device, u64 size, struct sg_table *sgt)
|
|||
static void
|
||||
nvkm_gsp_radix3_dtor(struct nvkm_gsp *gsp, struct nvkm_gsp_radix3 *rx3)
|
||||
{
|
||||
for (int i = ARRAY_SIZE(rx3->mem) - 1; i >= 0; i--)
|
||||
nvkm_gsp_mem_dtor(gsp, &rx3->mem[i]);
|
||||
nvkm_gsp_sg_free(gsp->subdev.device, &rx3->lvl2);
|
||||
nvkm_gsp_mem_dtor(gsp, &rx3->lvl1);
|
||||
nvkm_gsp_mem_dtor(gsp, &rx3->lvl0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1960,36 +1961,60 @@ static int
|
|||
nvkm_gsp_radix3_sg(struct nvkm_gsp *gsp, struct sg_table *sgt, u64 size,
|
||||
struct nvkm_gsp_radix3 *rx3)
|
||||
{
|
||||
u64 addr;
|
||||
struct sg_dma_page_iter sg_dma_iter;
|
||||
struct scatterlist *sg;
|
||||
size_t bufsize;
|
||||
u64 *pte;
|
||||
int ret, i, page_idx = 0;
|
||||
|
||||
for (int i = ARRAY_SIZE(rx3->mem) - 1; i >= 0; i--) {
|
||||
u64 *ptes;
|
||||
size_t bufsize;
|
||||
int ret, idx;
|
||||
ret = nvkm_gsp_mem_ctor(gsp, GSP_PAGE_SIZE, &rx3->lvl0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
bufsize = ALIGN((size / GSP_PAGE_SIZE) * sizeof(u64), GSP_PAGE_SIZE);
|
||||
ret = nvkm_gsp_mem_ctor(gsp, bufsize, &rx3->mem[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = nvkm_gsp_mem_ctor(gsp, GSP_PAGE_SIZE, &rx3->lvl1);
|
||||
if (ret)
|
||||
goto lvl1_fail;
|
||||
|
||||
ptes = rx3->mem[i].data;
|
||||
if (i == 2) {
|
||||
struct scatterlist *sgl;
|
||||
// Allocate level 2
|
||||
bufsize = ALIGN((size / GSP_PAGE_SIZE) * sizeof(u64), GSP_PAGE_SIZE);
|
||||
ret = nvkm_gsp_sg(gsp->subdev.device, bufsize, &rx3->lvl2);
|
||||
if (ret)
|
||||
goto lvl2_fail;
|
||||
|
||||
for_each_sgtable_dma_sg(sgt, sgl, idx) {
|
||||
for (int j = 0; j < sg_dma_len(sgl) / GSP_PAGE_SIZE; j++)
|
||||
*ptes++ = sg_dma_address(sgl) + (GSP_PAGE_SIZE * j);
|
||||
}
|
||||
} else {
|
||||
for (int j = 0; j < size / GSP_PAGE_SIZE; j++)
|
||||
*ptes++ = addr + GSP_PAGE_SIZE * j;
|
||||
// Write the bus address of level 1 to level 0
|
||||
pte = rx3->lvl0.data;
|
||||
*pte = rx3->lvl1.addr;
|
||||
|
||||
// Write the bus address of each page in level 2 to level 1
|
||||
pte = rx3->lvl1.data;
|
||||
for_each_sgtable_dma_page(&rx3->lvl2, &sg_dma_iter, 0)
|
||||
*pte++ = sg_page_iter_dma_address(&sg_dma_iter);
|
||||
|
||||
// Finally, write the bus address of each page in sgt to level 2
|
||||
for_each_sgtable_sg(&rx3->lvl2, sg, i) {
|
||||
void *sgl_end;
|
||||
|
||||
pte = sg_virt(sg);
|
||||
sgl_end = (void *)pte + sg->length;
|
||||
|
||||
for_each_sgtable_dma_page(sgt, &sg_dma_iter, page_idx) {
|
||||
*pte++ = sg_page_iter_dma_address(&sg_dma_iter);
|
||||
page_idx++;
|
||||
|
||||
// Go to the next scatterlist for level 2 if we've reached the end
|
||||
if ((void *)pte >= sgl_end)
|
||||
break;
|
||||
}
|
||||
|
||||
size = rx3->mem[i].size;
|
||||
addr = rx3->mem[i].addr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (ret) {
|
||||
lvl2_fail:
|
||||
nvkm_gsp_mem_dtor(gsp, &rx3->lvl1);
|
||||
lvl1_fail:
|
||||
nvkm_gsp_mem_dtor(gsp, &rx3->lvl0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -2021,7 +2046,7 @@ r535_gsp_fini(struct nvkm_gsp *gsp, bool suspend)
|
|||
sr = gsp->sr.meta.data;
|
||||
sr->magic = GSP_FW_SR_META_MAGIC;
|
||||
sr->revision = GSP_FW_SR_META_REVISION;
|
||||
sr->sysmemAddrOfSuspendResumeData = gsp->sr.radix3.mem[0].addr;
|
||||
sr->sysmemAddrOfSuspendResumeData = gsp->sr.radix3.lvl0.addr;
|
||||
sr->sizeOfSuspendResumeData = len;
|
||||
|
||||
mbox0 = lower_32_bits(gsp->sr.meta.addr);
|
||||
|
|
|
@ -177,7 +177,7 @@ config DRM_PANEL_ILITEK_IL9322
|
|||
|
||||
config DRM_PANEL_ILITEK_ILI9341
|
||||
tristate "Ilitek ILI9341 240x320 QVGA panels"
|
||||
depends on OF && SPI
|
||||
depends on SPI
|
||||
select DRM_KMS_HELPER
|
||||
select DRM_GEM_DMA_HELPER
|
||||
depends on BACKLIGHT_CLASS_DEVICE
|
||||
|
|
|
@ -22,8 +22,9 @@
|
|||
#include <linux/bitops.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
|
@ -421,7 +422,7 @@ static int ili9341_dpi_prepare(struct drm_panel *panel)
|
|||
|
||||
ili9341_dpi_init(ili);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ili9341_dpi_enable(struct drm_panel *panel)
|
||||
|
@ -691,7 +692,7 @@ static int ili9341_dpi_probe(struct spi_device *spi, struct gpio_desc *dc,
|
|||
* Every new incarnation of this display must have a unique
|
||||
* data entry for the system in this driver.
|
||||
*/
|
||||
ili->conf = of_device_get_match_data(dev);
|
||||
ili->conf = device_get_match_data(dev);
|
||||
if (!ili->conf) {
|
||||
dev_err(dev, "missing device configuration\n");
|
||||
return -ENODEV;
|
||||
|
@ -714,18 +715,18 @@ static int ili9341_probe(struct spi_device *spi)
|
|||
|
||||
reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(reset))
|
||||
dev_err(dev, "Failed to get gpio 'reset'\n");
|
||||
return dev_err_probe(dev, PTR_ERR(reset), "Failed to get gpio 'reset'\n");
|
||||
|
||||
dc = devm_gpiod_get_optional(dev, "dc", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(dc))
|
||||
dev_err(dev, "Failed to get gpio 'dc'\n");
|
||||
return dev_err_probe(dev, PTR_ERR(dc), "Failed to get gpio 'dc'\n");
|
||||
|
||||
if (!strcmp(id->name, "sf-tc240t-9370-t"))
|
||||
return ili9341_dpi_probe(spi, dc, reset);
|
||||
else if (!strcmp(id->name, "yx240qv29"))
|
||||
return ili9341_dbi_probe(spi, dc, reset);
|
||||
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static void ili9341_remove(struct spi_device *spi)
|
||||
|
|
|
@ -58,56 +58,16 @@ static long qxl_fence_wait(struct dma_fence *fence, bool intr,
|
|||
signed long timeout)
|
||||
{
|
||||
struct qxl_device *qdev;
|
||||
struct qxl_release *release;
|
||||
int count = 0, sc = 0;
|
||||
bool have_drawable_releases;
|
||||
unsigned long cur, end = jiffies + timeout;
|
||||
|
||||
qdev = container_of(fence->lock, struct qxl_device, release_lock);
|
||||
release = container_of(fence, struct qxl_release, base);
|
||||
have_drawable_releases = release->type == QXL_RELEASE_DRAWABLE;
|
||||
|
||||
retry:
|
||||
sc++;
|
||||
if (!wait_event_timeout(qdev->release_event,
|
||||
(dma_fence_is_signaled(fence) ||
|
||||
(qxl_io_notify_oom(qdev), 0)),
|
||||
timeout))
|
||||
return 0;
|
||||
|
||||
if (dma_fence_is_signaled(fence))
|
||||
goto signaled;
|
||||
|
||||
qxl_io_notify_oom(qdev);
|
||||
|
||||
for (count = 0; count < 11; count++) {
|
||||
if (!qxl_queue_garbage_collect(qdev, true))
|
||||
break;
|
||||
|
||||
if (dma_fence_is_signaled(fence))
|
||||
goto signaled;
|
||||
}
|
||||
|
||||
if (dma_fence_is_signaled(fence))
|
||||
goto signaled;
|
||||
|
||||
if (have_drawable_releases || sc < 4) {
|
||||
if (sc > 2)
|
||||
/* back off */
|
||||
usleep_range(500, 1000);
|
||||
|
||||
if (time_after(jiffies, end))
|
||||
return 0;
|
||||
|
||||
if (have_drawable_releases && sc > 300) {
|
||||
DMA_FENCE_WARN(fence,
|
||||
"failed to wait on release %llu after spincount %d\n",
|
||||
fence->context & ~0xf0000000, sc);
|
||||
goto signaled;
|
||||
}
|
||||
goto retry;
|
||||
}
|
||||
/*
|
||||
* yeah, original sync_obj_wait gave up after 3 spins when
|
||||
* have_drawable_releases is not set.
|
||||
*/
|
||||
|
||||
signaled:
|
||||
cur = jiffies;
|
||||
if (time_after(cur, end))
|
||||
return 0;
|
||||
|
|
|
@ -92,7 +92,7 @@ int ttm_tt_create(struct ttm_buffer_object *bo, bool zero_alloc)
|
|||
*/
|
||||
if (bdev->pool.use_dma_alloc && cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT)) {
|
||||
page_flags |= TTM_TT_FLAG_DECRYPTED;
|
||||
drm_info(ddev, "TT memory decryption enabled.");
|
||||
drm_info_once(ddev, "TT memory decryption enabled.");
|
||||
}
|
||||
|
||||
bo->ttm = bdev->funcs->ttm_tt_create(bo, page_flags);
|
||||
|
|
|
@ -204,6 +204,7 @@ int vmw_bo_pin_in_start_of_vram(struct vmw_private *dev_priv,
|
|||
VMW_BO_DOMAIN_VRAM,
|
||||
VMW_BO_DOMAIN_VRAM);
|
||||
buf->places[0].lpfn = PFN_UP(bo->resource->size);
|
||||
buf->busy_places[0].lpfn = PFN_UP(bo->resource->size);
|
||||
ret = ttm_bo_validate(bo, &buf->placement, &ctx);
|
||||
|
||||
/* For some reason we didn't end up at the start of vram */
|
||||
|
|
|
@ -991,7 +991,7 @@ static int vmw_event_fence_action_create(struct drm_file *file_priv,
|
|||
}
|
||||
|
||||
event->event.base.type = DRM_VMW_EVENT_FENCE_SIGNALED;
|
||||
event->event.base.length = sizeof(*event);
|
||||
event->event.base.length = sizeof(event->event);
|
||||
event->event.user_data = user_data;
|
||||
|
||||
ret = drm_event_reserve_init(dev, file_priv, &event->base, &event->event.base);
|
||||
|
|
|
@ -84,7 +84,8 @@ static inline struct drm_i915_private *kdev_to_i915(struct device *kdev)
|
|||
#define IS_ROCKETLAKE(dev_priv) IS_PLATFORM(dev_priv, XE_ROCKETLAKE)
|
||||
#define IS_DG1(dev_priv) IS_PLATFORM(dev_priv, XE_DG1)
|
||||
#define IS_ALDERLAKE_S(dev_priv) IS_PLATFORM(dev_priv, XE_ALDERLAKE_S)
|
||||
#define IS_ALDERLAKE_P(dev_priv) IS_PLATFORM(dev_priv, XE_ALDERLAKE_P)
|
||||
#define IS_ALDERLAKE_P(dev_priv) (IS_PLATFORM(dev_priv, XE_ALDERLAKE_P) || \
|
||||
IS_PLATFORM(dev_priv, XE_ALDERLAKE_N))
|
||||
#define IS_XEHPSDV(dev_priv) (dev_priv && 0)
|
||||
#define IS_DG2(dev_priv) IS_PLATFORM(dev_priv, XE_DG2)
|
||||
#define IS_PONTEVECCHIO(dev_priv) IS_PLATFORM(dev_priv, XE_PVC)
|
||||
|
|
|
@ -1606,6 +1606,9 @@ static void vm_destroy_work_func(struct work_struct *w)
|
|||
/* xe_vm_close_and_put was not called? */
|
||||
xe_assert(xe, !vm->size);
|
||||
|
||||
if (xe_vm_in_preempt_fence_mode(vm))
|
||||
flush_work(&vm->preempt.rebind_work);
|
||||
|
||||
mutex_destroy(&vm->snap_mutex);
|
||||
|
||||
if (!(vm->flags & XE_VM_FLAG_MIGRATION))
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
* Copyright (c) 2014, Intel Corporation.
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/iio/iio.h>
|
||||
|
@ -27,11 +28,16 @@
|
|||
#define MXC4005_REG_ZOUT_UPPER 0x07
|
||||
#define MXC4005_REG_ZOUT_LOWER 0x08
|
||||
|
||||
#define MXC4005_REG_INT_MASK0 0x0A
|
||||
|
||||
#define MXC4005_REG_INT_MASK1 0x0B
|
||||
#define MXC4005_REG_INT_MASK1_BIT_DRDYE 0x01
|
||||
|
||||
#define MXC4005_REG_INT_CLR0 0x00
|
||||
|
||||
#define MXC4005_REG_INT_CLR1 0x01
|
||||
#define MXC4005_REG_INT_CLR1_BIT_DRDYC 0x01
|
||||
#define MXC4005_REG_INT_CLR1_SW_RST 0x10
|
||||
|
||||
#define MXC4005_REG_CONTROL 0x0D
|
||||
#define MXC4005_REG_CONTROL_MASK_FSR GENMASK(6, 5)
|
||||
|
@ -39,6 +45,9 @@
|
|||
|
||||
#define MXC4005_REG_DEVICE_ID 0x0E
|
||||
|
||||
/* Datasheet does not specify a reset time, this is a conservative guess */
|
||||
#define MXC4005_RESET_TIME_US 2000
|
||||
|
||||
enum mxc4005_axis {
|
||||
AXIS_X,
|
||||
AXIS_Y,
|
||||
|
@ -62,6 +71,8 @@ struct mxc4005_data {
|
|||
s64 timestamp __aligned(8);
|
||||
} scan;
|
||||
bool trigger_enabled;
|
||||
unsigned int control;
|
||||
unsigned int int_mask1;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -113,7 +124,9 @@ static bool mxc4005_is_readable_reg(struct device *dev, unsigned int reg)
|
|||
static bool mxc4005_is_writeable_reg(struct device *dev, unsigned int reg)
|
||||
{
|
||||
switch (reg) {
|
||||
case MXC4005_REG_INT_CLR0:
|
||||
case MXC4005_REG_INT_CLR1:
|
||||
case MXC4005_REG_INT_MASK0:
|
||||
case MXC4005_REG_INT_MASK1:
|
||||
case MXC4005_REG_CONTROL:
|
||||
return true;
|
||||
|
@ -330,23 +343,20 @@ static int mxc4005_set_trigger_state(struct iio_trigger *trig,
|
|||
{
|
||||
struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
|
||||
struct mxc4005_data *data = iio_priv(indio_dev);
|
||||
unsigned int val;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&data->mutex);
|
||||
if (state) {
|
||||
ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1,
|
||||
MXC4005_REG_INT_MASK1_BIT_DRDYE);
|
||||
} else {
|
||||
ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1,
|
||||
~MXC4005_REG_INT_MASK1_BIT_DRDYE);
|
||||
}
|
||||
|
||||
val = state ? MXC4005_REG_INT_MASK1_BIT_DRDYE : 0;
|
||||
ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1, val);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&data->mutex);
|
||||
dev_err(data->dev, "failed to update reg_int_mask1");
|
||||
return ret;
|
||||
}
|
||||
|
||||
data->int_mask1 = val;
|
||||
data->trigger_enabled = state;
|
||||
mutex_unlock(&data->mutex);
|
||||
|
||||
|
@ -382,6 +392,21 @@ static int mxc4005_chip_init(struct mxc4005_data *data)
|
|||
|
||||
dev_dbg(data->dev, "MXC4005 chip id %02x\n", reg);
|
||||
|
||||
ret = regmap_write(data->regmap, MXC4005_REG_INT_CLR1,
|
||||
MXC4005_REG_INT_CLR1_SW_RST);
|
||||
if (ret < 0)
|
||||
return dev_err_probe(data->dev, ret, "resetting chip\n");
|
||||
|
||||
fsleep(MXC4005_RESET_TIME_US);
|
||||
|
||||
ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK0, 0);
|
||||
if (ret < 0)
|
||||
return dev_err_probe(data->dev, ret, "writing INT_MASK0\n");
|
||||
|
||||
ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1, 0);
|
||||
if (ret < 0)
|
||||
return dev_err_probe(data->dev, ret, "writing INT_MASK1\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -469,6 +494,58 @@ static int mxc4005_probe(struct i2c_client *client)
|
|||
return devm_iio_device_register(&client->dev, indio_dev);
|
||||
}
|
||||
|
||||
static int mxc4005_suspend(struct device *dev)
|
||||
{
|
||||
struct iio_dev *indio_dev = dev_get_drvdata(dev);
|
||||
struct mxc4005_data *data = iio_priv(indio_dev);
|
||||
int ret;
|
||||
|
||||
/* Save control to restore it on resume */
|
||||
ret = regmap_read(data->regmap, MXC4005_REG_CONTROL, &data->control);
|
||||
if (ret < 0)
|
||||
dev_err(data->dev, "failed to read reg_control\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mxc4005_resume(struct device *dev)
|
||||
{
|
||||
struct iio_dev *indio_dev = dev_get_drvdata(dev);
|
||||
struct mxc4005_data *data = iio_priv(indio_dev);
|
||||
int ret;
|
||||
|
||||
ret = regmap_write(data->regmap, MXC4005_REG_INT_CLR1,
|
||||
MXC4005_REG_INT_CLR1_SW_RST);
|
||||
if (ret) {
|
||||
dev_err(data->dev, "failed to reset chip: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
fsleep(MXC4005_RESET_TIME_US);
|
||||
|
||||
ret = regmap_write(data->regmap, MXC4005_REG_CONTROL, data->control);
|
||||
if (ret) {
|
||||
dev_err(data->dev, "failed to restore control register\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK0, 0);
|
||||
if (ret) {
|
||||
dev_err(data->dev, "failed to restore interrupt 0 mask\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = regmap_write(data->regmap, MXC4005_REG_INT_MASK1, data->int_mask1);
|
||||
if (ret) {
|
||||
dev_err(data->dev, "failed to restore interrupt 1 mask\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static DEFINE_SIMPLE_DEV_PM_OPS(mxc4005_pm_ops, mxc4005_suspend, mxc4005_resume);
|
||||
|
||||
static const struct acpi_device_id mxc4005_acpi_match[] = {
|
||||
{"MXC4005", 0},
|
||||
{"MXC6655", 0},
|
||||
|
@ -496,6 +573,7 @@ static struct i2c_driver mxc4005_driver = {
|
|||
.name = MXC4005_DRV_NAME,
|
||||
.acpi_match_table = mxc4005_acpi_match,
|
||||
.of_match_table = mxc4005_of_match,
|
||||
.pm = pm_sleep_ptr(&mxc4005_pm_ops),
|
||||
},
|
||||
.probe = mxc4005_probe,
|
||||
.id_table = mxc4005_id,
|
||||
|
|
|
@ -1289,6 +1289,7 @@ static int adis16475_config_sync_mode(struct adis16475 *st)
|
|||
struct device *dev = &st->adis.spi->dev;
|
||||
const struct adis16475_sync *sync;
|
||||
u32 sync_mode;
|
||||
u16 val;
|
||||
|
||||
/* default to internal clk */
|
||||
st->clk_freq = st->info->int_clk * 1000;
|
||||
|
@ -1350,8 +1351,9 @@ static int adis16475_config_sync_mode(struct adis16475 *st)
|
|||
* I'm keeping this for simplicity and avoiding extra variables
|
||||
* in chip_info.
|
||||
*/
|
||||
val = ADIS16475_SYNC_MODE(sync->sync_mode);
|
||||
ret = __adis_update_bits(&st->adis, ADIS16475_REG_MSG_CTRL,
|
||||
ADIS16475_SYNC_MODE_MASK, sync->sync_mode);
|
||||
ADIS16475_SYNC_MODE_MASK, val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -1233,6 +1233,7 @@ const struct bmp280_chip_info bmp380_chip_info = {
|
|||
.chip_id = bmp380_chip_ids,
|
||||
.num_chip_id = ARRAY_SIZE(bmp380_chip_ids),
|
||||
.regmap_config = &bmp380_regmap_config,
|
||||
.spi_read_extra_byte = true,
|
||||
.start_up_time = 2000,
|
||||
.channels = bmp380_channels,
|
||||
.num_channels = 2,
|
||||
|
|
|
@ -96,15 +96,10 @@ static int bmp280_spi_probe(struct spi_device *spi)
|
|||
|
||||
chip_info = spi_get_device_match_data(spi);
|
||||
|
||||
switch (chip_info->chip_id[0]) {
|
||||
case BMP380_CHIP_ID:
|
||||
case BMP390_CHIP_ID:
|
||||
if (chip_info->spi_read_extra_byte)
|
||||
bmp_regmap_bus = &bmp380_regmap_bus;
|
||||
break;
|
||||
default:
|
||||
else
|
||||
bmp_regmap_bus = &bmp280_regmap_bus;
|
||||
break;
|
||||
}
|
||||
|
||||
regmap = devm_regmap_init(&spi->dev,
|
||||
bmp_regmap_bus,
|
||||
|
@ -127,7 +122,7 @@ static const struct of_device_id bmp280_of_spi_match[] = {
|
|||
{ .compatible = "bosch,bmp180", .data = &bmp180_chip_info },
|
||||
{ .compatible = "bosch,bmp181", .data = &bmp180_chip_info },
|
||||
{ .compatible = "bosch,bmp280", .data = &bmp280_chip_info },
|
||||
{ .compatible = "bosch,bme280", .data = &bmp280_chip_info },
|
||||
{ .compatible = "bosch,bme280", .data = &bme280_chip_info },
|
||||
{ .compatible = "bosch,bmp380", .data = &bmp380_chip_info },
|
||||
{ .compatible = "bosch,bmp580", .data = &bmp580_chip_info },
|
||||
{ },
|
||||
|
@ -139,7 +134,7 @@ static const struct spi_device_id bmp280_spi_id[] = {
|
|||
{ "bmp180", (kernel_ulong_t)&bmp180_chip_info },
|
||||
{ "bmp181", (kernel_ulong_t)&bmp180_chip_info },
|
||||
{ "bmp280", (kernel_ulong_t)&bmp280_chip_info },
|
||||
{ "bme280", (kernel_ulong_t)&bmp280_chip_info },
|
||||
{ "bme280", (kernel_ulong_t)&bme280_chip_info },
|
||||
{ "bmp380", (kernel_ulong_t)&bmp380_chip_info },
|
||||
{ "bmp580", (kernel_ulong_t)&bmp580_chip_info },
|
||||
{ }
|
||||
|
|
|
@ -423,6 +423,7 @@ struct bmp280_chip_info {
|
|||
int num_chip_id;
|
||||
|
||||
const struct regmap_config *regmap_config;
|
||||
bool spi_read_extra_byte;
|
||||
|
||||
const struct iio_chan_spec *channels;
|
||||
int num_channels;
|
||||
|
|
|
@ -439,6 +439,7 @@ static int remove_device_files(struct super_block *sb,
|
|||
return PTR_ERR(dir);
|
||||
}
|
||||
simple_recursive_removal(dir, NULL);
|
||||
dput(dir);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -208,6 +208,7 @@ static const struct xpad_device {
|
|||
{ 0x0738, 0xcb29, "Saitek Aviator Stick AV8R02", 0, XTYPE_XBOX360 },
|
||||
{ 0x0738, 0xf738, "Super SFIV FightStick TE S", 0, XTYPE_XBOX360 },
|
||||
{ 0x07ff, 0xffff, "Mad Catz GamePad", 0, XTYPE_XBOX360 },
|
||||
{ 0x0b05, 0x1a38, "ASUS ROG RAIKIRI", 0, XTYPE_XBOXONE },
|
||||
{ 0x0c12, 0x0005, "Intec wireless", 0, XTYPE_XBOX },
|
||||
{ 0x0c12, 0x8801, "Nyko Xbox Controller", 0, XTYPE_XBOX },
|
||||
{ 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX },
|
||||
|
@ -487,6 +488,7 @@ static const struct usb_device_id xpad_table[] = {
|
|||
{ USB_DEVICE(0x0738, 0x4540) }, /* Mad Catz Beat Pad */
|
||||
XPAD_XBOXONE_VENDOR(0x0738), /* Mad Catz FightStick TE 2 */
|
||||
XPAD_XBOX360_VENDOR(0x07ff), /* Mad Catz Gamepad */
|
||||
XPAD_XBOXONE_VENDOR(0x0b05), /* ASUS controllers */
|
||||
XPAD_XBOX360_VENDOR(0x0c12), /* Zeroplus X-Box 360 controllers */
|
||||
XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f Xbox 360 controllers */
|
||||
XPAD_XBOXONE_VENDOR(0x0e6f), /* 0x0e6f Xbox One controllers */
|
||||
|
|
|
@ -132,7 +132,13 @@ static void __exit amimouse_remove(struct platform_device *pdev)
|
|||
input_unregister_device(dev);
|
||||
}
|
||||
|
||||
static struct platform_driver amimouse_driver = {
|
||||
/*
|
||||
* amimouse_remove() lives in .exit.text. For drivers registered via
|
||||
* module_platform_driver_probe() this is ok because they cannot get unbound at
|
||||
* runtime. So mark the driver struct with __refdata to prevent modpost
|
||||
* triggering a section mismatch warning.
|
||||
*/
|
||||
static struct platform_driver amimouse_driver __refdata = {
|
||||
.remove_new = __exit_p(amimouse_remove),
|
||||
.driver = {
|
||||
.name = "amiga-mouse",
|
||||
|
|
|
@ -115,6 +115,8 @@
|
|||
#define MEI_DEV_ID_ARL_S 0x7F68 /* Arrow Lake Point S */
|
||||
#define MEI_DEV_ID_ARL_H 0x7770 /* Arrow Lake Point H */
|
||||
|
||||
#define MEI_DEV_ID_LNL_M 0xA870 /* Lunar Lake Point M */
|
||||
|
||||
/*
|
||||
* MEI HW Section
|
||||
*/
|
||||
|
|
|
@ -122,6 +122,8 @@ static const struct pci_device_id mei_me_pci_tbl[] = {
|
|||
{MEI_PCI_DEVICE(MEI_DEV_ID_ARL_S, MEI_ME_PCH15_CFG)},
|
||||
{MEI_PCI_DEVICE(MEI_DEV_ID_ARL_H, MEI_ME_PCH15_CFG)},
|
||||
|
||||
{MEI_PCI_DEVICE(MEI_DEV_ID_LNL_M, MEI_ME_PCH15_CFG)},
|
||||
|
||||
/* required last entry */
|
||||
{0, }
|
||||
};
|
||||
|
|
|
@ -236,8 +236,11 @@ static int mei_pxp_component_match(struct device *dev, int subcomponent,
|
|||
|
||||
pdev = to_pci_dev(dev);
|
||||
|
||||
if (pdev->class != (PCI_CLASS_DISPLAY_VGA << 8) ||
|
||||
pdev->vendor != PCI_VENDOR_ID_INTEL)
|
||||
if (pdev->vendor != PCI_VENDOR_ID_INTEL)
|
||||
return 0;
|
||||
|
||||
if (pdev->class != (PCI_CLASS_DISPLAY_VGA << 8) &&
|
||||
pdev->class != (PCI_CLASS_DISPLAY_OTHER << 8))
|
||||
return 0;
|
||||
|
||||
if (subcomponent != I915_COMPONENT_PXP)
|
||||
|
|
|
@ -44,8 +44,6 @@ static struct pci_driver pvpanic_pci_driver = {
|
|||
.name = "pvpanic-pci",
|
||||
.id_table = pvpanic_pci_id_tbl,
|
||||
.probe = pvpanic_pci_probe,
|
||||
.driver = {
|
||||
.dev_groups = pvpanic_dev_groups,
|
||||
},
|
||||
.dev_groups = pvpanic_dev_groups,
|
||||
};
|
||||
module_pci_driver(pvpanic_pci_driver);
|
||||
|
|
|
@ -637,12 +637,12 @@ static void mv88e6351_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
|
|||
MAC_1000FD;
|
||||
}
|
||||
|
||||
static int mv88e6352_get_port4_serdes_cmode(struct mv88e6xxx_chip *chip)
|
||||
static int mv88e63xx_get_port_serdes_cmode(struct mv88e6xxx_chip *chip, int port)
|
||||
{
|
||||
u16 reg, val;
|
||||
int err;
|
||||
|
||||
err = mv88e6xxx_port_read(chip, 4, MV88E6XXX_PORT_STS, ®);
|
||||
err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, ®);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -651,16 +651,16 @@ static int mv88e6352_get_port4_serdes_cmode(struct mv88e6xxx_chip *chip)
|
|||
return 0xf;
|
||||
|
||||
val = reg & ~MV88E6XXX_PORT_STS_PHY_DETECT;
|
||||
err = mv88e6xxx_port_write(chip, 4, MV88E6XXX_PORT_STS, val);
|
||||
err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, val);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mv88e6xxx_port_read(chip, 4, MV88E6XXX_PORT_STS, &val);
|
||||
err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &val);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Restore PHY_DETECT value */
|
||||
err = mv88e6xxx_port_write(chip, 4, MV88E6XXX_PORT_STS, reg);
|
||||
err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, reg);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -688,7 +688,30 @@ static void mv88e6352_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
|
|||
if (err <= 0)
|
||||
return;
|
||||
|
||||
cmode = mv88e6352_get_port4_serdes_cmode(chip);
|
||||
cmode = mv88e63xx_get_port_serdes_cmode(chip, port);
|
||||
if (cmode < 0)
|
||||
dev_err(chip->dev, "p%d: failed to read serdes cmode\n",
|
||||
port);
|
||||
else
|
||||
mv88e6xxx_translate_cmode(cmode, supported);
|
||||
}
|
||||
}
|
||||
|
||||
static void mv88e632x_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
|
||||
struct phylink_config *config)
|
||||
{
|
||||
unsigned long *supported = config->supported_interfaces;
|
||||
int cmode;
|
||||
|
||||
/* Translate the default cmode */
|
||||
mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
|
||||
|
||||
config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
|
||||
MAC_1000FD;
|
||||
|
||||
/* Port 0/1 are serdes only ports */
|
||||
if (port == 0 || port == 1) {
|
||||
cmode = mv88e63xx_get_port_serdes_cmode(chip, port);
|
||||
if (cmode < 0)
|
||||
dev_err(chip->dev, "p%d: failed to read serdes cmode\n",
|
||||
port);
|
||||
|
@ -5134,7 +5157,7 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
|
|||
.gpio_ops = &mv88e6352_gpio_ops,
|
||||
.avb_ops = &mv88e6352_avb_ops,
|
||||
.ptp_ops = &mv88e6352_ptp_ops,
|
||||
.phylink_get_caps = mv88e6185_phylink_get_caps,
|
||||
.phylink_get_caps = mv88e632x_phylink_get_caps,
|
||||
};
|
||||
|
||||
static const struct mv88e6xxx_ops mv88e6321_ops = {
|
||||
|
@ -5182,7 +5205,7 @@ static const struct mv88e6xxx_ops mv88e6321_ops = {
|
|||
.gpio_ops = &mv88e6352_gpio_ops,
|
||||
.avb_ops = &mv88e6352_avb_ops,
|
||||
.ptp_ops = &mv88e6352_ptp_ops,
|
||||
.phylink_get_caps = mv88e6185_phylink_get_caps,
|
||||
.phylink_get_caps = mv88e632x_phylink_get_caps,
|
||||
};
|
||||
|
||||
static const struct mv88e6xxx_ops mv88e6341_ops = {
|
||||
|
|
|
@ -910,7 +910,7 @@ struct hnae3_handle {
|
|||
struct hnae3_roce_private_info rinfo;
|
||||
};
|
||||
|
||||
u32 numa_node_mask; /* for multi-chip support */
|
||||
nodemask_t numa_node_mask; /* for multi-chip support */
|
||||
|
||||
enum hnae3_port_base_vlan_state port_base_vlan_state;
|
||||
|
||||
|
|
|
@ -1581,6 +1581,9 @@ static int hclge_configure(struct hclge_dev *hdev)
|
|||
cfg.default_speed, ret);
|
||||
return ret;
|
||||
}
|
||||
hdev->hw.mac.req_speed = hdev->hw.mac.speed;
|
||||
hdev->hw.mac.req_autoneg = AUTONEG_ENABLE;
|
||||
hdev->hw.mac.req_duplex = DUPLEX_FULL;
|
||||
|
||||
hclge_parse_link_mode(hdev, cfg.speed_ability);
|
||||
|
||||
|
@ -1810,7 +1813,8 @@ static int hclge_vport_setup(struct hclge_vport *vport, u16 num_tqps)
|
|||
|
||||
nic->pdev = hdev->pdev;
|
||||
nic->ae_algo = &ae_algo;
|
||||
nic->numa_node_mask = hdev->numa_node_mask;
|
||||
bitmap_copy(nic->numa_node_mask.bits, hdev->numa_node_mask.bits,
|
||||
MAX_NUMNODES);
|
||||
nic->kinfo.io_base = hdev->hw.hw.io_base;
|
||||
|
||||
ret = hclge_knic_setup(vport, num_tqps,
|
||||
|
@ -2502,7 +2506,8 @@ static int hclge_init_roce_base_info(struct hclge_vport *vport)
|
|||
|
||||
roce->pdev = nic->pdev;
|
||||
roce->ae_algo = nic->ae_algo;
|
||||
roce->numa_node_mask = nic->numa_node_mask;
|
||||
bitmap_copy(roce->numa_node_mask.bits, nic->numa_node_mask.bits,
|
||||
MAX_NUMNODES);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -3386,9 +3391,9 @@ hclge_set_phy_link_ksettings(struct hnae3_handle *handle,
|
|||
return ret;
|
||||
}
|
||||
|
||||
hdev->hw.mac.autoneg = cmd->base.autoneg;
|
||||
hdev->hw.mac.speed = cmd->base.speed;
|
||||
hdev->hw.mac.duplex = cmd->base.duplex;
|
||||
hdev->hw.mac.req_autoneg = cmd->base.autoneg;
|
||||
hdev->hw.mac.req_speed = cmd->base.speed;
|
||||
hdev->hw.mac.req_duplex = cmd->base.duplex;
|
||||
linkmode_copy(hdev->hw.mac.advertising, cmd->link_modes.advertising);
|
||||
|
||||
return 0;
|
||||
|
@ -3421,9 +3426,9 @@ static int hclge_tp_port_init(struct hclge_dev *hdev)
|
|||
if (!hnae3_dev_phy_imp_supported(hdev))
|
||||
return 0;
|
||||
|
||||
cmd.base.autoneg = hdev->hw.mac.autoneg;
|
||||
cmd.base.speed = hdev->hw.mac.speed;
|
||||
cmd.base.duplex = hdev->hw.mac.duplex;
|
||||
cmd.base.autoneg = hdev->hw.mac.req_autoneg;
|
||||
cmd.base.speed = hdev->hw.mac.req_speed;
|
||||
cmd.base.duplex = hdev->hw.mac.req_duplex;
|
||||
linkmode_copy(cmd.link_modes.advertising, hdev->hw.mac.advertising);
|
||||
|
||||
return hclge_set_phy_link_ksettings(&hdev->vport->nic, &cmd);
|
||||
|
@ -8008,8 +8013,7 @@ static void hclge_set_timer_task(struct hnae3_handle *handle, bool enable)
|
|||
/* Set the DOWN flag here to disable link updating */
|
||||
set_bit(HCLGE_STATE_DOWN, &hdev->state);
|
||||
|
||||
/* flush memory to make sure DOWN is seen by service task */
|
||||
smp_mb__before_atomic();
|
||||
smp_mb__after_atomic(); /* flush memory to make sure DOWN is seen by service task */
|
||||
hclge_flush_link_update(hdev);
|
||||
}
|
||||
}
|
||||
|
@ -9962,6 +9966,7 @@ static int hclge_set_vlan_protocol_type(struct hclge_dev *hdev)
|
|||
static int hclge_init_vlan_filter(struct hclge_dev *hdev)
|
||||
{
|
||||
struct hclge_vport *vport;
|
||||
bool enable = true;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
|
@ -9981,8 +9986,12 @@ static int hclge_init_vlan_filter(struct hclge_dev *hdev)
|
|||
vport->cur_vlan_fltr_en = true;
|
||||
}
|
||||
|
||||
if (test_bit(HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, hdev->ae_dev->caps) &&
|
||||
!test_bit(HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B, hdev->ae_dev->caps))
|
||||
enable = false;
|
||||
|
||||
return hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT,
|
||||
HCLGE_FILTER_FE_INGRESS, true, 0);
|
||||
HCLGE_FILTER_FE_INGRESS, enable, 0);
|
||||
}
|
||||
|
||||
static int hclge_init_vlan_type(struct hclge_dev *hdev)
|
||||
|
@ -11696,16 +11705,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
|||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = hclge_devlink_init(hdev);
|
||||
if (ret)
|
||||
goto err_pci_uninit;
|
||||
|
||||
devl_lock(hdev->devlink);
|
||||
|
||||
/* Firmware command queue initialize */
|
||||
ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw);
|
||||
if (ret)
|
||||
goto err_devlink_uninit;
|
||||
goto err_pci_uninit;
|
||||
|
||||
/* Firmware command initialize */
|
||||
hclge_comm_cmd_init_ops(&hdev->hw.hw, &hclge_cmq_ops);
|
||||
|
@ -11834,7 +11837,7 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
|||
|
||||
ret = hclge_update_port_info(hdev);
|
||||
if (ret)
|
||||
goto err_mdiobus_unreg;
|
||||
goto err_ptp_uninit;
|
||||
|
||||
INIT_KFIFO(hdev->mac_tnl_log);
|
||||
|
||||
|
@ -11874,6 +11877,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
|||
dev_warn(&pdev->dev,
|
||||
"failed to wake on lan init, ret = %d\n", ret);
|
||||
|
||||
ret = hclge_devlink_init(hdev);
|
||||
if (ret)
|
||||
goto err_ptp_uninit;
|
||||
|
||||
hclge_state_init(hdev);
|
||||
hdev->last_reset_time = jiffies;
|
||||
|
||||
|
@ -11881,10 +11888,10 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
|
|||
HCLGE_DRIVER_NAME);
|
||||
|
||||
hclge_task_schedule(hdev, round_jiffies_relative(HZ));
|
||||
|
||||
devl_unlock(hdev->devlink);
|
||||
return 0;
|
||||
|
||||
err_ptp_uninit:
|
||||
hclge_ptp_uninit(hdev);
|
||||
err_mdiobus_unreg:
|
||||
if (hdev->hw.mac.phydev)
|
||||
mdiobus_unregister(hdev->hw.mac.mdio_bus);
|
||||
|
@ -11894,9 +11901,6 @@ err_msi_uninit:
|
|||
pci_free_irq_vectors(pdev);
|
||||
err_cmd_uninit:
|
||||
hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw);
|
||||
err_devlink_uninit:
|
||||
devl_unlock(hdev->devlink);
|
||||
hclge_devlink_uninit(hdev);
|
||||
err_pci_uninit:
|
||||
pcim_iounmap(pdev, hdev->hw.hw.io_base);
|
||||
pci_release_regions(pdev);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue