aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandru <chandru@in.ibm.com>2010-01-11 01:19:21 -0500
committerJesse Barnes <jbarnes@virtuousgeek.org>2010-02-22 19:16:58 -0500
commitb0fc889c4311835ae7d02f433154bc20cad9ee11 (patch)
tree8985c7acc157bb7e40d271e136b5cdc7dd56d225
parent6fcaf17ac7a512227112ac81c0e1a5862bab57a6 (diff)
PCI hotplug: ibmphp: read the length of ebda and map entire ebda region
ibmphp driver currently maps only 1KB of ebda memory area into kernel address space during driver initialization. This causes kernel oops when the driver is modprobe'd and it accesses memory beyond 1KB within ebda segment. The first byte of ebda segment actually stores the length of the ebda region in Kilobytes. Hence make use of the length parameter and map the entire ebda region. Signed-off-by: Chandru Siddalingappa <chandru@linux.vnet.ibm.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
-rw-r--r--drivers/pci/hotplug/ibmphp_ebda.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/pci/hotplug/ibmphp_ebda.c b/drivers/pci/hotplug/ibmphp_ebda.c
index c1abac8ab5c3..7d3bf31d224d 100644
--- a/drivers/pci/hotplug/ibmphp_ebda.c
+++ b/drivers/pci/hotplug/ibmphp_ebda.c
@@ -245,7 +245,7 @@ static void __init print_ebda_hpc (void)
245 245
246int __init ibmphp_access_ebda (void) 246int __init ibmphp_access_ebda (void)
247{ 247{
248 u8 format, num_ctlrs, rio_complete, hs_complete; 248 u8 format, num_ctlrs, rio_complete, hs_complete, ebda_sz;
249 u16 ebda_seg, num_entries, next_offset, offset, blk_id, sub_addr, re, rc_id, re_id, base; 249 u16 ebda_seg, num_entries, next_offset, offset, blk_id, sub_addr, re, rc_id, re_id, base;
250 int rc = 0; 250 int rc = 0;
251 251
@@ -260,7 +260,14 @@ int __init ibmphp_access_ebda (void)
260 iounmap (io_mem); 260 iounmap (io_mem);
261 debug ("returned ebda segment: %x\n", ebda_seg); 261 debug ("returned ebda segment: %x\n", ebda_seg);
262 262
263 io_mem = ioremap(ebda_seg<<4, 1024); 263 io_mem = ioremap(ebda_seg<<4, 1);
264 ebda_sz = readb(io_mem);
265 iounmap(io_mem);
266 debug("ebda size: %d(KiB)\n", ebda_sz);
267 if (ebda_sz == 0)
268 return -ENOMEM;
269
270 io_mem = ioremap(ebda_seg<<4, (ebda_sz * 1024));
264 if (!io_mem ) 271 if (!io_mem )
265 return -ENOMEM; 272 return -ENOMEM;
266 next_offset = 0x180; 273 next_offset = 0x180;