diff mbox

PCI: keystone: fix msi code that retrieves the pp struct ptr

Message ID 1456438984-22111-1-git-send-email-m-karicheri2@ti.com (mailing list archive)
State New, archived
Delegated to: Bjorn Helgaas
Headers show

Commit Message

Murali Karicheri Feb. 25, 2016, 10:23 p.m. UTC
Recent update to pcie-designware core driver,
commit "cbce79005 PCI: designware: Make driver arch-agnostic" broke the
keystone PCI driver. This is because, the way pp struct ptr is retrieved
from  msi desc has changed and require similar update in pci-keystone-dw.c
as well. This patch fix this issue. Here is the early boot crash log seen
on K2E EVM.

[    1.012999] pci 0000:00:00.0: PCI bridge to [bus 01]
[    1.018073] pci 0000:00:00.0:   bridge window [io  0x1000-0x1fff]
[    1.024308] pci 0000:00:00.0:   bridge window [mem 0x60000000-0x600fffff]
[    1.031216] pci 0000:00:00.0:   bridge window [mem 0x60100000-0x601fffff
pref]
[    1.038736] Unable to handle kernel NULL pointer dereference at virtual
address 00000030
[    1.046950] pgd = c0003000
[    1.049750] [00000030] *pgd=80000800004003, *pmd=00000000
[    1.055265] Internal error: Oops: 206 [#1] PREEMPT SMP ARM
[    1.060860] Modules linked in:
[    1.064013] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.2-00139-gb74f926 #2
[    1.071266] Hardware name: Keystone
[    1.074853] task: eb888000 ti: eb890000 task.ti: eb890000
[    1.080364] PC is at ks_dw_pcie_msi_irq_unmask+0x24/0x58
[    1.085785] LR is at ks_dw_pcie_msi_irq_unmask+0x18/0x58
[    1.091206] pc : [<c02f65c8>]    lr : [<c02f65bc>]    psr: 60000093
[    1.091206] sp : eb891bc8  ip : 00000000  fp : ebb15010
[    1.102915] r10: 00000051  r9 : 60000013  r8 : ebafaa20
[    1.108247] r7 : ebaa9f80  r6 : eb9fd0c0  r5 : ebafa9d0  r4 : ebafa9c0
[    1.114889] r3 : 00000051  r2 : 00000000  r1 : 00000001  r0 : ebb14c18
[    1.121533] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment
kernel
[    1.129049] Control: 30c5387d  Table: 00003000  DAC: fffffffd
[    1.134905] Process swapper/0 (pid: 1, stack limit = 0xeb890210)
[    1.141023] Stack: (0xeb891bc8 to 0xeb892000)

Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
---
 - Need this fix in 4.4.4 as well
 drivers/pci/host/pci-keystone-dw.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

Comments

Greg Kroah-Hartman Feb. 26, 2016, 12:11 a.m. UTC | #1
On Thu, Feb 25, 2016 at 05:23:04PM -0500, Murali Karicheri wrote:
> Recent update to pcie-designware core driver,
> commit "cbce79005 PCI: designware: Make driver arch-agnostic" broke the
> keystone PCI driver. This is because, the way pp struct ptr is retrieved
> from  msi desc has changed and require similar update in pci-keystone-dw.c
> as well. This patch fix this issue. Here is the early boot crash log seen
> on K2E EVM.
> 
> [    1.012999] pci 0000:00:00.0: PCI bridge to [bus 01]
> [    1.018073] pci 0000:00:00.0:   bridge window [io  0x1000-0x1fff]
> [    1.024308] pci 0000:00:00.0:   bridge window [mem 0x60000000-0x600fffff]
> [    1.031216] pci 0000:00:00.0:   bridge window [mem 0x60100000-0x601fffff
> pref]
> [    1.038736] Unable to handle kernel NULL pointer dereference at virtual
> address 00000030
> [    1.046950] pgd = c0003000
> [    1.049750] [00000030] *pgd=80000800004003, *pmd=00000000
> [    1.055265] Internal error: Oops: 206 [#1] PREEMPT SMP ARM
> [    1.060860] Modules linked in:
> [    1.064013] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.2-00139-gb74f926 #2
> [    1.071266] Hardware name: Keystone
> [    1.074853] task: eb888000 ti: eb890000 task.ti: eb890000
> [    1.080364] PC is at ks_dw_pcie_msi_irq_unmask+0x24/0x58
> [    1.085785] LR is at ks_dw_pcie_msi_irq_unmask+0x18/0x58
> [    1.091206] pc : [<c02f65c8>]    lr : [<c02f65bc>]    psr: 60000093
> [    1.091206] sp : eb891bc8  ip : 00000000  fp : ebb15010
> [    1.102915] r10: 00000051  r9 : 60000013  r8 : ebafaa20
> [    1.108247] r7 : ebaa9f80  r6 : eb9fd0c0  r5 : ebafa9d0  r4 : ebafa9c0
> [    1.114889] r3 : 00000051  r2 : 00000000  r1 : 00000001  r0 : ebb14c18
> [    1.121533] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment
> kernel
> [    1.129049] Control: 30c5387d  Table: 00003000  DAC: fffffffd
> [    1.134905] Process swapper/0 (pid: 1, stack limit = 0xeb890210)
> [    1.141023] Stack: (0xeb891bc8 to 0xeb892000)
> 
> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
> ---
>  - Need this fix in 4.4.4 as well

<formletter>

This is not the correct way to submit patches for inclusion in the
stable kernel tree.  Please read Documentation/stable_kernel_rules.txt
for how to do this properly.

</formletter>
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Murali Karicheri Feb. 29, 2016, 3:06 p.m. UTC | #2
On 02/25/2016 07:11 PM, Greg KH wrote:
> On Thu, Feb 25, 2016 at 05:23:04PM -0500, Murali Karicheri wrote:
>> Recent update to pcie-designware core driver,
>> commit "cbce79005 PCI: designware: Make driver arch-agnostic" broke the
>> keystone PCI driver. This is because, the way pp struct ptr is retrieved
>> from  msi desc has changed and require similar update in pci-keystone-dw.c
>> as well. This patch fix this issue. Here is the early boot crash log seen
>> on K2E EVM.
>>
>> [    1.012999] pci 0000:00:00.0: PCI bridge to [bus 01]
>> [    1.018073] pci 0000:00:00.0:   bridge window [io  0x1000-0x1fff]
>> [    1.024308] pci 0000:00:00.0:   bridge window [mem 0x60000000-0x600fffff]
>> [    1.031216] pci 0000:00:00.0:   bridge window [mem 0x60100000-0x601fffff
>> pref]
>> [    1.038736] Unable to handle kernel NULL pointer dereference at virtual
>> address 00000030
>> [    1.046950] pgd = c0003000
>> [    1.049750] [00000030] *pgd=80000800004003, *pmd=00000000
>> [    1.055265] Internal error: Oops: 206 [#1] PREEMPT SMP ARM
>> [    1.060860] Modules linked in:
>> [    1.064013] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.2-00139-gb74f926 #2
>> [    1.071266] Hardware name: Keystone
>> [    1.074853] task: eb888000 ti: eb890000 task.ti: eb890000
>> [    1.080364] PC is at ks_dw_pcie_msi_irq_unmask+0x24/0x58
>> [    1.085785] LR is at ks_dw_pcie_msi_irq_unmask+0x18/0x58
>> [    1.091206] pc : [<c02f65c8>]    lr : [<c02f65bc>]    psr: 60000093
>> [    1.091206] sp : eb891bc8  ip : 00000000  fp : ebb15010
>> [    1.102915] r10: 00000051  r9 : 60000013  r8 : ebafaa20
>> [    1.108247] r7 : ebaa9f80  r6 : eb9fd0c0  r5 : ebafa9d0  r4 : ebafa9c0
>> [    1.114889] r3 : 00000051  r2 : 00000000  r1 : 00000001  r0 : ebb14c18
>> [    1.121533] Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment
>> kernel
>> [    1.129049] Control: 30c5387d  Table: 00003000  DAC: fffffffd
>> [    1.134905] Process swapper/0 (pid: 1, stack limit = 0xeb890210)
>> [    1.141023] Stack: (0xeb891bc8 to 0xeb892000)
>>
>> Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
>> ---
>>  - Need this fix in 4.4.4 as well
> 
> <formletter>
> 
> This is not the correct way to submit patches for inclusion in the
> stable kernel tree.  Please read Documentation/stable_kernel_rules.txt
> for how to do this properly.
> 
> </formletter>
> 
I misremembered it. I am following option 1) and only thing missing is
========================================================================
To have the patch automatically included in the stable tree, add the tag
     Cc: stable@vger.kernel.org
   in the sign-off area.
=========================================================================

I will add Cc in the sign-off area and send v1.
diff mbox

Patch

diff --git a/drivers/pci/host/pci-keystone-dw.c b/drivers/pci/host/pci-keystone-dw.c
index ed34c95..6153853 100644
--- a/drivers/pci/host/pci-keystone-dw.c
+++ b/drivers/pci/host/pci-keystone-dw.c
@@ -58,11 +58,6 @@ 
 
 #define to_keystone_pcie(x)	container_of(x, struct keystone_pcie, pp)
 
-static inline struct pcie_port *sys_to_pcie(struct pci_sys_data *sys)
-{
-	return sys->private_data;
-}
-
 static inline void update_reg_offset_bit_pos(u32 offset, u32 *reg_offset,
 					     u32 *bit_pos)
 {
@@ -108,7 +103,7 @@  static void ks_dw_pcie_msi_irq_ack(struct irq_data *d)
 	struct pcie_port *pp;
 
 	msi = irq_data_get_msi_desc(d);
-	pp = sys_to_pcie(msi_desc_to_pci_sysdata(msi));
+	pp = (struct pcie_port *) msi_desc_to_pci_sysdata(msi);
 	ks_pcie = to_keystone_pcie(pp);
 	offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
 	update_reg_offset_bit_pos(offset, &reg_offset, &bit_pos);
@@ -146,7 +141,7 @@  static void ks_dw_pcie_msi_irq_mask(struct irq_data *d)
 	u32 offset;
 
 	msi = irq_data_get_msi_desc(d);
-	pp = sys_to_pcie(msi_desc_to_pci_sysdata(msi));
+	pp = (struct pcie_port *) msi_desc_to_pci_sysdata(msi);
 	ks_pcie = to_keystone_pcie(pp);
 	offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);
 
@@ -167,7 +162,7 @@  static void ks_dw_pcie_msi_irq_unmask(struct irq_data *d)
 	u32 offset;
 
 	msi = irq_data_get_msi_desc(d);
-	pp = sys_to_pcie(msi_desc_to_pci_sysdata(msi));
+	pp = (struct pcie_port *) msi_desc_to_pci_sysdata(msi);
 	ks_pcie = to_keystone_pcie(pp);
 	offset = d->irq - irq_linear_revmap(pp->irq_domain, 0);