diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-15 11:01:48 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-15 11:01:48 -0500 |
| commit | f885b51967fb5f611c462841e5119853df00cc97 (patch) | |
| tree | 29ba7f6eb9dd607980e63917e7f68e88578e7aca /arch | |
| parent | 5d5d80001df3fbd06bd2b8893b6e3847e38a12d6 (diff) | |
| parent | dfbe0d3b6be52596b5694b1bb75b19562e769021 (diff) | |
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc:
[POWERPC] Fix boot failure on POWER6
[POWERPC] Workaround for iommu page alignment
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/powerpc/kernel/iommu.c | 17 | ||||
| -rw-r--r-- | arch/powerpc/mm/slb.c | 10 | ||||
| -rw-r--r-- | arch/powerpc/platforms/pseries/lpar.c | 1 |
3 files changed, 16 insertions, 12 deletions
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index 2d0c9ef555e9..79a85d656871 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
| @@ -278,6 +278,7 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist, | |||
| 278 | unsigned long flags; | 278 | unsigned long flags; |
| 279 | struct scatterlist *s, *outs, *segstart; | 279 | struct scatterlist *s, *outs, *segstart; |
| 280 | int outcount, incount, i; | 280 | int outcount, incount, i; |
| 281 | unsigned int align; | ||
| 281 | unsigned long handle; | 282 | unsigned long handle; |
| 282 | 283 | ||
| 283 | BUG_ON(direction == DMA_NONE); | 284 | BUG_ON(direction == DMA_NONE); |
| @@ -309,7 +310,12 @@ int iommu_map_sg(struct iommu_table *tbl, struct scatterlist *sglist, | |||
| 309 | /* Allocate iommu entries for that segment */ | 310 | /* Allocate iommu entries for that segment */ |
| 310 | vaddr = (unsigned long) sg_virt(s); | 311 | vaddr = (unsigned long) sg_virt(s); |
| 311 | npages = iommu_num_pages(vaddr, slen); | 312 | npages = iommu_num_pages(vaddr, slen); |
| 312 | entry = iommu_range_alloc(tbl, npages, &handle, mask >> IOMMU_PAGE_SHIFT, 0); | 313 | align = 0; |
| 314 | if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && slen >= PAGE_SIZE && | ||
| 315 | (vaddr & ~PAGE_MASK) == 0) | ||
| 316 | align = PAGE_SHIFT - IOMMU_PAGE_SHIFT; | ||
| 317 | entry = iommu_range_alloc(tbl, npages, &handle, | ||
| 318 | mask >> IOMMU_PAGE_SHIFT, align); | ||
| 313 | 319 | ||
| 314 | DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen); | 320 | DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen); |
| 315 | 321 | ||
| @@ -572,7 +578,7 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, | |||
| 572 | { | 578 | { |
| 573 | dma_addr_t dma_handle = DMA_ERROR_CODE; | 579 | dma_addr_t dma_handle = DMA_ERROR_CODE; |
| 574 | unsigned long uaddr; | 580 | unsigned long uaddr; |
| 575 | unsigned int npages; | 581 | unsigned int npages, align; |
| 576 | 582 | ||
| 577 | BUG_ON(direction == DMA_NONE); | 583 | BUG_ON(direction == DMA_NONE); |
| 578 | 584 | ||
| @@ -580,8 +586,13 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr, | |||
| 580 | npages = iommu_num_pages(uaddr, size); | 586 | npages = iommu_num_pages(uaddr, size); |
| 581 | 587 | ||
| 582 | if (tbl) { | 588 | if (tbl) { |
| 589 | align = 0; | ||
| 590 | if (IOMMU_PAGE_SHIFT < PAGE_SHIFT && size >= PAGE_SIZE && | ||
| 591 | ((unsigned long)vaddr & ~PAGE_MASK) == 0) | ||
| 592 | align = PAGE_SHIFT - IOMMU_PAGE_SHIFT; | ||
| 593 | |||
| 583 | dma_handle = iommu_alloc(tbl, vaddr, npages, direction, | 594 | dma_handle = iommu_alloc(tbl, vaddr, npages, direction, |
| 584 | mask >> IOMMU_PAGE_SHIFT, 0); | 595 | mask >> IOMMU_PAGE_SHIFT, align); |
| 585 | if (dma_handle == DMA_ERROR_CODE) { | 596 | if (dma_handle == DMA_ERROR_CODE) { |
| 586 | if (printk_ratelimit()) { | 597 | if (printk_ratelimit()) { |
| 587 | printk(KERN_INFO "iommu_alloc failed, " | 598 | printk(KERN_INFO "iommu_alloc failed, " |
diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c index a282bc212e80..50d7372bc2ce 100644 --- a/arch/powerpc/mm/slb.c +++ b/arch/powerpc/mm/slb.c | |||
| @@ -82,14 +82,6 @@ static inline void slb_shadow_clear(unsigned long entry) | |||
| 82 | get_slb_shadow()->save_area[entry].esid = 0; | 82 | get_slb_shadow()->save_area[entry].esid = 0; |
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | void slb_shadow_clear_all(void) | ||
| 86 | { | ||
| 87 | int i; | ||
| 88 | |||
| 89 | for (i = 0; i < SLB_NUM_BOLTED; i++) | ||
| 90 | slb_shadow_clear(i); | ||
| 91 | } | ||
| 92 | |||
| 93 | static inline void create_shadowed_slbe(unsigned long ea, int ssize, | 85 | static inline void create_shadowed_slbe(unsigned long ea, int ssize, |
| 94 | unsigned long flags, | 86 | unsigned long flags, |
| 95 | unsigned long entry) | 87 | unsigned long entry) |
| @@ -300,6 +292,8 @@ void slb_initialize(void) | |||
| 300 | 292 | ||
| 301 | create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1); | 293 | create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1); |
| 302 | 294 | ||
| 295 | slb_shadow_clear(2); | ||
| 296 | |||
| 303 | /* We don't bolt the stack for the time being - we're in boot, | 297 | /* We don't bolt the stack for the time being - we're in boot, |
| 304 | * so the stack is in the bolted segment. By the time it goes | 298 | * so the stack is in the bolted segment. By the time it goes |
| 305 | * elsewhere, we'll call _switch() which will bolt in the new | 299 | * elsewhere, we'll call _switch() which will bolt in the new |
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index 34317aa148a8..9a455d46379d 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c | |||
| @@ -272,7 +272,6 @@ void vpa_init(int cpu) | |||
| 272 | */ | 272 | */ |
| 273 | addr = __pa(&slb_shadow[cpu]); | 273 | addr = __pa(&slb_shadow[cpu]); |
| 274 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) { | 274 | if (firmware_has_feature(FW_FEATURE_SPLPAR)) { |
| 275 | slb_shadow_clear_all(); | ||
| 276 | ret = register_slb_shadow(hwcpu, addr); | 275 | ret = register_slb_shadow(hwcpu, addr); |
| 277 | if (ret) | 276 | if (ret) |
| 278 | printk(KERN_ERR | 277 | printk(KERN_ERR |
