drm/virtio: fix busid in a different way, allocate more vbufs.
drm/qxl: various bugfixes and cleanups, -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJYMzLfAAoJEEy22O7T6HE41rIQANAEl/o8cYUoyYTJlhmmnl2U K+QBdr7PACdbr8RZrGpwA5ad9ZJGijpZRd2gThrzNS0JBdZI48gPEzU7V206xlyD AriBeAu6IkoBTEl+GGx2DfvOdLR6+7KlIrDYIpl2vILgkqlHhneXdHR3R03byRHG 2Jrxv2YQxCs8swtAb8FRkVNaUgrfkKOKFFlx1LoLFApYeP02oSxZp0Ve4nuRNj7x 9DCivIw4NyQ9tY1fORapmrEPTerqZnzYdb9RFSv4xilx4Stq1UWdXfTSpwXZHZaG VroXZb1I0fZEk1aapIxuzLZFGNSM7wLET/nK02sSvzxJJv2PiyVAabIo70nUqsQK H/iGT2g4MZC1Yvz6evENtckbiA1p3F9jnd+Po9ivDY/RrTpND3hVC2WbcOXWxZkb m69muvXfrnZwoF9xWPG8aTrCATim++1Ty8/8LoKdVq1d0Dp/Gzk8KnklBPY2vRFt dpxqH3jLgED/QcO5W/yQdf0kPRsrNwKFNLqP9bCF2hMIw1VHHddZtnBBXDGATXYq hdFA8EEg3gh/kY7V8b+GyxjRKRbveG208hu+H4EirxHmRn5xJN1VoTLk9va+AJL1 I30l4USLDkTgf1AjYmk7yFIUTemCtwjfa0lsuu4l3rRJ3k1eBrtZe2cpWv2BoQDU by0sNnDelzJTQ9/v1i3J =OYiT -----END PGP SIGNATURE----- Merge tag 'drm-qemu-20161121' of git://git.kraxel.org/linux into drm-next drm/virtio: fix busid in a different way, allocate more vbufs. drm/qxl: various bugfixes and cleanups, * tag 'drm-qemu-20161121' of git://git.kraxel.org/linux: (224 commits) drm/virtio: allocate some extra bufs qxl: Allow resolution which are not multiple of 8 qxl: Don't notify userspace when monitors config is unchanged qxl: Remove qxl_bo_init() return value qxl: Call qxl_gem_{init, fini} qxl: Add missing '\n' to qxl_io_log() call qxl: Remove unused prototype qxl: Mark some internal functions as static Revert "drm: virtio: reinstate drm_virtio_set_busid()" drm/virtio: fix busid regression drm: re-export drm_dev_set_unique Linux 4.9-rc5 gp8psk: Fix DVB frontend attach gp8psk: fix gp8psk_usb_in_op() logic dvb-usb: move data_mutex to struct dvb_usb_device iio: maxim_thermocouple: detect invalid storage size in read() aoe: fix crash in page count manipulation lightnvm: invalid offset calculation for lba_shift Kbuild: enable -Wmaybe-uninitialized warnings by default pcmcia: fix return value of soc_pcmcia_regulator_set ...
This commit is contained in:
commit
6320745596
|
@ -1,4 +1,4 @@
|
|||
What: state
|
||||
What: /sys/devices/system/ibm_rtl/state
|
||||
Date: Sep 2010
|
||||
KernelVersion: 2.6.37
|
||||
Contact: Vernon Mauery <vernux@us.ibm.com>
|
||||
|
@ -10,7 +10,7 @@ Description: The state file allows a means by which to change in and
|
|||
Users: The ibm-prtm userspace daemon uses this interface.
|
||||
|
||||
|
||||
What: version
|
||||
What: /sys/devices/system/ibm_rtl/version
|
||||
Date: Sep 2010
|
||||
KernelVersion: 2.6.37
|
||||
Contact: Vernon Mauery <vernux@us.ibm.com>
|
||||
|
|
|
@ -43,6 +43,9 @@ Optional properties:
|
|||
reset signal present internally in some host controller IC designs.
|
||||
See Documentation/devicetree/bindings/reset/reset.txt for details.
|
||||
|
||||
* reset-names: request name for using "resets" property. Must be "reset".
|
||||
(It will be used together with "resets" property.)
|
||||
|
||||
* clocks: from common clock binding: handle to biu and ciu clocks for the
|
||||
bus interface unit clock and the card interface unit clock.
|
||||
|
||||
|
@ -103,6 +106,8 @@ board specific portions as listed below.
|
|||
interrupts = <0 75 0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
resets = <&rst 20>;
|
||||
reset-names = "reset";
|
||||
};
|
||||
|
||||
[board specific internal DMA resources]
|
||||
|
|
|
@ -26,13 +26,16 @@ Required properties:
|
|||
- "sys"
|
||||
- "legacy"
|
||||
- "client"
|
||||
- resets: Must contain five entries for each entry in reset-names.
|
||||
- resets: Must contain seven entries for each entry in reset-names.
|
||||
See ../reset/reset.txt for details.
|
||||
- reset-names: Must include the following names
|
||||
- "core"
|
||||
- "mgmt"
|
||||
- "mgmt-sticky"
|
||||
- "pipe"
|
||||
- "pm"
|
||||
- "aclk"
|
||||
- "pclk"
|
||||
- pinctrl-names : The pin control state names
|
||||
- pinctrl-0: The "default" pinctrl state
|
||||
- #interrupt-cells: specifies the number of cells needed to encode an
|
||||
|
@ -86,8 +89,10 @@ pcie0: pcie@f8000000 {
|
|||
reg = <0x0 0xf8000000 0x0 0x2000000>, <0x0 0xfd000000 0x0 0x1000000>;
|
||||
reg-names = "axi-base", "apb-base";
|
||||
resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>,
|
||||
<&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE>;
|
||||
reset-names = "core", "mgmt", "mgmt-sticky", "pipe";
|
||||
<&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE> ,
|
||||
<&cru SRST_PCIE_PM>, <&cru SRST_P_PCIE>, <&cru SRST_A_PCIE>;
|
||||
reset-names = "core", "mgmt", "mgmt-sticky", "pipe",
|
||||
"pm", "pclk", "aclk";
|
||||
phys = <&pcie_phy>;
|
||||
phy-names = "pcie-phy";
|
||||
pinctrl-names = "default";
|
||||
|
|
|
@ -14,11 +14,6 @@ Required properies:
|
|||
- #size-cells : The value of this property must be 1
|
||||
- ranges : defines mapping between pin controller node (parent) to
|
||||
gpio-bank node (children).
|
||||
- interrupt-parent: phandle of the interrupt parent to which the external
|
||||
GPIO interrupts are forwarded to.
|
||||
- st,syscfg: Should be phandle/offset pair. The phandle to the syscon node
|
||||
which includes IRQ mux selection register, and the offset of the IRQ mux
|
||||
selection register.
|
||||
- pins-are-numbered: Specify the subnodes are using numbered pinmux to
|
||||
specify pins.
|
||||
|
||||
|
@ -37,6 +32,11 @@ Required properties:
|
|||
|
||||
Optional properties:
|
||||
- reset: : Reference to the reset controller
|
||||
- interrupt-parent: phandle of the interrupt parent to which the external
|
||||
GPIO interrupts are forwarded to.
|
||||
- st,syscfg: Should be phandle/offset pair. The phandle to the syscon node
|
||||
which includes IRQ mux selection register, and the offset of the IRQ mux
|
||||
selection register.
|
||||
|
||||
Example:
|
||||
#include <dt-bindings/pinctrl/stm32f429-pinfunc.h>
|
||||
|
|
|
@ -447,7 +447,6 @@ prototypes:
|
|||
int (*flush) (struct file *);
|
||||
int (*release) (struct inode *, struct file *);
|
||||
int (*fsync) (struct file *, loff_t start, loff_t end, int datasync);
|
||||
int (*aio_fsync) (struct kiocb *, int datasync);
|
||||
int (*fasync) (int, struct file *, int);
|
||||
int (*lock) (struct file *, int, struct file_lock *);
|
||||
ssize_t (*readv) (struct file *, const struct iovec *, unsigned long,
|
||||
|
|
|
@ -828,7 +828,6 @@ struct file_operations {
|
|||
int (*flush) (struct file *, fl_owner_t id);
|
||||
int (*release) (struct inode *, struct file *);
|
||||
int (*fsync) (struct file *, loff_t, loff_t, int datasync);
|
||||
int (*aio_fsync) (struct kiocb *, int datasync);
|
||||
int (*fasync) (int, struct file *, int);
|
||||
int (*lock) (struct file *, int, struct file_lock *);
|
||||
ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
|
||||
|
|
|
@ -9354,7 +9354,7 @@ PCI DRIVER FOR INTEL VOLUME MANAGEMENT DEVICE (VMD)
|
|||
M: Keith Busch <keith.busch@intel.com>
|
||||
L: linux-pci@vger.kernel.org
|
||||
S: Supported
|
||||
F: arch/x86/pci/vmd.c
|
||||
F: drivers/pci/host/vmd.c
|
||||
|
||||
PCIE DRIVER FOR ST SPEAR13XX
|
||||
M: Pratyush Anand <pratyush.anand@gmail.com>
|
||||
|
|
12
Makefile
12
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Psychotic Stoned Sheep
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -370,7 +370,7 @@ LDFLAGS_MODULE =
|
|||
CFLAGS_KERNEL =
|
||||
AFLAGS_KERNEL =
|
||||
LDFLAGS_vmlinux =
|
||||
CFLAGS_GCOV = -fprofile-arcs -ftest-coverage -fno-tree-loop-im
|
||||
CFLAGS_GCOV = -fprofile-arcs -ftest-coverage -fno-tree-loop-im -Wno-maybe-uninitialized
|
||||
CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,)
|
||||
|
||||
|
||||
|
@ -620,7 +620,6 @@ ARCH_CFLAGS :=
|
|||
include arch/$(SRCARCH)/Makefile
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning,maybe-uninitialized,)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
|
||||
|
||||
ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
|
||||
|
@ -629,15 +628,18 @@ KBUILD_CFLAGS += $(call cc-option,-fdata-sections,)
|
|||
endif
|
||||
|
||||
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||
KBUILD_CFLAGS += -Os
|
||||
KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,)
|
||||
else
|
||||
ifdef CONFIG_PROFILE_ALL_BRANCHES
|
||||
KBUILD_CFLAGS += -O2
|
||||
KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,)
|
||||
else
|
||||
KBUILD_CFLAGS += -O2
|
||||
endif
|
||||
endif
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-ifversion, -lt, 0409, \
|
||||
$(call cc-disable-warning,maybe-uninitialized,))
|
||||
|
||||
# Tell gcc to never replace conditional load with a non-conditional one
|
||||
KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
|
||||
|
||||
|
|
|
@ -50,6 +50,9 @@ atleast_gcc44 := $(call cc-ifversion, -ge, 0404, y)
|
|||
|
||||
cflags-$(atleast_gcc44) += -fsection-anchors
|
||||
|
||||
cflags-$(CONFIG_ARC_HAS_LLSC) += -mlock
|
||||
cflags-$(CONFIG_ARC_HAS_SWAPE) += -mswape
|
||||
|
||||
ifdef CONFIG_ISA_ARCV2
|
||||
|
||||
ifndef CONFIG_ARC_HAS_LL64
|
||||
|
@ -68,7 +71,9 @@ cflags-$(CONFIG_ARC_DW2_UNWIND) += -fasynchronous-unwind-tables $(cfi)
|
|||
ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||
# Generic build system uses -O2, we want -O3
|
||||
# Note: No need to add to cflags-y as that happens anyways
|
||||
ARCH_CFLAGS += -O3
|
||||
#
|
||||
# Disable the false maybe-uninitialized warings gcc spits out at -O3
|
||||
ARCH_CFLAGS += -O3 $(call cc-disable-warning,maybe-uninitialized,)
|
||||
endif
|
||||
|
||||
# small data is default for elf32 tool-chain. If not usable, disable it
|
||||
|
|
|
@ -71,7 +71,7 @@ debug_uart: dw-apb-uart@0x5000 {
|
|||
reg-io-width = <4>;
|
||||
};
|
||||
|
||||
arcpmu0: pmu {
|
||||
arcpct0: pct {
|
||||
compatible = "snps,arc700-pct";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -69,7 +69,7 @@ phy0: ethernet-phy@0 {
|
|||
};
|
||||
};
|
||||
|
||||
arcpmu0: pmu {
|
||||
arcpct0: pct {
|
||||
compatible = "snps,arc700-pct";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -83,5 +83,9 @@ eth0: ethernet@f0003000 {
|
|||
reg = <0xf0003000 0x44>;
|
||||
interrupts = <7>;
|
||||
};
|
||||
|
||||
arcpct0: pct {
|
||||
compatible = "snps,arc700-pct";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
|||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_PERF_EVENTS=y
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_KPROBES=y
|
||||
|
|
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
|||
CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/"
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_PERF_EVENTS=y
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_KPROBES=y
|
||||
|
|
|
@ -12,6 +12,7 @@ CONFIG_BLK_DEV_INITRD=y
|
|||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_PERF_EVENTS=y
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_KPROBES=y
|
||||
|
|
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
|||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_PERF_EVENTS=y
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_KPROBES=y
|
||||
|
|
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
|||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
CONFIG_PERF_EVENTS=y
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_KPROBES=y
|
||||
|
|
|
@ -10,6 +10,7 @@ CONFIG_IKCONFIG_PROC=y
|
|||
# CONFIG_PID_NS is not set
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
||||
CONFIG_PERF_EVENTS=y
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_KPROBES=y
|
||||
CONFIG_MODULES=y
|
||||
|
@ -34,7 +35,6 @@ CONFIG_INET=y
|
|||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
# CONFIG_INET_LRO is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_DEVTMPFS=y
|
||||
|
@ -72,7 +72,6 @@ CONFIG_SERIAL_OF_PLATFORM=y
|
|||
# CONFIG_HWMON is not set
|
||||
CONFIG_DRM=y
|
||||
CONFIG_DRM_ARCPGU=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_LOGO=y
|
||||
# CONFIG_HID is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
|
|
|
@ -43,12 +43,14 @@
|
|||
#define STATUS_AE_BIT 5 /* Exception active */
|
||||
#define STATUS_DE_BIT 6 /* PC is in delay slot */
|
||||
#define STATUS_U_BIT 7 /* User/Kernel mode */
|
||||
#define STATUS_Z_BIT 11
|
||||
#define STATUS_L_BIT 12 /* Loop inhibit */
|
||||
|
||||
/* These masks correspond to the status word(STATUS_32) bits */
|
||||
#define STATUS_AE_MASK (1<<STATUS_AE_BIT)
|
||||
#define STATUS_DE_MASK (1<<STATUS_DE_BIT)
|
||||
#define STATUS_U_MASK (1<<STATUS_U_BIT)
|
||||
#define STATUS_Z_MASK (1<<STATUS_Z_BIT)
|
||||
#define STATUS_L_MASK (1<<STATUS_L_BIT)
|
||||
|
||||
/*
|
||||
|
|
|
@ -37,9 +37,9 @@ extern const char *arc_platform_smp_cpuinfo(void);
|
|||
* API expected BY platform smp code (FROM arch smp code)
|
||||
*
|
||||
* smp_ipi_irq_setup:
|
||||
* Takes @cpu and @irq to which the arch-common ISR is hooked up
|
||||
* Takes @cpu and @hwirq to which the arch-common ISR is hooked up
|
||||
*/
|
||||
extern int smp_ipi_irq_setup(int cpu, int irq);
|
||||
extern int smp_ipi_irq_setup(int cpu, irq_hw_number_t hwirq);
|
||||
|
||||
/*
|
||||
* struct plat_smp_ops - SMP callbacks provided by platform to ARC SMP
|
||||
|
|
|
@ -31,6 +31,8 @@ static void __init arc_set_early_base_baud(unsigned long dt_root)
|
|||
arc_base_baud = 166666666; /* Fixed 166.6MHz clk (TB10x) */
|
||||
else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp"))
|
||||
arc_base_baud = 33333333; /* Fixed 33MHz clk (AXS10x) */
|
||||
else if (of_flat_dt_is_compatible(dt_root, "ezchip,arc-nps"))
|
||||
arc_base_baud = 800000000; /* Fixed 800MHz clk (NPS) */
|
||||
else
|
||||
arc_base_baud = 50000000; /* Fixed default 50MHz */
|
||||
}
|
||||
|
|
|
@ -181,6 +181,8 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask,
|
|||
{
|
||||
unsigned long flags;
|
||||
cpumask_t online;
|
||||
unsigned int destination_bits;
|
||||
unsigned int distribution_mode;
|
||||
|
||||
/* errout if no online cpu per @cpumask */
|
||||
if (!cpumask_and(&online, cpumask, cpu_online_mask))
|
||||
|
@ -188,8 +190,15 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask,
|
|||
|
||||
raw_spin_lock_irqsave(&mcip_lock, flags);
|
||||
|
||||
idu_set_dest(data->hwirq, cpumask_bits(&online)[0]);
|
||||
idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, IDU_M_DISTRI_RR);
|
||||
destination_bits = cpumask_bits(&online)[0];
|
||||
idu_set_dest(data->hwirq, destination_bits);
|
||||
|
||||
if (ffs(destination_bits) == fls(destination_bits))
|
||||
distribution_mode = IDU_M_DISTRI_DEST;
|
||||
else
|
||||
distribution_mode = IDU_M_DISTRI_RR;
|
||||
|
||||
idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, distribution_mode);
|
||||
|
||||
raw_spin_unlock_irqrestore(&mcip_lock, flags);
|
||||
|
||||
|
@ -207,16 +216,15 @@ static struct irq_chip idu_irq_chip = {
|
|||
|
||||
};
|
||||
|
||||
static int idu_first_irq;
|
||||
static irq_hw_number_t idu_first_hwirq;
|
||||
|
||||
static void idu_cascade_isr(struct irq_desc *desc)
|
||||
{
|
||||
struct irq_domain *domain = irq_desc_get_handler_data(desc);
|
||||
unsigned int core_irq = irq_desc_get_irq(desc);
|
||||
unsigned int idu_irq;
|
||||
struct irq_domain *idu_domain = irq_desc_get_handler_data(desc);
|
||||
irq_hw_number_t core_hwirq = irqd_to_hwirq(irq_desc_get_irq_data(desc));
|
||||
irq_hw_number_t idu_hwirq = core_hwirq - idu_first_hwirq;
|
||||
|
||||
idu_irq = core_irq - idu_first_irq;
|
||||
generic_handle_irq(irq_find_mapping(domain, idu_irq));
|
||||
generic_handle_irq(irq_find_mapping(idu_domain, idu_hwirq));
|
||||
}
|
||||
|
||||
static int idu_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hwirq)
|
||||
|
@ -282,7 +290,7 @@ idu_of_init(struct device_node *intc, struct device_node *parent)
|
|||
struct irq_domain *domain;
|
||||
/* Read IDU BCR to confirm nr_irqs */
|
||||
int nr_irqs = of_irq_count(intc);
|
||||
int i, irq;
|
||||
int i, virq;
|
||||
struct mcip_bcr mp;
|
||||
|
||||
READ_BCR(ARC_REG_MCIP_BCR, mp);
|
||||
|
@ -303,11 +311,11 @@ idu_of_init(struct device_node *intc, struct device_node *parent)
|
|||
* however we need it to get the parent virq and set IDU handler
|
||||
* as first level isr
|
||||
*/
|
||||
irq = irq_of_parse_and_map(intc, i);
|
||||
virq = irq_of_parse_and_map(intc, i);
|
||||
if (!i)
|
||||
idu_first_irq = irq;
|
||||
idu_first_hwirq = irqd_to_hwirq(irq_get_irq_data(virq));
|
||||
|
||||
irq_set_chained_handler_and_data(irq, idu_cascade_isr, domain);
|
||||
irq_set_chained_handler_and_data(virq, idu_cascade_isr, domain);
|
||||
}
|
||||
|
||||
__mcip_cmd(CMD_IDU_ENABLE, 0);
|
||||
|
|
|
@ -43,8 +43,8 @@ SYSCALL_DEFINE0(arc_gettls)
|
|||
|
||||
SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
|
||||
{
|
||||
int uval;
|
||||
int ret;
|
||||
struct pt_regs *regs = current_pt_regs();
|
||||
int uval = -EFAULT;
|
||||
|
||||
/*
|
||||
* This is only for old cores lacking LLOCK/SCOND, which by defintion
|
||||
|
@ -54,24 +54,26 @@ SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
|
|||
*/
|
||||
WARN_ON_ONCE(IS_ENABLED(CONFIG_SMP));
|
||||
|
||||
/* Z indicates to userspace if operation succeded */
|
||||
regs->status32 &= ~STATUS_Z_MASK;
|
||||
|
||||
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
|
||||
return -EFAULT;
|
||||
|
||||
preempt_disable();
|
||||
|
||||
ret = __get_user(uval, uaddr);
|
||||
if (ret)
|
||||
if (__get_user(uval, uaddr))
|
||||
goto done;
|
||||
|
||||
if (uval != expected)
|
||||
ret = -EAGAIN;
|
||||
else
|
||||
ret = __put_user(new, uaddr);
|
||||
if (uval == expected) {
|
||||
if (!__put_user(new, uaddr))
|
||||
regs->status32 |= STATUS_Z_MASK;
|
||||
}
|
||||
|
||||
done:
|
||||
preempt_enable();
|
||||
|
||||
return ret;
|
||||
return uval;
|
||||
}
|
||||
|
||||
void arch_cpu_idle(void)
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/atomic.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach_desc.h>
|
||||
|
@ -67,11 +68,13 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
int i;
|
||||
|
||||
/*
|
||||
* Initialise the present map, which describes the set of CPUs
|
||||
* actually populated at the present time.
|
||||
* if platform didn't set the present map already, do it now
|
||||
* boot cpu is set to present already by init/main.c
|
||||
*/
|
||||
for (i = 0; i < max_cpus; i++)
|
||||
set_cpu_present(i, true);
|
||||
if (num_present_cpus() <= 1) {
|
||||
for (i = 0; i < max_cpus; i++)
|
||||
set_cpu_present(i, true);
|
||||
}
|
||||
}
|
||||
|
||||
void __init smp_cpus_done(unsigned int max_cpus)
|
||||
|
@ -351,20 +354,24 @@ irqreturn_t do_IPI(int irq, void *dev_id)
|
|||
*/
|
||||
static DEFINE_PER_CPU(int, ipi_dev);
|
||||
|
||||
int smp_ipi_irq_setup(int cpu, int irq)
|
||||
int smp_ipi_irq_setup(int cpu, irq_hw_number_t hwirq)
|
||||
{
|
||||
int *dev = per_cpu_ptr(&ipi_dev, cpu);
|
||||
unsigned int virq = irq_find_mapping(NULL, hwirq);
|
||||
|
||||
if (!virq)
|
||||
panic("Cannot find virq for root domain and hwirq=%lu", hwirq);
|
||||
|
||||
/* Boot cpu calls request, all call enable */
|
||||
if (!cpu) {
|
||||
int rc;
|
||||
|
||||
rc = request_percpu_irq(irq, do_IPI, "IPI Interrupt", dev);
|
||||
rc = request_percpu_irq(virq, do_IPI, "IPI Interrupt", dev);
|
||||
if (rc)
|
||||
panic("Percpu IRQ request failed for %d\n", irq);
|
||||
panic("Percpu IRQ request failed for %u\n", virq);
|
||||
}
|
||||
|
||||
enable_percpu_irq(irq, 0);
|
||||
enable_percpu_irq(virq, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -152,14 +152,17 @@ static cycle_t arc_read_rtc(struct clocksource *cs)
|
|||
cycle_t full;
|
||||
} stamp;
|
||||
|
||||
|
||||
__asm__ __volatile(
|
||||
"1: \n"
|
||||
" lr %0, [AUX_RTC_LOW] \n"
|
||||
" lr %1, [AUX_RTC_HIGH] \n"
|
||||
" lr %2, [AUX_RTC_CTRL] \n"
|
||||
" bbit0.nt %2, 31, 1b \n"
|
||||
: "=r" (stamp.low), "=r" (stamp.high), "=r" (status));
|
||||
/*
|
||||
* hardware has an internal state machine which tracks readout of
|
||||
* low/high and updates the CTRL.status if
|
||||
* - interrupt/exception taken between the two reads
|
||||
* - high increments after low has been read
|
||||
*/
|
||||
do {
|
||||
stamp.low = read_aux_reg(AUX_RTC_LOW);
|
||||
stamp.high = read_aux_reg(AUX_RTC_HIGH);
|
||||
status = read_aux_reg(AUX_RTC_CTRL);
|
||||
} while (!(status & _BITUL(31)));
|
||||
|
||||
return stamp.full;
|
||||
}
|
||||
|
|
|
@ -105,6 +105,31 @@ static void arc_dma_free(struct device *dev, size_t size, void *vaddr,
|
|||
__free_pages(page, get_order(size));
|
||||
}
|
||||
|
||||
static int arc_dma_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t dma_addr, size_t size,
|
||||
unsigned long attrs)
|
||||
{
|
||||
unsigned long user_count = vma_pages(vma);
|
||||
unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
|
||||
unsigned long pfn = __phys_to_pfn(plat_dma_to_phys(dev, dma_addr));
|
||||
unsigned long off = vma->vm_pgoff;
|
||||
int ret = -ENXIO;
|
||||
|
||||
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
||||
|
||||
if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret))
|
||||
return ret;
|
||||
|
||||
if (off < count && user_count <= (count - off)) {
|
||||
ret = remap_pfn_range(vma, vma->vm_start,
|
||||
pfn + off,
|
||||
user_count << PAGE_SHIFT,
|
||||
vma->vm_page_prot);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* streaming DMA Mapping API...
|
||||
* CPU accesses page via normal paddr, thus needs to explicitly made
|
||||
|
@ -193,6 +218,7 @@ static int arc_dma_supported(struct device *dev, u64 dma_mask)
|
|||
struct dma_map_ops arc_dma_ops = {
|
||||
.alloc = arc_dma_alloc,
|
||||
.free = arc_dma_free,
|
||||
.mmap = arc_dma_mmap,
|
||||
.map_page = arc_dma_map_page,
|
||||
.map_sg = arc_dma_map_sg,
|
||||
.sync_single_for_device = arc_dma_sync_single_for_device,
|
||||
|
|
|
@ -140,16 +140,10 @@ static void eznps_init_per_cpu(int cpu)
|
|||
mtm_enable_core(cpu);
|
||||
}
|
||||
|
||||
static void eznps_ipi_clear(int irq)
|
||||
{
|
||||
write_aux_reg(CTOP_AUX_IACK, 1 << irq);
|
||||
}
|
||||
|
||||
struct plat_smp_ops plat_smp_ops = {
|
||||
.info = smp_cpuinfo_buf,
|
||||
.init_early_smp = eznps_init_cpumasks,
|
||||
.cpu_kick = eznps_smp_wakeup_cpu,
|
||||
.ipi_send = eznps_ipi_send,
|
||||
.init_per_cpu = eznps_init_per_cpu,
|
||||
.ipi_clear = eznps_ipi_clear,
|
||||
};
|
||||
|
|
|
@ -66,6 +66,7 @@ extern char __kvm_hyp_vector[];
|
|||
extern void __kvm_flush_vm_context(void);
|
||||
extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
|
||||
extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
|
||||
extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu);
|
||||
|
||||
extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
|
||||
|
||||
|
|
|
@ -57,6 +57,9 @@ struct kvm_arch {
|
|||
/* VTTBR value associated with below pgd and vmid */
|
||||
u64 vttbr;
|
||||
|
||||
/* The last vcpu id that ran on each physical CPU */
|
||||
int __percpu *last_vcpu_ran;
|
||||
|
||||
/* Timer */
|
||||
struct arch_timer_kvm timer;
|
||||
|
||||
|
|
|
@ -71,6 +71,7 @@
|
|||
#define ICIALLUIS __ACCESS_CP15(c7, 0, c1, 0)
|
||||
#define ATS1CPR __ACCESS_CP15(c7, 0, c8, 0)
|
||||
#define TLBIALLIS __ACCESS_CP15(c8, 0, c3, 0)
|
||||
#define TLBIALL __ACCESS_CP15(c8, 0, c7, 0)
|
||||
#define TLBIALLNSNHIS __ACCESS_CP15(c8, 4, c3, 4)
|
||||
#define PRRR __ACCESS_CP15(c10, 0, c2, 0)
|
||||
#define NMRR __ACCESS_CP15(c10, 0, c2, 1)
|
||||
|
|
|
@ -114,11 +114,18 @@ void kvm_arch_check_processor_compat(void *rtn)
|
|||
*/
|
||||
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
||||
{
|
||||
int ret = 0;
|
||||
int ret, cpu;
|
||||
|
||||
if (type)
|
||||
return -EINVAL;
|
||||
|
||||
kvm->arch.last_vcpu_ran = alloc_percpu(typeof(*kvm->arch.last_vcpu_ran));
|
||||
if (!kvm->arch.last_vcpu_ran)
|
||||
return -ENOMEM;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
*per_cpu_ptr(kvm->arch.last_vcpu_ran, cpu) = -1;
|
||||
|
||||
ret = kvm_alloc_stage2_pgd(kvm);
|
||||
if (ret)
|
||||
goto out_fail_alloc;
|
||||
|
@ -141,6 +148,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
|||
out_free_stage2_pgd:
|
||||
kvm_free_stage2_pgd(kvm);
|
||||
out_fail_alloc:
|
||||
free_percpu(kvm->arch.last_vcpu_ran);
|
||||
kvm->arch.last_vcpu_ran = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -168,6 +177,9 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
|
|||
{
|
||||
int i;
|
||||
|
||||
free_percpu(kvm->arch.last_vcpu_ran);
|
||||
kvm->arch.last_vcpu_ran = NULL;
|
||||
|
||||
for (i = 0; i < KVM_MAX_VCPUS; ++i) {
|
||||
if (kvm->vcpus[i]) {
|
||||
kvm_arch_vcpu_free(kvm->vcpus[i]);
|
||||
|
@ -312,6 +324,19 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
|
|||
|
||||
void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
||||
{
|
||||
int *last_ran;
|
||||
|
||||
last_ran = this_cpu_ptr(vcpu->kvm->arch.last_vcpu_ran);
|
||||
|
||||
/*
|
||||
* We might get preempted before the vCPU actually runs, but
|
||||
* over-invalidation doesn't affect correctness.
|
||||
*/
|
||||
if (*last_ran != vcpu->vcpu_id) {
|
||||
kvm_call_hyp(__kvm_tlb_flush_local_vmid, vcpu);
|
||||
*last_ran = vcpu->vcpu_id;
|
||||
}
|
||||
|
||||
vcpu->cpu = cpu;
|
||||
vcpu->arch.host_cpu_context = this_cpu_ptr(kvm_host_cpu_state);
|
||||
|
||||
|
|
|
@ -55,6 +55,21 @@ void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
|||
__kvm_tlb_flush_vmid(kvm);
|
||||
}
|
||||
|
||||
void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
|
||||
|
||||
/* Switch to requested VMID */
|
||||
write_sysreg(kvm->arch.vttbr, VTTBR);
|
||||
isb();
|
||||
|
||||
write_sysreg(0, TLBIALL);
|
||||
dsb(nsh);
|
||||
isb();
|
||||
|
||||
write_sysreg(0, VTTBR);
|
||||
}
|
||||
|
||||
void __hyp_text __kvm_flush_vm_context(void)
|
||||
{
|
||||
write_sysreg(0, TLBIALLNSNHIS);
|
||||
|
|
|
@ -300,8 +300,11 @@ pcie0: pcie@f8000000 {
|
|||
ranges = <0x83000000 0x0 0xfa000000 0x0 0xfa000000 0x0 0x600000
|
||||
0x81000000 0x0 0xfa600000 0x0 0xfa600000 0x0 0x100000>;
|
||||
resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>,
|
||||
<&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE>;
|
||||
reset-names = "core", "mgmt", "mgmt-sticky", "pipe";
|
||||
<&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE>,
|
||||
<&cru SRST_PCIE_PM>, <&cru SRST_P_PCIE>,
|
||||
<&cru SRST_A_PCIE>;
|
||||
reset-names = "core", "mgmt", "mgmt-sticky", "pipe",
|
||||
"pm", "pclk", "aclk";
|
||||
status = "disabled";
|
||||
|
||||
pcie0_intc: interrupt-controller {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef __ASM_ALTERNATIVE_H
|
||||
#define __ASM_ALTERNATIVE_H
|
||||
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/cpucaps.h>
|
||||
#include <asm/insn.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* arch/arm64/include/asm/cpucaps.h
|
||||
*
|
||||
* Copyright (C) 2016 ARM Ltd.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef __ASM_CPUCAPS_H
|
||||
#define __ASM_CPUCAPS_H
|
||||
|
||||
#define ARM64_WORKAROUND_CLEAN_CACHE 0
|
||||
#define ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE 1
|
||||
#define ARM64_WORKAROUND_845719 2
|
||||
#define ARM64_HAS_SYSREG_GIC_CPUIF 3
|
||||
#define ARM64_HAS_PAN 4
|
||||
#define ARM64_HAS_LSE_ATOMICS 5
|
||||
#define ARM64_WORKAROUND_CAVIUM_23154 6
|
||||
#define ARM64_WORKAROUND_834220 7
|
||||
#define ARM64_HAS_NO_HW_PREFETCH 8
|
||||
#define ARM64_HAS_UAO 9
|
||||
#define ARM64_ALT_PAN_NOT_UAO 10
|
||||
#define ARM64_HAS_VIRT_HOST_EXTN 11
|
||||
#define ARM64_WORKAROUND_CAVIUM_27456 12
|
||||
#define ARM64_HAS_32BIT_EL0 13
|
||||
#define ARM64_HYP_OFFSET_LOW 14
|
||||
#define ARM64_MISMATCHED_CACHE_LINE_SIZE 15
|
||||
|
||||
#define ARM64_NCAPS 16
|
||||
|
||||
#endif /* __ASM_CPUCAPS_H */
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
#include <linux/jump_label.h>
|
||||
|
||||
#include <asm/cpucaps.h>
|
||||
#include <asm/hwcap.h>
|
||||
#include <asm/sysreg.h>
|
||||
|
||||
|
@ -24,25 +25,6 @@
|
|||
#define MAX_CPU_FEATURES (8 * sizeof(elf_hwcap))
|
||||
#define cpu_feature(x) ilog2(HWCAP_ ## x)
|
||||
|
||||
#define ARM64_WORKAROUND_CLEAN_CACHE 0
|
||||
#define ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE 1
|
||||
#define ARM64_WORKAROUND_845719 2
|
||||
#define ARM64_HAS_SYSREG_GIC_CPUIF 3
|
||||
#define ARM64_HAS_PAN 4
|
||||
#define ARM64_HAS_LSE_ATOMICS 5
|
||||
#define ARM64_WORKAROUND_CAVIUM_23154 6
|
||||
#define ARM64_WORKAROUND_834220 7
|
||||
#define ARM64_HAS_NO_HW_PREFETCH 8
|
||||
#define ARM64_HAS_UAO 9
|
||||
#define ARM64_ALT_PAN_NOT_UAO 10
|
||||
#define ARM64_HAS_VIRT_HOST_EXTN 11
|
||||
#define ARM64_WORKAROUND_CAVIUM_27456 12
|
||||
#define ARM64_HAS_32BIT_EL0 13
|
||||
#define ARM64_HYP_OFFSET_LOW 14
|
||||
#define ARM64_MISMATCHED_CACHE_LINE_SIZE 15
|
||||
|
||||
#define ARM64_NCAPS 16
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
@ -54,6 +54,7 @@ extern char __kvm_hyp_vector[];
|
|||
extern void __kvm_flush_vm_context(void);
|
||||
extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
|
||||
extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
|
||||
extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu);
|
||||
|
||||
extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
|
||||
|
||||
|
|
|
@ -62,6 +62,9 @@ struct kvm_arch {
|
|||
/* VTTBR value associated with above pgd and vmid */
|
||||
u64 vttbr;
|
||||
|
||||
/* The last vcpu id that ran on each physical CPU */
|
||||
int __percpu *last_vcpu_ran;
|
||||
|
||||
/* The maximum number of vCPUs depends on the used GIC model */
|
||||
int max_vcpus;
|
||||
|
||||
|
|
|
@ -128,7 +128,7 @@ static inline unsigned long __kern_hyp_va(unsigned long v)
|
|||
return v;
|
||||
}
|
||||
|
||||
#define kern_hyp_va(v) (typeof(v))(__kern_hyp_va((unsigned long)(v)))
|
||||
#define kern_hyp_va(v) ((typeof(v))(__kern_hyp_va((unsigned long)(v))))
|
||||
|
||||
/*
|
||||
* We currently only support a 40bit IPA.
|
||||
|
|
|
@ -5,7 +5,6 @@
|
|||
|
||||
#include <linux/stringify.h>
|
||||
#include <asm/alternative.h>
|
||||
#include <asm/cpufeature.h>
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
|
|
|
@ -64,6 +64,21 @@ void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm)
|
|||
write_sysreg(0, vttbr_el2);
|
||||
}
|
||||
|
||||
void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
|
||||
|
||||
/* Switch to requested VMID */
|
||||
write_sysreg(kvm->arch.vttbr, vttbr_el2);
|
||||
isb();
|
||||
|
||||
asm volatile("tlbi vmalle1" : : );
|
||||
dsb(nsh);
|
||||
isb();
|
||||
|
||||
write_sysreg(0, vttbr_el2);
|
||||
}
|
||||
|
||||
void __hyp_text __kvm_flush_vm_context(void)
|
||||
{
|
||||
dsb(ishst);
|
||||
|
|
|
@ -324,6 +324,7 @@ static int __init nios2_time_init(struct device_node *timer)
|
|||
ret = nios2_clocksource_init(timer);
|
||||
break;
|
||||
default:
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
* they shouldn't be hard-coded!
|
||||
*/
|
||||
|
||||
#define __ro_after_init __read_mostly
|
||||
|
||||
#define L1_CACHE_BYTES 16
|
||||
#define L1_CACHE_SHIFT 4
|
||||
|
||||
|
|
|
@ -363,11 +363,11 @@ static void *diag204_store(void)
|
|||
static int diag224_get_name_table(void)
|
||||
{
|
||||
/* memory must be below 2GB */
|
||||
diag224_cpu_names = kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA);
|
||||
diag224_cpu_names = (char *) __get_free_page(GFP_KERNEL | GFP_DMA);
|
||||
if (!diag224_cpu_names)
|
||||
return -ENOMEM;
|
||||
if (diag224(diag224_cpu_names)) {
|
||||
kfree(diag224_cpu_names);
|
||||
free_page((unsigned long) diag224_cpu_names);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
EBCASC(diag224_cpu_names + 16, (*diag224_cpu_names + 1) * 16);
|
||||
|
@ -376,7 +376,7 @@ static int diag224_get_name_table(void)
|
|||
|
||||
static void diag224_delete_name_table(void)
|
||||
{
|
||||
kfree(diag224_cpu_names);
|
||||
free_page((unsigned long) diag224_cpu_names);
|
||||
}
|
||||
|
||||
static int diag224_idx2name(int index, char *name)
|
||||
|
|
|
@ -62,9 +62,11 @@ SECTIONS
|
|||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__start_ro_after_init = .;
|
||||
__start_data_ro_after_init = .;
|
||||
.data..ro_after_init : {
|
||||
*(.data..ro_after_init)
|
||||
}
|
||||
__end_data_ro_after_init = .;
|
||||
EXCEPTION_TABLE(16)
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__end_ro_after_init = .;
|
||||
|
|
|
@ -423,7 +423,7 @@ static int __s390_dma_map_sg(struct device *dev, struct scatterlist *sg,
|
|||
dma_addr_t dma_addr_base, dma_addr;
|
||||
int flags = ZPCI_PTE_VALID;
|
||||
struct scatterlist *s;
|
||||
unsigned long pa;
|
||||
unsigned long pa = 0;
|
||||
int ret;
|
||||
|
||||
size = PAGE_ALIGN(size);
|
||||
|
|
|
@ -888,7 +888,7 @@ static int helper_rfc4106_encrypt(struct aead_request *req)
|
|||
unsigned long auth_tag_len = crypto_aead_authsize(tfm);
|
||||
u8 iv[16] __attribute__ ((__aligned__(AESNI_ALIGN)));
|
||||
struct scatter_walk src_sg_walk;
|
||||
struct scatter_walk dst_sg_walk;
|
||||
struct scatter_walk dst_sg_walk = {};
|
||||
unsigned int i;
|
||||
|
||||
/* Assuming we are supporting rfc4106 64-bit extended */
|
||||
|
@ -968,7 +968,7 @@ static int helper_rfc4106_decrypt(struct aead_request *req)
|
|||
u8 iv[16] __attribute__ ((__aligned__(AESNI_ALIGN)));
|
||||
u8 authTag[16];
|
||||
struct scatter_walk src_sg_walk;
|
||||
struct scatter_walk dst_sg_walk;
|
||||
struct scatter_walk dst_sg_walk = {};
|
||||
unsigned int i;
|
||||
|
||||
if (unlikely(req->assoclen != 16 && req->assoclen != 20))
|
||||
|
|
|
@ -1042,8 +1042,11 @@ static int apm_get_power_status(u_short *status, u_short *bat, u_short *life)
|
|||
|
||||
if (apm_info.get_power_status_broken)
|
||||
return APM_32_UNSUPPORTED;
|
||||
if (apm_bios_call(&call))
|
||||
if (apm_bios_call(&call)) {
|
||||
if (!call.err)
|
||||
return APM_NO_ERROR;
|
||||
return call.err;
|
||||
}
|
||||
*status = call.ebx;
|
||||
*bat = call.ecx;
|
||||
if (apm_info.get_power_status_swabinminutes) {
|
||||
|
|
|
@ -122,7 +122,7 @@ static int acpi_apd_create_device(struct acpi_device *adev,
|
|||
int ret;
|
||||
|
||||
if (!dev_desc) {
|
||||
pdev = acpi_create_platform_device(adev);
|
||||
pdev = acpi_create_platform_device(adev, NULL);
|
||||
return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1;
|
||||
}
|
||||
|
||||
|
@ -139,14 +139,8 @@ static int acpi_apd_create_device(struct acpi_device *adev,
|
|||
goto err_out;
|
||||
}
|
||||
|
||||
if (dev_desc->properties) {
|
||||
ret = device_add_properties(&adev->dev, dev_desc->properties);
|
||||
if (ret)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
adev->driver_data = pdata;
|
||||
pdev = acpi_create_platform_device(adev);
|
||||
pdev = acpi_create_platform_device(adev, dev_desc->properties);
|
||||
if (!IS_ERR_OR_NULL(pdev))
|
||||
return 1;
|
||||
|
||||
|
|
|
@ -395,7 +395,7 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
|
|||
|
||||
dev_desc = (const struct lpss_device_desc *)id->driver_data;
|
||||
if (!dev_desc) {
|
||||
pdev = acpi_create_platform_device(adev);
|
||||
pdev = acpi_create_platform_device(adev, NULL);
|
||||
return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1;
|
||||
}
|
||||
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
|
||||
|
@ -451,14 +451,8 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
|
|||
goto err_out;
|
||||
}
|
||||
|
||||
if (dev_desc->properties) {
|
||||
ret = device_add_properties(&adev->dev, dev_desc->properties);
|
||||
if (ret)
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
adev->driver_data = pdata;
|
||||
pdev = acpi_create_platform_device(adev);
|
||||
pdev = acpi_create_platform_device(adev, dev_desc->properties);
|
||||
if (!IS_ERR_OR_NULL(pdev)) {
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -50,6 +50,7 @@ static void acpi_platform_fill_resource(struct acpi_device *adev,
|
|||
/**
|
||||
* acpi_create_platform_device - Create platform device for ACPI device node
|
||||
* @adev: ACPI device node to create a platform device for.
|
||||
* @properties: Optional collection of build-in properties.
|
||||
*
|
||||
* Check if the given @adev can be represented as a platform device and, if
|
||||
* that's the case, create and register a platform device, populate its common
|
||||
|
@ -57,7 +58,8 @@ static void acpi_platform_fill_resource(struct acpi_device *adev,
|
|||
*
|
||||
* Name of the platform device will be the same as @adev's.
|
||||
*/
|
||||
struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
|
||||
struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
|
||||
struct property_entry *properties)
|
||||
{
|
||||
struct platform_device *pdev = NULL;
|
||||
struct platform_device_info pdevinfo;
|
||||
|
@ -106,6 +108,7 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
|
|||
pdevinfo.res = resources;
|
||||
pdevinfo.num_res = count;
|
||||
pdevinfo.fwnode = acpi_fwnode_handle(adev);
|
||||
pdevinfo.properties = properties;
|
||||
|
||||
if (acpi_dma_supported(adev))
|
||||
pdevinfo.dma_mask = DMA_BIT_MASK(32);
|
||||
|
|
|
@ -34,11 +34,11 @@ static int int340x_thermal_handler_attach(struct acpi_device *adev,
|
|||
const struct acpi_device_id *id)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_INT340X_THERMAL))
|
||||
acpi_create_platform_device(adev);
|
||||
acpi_create_platform_device(adev, NULL);
|
||||
/* Intel SoC DTS thermal driver needs INT3401 to set IRQ descriptor */
|
||||
else if (IS_ENABLED(CONFIG_INTEL_SOC_DTS_THERMAL) &&
|
||||
id->driver_data == INT3401_DEVICE)
|
||||
acpi_create_platform_device(adev);
|
||||
acpi_create_platform_device(adev, NULL);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1734,7 +1734,7 @@ static void acpi_default_enumeration(struct acpi_device *device)
|
|||
&is_spi_i2c_slave);
|
||||
acpi_dev_free_resource_list(&resource_list);
|
||||
if (!is_spi_i2c_slave) {
|
||||
acpi_create_platform_device(device);
|
||||
acpi_create_platform_device(device, NULL);
|
||||
acpi_device_set_enumerated(device);
|
||||
} else {
|
||||
blocking_notifier_call_chain(&acpi_reconfig_chain,
|
||||
|
|
|
@ -324,7 +324,8 @@ static int really_probe(struct device *dev, struct device_driver *drv)
|
|||
{
|
||||
int ret = -EPROBE_DEFER;
|
||||
int local_trigger_count = atomic_read(&deferred_trigger_count);
|
||||
bool test_remove = IS_ENABLED(CONFIG_DEBUG_TEST_DRIVER_REMOVE);
|
||||
bool test_remove = IS_ENABLED(CONFIG_DEBUG_TEST_DRIVER_REMOVE) &&
|
||||
!drv->suppress_bind_attrs;
|
||||
|
||||
if (defer_all_probes) {
|
||||
/*
|
||||
|
@ -383,7 +384,7 @@ static int really_probe(struct device *dev, struct device_driver *drv)
|
|||
if (test_remove) {
|
||||
test_remove = false;
|
||||
|
||||
if (dev->bus && dev->bus->remove)
|
||||
if (dev->bus->remove)
|
||||
dev->bus->remove(dev);
|
||||
else if (drv->remove)
|
||||
drv->remove(dev);
|
||||
|
|
|
@ -1027,6 +1027,8 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a
|
|||
TRACE_DEVICE(dev);
|
||||
TRACE_SUSPEND(0);
|
||||
|
||||
dpm_wait_for_children(dev, async);
|
||||
|
||||
if (async_error)
|
||||
goto Complete;
|
||||
|
||||
|
@ -1038,8 +1040,6 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a
|
|||
if (dev->power.syscore || dev->power.direct_complete)
|
||||
goto Complete;
|
||||
|
||||
dpm_wait_for_children(dev, async);
|
||||
|
||||
if (dev->pm_domain) {
|
||||
info = "noirq power domain ";
|
||||
callback = pm_noirq_op(&dev->pm_domain->ops, state);
|
||||
|
@ -1174,6 +1174,8 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as
|
|||
|
||||
__pm_runtime_disable(dev, false);
|
||||
|
||||
dpm_wait_for_children(dev, async);
|
||||
|
||||
if (async_error)
|
||||
goto Complete;
|
||||
|
||||
|
@ -1185,8 +1187,6 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as
|
|||
if (dev->power.syscore || dev->power.direct_complete)
|
||||
goto Complete;
|
||||
|
||||
dpm_wait_for_children(dev, async);
|
||||
|
||||
if (dev->pm_domain) {
|
||||
info = "late power domain ";
|
||||
callback = pm_late_early_op(&dev->pm_domain->ops, state);
|
||||
|
|
|
@ -853,45 +853,6 @@ rqbiocnt(struct request *r)
|
|||
return n;
|
||||
}
|
||||
|
||||
/* This can be removed if we are certain that no users of the block
|
||||
* layer will ever use zero-count pages in bios. Otherwise we have to
|
||||
* protect against the put_page sometimes done by the network layer.
|
||||
*
|
||||
* See http://oss.sgi.com/archives/xfs/2007-01/msg00594.html for
|
||||
* discussion.
|
||||
*
|
||||
* We cannot use get_page in the workaround, because it insists on a
|
||||
* positive page count as a precondition. So we use _refcount directly.
|
||||
*/
|
||||
static void
|
||||
bio_pageinc(struct bio *bio)
|
||||
{
|
||||
struct bio_vec bv;
|
||||
struct page *page;
|
||||
struct bvec_iter iter;
|
||||
|
||||
bio_for_each_segment(bv, bio, iter) {
|
||||
/* Non-zero page count for non-head members of
|
||||
* compound pages is no longer allowed by the kernel.
|
||||
*/
|
||||
page = compound_head(bv.bv_page);
|
||||
page_ref_inc(page);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bio_pagedec(struct bio *bio)
|
||||
{
|
||||
struct page *page;
|
||||
struct bio_vec bv;
|
||||
struct bvec_iter iter;
|
||||
|
||||
bio_for_each_segment(bv, bio, iter) {
|
||||
page = compound_head(bv.bv_page);
|
||||
page_ref_dec(page);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
bufinit(struct buf *buf, struct request *rq, struct bio *bio)
|
||||
{
|
||||
|
@ -899,7 +860,6 @@ bufinit(struct buf *buf, struct request *rq, struct bio *bio)
|
|||
buf->rq = rq;
|
||||
buf->bio = bio;
|
||||
buf->iter = bio->bi_iter;
|
||||
bio_pageinc(bio);
|
||||
}
|
||||
|
||||
static struct buf *
|
||||
|
@ -1127,7 +1087,6 @@ aoe_end_buf(struct aoedev *d, struct buf *buf)
|
|||
if (buf == d->ip.buf)
|
||||
d->ip.buf = NULL;
|
||||
rq = buf->rq;
|
||||
bio_pagedec(buf->bio);
|
||||
mempool_free(buf, d->bufpool);
|
||||
n = (unsigned long) rq->special;
|
||||
rq->special = (void *) --n;
|
||||
|
|
|
@ -1871,7 +1871,7 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock,
|
|||
drbd_update_congested(connection);
|
||||
}
|
||||
do {
|
||||
rv = kernel_sendmsg(sock, &msg, &iov, 1, size);
|
||||
rv = kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len);
|
||||
if (rv == -EAGAIN) {
|
||||
if (we_should_drop_the_connection(connection, sock))
|
||||
break;
|
||||
|
|
|
@ -599,7 +599,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd,
|
|||
return -EINVAL;
|
||||
|
||||
sreq = blk_mq_alloc_request(bdev_get_queue(bdev), WRITE, 0);
|
||||
if (!sreq)
|
||||
if (IS_ERR(sreq))
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_unlock(&nbd->tx_lock);
|
||||
|
|
|
@ -748,10 +748,7 @@ static int pp_release(struct inode *inode, struct file *file)
|
|||
}
|
||||
|
||||
if (pp->pdev) {
|
||||
const char *name = pp->pdev->name;
|
||||
|
||||
parport_unregister_device(pp->pdev);
|
||||
kfree(name);
|
||||
pp->pdev = NULL;
|
||||
pr_debug(CHRDEV "%x: unregistered pardevice\n", minor);
|
||||
}
|
||||
|
|
|
@ -700,6 +700,7 @@ static struct clk * __init create_mux_common(struct clockgen *cg,
|
|||
struct mux_hwclock *hwc,
|
||||
const struct clk_ops *ops,
|
||||
unsigned long min_rate,
|
||||
unsigned long max_rate,
|
||||
unsigned long pct80_rate,
|
||||
const char *fmt, int idx)
|
||||
{
|
||||
|
@ -728,6 +729,8 @@ static struct clk * __init create_mux_common(struct clockgen *cg,
|
|||
continue;
|
||||
if (rate < min_rate)
|
||||
continue;
|
||||
if (rate > max_rate)
|
||||
continue;
|
||||
|
||||
parent_names[j] = div->name;
|
||||
hwc->parent_to_clksel[j] = i;
|
||||
|
@ -759,7 +762,7 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
|
|||
struct mux_hwclock *hwc;
|
||||
const struct clockgen_pll_div *div;
|
||||
unsigned long plat_rate, min_rate;
|
||||
u64 pct80_rate;
|
||||
u64 max_rate, pct80_rate;
|
||||
u32 clksel;
|
||||
|
||||
hwc = kzalloc(sizeof(*hwc), GFP_KERNEL);
|
||||
|
@ -787,8 +790,8 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
pct80_rate = clk_get_rate(div->clk);
|
||||
pct80_rate *= 8;
|
||||
max_rate = clk_get_rate(div->clk);
|
||||
pct80_rate = max_rate * 8;
|
||||
do_div(pct80_rate, 10);
|
||||
|
||||
plat_rate = clk_get_rate(cg->pll[PLATFORM_PLL].div[PLL_DIV1].clk);
|
||||
|
@ -798,7 +801,7 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
|
|||
else
|
||||
min_rate = plat_rate / 2;
|
||||
|
||||
return create_mux_common(cg, hwc, &cmux_ops, min_rate,
|
||||
return create_mux_common(cg, hwc, &cmux_ops, min_rate, max_rate,
|
||||
pct80_rate, "cg-cmux%d", idx);
|
||||
}
|
||||
|
||||
|
@ -813,7 +816,7 @@ static struct clk * __init create_one_hwaccel(struct clockgen *cg, int idx)
|
|||
hwc->reg = cg->regs + 0x20 * idx + 0x10;
|
||||
hwc->info = cg->info.hwaccel[idx];
|
||||
|
||||
return create_mux_common(cg, hwc, &hwaccel_ops, 0, 0,
|
||||
return create_mux_common(cg, hwc, &hwaccel_ops, 0, ULONG_MAX, 0,
|
||||
"cg-hwaccel%d", idx);
|
||||
}
|
||||
|
||||
|
|
|
@ -463,22 +463,20 @@ static int xgene_clk_enable(struct clk_hw *hw)
|
|||
struct xgene_clk *pclk = to_xgene_clk(hw);
|
||||
unsigned long flags = 0;
|
||||
u32 data;
|
||||
phys_addr_t reg;
|
||||
|
||||
if (pclk->lock)
|
||||
spin_lock_irqsave(pclk->lock, flags);
|
||||
|
||||
if (pclk->param.csr_reg != NULL) {
|
||||
pr_debug("%s clock enabled\n", clk_hw_get_name(hw));
|
||||
reg = __pa(pclk->param.csr_reg);
|
||||
/* First enable the clock */
|
||||
data = xgene_clk_read(pclk->param.csr_reg +
|
||||
pclk->param.reg_clk_offset);
|
||||
data |= pclk->param.reg_clk_mask;
|
||||
xgene_clk_write(data, pclk->param.csr_reg +
|
||||
pclk->param.reg_clk_offset);
|
||||
pr_debug("%s clock PADDR base %pa clk offset 0x%08X mask 0x%08X value 0x%08X\n",
|
||||
clk_hw_get_name(hw), ®,
|
||||
pr_debug("%s clk offset 0x%08X mask 0x%08X value 0x%08X\n",
|
||||
clk_hw_get_name(hw),
|
||||
pclk->param.reg_clk_offset, pclk->param.reg_clk_mask,
|
||||
data);
|
||||
|
||||
|
@ -488,8 +486,8 @@ static int xgene_clk_enable(struct clk_hw *hw)
|
|||
data &= ~pclk->param.reg_csr_mask;
|
||||
xgene_clk_write(data, pclk->param.csr_reg +
|
||||
pclk->param.reg_csr_offset);
|
||||
pr_debug("%s CSR RESET PADDR base %pa csr offset 0x%08X mask 0x%08X value 0x%08X\n",
|
||||
clk_hw_get_name(hw), ®,
|
||||
pr_debug("%s csr offset 0x%08X mask 0x%08X value 0x%08X\n",
|
||||
clk_hw_get_name(hw),
|
||||
pclk->param.reg_csr_offset, pclk->param.reg_csr_mask,
|
||||
data);
|
||||
}
|
||||
|
|
|
@ -223,7 +223,7 @@ static unsigned long clk_pllv3_av_recalc_rate(struct clk_hw *hw,
|
|||
temp64 *= mfn;
|
||||
do_div(temp64, mfd);
|
||||
|
||||
return (parent_rate * div) + (u32)temp64;
|
||||
return parent_rate * div + (unsigned long)temp64;
|
||||
}
|
||||
|
||||
static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||
|
@ -247,7 +247,11 @@ static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate,
|
|||
do_div(temp64, parent_rate);
|
||||
mfn = temp64;
|
||||
|
||||
return parent_rate * div + parent_rate * mfn / mfd;
|
||||
temp64 = (u64)parent_rate;
|
||||
temp64 *= mfn;
|
||||
do_div(temp64, mfd);
|
||||
|
||||
return parent_rate * div + (unsigned long)temp64;
|
||||
}
|
||||
|
||||
static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
|
|
|
@ -313,7 +313,7 @@ static void __init mmp2_clk_init(struct device_node *np)
|
|||
}
|
||||
|
||||
pxa_unit->apmu_base = of_iomap(np, 1);
|
||||
if (!pxa_unit->mpmu_base) {
|
||||
if (!pxa_unit->apmu_base) {
|
||||
pr_err("failed to map apmu registers\n");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -262,7 +262,7 @@ static void __init pxa168_clk_init(struct device_node *np)
|
|||
}
|
||||
|
||||
pxa_unit->apmu_base = of_iomap(np, 1);
|
||||
if (!pxa_unit->mpmu_base) {
|
||||
if (!pxa_unit->apmu_base) {
|
||||
pr_err("failed to map apmu registers\n");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -282,7 +282,7 @@ static void __init pxa910_clk_init(struct device_node *np)
|
|||
}
|
||||
|
||||
pxa_unit->apmu_base = of_iomap(np, 1);
|
||||
if (!pxa_unit->mpmu_base) {
|
||||
if (!pxa_unit->apmu_base) {
|
||||
pr_err("failed to map apmu registers\n");
|
||||
return;
|
||||
}
|
||||
|
@ -294,7 +294,7 @@ static void __init pxa910_clk_init(struct device_node *np)
|
|||
}
|
||||
|
||||
pxa_unit->apbcp_base = of_iomap(np, 3);
|
||||
if (!pxa_unit->mpmu_base) {
|
||||
if (!pxa_unit->apbcp_base) {
|
||||
pr_err("failed to map apbcp registers\n");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -144,11 +144,8 @@ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,
|
|||
ddrclk->ddr_flag = ddr_flag;
|
||||
|
||||
clk = clk_register(NULL, &ddrclk->hw);
|
||||
if (IS_ERR(clk)) {
|
||||
pr_err("%s: could not register ddrclk %s\n", __func__, name);
|
||||
if (IS_ERR(clk))
|
||||
kfree(ddrclk);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
|
|
@ -132,28 +132,34 @@ static void __init exynos_clkout_init(struct device_node *node, u32 mux_mask)
|
|||
pr_err("%s: failed to register clkout clock\n", __func__);
|
||||
}
|
||||
|
||||
/*
|
||||
* We use CLK_OF_DECLARE_DRIVER initialization method to avoid setting
|
||||
* the OF_POPULATED flag on the pmu device tree node, so later the
|
||||
* Exynos PMU platform device can be properly probed with PMU driver.
|
||||
*/
|
||||
|
||||
static void __init exynos4_clkout_init(struct device_node *node)
|
||||
{
|
||||
exynos_clkout_init(node, EXYNOS4_CLKOUT_MUX_MASK);
|
||||
}
|
||||
CLK_OF_DECLARE(exynos4210_clkout, "samsung,exynos4210-pmu",
|
||||
CLK_OF_DECLARE_DRIVER(exynos4210_clkout, "samsung,exynos4210-pmu",
|
||||
exynos4_clkout_init);
|
||||
CLK_OF_DECLARE(exynos4212_clkout, "samsung,exynos4212-pmu",
|
||||
CLK_OF_DECLARE_DRIVER(exynos4212_clkout, "samsung,exynos4212-pmu",
|
||||
exynos4_clkout_init);
|
||||
CLK_OF_DECLARE(exynos4412_clkout, "samsung,exynos4412-pmu",
|
||||
CLK_OF_DECLARE_DRIVER(exynos4412_clkout, "samsung,exynos4412-pmu",
|
||||
exynos4_clkout_init);
|
||||
CLK_OF_DECLARE(exynos3250_clkout, "samsung,exynos3250-pmu",
|
||||
CLK_OF_DECLARE_DRIVER(exynos3250_clkout, "samsung,exynos3250-pmu",
|
||||
exynos4_clkout_init);
|
||||
|
||||
static void __init exynos5_clkout_init(struct device_node *node)
|
||||
{
|
||||
exynos_clkout_init(node, EXYNOS5_CLKOUT_MUX_MASK);
|
||||
}
|
||||
CLK_OF_DECLARE(exynos5250_clkout, "samsung,exynos5250-pmu",
|
||||
CLK_OF_DECLARE_DRIVER(exynos5250_clkout, "samsung,exynos5250-pmu",
|
||||
exynos5_clkout_init);
|
||||
CLK_OF_DECLARE(exynos5410_clkout, "samsung,exynos5410-pmu",
|
||||
CLK_OF_DECLARE_DRIVER(exynos5410_clkout, "samsung,exynos5410-pmu",
|
||||
exynos5_clkout_init);
|
||||
CLK_OF_DECLARE(exynos5420_clkout, "samsung,exynos5420-pmu",
|
||||
CLK_OF_DECLARE_DRIVER(exynos5420_clkout, "samsung,exynos5420-pmu",
|
||||
exynos5_clkout_init);
|
||||
CLK_OF_DECLARE(exynos5433_clkout, "samsung,exynos5433-pmu",
|
||||
CLK_OF_DECLARE_DRIVER(exynos5433_clkout, "samsung,exynos5433-pmu",
|
||||
exynos5_clkout_init);
|
||||
|
|
|
@ -395,9 +395,12 @@ static int acp_hw_fini(void *handle)
|
|||
{
|
||||
int i, ret;
|
||||
struct device *dev;
|
||||
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
|
||||
/* return early if no ACP */
|
||||
if (!adev->acp.acp_genpd)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < ACP_DEVS ; i++) {
|
||||
dev = get_mfd_cell_dev(adev->acp.acp_cell[i].name, i);
|
||||
ret = pm_genpd_remove_device(&adev->acp.acp_genpd->gpd, dev);
|
||||
|
|
|
@ -809,10 +809,19 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
|
|||
if (!adev->pm.fw) {
|
||||
switch (adev->asic_type) {
|
||||
case CHIP_TOPAZ:
|
||||
strcpy(fw_name, "amdgpu/topaz_smc.bin");
|
||||
if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) ||
|
||||
((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) ||
|
||||
((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87)))
|
||||
strcpy(fw_name, "amdgpu/topaz_k_smc.bin");
|
||||
else
|
||||
strcpy(fw_name, "amdgpu/topaz_smc.bin");
|
||||
break;
|
||||
case CHIP_TONGA:
|
||||
strcpy(fw_name, "amdgpu/tonga_smc.bin");
|
||||
if (((adev->pdev->device == 0x6939) && (adev->pdev->revision == 0xf1)) ||
|
||||
((adev->pdev->device == 0x6938) && (adev->pdev->revision == 0xf1)))
|
||||
strcpy(fw_name, "amdgpu/tonga_k_smc.bin");
|
||||
else
|
||||
strcpy(fw_name, "amdgpu/tonga_smc.bin");
|
||||
break;
|
||||
case CHIP_FIJI:
|
||||
strcpy(fw_name, "amdgpu/fiji_smc.bin");
|
||||
|
|
|
@ -769,7 +769,7 @@ static void amdgpu_connector_unregister(struct drm_connector *connector)
|
|||
{
|
||||
struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
|
||||
|
||||
if (amdgpu_connector->ddc_bus->has_aux) {
|
||||
if (amdgpu_connector->ddc_bus && amdgpu_connector->ddc_bus->has_aux) {
|
||||
drm_dp_aux_unregister(&amdgpu_connector->ddc_bus->aux);
|
||||
amdgpu_connector->ddc_bus->has_aux = false;
|
||||
}
|
||||
|
|
|
@ -742,8 +742,20 @@ static struct pci_driver amdgpu_kms_pci_driver = {
|
|||
|
||||
static int __init amdgpu_init(void)
|
||||
{
|
||||
amdgpu_sync_init();
|
||||
amdgpu_fence_slab_init();
|
||||
int r;
|
||||
|
||||
r = amdgpu_sync_init();
|
||||
if (r)
|
||||
goto error_sync;
|
||||
|
||||
r = amdgpu_fence_slab_init();
|
||||
if (r)
|
||||
goto error_fence;
|
||||
|
||||
r = amd_sched_fence_slab_init();
|
||||
if (r)
|
||||
goto error_sched;
|
||||
|
||||
if (vgacon_text_force()) {
|
||||
DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n");
|
||||
return -EINVAL;
|
||||
|
@ -755,6 +767,15 @@ static int __init amdgpu_init(void)
|
|||
amdgpu_register_atpx_handler();
|
||||
/* let modprobe override vga console setting */
|
||||
return drm_pci_init(driver, pdriver);
|
||||
|
||||
error_sched:
|
||||
amdgpu_fence_slab_fini();
|
||||
|
||||
error_fence:
|
||||
amdgpu_sync_fini();
|
||||
|
||||
error_sync:
|
||||
return r;
|
||||
}
|
||||
|
||||
static void __exit amdgpu_exit(void)
|
||||
|
@ -763,6 +784,7 @@ static void __exit amdgpu_exit(void)
|
|||
drm_pci_exit(driver, pdriver);
|
||||
amdgpu_unregister_atpx_handler();
|
||||
amdgpu_sync_fini();
|
||||
amd_sched_fence_slab_fini();
|
||||
amdgpu_fence_slab_fini();
|
||||
}
|
||||
|
||||
|
|
|
@ -99,6 +99,8 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
|
|||
|
||||
if ((amdgpu_runtime_pm != 0) &&
|
||||
amdgpu_has_atpx() &&
|
||||
(amdgpu_is_atpx_hybrid() ||
|
||||
amdgpu_has_atpx_dgpu_power_cntl()) &&
|
||||
((flags & AMD_IS_APU) == 0))
|
||||
flags |= AMD_IS_PX;
|
||||
|
||||
|
|
|
@ -80,7 +80,9 @@
|
|||
#include "dce_virtual.h"
|
||||
|
||||
MODULE_FIRMWARE("amdgpu/topaz_smc.bin");
|
||||
MODULE_FIRMWARE("amdgpu/topaz_k_smc.bin");
|
||||
MODULE_FIRMWARE("amdgpu/tonga_smc.bin");
|
||||
MODULE_FIRMWARE("amdgpu/tonga_k_smc.bin");
|
||||
MODULE_FIRMWARE("amdgpu/fiji_smc.bin");
|
||||
MODULE_FIRMWARE("amdgpu/polaris10_smc.bin");
|
||||
MODULE_FIRMWARE("amdgpu/polaris10_smc_sk.bin");
|
||||
|
|
|
@ -272,7 +272,7 @@ bool phm_check_smc_update_required_for_display_configuration(struct pp_hwmgr *hw
|
|||
PHM_FUNC_CHECK(hwmgr);
|
||||
|
||||
if (hwmgr->hwmgr_func->check_smc_update_required_for_display_configuration == NULL)
|
||||
return -EINVAL;
|
||||
return false;
|
||||
|
||||
return hwmgr->hwmgr_func->check_smc_update_required_for_display_configuration(hwmgr);
|
||||
}
|
||||
|
|
|
@ -710,8 +710,10 @@ int phm_get_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_type,
|
|||
uint32_t vol;
|
||||
int ret = 0;
|
||||
|
||||
if (hwmgr->chip_id < CHIP_POLARIS10) {
|
||||
atomctrl_get_voltage_evv_on_sclk(hwmgr, voltage_type, sclk, id, voltage);
|
||||
if (hwmgr->chip_id < CHIP_TONGA) {
|
||||
ret = atomctrl_get_voltage_evv(hwmgr, id, voltage);
|
||||
} else if (hwmgr->chip_id < CHIP_POLARIS10) {
|
||||
ret = atomctrl_get_voltage_evv_on_sclk(hwmgr, voltage_type, sclk, id, voltage);
|
||||
if (*voltage >= 2000 || *voltage == 0)
|
||||
*voltage = 1150;
|
||||
} else {
|
||||
|
|
|
@ -1474,19 +1474,19 @@ static int smu7_get_evv_voltages(struct pp_hwmgr *hwmgr)
|
|||
struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table = NULL;
|
||||
|
||||
|
||||
if (table_info == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
sclk_table = table_info->vdd_dep_on_sclk;
|
||||
|
||||
for (i = 0; i < SMU7_MAX_LEAKAGE_COUNT; i++) {
|
||||
vv_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i;
|
||||
|
||||
if (data->vdd_gfx_control == SMU7_VOLTAGE_CONTROL_BY_SVID2) {
|
||||
if (0 == phm_get_sclk_for_voltage_evv(hwmgr,
|
||||
if ((hwmgr->pp_table_version == PP_TABLE_V1)
|
||||
&& !phm_get_sclk_for_voltage_evv(hwmgr,
|
||||
table_info->vddgfx_lookup_table, vv_id, &sclk)) {
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_ClockStretcher)) {
|
||||
if (table_info == NULL)
|
||||
return -EINVAL;
|
||||
sclk_table = table_info->vdd_dep_on_sclk;
|
||||
|
||||
for (j = 1; j < sclk_table->count; j++) {
|
||||
if (sclk_table->entries[j].clk == sclk &&
|
||||
sclk_table->entries[j].cks_enable == 0) {
|
||||
|
@ -1512,12 +1512,15 @@ static int smu7_get_evv_voltages(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
if ((hwmgr->pp_table_version == PP_TABLE_V0)
|
||||
|| !phm_get_sclk_for_voltage_evv(hwmgr,
|
||||
table_info->vddc_lookup_table, vv_id, &sclk)) {
|
||||
if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
|
||||
PHM_PlatformCaps_ClockStretcher)) {
|
||||
if (table_info == NULL)
|
||||
return -EINVAL;
|
||||
sclk_table = table_info->vdd_dep_on_sclk;
|
||||
|
||||
for (j = 1; j < sclk_table->count; j++) {
|
||||
if (sclk_table->entries[j].clk == sclk &&
|
||||
sclk_table->entries[j].cks_enable == 0) {
|
||||
|
@ -2147,9 +2150,11 @@ static int smu7_patch_limits_vddc(struct pp_hwmgr *hwmgr,
|
|||
struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (tab) {
|
||||
vddc = tab->vddc;
|
||||
smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, &vddc,
|
||||
&data->vddc_leakage);
|
||||
tab->vddc = vddc;
|
||||
vddci = tab->vddci;
|
||||
smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, &vddci,
|
||||
&data->vddci_leakage);
|
||||
tab->vddci = vddci;
|
||||
|
@ -4247,18 +4252,26 @@ static int smu7_get_sclks(struct pp_hwmgr *hwmgr, struct amd_pp_clocks *clocks)
|
|||
{
|
||||
struct phm_ppt_v1_information *table_info =
|
||||
(struct phm_ppt_v1_information *)hwmgr->pptable;
|
||||
struct phm_ppt_v1_clock_voltage_dependency_table *dep_sclk_table;
|
||||
struct phm_ppt_v1_clock_voltage_dependency_table *dep_sclk_table = NULL;
|
||||
struct phm_clock_voltage_dependency_table *sclk_table;
|
||||
int i;
|
||||
|
||||
if (table_info == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
dep_sclk_table = table_info->vdd_dep_on_sclk;
|
||||
|
||||
for (i = 0; i < dep_sclk_table->count; i++) {
|
||||
clocks->clock[i] = dep_sclk_table->entries[i].clk;
|
||||
clocks->count++;
|
||||
if (hwmgr->pp_table_version == PP_TABLE_V1) {
|
||||
if (table_info == NULL || table_info->vdd_dep_on_sclk == NULL)
|
||||
return -EINVAL;
|
||||
dep_sclk_table = table_info->vdd_dep_on_sclk;
|
||||
for (i = 0; i < dep_sclk_table->count; i++) {
|
||||
clocks->clock[i] = dep_sclk_table->entries[i].clk;
|
||||
clocks->count++;
|
||||
}
|
||||
} else if (hwmgr->pp_table_version == PP_TABLE_V0) {
|
||||
sclk_table = hwmgr->dyn_state.vddc_dependency_on_sclk;
|
||||
for (i = 0; i < sclk_table->count; i++) {
|
||||
clocks->clock[i] = sclk_table->entries[i].clk;
|
||||
clocks->count++;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -4280,17 +4293,24 @@ static int smu7_get_mclks(struct pp_hwmgr *hwmgr, struct amd_pp_clocks *clocks)
|
|||
(struct phm_ppt_v1_information *)hwmgr->pptable;
|
||||
struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table;
|
||||
int i;
|
||||
struct phm_clock_voltage_dependency_table *mclk_table;
|
||||
|
||||
if (table_info == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
dep_mclk_table = table_info->vdd_dep_on_mclk;
|
||||
|
||||
for (i = 0; i < dep_mclk_table->count; i++) {
|
||||
clocks->clock[i] = dep_mclk_table->entries[i].clk;
|
||||
clocks->latency[i] = smu7_get_mem_latency(hwmgr,
|
||||
if (hwmgr->pp_table_version == PP_TABLE_V1) {
|
||||
if (table_info == NULL)
|
||||
return -EINVAL;
|
||||
dep_mclk_table = table_info->vdd_dep_on_mclk;
|
||||
for (i = 0; i < dep_mclk_table->count; i++) {
|
||||
clocks->clock[i] = dep_mclk_table->entries[i].clk;
|
||||
clocks->latency[i] = smu7_get_mem_latency(hwmgr,
|
||||
dep_mclk_table->entries[i].clk);
|
||||
clocks->count++;
|
||||
clocks->count++;
|
||||
}
|
||||
} else if (hwmgr->pp_table_version == PP_TABLE_V0) {
|
||||
mclk_table = hwmgr->dyn_state.vddc_dependency_on_mclk;
|
||||
for (i = 0; i < mclk_table->count; i++) {
|
||||
clocks->clock[i] = mclk_table->entries[i].clk;
|
||||
clocks->count++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ int smu7_fan_ctrl_get_fan_speed_info(struct pp_hwmgr *hwmgr,
|
|||
struct phm_fan_speed_info *fan_speed_info)
|
||||
{
|
||||
if (hwmgr->thermal_controller.fanInfo.bNoFan)
|
||||
return 0;
|
||||
return -ENODEV;
|
||||
|
||||
fan_speed_info->supports_percent_read = true;
|
||||
fan_speed_info->supports_percent_write = true;
|
||||
|
@ -60,7 +60,7 @@ int smu7_fan_ctrl_get_fan_speed_percent(struct pp_hwmgr *hwmgr,
|
|||
uint64_t tmp64;
|
||||
|
||||
if (hwmgr->thermal_controller.fanInfo.bNoFan)
|
||||
return 0;
|
||||
return -ENODEV;
|
||||
|
||||
duty100 = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
CG_FDO_CTRL1, FMAX_DUTY100);
|
||||
|
@ -89,7 +89,7 @@ int smu7_fan_ctrl_get_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t *speed)
|
|||
if (hwmgr->thermal_controller.fanInfo.bNoFan ||
|
||||
(hwmgr->thermal_controller.fanInfo.
|
||||
ucTachometerPulsesPerRevolution == 0))
|
||||
return 0;
|
||||
return -ENODEV;
|
||||
|
||||
tach_period = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
|
||||
CG_TACH_STATUS, TACH_PERIOD);
|
||||
|
|
|
@ -34,9 +34,6 @@ static bool amd_sched_entity_is_ready(struct amd_sched_entity *entity);
|
|||
static void amd_sched_wakeup(struct amd_gpu_scheduler *sched);
|
||||
static void amd_sched_process_job(struct dma_fence *f, struct dma_fence_cb *cb);
|
||||
|
||||
struct kmem_cache *sched_fence_slab;
|
||||
atomic_t sched_fence_slab_ref = ATOMIC_INIT(0);
|
||||
|
||||
/* Initialize a given run queue struct */
|
||||
static void amd_sched_rq_init(struct amd_sched_rq *rq)
|
||||
{
|
||||
|
@ -619,13 +616,6 @@ int amd_sched_init(struct amd_gpu_scheduler *sched,
|
|||
INIT_LIST_HEAD(&sched->ring_mirror_list);
|
||||
spin_lock_init(&sched->job_list_lock);
|
||||
atomic_set(&sched->hw_rq_count, 0);
|
||||
if (atomic_inc_return(&sched_fence_slab_ref) == 1) {
|
||||
sched_fence_slab = kmem_cache_create(
|
||||
"amd_sched_fence", sizeof(struct amd_sched_fence), 0,
|
||||
SLAB_HWCACHE_ALIGN, NULL);
|
||||
if (!sched_fence_slab)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Each scheduler will run on a seperate kernel thread */
|
||||
sched->thread = kthread_run(amd_sched_main, sched, sched->name);
|
||||
|
@ -646,7 +636,4 @@ void amd_sched_fini(struct amd_gpu_scheduler *sched)
|
|||
{
|
||||
if (sched->thread)
|
||||
kthread_stop(sched->thread);
|
||||
rcu_barrier();
|
||||
if (atomic_dec_and_test(&sched_fence_slab_ref))
|
||||
kmem_cache_destroy(sched_fence_slab);
|
||||
}
|
||||
|
|
|
@ -30,9 +30,6 @@
|
|||
struct amd_gpu_scheduler;
|
||||
struct amd_sched_rq;
|
||||
|
||||
extern struct kmem_cache *sched_fence_slab;
|
||||
extern atomic_t sched_fence_slab_ref;
|
||||
|
||||
/**
|
||||
* A scheduler entity is a wrapper around a job queue or a group
|
||||
* of other entities. Entities take turns emitting jobs from their
|
||||
|
@ -145,6 +142,9 @@ void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
|
|||
struct amd_sched_entity *entity);
|
||||
void amd_sched_entity_push_job(struct amd_sched_job *sched_job);
|
||||
|
||||
int amd_sched_fence_slab_init(void);
|
||||
void amd_sched_fence_slab_fini(void);
|
||||
|
||||
struct amd_sched_fence *amd_sched_fence_create(
|
||||
struct amd_sched_entity *s_entity, void *owner);
|
||||
void amd_sched_fence_scheduled(struct amd_sched_fence *fence);
|
||||
|
|
|
@ -27,6 +27,25 @@
|
|||
#include <drm/drmP.h>
|
||||
#include "gpu_scheduler.h"
|
||||
|
||||
static struct kmem_cache *sched_fence_slab;
|
||||
|
||||
int amd_sched_fence_slab_init(void)
|
||||
{
|
||||
sched_fence_slab = kmem_cache_create(
|
||||
"amd_sched_fence", sizeof(struct amd_sched_fence), 0,
|
||||
SLAB_HWCACHE_ALIGN, NULL);
|
||||
if (!sched_fence_slab)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void amd_sched_fence_slab_fini(void)
|
||||
{
|
||||
rcu_barrier();
|
||||
kmem_cache_destroy(sched_fence_slab);
|
||||
}
|
||||
|
||||
struct amd_sched_fence *amd_sched_fence_create(struct amd_sched_entity *entity,
|
||||
void *owner)
|
||||
{
|
||||
|
|
|
@ -303,9 +303,10 @@ void drm_minor_release(struct drm_minor *minor)
|
|||
* callbacks implemented by the driver. The driver then needs to initialize all
|
||||
* the various subsystems for the drm device like memory management, vblank
|
||||
* handling, modesetting support and intial output configuration plus obviously
|
||||
* initialize all the corresponding hardware bits. Finally when everything is up
|
||||
* and running and ready for userspace the device instance can be published
|
||||
* using drm_dev_register().
|
||||
* initialize all the corresponding hardware bits. An important part of this is
|
||||
* also calling drm_dev_set_unique() to set the userspace-visible unique name of
|
||||
* this device instance. Finally when everything is up and running and ready for
|
||||
* userspace the device instance can be published using drm_dev_register().
|
||||
*
|
||||
* There is also deprecated support for initalizing device instances using
|
||||
* bus-specific helpers and the ->load() callback. But due to
|
||||
|
@ -327,17 +328,6 @@ void drm_minor_release(struct drm_minor *minor)
|
|||
* dev_priv field of &drm_device.
|
||||
*/
|
||||
|
||||
static int drm_dev_set_unique(struct drm_device *dev, const char *name)
|
||||
{
|
||||
if (!name)
|
||||
return -EINVAL;
|
||||
|
||||
kfree(dev->unique);
|
||||
dev->unique = kstrdup(name, GFP_KERNEL);
|
||||
|
||||
return dev->unique ? 0 : -ENOMEM;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_put_dev - Unregister and release a DRM device
|
||||
* @dev: DRM device
|
||||
|
@ -760,6 +750,26 @@ void drm_dev_unregister(struct drm_device *dev)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_dev_unregister);
|
||||
|
||||
/**
|
||||
* drm_dev_set_unique - Set the unique name of a DRM device
|
||||
* @dev: device of which to set the unique name
|
||||
* @name: unique name
|
||||
*
|
||||
* Sets the unique name of a DRM device using the specified string. Drivers
|
||||
* can use this at driver probe time if the unique name of the devices they
|
||||
* drive is static.
|
||||
*
|
||||
* Return: 0 on success or a negative error code on failure.
|
||||
*/
|
||||
int drm_dev_set_unique(struct drm_device *dev, const char *name)
|
||||
{
|
||||
kfree(dev->unique);
|
||||
dev->unique = kstrdup(name, GFP_KERNEL);
|
||||
|
||||
return dev->unique ? 0 : -ENOMEM;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dev_set_unique);
|
||||
|
||||
/*
|
||||
* DRM Core
|
||||
* The DRM core module initializes all global DRM objects and makes them
|
||||
|
|
|
@ -68,6 +68,12 @@ static void ipu_crtc_atomic_disable(struct drm_crtc *crtc,
|
|||
|
||||
ipu_dc_disable_channel(ipu_crtc->dc);
|
||||
ipu_di_disable(ipu_crtc->di);
|
||||
/*
|
||||
* Planes must be disabled before DC clock is removed, as otherwise the
|
||||
* attached IDMACs will be left in undefined state, possibly hanging
|
||||
* the IPU or even system.
|
||||
*/
|
||||
drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, false);
|
||||
ipu_dc_disable(ipu);
|
||||
|
||||
spin_lock_irq(&crtc->dev->event_lock);
|
||||
|
@ -77,9 +83,6 @@ static void ipu_crtc_atomic_disable(struct drm_crtc *crtc,
|
|||
}
|
||||
spin_unlock_irq(&crtc->dev->event_lock);
|
||||
|
||||
/* always disable planes on the CRTC */
|
||||
drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, true);
|
||||
|
||||
drm_crtc_vblank_off(crtc);
|
||||
}
|
||||
|
||||
|
|
|
@ -139,6 +139,7 @@ struct msm_dsi_host {
|
|||
|
||||
u32 err_work_state;
|
||||
struct work_struct err_work;
|
||||
struct work_struct hpd_work;
|
||||
struct workqueue_struct *workqueue;
|
||||
|
||||
/* DSI 6G TX buffer*/
|
||||
|
@ -1294,6 +1295,14 @@ static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host)
|
|||
wmb(); /* make sure dsi controller enabled again */
|
||||
}
|
||||
|
||||
static void dsi_hpd_worker(struct work_struct *work)
|
||||
{
|
||||
struct msm_dsi_host *msm_host =
|
||||
container_of(work, struct msm_dsi_host, hpd_work);
|
||||
|
||||
drm_helper_hpd_irq_event(msm_host->dev);
|
||||
}
|
||||
|
||||
static void dsi_err_worker(struct work_struct *work)
|
||||
{
|
||||
struct msm_dsi_host *msm_host =
|
||||
|
@ -1480,7 +1489,7 @@ static int dsi_host_attach(struct mipi_dsi_host *host,
|
|||
|
||||
DBG("id=%d", msm_host->id);
|
||||
if (msm_host->dev)
|
||||
drm_helper_hpd_irq_event(msm_host->dev);
|
||||
queue_work(msm_host->workqueue, &msm_host->hpd_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1494,7 +1503,7 @@ static int dsi_host_detach(struct mipi_dsi_host *host,
|
|||
|
||||
DBG("id=%d", msm_host->id);
|
||||
if (msm_host->dev)
|
||||
drm_helper_hpd_irq_event(msm_host->dev);
|
||||
queue_work(msm_host->workqueue, &msm_host->hpd_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1748,6 +1757,7 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
|
|||
/* setup workqueue */
|
||||
msm_host->workqueue = alloc_ordered_workqueue("dsi_drm_work", 0);
|
||||
INIT_WORK(&msm_host->err_work, dsi_err_worker);
|
||||
INIT_WORK(&msm_host->hpd_work, dsi_hpd_worker);
|
||||
|
||||
msm_dsi->host = &msm_host->base;
|
||||
msm_dsi->id = msm_host->id;
|
||||
|
|
|
@ -521,6 +521,7 @@ static int pll_28nm_register(struct dsi_pll_28nm *pll_28nm)
|
|||
.parent_names = (const char *[]){ "xo" },
|
||||
.num_parents = 1,
|
||||
.name = vco_name,
|
||||
.flags = CLK_IGNORE_UNUSED,
|
||||
.ops = &clk_ops_dsi_pll_28nm_vco,
|
||||
};
|
||||
struct device *dev = &pll_28nm->pdev->dev;
|
||||
|
|
|
@ -412,6 +412,7 @@ static int pll_28nm_register(struct dsi_pll_28nm *pll_28nm)
|
|||
struct clk_init_data vco_init = {
|
||||
.parent_names = (const char *[]){ "pxo" },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_IGNORE_UNUSED,
|
||||
.ops = &clk_ops_dsi_pll_28nm_vco,
|
||||
};
|
||||
struct device *dev = &pll_28nm->pdev->dev;
|
||||
|
|
|
@ -702,6 +702,7 @@ static struct clk_init_data pll_init = {
|
|||
.ops = &hdmi_8996_pll_ops,
|
||||
.parent_names = hdmi_pll_parents,
|
||||
.num_parents = ARRAY_SIZE(hdmi_pll_parents),
|
||||
.flags = CLK_IGNORE_UNUSED,
|
||||
};
|
||||
|
||||
int msm_hdmi_pll_8996_init(struct platform_device *pdev)
|
||||
|
|
|
@ -424,6 +424,7 @@ static struct clk_init_data pll_init = {
|
|||
.ops = &hdmi_pll_ops,
|
||||
.parent_names = hdmi_pll_parents,
|
||||
.num_parents = ARRAY_SIZE(hdmi_pll_parents),
|
||||
.flags = CLK_IGNORE_UNUSED,
|
||||
};
|
||||
|
||||
int msm_hdmi_pll_8960_init(struct platform_device *pdev)
|
||||
|
|
|
@ -272,7 +272,7 @@ const struct mdp5_cfg_hw msm8x16_config = {
|
|||
.count = 2,
|
||||
.base = { 0x14000, 0x16000 },
|
||||
.caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
|
||||
MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION,
|
||||
MDP_PIPE_CAP_DECIMATION,
|
||||
},
|
||||
.pipe_dma = {
|
||||
.count = 1,
|
||||
|
@ -282,7 +282,7 @@ const struct mdp5_cfg_hw msm8x16_config = {
|
|||
.lm = {
|
||||
.count = 2, /* LM0 and LM3 */
|
||||
.base = { 0x44000, 0x47000 },
|
||||
.nb_stages = 5,
|
||||
.nb_stages = 8,
|
||||
.max_width = 2048,
|
||||
.max_height = 0xFFFF,
|
||||
},
|
||||
|
|
|
@ -223,12 +223,7 @@ static void blend_setup(struct drm_crtc *crtc)
|
|||
plane_cnt++;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there is no base layer, enable border color.
|
||||
* Although it's not possbile in current blend logic,
|
||||
* put it here as a reminder.
|
||||
*/
|
||||
if (!pstates[STAGE_BASE] && plane_cnt) {
|
||||
if (!pstates[STAGE_BASE]) {
|
||||
ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
|
||||
DBG("Border Color is enabled");
|
||||
}
|
||||
|
@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
|
|||
return pa->state->zpos - pb->state->zpos;
|
||||
}
|
||||
|
||||
/* is there a helper for this? */
|
||||
static bool is_fullscreen(struct drm_crtc_state *cstate,
|
||||
struct drm_plane_state *pstate)
|
||||
{
|
||||
return (pstate->crtc_x <= 0) && (pstate->crtc_y <= 0) &&
|
||||
((pstate->crtc_x + pstate->crtc_w) >= cstate->mode.hdisplay) &&
|
||||
((pstate->crtc_y + pstate->crtc_h) >= cstate->mode.vdisplay);
|
||||
}
|
||||
|
||||
static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *state)
|
||||
{
|
||||
|
@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
|
|||
struct plane_state pstates[STAGE_MAX + 1];
|
||||
const struct mdp5_cfg_hw *hw_cfg;
|
||||
const struct drm_plane_state *pstate;
|
||||
int cnt = 0, i;
|
||||
int cnt = 0, base = 0, i;
|
||||
|
||||
DBG("%s: check", mdp5_crtc->name);
|
||||
|
||||
/* verify that there are not too many planes attached to crtc
|
||||
* and that we don't have conflicting mixer stages:
|
||||
*/
|
||||
hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
|
||||
drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state) {
|
||||
if (cnt >= (hw_cfg->lm.nb_stages)) {
|
||||
dev_err(dev->dev, "too many planes!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
pstates[cnt].plane = plane;
|
||||
pstates[cnt].state = to_mdp5_plane_state(pstate);
|
||||
|
||||
|
@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
|
|||
/* assign a stage based on sorted zpos property */
|
||||
sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
|
||||
|
||||
/* if the bottom-most layer is not fullscreen, we need to use
|
||||
* it for solid-color:
|
||||
*/
|
||||
if ((cnt > 0) && !is_fullscreen(state, &pstates[0].state->base))
|
||||
base++;
|
||||
|
||||
/* verify that there are not too many planes attached to crtc
|
||||
* and that we don't have conflicting mixer stages:
|
||||
*/
|
||||
hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
|
||||
|
||||
if ((cnt + base) >= hw_cfg->lm.nb_stages) {
|
||||
dev_err(dev->dev, "too many planes!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < cnt; i++) {
|
||||
pstates[i].state->stage = STAGE_BASE + i;
|
||||
pstates[i].state->stage = STAGE_BASE + i + base;
|
||||
DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
|
||||
pipe2name(mdp5_plane_pipe(pstates[i].plane)),
|
||||
pstates[i].state->stage);
|
||||
|
|
|
@ -307,8 +307,7 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
|
|||
format = to_mdp_format(msm_framebuffer_format(state->fb));
|
||||
if (MDP_FORMAT_IS_YUV(format) &&
|
||||
!pipe_supports_yuv(mdp5_plane->caps)) {
|
||||
dev_err(plane->dev->dev,
|
||||
"Pipe doesn't support YUV\n");
|
||||
DBG("Pipe doesn't support YUV\n");
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -316,8 +315,7 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
|
|||
if (!(mdp5_plane->caps & MDP_PIPE_CAP_SCALE) &&
|
||||
(((state->src_w >> 16) != state->crtc_w) ||
|
||||
((state->src_h >> 16) != state->crtc_h))) {
|
||||
dev_err(plane->dev->dev,
|
||||
"Pipe doesn't support scaling (%dx%d -> %dx%d)\n",
|
||||
DBG("Pipe doesn't support scaling (%dx%d -> %dx%d)\n",
|
||||
state->src_w >> 16, state->src_h >> 16,
|
||||
state->crtc_w, state->crtc_h);
|
||||
|
||||
|
@ -333,8 +331,7 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
|
|||
|
||||
if ((vflip && !(mdp5_plane->caps & MDP_PIPE_CAP_VFLIP)) ||
|
||||
(hflip && !(mdp5_plane->caps & MDP_PIPE_CAP_HFLIP))) {
|
||||
dev_err(plane->dev->dev,
|
||||
"Pipe doesn't support flip\n");
|
||||
DBG("Pipe doesn't support flip\n");
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -234,7 +234,7 @@ static int msm_drm_uninit(struct device *dev)
|
|||
flush_workqueue(priv->atomic_wq);
|
||||
destroy_workqueue(priv->atomic_wq);
|
||||
|
||||
if (kms)
|
||||
if (kms && kms->funcs)
|
||||
kms->funcs->destroy(kms);
|
||||
|
||||
if (gpu) {
|
||||
|
|
|
@ -163,6 +163,9 @@ void msm_gem_shrinker_init(struct drm_device *dev)
|
|||
void msm_gem_shrinker_cleanup(struct drm_device *dev)
|
||||
{
|
||||
struct msm_drm_private *priv = dev->dev_private;
|
||||
WARN_ON(unregister_vmap_purge_notifier(&priv->vmap_notifier));
|
||||
unregister_shrinker(&priv->shrinker);
|
||||
|
||||
if (priv->shrinker.nr_deferred) {
|
||||
WARN_ON(unregister_vmap_purge_notifier(&priv->vmap_notifier));
|
||||
unregister_shrinker(&priv->shrinker);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -578,7 +578,7 @@ int qxl_hw_surface_dealloc(struct qxl_device *qdev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf)
|
||||
static int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf)
|
||||
{
|
||||
struct qxl_rect rect;
|
||||
int ret;
|
||||
|
|
|
@ -36,7 +36,7 @@ static bool qxl_head_enabled(struct qxl_head *head)
|
|||
return head->width && head->height;
|
||||
}
|
||||
|
||||
void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count)
|
||||
static void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count)
|
||||
{
|
||||
if (qdev->client_monitors_config &&
|
||||
count > qdev->client_monitors_config->count) {
|
||||
|
@ -57,11 +57,18 @@ void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count)
|
|||
qdev->client_monitors_config->count = count;
|
||||
}
|
||||
|
||||
enum {
|
||||
MONITORS_CONFIG_MODIFIED,
|
||||
MONITORS_CONFIG_UNCHANGED,
|
||||
MONITORS_CONFIG_BAD_CRC,
|
||||
};
|
||||
|
||||
static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)
|
||||
{
|
||||
int i;
|
||||
int num_monitors;
|
||||
uint32_t crc;
|
||||
int status = MONITORS_CONFIG_UNCHANGED;
|
||||
|
||||
num_monitors = qdev->rom->client_monitors_config.count;
|
||||
crc = crc32(0, (const uint8_t *)&qdev->rom->client_monitors_config,
|
||||
|
@ -70,7 +77,7 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)
|
|||
qxl_io_log(qdev, "crc mismatch: have %X (%zd) != %X\n", crc,
|
||||
sizeof(qdev->rom->client_monitors_config),
|
||||
qdev->rom->client_monitors_config_crc);
|
||||
return 1;
|
||||
return MONITORS_CONFIG_BAD_CRC;
|
||||
}
|
||||
if (num_monitors > qdev->monitors_config->max_allowed) {
|
||||
DRM_DEBUG_KMS("client monitors list will be truncated: %d < %d\n",
|
||||
|
@ -79,6 +86,10 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)
|
|||
} else {
|
||||
num_monitors = qdev->rom->client_monitors_config.count;
|
||||
}
|
||||
if (qdev->client_monitors_config
|
||||
&& (num_monitors != qdev->client_monitors_config->count)) {
|
||||
status = MONITORS_CONFIG_MODIFIED;
|
||||
}
|
||||
qxl_alloc_client_monitors_config(qdev, num_monitors);
|
||||
/* we copy max from the client but it isn't used */
|
||||
qdev->client_monitors_config->max_allowed =
|
||||
|
@ -88,17 +99,39 @@ static int qxl_display_copy_rom_client_monitors_config(struct qxl_device *qdev)
|
|||
&qdev->rom->client_monitors_config.heads[i];
|
||||
struct qxl_head *client_head =
|
||||
&qdev->client_monitors_config->heads[i];
|
||||
client_head->x = c_rect->left;
|
||||
client_head->y = c_rect->top;
|
||||
client_head->width = c_rect->right - c_rect->left;
|
||||
client_head->height = c_rect->bottom - c_rect->top;
|
||||
client_head->surface_id = 0;
|
||||
client_head->id = i;
|
||||
client_head->flags = 0;
|
||||
if (client_head->x != c_rect->left) {
|
||||
client_head->x = c_rect->left;
|
||||
status = MONITORS_CONFIG_MODIFIED;
|
||||
}
|
||||
if (client_head->y != c_rect->top) {
|
||||
client_head->y = c_rect->top;
|
||||
status = MONITORS_CONFIG_MODIFIED;
|
||||
}
|
||||
if (client_head->width != c_rect->right - c_rect->left) {
|
||||
client_head->width = c_rect->right - c_rect->left;
|
||||
status = MONITORS_CONFIG_MODIFIED;
|
||||
}
|
||||
if (client_head->height != c_rect->bottom - c_rect->top) {
|
||||
client_head->height = c_rect->bottom - c_rect->top;
|
||||
status = MONITORS_CONFIG_MODIFIED;
|
||||
}
|
||||
if (client_head->surface_id != 0) {
|
||||
client_head->surface_id = 0;
|
||||
status = MONITORS_CONFIG_MODIFIED;
|
||||
}
|
||||
if (client_head->id != i) {
|
||||
client_head->id = i;
|
||||
status = MONITORS_CONFIG_MODIFIED;
|
||||
}
|
||||
if (client_head->flags != 0) {
|
||||
client_head->flags = 0;
|
||||
status = MONITORS_CONFIG_MODIFIED;
|
||||
}
|
||||
DRM_DEBUG_KMS("read %dx%d+%d+%d\n", client_head->width, client_head->height,
|
||||
client_head->x, client_head->y);
|
||||
}
|
||||
return 0;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static void qxl_update_offset_props(struct qxl_device *qdev)
|
||||
|
@ -124,9 +157,18 @@ void qxl_display_read_client_monitors_config(struct qxl_device *qdev)
|
|||
{
|
||||
|
||||
struct drm_device *dev = qdev->ddev;
|
||||
while (qxl_display_copy_rom_client_monitors_config(qdev)) {
|
||||
int status;
|
||||
|
||||
status = qxl_display_copy_rom_client_monitors_config(qdev);
|
||||
while (status == MONITORS_CONFIG_BAD_CRC) {
|
||||
qxl_io_log(qdev, "failed crc check for client_monitors_config,"
|
||||
" retrying\n");
|
||||
status = qxl_display_copy_rom_client_monitors_config(qdev);
|
||||
}
|
||||
if (status == MONITORS_CONFIG_UNCHANGED) {
|
||||
qxl_io_log(qdev, "config unchanged\n");
|
||||
DRM_DEBUG("ignoring unchanged client monitors config");
|
||||
return;
|
||||
}
|
||||
|
||||
drm_modeset_lock_all(dev);
|
||||
|
@ -157,6 +199,9 @@ static int qxl_add_monitors_config_modes(struct drm_connector *connector,
|
|||
mode = drm_cvt_mode(dev, head->width, head->height, 60, false, false,
|
||||
false);
|
||||
mode->type |= DRM_MODE_TYPE_PREFERRED;
|
||||
mode->hdisplay = head->width;
|
||||
mode->vdisplay = head->height;
|
||||
drm_mode_set_name(mode);
|
||||
*pwidth = head->width;
|
||||
*pheight = head->height;
|
||||
drm_mode_probed_add(connector, mode);
|
||||
|
@ -607,7 +652,7 @@ static bool qxl_crtc_mode_fixup(struct drm_crtc *crtc,
|
|||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
qxl_send_monitors_config(struct qxl_device *qdev)
|
||||
{
|
||||
int i;
|
||||
|
|
|
@ -395,16 +395,11 @@ qxl_framebuffer_init(struct drm_device *dev,
|
|||
struct drm_gem_object *obj,
|
||||
const struct drm_framebuffer_funcs *funcs);
|
||||
void qxl_display_read_client_monitors_config(struct qxl_device *qdev);
|
||||
void qxl_send_monitors_config(struct qxl_device *qdev);
|
||||
int qxl_create_monitors_object(struct qxl_device *qdev);
|
||||
int qxl_destroy_monitors_object(struct qxl_device *qdev);
|
||||
|
||||
/* used by qxl_debugfs only */
|
||||
void qxl_crtc_set_from_monitors_config(struct qxl_device *qdev);
|
||||
void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count);
|
||||
|
||||
/* qxl_gem.c */
|
||||
int qxl_gem_init(struct qxl_device *qdev);
|
||||
void qxl_gem_init(struct qxl_device *qdev);
|
||||
void qxl_gem_fini(struct qxl_device *qdev);
|
||||
int qxl_gem_object_create(struct qxl_device *qdev, int size,
|
||||
int alignment, int initial_domain,
|
||||
|
@ -574,6 +569,5 @@ int qxl_bo_check_id(struct qxl_device *qdev, struct qxl_bo *bo);
|
|||
struct qxl_drv_surface *
|
||||
qxl_surface_lookup(struct drm_device *dev, int surface_id);
|
||||
void qxl_surface_evict(struct qxl_device *qdev, struct qxl_bo *surf, bool freeing);
|
||||
int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -191,7 +191,7 @@ static int qxlfb_framebuffer_dirty(struct drm_framebuffer *fb,
|
|||
/*
|
||||
* we are using a shadow draw buffer, at qdev->surface0_shadow
|
||||
*/
|
||||
qxl_io_log(qdev, "dirty x[%d, %d], y[%d, %d]", clips->x1, clips->x2,
|
||||
qxl_io_log(qdev, "dirty x[%d, %d], y[%d, %d]\n", clips->x1, clips->x2,
|
||||
clips->y1, clips->y2);
|
||||
image->dx = clips->x1;
|
||||
image->dy = clips->y1;
|
||||
|
|
|
@ -111,10 +111,9 @@ void qxl_gem_object_close(struct drm_gem_object *obj,
|
|||
{
|
||||
}
|
||||
|
||||
int qxl_gem_init(struct qxl_device *qdev)
|
||||
void qxl_gem_init(struct qxl_device *qdev)
|
||||
{
|
||||
INIT_LIST_HEAD(&qdev->gem.objects);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void qxl_gem_fini(struct qxl_device *qdev)
|
||||
|
|
|
@ -131,7 +131,7 @@ static int qxl_device_init(struct qxl_device *qdev,
|
|||
mutex_init(&qdev->update_area_mutex);
|
||||
mutex_init(&qdev->release_mutex);
|
||||
mutex_init(&qdev->surf_evict_mutex);
|
||||
INIT_LIST_HEAD(&qdev->gem.objects);
|
||||
qxl_gem_init(qdev);
|
||||
|
||||
qdev->rom_base = pci_resource_start(pdev, 2);
|
||||
qdev->rom_size = pci_resource_len(pdev, 2);
|
||||
|
@ -273,6 +273,7 @@ static void qxl_device_fini(struct qxl_device *qdev)
|
|||
qxl_ring_free(qdev->command_ring);
|
||||
qxl_ring_free(qdev->cursor_ring);
|
||||
qxl_ring_free(qdev->release_ring);
|
||||
qxl_gem_fini(qdev);
|
||||
qxl_bo_fini(qdev);
|
||||
io_mapping_free(qdev->surface_mapping);
|
||||
io_mapping_free(qdev->vram_mapping);
|
||||
|
|
|
@ -931,7 +931,7 @@ static void radeon_connector_unregister(struct drm_connector *connector)
|
|||
{
|
||||
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
|
||||
|
||||
if (radeon_connector->ddc_bus->has_aux) {
|
||||
if (radeon_connector->ddc_bus && radeon_connector->ddc_bus->has_aux) {
|
||||
drm_dp_aux_unregister(&radeon_connector->ddc_bus->aux);
|
||||
radeon_connector->ddc_bus->has_aux = false;
|
||||
}
|
||||
|
|
|
@ -104,6 +104,14 @@ static const char radeon_family_name[][16] = {
|
|||
"LAST",
|
||||
};
|
||||
|
||||
#if defined(CONFIG_VGA_SWITCHEROO)
|
||||
bool radeon_has_atpx_dgpu_power_cntl(void);
|
||||
bool radeon_is_atpx_hybrid(void);
|
||||
#else
|
||||
static inline bool radeon_has_atpx_dgpu_power_cntl(void) { return false; }
|
||||
static inline bool radeon_is_atpx_hybrid(void) { return false; }
|
||||
#endif
|
||||
|
||||
#define RADEON_PX_QUIRK_DISABLE_PX (1 << 0)
|
||||
#define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1)
|
||||
|
||||
|
@ -160,6 +168,11 @@ static void radeon_device_handle_px_quirks(struct radeon_device *rdev)
|
|||
|
||||
if (rdev->px_quirk_flags & RADEON_PX_QUIRK_DISABLE_PX)
|
||||
rdev->flags &= ~RADEON_IS_PX;
|
||||
|
||||
/* disable PX is the system doesn't support dGPU power control or hybrid gfx */
|
||||
if (!radeon_is_atpx_hybrid() &&
|
||||
!radeon_has_atpx_dgpu_power_cntl())
|
||||
rdev->flags &= ~RADEON_IS_PX;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue