Linux v4.14.3 rebase
This commit is contained in:
parent
6f8cd48d50
commit
c5708d5b6e
|
@ -0,0 +1,46 @@
|
|||
From 37af97ef14c201b1db8dd341aabd262da23e48aa Mon Sep 17 00:00:00 2001
|
||||
From: Fedora Kernel Team <kernel-team@fedoraproject.org>
|
||||
Date: Mon, 30 Oct 2017 11:38:27 -0500
|
||||
Subject: [PATCH] [PATCH] staging: rtl8822be: fix wrong dma unmap len
|
||||
|
||||
Patch fixes splat:
|
||||
|
||||
r8822be 0000:04:00.0: DMA-API: device driver frees DMA memory with different size
|
||||
[device address=0x0000000078477000] [map size=4096 bytes] [unmap size=424 bytes]
|
||||
<snip>
|
||||
Call Trace:
|
||||
debug_dma_unmap_page+0xa5/0xb0
|
||||
? unmap_single+0x2f/0x40
|
||||
_rtl8822be_send_bcn_or_cmd_packet+0x2c5/0x300 [r8822be]
|
||||
? _rtl8822be_send_bcn_or_cmd_packet+0x2c5/0x300 [r8822be]
|
||||
rtl8822b_halmac_cb_write_data_rsvd_page+0x51/0xc0 [r8822be]
|
||||
_halmac_write_data_rsvd_page+0x22/0x30 [r8822be]
|
||||
halmac_download_rsvd_page_88xx+0xee/0x1f0 [r8822be]
|
||||
halmac_dlfw_to_mem_88xx+0x80/0x120 [r8822be]
|
||||
halmac_download_firmware_88xx.part.47+0x477/0x600 [r8822be]
|
||||
halmac_download_firmware_88xx+0x32/0x40 [r8822be]
|
||||
rtl_halmac_dlfw+0x70/0x120 [r8822be]
|
||||
rtl_halmac_init_hal+0x5f/0x1b0 [r8822be]
|
||||
rtl8822be_hw_init+0x8a2/0x1040 [r8822be]
|
||||
|
||||
Signed-off-by: Stanislaw Gruszka <sgruszka at redhat.com>
|
||||
---
|
||||
drivers/staging/rtlwifi/rtl8822be/fw.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/staging/rtlwifi/rtl8822be/fw.c b/drivers/staging/rtlwifi/rtl8822be/fw.c
|
||||
index 8e24da1..a2cc548 100644
|
||||
--- a/drivers/staging/rtlwifi/rtl8822be/fw.c
|
||||
+++ b/drivers/staging/rtlwifi/rtl8822be/fw.c
|
||||
@@ -419,7 +419,7 @@ static bool _rtl8822be_send_bcn_or_cmd_packet(struct ieee80211_hw *hw,
|
||||
dma_addr = rtlpriv->cfg->ops->get_desc(
|
||||
hw, (u8 *)pbd_desc, true, HW_DESC_TXBUFF_ADDR);
|
||||
|
||||
- pci_unmap_single(rtlpci->pdev, dma_addr, skb->len,
|
||||
+ pci_unmap_single(rtlpci->pdev, dma_addr, pskb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
kfree_skb(pskb);
|
||||
|
||||
--
|
||||
2.13.6
|
||||
|
|
@ -1,78 +0,0 @@
|
|||
From 075bb90dbb4d894938c5859e3850987238db9cd8 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Fri, 11 Aug 2017 22:30:55 +0200
|
||||
Subject: [PATCH 1/2] power: supply: max17042_battery: Add support for ACPI
|
||||
enumeration
|
||||
|
||||
Some x86 devices enumerate a max17047 fuel-gauge through a MAX17047
|
||||
ACPI firmware-node, add support for this.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
drivers/power/supply/max17042_battery.c | 22 +++++++++++++++++++++-
|
||||
1 file changed, 21 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c
|
||||
index aecaaa2b0586..b2ddb7eb69c6 100644
|
||||
--- a/drivers/power/supply/max17042_battery.c
|
||||
+++ b/drivers/power/supply/max17042_battery.c
|
||||
@@ -22,6 +22,7 @@
|
||||
* This driver is based on max17040_battery.c
|
||||
*/
|
||||
|
||||
+#include <linux/acpi.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -982,6 +983,8 @@ static int max17042_probe(struct i2c_client *client,
|
||||
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
|
||||
const struct power_supply_desc *max17042_desc = &max17042_psy_desc;
|
||||
struct power_supply_config psy_cfg = {};
|
||||
+ const struct acpi_device_id *acpi_id;
|
||||
+ struct device *dev = &client->dev;
|
||||
struct max17042_chip *chip;
|
||||
int ret;
|
||||
int i;
|
||||
@@ -995,7 +998,15 @@ static int max17042_probe(struct i2c_client *client,
|
||||
return -ENOMEM;
|
||||
|
||||
chip->client = client;
|
||||
- chip->chip_type = id->driver_data;
|
||||
+ if (id) {
|
||||
+ chip->chip_type = id->driver_data;
|
||||
+ } else {
|
||||
+ acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev);
|
||||
+ if (!acpi_id)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ chip->chip_type = acpi_id->driver_data;
|
||||
+ }
|
||||
chip->regmap = devm_regmap_init_i2c(client, &max17042_regmap_config);
|
||||
if (IS_ERR(chip->regmap)) {
|
||||
dev_err(&client->dev, "Failed to initialize regmap\n");
|
||||
@@ -1104,6 +1115,14 @@ static int max17042_resume(struct device *dev)
|
||||
static SIMPLE_DEV_PM_OPS(max17042_pm_ops, max17042_suspend,
|
||||
max17042_resume);
|
||||
|
||||
+#ifdef CONFIG_ACPI
|
||||
+static const struct acpi_device_id max17042_acpi_match[] = {
|
||||
+ { "MAX17047", MAXIM_DEVICE_TYPE_MAX17047 },
|
||||
+ { }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(acpi, max17042_acpi_match);
|
||||
+#endif
|
||||
+
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id max17042_dt_match[] = {
|
||||
{ .compatible = "maxim,max17042" },
|
||||
@@ -1125,6 +1144,7 @@ MODULE_DEVICE_TABLE(i2c, max17042_id);
|
||||
static struct i2c_driver max17042_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "max17042",
|
||||
+ .acpi_match_table = ACPI_PTR(max17042_acpi_match),
|
||||
.of_match_table = of_match_ptr(max17042_dt_match),
|
||||
.pm = &max17042_pm_ops,
|
||||
},
|
||||
--
|
||||
2.13.4
|
||||
|
|
@ -1,204 +0,0 @@
|
|||
From aca20afc84cf8578e044c67c4949672ac98f064a Mon Sep 17 00:00:00 2001
|
||||
From: Nicholas Piggin <npiggin@gmail.com>
|
||||
Date: Tue, 28 Nov 2017 11:26:54 +0100
|
||||
Subject: [PATCH 1/5] powerpc/64s/radix: Fix 128TB-512TB virtual address
|
||||
boundary case allocation
|
||||
|
||||
commit 85e3f1adcb9d49300b0a943bb93f9604be375bfb upstream.
|
||||
|
||||
Radix VA space allocations test addresses against mm->task_size which
|
||||
is 512TB, even in cases where the intention is to limit allocation to
|
||||
below 128TB.
|
||||
|
||||
This results in mmap with a hint address below 128TB but address +
|
||||
length above 128TB succeeding when it should fail (as hash does after
|
||||
the previous patch).
|
||||
|
||||
Set the high address limit to be considered up front, and base
|
||||
subsequent allocation checks on that consistently.
|
||||
|
||||
Fixes: f4ea6dcb08ea ("powerpc/mm: Enable mappings above 128TB")
|
||||
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
|
||||
Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
|
||||
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
arch/powerpc/mm/hugetlbpage-radix.c | 26 ++++++++++++------
|
||||
arch/powerpc/mm/mmap.c | 55 ++++++++++++++++++++++---------------
|
||||
2 files changed, 50 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/mm/hugetlbpage-radix.c b/arch/powerpc/mm/hugetlbpage-radix.c
|
||||
index a12e86395025..0a3d71aae175 100644
|
||||
--- a/arch/powerpc/mm/hugetlbpage-radix.c
|
||||
+++ b/arch/powerpc/mm/hugetlbpage-radix.c
|
||||
@@ -48,17 +48,28 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct *vma;
|
||||
struct hstate *h = hstate_file(file);
|
||||
+ int fixed = (flags & MAP_FIXED);
|
||||
+ unsigned long high_limit;
|
||||
struct vm_unmapped_area_info info;
|
||||
|
||||
- if (unlikely(addr > mm->context.addr_limit && addr < TASK_SIZE))
|
||||
- mm->context.addr_limit = TASK_SIZE;
|
||||
+ high_limit = DEFAULT_MAP_WINDOW;
|
||||
+ if (addr >= high_limit || (fixed && (addr + len > high_limit)))
|
||||
+ high_limit = TASK_SIZE;
|
||||
|
||||
if (len & ~huge_page_mask(h))
|
||||
return -EINVAL;
|
||||
- if (len > mm->task_size)
|
||||
+ if (len > high_limit)
|
||||
return -ENOMEM;
|
||||
+ if (fixed) {
|
||||
+ if (addr > high_limit - len)
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
|
||||
- if (flags & MAP_FIXED) {
|
||||
+ if (unlikely(addr > mm->context.addr_limit &&
|
||||
+ mm->context.addr_limit != TASK_SIZE))
|
||||
+ mm->context.addr_limit = TASK_SIZE;
|
||||
+
|
||||
+ if (fixed) {
|
||||
if (prepare_hugepage_range(file, addr, len))
|
||||
return -EINVAL;
|
||||
return addr;
|
||||
@@ -67,7 +78,7 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
|
||||
if (addr) {
|
||||
addr = ALIGN(addr, huge_page_size(h));
|
||||
vma = find_vma(mm, addr);
|
||||
- if (mm->task_size - len >= addr &&
|
||||
+ if (high_limit - len >= addr &&
|
||||
(!vma || addr + len <= vm_start_gap(vma)))
|
||||
return addr;
|
||||
}
|
||||
@@ -78,12 +89,9 @@ radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
|
||||
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
|
||||
info.length = len;
|
||||
info.low_limit = PAGE_SIZE;
|
||||
- info.high_limit = current->mm->mmap_base;
|
||||
+ info.high_limit = mm->mmap_base + (high_limit - DEFAULT_MAP_WINDOW);
|
||||
info.align_mask = PAGE_MASK & ~huge_page_mask(h);
|
||||
info.align_offset = 0;
|
||||
|
||||
- if (addr > DEFAULT_MAP_WINDOW)
|
||||
- info.high_limit += mm->context.addr_limit - DEFAULT_MAP_WINDOW;
|
||||
-
|
||||
return vm_unmapped_area(&info);
|
||||
}
|
||||
diff --git a/arch/powerpc/mm/mmap.c b/arch/powerpc/mm/mmap.c
|
||||
index 5d78b193fec4..6d476a7b5611 100644
|
||||
--- a/arch/powerpc/mm/mmap.c
|
||||
+++ b/arch/powerpc/mm/mmap.c
|
||||
@@ -106,22 +106,32 @@ radix__arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct *vma;
|
||||
+ int fixed = (flags & MAP_FIXED);
|
||||
+ unsigned long high_limit;
|
||||
struct vm_unmapped_area_info info;
|
||||
|
||||
+ high_limit = DEFAULT_MAP_WINDOW;
|
||||
+ if (addr >= high_limit || (fixed && (addr + len > high_limit)))
|
||||
+ high_limit = TASK_SIZE;
|
||||
+
|
||||
+ if (len > high_limit)
|
||||
+ return -ENOMEM;
|
||||
+ if (fixed) {
|
||||
+ if (addr > high_limit - len)
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
if (unlikely(addr > mm->context.addr_limit &&
|
||||
mm->context.addr_limit != TASK_SIZE))
|
||||
mm->context.addr_limit = TASK_SIZE;
|
||||
|
||||
- if (len > mm->task_size - mmap_min_addr)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- if (flags & MAP_FIXED)
|
||||
+ if (fixed)
|
||||
return addr;
|
||||
|
||||
if (addr) {
|
||||
addr = PAGE_ALIGN(addr);
|
||||
vma = find_vma(mm, addr);
|
||||
- if (mm->task_size - len >= addr && addr >= mmap_min_addr &&
|
||||
+ if (high_limit - len >= addr && addr >= mmap_min_addr &&
|
||||
(!vma || addr + len <= vm_start_gap(vma)))
|
||||
return addr;
|
||||
}
|
||||
@@ -129,13 +139,9 @@ radix__arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
||||
info.flags = 0;
|
||||
info.length = len;
|
||||
info.low_limit = mm->mmap_base;
|
||||
+ info.high_limit = high_limit;
|
||||
info.align_mask = 0;
|
||||
|
||||
- if (unlikely(addr > DEFAULT_MAP_WINDOW))
|
||||
- info.high_limit = mm->context.addr_limit;
|
||||
- else
|
||||
- info.high_limit = DEFAULT_MAP_WINDOW;
|
||||
-
|
||||
return vm_unmapped_area(&info);
|
||||
}
|
||||
|
||||
@@ -149,37 +155,42 @@ radix__arch_get_unmapped_area_topdown(struct file *filp,
|
||||
struct vm_area_struct *vma;
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long addr = addr0;
|
||||
+ int fixed = (flags & MAP_FIXED);
|
||||
+ unsigned long high_limit;
|
||||
struct vm_unmapped_area_info info;
|
||||
|
||||
+ high_limit = DEFAULT_MAP_WINDOW;
|
||||
+ if (addr >= high_limit || (fixed && (addr + len > high_limit)))
|
||||
+ high_limit = TASK_SIZE;
|
||||
+
|
||||
+ if (len > high_limit)
|
||||
+ return -ENOMEM;
|
||||
+ if (fixed) {
|
||||
+ if (addr > high_limit - len)
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
if (unlikely(addr > mm->context.addr_limit &&
|
||||
mm->context.addr_limit != TASK_SIZE))
|
||||
mm->context.addr_limit = TASK_SIZE;
|
||||
|
||||
- /* requested length too big for entire address space */
|
||||
- if (len > mm->task_size - mmap_min_addr)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- if (flags & MAP_FIXED)
|
||||
+ if (fixed)
|
||||
return addr;
|
||||
|
||||
- /* requesting a specific address */
|
||||
if (addr) {
|
||||
addr = PAGE_ALIGN(addr);
|
||||
vma = find_vma(mm, addr);
|
||||
- if (mm->task_size - len >= addr && addr >= mmap_min_addr &&
|
||||
- (!vma || addr + len <= vm_start_gap(vma)))
|
||||
+ if (high_limit - len >= addr && addr >= mmap_min_addr &&
|
||||
+ (!vma || addr + len <= vm_start_gap(vma)))
|
||||
return addr;
|
||||
}
|
||||
|
||||
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
|
||||
info.length = len;
|
||||
info.low_limit = max(PAGE_SIZE, mmap_min_addr);
|
||||
- info.high_limit = mm->mmap_base;
|
||||
+ info.high_limit = mm->mmap_base + (high_limit - DEFAULT_MAP_WINDOW);
|
||||
info.align_mask = 0;
|
||||
|
||||
- if (addr > DEFAULT_MAP_WINDOW)
|
||||
- info.high_limit += mm->context.addr_limit - DEFAULT_MAP_WINDOW;
|
||||
-
|
||||
addr = vm_unmapped_area(&info);
|
||||
if (!(addr & ~PAGE_MASK))
|
||||
return addr;
|
||||
--
|
||||
2.14.3
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
From 27b9d46d25c873b351757c44ce523bf0ede1d08e Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 14 Aug 2017 11:02:59 +0200
|
||||
Subject: [PATCH 2/2] power: supply: max17042_battery: Fix ACPI interrupt
|
||||
issues
|
||||
|
||||
On some x86/ACPI boards the DSDT defines an ACPI event handler for
|
||||
the max17047 IRQ, this causes several problems:
|
||||
|
||||
1) We need to share the IRQ to avoid an error getting it
|
||||
|
||||
2) Even of we are willing to share, we may fail to share because some
|
||||
DSDTs claim it exclusivly
|
||||
|
||||
3) If we are unable to share the IRQ, or the IRQ is only listed as an
|
||||
ACPI event source and not in the max1704 firmware node, then the
|
||||
charge threshold IRQ (which is used to give an IRQ every 1 percent
|
||||
charge change) becomes a problem, the ACPI event handler will not
|
||||
update this to the next 1 percent threshold, so the IRQ keeps firing
|
||||
and we get an IRQ storm pegging 1 CPU core.
|
||||
|
||||
This happens despite the max17042 driver not setting the charge
|
||||
threshold because Windows uses it and leaves it set on reboot.
|
||||
|
||||
So if we are unable to get the IRQ we need to reprogram the
|
||||
charge threshold to its disabled setting.
|
||||
|
||||
This commit fixes al of the above, while at it it also makes the error
|
||||
msg when being unable to get the IRQ consistent with other messages.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
drivers/power/supply/max17042_battery.c | 20 +++++++++++++++-----
|
||||
1 file changed, 15 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c
|
||||
index b2ddb7eb69c6..18a44e4ed6ff 100644
|
||||
--- a/drivers/power/supply/max17042_battery.c
|
||||
+++ b/drivers/power/supply/max17042_battery.c
|
||||
@@ -1050,11 +1050,18 @@ static int max17042_probe(struct i2c_client *client,
|
||||
}
|
||||
|
||||
if (client->irq) {
|
||||
+ unsigned int flags = IRQF_TRIGGER_FALLING | IRQF_ONESHOT;
|
||||
+
|
||||
+ /*
|
||||
+ * On ACPI systems the IRQ may be handled by ACPI-event code,
|
||||
+ * so we need to share (if the ACPI code is willing to share).
|
||||
+ */
|
||||
+ if (acpi_id)
|
||||
+ flags |= IRQF_SHARED | IRQF_PROBE_SHARED;
|
||||
+
|
||||
ret = devm_request_threaded_irq(&client->dev, client->irq,
|
||||
NULL,
|
||||
- max17042_thread_handler,
|
||||
- IRQF_TRIGGER_FALLING |
|
||||
- IRQF_ONESHOT,
|
||||
+ max17042_thread_handler, flags,
|
||||
chip->battery->desc->name,
|
||||
chip);
|
||||
if (!ret) {
|
||||
@@ -1064,10 +1071,13 @@ static int max17042_probe(struct i2c_client *client,
|
||||
max17042_set_soc_threshold(chip, 1);
|
||||
} else {
|
||||
client->irq = 0;
|
||||
- dev_err(&client->dev, "%s(): cannot get IRQ\n",
|
||||
- __func__);
|
||||
+ if (ret != -EBUSY)
|
||||
+ dev_err(&client->dev, "Failed to get IRQ\n");
|
||||
}
|
||||
}
|
||||
+ /* Not able to update the charge threshold when exceeded? -> disable */
|
||||
+ if (!client->irq)
|
||||
+ regmap_write(chip->regmap, MAX17042_SALRT_Th, 0xff00);
|
||||
|
||||
regmap_read(chip->regmap, MAX17042_STATUS, &val);
|
||||
if (val & STATUS_POR_BIT) {
|
||||
--
|
||||
2.13.4
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
From 75c7f5172c113af1ea3cf094436c9e03191673e0 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Date: Tue, 28 Nov 2017 11:26:55 +0100
|
||||
Subject: [PATCH 2/5] powerpc/64s/hash: Fix 512T hint detection to use >= 128T
|
||||
|
||||
commit 7ece370996b694ae263025e056ad785afc1be5ab upstream.
|
||||
|
||||
Currently userspace is able to request mmap() search between 128T-512T
|
||||
by specifying a hint address that is greater than 128T. But that means
|
||||
a hint of 128T exactly will return an address below 128T, which is
|
||||
confusing and wrong.
|
||||
|
||||
So fix the logic to check the hint is greater than *or equal* to 128T.
|
||||
|
||||
Fixes: f4ea6dcb08ea ("powerpc/mm: Enable mappings above 128TB")
|
||||
Suggested-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
|
||||
Suggested-by: Nicholas Piggin <npiggin@gmail.com>
|
||||
[mpe: Split out of Nick's bigger patch]
|
||||
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
arch/powerpc/mm/slice.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c
|
||||
index 45f6740dd407..48a5312103a1 100644
|
||||
--- a/arch/powerpc/mm/slice.c
|
||||
+++ b/arch/powerpc/mm/slice.c
|
||||
@@ -419,7 +419,7 @@ unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len,
|
||||
/*
|
||||
* Check if we need to expland slice area.
|
||||
*/
|
||||
- if (unlikely(addr > mm->context.addr_limit &&
|
||||
+ if (unlikely(addr >= mm->context.addr_limit &&
|
||||
mm->context.addr_limit != TASK_SIZE)) {
|
||||
mm->context.addr_limit = TASK_SIZE;
|
||||
on_each_cpu(slice_flush_segments, mm, 1);
|
||||
@@ -427,7 +427,7 @@ unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len,
|
||||
/*
|
||||
* This mmap request can allocate upt to 512TB
|
||||
*/
|
||||
- if (addr > DEFAULT_MAP_WINDOW)
|
||||
+ if (addr >= DEFAULT_MAP_WINDOW)
|
||||
high_limit = mm->context.addr_limit;
|
||||
else
|
||||
high_limit = DEFAULT_MAP_WINDOW;
|
||||
--
|
||||
2.14.3
|
||||
|
|
@ -1,129 +0,0 @@
|
|||
From e90387a8d2227f95bf5e5b5ffd816d48a87466e2 Mon Sep 17 00:00:00 2001
|
||||
From: Nicholas Piggin <npiggin@gmail.com>
|
||||
Date: Tue, 28 Nov 2017 11:26:56 +0100
|
||||
Subject: [PATCH 3/5] powerpc/64s/hash: Fix 128TB-512TB virtual address
|
||||
boundary case allocation
|
||||
|
||||
commit 6a72dc038b615229a1b285829d6c8378d15c2347 upstream.
|
||||
|
||||
When allocating VA space with a hint that crosses 128TB, the SLB
|
||||
addr_limit variable is not expanded if addr is not > 128TB, but the
|
||||
slice allocation looks at task_size, which is 512TB. This results in
|
||||
slice_check_fit() incorrectly succeeding because the slice_count
|
||||
truncates off bit 128 of the requested mask, so the comparison to the
|
||||
available mask succeeds.
|
||||
|
||||
Fix this by using mm->context.addr_limit instead of mm->task_size for
|
||||
testing allocation limits. This causes such allocations to fail.
|
||||
|
||||
Fixes: f4ea6dcb08ea ("powerpc/mm: Enable mappings above 128TB")
|
||||
Reported-by: Florian Weimer <fweimer@redhat.com>
|
||||
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
|
||||
Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
|
||||
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
arch/powerpc/mm/slice.c | 50 ++++++++++++++++++++++++-------------------------
|
||||
1 file changed, 24 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c
|
||||
index 48a5312103a1..3889201b560c 100644
|
||||
--- a/arch/powerpc/mm/slice.c
|
||||
+++ b/arch/powerpc/mm/slice.c
|
||||
@@ -96,7 +96,7 @@ static int slice_area_is_free(struct mm_struct *mm, unsigned long addr,
|
||||
{
|
||||
struct vm_area_struct *vma;
|
||||
|
||||
- if ((mm->task_size - len) < addr)
|
||||
+ if ((mm->context.addr_limit - len) < addr)
|
||||
return 0;
|
||||
vma = find_vma(mm, addr);
|
||||
return (!vma || (addr + len) <= vm_start_gap(vma));
|
||||
@@ -133,7 +133,7 @@ static void slice_mask_for_free(struct mm_struct *mm, struct slice_mask *ret)
|
||||
if (!slice_low_has_vma(mm, i))
|
||||
ret->low_slices |= 1u << i;
|
||||
|
||||
- if (mm->task_size <= SLICE_LOW_TOP)
|
||||
+ if (mm->context.addr_limit <= SLICE_LOW_TOP)
|
||||
return;
|
||||
|
||||
for (i = 0; i < GET_HIGH_SLICE_INDEX(mm->context.addr_limit); i++)
|
||||
@@ -412,25 +412,31 @@ unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len,
|
||||
struct slice_mask compat_mask;
|
||||
int fixed = (flags & MAP_FIXED);
|
||||
int pshift = max_t(int, mmu_psize_defs[psize].shift, PAGE_SHIFT);
|
||||
+ unsigned long page_size = 1UL << pshift;
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long newaddr;
|
||||
unsigned long high_limit;
|
||||
|
||||
- /*
|
||||
- * Check if we need to expland slice area.
|
||||
- */
|
||||
- if (unlikely(addr >= mm->context.addr_limit &&
|
||||
- mm->context.addr_limit != TASK_SIZE)) {
|
||||
- mm->context.addr_limit = TASK_SIZE;
|
||||
+ high_limit = DEFAULT_MAP_WINDOW;
|
||||
+ if (addr >= high_limit)
|
||||
+ high_limit = TASK_SIZE;
|
||||
+
|
||||
+ if (len > high_limit)
|
||||
+ return -ENOMEM;
|
||||
+ if (len & (page_size - 1))
|
||||
+ return -EINVAL;
|
||||
+ if (fixed) {
|
||||
+ if (addr & (page_size - 1))
|
||||
+ return -EINVAL;
|
||||
+ if (addr > high_limit - len)
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ if (high_limit > mm->context.addr_limit) {
|
||||
+ mm->context.addr_limit = high_limit;
|
||||
on_each_cpu(slice_flush_segments, mm, 1);
|
||||
}
|
||||
- /*
|
||||
- * This mmap request can allocate upt to 512TB
|
||||
- */
|
||||
- if (addr >= DEFAULT_MAP_WINDOW)
|
||||
- high_limit = mm->context.addr_limit;
|
||||
- else
|
||||
- high_limit = DEFAULT_MAP_WINDOW;
|
||||
+
|
||||
/*
|
||||
* init different masks
|
||||
*/
|
||||
@@ -446,27 +452,19 @@ unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len,
|
||||
|
||||
/* Sanity checks */
|
||||
BUG_ON(mm->task_size == 0);
|
||||
+ BUG_ON(mm->context.addr_limit == 0);
|
||||
VM_BUG_ON(radix_enabled());
|
||||
|
||||
slice_dbg("slice_get_unmapped_area(mm=%p, psize=%d...\n", mm, psize);
|
||||
slice_dbg(" addr=%lx, len=%lx, flags=%lx, topdown=%d\n",
|
||||
addr, len, flags, topdown);
|
||||
|
||||
- if (len > mm->task_size)
|
||||
- return -ENOMEM;
|
||||
- if (len & ((1ul << pshift) - 1))
|
||||
- return -EINVAL;
|
||||
- if (fixed && (addr & ((1ul << pshift) - 1)))
|
||||
- return -EINVAL;
|
||||
- if (fixed && addr > (mm->task_size - len))
|
||||
- return -ENOMEM;
|
||||
-
|
||||
/* If hint, make sure it matches our alignment restrictions */
|
||||
if (!fixed && addr) {
|
||||
- addr = _ALIGN_UP(addr, 1ul << pshift);
|
||||
+ addr = _ALIGN_UP(addr, page_size);
|
||||
slice_dbg(" aligned addr=%lx\n", addr);
|
||||
/* Ignore hint if it's too large or overlaps a VMA */
|
||||
- if (addr > mm->task_size - len ||
|
||||
+ if (addr > high_limit - len ||
|
||||
!slice_area_is_free(mm, addr, len))
|
||||
addr = 0;
|
||||
}
|
||||
--
|
||||
2.14.3
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
From fe50aa4374f20333d9b077bbe09397d38112b081 Mon Sep 17 00:00:00 2001
|
||||
From: Nicholas Piggin <npiggin@gmail.com>
|
||||
Date: Tue, 28 Nov 2017 11:26:57 +0100
|
||||
Subject: [PATCH 4/5] powerpc/64s/hash: Fix fork() with 512TB process address
|
||||
space
|
||||
|
||||
commit effc1b25088502fbd30305c79773de2d1f7470a6 upstream.
|
||||
|
||||
Hash unconditionally resets the addr_limit to default (128TB) when the
|
||||
mm context is initialised. If a process has > 128TB mappings when it
|
||||
forks, the child will not get the 512TB addr_limit, so accesses to
|
||||
valid > 128TB mappings will fail in the child.
|
||||
|
||||
Fix this by only resetting the addr_limit to default if it was 0. Non
|
||||
zero indicates it was duplicated from the parent (0 means exec()).
|
||||
|
||||
Fixes: f4ea6dcb08ea ("powerpc/mm: Enable mappings above 128TB")
|
||||
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
|
||||
Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
|
||||
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
arch/powerpc/mm/mmu_context_book3s64.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/mm/mmu_context_book3s64.c b/arch/powerpc/mm/mmu_context_book3s64.c
|
||||
index a75f63833284..bb9cdf01fc4f 100644
|
||||
--- a/arch/powerpc/mm/mmu_context_book3s64.c
|
||||
+++ b/arch/powerpc/mm/mmu_context_book3s64.c
|
||||
@@ -95,11 +95,11 @@ static int hash__init_new_context(struct mm_struct *mm)
|
||||
return index;
|
||||
|
||||
/*
|
||||
- * We do switch_slb() early in fork, even before we setup the
|
||||
- * mm->context.addr_limit. Default to max task size so that we copy the
|
||||
- * default values to paca which will help us to handle slb miss early.
|
||||
+ * In the case of exec, use the default limit,
|
||||
+ * otherwise inherit it from the mm we are duplicating.
|
||||
*/
|
||||
- mm->context.addr_limit = DEFAULT_MAP_WINDOW_USER64;
|
||||
+ if (!mm->context.addr_limit)
|
||||
+ mm->context.addr_limit = DEFAULT_MAP_WINDOW_USER64;
|
||||
|
||||
/*
|
||||
* The old code would re-promote on fork, we don't do that when using
|
||||
--
|
||||
2.14.3
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
From 2beb551e379191c2a24e7db8c4fcc64fef4b921a Mon Sep 17 00:00:00 2001
|
||||
From: Nicholas Piggin <npiggin@gmail.com>
|
||||
Date: Tue, 28 Nov 2017 11:26:58 +0100
|
||||
Subject: [PATCH 5/5] powerpc/64s/hash: Allow MAP_FIXED allocations to cross
|
||||
128TB boundary
|
||||
|
||||
commit 35602f82d0c765f991420e319c8d3a596c921eb8 upstream.
|
||||
|
||||
While mapping hints with a length that cross 128TB are disallowed,
|
||||
MAP_FIXED allocations that cross 128TB are allowed. These are failing
|
||||
on hash (on radix they succeed). Add an additional case for fixed
|
||||
mappings to expand the addr_limit when crossing 128TB.
|
||||
|
||||
Fixes: f4ea6dcb08ea ("powerpc/mm: Enable mappings above 128TB")
|
||||
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
|
||||
Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
|
||||
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
arch/powerpc/mm/slice.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c
|
||||
index 3889201b560c..a4f93699194b 100644
|
||||
--- a/arch/powerpc/mm/slice.c
|
||||
+++ b/arch/powerpc/mm/slice.c
|
||||
@@ -418,7 +418,7 @@ unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len,
|
||||
unsigned long high_limit;
|
||||
|
||||
high_limit = DEFAULT_MAP_WINDOW;
|
||||
- if (addr >= high_limit)
|
||||
+ if (addr >= high_limit || (fixed && (addr + len > high_limit)))
|
||||
high_limit = TASK_SIZE;
|
||||
|
||||
if (len > high_limit)
|
||||
--
|
||||
2.14.3
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
From 2a99775c336303d2efc43eab4f24b34722a28faa Mon Sep 17 00:00:00 2001
|
||||
From: "Sergei A. Trusov" <sergei.a.trusov@ya.ru>
|
||||
Date: Tue, 20 Jun 2017 18:08:35 +0200
|
||||
Subject: [PATCH 11/16] Input: goodix: Add support for capacitive home button
|
||||
|
||||
On some x86 tablets with a Goodix touchscreen, the Windows logo on the
|
||||
front is a capacitive home button. Touching this button results in a touch
|
||||
with bit 4 of the first byte set, while only the lower 4 bits (0-3) are
|
||||
used to indicate the number of touches.
|
||||
|
||||
Report a KEY_LEFTMETA press when this happens.
|
||||
|
||||
Note that the hardware might support more than one button, in which
|
||||
case the "id" byte of coor_data would identify the button in question.
|
||||
This is not implemented as we don't have access to hardware with
|
||||
multiple buttons.
|
||||
|
||||
Signed-off-by: Sergei A. Trusov <sergei.a.trusov@ya.ru>
|
||||
Acked-by: Bastien Nocera <hadess@hadess.net>
|
||||
---
|
||||
drivers/input/touchscreen/goodix.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
|
||||
index 240b16f3ee97..903137d9cf7d 100644
|
||||
--- a/drivers/input/touchscreen/goodix.c
|
||||
+++ b/drivers/input/touchscreen/goodix.c
|
||||
@@ -267,6 +267,12 @@ static void goodix_process_events(struct goodix_ts_data *ts)
|
||||
if (touch_num < 0)
|
||||
return;
|
||||
|
||||
+ /*
|
||||
+ * Bit 4 of the first byte reports the status of the capacitive
|
||||
+ * Windows/Home button.
|
||||
+ */
|
||||
+ input_report_key(ts->input_dev, KEY_LEFTMETA, !!(point_data[0] & BIT(4)));
|
||||
+
|
||||
for (i = 0; i < touch_num; i++)
|
||||
goodix_ts_report_touch(ts,
|
||||
&point_data[1 + GOODIX_CONTACT_SIZE * i]);
|
||||
@@ -612,6 +618,9 @@ static int goodix_request_input_dev(struct goodix_ts_data *ts)
|
||||
ts->input_dev->id.product = ts->id;
|
||||
ts->input_dev->id.version = ts->version;
|
||||
|
||||
+ /* Capacitive Windows/Home button on some devices */
|
||||
+ input_set_capability(ts->input_dev, EV_KEY, KEY_LEFTMETA);
|
||||
+
|
||||
error = input_register_device(ts->input_dev);
|
||||
if (error) {
|
||||
dev_err(&ts->client->dev,
|
||||
--
|
||||
2.13.0
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
From bf3e9581e10a19b2ce77a45fe001116d269b4c7f Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Sun, 18 Jun 2017 12:47:38 +0200
|
||||
Subject: [PATCH 13/16] iio: accel: bmc150: Add support for BOSC0200 ACPI
|
||||
device id
|
||||
|
||||
Add support for the BOSC0200 ACPI device id used on some x86 tablets.
|
||||
note driver_data is not set to a specific model, driver_data is not
|
||||
used anyways (instead detection is done on the chip_id reg) and the
|
||||
2 tablets with a BOSC0200 ACPI device id I've have 2 different chips,
|
||||
one has a BMA250E, the other a BMA222E.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
drivers/iio/accel/bmc150-accel-i2c.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/iio/accel/bmc150-accel-i2c.c b/drivers/iio/accel/bmc150-accel-i2c.c
|
||||
index 8ca8041267ef..f85014fbaa12 100644
|
||||
--- a/drivers/iio/accel/bmc150-accel-i2c.c
|
||||
+++ b/drivers/iio/accel/bmc150-accel-i2c.c
|
||||
@@ -64,6 +64,7 @@ static const struct acpi_device_id bmc150_accel_acpi_match[] = {
|
||||
{"BMA250E", bma250e},
|
||||
{"BMA222E", bma222e},
|
||||
{"BMA0280", bma280},
|
||||
+ {"BOSC0200"},
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, bmc150_accel_acpi_match);
|
||||
--
|
||||
2.13.0
|
||||
|
|
@ -1,410 +0,0 @@
|
|||
From bd0d7169342e47919f68e75d659968f02b62f84b Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Fri, 3 Mar 2017 23:48:50 +0100
|
||||
Subject: [PATCH 15/16] i2c-cht-wc: Add Intel Cherry Trail Whiskey Cove SMBUS
|
||||
controller driver
|
||||
|
||||
The Intel Cherry Trail Whiskey Cove PMIC does not contain a builtin
|
||||
battery charger, instead boards with this PMIC use an external TI
|
||||
bq24292i charger IC, which is connected to a SMBUS controller built into
|
||||
the PMIC.
|
||||
|
||||
This commit adds an i2c-bus driver for the PMIC's builtin SMBUS
|
||||
controller. The probe function for this i2c-bus will also register an
|
||||
i2c-client for the TI bq24292i charger after the i2c-bus has been
|
||||
registered.
|
||||
|
||||
Note that several device-properties are set on the client-device to
|
||||
tell the bq24190 power-supply driver to integrate the Whiskey Cove PMIC
|
||||
and e.g. use the PMIC's BC1.2 detection (through extcon) to determine
|
||||
the maximum input current.
|
||||
|
||||
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
Changes in v2:
|
||||
-Various style (mostly captialization and variable name) fixes
|
||||
-Use device-properties instead of platform_data for the i2c_board_info
|
||||
---
|
||||
drivers/i2c/busses/Kconfig | 8 +
|
||||
drivers/i2c/busses/Makefile | 1 +
|
||||
drivers/i2c/busses/i2c-cht-wc.c | 336 ++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 345 insertions(+)
|
||||
create mode 100644 drivers/i2c/busses/i2c-cht-wc.c
|
||||
|
||||
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
|
||||
index 144cbadc7c72..18c96178b177 100644
|
||||
--- a/drivers/i2c/busses/Kconfig
|
||||
+++ b/drivers/i2c/busses/Kconfig
|
||||
@@ -187,6 +187,14 @@ config I2C_PIIX4
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called i2c-piix4.
|
||||
|
||||
+config I2C_CHT_WC
|
||||
+ tristate "Intel Cherry Trail Whiskey Cove PMIC smbus controller"
|
||||
+ depends on INTEL_SOC_PMIC_CHTWC
|
||||
+ help
|
||||
+ If you say yes to this option, support will be included for the
|
||||
+ SMBus controller found in the Intel Cherry Trail Whiskey Cove PMIC
|
||||
+ found on some Intel Cherry Trail systems.
|
||||
+
|
||||
config I2C_NFORCE2
|
||||
tristate "Nvidia nForce2, nForce3 and nForce4"
|
||||
depends on PCI
|
||||
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
|
||||
index 30b60855fbcd..f6443fa44f61 100644
|
||||
--- a/drivers/i2c/busses/Makefile
|
||||
+++ b/drivers/i2c/busses/Makefile
|
||||
@@ -12,6 +12,7 @@ obj-$(CONFIG_I2C_ALI15X3) += i2c-ali15x3.o
|
||||
obj-$(CONFIG_I2C_AMD756) += i2c-amd756.o
|
||||
obj-$(CONFIG_I2C_AMD756_S4882) += i2c-amd756-s4882.o
|
||||
obj-$(CONFIG_I2C_AMD8111) += i2c-amd8111.o
|
||||
+obj-$(CONFIG_I2C_CHT_WC) += i2c-cht-wc.o
|
||||
obj-$(CONFIG_I2C_I801) += i2c-i801.o
|
||||
obj-$(CONFIG_I2C_ISCH) += i2c-isch.o
|
||||
obj-$(CONFIG_I2C_ISMT) += i2c-ismt.o
|
||||
diff --git a/drivers/i2c/busses/i2c-cht-wc.c b/drivers/i2c/busses/i2c-cht-wc.c
|
||||
new file mode 100644
|
||||
index 000000000000..ccf0785bcb75
|
||||
--- /dev/null
|
||||
+++ b/drivers/i2c/busses/i2c-cht-wc.c
|
||||
@@ -0,0 +1,336 @@
|
||||
+/*
|
||||
+ * Intel CHT Whiskey Cove PMIC I2C Master driver
|
||||
+ * Copyright (C) 2017 Hans de Goede <hdegoede@redhat.com>
|
||||
+ *
|
||||
+ * Based on various non upstream patches to support the CHT Whiskey Cove PMIC:
|
||||
+ * Copyright (C) 2011 - 2014 Intel Corporation. All rights reserved.
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/completion.h>
|
||||
+#include <linux/delay.h>
|
||||
+#include <linux/i2c.h>
|
||||
+#include <linux/interrupt.h>
|
||||
+#include <linux/irq.h>
|
||||
+#include <linux/irqdomain.h>
|
||||
+#include <linux/mfd/intel_soc_pmic.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/slab.h>
|
||||
+
|
||||
+#define CHT_WC_I2C_CTRL 0x5e24
|
||||
+#define CHT_WC_I2C_CTRL_WR BIT(0)
|
||||
+#define CHT_WC_I2C_CTRL_RD BIT(1)
|
||||
+#define CHT_WC_I2C_CLIENT_ADDR 0x5e25
|
||||
+#define CHT_WC_I2C_REG_OFFSET 0x5e26
|
||||
+#define CHT_WC_I2C_WRDATA 0x5e27
|
||||
+#define CHT_WC_I2C_RDDATA 0x5e28
|
||||
+
|
||||
+#define CHT_WC_EXTCHGRIRQ 0x6e0a
|
||||
+#define CHT_WC_EXTCHGRIRQ_CLIENT_IRQ BIT(0)
|
||||
+#define CHT_WC_EXTCHGRIRQ_WRITE_IRQ BIT(1)
|
||||
+#define CHT_WC_EXTCHGRIRQ_READ_IRQ BIT(2)
|
||||
+#define CHT_WC_EXTCHGRIRQ_NACK_IRQ BIT(3)
|
||||
+#define CHT_WC_EXTCHGRIRQ_ADAP_IRQMASK ((u8)GENMASK(3, 1))
|
||||
+#define CHT_WC_EXTCHGRIRQ_MSK 0x6e17
|
||||
+
|
||||
+struct cht_wc_i2c_adap {
|
||||
+ struct i2c_adapter adapter;
|
||||
+ wait_queue_head_t wait;
|
||||
+ struct irq_chip irqchip;
|
||||
+ struct mutex irqchip_lock;
|
||||
+ struct regmap *regmap;
|
||||
+ struct irq_domain *irq_domain;
|
||||
+ struct i2c_client *client;
|
||||
+ int client_irq;
|
||||
+ u8 irq_mask;
|
||||
+ u8 old_irq_mask;
|
||||
+ bool nack;
|
||||
+ bool done;
|
||||
+};
|
||||
+
|
||||
+static irqreturn_t cht_wc_i2c_adap_thread_handler(int id, void *data)
|
||||
+{
|
||||
+ struct cht_wc_i2c_adap *adap = data;
|
||||
+ int ret, reg;
|
||||
+
|
||||
+ /* Read IRQs */
|
||||
+ ret = regmap_read(adap->regmap, CHT_WC_EXTCHGRIRQ, ®);
|
||||
+ if (ret) {
|
||||
+ dev_err(&adap->adapter.dev, "Error reading extchgrirq reg\n");
|
||||
+ return IRQ_NONE;
|
||||
+ }
|
||||
+
|
||||
+ reg &= ~adap->irq_mask;
|
||||
+
|
||||
+ /*
|
||||
+ * Immediately ack IRQs, so that if new IRQs arrives while we're
|
||||
+ * handling the previous ones our irq will re-trigger when we're done.
|
||||
+ */
|
||||
+ ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ, reg);
|
||||
+ if (ret)
|
||||
+ dev_err(&adap->adapter.dev, "Error writing extchgrirq reg\n");
|
||||
+
|
||||
+ /*
|
||||
+ * Do NOT use handle_nested_irq here, the client irq handler will
|
||||
+ * likely want to do i2c transfers and the i2c controller uses this
|
||||
+ * interrupt handler as well, so running the client irq handler from
|
||||
+ * this thread will cause things to lock up.
|
||||
+ */
|
||||
+ if (reg & CHT_WC_EXTCHGRIRQ_CLIENT_IRQ) {
|
||||
+ /*
|
||||
+ * generic_handle_irq expects local IRQs to be disabled
|
||||
+ * as normally it is called from interrupt context.
|
||||
+ */
|
||||
+ local_irq_disable();
|
||||
+ generic_handle_irq(adap->client_irq);
|
||||
+ local_irq_enable();
|
||||
+ }
|
||||
+
|
||||
+ if (reg & CHT_WC_EXTCHGRIRQ_ADAP_IRQMASK) {
|
||||
+ adap->nack = !!(reg & CHT_WC_EXTCHGRIRQ_NACK_IRQ);
|
||||
+ adap->done = true;
|
||||
+ wake_up(&adap->wait);
|
||||
+ }
|
||||
+
|
||||
+ return IRQ_HANDLED;
|
||||
+}
|
||||
+
|
||||
+static u32 cht_wc_i2c_adap_master_func(struct i2c_adapter *adap)
|
||||
+{
|
||||
+ /* This i2c adapter only supports SMBUS byte transfers */
|
||||
+ return I2C_FUNC_SMBUS_BYTE_DATA;
|
||||
+}
|
||||
+
|
||||
+static int cht_wc_i2c_adap_smbus_xfer(struct i2c_adapter *_adap, u16 addr,
|
||||
+ unsigned short flags, char read_write,
|
||||
+ u8 command, int size,
|
||||
+ union i2c_smbus_data *data)
|
||||
+{
|
||||
+ struct cht_wc_i2c_adap *adap = i2c_get_adapdata(_adap);
|
||||
+ int ret, reg;
|
||||
+
|
||||
+ adap->nack = false;
|
||||
+ adap->done = false;
|
||||
+
|
||||
+ ret = regmap_write(adap->regmap, CHT_WC_I2C_CLIENT_ADDR, addr);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (read_write == I2C_SMBUS_WRITE) {
|
||||
+ ret = regmap_write(adap->regmap, CHT_WC_I2C_WRDATA, data->byte);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = regmap_write(adap->regmap, CHT_WC_I2C_REG_OFFSET, command);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = regmap_write(adap->regmap, CHT_WC_I2C_CTRL,
|
||||
+ (read_write == I2C_SMBUS_WRITE) ?
|
||||
+ CHT_WC_I2C_CTRL_WR : CHT_WC_I2C_CTRL_RD);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* 3 second timeout, during cable plug the PMIC responds quite slow */
|
||||
+ ret = wait_event_timeout(adap->wait, adap->done, 3 * HZ);
|
||||
+ if (ret == 0)
|
||||
+ return -ETIMEDOUT;
|
||||
+ if (adap->nack)
|
||||
+ return -EIO;
|
||||
+
|
||||
+ if (read_write == I2C_SMBUS_READ) {
|
||||
+ ret = regmap_read(adap->regmap, CHT_WC_I2C_RDDATA, ®);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ data->byte = reg;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct i2c_algorithm cht_wc_i2c_adap_algo = {
|
||||
+ .functionality = cht_wc_i2c_adap_master_func,
|
||||
+ .smbus_xfer = cht_wc_i2c_adap_smbus_xfer,
|
||||
+};
|
||||
+
|
||||
+/**** irqchip for the client connected to the extchgr i2c adapter ****/
|
||||
+static void cht_wc_i2c_irq_lock(struct irq_data *data)
|
||||
+{
|
||||
+ struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data);
|
||||
+
|
||||
+ mutex_lock(&adap->irqchip_lock);
|
||||
+}
|
||||
+
|
||||
+static void cht_wc_i2c_irq_sync_unlock(struct irq_data *data)
|
||||
+{
|
||||
+ struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data);
|
||||
+ int ret;
|
||||
+
|
||||
+ if (adap->irq_mask != adap->old_irq_mask) {
|
||||
+ ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ_MSK,
|
||||
+ adap->irq_mask);
|
||||
+ if (ret == 0)
|
||||
+ adap->old_irq_mask = adap->irq_mask;
|
||||
+ else
|
||||
+ dev_err(&adap->adapter.dev, "Error writing EXTCHGRIRQ_MSK\n");
|
||||
+ }
|
||||
+
|
||||
+ mutex_unlock(&adap->irqchip_lock);
|
||||
+}
|
||||
+
|
||||
+static void cht_wc_i2c_irq_enable(struct irq_data *data)
|
||||
+{
|
||||
+ struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data);
|
||||
+
|
||||
+ adap->irq_mask &= ~CHT_WC_EXTCHGRIRQ_CLIENT_IRQ;
|
||||
+}
|
||||
+
|
||||
+static void cht_wc_i2c_irq_disable(struct irq_data *data)
|
||||
+{
|
||||
+ struct cht_wc_i2c_adap *adap = irq_data_get_irq_chip_data(data);
|
||||
+
|
||||
+ adap->irq_mask |= CHT_WC_EXTCHGRIRQ_CLIENT_IRQ;
|
||||
+}
|
||||
+
|
||||
+static const struct irq_chip cht_wc_i2c_irq_chip = {
|
||||
+ .irq_bus_lock = cht_wc_i2c_irq_lock,
|
||||
+ .irq_bus_sync_unlock = cht_wc_i2c_irq_sync_unlock,
|
||||
+ .irq_disable = cht_wc_i2c_irq_disable,
|
||||
+ .irq_enable = cht_wc_i2c_irq_enable,
|
||||
+ .name = "cht_wc_ext_chrg_irq_chip",
|
||||
+};
|
||||
+
|
||||
+static const struct property_entry bq24190_props[] = {
|
||||
+ PROPERTY_ENTRY_STRING("extcon-name", "cht_wcove_pwrsrc"),
|
||||
+ PROPERTY_ENTRY_BOOL("omit-battery-class"),
|
||||
+ PROPERTY_ENTRY_BOOL("disable-reset"),
|
||||
+ { }
|
||||
+};
|
||||
+
|
||||
+static int cht_wc_i2c_adap_i2c_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct intel_soc_pmic *pmic = dev_get_drvdata(pdev->dev.parent);
|
||||
+ struct cht_wc_i2c_adap *adap;
|
||||
+ struct i2c_board_info board_info = {
|
||||
+ .type = "bq24190",
|
||||
+ .addr = 0x6b,
|
||||
+ .properties = bq24190_props,
|
||||
+ };
|
||||
+ int ret, irq;
|
||||
+
|
||||
+ irq = platform_get_irq(pdev, 0);
|
||||
+ if (irq < 0) {
|
||||
+ dev_err(&pdev->dev, "Error missing irq resource\n");
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ adap = devm_kzalloc(&pdev->dev, sizeof(*adap), GFP_KERNEL);
|
||||
+ if (!adap)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ init_waitqueue_head(&adap->wait);
|
||||
+ mutex_init(&adap->irqchip_lock);
|
||||
+ adap->irqchip = cht_wc_i2c_irq_chip;
|
||||
+ adap->regmap = pmic->regmap;
|
||||
+ adap->adapter.owner = THIS_MODULE;
|
||||
+ adap->adapter.class = I2C_CLASS_HWMON;
|
||||
+ adap->adapter.algo = &cht_wc_i2c_adap_algo;
|
||||
+ strlcpy(adap->adapter.name, "PMIC I2C Adapter",
|
||||
+ sizeof(adap->adapter.name));
|
||||
+ adap->adapter.dev.parent = &pdev->dev;
|
||||
+
|
||||
+ /* Clear and activate i2c-adapter interrupts, disable client IRQ */
|
||||
+ adap->old_irq_mask = adap->irq_mask = ~CHT_WC_EXTCHGRIRQ_ADAP_IRQMASK;
|
||||
+ ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ, ~adap->irq_mask);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = regmap_write(adap->regmap, CHT_WC_EXTCHGRIRQ_MSK, adap->irq_mask);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Alloc and register client IRQ */
|
||||
+ adap->irq_domain = irq_domain_add_linear(pdev->dev.of_node, 1,
|
||||
+ &irq_domain_simple_ops, NULL);
|
||||
+ if (!adap->irq_domain)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ adap->client_irq = irq_create_mapping(adap->irq_domain, 0);
|
||||
+ if (!adap->client_irq) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto remove_irq_domain;
|
||||
+ }
|
||||
+
|
||||
+ irq_set_chip_data(adap->client_irq, adap);
|
||||
+ irq_set_chip_and_handler(adap->client_irq, &adap->irqchip,
|
||||
+ handle_simple_irq);
|
||||
+
|
||||
+ ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
||||
+ cht_wc_i2c_adap_thread_handler,
|
||||
+ IRQF_ONESHOT, "PMIC I2C Adapter", adap);
|
||||
+ if (ret)
|
||||
+ goto remove_irq_domain;
|
||||
+
|
||||
+ i2c_set_adapdata(&adap->adapter, adap);
|
||||
+ ret = i2c_add_adapter(&adap->adapter);
|
||||
+ if (ret)
|
||||
+ goto remove_irq_domain;
|
||||
+
|
||||
+ board_info.irq = adap->client_irq;
|
||||
+ adap->client = i2c_new_device(&adap->adapter, &board_info);
|
||||
+ if (!adap->client) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto del_adapter;
|
||||
+ }
|
||||
+
|
||||
+ platform_set_drvdata(pdev, adap);
|
||||
+ return 0;
|
||||
+
|
||||
+del_adapter:
|
||||
+ i2c_del_adapter(&adap->adapter);
|
||||
+remove_irq_domain:
|
||||
+ irq_domain_remove(adap->irq_domain);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int cht_wc_i2c_adap_i2c_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct cht_wc_i2c_adap *adap = platform_get_drvdata(pdev);
|
||||
+
|
||||
+ i2c_unregister_device(adap->client);
|
||||
+ i2c_del_adapter(&adap->adapter);
|
||||
+ irq_domain_remove(adap->irq_domain);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_device_id cht_wc_i2c_adap_id_table[] = {
|
||||
+ { .name = "cht_wcove_ext_chgr" },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(platform, cht_wc_i2c_adap_id_table);
|
||||
+
|
||||
+struct platform_driver cht_wc_i2c_adap_driver = {
|
||||
+ .probe = cht_wc_i2c_adap_i2c_probe,
|
||||
+ .remove = cht_wc_i2c_adap_i2c_remove,
|
||||
+ .driver = {
|
||||
+ .name = "cht_wcove_ext_chgr",
|
||||
+ },
|
||||
+ .id_table = cht_wc_i2c_adap_id_table,
|
||||
+};
|
||||
+module_platform_driver(cht_wc_i2c_adap_driver);
|
||||
+
|
||||
+MODULE_DESCRIPTION("Intel CHT Whiskey Cove PMIC I2C Master driver");
|
||||
+MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
--
|
||||
2.13.0
|
||||
|
|
@ -1,296 +0,0 @@
|
|||
From patchwork Mon Nov 6 12:31:12 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [1/2] kvm: vmx: Reinstate support for CPUs without virtual NMI
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
X-Patchwork-Id: 10043403
|
||||
Message-Id: <1509971473-74491-2-git-send-email-pbonzini@redhat.com>
|
||||
To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org
|
||||
Cc: rkrcmar@redhat.com, stable@vger.kernel.org
|
||||
Date: Mon, 6 Nov 2017 13:31:12 +0100
|
||||
|
||||
This is more or less a revert of commit 2c82878b0cb3 ("KVM: VMX: require
|
||||
virtual NMI support", 2017-03-27); it turns out that Core 2 Duo machines
|
||||
only had virtual NMIs in some SKUs.
|
||||
|
||||
The revert is not trivial because in the meanwhile there have been several
|
||||
fixes to nested NMI injection. Therefore, the entire vNMI state is moved
|
||||
to struct loaded_vmcs.
|
||||
|
||||
Another change compared to before the patch is a simplification here:
|
||||
|
||||
if (unlikely(!cpu_has_virtual_nmis() && vmx->soft_vnmi_blocked &&
|
||||
!(is_guest_mode(vcpu) && nested_cpu_has_virtual_nmis(
|
||||
get_vmcs12(vcpu))))) {
|
||||
|
||||
The final condition here is always true (because nested_cpu_has_virtual_nmis
|
||||
is always false) and is removed.
|
||||
|
||||
Fixes: 2c82878b0cb38fd516fd612c67852a6bbf282003
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1490803
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
arch/x86/kvm/vmx.c | 150 +++++++++++++++++++++++++++++++++++++----------------
|
||||
1 file changed, 106 insertions(+), 44 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
|
||||
index e6c8ffa84968..d6b3b12ae1e2 100644
|
||||
--- a/arch/x86/kvm/vmx.c
|
||||
+++ b/arch/x86/kvm/vmx.c
|
||||
@@ -202,6 +202,10 @@ struct loaded_vmcs {
|
||||
bool nmi_known_unmasked;
|
||||
unsigned long vmcs_host_cr3; /* May not match real cr3 */
|
||||
unsigned long vmcs_host_cr4; /* May not match real cr4 */
|
||||
+ /* Support for vnmi-less CPUs */
|
||||
+ int soft_vnmi_blocked;
|
||||
+ ktime_t entry_time;
|
||||
+ s64 vnmi_blocked_time;
|
||||
struct list_head loaded_vmcss_on_cpu_link;
|
||||
};
|
||||
|
||||
@@ -1291,6 +1295,11 @@ static inline bool cpu_has_vmx_invpcid(void)
|
||||
SECONDARY_EXEC_ENABLE_INVPCID;
|
||||
}
|
||||
|
||||
+static inline bool cpu_has_virtual_nmis(void)
|
||||
+{
|
||||
+ return vmcs_config.pin_based_exec_ctrl & PIN_BASED_VIRTUAL_NMIS;
|
||||
+}
|
||||
+
|
||||
static inline bool cpu_has_vmx_wbinvd_exit(void)
|
||||
{
|
||||
return vmcs_config.cpu_based_2nd_exec_ctrl &
|
||||
@@ -1348,11 +1357,6 @@ static inline bool nested_cpu_has2(struct vmcs12 *vmcs12, u32 bit)
|
||||
(vmcs12->secondary_vm_exec_control & bit);
|
||||
}
|
||||
|
||||
-static inline bool nested_cpu_has_virtual_nmis(struct vmcs12 *vmcs12)
|
||||
-{
|
||||
- return vmcs12->pin_based_vm_exec_control & PIN_BASED_VIRTUAL_NMIS;
|
||||
-}
|
||||
-
|
||||
static inline bool nested_cpu_has_preemption_timer(struct vmcs12 *vmcs12)
|
||||
{
|
||||
return vmcs12->pin_based_vm_exec_control &
|
||||
@@ -3712,9 +3716,9 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf)
|
||||
&_vmexit_control) < 0)
|
||||
return -EIO;
|
||||
|
||||
- min = PIN_BASED_EXT_INTR_MASK | PIN_BASED_NMI_EXITING |
|
||||
- PIN_BASED_VIRTUAL_NMIS;
|
||||
- opt = PIN_BASED_POSTED_INTR | PIN_BASED_VMX_PREEMPTION_TIMER;
|
||||
+ min = PIN_BASED_EXT_INTR_MASK | PIN_BASED_NMI_EXITING;
|
||||
+ opt = PIN_BASED_VIRTUAL_NMIS | PIN_BASED_POSTED_INTR |
|
||||
+ PIN_BASED_VMX_PREEMPTION_TIMER;
|
||||
if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_PINBASED_CTLS,
|
||||
&_pin_based_exec_control) < 0)
|
||||
return -EIO;
|
||||
@@ -5669,7 +5673,8 @@ static void enable_irq_window(struct kvm_vcpu *vcpu)
|
||||
|
||||
static void enable_nmi_window(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
- if (vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & GUEST_INTR_STATE_STI) {
|
||||
+ if (!cpu_has_virtual_nmis() ||
|
||||
+ vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & GUEST_INTR_STATE_STI) {
|
||||
enable_irq_window(vcpu);
|
||||
return;
|
||||
}
|
||||
@@ -5709,6 +5714,19 @@ static void vmx_inject_nmi(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
|
||||
+ if (!cpu_has_virtual_nmis()) {
|
||||
+ /*
|
||||
+ * Tracking the NMI-blocked state in software is built upon
|
||||
+ * finding the next open IRQ window. This, in turn, depends on
|
||||
+ * well-behaving guests: They have to keep IRQs disabled at
|
||||
+ * least as long as the NMI handler runs. Otherwise we may
|
||||
+ * cause NMI nesting, maybe breaking the guest. But as this is
|
||||
+ * highly unlikely, we can live with the residual risk.
|
||||
+ */
|
||||
+ vmx->loaded_vmcs->soft_vnmi_blocked = 1;
|
||||
+ vmx->loaded_vmcs->vnmi_blocked_time = 0;
|
||||
+ }
|
||||
+
|
||||
++vcpu->stat.nmi_injections;
|
||||
vmx->loaded_vmcs->nmi_known_unmasked = false;
|
||||
|
||||
@@ -5727,6 +5745,8 @@ static bool vmx_get_nmi_mask(struct kvm_vcpu *vcpu)
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
bool masked;
|
||||
|
||||
+ if (!cpu_has_virtual_nmis())
|
||||
+ return vmx->loaded_vmcs->soft_vnmi_blocked;
|
||||
if (vmx->loaded_vmcs->nmi_known_unmasked)
|
||||
return false;
|
||||
masked = vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & GUEST_INTR_STATE_NMI;
|
||||
@@ -5738,13 +5758,20 @@ static void vmx_set_nmi_mask(struct kvm_vcpu *vcpu, bool masked)
|
||||
{
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
|
||||
- vmx->loaded_vmcs->nmi_known_unmasked = !masked;
|
||||
- if (masked)
|
||||
- vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO,
|
||||
- GUEST_INTR_STATE_NMI);
|
||||
- else
|
||||
- vmcs_clear_bits(GUEST_INTERRUPTIBILITY_INFO,
|
||||
- GUEST_INTR_STATE_NMI);
|
||||
+ if (!cpu_has_virtual_nmis()) {
|
||||
+ if (vmx->loaded_vmcs->soft_vnmi_blocked != masked) {
|
||||
+ vmx->loaded_vmcs->soft_vnmi_blocked = masked;
|
||||
+ vmx->loaded_vmcs->vnmi_blocked_time = 0;
|
||||
+ }
|
||||
+ } else {
|
||||
+ vmx->loaded_vmcs->nmi_known_unmasked = !masked;
|
||||
+ if (masked)
|
||||
+ vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO,
|
||||
+ GUEST_INTR_STATE_NMI);
|
||||
+ else
|
||||
+ vmcs_clear_bits(GUEST_INTERRUPTIBILITY_INFO,
|
||||
+ GUEST_INTR_STATE_NMI);
|
||||
+ }
|
||||
}
|
||||
|
||||
static int vmx_nmi_allowed(struct kvm_vcpu *vcpu)
|
||||
@@ -5752,6 +5779,10 @@ static int vmx_nmi_allowed(struct kvm_vcpu *vcpu)
|
||||
if (to_vmx(vcpu)->nested.nested_run_pending)
|
||||
return 0;
|
||||
|
||||
+ if (!cpu_has_virtual_nmis() &&
|
||||
+ to_vmx(vcpu)->loaded_vmcs->soft_vnmi_blocked)
|
||||
+ return 0;
|
||||
+
|
||||
return !(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) &
|
||||
(GUEST_INTR_STATE_MOV_SS | GUEST_INTR_STATE_STI
|
||||
| GUEST_INTR_STATE_NMI));
|
||||
@@ -6479,6 +6510,7 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu)
|
||||
* AAK134, BY25.
|
||||
*/
|
||||
if (!(to_vmx(vcpu)->idt_vectoring_info & VECTORING_INFO_VALID_MASK) &&
|
||||
+ cpu_has_virtual_nmis() &&
|
||||
(exit_qualification & INTR_INFO_UNBLOCK_NMI))
|
||||
vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO, GUEST_INTR_STATE_NMI);
|
||||
|
||||
@@ -6965,7 +6997,7 @@ static struct loaded_vmcs *nested_get_current_vmcs02(struct vcpu_vmx *vmx)
|
||||
}
|
||||
|
||||
/* Create a new VMCS */
|
||||
- item = kmalloc(sizeof(struct vmcs02_list), GFP_KERNEL);
|
||||
+ item = kzalloc(sizeof(struct vmcs02_list), GFP_KERNEL);
|
||||
if (!item)
|
||||
return NULL;
|
||||
item->vmcs02.vmcs = alloc_vmcs();
|
||||
@@ -7982,6 +8014,7 @@ static int handle_pml_full(struct kvm_vcpu *vcpu)
|
||||
* "blocked by NMI" bit has to be set before next VM entry.
|
||||
*/
|
||||
if (!(to_vmx(vcpu)->idt_vectoring_info & VECTORING_INFO_VALID_MASK) &&
|
||||
+ cpu_has_virtual_nmis() &&
|
||||
(exit_qualification & INTR_INFO_UNBLOCK_NMI))
|
||||
vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO,
|
||||
GUEST_INTR_STATE_NMI);
|
||||
@@ -8826,6 +8859,25 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+ if (unlikely(!cpu_has_virtual_nmis() &&
|
||||
+ vmx->loaded_vmcs->soft_vnmi_blocked)) {
|
||||
+ if (vmx_interrupt_allowed(vcpu)) {
|
||||
+ vmx->loaded_vmcs->soft_vnmi_blocked = 0;
|
||||
+ } else if (vmx->loaded_vmcs->vnmi_blocked_time > 1000000000LL &&
|
||||
+ vcpu->arch.nmi_pending) {
|
||||
+ /*
|
||||
+ * This CPU don't support us in finding the end of an
|
||||
+ * NMI-blocked window if the guest runs with IRQs
|
||||
+ * disabled. So we pull the trigger after 1 s of
|
||||
+ * futile waiting, but inform the user about this.
|
||||
+ */
|
||||
+ printk(KERN_WARNING "%s: Breaking out of NMI-blocked "
|
||||
+ "state on VCPU %d after 1 s timeout\n",
|
||||
+ __func__, vcpu->vcpu_id);
|
||||
+ vmx->loaded_vmcs->soft_vnmi_blocked = 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (exit_reason < kvm_vmx_max_exit_handlers
|
||||
&& kvm_vmx_exit_handlers[exit_reason])
|
||||
return kvm_vmx_exit_handlers[exit_reason](vcpu);
|
||||
@@ -9108,33 +9160,38 @@ static void vmx_recover_nmi_blocking(struct vcpu_vmx *vmx)
|
||||
|
||||
idtv_info_valid = vmx->idt_vectoring_info & VECTORING_INFO_VALID_MASK;
|
||||
|
||||
- if (vmx->loaded_vmcs->nmi_known_unmasked)
|
||||
- return;
|
||||
- /*
|
||||
- * Can't use vmx->exit_intr_info since we're not sure what
|
||||
- * the exit reason is.
|
||||
- */
|
||||
- exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO);
|
||||
- unblock_nmi = (exit_intr_info & INTR_INFO_UNBLOCK_NMI) != 0;
|
||||
- vector = exit_intr_info & INTR_INFO_VECTOR_MASK;
|
||||
- /*
|
||||
- * SDM 3: 27.7.1.2 (September 2008)
|
||||
- * Re-set bit "block by NMI" before VM entry if vmexit caused by
|
||||
- * a guest IRET fault.
|
||||
- * SDM 3: 23.2.2 (September 2008)
|
||||
- * Bit 12 is undefined in any of the following cases:
|
||||
- * If the VM exit sets the valid bit in the IDT-vectoring
|
||||
- * information field.
|
||||
- * If the VM exit is due to a double fault.
|
||||
- */
|
||||
- if ((exit_intr_info & INTR_INFO_VALID_MASK) && unblock_nmi &&
|
||||
- vector != DF_VECTOR && !idtv_info_valid)
|
||||
- vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO,
|
||||
- GUEST_INTR_STATE_NMI);
|
||||
- else
|
||||
- vmx->loaded_vmcs->nmi_known_unmasked =
|
||||
- !(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO)
|
||||
- & GUEST_INTR_STATE_NMI);
|
||||
+ if (cpu_has_virtual_nmis()) {
|
||||
+ if (vmx->loaded_vmcs->nmi_known_unmasked)
|
||||
+ return;
|
||||
+ /*
|
||||
+ * Can't use vmx->exit_intr_info since we're not sure what
|
||||
+ * the exit reason is.
|
||||
+ */
|
||||
+ exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO);
|
||||
+ unblock_nmi = (exit_intr_info & INTR_INFO_UNBLOCK_NMI) != 0;
|
||||
+ vector = exit_intr_info & INTR_INFO_VECTOR_MASK;
|
||||
+ /*
|
||||
+ * SDM 3: 27.7.1.2 (September 2008)
|
||||
+ * Re-set bit "block by NMI" before VM entry if vmexit caused by
|
||||
+ * a guest IRET fault.
|
||||
+ * SDM 3: 23.2.2 (September 2008)
|
||||
+ * Bit 12 is undefined in any of the following cases:
|
||||
+ * If the VM exit sets the valid bit in the IDT-vectoring
|
||||
+ * information field.
|
||||
+ * If the VM exit is due to a double fault.
|
||||
+ */
|
||||
+ if ((exit_intr_info & INTR_INFO_VALID_MASK) && unblock_nmi &&
|
||||
+ vector != DF_VECTOR && !idtv_info_valid)
|
||||
+ vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO,
|
||||
+ GUEST_INTR_STATE_NMI);
|
||||
+ else
|
||||
+ vmx->loaded_vmcs->nmi_known_unmasked =
|
||||
+ !(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO)
|
||||
+ & GUEST_INTR_STATE_NMI);
|
||||
+ } else if (unlikely(vmx->loaded_vmcs->soft_vnmi_blocked))
|
||||
+ vmx->loaded_vmcs->vnmi_blocked_time +=
|
||||
+ ktime_to_ns(ktime_sub(ktime_get(),
|
||||
+ vmx->loaded_vmcs->entry_time));
|
||||
}
|
||||
|
||||
static void __vmx_complete_interrupts(struct kvm_vcpu *vcpu,
|
||||
@@ -9251,6 +9308,11 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
unsigned long debugctlmsr, cr3, cr4;
|
||||
|
||||
+ /* Record the guest's net vcpu time for enforced NMI injections. */
|
||||
+ if (unlikely(!cpu_has_virtual_nmis() &&
|
||||
+ vmx->loaded_vmcs->soft_vnmi_blocked))
|
||||
+ vmx->loaded_vmcs->entry_time = ktime_get();
|
||||
+
|
||||
/* Don't enter VMX if guest state is invalid, let the exit handler
|
||||
start emulation until we arrive back to a valid state */
|
||||
if (vmx->emulation_required)
|
|
@ -1,50 +0,0 @@
|
|||
From patchwork Mon Sep 18 16:28:55 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [1/3] net: set tb->fast_sk_family
|
||||
X-Patchwork-Submitter: Josef Bacik <josef@toxicpanda.com>
|
||||
X-Patchwork-Id: 815031
|
||||
X-Patchwork-Delegate: davem@davemloft.net
|
||||
Message-Id: <1505752137-15522-2-git-send-email-jbacik@fb.com>
|
||||
To: davem@davemloft.net, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org, crobinso@redhat.com,
|
||||
labbott@redhat.com, kernel-team@fb.com
|
||||
Cc: Josef Bacik <jbacik@fb.com>, stable@vger.kernel.org
|
||||
Date: Mon, 18 Sep 2017 12:28:55 -0400
|
||||
From: josef@toxicpanda.com
|
||||
List-Id: <netdev.vger.kernel.org>
|
||||
|
||||
From: Josef Bacik <jbacik@fb.com>
|
||||
|
||||
We need to set the tb->fast_sk_family properly so we can use the proper
|
||||
comparison function for all subsequent reuseport bind requests.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 637bc8bbe6c0 ("inet: reset tb->fastreuseport when adding a reuseport sk")
|
||||
Reported-and-tested-by: Cole Robinson <crobinso@redhat.com>
|
||||
Signed-off-by: Josef Bacik <jbacik@fb.com>
|
||||
---
|
||||
net/ipv4/inet_connection_sock.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
|
||||
index b9c64b40a83a..f87f4805e244 100644
|
||||
--- a/net/ipv4/inet_connection_sock.c
|
||||
+++ b/net/ipv4/inet_connection_sock.c
|
||||
@@ -328,6 +328,7 @@ int inet_csk_get_port(struct sock *sk, unsigned short snum)
|
||||
tb->fastuid = uid;
|
||||
tb->fast_rcv_saddr = sk->sk_rcv_saddr;
|
||||
tb->fast_ipv6_only = ipv6_only_sock(sk);
|
||||
+ tb->fast_sk_family = sk->sk_family;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
tb->fast_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
|
||||
#endif
|
||||
@@ -354,6 +355,7 @@ int inet_csk_get_port(struct sock *sk, unsigned short snum)
|
||||
tb->fastuid = uid;
|
||||
tb->fast_rcv_saddr = sk->sk_rcv_saddr;
|
||||
tb->fast_ipv6_only = ipv6_only_sock(sk);
|
||||
+ tb->fast_sk_family = sk->sk_family;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
tb->fast_v6_rcv_saddr = sk->sk_v6_rcv_saddr;
|
||||
#endif
|
|
@ -1,44 +0,0 @@
|
|||
From patchwork Mon Sep 18 16:28:56 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [2/3] net: use inet6_rcv_saddr to compare sockets
|
||||
X-Patchwork-Submitter: Josef Bacik <josef@toxicpanda.com>
|
||||
X-Patchwork-Id: 815028
|
||||
X-Patchwork-Delegate: davem@davemloft.net
|
||||
Message-Id: <1505752137-15522-3-git-send-email-jbacik@fb.com>
|
||||
To: davem@davemloft.net, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org, crobinso@redhat.com,
|
||||
labbott@redhat.com, kernel-team@fb.com
|
||||
Cc: Josef Bacik <jbacik@fb.com>, stable@vger.kernel.org
|
||||
Date: Mon, 18 Sep 2017 12:28:56 -0400
|
||||
From: josef@toxicpanda.com
|
||||
List-Id: <netdev.vger.kernel.org>
|
||||
|
||||
From: Josef Bacik <jbacik@fb.com>
|
||||
|
||||
In ipv6_rcv_saddr_equal() we need to use inet6_rcv_saddr(sk) for the
|
||||
ipv6 compare with the fast socket information to make sure we're doing
|
||||
the proper comparisons.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 637bc8bbe6c0 ("inet: reset tb->fastreuseport when adding a reuseport sk")
|
||||
Reported-and-tested-by: Cole Robinson <crobinso@redhat.com>
|
||||
Signed-off-by: Josef Bacik <jbacik@fb.com>
|
||||
---
|
||||
net/ipv4/inet_connection_sock.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
|
||||
index f87f4805e244..a1bf30438bc5 100644
|
||||
--- a/net/ipv4/inet_connection_sock.c
|
||||
+++ b/net/ipv4/inet_connection_sock.c
|
||||
@@ -266,7 +266,7 @@ static inline int sk_reuseport_match(struct inet_bind_bucket *tb,
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
if (tb->fast_sk_family == AF_INET6)
|
||||
return ipv6_rcv_saddr_equal(&tb->fast_v6_rcv_saddr,
|
||||
- &sk->sk_v6_rcv_saddr,
|
||||
+ inet6_rcv_saddr(sk),
|
||||
tb->fast_rcv_saddr,
|
||||
sk->sk_rcv_saddr,
|
||||
tb->fast_ipv6_only,
|
|
@ -1,53 +0,0 @@
|
|||
From patchwork Mon Sep 18 16:28:57 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [3/3] inet: fix improper empty comparison
|
||||
X-Patchwork-Submitter: Josef Bacik <josef@toxicpanda.com>
|
||||
X-Patchwork-Id: 815029
|
||||
X-Patchwork-Delegate: davem@davemloft.net
|
||||
Message-Id: <1505752137-15522-4-git-send-email-jbacik@fb.com>
|
||||
To: davem@davemloft.net, netdev@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org, crobinso@redhat.com,
|
||||
labbott@redhat.com, kernel-team@fb.com
|
||||
Cc: Josef Bacik <jbacik@fb.com>, stable@vger.kernel.org
|
||||
Date: Mon, 18 Sep 2017 12:28:57 -0400
|
||||
From: josef@toxicpanda.com
|
||||
List-Id: <netdev.vger.kernel.org>
|
||||
|
||||
From: Josef Bacik <jbacik@fb.com>
|
||||
|
||||
When doing my reuseport rework I screwed up and changed a
|
||||
|
||||
if (hlist_empty(&tb->owners))
|
||||
|
||||
to
|
||||
|
||||
if (!hlist_empty(&tb->owners))
|
||||
|
||||
This is obviously bad as all of the reuseport/reuse logic was reversed,
|
||||
which caused weird problems like allowing an ipv4 bind conflict if we
|
||||
opened an ipv4 only socket on a port followed by an ipv6 only socket on
|
||||
the same port.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: b9470c27607b ("inet: kill smallest_size and smallest_port")
|
||||
Reported-by: Cole Robinson <crobinso@redhat.com>
|
||||
Signed-off-by: Josef Bacik <jbacik@fb.com>
|
||||
---
|
||||
net/ipv4/inet_connection_sock.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c
|
||||
index a1bf30438bc5..c039c937ba90 100644
|
||||
--- a/net/ipv4/inet_connection_sock.c
|
||||
+++ b/net/ipv4/inet_connection_sock.c
|
||||
@@ -321,7 +321,7 @@ int inet_csk_get_port(struct sock *sk, unsigned short snum)
|
||||
goto fail_unlock;
|
||||
}
|
||||
success:
|
||||
- if (!hlist_empty(&tb->owners)) {
|
||||
+ if (hlist_empty(&tb->owners)) {
|
||||
tb->fastreuse = reuse;
|
||||
if (sk->sk_reuseport) {
|
||||
tb->fastreuseport = FASTREUSEPORT_ANY;
|
|
@ -1,166 +0,0 @@
|
|||
From patchwork Tue Sep 26 21:10:20 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [1/2] media: dvb-usb-v2: lmedm04: Improve logic checking of warm
|
||||
start.
|
||||
From: Malcolm Priestley <tvboxspy@gmail.com>
|
||||
X-Patchwork-Id: 44566
|
||||
Message-Id: <20170926211021.11036-1-tvboxspy@gmail.com>
|
||||
To: linux-media@vger.kernel.org
|
||||
Cc: Andrey Konovalov <andreyknvl@google.com>,
|
||||
Malcolm Priestley <tvboxspy@gmail.com>
|
||||
Date: Tue, 26 Sep 2017 22:10:20 +0100
|
||||
|
||||
Warm start has no check as whether a genuine device has
|
||||
connected and proceeds to next execution path.
|
||||
|
||||
Check device should read 0x47 at offset of 2 on USB descriptor read
|
||||
and it is the amount requested of 6 bytes.
|
||||
|
||||
Fix for
|
||||
kasan: CONFIG_KASAN_INLINE enabled
|
||||
kasan: GPF could be caused by NULL-ptr deref or user memory access as
|
||||
|
||||
Reported-by: Andrey Konovalov <andreyknvl@google.com>
|
||||
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
|
||||
---
|
||||
drivers/media/usb/dvb-usb-v2/lmedm04.c | 26 ++++++++++++++++++--------
|
||||
1 file changed, 18 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/media/usb/dvb-usb-v2/lmedm04.c b/drivers/media/usb/dvb-usb-v2/lmedm04.c
|
||||
index 5e320fa4a795..992f2011a6ba 100644
|
||||
--- a/drivers/media/usb/dvb-usb-v2/lmedm04.c
|
||||
+++ b/drivers/media/usb/dvb-usb-v2/lmedm04.c
|
||||
@@ -494,18 +494,23 @@ static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
|
||||
|
||||
static int lme2510_return_status(struct dvb_usb_device *d)
|
||||
{
|
||||
- int ret = 0;
|
||||
+ int ret;
|
||||
u8 *data;
|
||||
|
||||
- data = kzalloc(10, GFP_KERNEL);
|
||||
+ data = kzalloc(6, GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
- ret |= usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
|
||||
- 0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200);
|
||||
- info("Firmware Status: %x (%x)", ret , data[2]);
|
||||
+ ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
|
||||
+ 0x06, 0x80, 0x0302, 0x00,
|
||||
+ data, 0x6, 200);
|
||||
+ if (ret != 6)
|
||||
+ ret = -EINVAL;
|
||||
+ else
|
||||
+ ret = data[2];
|
||||
+
|
||||
+ info("Firmware Status: %6ph", data);
|
||||
|
||||
- ret = (ret < 0) ? -ENODEV : data[2];
|
||||
kfree(data);
|
||||
return ret;
|
||||
}
|
||||
@@ -1189,6 +1194,7 @@ static int lme2510_get_adapter_count(struct dvb_usb_device *d)
|
||||
static int lme2510_identify_state(struct dvb_usb_device *d, const char **name)
|
||||
{
|
||||
struct lme2510_state *st = d->priv;
|
||||
+ int status;
|
||||
|
||||
usb_reset_configuration(d->udev);
|
||||
|
||||
@@ -1197,12 +1203,16 @@ static int lme2510_identify_state(struct dvb_usb_device *d, const char **name)
|
||||
|
||||
st->dvb_usb_lme2510_firmware = dvb_usb_lme2510_firmware;
|
||||
|
||||
- if (lme2510_return_status(d) == 0x44) {
|
||||
+ status = lme2510_return_status(d);
|
||||
+ if (status == 0x44) {
|
||||
*name = lme_firmware_switch(d, 0);
|
||||
return COLD;
|
||||
}
|
||||
|
||||
- return 0;
|
||||
+ if (status != 0x47)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ return WARM;
|
||||
}
|
||||
|
||||
static int lme2510_get_stream_config(struct dvb_frontend *fe, u8 *ts_type,
|
||||
From patchwork Tue Sep 26 21:10:21 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [2/2] media: dvb-usb-v2: lmedm04: move ts2020 attach to
|
||||
dm04_lme2510_tuner
|
||||
From: Malcolm Priestley <tvboxspy@gmail.com>
|
||||
X-Patchwork-Id: 44567
|
||||
Message-Id: <20170926211021.11036-2-tvboxspy@gmail.com>
|
||||
To: linux-media@vger.kernel.org
|
||||
Cc: Andrey Konovalov <andreyknvl@google.com>,
|
||||
Malcolm Priestley <tvboxspy@gmail.com>
|
||||
Date: Tue, 26 Sep 2017 22:10:21 +0100
|
||||
|
||||
When the tuner was split from m88rs2000 the attach function is in wrong
|
||||
place.
|
||||
|
||||
Move to dm04_lme2510_tuner to trap errors on failure and removing
|
||||
a call to lme_coldreset.
|
||||
|
||||
Prevents driver starting up without any tuner connected.
|
||||
|
||||
Fixes to trap for ts2020 fail.
|
||||
LME2510(C): FE Found M88RS2000
|
||||
ts2020: probe of 0-0060 failed with error -11
|
||||
...
|
||||
LME2510(C): TUN Found RS2000 tuner
|
||||
kasan: CONFIG_KASAN_INLINE enabled
|
||||
kasan: GPF could be caused by NULL-ptr deref or user memory access
|
||||
general protection fault: 0000 [#1] PREEMPT SMP KASAN
|
||||
|
||||
Reported-by: Andrey Konovalov <andreyknvl@google.com>
|
||||
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
|
||||
Tested-by: Andrey Konovalov <andreyknvl@google.com>
|
||||
---
|
||||
drivers/media/usb/dvb-usb-v2/lmedm04.c | 13 ++++++-------
|
||||
1 file changed, 6 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/media/usb/dvb-usb-v2/lmedm04.c b/drivers/media/usb/dvb-usb-v2/lmedm04.c
|
||||
index 992f2011a6ba..be26c029546b 100644
|
||||
--- a/drivers/media/usb/dvb-usb-v2/lmedm04.c
|
||||
+++ b/drivers/media/usb/dvb-usb-v2/lmedm04.c
|
||||
@@ -1076,8 +1076,6 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
|
||||
if (adap->fe[0]) {
|
||||
info("FE Found M88RS2000");
|
||||
- dvb_attach(ts2020_attach, adap->fe[0], &ts2020_config,
|
||||
- &d->i2c_adap);
|
||||
st->i2c_tuner_gate_w = 5;
|
||||
st->i2c_tuner_gate_r = 5;
|
||||
st->i2c_tuner_addr = 0x60;
|
||||
@@ -1143,17 +1141,18 @@ static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
|
||||
ret = st->tuner_config;
|
||||
break;
|
||||
case TUNER_RS2000:
|
||||
- ret = st->tuner_config;
|
||||
+ if (dvb_attach(ts2020_attach, adap->fe[0],
|
||||
+ &ts2020_config, &d->i2c_adap))
|
||||
+ ret = st->tuner_config;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
- if (ret)
|
||||
+ if (ret) {
|
||||
info("TUN Found %s tuner", tun_msg[ret]);
|
||||
- else {
|
||||
- info("TUN No tuner found --- resetting device");
|
||||
- lme_coldreset(d);
|
||||
+ } else {
|
||||
+ info("TUN No tuner found");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
From 4d6fa57b4dab0d77f4d8e9d9c73d1e63f6fe8fee Mon Sep 17 00:00:00 2001
|
||||
From: "Jason A. Donenfeld" <Jason@zx2c4.com>
|
||||
Date: Fri, 21 Apr 2017 23:14:48 +0200
|
||||
Subject: macsec: avoid heap overflow in skb_to_sgvec
|
||||
|
||||
While this may appear as a humdrum one line change, it's actually quite
|
||||
important. An sk_buff stores data in three places:
|
||||
|
||||
1. A linear chunk of allocated memory in skb->data. This is the easiest
|
||||
one to work with, but it precludes using scatterdata since the memory
|
||||
must be linear.
|
||||
2. The array skb_shinfo(skb)->frags, which is of maximum length
|
||||
MAX_SKB_FRAGS. This is nice for scattergather, since these fragments
|
||||
can point to different pages.
|
||||
3. skb_shinfo(skb)->frag_list, which is a pointer to another sk_buff,
|
||||
which in turn can have data in either (1) or (2).
|
||||
|
||||
The first two are rather easy to deal with, since they're of a fixed
|
||||
maximum length, while the third one is not, since there can be
|
||||
potentially limitless chains of fragments. Fortunately dealing with
|
||||
frag_list is opt-in for drivers, so drivers don't actually have to deal
|
||||
with this mess. For whatever reason, macsec decided it wanted pain, and
|
||||
so it explicitly specified NETIF_F_FRAGLIST.
|
||||
|
||||
Because dealing with (1), (2), and (3) is insane, most users of sk_buff
|
||||
doing any sort of crypto or paging operation calls a convenient function
|
||||
called skb_to_sgvec (which happens to be recursive if (3) is in use!).
|
||||
This takes a sk_buff as input, and writes into its output pointer an
|
||||
array of scattergather list items. Sometimes people like to declare a
|
||||
fixed size scattergather list on the stack; othertimes people like to
|
||||
allocate a fixed size scattergather list on the heap. However, if you're
|
||||
doing it in a fixed-size fashion, you really shouldn't be using
|
||||
NETIF_F_FRAGLIST too (unless you're also ensuring the sk_buff and its
|
||||
frag_list children arent't shared and then you check the number of
|
||||
fragments in total required.)
|
||||
|
||||
Macsec specifically does this:
|
||||
|
||||
size += sizeof(struct scatterlist) * (MAX_SKB_FRAGS + 1);
|
||||
tmp = kmalloc(size, GFP_ATOMIC);
|
||||
*sg = (struct scatterlist *)(tmp + sg_offset);
|
||||
...
|
||||
sg_init_table(sg, MAX_SKB_FRAGS + 1);
|
||||
skb_to_sgvec(skb, sg, 0, skb->len);
|
||||
|
||||
Specifying MAX_SKB_FRAGS + 1 is the right answer usually, but not if you're
|
||||
using NETIF_F_FRAGLIST, in which case the call to skb_to_sgvec will
|
||||
overflow the heap, and disaster ensues.
|
||||
|
||||
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
Cc: security@kernel.org
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/macsec.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
|
||||
index ff0a5ed..dbab05a 100644
|
||||
--- a/drivers/net/macsec.c
|
||||
+++ b/drivers/net/macsec.c
|
||||
@@ -2716,7 +2716,7 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb,
|
||||
}
|
||||
|
||||
#define MACSEC_FEATURES \
|
||||
- (NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST)
|
||||
+ (NETIF_F_SG | NETIF_F_HIGHDMA)
|
||||
static struct lock_class_key macsec_netdev_addr_lock_key;
|
||||
|
||||
static int macsec_dev_init(struct net_device *dev)
|
||||
--
|
||||
cgit v1.1
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
From ef14a4bf0910d06c7e202552914028d4956809cb Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Duggan <aduggan@synaptics.com>
|
||||
Date: Tue, 17 Oct 2017 18:37:36 -0700
|
||||
Subject: [PATCH] HID: rmi: Check that a device is a RMI device before calling
|
||||
RMI functions
|
||||
|
||||
The hid-rmi driver may handle non rmi devices on composite USB devices.
|
||||
Callbacks need to make sure that the current device is a RMI device before
|
||||
calling RMI specific functions. Most callbacks already have this check, but
|
||||
this patch adds checks to the remaining callbacks.
|
||||
|
||||
Reported-by: Hendrik Langer <hendrik.langer@gmx.de>
|
||||
Tested-by: Hendrik Langer <hendrik.langer@gmx.de>
|
||||
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
Signed-off-by: Andrew Duggan <aduggan@synaptics.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
---
|
||||
drivers/hid/hid-rmi.c | 13 ++++++++++---
|
||||
1 file changed, 10 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c
|
||||
index ef241d66562e..0f43c4292685 100644
|
||||
--- a/drivers/hid/hid-rmi.c
|
||||
+++ b/drivers/hid/hid-rmi.c
|
||||
@@ -368,6 +368,11 @@ static int rmi_check_sanity(struct hid_device *hdev, u8 *data, int size)
|
||||
static int rmi_raw_event(struct hid_device *hdev,
|
||||
struct hid_report *report, u8 *data, int size)
|
||||
{
|
||||
+ struct rmi_data *hdata = hid_get_drvdata(hdev);
|
||||
+
|
||||
+ if (!(hdata->device_flags & RMI_DEVICE))
|
||||
+ return 0;
|
||||
+
|
||||
size = rmi_check_sanity(hdev, data, size);
|
||||
if (size < 2)
|
||||
return 0;
|
||||
@@ -713,9 +718,11 @@ static void rmi_remove(struct hid_device *hdev)
|
||||
{
|
||||
struct rmi_data *hdata = hid_get_drvdata(hdev);
|
||||
|
||||
- clear_bit(RMI_STARTED, &hdata->flags);
|
||||
- cancel_work_sync(&hdata->reset_work);
|
||||
- rmi_unregister_transport_device(&hdata->xport);
|
||||
+ if (hdata->device_flags & RMI_DEVICE) {
|
||||
+ clear_bit(RMI_STARTED, &hdata->flags);
|
||||
+ cancel_work_sync(&hdata->reset_work);
|
||||
+ rmi_unregister_transport_device(&hdata->xport);
|
||||
+ }
|
||||
|
||||
hid_hw_stop(hdev);
|
||||
}
|
||||
--
|
||||
2.14.3
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
From patchwork Thu Sep 28 20:07:19 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Subject: Input: synaptics - Disable kernel tracking on SMBus devices
|
||||
From: Andrew Duggan <aduggan@synaptics.com>
|
||||
X-Patchwork-Id: 9976729
|
||||
Message-Id: <1506629239-5940-1-git-send-email-aduggan@synaptics.com>
|
||||
To: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org
|
||||
Cc: Andrew Duggan <aduggan@synaptics.com>,
|
||||
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
|
||||
Benjamin Tissoires <benjamin.tissoires@redhat.com>,
|
||||
=?UTF-8?q?Kamil=20P=C3=A1ral?= <kparal@redhat.com>
|
||||
Date: Thu, 28 Sep 2017 13:07:19 -0700
|
||||
|
||||
In certain situations kernel tracking seems to be getting confused
|
||||
and incorrectly reporting the slot of a contact. On example is when
|
||||
the user does a three finger click or tap and then places two fingers
|
||||
on the touchpad in the same area. The kernel tracking code seems to
|
||||
continue to think that there are three contacts on the touchpad and
|
||||
incorrectly alternates the slot of one of the contacts. The result that
|
||||
is the input subsystem reports a stream of button press and release
|
||||
events as the reported slot changes.
|
||||
|
||||
Kernel tracking was originally enabled to prevent cursor jumps, but it
|
||||
is unclear how much of an issue kernel jumps actually are. This patch
|
||||
simply disabled kernel tracking for now.
|
||||
|
||||
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1482640
|
||||
|
||||
Signed-off-by: Andrew Duggan <aduggan@synaptics.com>
|
||||
Tested-by: Kamil Páral <kparal@redhat.com>
|
||||
Acked-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
---
|
||||
drivers/input/mouse/synaptics.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
|
||||
index 5af0b7d..ee5466a 100644
|
||||
--- a/drivers/input/mouse/synaptics.c
|
||||
+++ b/drivers/input/mouse/synaptics.c
|
||||
@@ -1709,8 +1709,7 @@ static int synaptics_create_intertouch(struct psmouse *psmouse,
|
||||
.sensor_pdata = {
|
||||
.sensor_type = rmi_sensor_touchpad,
|
||||
.axis_align.flip_y = true,
|
||||
- /* to prevent cursors jumps: */
|
||||
- .kernel_tracking = true,
|
||||
+ .kernel_tracking = false,
|
||||
.topbuttonpad = topbuttonpad,
|
||||
},
|
||||
.f30_data = {
|
|
@ -1,77 +0,0 @@
|
|||
From patchwork Mon Oct 2 18:31:24 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: ahci: don't ignore result code of ahci_reset_controller()
|
||||
X-Patchwork-Submitter: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
X-Patchwork-Id: 820637
|
||||
X-Patchwork-Delegate: davem@davemloft.net
|
||||
Message-Id: <20171002183124.17003-1-ard.biesheuvel@linaro.org>
|
||||
To: linux-ide@vger.kernel.org, tj@kernel.org
|
||||
Cc: graeme.gregory@linaro.org, leif.lindholm@linaro.org,
|
||||
daniel.thompson@Linaro.org, Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
Date: Mon, 2 Oct 2017 19:31:24 +0100
|
||||
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
List-Id: <linux-ide.vger.kernel.org>
|
||||
|
||||
ahci_pci_reset_controller() calls ahci_reset_controller(), which may
|
||||
fail, but ignores the result code and always returns success. This
|
||||
may result in failures like below
|
||||
|
||||
ahci 0000:02:00.0: version 3.0
|
||||
ahci 0000:02:00.0: enabling device (0000 -> 0003)
|
||||
ahci 0000:02:00.0: SSS flag set, parallel bus scan disabled
|
||||
ahci 0000:02:00.0: controller reset failed (0xffffffff)
|
||||
ahci 0000:02:00.0: failed to stop engine (-5)
|
||||
... repeated many times ...
|
||||
ahci 0000:02:00.0: failed to stop engine (-5)
|
||||
Unable to handle kernel paging request at virtual address ffff0000093f9018
|
||||
...
|
||||
PC is at ahci_stop_engine+0x5c/0xd8 [libahci]
|
||||
LR is at ahci_deinit_port.constprop.12+0x1c/0xc0 [libahci]
|
||||
...
|
||||
[<ffff000000a17014>] ahci_stop_engine+0x5c/0xd8 [libahci]
|
||||
[<ffff000000a196b4>] ahci_deinit_port.constprop.12+0x1c/0xc0 [libahci]
|
||||
[<ffff000000a197d8>] ahci_init_controller+0x80/0x168 [libahci]
|
||||
[<ffff000000a260f8>] ahci_pci_init_controller+0x60/0x68 [ahci]
|
||||
[<ffff000000a26f94>] ahci_init_one+0x75c/0xd88 [ahci]
|
||||
[<ffff000008430324>] local_pci_probe+0x3c/0xb8
|
||||
[<ffff000008431728>] pci_device_probe+0x138/0x170
|
||||
[<ffff000008585e54>] driver_probe_device+0x2dc/0x458
|
||||
[<ffff0000085860e4>] __driver_attach+0x114/0x118
|
||||
[<ffff000008583ca8>] bus_for_each_dev+0x60/0xa0
|
||||
[<ffff000008585638>] driver_attach+0x20/0x28
|
||||
[<ffff0000085850b0>] bus_add_driver+0x1f0/0x2a8
|
||||
[<ffff000008586ae0>] driver_register+0x60/0xf8
|
||||
[<ffff00000842f9b4>] __pci_register_driver+0x3c/0x48
|
||||
[<ffff000000a3001c>] ahci_pci_driver_init+0x1c/0x1000 [ahci]
|
||||
[<ffff000008083918>] do_one_initcall+0x38/0x120
|
||||
|
||||
where an obvious hardware level failure results in an unnecessary 15 second
|
||||
delay and a subsequent crash.
|
||||
|
||||
So record the result code of ahci_reset_controller() and relay it, rather
|
||||
than ignoring it.
|
||||
|
||||
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
---
|
||||
drivers/ata/ahci.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
|
||||
index 5a5fd0b404eb..649e799df9c1 100644
|
||||
--- a/drivers/ata/ahci.c
|
||||
+++ b/drivers/ata/ahci.c
|
||||
@@ -621,8 +621,11 @@ static void ahci_pci_save_initial_config(struct pci_dev *pdev,
|
||||
static int ahci_pci_reset_controller(struct ata_host *host)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(host->dev);
|
||||
+ int rc;
|
||||
|
||||
- ahci_reset_controller(host);
|
||||
+ rc = ahci_reset_controller(host);
|
||||
+ if (rc)
|
||||
+ return rc;
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
|
||||
struct ahci_host_priv *hpriv = host->private_data;
|
File diff suppressed because it is too large
Load Diff
|
@ -1,121 +0,0 @@
|
|||
From 723288836628bc1c0855f3bb7b64b1803e4b9e4a Mon Sep 17 00:00:00 2001
|
||||
From: Robin Murphy <robin.murphy@arm.com>
|
||||
Date: Thu, 31 Aug 2017 11:32:54 +0100
|
||||
Subject: of: restrict DMA configuration
|
||||
|
||||
Moving DMA configuration to happen later at driver probe time had the
|
||||
unnoticed side-effect that we now perform DMA configuration for *every*
|
||||
device represented in DT, rather than only those explicitly created by
|
||||
the of_platform and PCI code.
|
||||
|
||||
As Christoph points out, this is not really the best thing to do. Whilst
|
||||
there may well be other DMA-capable buses that can benefit from having
|
||||
their children automatically configured after the bridge has probed,
|
||||
there are also plenty of others like USB, MDIO, etc. that definitely do
|
||||
not support DMA and should not be indiscriminately processed.
|
||||
|
||||
The good news is that in most cases the DT "dma-ranges" property serves
|
||||
as an appropriate indicator - per a strict interpretation of the spec,
|
||||
anything lacking a "dma-ranges" property should be considered not to
|
||||
have a mapping of DMA address space from its children to its parent,
|
||||
thus anything for which of_dma_get_range() does not succeed does not
|
||||
need DMA configuration. Certain bus types have a general expectation of
|
||||
DMA capability and carry a well-established precedent that an absent
|
||||
"dma-ranges" implies the same as the empty property, so we automatically
|
||||
opt those in to DMA configuration regardless, to avoid regressing most
|
||||
existing platforms.
|
||||
|
||||
Fixes: 09515ef5ddad ("of/acpi: Configure dma operations at probe time for platform/amba/pci bus devices")
|
||||
Reported-by: Christoph Hellwig <hch@lst.de>
|
||||
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
Signed-off-by: Christoph Hellwig <hch@lst.de>
|
||||
---
|
||||
drivers/of/device.c | 48 ++++++++++++++++++++++++++++++++----------------
|
||||
1 file changed, 32 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/drivers/of/device.c b/drivers/of/device.c
|
||||
index e0a28ea..04c4c95 100644
|
||||
--- a/drivers/of/device.c
|
||||
+++ b/drivers/of/device.c
|
||||
@@ -9,6 +9,9 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/pci.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/amba/bus.h>
|
||||
|
||||
#include <asm/errno.h>
|
||||
#include "of_private.h"
|
||||
@@ -84,31 +87,28 @@ int of_device_add(struct platform_device *ofdev)
|
||||
*/
|
||||
int of_dma_configure(struct device *dev, struct device_node *np)
|
||||
{
|
||||
- u64 dma_addr, paddr, size;
|
||||
+ u64 dma_addr, paddr, size = 0;
|
||||
int ret;
|
||||
bool coherent;
|
||||
unsigned long offset;
|
||||
const struct iommu_ops *iommu;
|
||||
u64 mask;
|
||||
|
||||
- /*
|
||||
- * Set default coherent_dma_mask to 32 bit. Drivers are expected to
|
||||
- * setup the correct supported mask.
|
||||
- */
|
||||
- if (!dev->coherent_dma_mask)
|
||||
- dev->coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
-
|
||||
- /*
|
||||
- * Set it to coherent_dma_mask by default if the architecture
|
||||
- * code has not set it.
|
||||
- */
|
||||
- if (!dev->dma_mask)
|
||||
- dev->dma_mask = &dev->coherent_dma_mask;
|
||||
-
|
||||
ret = of_dma_get_range(np, &dma_addr, &paddr, &size);
|
||||
if (ret < 0) {
|
||||
+ /*
|
||||
+ * For legacy reasons, we have to assume some devices need
|
||||
+ * DMA configuration regardless of whether "dma-ranges" is
|
||||
+ * correctly specified or not.
|
||||
+ */
|
||||
+ if (!dev_is_pci(dev) &&
|
||||
+#ifdef CONFIG_ARM_AMBA
|
||||
+ dev->bus != &amba_bustype &&
|
||||
+#endif
|
||||
+ dev->bus != &platform_bus_type)
|
||||
+ return ret == -ENODEV ? 0 : ret;
|
||||
+
|
||||
dma_addr = offset = 0;
|
||||
- size = max(dev->coherent_dma_mask, dev->coherent_dma_mask + 1);
|
||||
} else {
|
||||
offset = PFN_DOWN(paddr - dma_addr);
|
||||
|
||||
@@ -129,6 +129,22 @@ int of_dma_configure(struct device *dev, struct device_node *np)
|
||||
dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset);
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Set default coherent_dma_mask to 32 bit. Drivers are expected to
|
||||
+ * setup the correct supported mask.
|
||||
+ */
|
||||
+ if (!dev->coherent_dma_mask)
|
||||
+ dev->coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
+ /*
|
||||
+ * Set it to coherent_dma_mask by default if the architecture
|
||||
+ * code has not set it.
|
||||
+ */
|
||||
+ if (!dev->dma_mask)
|
||||
+ dev->dma_mask = &dev->coherent_dma_mask;
|
||||
+
|
||||
+ if (!size)
|
||||
+ size = max(dev->coherent_dma_mask, dev->coherent_dma_mask + 1);
|
||||
+
|
||||
dev->dma_pfn_offset = offset;
|
||||
|
||||
/*
|
||||
--
|
||||
cgit v1.1
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
From patchwork Sun Jul 9 16:36:14 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: ARM: tegra: Register host1x node with iommu binding on tegra124
|
||||
From: Paul Kocialkowski <contact@paulk.fr>
|
||||
X-Patchwork-Id: 9831825
|
||||
Message-Id: <20170709163614.6746-1-contact@paulk.fr>
|
||||
To: linux-arm-kernel@lists.infradead.org, linux-tegra@vger.kernel.org,
|
||||
linux-kernel@vger.kernel.org
|
||||
Cc: Thierry Reding <thierry.reding@gmail.com>,
|
||||
Stephen Warren <swarren@wwwdotorg.org>,
|
||||
Mikko Perttunen <mperttunen@nvidia.com>,
|
||||
Paul Kocialkowski <contact@paulk.fr>,
|
||||
Jonathan Hunter <jonathanh@nvidia.com>
|
||||
Date: Sun, 9 Jul 2017 19:36:14 +0300
|
||||
|
||||
This registers the host1x node with the SMMU (as HC swgroup) to allow
|
||||
the host1x code to attach to it. It avoid failing the probe sequence,
|
||||
which resulted in the tegra drm driver not probing and thus nothing
|
||||
being displayed on-screen.
|
||||
|
||||
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
|
||||
---
|
||||
arch/arm/boot/dts/tegra124.dtsi | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/tegra124.dtsi b/arch/arm/boot/dts/tegra124.dtsi
|
||||
index 187a36c6d0fc..b3b89befffeb 100644
|
||||
--- a/arch/arm/boot/dts/tegra124.dtsi
|
||||
+++ b/arch/arm/boot/dts/tegra124.dtsi
|
||||
@@ -85,6 +85,7 @@
|
||||
clocks = <&tegra_car TEGRA124_CLK_HOST1X>;
|
||||
resets = <&tegra_car 28>;
|
||||
reset-names = "host1x";
|
||||
+ iommus = <&mc TEGRA_SWGROUP_HC>;
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
|
@ -0,0 +1,41 @@
|
|||
From 90e388ca5d8bbee022f9ed5fc24137b31579fa6e Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Wed, 22 Nov 2017 15:52:36 +0000
|
||||
Subject: [PATCH] Revert "arm64: allwinner: a64: pine64: Use dcdc1 regulator
|
||||
for mmc0"
|
||||
|
||||
This reverts commit 3f241bfa60bdc9c4fde63fa6664a8ce00fd668c6.
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
|
||||
index d06e34b5d192..caf8b6fbe5e3 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
|
||||
@@ -61,6 +61,13 @@
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
+
|
||||
+ reg_vcc3v3: vcc3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc3v3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ };
|
||||
};
|
||||
|
||||
&ehci0 {
|
||||
@@ -84,7 +91,7 @@
|
||||
&mmc0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mmc0_pins>;
|
||||
- vmmc-supply = <®_dcdc1>;
|
||||
+ vmmc-supply = <®_vcc3v3>;
|
||||
cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
disable-wp;
|
||||
--
|
||||
2.14.3
|
||||
|
|
@ -1,712 +0,0 @@
|
|||
From 4c0a84757b5a0365a5dde82e732972eda80a32b1 Mon Sep 17 00:00:00 2001
|
||||
From: Icenowy Zheng <icenowy@aosc.io>
|
||||
Date: Thu, 18 May 2017 15:16:51 +0800
|
||||
Subject: arm64: allwinner: a64: add DTSI file for AXP803 PMIC
|
||||
|
||||
As nearly all A64 boards are using AXP803 PMIC, add a DTSI file for it,
|
||||
like the old DTSI files for AXP20x/22x, for the common parts of the
|
||||
PMIC.
|
||||
|
||||
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
|
||||
Acked-by: Mark Brown <broonie@kernel.org>
|
||||
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/axp803.dtsi | 150 ++++++++++++++++++++++++++++++
|
||||
1 file changed, 150 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/allwinner/axp803.dtsi
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/axp803.dtsi b/arch/arm64/boot/dts/allwinner/axp803.dtsi
|
||||
new file mode 100644
|
||||
index 0000000..ff8af52
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/allwinner/axp803.dtsi
|
||||
@@ -0,0 +1,150 @@
|
||||
+/*
|
||||
+ * Copyright 2017 Icenowy Zheng <icenowy@aosc.xyz>
|
||||
+ *
|
||||
+ * This file is dual-licensed: you can use it either under the terms
|
||||
+ * of the GPL or the X11 license, at your option. Note that this dual
|
||||
+ * licensing only applies to this file, and not this project as a
|
||||
+ * whole.
|
||||
+ *
|
||||
+ * a) This file is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License as
|
||||
+ * published by the Free Software Foundation; either version 2 of the
|
||||
+ * License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * This file 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.
|
||||
+ *
|
||||
+ * Or, alternatively,
|
||||
+ *
|
||||
+ * b) Permission is hereby granted, free of charge, to any person
|
||||
+ * obtaining a copy of this software and associated documentation
|
||||
+ * files (the "Software"), to deal in the Software without
|
||||
+ * restriction, including without limitation the rights to use,
|
||||
+ * copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
+ * sell copies of the Software, and to permit persons to whom the
|
||||
+ * Software is furnished to do so, subject to the following
|
||||
+ * conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be
|
||||
+ * included in all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
+ * OTHER DEALINGS IN THE SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * AXP803 Integrated Power Management Chip
|
||||
+ * http://files.pine64.org/doc/datasheet/pine64/AXP803_Datasheet_V1.0.pdf
|
||||
+ */
|
||||
+
|
||||
+&axp803 {
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+
|
||||
+ regulators {
|
||||
+ /* Default work frequency for buck regulators */
|
||||
+ x-powers,dcdc-freq = <3000>;
|
||||
+
|
||||
+ reg_aldo1: aldo1 {
|
||||
+ regulator-name = "aldo1";
|
||||
+ };
|
||||
+
|
||||
+ reg_aldo2: aldo2 {
|
||||
+ regulator-name = "aldo2";
|
||||
+ };
|
||||
+
|
||||
+ reg_aldo3: aldo3 {
|
||||
+ regulator-name = "aldo3";
|
||||
+ };
|
||||
+
|
||||
+ reg_dc1sw: dc1sw {
|
||||
+ regulator-name = "dc1sw";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdc1: dcdc1 {
|
||||
+ regulator-name = "dcdc1";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdc2: dcdc2 {
|
||||
+ regulator-name = "dcdc2";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdc3: dcdc3 {
|
||||
+ regulator-name = "dcdc3";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdc4: dcdc4 {
|
||||
+ regulator-name = "dcdc4";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdc5: dcdc5 {
|
||||
+ regulator-name = "dcdc5";
|
||||
+ };
|
||||
+
|
||||
+ reg_dcdc6: dcdc6 {
|
||||
+ regulator-name = "dcdc6";
|
||||
+ };
|
||||
+
|
||||
+ reg_dldo1: dldo1 {
|
||||
+ regulator-name = "dldo1";
|
||||
+ };
|
||||
+
|
||||
+ reg_dldo2: dldo2 {
|
||||
+ regulator-name = "dldo2";
|
||||
+ };
|
||||
+
|
||||
+ reg_dldo3: dldo3 {
|
||||
+ regulator-name = "dldo3";
|
||||
+ };
|
||||
+
|
||||
+ reg_dldo4: dldo4 {
|
||||
+ regulator-name = "dldo4";
|
||||
+ };
|
||||
+
|
||||
+ reg_eldo1: eldo1 {
|
||||
+ regulator-name = "eldo1";
|
||||
+ };
|
||||
+
|
||||
+ reg_eldo2: eldo2 {
|
||||
+ regulator-name = "eldo2";
|
||||
+ };
|
||||
+
|
||||
+ reg_eldo3: eldo3 {
|
||||
+ regulator-name = "eldo3";
|
||||
+ };
|
||||
+
|
||||
+ reg_fldo1: fldo1 {
|
||||
+ regulator-name = "fldo1";
|
||||
+ };
|
||||
+
|
||||
+ reg_fldo2: fldo2 {
|
||||
+ regulator-name = "fldo2";
|
||||
+ };
|
||||
+
|
||||
+ reg_ldo_io0: ldo-io0 {
|
||||
+ regulator-name = "ldo-io0";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ reg_ldo_io1: ldo-io1 {
|
||||
+ regulator-name = "ldo-io1";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ reg_rtc_ldo: rtc-ldo {
|
||||
+ /* RTC_LDO is a fixed, always-on regulator */
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3000000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-name = "rtc-ldo";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
--
|
||||
cgit v1.1
|
||||
From 535ca50858e2d8bf1618ace056cd96f0b3d01133 Mon Sep 17 00:00:00 2001
|
||||
From: Icenowy Zheng <icenowy@aosc.io>
|
||||
Date: Tue, 6 Jun 2017 13:59:32 +0800
|
||||
Subject: arm64: allwinner: a64: add NMI (R_INTC) controller on A64
|
||||
|
||||
Allwinner A64 SoC features a R_INTC controller, which controls the NMI
|
||||
line, and this interrupt line is usually connected to the AXP PMIC.
|
||||
|
||||
Add support for it.
|
||||
|
||||
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
|
||||
[wens@csie.org: Add fallback sun6i-a31-r-intc compatible]
|
||||
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
||||
Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
index 9d00622..78c7c9d 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||
@@ -487,6 +487,15 @@
|
||||
<GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
+ r_intc: interrupt-controller@1f00c00 {
|
||||
+ compatible = "allwinner,sun50i-a64-r-intc",
|
||||
+ "allwinner,sun6i-a31-r-intc";
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ reg = <0x01f00c00 0x400>;
|
||||
+ interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ };
|
||||
+
|
||||
r_ccu: clock@1f01400 {
|
||||
compatible = "allwinner,sun50i-a64-r-ccu";
|
||||
reg = <0x01f01400 0x100>;
|
||||
--
|
||||
cgit v1.1
|
||||
From bf397214530ee5c873dac7b12126b250afd3831f Mon Sep 17 00:00:00 2001
|
||||
From: Jagan Teki <jagan@amarulasolutions.com>
|
||||
Date: Mon, 14 Aug 2017 16:06:53 +0530
|
||||
Subject: arm64: allwinner: a64: Add initial NanoPi A64 support
|
||||
|
||||
NanoPi A64 is a new board of high performance with low cost
|
||||
designed by FriendlyElec., using the Allwinner A64 SOC.
|
||||
|
||||
Nanopi A64 features
|
||||
- Allwinner A64, 64-bit Quad-core Cortex-A53@648MHz to 1.152GHz, DVFS
|
||||
- 1GB DDR3 RAM
|
||||
- MicroSD
|
||||
- Gigabit Ethernet (RTL8211E)
|
||||
- Wi-Fi 802.11b/g/n
|
||||
- IR receiver
|
||||
- Audio In/Out
|
||||
- Video In/Out
|
||||
- Serial Debug Port
|
||||
- microUSB 5V 2A DC power-supply
|
||||
|
||||
Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
|
||||
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/Makefile | 1 +
|
||||
.../boot/dts/allwinner/sun50i-a64-nanopi-a64.dts | 207 +++++++++++++++++++++
|
||||
2 files changed, 208 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
index 108f12c..c997b5c 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/Makefile
|
||||
+++ b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
@@ -1,4 +1,5 @@
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-bananapi-m64.dtb
|
||||
+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-nanopi-a64.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-orangepi-win.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-pine64-plus.dtb sun50i-a64-pine64.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-sopine-baseboard.dtb
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts
|
||||
new file mode 100644
|
||||
index 0000000..2beef9e
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-nanopi-a64.dts
|
||||
@@ -0,0 +1,207 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Jagan Teki <jteki@openedev.com>
|
||||
+ *
|
||||
+ * This file is dual-licensed: you can use it either under the terms
|
||||
+ * of the GPL or the X11 license, at your option. Note that this dual
|
||||
+ * licensing only applies to this file, and not this project as a
|
||||
+ * whole.
|
||||
+ *
|
||||
+ * a) This library is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License as
|
||||
+ * published by the Free Software Foundation; either version 2 of the
|
||||
+ * License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * This library 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.
|
||||
+ *
|
||||
+ * Or, alternatively,
|
||||
+ *
|
||||
+ * b) Permission is hereby granted, free of charge, to any person
|
||||
+ * obtaining a copy of this software and associated documentation
|
||||
+ * files (the "Software"), to deal in the Software without
|
||||
+ * restriction, including without limitation the rights to use,
|
||||
+ * copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
+ * sell copies of the Software, and to permit persons to whom the
|
||||
+ * Software is furnished to do so, subject to the following
|
||||
+ * conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be
|
||||
+ * included in all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
+ * OTHER DEALINGS IN THE SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "sun50i-a64.dtsi"
|
||||
+
|
||||
+#include <dt-bindings/gpio/gpio.h>
|
||||
+
|
||||
+/ {
|
||||
+ model = "FriendlyARM NanoPi A64";
|
||||
+ compatible = "friendlyarm,nanopi-a64", "allwinner,sun50i-a64";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&ehci0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ehci1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+/* i2c1 connected with gpio headers like pine64, bananapi */
|
||||
+&i2c1 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&i2c1_pins>;
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&i2c1_pins {
|
||||
+ bias-pull-up;
|
||||
+};
|
||||
+
|
||||
+&mmc0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&mmc0_pins>;
|
||||
+ vmmc-supply = <®_dcdc1>;
|
||||
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>;
|
||||
+ cd-inverted;
|
||||
+ disable-wp;
|
||||
+ bus-width = <4>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ohci0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ohci1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&r_rsb {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ axp803: pmic@3a3 {
|
||||
+ compatible = "x-powers,axp803";
|
||||
+ reg = <0x3a3>;
|
||||
+ interrupt-parent = <&r_intc>;
|
||||
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+#include "axp803.dtsi"
|
||||
+
|
||||
+®_aldo2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-pl";
|
||||
+};
|
||||
+
|
||||
+®_aldo3 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3000000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-name = "vcc-pll-avcc";
|
||||
+};
|
||||
+
|
||||
+®_dcdc1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3000000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-name = "vcc-3v";
|
||||
+};
|
||||
+
|
||||
+®_dcdc2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1040000>;
|
||||
+ regulator-max-microvolt = <1300000>;
|
||||
+ regulator-name = "vdd-cpux";
|
||||
+};
|
||||
+
|
||||
+/* DCDC3 is polyphased with DCDC2 */
|
||||
+
|
||||
+®_dcdc5 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1500000>;
|
||||
+ regulator-max-microvolt = <1500000>;
|
||||
+ regulator-name = "vcc-dram";
|
||||
+};
|
||||
+
|
||||
+®_dcdc6 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1100000>;
|
||||
+ regulator-max-microvolt = <1100000>;
|
||||
+ regulator-name = "vdd-sys";
|
||||
+};
|
||||
+
|
||||
+®_dldo1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-hdmi-dsi";
|
||||
+};
|
||||
+
|
||||
+®_dldo4 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3000000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-name = "vcc-pg-wifi-io";
|
||||
+};
|
||||
+
|
||||
+®_eldo1 {
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "cpvdd";
|
||||
+};
|
||||
+
|
||||
+®_fldo1 {
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <1200000>;
|
||||
+ regulator-name = "vcc-1v2-hsic";
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * The A64 chip cannot work without this regulator off, although
|
||||
+ * it seems to be only driving the AR100 core.
|
||||
+ * Maybe we don't still know well about CPUs domain.
|
||||
+ */
|
||||
+®_fldo2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1100000>;
|
||||
+ regulator-max-microvolt = <1100000>;
|
||||
+ regulator-name = "vdd-cpus";
|
||||
+};
|
||||
+
|
||||
+®_rtc_ldo {
|
||||
+ regulator-name = "vcc-rtc";
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&uart0_pins_a>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usbphy {
|
||||
+ status = "okay";
|
||||
+};
|
||||
--
|
||||
cgit v1.1
|
||||
From 4969efb28b4301b09aba621f30cf81c582c018a8 Mon Sep 17 00:00:00 2001
|
||||
From: Jagan Teki <jagan@amarulasolutions.com>
|
||||
Date: Mon, 14 Aug 2017 16:16:04 +0530
|
||||
Subject: arm64: allwinner: a64: Add A64-OLinuXino initial support
|
||||
|
||||
OLimex A64-OLinuXino is an open-source hardware board
|
||||
using the Allwinner A64 SOC.
|
||||
|
||||
OLimex A64-OLinuXino has
|
||||
- A64 Quad-core Cortex-A53 64bit
|
||||
- 1GB or 2GB RAM DDR3L @ 672Mhz
|
||||
- microSD slot and 4/8/16GB eMMC
|
||||
- Debug TTL UART
|
||||
- HDMI
|
||||
- LCD
|
||||
- IR receiver
|
||||
- 5V DC power supply
|
||||
|
||||
Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
|
||||
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/Makefile | 1 +
|
||||
.../boot/dts/allwinner/sun50i-a64-olinuxino.dts | 199 +++++++++++++++++++++
|
||||
2 files changed, 200 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
index c997b5c..19c3fbd 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/Makefile
|
||||
+++ b/arch/arm64/boot/dts/allwinner/Makefile
|
||||
@@ -1,5 +1,6 @@
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-bananapi-m64.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-nanopi-a64.dtb
|
||||
+dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-olinuxino.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-orangepi-win.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-pine64-plus.dtb sun50i-a64-pine64.dtb
|
||||
dtb-$(CONFIG_ARCH_SUNXI) += sun50i-a64-sopine-baseboard.dtb
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts
|
||||
new file mode 100644
|
||||
index 0000000..338e7861
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-olinuxino.dts
|
||||
@@ -0,0 +1,199 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2017 Jagan Teki <jteki@openedev.com>
|
||||
+ *
|
||||
+ * This file is dual-licensed: you can use it either under the terms
|
||||
+ * of the GPL or the X11 license, at your option. Note that this dual
|
||||
+ * licensing only applies to this file, and not this project as a
|
||||
+ * whole.
|
||||
+ *
|
||||
+ * a) This library is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License as
|
||||
+ * published by the Free Software Foundation; either version 2 of the
|
||||
+ * License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * This library 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.
|
||||
+ *
|
||||
+ * Or, alternatively,
|
||||
+ *
|
||||
+ * b) Permission is hereby granted, free of charge, to any person
|
||||
+ * obtaining a copy of this software and associated documentation
|
||||
+ * files (the "Software"), to deal in the Software without
|
||||
+ * restriction, including without limitation the rights to use,
|
||||
+ * copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
+ * sell copies of the Software, and to permit persons to whom the
|
||||
+ * Software is furnished to do so, subject to the following
|
||||
+ * conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be
|
||||
+ * included in all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
+ * OTHER DEALINGS IN THE SOFTWARE.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "sun50i-a64.dtsi"
|
||||
+
|
||||
+#include <dt-bindings/gpio/gpio.h>
|
||||
+
|
||||
+/ {
|
||||
+ model = "Olimex A64-Olinuxino";
|
||||
+ compatible = "olimex,a64-olinuxino", "allwinner,sun50i-a64";
|
||||
+
|
||||
+ aliases {
|
||||
+ serial0 = &uart0;
|
||||
+ };
|
||||
+
|
||||
+ chosen {
|
||||
+ stdout-path = "serial0:115200n8";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&mmc0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&mmc0_pins>;
|
||||
+ vmmc-supply = <®_dcdc1>;
|
||||
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>;
|
||||
+ cd-inverted;
|
||||
+ disable-wp;
|
||||
+ bus-width = <4>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&r_rsb {
|
||||
+ status = "okay";
|
||||
+
|
||||
+ axp803: pmic@3a3 {
|
||||
+ compatible = "x-powers,axp803";
|
||||
+ reg = <0x3a3>;
|
||||
+ interrupt-parent = <&r_intc>;
|
||||
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+#include "axp803.dtsi"
|
||||
+
|
||||
+®_aldo1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <2800000>;
|
||||
+ regulator-max-microvolt = <2800000>;
|
||||
+ regulator-name = "vcc-pe";
|
||||
+};
|
||||
+
|
||||
+®_aldo2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-pl";
|
||||
+};
|
||||
+
|
||||
+®_aldo3 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3000000>;
|
||||
+ regulator-max-microvolt = <3000000>;
|
||||
+ regulator-name = "vcc-pll-avcc";
|
||||
+};
|
||||
+
|
||||
+®_dcdc1 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-3v3";
|
||||
+};
|
||||
+
|
||||
+®_dcdc2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1040000>;
|
||||
+ regulator-max-microvolt = <1300000>;
|
||||
+ regulator-name = "vdd-cpux";
|
||||
+};
|
||||
+
|
||||
+/* DCDC3 is polyphased with DCDC2 */
|
||||
+
|
||||
+®_dcdc5 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1500000>;
|
||||
+ regulator-max-microvolt = <1500000>;
|
||||
+ regulator-name = "vcc-ddr3";
|
||||
+};
|
||||
+
|
||||
+®_dcdc6 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1100000>;
|
||||
+ regulator-max-microvolt = <1100000>;
|
||||
+ regulator-name = "vdd-sys";
|
||||
+};
|
||||
+
|
||||
+®_dldo1 {
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-hdmi";
|
||||
+};
|
||||
+
|
||||
+®_dldo2 {
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-mipi";
|
||||
+};
|
||||
+
|
||||
+®_dldo3 {
|
||||
+ regulator-min-microvolt = <2800000>;
|
||||
+ regulator-max-microvolt = <2800000>;
|
||||
+ regulator-name = "vcc-avdd-csi";
|
||||
+};
|
||||
+
|
||||
+®_dldo4 {
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-name = "vcc-wifi-io";
|
||||
+};
|
||||
+
|
||||
+®_eldo1 {
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "cpvdd";
|
||||
+};
|
||||
+
|
||||
+®_eldo2 {
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-name = "vcc-dvdd-csi";
|
||||
+};
|
||||
+
|
||||
+®_fldo1 {
|
||||
+ regulator-min-microvolt = <1200000>;
|
||||
+ regulator-max-microvolt = <1200000>;
|
||||
+ regulator-name = "vcc-1v2-hsic";
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * The A64 chip cannot work without this regulator off, although
|
||||
+ * it seems to be only driving the AR100 core.
|
||||
+ * Maybe we don't still know well about CPUs domain.
|
||||
+ */
|
||||
+®_fldo2 {
|
||||
+ regulator-always-on;
|
||||
+ regulator-min-microvolt = <1100000>;
|
||||
+ regulator-max-microvolt = <1100000>;
|
||||
+ regulator-name = "vdd-cpus";
|
||||
+};
|
||||
+
|
||||
+®_rtc_ldo {
|
||||
+ regulator-name = "vcc-rtc";
|
||||
+};
|
||||
+
|
||||
+&uart0 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&uart0_pins_a>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
--
|
||||
cgit v1.1
|
|
@ -1,455 +0,0 @@
|
|||
From c03847b4a603846903ee72a5e1baab03e0591423 Mon Sep 17 00:00:00 2001
|
||||
From: Ashok Kumar Sekar <asekar@redhat.com>
|
||||
Date: Fri, 23 Sep 2016 04:16:19 -0700
|
||||
Subject: [PATCH 1/8] PCI: Vulcan: AHCI PCI bar fix for Broadcom Vulcan early
|
||||
silicon
|
||||
|
||||
PCI BAR 5 is not setup correctly for the on-board AHCI
|
||||
controller on Broadcom's Vulcan processor. Added a quirk to fix BAR 5
|
||||
by using BAR 4's resources which are populated correctly but NOT used
|
||||
by the AHCI controller actually.
|
||||
|
||||
Signed-off-by: Ashok Kumar Sekar <asekar@redhat.com>
|
||||
Signed-off-by: Jayachandran C <jchandra@broadcom.com>
|
||||
Signed-off-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
drivers/pci/quirks.c | 24 ++++++++++++++++++++++++
|
||||
1 file changed, 24 insertions(+)
|
||||
|
||||
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
|
||||
index dc624fb34e72..94b7bdf63b19 100644
|
||||
--- a/drivers/pci/quirks.c
|
||||
+++ b/drivers/pci/quirks.c
|
||||
@@ -3994,6 +3994,30 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9084,
|
||||
quirk_bridge_cavm_thrx2_pcie_root);
|
||||
|
||||
/*
|
||||
+ * PCI BAR 5 is not setup correctly for the on-board AHCI controller
|
||||
+ * on Broadcom's Vulcan processor. Added a quirk to fix BAR 5 by
|
||||
+ * using BAR 4's resources which are populated correctly and NOT
|
||||
+ * actually used by the AHCI controller.
|
||||
+ */
|
||||
+static void quirk_fix_vulcan_ahci_bars(struct pci_dev *dev)
|
||||
+{
|
||||
+ struct resource *r = &dev->resource[4];
|
||||
+
|
||||
+ if (!(r->flags & IORESOURCE_MEM) || (r->start == 0))
|
||||
+ return;
|
||||
+
|
||||
+ /* Set BAR5 resource to BAR4 */
|
||||
+ dev->resource[5] = *r;
|
||||
+
|
||||
+ /* Update BAR5 in pci config space */
|
||||
+ pci_write_config_dword(dev, PCI_BASE_ADDRESS_5, r->start);
|
||||
+
|
||||
+ /* Clear BAR4's resource */
|
||||
+ memset(r, 0, sizeof(*r));
|
||||
+}
|
||||
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9027, quirk_fix_vulcan_ahci_bars);
|
||||
+
|
||||
+/*
|
||||
* Intersil/Techwell TW686[4589]-based video capture cards have an empty (zero)
|
||||
* class code. Fix it.
|
||||
*/
|
||||
--
|
||||
2.11.0
|
||||
|
||||
From c84892e4b6b671fda7e499a0bb0787bd026de015 Mon Sep 17 00:00:00 2001
|
||||
From: Jayachandran C <jnair@caviumnetworks.com>
|
||||
Date: Fri, 10 Mar 2017 10:04:52 +0000
|
||||
Subject: [PATCH 2/8] ahci: thunderx2: Fix for errata that affects stop engine
|
||||
|
||||
Apply workaround for this errata:
|
||||
Synopsis: Resetting PxCMD.ST may hang the SATA device
|
||||
|
||||
Description: An internal ping-pong buffer state is not reset
|
||||
correctly for an PxCMD.ST=0 command for a SATA channel. This
|
||||
may cause the SATA interface to hang when a PxCMD.ST=0 command
|
||||
is received.
|
||||
|
||||
Workaround: A SATA_BIU_CORE_ENABLE.sw_init_bsi must be asserted
|
||||
by the driver whenever the PxCMD.ST needs to be de-asserted. This
|
||||
will reset both the ports. So, it may not always work in a 2
|
||||
channel SATA system.
|
||||
|
||||
Resolution: Fix in B0.
|
||||
|
||||
Add the code to ahci_stop_engine() to do this. It is not easy to
|
||||
stop the other "port" since it is associated with a different AHCI
|
||||
interface. Please note that with this fix, SATA reset does not
|
||||
hang any more, but it can cause failures on the other interface
|
||||
if that is in active use.
|
||||
|
||||
Unfortunately, we have nothing other the the CPU ID to check if the
|
||||
SATA block has this issue.
|
||||
|
||||
Signed-off-by: Jayachandran C <jnair@caviumnetworks.com>
|
||||
[added check to restict to pci devs on the soc only]
|
||||
Signed-off-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
drivers/ata/libahci.c | 17 +++++++++++++++++
|
||||
1 file changed, 17 insertions(+)
|
||||
|
||||
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
|
||||
index 3e286d86ab42..9116bba1b07d 100644
|
||||
--- a/drivers/ata/libahci.c
|
||||
+++ b/drivers/ata/libahci.c
|
||||
@@ -669,6 +669,23 @@ int ahci_stop_engine(struct ata_port *ap)
|
||||
tmp &= ~PORT_CMD_START;
|
||||
writel(tmp, port_mmio + PORT_CMD);
|
||||
|
||||
+#ifdef CONFIG_ARM64
|
||||
+ /* Rev Ax of Cavium CN99XX needs a hack for port stop */
|
||||
+ if (dev_is_pci(ap->host->dev) &&
|
||||
+ to_pci_dev(ap->host->dev)->vendor == 0x14e4 &&
|
||||
+ to_pci_dev(ap->host->dev)->device == 0x9027 &&
|
||||
+ MIDR_IS_CPU_MODEL_RANGE(read_cpuid_id(),
|
||||
+ MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_VULCAN),
|
||||
+ MIDR_CPU_VAR_REV(0, 0),
|
||||
+ MIDR_CPU_VAR_REV(0, MIDR_REVISION_MASK))) {
|
||||
+ tmp = readl(hpriv->mmio + 0x8000);
|
||||
+ writel(tmp | (1 << 26), hpriv->mmio + 0x8000);
|
||||
+ udelay(1);
|
||||
+ writel(tmp & ~(1 << 26), hpriv->mmio + 0x8000);
|
||||
+ dev_warn(ap->host->dev, "CN99XX stop engine fix applied!\n");
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/* wait for engine to stop. This could be as long as 500 msec */
|
||||
tmp = ata_wait_register(ap, port_mmio + PORT_CMD,
|
||||
PORT_CMD_LIST_ON, PORT_CMD_LIST_ON, 1, 500);
|
||||
--
|
||||
2.11.0
|
||||
|
||||
From 98a39621952f6a13c5198e79f1c080ea6fc1d092 Mon Sep 17 00:00:00 2001
|
||||
From: Jayachandran C <jnair@caviumnetworks.com>
|
||||
Date: Sun, 22 Feb 1998 18:42:42 -0800
|
||||
Subject: [PATCH 3/8] ahci: thunderx2: stop engine fix update
|
||||
|
||||
The current reset fix fails during continuous reboot test. The failure
|
||||
happens when both the on-board SATA slots are used and when one of the
|
||||
controllers are reset.
|
||||
|
||||
The latest ThunderX2 firmware (3.1) enables hardware error interrupts and
|
||||
when the reset fix fails, we get a hang with the print:
|
||||
[ 14.839308] sd 1:0:0:0: [sdb] 468862128 512-byte logical blocks: (240 GB/224 GiB)
|
||||
[ 14.846796] sd 1:0:0:0: [sdb] 4096-byte physical blocks
|
||||
[ 14.852036] sd 1:0:0:0: [sdb] Write Protect is off
|
||||
[ 14.856843] sd 1:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
|
||||
[ 14.866022] ata2.00: Enabling discard_zeroes_data
|
||||
|
||||
*** NBU BAR Error 0x1e25c ***
|
||||
AddrLo 0x1d80180 AddrHi 0x0
|
||||
|
||||
To fix this issue, update the SATA reset fix to increase the delays between register writes.
|
||||
|
||||
Signed-off-by: Jayachandran C <jnair@caviumnetworks.com>
|
||||
Signed-off-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
drivers/ata/libahci.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
|
||||
index 9116bba1b07d..1d3e614bad2b 100644
|
||||
--- a/drivers/ata/libahci.c
|
||||
+++ b/drivers/ata/libahci.c
|
||||
@@ -679,10 +679,11 @@ int ahci_stop_engine(struct ata_port *ap)
|
||||
MIDR_CPU_VAR_REV(0, 0),
|
||||
MIDR_CPU_VAR_REV(0, MIDR_REVISION_MASK))) {
|
||||
tmp = readl(hpriv->mmio + 0x8000);
|
||||
+ udelay(100);
|
||||
writel(tmp | (1 << 26), hpriv->mmio + 0x8000);
|
||||
- udelay(1);
|
||||
+ udelay(100);
|
||||
writel(tmp & ~(1 << 26), hpriv->mmio + 0x8000);
|
||||
- dev_warn(ap->host->dev, "CN99XX stop engine fix applied!\n");
|
||||
+ dev_warn(ap->host->dev, "CN99XX SATA reset workaround applied\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
--
|
||||
2.11.0
|
||||
|
||||
From 33c107d2a2b570cd5246262108ad07cc102e9fcd Mon Sep 17 00:00:00 2001
|
||||
From: Robert Richter <rrichter@cavium.com>
|
||||
Date: Thu, 16 Mar 2017 18:01:59 +0100
|
||||
Subject: [PATCH 4/8] iommu/arm-smmu, ACPI: Enable Cavium SMMU-v2
|
||||
|
||||
In next IORT spec release there will be a definition of a Cavium
|
||||
specific model. Until then, enable the Cavium SMMU using cpu id
|
||||
registers. All versions of Cavium's SMMUv2 implementation must be
|
||||
enabled.
|
||||
|
||||
Signed-off-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
drivers/iommu/arm-smmu.c | 22 +++++++++++++++++++++-
|
||||
1 file changed, 21 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
|
||||
index d42cad5a3d52..37aee96ccc0e 100644
|
||||
--- a/drivers/iommu/arm-smmu.c
|
||||
+++ b/drivers/iommu/arm-smmu.c
|
||||
@@ -53,6 +53,8 @@
|
||||
|
||||
#include <linux/amba/bus.h>
|
||||
|
||||
+#include <asm/cputype.h>
|
||||
+
|
||||
#include "io-pgtable.h"
|
||||
#include "arm-smmu-regs.h"
|
||||
|
||||
@@ -1871,6 +1873,24 @@ static const struct of_device_id arm_smmu_of_match[] = {
|
||||
MODULE_DEVICE_TABLE(of, arm_smmu_of_match);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
+
|
||||
+static int acpi_smmu_enable_cavium(struct arm_smmu_device *smmu, int ret)
|
||||
+{
|
||||
+ u32 cpu_model;
|
||||
+
|
||||
+ if (!IS_ENABLED(CONFIG_ARM64))
|
||||
+ return ret;
|
||||
+
|
||||
+ cpu_model = read_cpuid_id() & MIDR_CPU_MODEL_MASK;
|
||||
+ if (cpu_model != MIDR_THUNDERX)
|
||||
+ return ret;
|
||||
+
|
||||
+ smmu->version = ARM_SMMU_V2;
|
||||
+ smmu->model = CAVIUM_SMMUV2;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int acpi_smmu_get_data(u32 model, struct arm_smmu_device *smmu)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -1901,7 +1921,7 @@ static int acpi_smmu_get_data(u32 model, struct arm_smmu_device *smmu)
|
||||
ret = -ENODEV;
|
||||
}
|
||||
|
||||
- return ret;
|
||||
+ return acpi_smmu_enable_cavium(smmu, ret);
|
||||
}
|
||||
|
||||
static int arm_smmu_device_acpi_probe(struct platform_device *pdev,
|
||||
--
|
||||
2.11.0
|
||||
|
||||
From 5523edb06c95d7ac9e81d94366e71d929c08ebd4 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Richter <rrichter@cavium.com>
|
||||
Date: Wed, 12 Apr 2017 15:06:03 +0200
|
||||
Subject: [PATCH 5/8] iommu: Print a message with the default domain type
|
||||
created
|
||||
|
||||
There are several ways the bypass mode can be enabled. With commit
|
||||
|
||||
fccb4e3b8ab0 iommu: Allow default domain type to be set on the kernel command line
|
||||
|
||||
there is the option to switch into bypass mode. And, depending on
|
||||
devicetree options, bypass mode can be also enabled. This makes it
|
||||
hard to determine if direct mapping is enabled. Print message with the
|
||||
default domain type case.
|
||||
|
||||
Signed-off-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
drivers/iommu/iommu.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
|
||||
index 3f6ea160afed..7aaafaca6baf 100644
|
||||
--- a/drivers/iommu/iommu.c
|
||||
+++ b/drivers/iommu/iommu.c
|
||||
@@ -599,7 +599,9 @@ int iommu_group_add_device(struct iommu_group *group, struct device *dev)
|
||||
|
||||
trace_add_device_to_group(group->id, dev);
|
||||
|
||||
- pr_info("Adding device %s to group %d\n", dev_name(dev), group->id);
|
||||
+ pr_info("Adding device %s to group %d, default domain type %d\n",
|
||||
+ dev_name(dev), group->id,
|
||||
+ group->default_domain ? group->default_domain->type : -1);
|
||||
|
||||
return 0;
|
||||
|
||||
--
|
||||
2.11.0
|
||||
|
||||
From 71e0ad5ab606077c24a96d69f4bfed58d7ef16c7 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Richter <rrichter@cavium.com>
|
||||
Date: Thu, 4 May 2017 17:48:48 +0200
|
||||
Subject: [PATCH 6/8] iommu, aarch64: Set bypass mode per default
|
||||
|
||||
We see a performance degradation if smmu is enabled in non-bypass mode.
|
||||
This is a problem in the kernel's implememntation. Until that is solved,
|
||||
enable smmu in bypass mode per default.
|
||||
|
||||
We have tested that SMMU passthrough mode doesn't effect VFIO on both
|
||||
CN88xx and CN99xx and haven't found any issues.
|
||||
|
||||
Signed-off-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
drivers/iommu/iommu.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
|
||||
index 7aaafaca6baf..24de0b934221 100644
|
||||
--- a/drivers/iommu/iommu.c
|
||||
+++ b/drivers/iommu/iommu.c
|
||||
@@ -36,7 +36,12 @@
|
||||
|
||||
static struct kset *iommu_group_kset;
|
||||
static DEFINE_IDA(iommu_group_ida);
|
||||
+
|
||||
+#ifdef CONFIG_ARM64
|
||||
+static unsigned int iommu_def_domain_type = IOMMU_DOMAIN_IDENTITY;
|
||||
+#else
|
||||
static unsigned int iommu_def_domain_type = IOMMU_DOMAIN_DMA;
|
||||
+#endif
|
||||
|
||||
struct iommu_callback_data {
|
||||
const struct iommu_ops *ops;
|
||||
--
|
||||
2.11.0
|
||||
|
||||
From 27f103963f926d6a7a8adaad1ee227fd3b51f591 Mon Sep 17 00:00:00 2001
|
||||
From: Robert Richter <rrichter@cavium.com>
|
||||
Date: Wed, 12 Apr 2017 10:31:15 +0200
|
||||
Subject: [PATCH 7/8] iommu/arm-smmu, ACPI: Enable Cavium SMMU-v3
|
||||
|
||||
In next IORT spec release there will be a definition of a Cavium
|
||||
specific model. Until then, enable the Cavium SMMU using cpu id
|
||||
registers. Early silicon versions (A1) of Cavium's CN99xx SMMUv3
|
||||
implementation must be enabled. For later silicon versions (B0) the
|
||||
iort change will be in place.
|
||||
|
||||
Signed-off-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
drivers/acpi/arm64/iort.c | 16 ++++++++++++++--
|
||||
drivers/iommu/arm-smmu-v3.c | 19 +++++++++++++++++++
|
||||
2 files changed, 33 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
|
||||
index a3215ee671c1..b603af92eec2 100644
|
||||
--- a/drivers/acpi/arm64/iort.c
|
||||
+++ b/drivers/acpi/arm64/iort.c
|
||||
@@ -26,6 +26,8 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
+#include <asm/cputype.h>
|
||||
+
|
||||
#define IORT_TYPE_MASK(type) (1 << (type))
|
||||
#define IORT_MSI_TYPE (1 << ACPI_IORT_NODE_ITS_GROUP)
|
||||
#define IORT_IOMMU_TYPE ((1 << ACPI_IORT_NODE_SMMU) | \
|
||||
@@ -824,13 +826,22 @@ static int __init arm_smmu_v3_count_resources(struct acpi_iort_node *node)
|
||||
return num_res;
|
||||
}
|
||||
|
||||
+static bool is_cavium_cn99xx_smmu_v3(void)
|
||||
+{
|
||||
+ u32 cpu_model = read_cpuid_id() & MIDR_CPU_MODEL_MASK;
|
||||
+
|
||||
+ return cpu_model == MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM,
|
||||
+ BRCM_CPU_PART_VULCAN);
|
||||
+}
|
||||
+
|
||||
static bool arm_smmu_v3_is_combined_irq(struct acpi_iort_smmu_v3 *smmu)
|
||||
{
|
||||
/*
|
||||
* Cavium ThunderX2 implementation doesn't not support unique
|
||||
* irq line. Use single irq line for all the SMMUv3 interrupts.
|
||||
*/
|
||||
- if (smmu->model != ACPI_IORT_SMMU_V3_CAVIUM_CN99XX)
|
||||
+ if (smmu->model != ACPI_IORT_SMMU_V3_CAVIUM_CN99XX
|
||||
+ && !is_cavium_cn99xx_smmu_v3())
|
||||
return false;
|
||||
|
||||
/*
|
||||
@@ -848,7 +859,8 @@ static unsigned long arm_smmu_v3_resource_size(struct acpi_iort_smmu_v3 *smmu)
|
||||
* Override the size, for Cavium ThunderX2 implementation
|
||||
* which doesn't support the page 1 SMMU register space.
|
||||
*/
|
||||
- if (smmu->model == ACPI_IORT_SMMU_V3_CAVIUM_CN99XX)
|
||||
+ if (smmu->model == ACPI_IORT_SMMU_V3_CAVIUM_CN99XX
|
||||
+ || is_cavium_cn99xx_smmu_v3())
|
||||
return SZ_64K;
|
||||
|
||||
return SZ_128K;
|
||||
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
|
||||
index 568c400eeaed..d147cb5c7309 100644
|
||||
--- a/drivers/iommu/arm-smmu-v3.c
|
||||
+++ b/drivers/iommu/arm-smmu-v3.c
|
||||
@@ -39,6 +39,8 @@
|
||||
|
||||
#include <linux/amba/bus.h>
|
||||
|
||||
+#include <asm/cputype.h>
|
||||
+
|
||||
#include "io-pgtable.h"
|
||||
|
||||
/* MMIO registers */
|
||||
@@ -2659,6 +2661,21 @@ static int arm_smmu_device_hw_probe(struct arm_smmu_device *smmu)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
+
|
||||
+static void acpi_smmu_enable_cavium(struct arm_smmu_device *smmu)
|
||||
+{
|
||||
+ u32 cpu_model;
|
||||
+
|
||||
+ if (!IS_ENABLED(CONFIG_ARM64))
|
||||
+ return;
|
||||
+
|
||||
+ cpu_model = read_cpuid_id() & MIDR_CPU_MODEL_MASK;
|
||||
+ if (cpu_model != MIDR_CPU_MODEL(ARM_CPU_IMP_BRCM, BRCM_CPU_PART_VULCAN))
|
||||
+ return;
|
||||
+
|
||||
+ smmu->options |= ARM_SMMU_OPT_PAGE0_REGS_ONLY;
|
||||
+}
|
||||
+
|
||||
static void acpi_smmu_get_options(u32 model, struct arm_smmu_device *smmu)
|
||||
{
|
||||
switch (model) {
|
||||
@@ -2670,6 +2687,8 @@ static void acpi_smmu_get_options(u32 model, struct arm_smmu_device *smmu)
|
||||
break;
|
||||
}
|
||||
|
||||
+ acpi_smmu_enable_cavium(smmu);
|
||||
+
|
||||
dev_notice(smmu->dev, "option mask 0x%x\n", smmu->options);
|
||||
}
|
||||
|
||||
--
|
||||
2.11.0
|
||||
|
||||
From ff677cc625b52b93351dd73d7881251067f0e976 Mon Sep 17 00:00:00 2001
|
||||
From: Radha Mohan Chintakuntla <rchintakuntla@cavium.com>
|
||||
Date: Wed, 20 Aug 2014 15:10:58 -0700
|
||||
Subject: [PATCH 8/8] arm64: gicv3: its: Increase FORCE_MAX_ZONEORDER for
|
||||
Cavium ThunderX
|
||||
|
||||
In case of ARCH_THUNDER, there is a need to allocate the GICv3 ITS table
|
||||
which is bigger than the allowed max order. So we are forcing it only in
|
||||
case of 4KB page size.
|
||||
|
||||
Signed-off-by: Radha Mohan Chintakuntla <rchintakuntla@cavium.com>
|
||||
[rric: use ARM64_4K_PAGES since we have now ARM64_16K_PAGES, change order]
|
||||
Signed-off-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
arch/arm64/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
|
||||
index 2c3e2d693d76..023867378f45 100644
|
||||
--- a/arch/arm64/Kconfig
|
||||
+++ b/arch/arm64/Kconfig
|
||||
@@ -784,6 +784,7 @@ config FORCE_MAX_ZONEORDER
|
||||
default "14" if (ARM64_64K_PAGES && TRANSPARENT_HUGEPAGE)
|
||||
default "13" if (ARCH_THUNDER && !ARM64_64K_PAGES)
|
||||
default "12" if (ARM64_16K_PAGES && TRANSPARENT_HUGEPAGE)
|
||||
+ default "13" if (ARM64_4K_PAGES && ARCH_THUNDER)
|
||||
default "11"
|
||||
help
|
||||
The kernel memory allocator divides physically contiguous memory
|
||||
--
|
||||
2.11.0
|
||||
|
|
@ -108,6 +108,158 @@ index fd4b7f6..14e2419 100644
|
|||
--
|
||||
cgit v1.1
|
||||
|
||||
From 33d983b5bb2929ae242606925e708092b1dfdd8f Mon Sep 17 00:00:00 2001
|
||||
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
Date: Sat, 2 Sep 2017 11:01:22 +0100
|
||||
Subject: drivers/irqchip: gicv3: add workaround for Synquacer pre-ITS
|
||||
|
||||
In their infinite wisdom, the Socionext engineers have decided
|
||||
that ITS device IDs should not be hardwired, but it should be
|
||||
left up to the software to assign them, by allowing it to
|
||||
redirect MSI doorbell writes via a separate hardware block
|
||||
that issues the doorbell write with a device ID that is
|
||||
derived from the memory address. This completely breaks any
|
||||
kind of isolation, or virtualization in general, for that
|
||||
matter, but add support for it nonetheless.
|
||||
|
||||
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
---
|
||||
arch/arm64/Kconfig | 8 +++++++
|
||||
drivers/irqchip/irq-gic-v3-its.c | 48 +++++++++++++++++++++++++++++++++++-----
|
||||
2 files changed, 51 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
|
||||
index 0df64a6..c4361df 100644
|
||||
--- a/arch/arm64/Kconfig
|
||||
+++ b/arch/arm64/Kconfig
|
||||
@@ -539,6 +539,14 @@ config QCOM_QDF2400_ERRATUM_0065
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
+config SOCIONEXT_SYNQUACER_PREITS
|
||||
+ bool "Socionext Synquacer: Workaround for GICv3 pre-ITS"
|
||||
+ default y
|
||||
+ help
|
||||
+ Socionext Synquacer SoCs implement a separate h/w block to generate
|
||||
+ MSI doorbell writes with non-zero values for the device ID.
|
||||
+
|
||||
+ If unsure, say Y.
|
||||
endmenu
|
||||
|
||||
|
||||
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
|
||||
index e8d8934..0d372f1 100644
|
||||
--- a/drivers/irqchip/irq-gic-v3-its.c
|
||||
+++ b/drivers/irqchip/irq-gic-v3-its.c
|
||||
@@ -46,6 +46,7 @@
|
||||
#define ITS_FLAGS_CMDQ_NEEDS_FLUSHING (1ULL << 0)
|
||||
#define ITS_FLAGS_WORKAROUND_CAVIUM_22375 (1ULL << 1)
|
||||
#define ITS_FLAGS_WORKAROUND_CAVIUM_23144 (1ULL << 2)
|
||||
+#define ITS_FLAGS_WORKAROUND_SOCIONEXT_PREITS (1ULL << 3)
|
||||
|
||||
#define RDIST_FLAGS_PROPBASE_NEEDS_FLUSHING (1 << 0)
|
||||
|
||||
@@ -99,6 +100,10 @@ struct its_node {
|
||||
struct its_collection *collections;
|
||||
struct list_head its_device_list;
|
||||
u64 flags;
|
||||
+#ifdef CONFIG_SOCIONEXT_SYNQUACER_PREITS
|
||||
+ u64 pre_its_base;
|
||||
+ u64 pre_its_size;
|
||||
+#endif
|
||||
u32 ite_size;
|
||||
u32 device_ids;
|
||||
int numa_node;
|
||||
@@ -1102,13 +1107,29 @@ static void its_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
|
||||
u64 addr;
|
||||
|
||||
its = its_dev->its;
|
||||
- addr = its->phys_base + GITS_TRANSLATER;
|
||||
+
|
||||
+#ifdef CONFIG_SOCIONEXT_SYNQUACER_PREITS
|
||||
+ if (its->flags & ITS_FLAGS_WORKAROUND_SOCIONEXT_PREITS)
|
||||
+
|
||||
+ /*
|
||||
+ * The Socionext Synquacer SoC has a so-called 'pre-ITS',
|
||||
+ * which maps 32-bit writes into a separate window of size
|
||||
+ * '4 << device_id_bits' onto writes to GITS_TRANSLATER with
|
||||
+ * device ID taken from bits [device_id_bits + 1:2] of the
|
||||
+ * window offset.
|
||||
+ */
|
||||
+ addr = its->pre_its_base + (its_dev->device_id << 2);
|
||||
+ else
|
||||
+#endif
|
||||
+ addr = its->phys_base + GITS_TRANSLATER;
|
||||
|
||||
msg->address_lo = lower_32_bits(addr);
|
||||
msg->address_hi = upper_32_bits(addr);
|
||||
msg->data = its_get_event_id(d);
|
||||
|
||||
- iommu_dma_map_msi_msg(d->irq, msg);
|
||||
+ if (!IS_ENABLED(CONFIG_SOCIONEXT_SYNQUACER_PREITS) ||
|
||||
+ !(its->flags & ITS_FLAGS_WORKAROUND_SOCIONEXT_PREITS))
|
||||
+ iommu_dma_map_msi_msg(d->irq, msg);
|
||||
}
|
||||
|
||||
static int its_irq_set_irqchip_state(struct irq_data *d,
|
||||
@@ -1666,6 +1687,11 @@ static int its_alloc_tables(struct its_node *its)
|
||||
ids = 0x14; /* 20 bits, 8MB */
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_SOCIONEXT_SYNQUACER_PREITS
|
||||
+ if (its->flags & ITS_FLAGS_WORKAROUND_SOCIONEXT_PREITS)
|
||||
+ ids = ilog2(its->pre_its_size) - 2;
|
||||
+#endif
|
||||
+
|
||||
its->device_ids = ids;
|
||||
|
||||
for (i = 0; i < GITS_BASER_NR_REGS; i++) {
|
||||
@@ -2788,11 +2814,21 @@ static const struct gic_quirk its_quirks[] = {
|
||||
}
|
||||
};
|
||||
|
||||
-static void its_enable_quirks(struct its_node *its)
|
||||
+static void its_enable_quirks(struct its_node *its,
|
||||
+ struct fwnode_handle *handle)
|
||||
{
|
||||
u32 iidr = readl_relaxed(its->base + GITS_IIDR);
|
||||
|
||||
gic_enable_quirks(iidr, its_quirks, its);
|
||||
+
|
||||
+#ifdef CONFIG_SOCIONEXT_SYNQUACER_PREITS
|
||||
+ if (!fwnode_property_read_u64_array(handle,
|
||||
+ "socionext,synquacer-pre-its",
|
||||
+ &its->pre_its_base, 2)) {
|
||||
+ its->flags |= ITS_FLAGS_WORKAROUND_SOCIONEXT_PREITS;
|
||||
+ pr_info("ITS: enabling workaround for Socionext Synquacer pre-ITS\n");
|
||||
+ }
|
||||
+#endif
|
||||
}
|
||||
|
||||
static int its_init_domain(struct fwnode_handle *handle, struct its_node *its)
|
||||
@@ -2812,7 +2848,9 @@ static int its_init_domain(struct fwnode_handle *handle, struct its_node *its)
|
||||
|
||||
inner_domain->parent = its_parent;
|
||||
irq_domain_update_bus_token(inner_domain, DOMAIN_BUS_NEXUS);
|
||||
- inner_domain->flags |= IRQ_DOMAIN_FLAG_MSI_REMAP;
|
||||
+
|
||||
+ if (!(its->flags & ITS_FLAGS_WORKAROUND_SOCIONEXT_PREITS))
|
||||
+ inner_domain->flags |= IRQ_DOMAIN_FLAG_MSI_REMAP;
|
||||
info->ops = &its_msi_domain_ops;
|
||||
info->data = its;
|
||||
inner_domain->host_data = info;
|
||||
@@ -2966,7 +3004,7 @@ static int __init its_probe_one(struct resource *res,
|
||||
}
|
||||
its->cmd_write = its->cmd_base;
|
||||
|
||||
- its_enable_quirks(its);
|
||||
+ its_enable_quirks(its, handle);
|
||||
|
||||
err = its_alloc_tables(its);
|
||||
if (err)
|
||||
--
|
||||
cgit v1.1
|
||||
|
||||
From 26e7bb47b0fb03a01be1e391a08c7375b45335a2 Mon Sep 17 00:00:00 2001
|
||||
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
Date: Mon, 21 Aug 2017 20:29:05 +0100
|
||||
|
@ -173,6 +325,7 @@ index c61be97..7d5a23e 100644
|
|||
--- a/drivers/pci/dwc/Makefile
|
||||
+++ b/drivers/pci/dwc/Makefile
|
||||
@@ -1,5 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
obj-$(CONFIG_PCIE_DW) += pcie-designware.o
|
||||
obj-$(CONFIG_PCIE_DW_HOST) += pcie-designware-host.o
|
||||
+obj-$(CONFIG_PCIE_DW_HOST_ECAM) += pcie-designware-ecam.o
|
||||
|
@ -2896,3 +3049,51 @@ index 0000000..4695969
|
|||
--
|
||||
cgit v1.1
|
||||
|
||||
From d2fc584f8237746a84e6ec8690d8884f148fc449 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Tue, 10 Oct 2017 11:35:51 +0100
|
||||
Subject: [PATCH] add interrupt.h, sort alphabetically
|
||||
|
||||
Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
|
||||
---
|
||||
drivers/net/ethernet/socionext/netsec/netsec_platform.c | 17 +++++++++--------
|
||||
1 file changed, 9 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/socionext/netsec/netsec_platform.c b/drivers/net/ethernet/socionext/netsec/netsec_platform.c
|
||||
index 624f6a7093f6..79072bae917d 100644
|
||||
--- a/drivers/net/ethernet/socionext/netsec/netsec_platform.c
|
||||
+++ b/drivers/net/ethernet/socionext/netsec/netsec_platform.c
|
||||
@@ -14,21 +14,22 @@
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
-#include <linux/device.h>
|
||||
-#include <linux/ctype.h>
|
||||
-#include <linux/netdevice.h>
|
||||
-#include <linux/types.h>
|
||||
#include <linux/bitops.h>
|
||||
+#include <linux/clk.h>
|
||||
+#include <linux/ctype.h>
|
||||
+#include <linux/device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
+#include <linux/io.h>
|
||||
+#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
-#include <linux/sizes.h>
|
||||
-#include <linux/platform_device.h>
|
||||
-#include <linux/clk.h>
|
||||
+#include <linux/netdevice.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_net.h>
|
||||
-#include <linux/io.h>
|
||||
+#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
+#include <linux/sizes.h>
|
||||
+#include <linux/types.h>
|
||||
|
||||
#include "netsec.h"
|
||||
|
||||
--
|
||||
2.14.2
|
||||
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
From bdb9458a3382ba745a66be5526d3899103c76eda Mon Sep 17 00:00:00 2001
|
||||
From: Loc Ho <lho@apm.com>
|
||||
Date: Fri, 21 Jul 2017 11:24:37 -0700
|
||||
Subject: ACPI: APEI: Enable APEI multiple GHES source to share a single
|
||||
external IRQ
|
||||
|
||||
X-Gene platforms describe multiple GHES error sources with the same
|
||||
hardware error notification type (external interrupt) and interrupt
|
||||
number.
|
||||
|
||||
Change the GHES interrupt request to support sharing the same IRQ.
|
||||
|
||||
This change includs contributions from Tuan Phan <tphan@apm.com>.
|
||||
|
||||
Signed-off-by: Loc Ho <lho@apm.com>
|
||||
Acked-by: Borislav Petkov <bp@suse.de>
|
||||
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
---
|
||||
drivers/acpi/apei/ghes.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
|
||||
index d661d45..eed09fc 100644
|
||||
--- a/drivers/acpi/apei/ghes.c
|
||||
+++ b/drivers/acpi/apei/ghes.c
|
||||
@@ -1157,7 +1157,8 @@ static int ghes_probe(struct platform_device *ghes_dev)
|
||||
generic->header.source_id);
|
||||
goto err_edac_unreg;
|
||||
}
|
||||
- rc = request_irq(ghes->irq, ghes_irq_func, 0, "GHES IRQ", ghes);
|
||||
+ rc = request_irq(ghes->irq, ghes_irq_func, IRQF_SHARED,
|
||||
+ "GHES IRQ", ghes);
|
||||
if (rc) {
|
||||
pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n",
|
||||
generic->header.source_id);
|
||||
--
|
||||
cgit v1.1
|
||||
|
|
@ -0,0 +1 @@
|
|||
CONFIG_ALLOW_LOCKDOWN_LIFT_BY_SYSRQ=y
|
|
@ -0,0 +1 @@
|
|||
CONFIG_ALTERA_MSGDMA=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_ATH10K_USB=m
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_BATTERY_MAX1721X is not set
|
|
@ -1 +0,0 @@
|
|||
CONFIG_BLK_CPQ_CISS_DA=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_BNXT_FLOWER_OFFLOAD=y
|
|
@ -0,0 +1 @@
|
|||
CONFIG_BPF_STREAM_PARSER=y
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_CCS811 is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_CEC_PIN=y
|
|
@ -1 +0,0 @@
|
|||
CONFIG_CISS_SCSI_TAPE=y
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_CLK_HSDK is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_CLOCK_THERMAL is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_CRYPTO_DEV_SP_CCP is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_DEVFREQ_THERMAL is not set
|
|
@ -1 +1 @@
|
|||
CONFIG_DP83867_PHY=m
|
||||
# CONFIG_DP83867_PHY is not set
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_DVB_DDBRIDGE_MSIENABLE is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_GPIO_BD9571MWV=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_GPIO_TPS68470=y
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_INFINIBAND_EXP_USER_ACCESS is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_INPUT_PWM_VIBRA is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_INPUT_RK805_PWRKEY=m
|
|
@ -1 +1 @@
|
|||
CONFIG_IP_DCCP=m
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
CONFIG_IR_GPIO_TX=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_IR_PWM_TX=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_LEDS_AS3645A=m
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_LOCK_DOWN_IN_EFI_SECURE_BOOT is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_LTC2471 is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_MDIO_I2C=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_MFD_BD9571MWV=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_MFD_TPS68470=y
|
|
@ -0,0 +1 @@
|
|||
CONFIG_MLX5_ESWITCH=y
|
|
@ -0,0 +1 @@
|
|||
CONFIG_MLX5_MPFS=y
|
|
@ -1 +0,0 @@
|
|||
CONFIG_MMC_BLOCK_BOUNCE=y
|
|
@ -0,0 +1 @@
|
|||
CONFIG_NET_NSH=m
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_NET_VENDOR_HUAWEI is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_NFT_FIB_NETDEV=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_PHYLINK=m
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_PHY_MVEBU_CP110_COMPHY is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_PI433 is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_PINCTRL_RK805=m
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_PINCTRL_SPRD is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_PINCTRL_SPRD_SC9860 is not set
|
|
@ -1 +1 @@
|
|||
# CONFIG_PM_OPP is not set
|
||||
CONFIG_PM_OPP=y
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_QCOM_GLINK_SSR is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_R8822BE=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_REGULATOR_BD9571MWV=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_RESET_ATTACK_MITIGATION=y
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_RESET_HSDK_V1 is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_RMNET is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_ROCKCHIP_PHY is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_RPMSG_QCOM_GLINK_SMEM is not set
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_SENSORS_IBM_CFFPS is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_SENSORS_TPS53679=m
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_SERIO_GPIO_PS2 is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_SFP=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_SLAB_FREELIST_HARDENED=y
|
|
@ -1 +1 @@
|
|||
CONFIG_SND_BCD2000=m
|
||||
# CONFIG_SND_BCD2000 is not set
|
||||
|
|
|
@ -1 +1 @@
|
|||
CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0
|
||||
CONFIG_SND_HDA_POWER_SAVE_DEFAULT=1
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
CONFIG_SND_SOC_CS43130=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_SND_SOC_WM8524=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_SQUASHFS_ZSTD=y
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_STRING_SELFTEST is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_W1_SLAVE_DS2805=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_WIL6210_DEBUGFS=y
|
|
@ -0,0 +1 @@
|
|||
# CONFIG_ZRAM_WRITEBACK is not set
|
|
@ -0,0 +1 @@
|
|||
CONFIG_CRYPTO_DEV_SUN4I_SS_PRNG=y
|
|
@ -1 +1 @@
|
|||
CONFIG_CRYPTO_SHA256_ARM64=m
|
||||
CONFIG_CRYPTO_SHA256_ARM64=y
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
CONFIG_DRM_DW_HDMI_CEC=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_DRM_VC4_HDMI_CEC=y
|
|
@ -0,0 +1 @@
|
|||
CONFIG_EXTCON_USBC_CROS_EC=m
|
|
@ -0,0 +1 @@
|
|||
CONFIG_HW_RANDOM_IMX_RNGC=m
|
|
@ -1 +1 @@
|
|||
CONFIG_I2C_DESIGNWARE_CORE=m
|
||||
CONFIG_I2C_DESIGNWARE_CORE=y
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue