[to-be-updated] mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t.patch removed from -mm tree
The patch titled Subject: mm: rename p4d_page_vaddr to p4d_pgtable and make it return pud_t * has been removed from the -mm tree. Its filename was mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t.patch This patch was dropped because an updated version will be merged -- From: "Aneesh Kumar K.V" Subject: mm: rename p4d_page_vaddr to p4d_pgtable and make it return pud_t * No functional change in this patch. Link: https://lkml.kernel.org/r/20210615110859.320299-2-aneesh.ku...@linux.ibm.com Link: https://lore.kernel.org/linuxppc-dev/CAHk-=wi+j+iodze9ftjm3zi4j4oes+qqbkxme9qn4roxpex...@mail.gmail.com/ Signed-off-by: Aneesh Kumar K.V Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Signed-off-by: Andrew Morton --- arch/arm64/include/asm/pgtable.h|4 ++-- arch/ia64/include/asm/pgtable.h |2 +- arch/mips/include/asm/pgtable-64.h |4 ++-- arch/powerpc/include/asm/book3s/64/pgtable.h|5 - arch/powerpc/include/asm/nohash/64/pgtable-4k.h |6 +- arch/powerpc/mm/book3s64/radix_pgtable.c|2 +- arch/powerpc/mm/pgtable_64.c|2 +- arch/sparc/include/asm/pgtable_64.h |4 ++-- arch/x86/include/asm/pgtable.h |4 ++-- arch/x86/mm/init_64.c |4 ++-- include/asm-generic/pgtable-nop4d.h |2 +- include/asm-generic/pgtable-nopud.h |2 +- include/linux/pgtable.h |2 +- 13 files changed, 25 insertions(+), 18 deletions(-) --- a/arch/arm64/include/asm/pgtable.h~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/arm64/include/asm/pgtable.h @@ -694,9 +694,9 @@ static inline phys_addr_t p4d_page_paddr return __p4d_to_phys(p4d); } -static inline unsigned long p4d_page_vaddr(p4d_t p4d) +static inline pud_t *p4d_pgtable(p4d_t p4d) { - return (unsigned long)__va(p4d_page_paddr(p4d)); + return (pud_t *)__va(p4d_page_paddr(p4d)); } /* Find an entry in the frst-level page table. */ --- a/arch/ia64/include/asm/pgtable.h~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/ia64/include/asm/pgtable.h @@ -281,7 +281,7 @@ ia64_phys_addr_valid (unsigned long addr #define p4d_bad(p4d) (!ia64_phys_addr_valid(p4d_val(p4d))) #define p4d_present(p4d) (p4d_val(p4d) != 0UL) #define p4d_clear(p4dp)(p4d_val(*(p4dp)) = 0UL) -#define p4d_page_vaddr(p4d)((unsigned long) __va(p4d_val(p4d) & _PFN_MASK)) +#define p4d_pgtable(p4d) ((pud_t *) __va(p4d_val(p4d) & _PFN_MASK)) #define p4d_page(p4d) virt_to_page((p4d_val(p4d) + PAGE_OFFSET)) #endif --- a/arch/mips/include/asm/pgtable-64.h~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/mips/include/asm/pgtable-64.h @@ -209,9 +209,9 @@ static inline void p4d_clear(p4d_t *p4dp p4d_val(*p4dp) = (unsigned long)invalid_pud_table; } -static inline unsigned long p4d_page_vaddr(p4d_t p4d) +static inline pud_t *p4d_pgtable(p4d_t p4d) { - return p4d_val(p4d); + return (pud_t *)p4d_val(p4d); } #define p4d_phys(p4d) virt_to_phys((void *)p4d_val(p4d)) --- a/arch/powerpc/include/asm/book3s/64/pgtable.h~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/powerpc/include/asm/book3s/64/pgtable.h @@ -1048,7 +1048,10 @@ extern struct page *p4d_page(p4d_t p4d); /* Pointers in the page table tree are physical addresses */ #define __pgtable_ptr_val(ptr) __pa(ptr) -#define p4d_page_vaddr(p4d)__va(p4d_val(p4d) & ~P4D_MASKED_BITS) +static inline pud_t *p4d_pgtable(p4d_t p4d) +{ + return (pud_t *)__va(p4d_val(p4d) & ~P4D_MASKED_BITS); +} static inline pmd_t *pud_pgtable(pud_t pud) { --- a/arch/powerpc/include/asm/nohash/64/pgtable-4k.h~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/powerpc/include/asm/nohash/64/pgtable-4k.h @@ -56,10 +56,14 @@ #define p4d_none(p4d) (!p4d_val(p4d)) #define p4d_bad(p4d) (p4d_val(p4d) == 0) #define p4d_present(p4d) (p4d_val(p4d) != 0) -#define p4d_page_vaddr(p4d)(p4d_val(p4d) & ~P4D_MASKED_BITS) #ifndef __ASSEMBLY__ +static inline pud_t *p4d_pgtable(p4d_t p4d) +{ + return (pud_t *) (p4d_val(p4d) & ~P4D_MASKED_BITS); +} + static inline void p4d_clear(p4d_t *p4dp) { *p4dp = __p4d(0); --- a/arch/powerpc/mm/book3s64/radix_pgtable.c~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/powerpc/mm/book3s64/radix_pgtable.c @@ -860,7 +860,7 @@ static void __meminit remove_pagetable(u continue; } - pud_base = (pud_t *)p4d_page_vaddr(*p4d); + pud_base = p4d_pgtable(*p4d); remove_pud_table(pud_base, addr,
[to-be-updated] mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t.patch removed from -mm tree
The patch titled Subject: mm: rename pud_page_vaddr to pud_pgtable and make it return pmd_t * has been removed from the -mm tree. Its filename was mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t.patch This patch was dropped because an updated version will be merged -- From: "Aneesh Kumar K.V" Subject: mm: rename pud_page_vaddr to pud_pgtable and make it return pmd_t * No functional change in this patch. Link: https://lkml.kernel.org/r/20210615110859.320299-1-aneesh.ku...@linux.ibm.com Link: https://lore.kernel.org/linuxppc-dev/CAHk-=wi+j+iodze9ftjm3zi4j4oes+qqbkxme9qn4roxpex...@mail.gmail.com/ Signed-off-by: Aneesh Kumar K.V Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Signed-off-by: Andrew Morton --- arch/alpha/include/asm/pgtable.h |8 +--- arch/arm/include/asm/pgtable-3level.h|2 +- arch/arm64/include/asm/pgtable.h |4 ++-- arch/ia64/include/asm/pgtable.h |2 +- arch/m68k/include/asm/motorola_pgtable.h |2 +- arch/mips/include/asm/pgtable-64.h |4 ++-- arch/parisc/include/asm/pgtable.h|4 ++-- arch/powerpc/include/asm/book3s/64/pgtable.h |6 +- arch/powerpc/include/asm/nohash/64/pgtable.h |6 +- arch/powerpc/mm/book3s64/radix_pgtable.c |4 ++-- arch/powerpc/mm/pgtable_64.c |2 +- arch/riscv/include/asm/pgtable-64.h |4 ++-- arch/sh/include/asm/pgtable-3level.h |4 ++-- arch/sparc/include/asm/pgtable_32.h |4 ++-- arch/sparc/include/asm/pgtable_64.h |6 +++--- arch/um/include/asm/pgtable-3level.h |2 +- arch/x86/include/asm/pgtable.h |4 ++-- arch/x86/mm/pat/set_memory.c |4 ++-- arch/x86/mm/pgtable.c|2 +- include/asm-generic/pgtable-nopmd.h |2 +- include/asm-generic/pgtable-nopud.h |2 +- include/linux/pgtable.h |2 +- 22 files changed, 45 insertions(+), 35 deletions(-) --- a/arch/alpha/include/asm/pgtable.h~mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t +++ a/arch/alpha/include/asm/pgtable.h @@ -236,8 +236,10 @@ pmd_page_vaddr(pmd_t pmd) #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> 32)) #define pud_page(pud) (pfn_to_page(pud_val(pud) >> 32)) -extern inline unsigned long pud_page_vaddr(pud_t pgd) -{ return PAGE_OFFSET + ((pud_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT)); } +static inline pmd_t *pud_pgtable(pud_t pgd) +{ + return (pmd_t *)(PAGE_OFFSET + ((pud_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT))); +} extern inline int pte_none(pte_t pte) { return !pte_val(pte); } extern inline int pte_present(pte_t pte) { return pte_val(pte) & _PAGE_VALID; } @@ -287,7 +289,7 @@ extern inline pte_t pte_mkyoung(pte_t pt /* Find an entry in the second-level page table.. */ extern inline pmd_t * pmd_offset(pud_t * dir, unsigned long address) { - pmd_t *ret = (pmd_t *) pud_page_vaddr(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1)); + pmd_t *ret = pud_pgtable(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1)); smp_rmb(); /* see above */ return ret; } --- a/arch/arm64/include/asm/pgtable.h~mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t +++ a/arch/arm64/include/asm/pgtable.h @@ -633,9 +633,9 @@ static inline phys_addr_t pud_page_paddr return __pud_to_phys(pud); } -static inline unsigned long pud_page_vaddr(pud_t pud) +static inline pmd_t *pud_pgtable(pud_t pud) { - return (unsigned long)__va(pud_page_paddr(pud)); + return (pmd_t *)__va(pud_page_paddr(pud)); } /* Find an entry in the second-level page table. */ --- a/arch/arm/include/asm/pgtable-3level.h~mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t +++ a/arch/arm/include/asm/pgtable-3level.h @@ -130,7 +130,7 @@ flush_pmd_entry(pudp); \ } while (0) -static inline pmd_t *pud_page_vaddr(pud_t pud) +static inline pmd_t *pud_pgtable(pud_t pud) { return __va(pud_val(pud) & PHYS_MASK & (s32)PAGE_MASK); } --- a/arch/ia64/include/asm/pgtable.h~mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t +++ a/arch/ia64/include/asm/pgtable.h @@ -273,7 +273,7 @@ ia64_phys_addr_valid (unsigned long addr #define pud_bad(pud) (!ia64_phys_addr_valid(pud_val(pud))) #define pud_present(pud) (pud_val(pud) != 0UL) #define pud_clear(pudp)(pud_val(*(pudp)) = 0UL) -#define pud_page_vaddr(pud)((unsigned long) __va(pud_val(pud) & _PFN_MASK)) +#define pud_pgtable(pud) ((pmd_t *) __va(pud_val(pud) & _PFN_MASK)) #define pud_page(pud) virt_to_page((pud_val(pud) + PAGE_OFFSET)) #if CONFIG_PGTABLE_LEVELS == 4 ---
+ mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t.patch added to -mm tree
The patch titled Subject: mm: rename p4d_page_vaddr to p4d_pgtable and make it return pud_t * has been added to the -mm tree. Its filename is mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t.patch This patch should soon appear at https://ozlabs.org/~akpm/mmots/broken-out/mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t.patch and later at https://ozlabs.org/~akpm/mmotm/broken-out/mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days -- From: "Aneesh Kumar K.V" Subject: mm: rename p4d_page_vaddr to p4d_pgtable and make it return pud_t * No functional change in this patch. Link: https://lkml.kernel.org/r/20210615110859.320299-2-aneesh.ku...@linux.ibm.com Link: https://lore.kernel.org/linuxppc-dev/CAHk-=wi+j+iodze9ftjm3zi4j4oes+qqbkxme9qn4roxpex...@mail.gmail.com/ Signed-off-by: Aneesh Kumar K.V Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Signed-off-by: Andrew Morton --- arch/arm64/include/asm/pgtable.h|4 ++-- arch/ia64/include/asm/pgtable.h |2 +- arch/mips/include/asm/pgtable-64.h |4 ++-- arch/powerpc/include/asm/book3s/64/pgtable.h|5 - arch/powerpc/include/asm/nohash/64/pgtable-4k.h |6 +- arch/powerpc/mm/book3s64/radix_pgtable.c|2 +- arch/powerpc/mm/pgtable_64.c|2 +- arch/sparc/include/asm/pgtable_64.h |4 ++-- arch/x86/include/asm/pgtable.h |4 ++-- arch/x86/mm/init_64.c |4 ++-- include/asm-generic/pgtable-nop4d.h |2 +- include/asm-generic/pgtable-nopud.h |2 +- include/linux/pgtable.h |2 +- 13 files changed, 25 insertions(+), 18 deletions(-) --- a/arch/arm64/include/asm/pgtable.h~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/arm64/include/asm/pgtable.h @@ -694,9 +694,9 @@ static inline phys_addr_t p4d_page_paddr return __p4d_to_phys(p4d); } -static inline unsigned long p4d_page_vaddr(p4d_t p4d) +static inline pud_t *p4d_pgtable(p4d_t p4d) { - return (unsigned long)__va(p4d_page_paddr(p4d)); + return (pud_t *)__va(p4d_page_paddr(p4d)); } /* Find an entry in the frst-level page table. */ --- a/arch/ia64/include/asm/pgtable.h~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/ia64/include/asm/pgtable.h @@ -281,7 +281,7 @@ ia64_phys_addr_valid (unsigned long addr #define p4d_bad(p4d) (!ia64_phys_addr_valid(p4d_val(p4d))) #define p4d_present(p4d) (p4d_val(p4d) != 0UL) #define p4d_clear(p4dp)(p4d_val(*(p4dp)) = 0UL) -#define p4d_page_vaddr(p4d)((unsigned long) __va(p4d_val(p4d) & _PFN_MASK)) +#define p4d_pgtable(p4d) ((pud_t *) __va(p4d_val(p4d) & _PFN_MASK)) #define p4d_page(p4d) virt_to_page((p4d_val(p4d) + PAGE_OFFSET)) #endif --- a/arch/mips/include/asm/pgtable-64.h~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/mips/include/asm/pgtable-64.h @@ -209,9 +209,9 @@ static inline void p4d_clear(p4d_t *p4dp p4d_val(*p4dp) = (unsigned long)invalid_pud_table; } -static inline unsigned long p4d_page_vaddr(p4d_t p4d) +static inline pud_t *p4d_pgtable(p4d_t p4d) { - return p4d_val(p4d); + return (pud_t *)p4d_val(p4d); } #define p4d_phys(p4d) virt_to_phys((void *)p4d_val(p4d)) --- a/arch/powerpc/include/asm/book3s/64/pgtable.h~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/powerpc/include/asm/book3s/64/pgtable.h @@ -1048,7 +1048,10 @@ extern struct page *p4d_page(p4d_t p4d); /* Pointers in the page table tree are physical addresses */ #define __pgtable_ptr_val(ptr) __pa(ptr) -#define p4d_page_vaddr(p4d)__va(p4d_val(p4d) & ~P4D_MASKED_BITS) +static inline pud_t *p4d_pgtable(p4d_t p4d) +{ + return (pud_t *)__va(p4d_val(p4d) & ~P4D_MASKED_BITS); +} static inline pmd_t *pud_pgtable(pud_t pud) { --- a/arch/powerpc/include/asm/nohash/64/pgtable-4k.h~mm-rename-p4d_page_vaddr-to-p4d_pgtable-and-make-it-return-pud_t +++ a/arch/powerpc/include/asm/nohash/64/pgtable-4k.h @@ -56,10 +56,14 @@ #define p4d_none(p4d) (!p4d_val(p4d)) #define p4d_bad(p4d) (p4d_val(p4d) == 0) #define p4d_present(p4d) (p4d_val(p4d) != 0) -#define
+ mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t.patch added to -mm tree
The patch titled Subject: mm: rename pud_page_vaddr to pud_pgtable and make it return pmd_t * has been added to the -mm tree. Its filename is mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t.patch This patch should soon appear at https://ozlabs.org/~akpm/mmots/broken-out/mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t.patch and later at https://ozlabs.org/~akpm/mmotm/broken-out/mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days -- From: "Aneesh Kumar K.V" Subject: mm: rename pud_page_vaddr to pud_pgtable and make it return pmd_t * No functional change in this patch. Link: https://lkml.kernel.org/r/20210615110859.320299-1-aneesh.ku...@linux.ibm.com Link: https://lore.kernel.org/linuxppc-dev/CAHk-=wi+j+iodze9ftjm3zi4j4oes+qqbkxme9qn4roxpex...@mail.gmail.com/ Signed-off-by: Aneesh Kumar K.V Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Cc: Signed-off-by: Andrew Morton --- arch/alpha/include/asm/pgtable.h |8 +--- arch/arm/include/asm/pgtable-3level.h|2 +- arch/arm64/include/asm/pgtable.h |4 ++-- arch/ia64/include/asm/pgtable.h |2 +- arch/m68k/include/asm/motorola_pgtable.h |2 +- arch/mips/include/asm/pgtable-64.h |4 ++-- arch/parisc/include/asm/pgtable.h|4 ++-- arch/powerpc/include/asm/book3s/64/pgtable.h |6 +- arch/powerpc/include/asm/nohash/64/pgtable.h |6 +- arch/powerpc/mm/book3s64/radix_pgtable.c |4 ++-- arch/powerpc/mm/pgtable_64.c |2 +- arch/riscv/include/asm/pgtable-64.h |4 ++-- arch/sh/include/asm/pgtable-3level.h |4 ++-- arch/sparc/include/asm/pgtable_32.h |4 ++-- arch/sparc/include/asm/pgtable_64.h |6 +++--- arch/um/include/asm/pgtable-3level.h |2 +- arch/x86/include/asm/pgtable.h |4 ++-- arch/x86/mm/pat/set_memory.c |4 ++-- arch/x86/mm/pgtable.c|2 +- include/asm-generic/pgtable-nopmd.h |2 +- include/asm-generic/pgtable-nopud.h |2 +- include/linux/pgtable.h |2 +- 22 files changed, 45 insertions(+), 35 deletions(-) --- a/arch/alpha/include/asm/pgtable.h~mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t +++ a/arch/alpha/include/asm/pgtable.h @@ -236,8 +236,10 @@ pmd_page_vaddr(pmd_t pmd) #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> 32)) #define pud_page(pud) (pfn_to_page(pud_val(pud) >> 32)) -extern inline unsigned long pud_page_vaddr(pud_t pgd) -{ return PAGE_OFFSET + ((pud_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT)); } +static inline pmd_t *pud_pgtable(pud_t pgd) +{ + return (pmd_t *)(PAGE_OFFSET + ((pud_val(pgd) & _PFN_MASK) >> (32-PAGE_SHIFT))); +} extern inline int pte_none(pte_t pte) { return !pte_val(pte); } extern inline int pte_present(pte_t pte) { return pte_val(pte) & _PAGE_VALID; } @@ -287,7 +289,7 @@ extern inline pte_t pte_mkyoung(pte_t pt /* Find an entry in the second-level page table.. */ extern inline pmd_t * pmd_offset(pud_t * dir, unsigned long address) { - pmd_t *ret = (pmd_t *) pud_page_vaddr(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1)); + pmd_t *ret = pud_pgtable(*dir) + ((address >> PMD_SHIFT) & (PTRS_PER_PAGE - 1)); smp_rmb(); /* see above */ return ret; } --- a/arch/arm64/include/asm/pgtable.h~mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t +++ a/arch/arm64/include/asm/pgtable.h @@ -633,9 +633,9 @@ static inline phys_addr_t pud_page_paddr return __pud_to_phys(pud); } -static inline unsigned long pud_page_vaddr(pud_t pud) +static inline pmd_t *pud_pgtable(pud_t pud) { - return (unsigned long)__va(pud_page_paddr(pud)); + return (pmd_t *)__va(pud_page_paddr(pud)); } /* Find an entry in the second-level page table. */ --- a/arch/arm/include/asm/pgtable-3level.h~mm-rename-pud_page_vaddr-to-pud_pgtable-and-make-it-return-pmd_t +++ a/arch/arm/include/asm/pgtable-3level.h @@ -130,7 +130,7 @@ flush_pmd_entry(pudp); \ } while (0) -static inline pmd_t *pud_page_vaddr(pud_t pud) +static inline pmd_t *pud_pgtable(pud_t pud) { return __va(pud_val(pud) & PHYS_MASK & (s32)PAGE_MASK); } --- a/arch/i
[patch 1/2] mm: remove free_area_cache use in powerpc architecture
From: Michel Lespinasse wal...@google.com Subject: mm: remove free_area_cache use in powerpc architecture As all other architectures have been converted to use vm_unmapped_area(), we are about to retire the free_area_cache. This change simply removes the use of that cache in slice_get_unmapped_area(), which will most certainly have a performance cost. Next one will convert that function to use the vm_unmapped_area() infrastructure and regain the performance. Signed-off-by: Michel Lespinasse wal...@google.com Acked-by: Rik van Riel r...@redhat.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Cc: Paul Mackerras pau...@samba.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/include/asm/page_64.h |3 arch/powerpc/mm/hugetlbpage.c|2 arch/powerpc/mm/slice.c | 108 +++-- arch/powerpc/platforms/cell/spufs/file.c |2 4 files changed, 22 insertions(+), 93 deletions(-) diff -puN arch/powerpc/include/asm/page_64.h~mm-remove-free_area_cache-use-in-powerpc-architecture arch/powerpc/include/asm/page_64.h --- a/arch/powerpc/include/asm/page_64.h~mm-remove-free_area_cache-use-in-powerpc-architecture +++ a/arch/powerpc/include/asm/page_64.h @@ -99,8 +99,7 @@ extern unsigned long slice_get_unmapped_ unsigned long len, unsigned long flags, unsigned int psize, -int topdown, -int use_cache); +int topdown); extern unsigned int get_slice_psize(struct mm_struct *mm, unsigned long addr); diff -puN arch/powerpc/mm/hugetlbpage.c~mm-remove-free_area_cache-use-in-powerpc-architecture arch/powerpc/mm/hugetlbpage.c --- a/arch/powerpc/mm/hugetlbpage.c~mm-remove-free_area_cache-use-in-powerpc-architecture +++ a/arch/powerpc/mm/hugetlbpage.c @@ -742,7 +742,7 @@ unsigned long hugetlb_get_unmapped_area( struct hstate *hstate = hstate_file(file); int mmu_psize = shift_to_mmu_psize(huge_page_shift(hstate)); - return slice_get_unmapped_area(addr, len, flags, mmu_psize, 1, 0); + return slice_get_unmapped_area(addr, len, flags, mmu_psize, 1); } #endif diff -puN arch/powerpc/mm/slice.c~mm-remove-free_area_cache-use-in-powerpc-architecture arch/powerpc/mm/slice.c --- a/arch/powerpc/mm/slice.c~mm-remove-free_area_cache-use-in-powerpc-architecture +++ a/arch/powerpc/mm/slice.c @@ -240,23 +240,15 @@ static void slice_convert(struct mm_stru static unsigned long slice_find_area_bottomup(struct mm_struct *mm, unsigned long len, struct slice_mask available, - int psize, int use_cache) + int psize) { struct vm_area_struct *vma; - unsigned long start_addr, addr; + unsigned long addr; struct slice_mask mask; int pshift = max_t(int, mmu_psize_defs[psize].shift, PAGE_SHIFT); - if (use_cache) { - if (len = mm-cached_hole_size) { - start_addr = addr = TASK_UNMAPPED_BASE; - mm-cached_hole_size = 0; - } else - start_addr = addr = mm-free_area_cache; - } else - start_addr = addr = TASK_UNMAPPED_BASE; + addr = TASK_UNMAPPED_BASE; -full_search: for (;;) { addr = _ALIGN_UP(addr, 1ul pshift); if ((TASK_SIZE - len) addr) @@ -272,63 +264,24 @@ full_search: addr = _ALIGN_UP(addr + 1, 1ul SLICE_HIGH_SHIFT); continue; } - if (!vma || addr + len = vma-vm_start) { - /* -* Remember the place where we stopped the search: -*/ - if (use_cache) - mm-free_area_cache = addr + len; + if (!vma || addr + len = vma-vm_start) return addr; - } - if (use_cache (addr + mm-cached_hole_size) vma-vm_start) - mm-cached_hole_size = vma-vm_start - addr; addr = vma-vm_end; } - /* Make sure we didn't miss any holes */ - if (use_cache start_addr != TASK_UNMAPPED_BASE) { - start_addr = addr = TASK_UNMAPPED_BASE; - mm-cached_hole_size = 0; - goto full_search; - } return -ENOMEM; } static unsigned long slice_find_area_topdown(struct mm_struct *mm, unsigned long len, struct slice_mask
[patch 2/2] mm: use vm_unmapped_area() on powerpc architecture
From: Michel Lespinasse wal...@google.com Subject: mm: use vm_unmapped_area() on powerpc architecture Update the powerpc slice_get_unmapped_area function to make use of vm_unmapped_area() instead of implementing a brute force search. Signed-off-by: Michel Lespinasse wal...@google.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Cc: Paul Mackerras pau...@samba.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/mm/slice.c | 123 -- 1 file changed, 78 insertions(+), 45 deletions(-) diff -puN arch/powerpc/mm/slice.c~mm-use-vm_unmapped_area-on-powerpc-architecture arch/powerpc/mm/slice.c --- a/arch/powerpc/mm/slice.c~mm-use-vm_unmapped_area-on-powerpc-architecture +++ a/arch/powerpc/mm/slice.c @@ -237,36 +237,69 @@ static void slice_convert(struct mm_stru #endif } +/* + * Compute which slice addr is part of; + * set *boundary_addr to the start or end boundary of that slice + * (depending on 'end' parameter); + * return boolean indicating if the slice is marked as available in the + * 'available' slice_mark. + */ +static bool slice_scan_available(unsigned long addr, +struct slice_mask available, +int end, +unsigned long *boundary_addr) +{ + unsigned long slice; + if (addr SLICE_LOW_TOP) { + slice = GET_LOW_SLICE_INDEX(addr); + *boundary_addr = (slice + end) SLICE_LOW_SHIFT; + return !!(available.low_slices (1u slice)); + } else { + slice = GET_HIGH_SLICE_INDEX(addr); + *boundary_addr = (slice + end) ? + ((slice + end) SLICE_HIGH_SHIFT) : SLICE_LOW_TOP; + return !!(available.high_slices (1u slice)); + } +} + static unsigned long slice_find_area_bottomup(struct mm_struct *mm, unsigned long len, struct slice_mask available, int psize) { - struct vm_area_struct *vma; - unsigned long addr; - struct slice_mask mask; int pshift = max_t(int, mmu_psize_defs[psize].shift, PAGE_SHIFT); + unsigned long addr, found, next_end; + struct vm_unmapped_area_info info; - addr = TASK_UNMAPPED_BASE; - - for (;;) { - addr = _ALIGN_UP(addr, 1ul pshift); - if ((TASK_SIZE - len) addr) - break; - vma = find_vma(mm, addr); - BUG_ON(vma (addr = vma-vm_end)); + info.flags = 0; + info.length = len; + info.align_mask = PAGE_MASK ((1ul pshift) - 1); + info.align_offset = 0; - mask = slice_range_to_mask(addr, len); - if (!slice_check_fit(mask, available)) { - if (addr SLICE_LOW_TOP) - addr = _ALIGN_UP(addr + 1, 1ul SLICE_LOW_SHIFT); - else - addr = _ALIGN_UP(addr + 1, 1ul SLICE_HIGH_SHIFT); + addr = TASK_UNMAPPED_BASE; + while (addr TASK_SIZE) { + info.low_limit = addr; + if (!slice_scan_available(addr, available, 1, addr)) continue; + + next_slice: + /* +* At this point [info.low_limit; addr) covers +* available slices only and ends at a slice boundary. +* Check if we need to reduce the range, or if we can +* extend it to cover the next available slice. +*/ + if (addr = TASK_SIZE) + addr = TASK_SIZE; + else if (slice_scan_available(addr, available, 1, next_end)) { + addr = next_end; + goto next_slice; } - if (!vma || addr + len = vma-vm_start) - return addr; - addr = vma-vm_end; + info.high_limit = addr; + + found = vm_unmapped_area(info); + if (!(found ~PAGE_MASK)) + return found; } return -ENOMEM; @@ -277,39 +310,39 @@ static unsigned long slice_find_area_top struct slice_mask available, int psize) { - struct vm_area_struct *vma; - unsigned long addr; - struct slice_mask mask; int pshift = max_t(int, mmu_psize_defs[psize].shift, PAGE_SHIFT); + unsigned long addr, found, prev; + struct vm_unmapped_area_info info; - addr = mm-mmap_base; - while (addr len) { - /* Go down by chunk size */ - addr = _ALIGN_DOWN(addr - len, 1ul pshift); + info.flags = VM_UNMAPPED_AREA_TOPDOWN; + info.length = len; + info.align_mask = PAGE_MASK
[patch 1/1] drivers/edac/mpc85xx_edac.c: fix memory controller compatible for edac
From: Shaohui Xie shaohui@freescale.com Subject: drivers/edac/mpc85xx_edac.c: fix memory controller compatible for edac compatible in dts has been changed, so the driver needs to be updated accordingly. Signed-off-by: Shaohui Xie shaohui@freescale.com Cc: Kumar Gala ga...@kernel.crashing.org Cc: Grant Likely grant.lik...@secretlab.ca Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- drivers/edac/mpc85xx_edac.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN drivers/edac/mpc85xx_edac.c~drivers-edac-mpc85xx_edacc-fix-memory-controller-compatible-for-edac drivers/edac/mpc85xx_edac.c --- a/drivers/edac/mpc85xx_edac.c~drivers-edac-mpc85xx_edacc-fix-memory-controller-compatible-for-edac +++ a/drivers/edac/mpc85xx_edac.c @@ -1128,7 +1128,7 @@ static struct of_device_id mpc85xx_mc_er { .compatible = fsl,p1020-memory-controller, }, { .compatible = fsl,p1021-memory-controller, }, { .compatible = fsl,p2020-memory-controller, }, - { .compatible = fsl,p4080-memory-controller, }, + { .compatible = fsl,qoriq-memory-controller, }, {}, }; MODULE_DEVICE_TABLE(of, mpc85xx_mc_err_of_match); _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 1/2] macintosh: wrong test in fan_{read,write}_reg()
From: roel kluin roel.kl...@gmail.com Fix error test in fan_{read,write}_reg() Signed-off-by: Roel Kluin roel.kl...@gmail.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- drivers/macintosh/therm_pm72.c |4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff -puN drivers/macintosh/therm_pm72.c~macintosh-wrong-test-in-fan_readwrite_reg drivers/macintosh/therm_pm72.c --- a/drivers/macintosh/therm_pm72.c~macintosh-wrong-test-in-fan_readwrite_reg +++ a/drivers/macintosh/therm_pm72.c @@ -443,7 +443,7 @@ static int fan_read_reg(int reg, unsigne tries = 0; for (;;) { nr = i2c_master_recv(fcu, buf, nb); - if (nr 0 || (nr 0 nr != ENODEV) || tries = 100) + if (nr 0 || (nr 0 nr != -ENODEV) || tries = 100) break; msleep(10); ++tries; @@ -464,7 +464,7 @@ static int fan_write_reg(int reg, const tries = 0; for (;;) { nw = i2c_master_send(fcu, buf, nb); - if (nw 0 || (nw 0 nw != EIO) || tries = 100) + if (nw 0 || (nw 0 nw != -EIO) || tries = 100) break; msleep(10); ++tries; _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 2/2] spufs: use simple_write_to_buffer()
From: Akinobu Mita akinobu.m...@gmail.com Simplify several write fileoperations for spufs by using simple_write_to_buffer(). Signed-off-by: Akinobu Mita akinobu.m...@gmail.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Cc: Paul Mackerras pau...@samba.org Cc: Jeremy Kerr j...@ozlabs.org Acked-by: Arnd Bergmann a...@arndb.de Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/platforms/cell/spufs/file.c | 27 + 1 file changed, 7 insertions(+), 20 deletions(-) diff -puN arch/powerpc/platforms/cell/spufs/file.c~spufs-use-simple_write_to_buffer arch/powerpc/platforms/cell/spufs/file.c --- a/arch/powerpc/platforms/cell/spufs/file.c~spufs-use-simple_write_to_buffer +++ a/arch/powerpc/platforms/cell/spufs/file.c @@ -219,24 +219,17 @@ spufs_mem_write(struct file *file, const loff_t pos = *ppos; int ret; - if (pos 0) - return -EINVAL; if (pos LS_SIZE) return -EFBIG; - if (size LS_SIZE - pos) - size = LS_SIZE - pos; ret = spu_acquire(ctx); if (ret) return ret; local_store = ctx-ops-get_ls(ctx); - ret = copy_from_user(local_store + pos, buffer, size); + size = simple_write_to_buffer(local_store, LS_SIZE, ppos, buffer, size); spu_release(ctx); - if (ret) - return -EFAULT; - *ppos = pos + size; return size; } @@ -574,18 +567,15 @@ spufs_regs_write(struct file *file, cons if (*pos = sizeof(lscsa-gprs)) return -EFBIG; - size = min_t(ssize_t, sizeof(lscsa-gprs) - *pos, size); - *pos += size; - ret = spu_acquire_saved(ctx); if (ret) return ret; - ret = copy_from_user((char *)lscsa-gprs + *pos - size, -buffer, size) ? -EFAULT : size; + size = simple_write_to_buffer(lscsa-gprs, sizeof(lscsa-gprs), pos, + buffer, size); spu_release_saved(ctx); - return ret; + return size; } static const struct file_operations spufs_regs_fops = { @@ -630,18 +620,15 @@ spufs_fpcr_write(struct file *file, cons if (*pos = sizeof(lscsa-fpcr)) return -EFBIG; - size = min_t(ssize_t, sizeof(lscsa-fpcr) - *pos, size); - ret = spu_acquire_saved(ctx); if (ret) return ret; - *pos += size; - ret = copy_from_user((char *)lscsa-fpcr + *pos - size, -buffer, size) ? -EFAULT : size; + size = simple_write_to_buffer(lscsa-fpcr, sizeof(lscsa-fpcr), pos, + buffer, size); spu_release_saved(ctx); - return ret; + return size; } static const struct file_operations spufs_fpcr_fops = { _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 1/1] powerpc: enable ARCH_DMA_ADDR_T_64BIT with ARCH_PHYS_ADDR_T_64BIT
From: FUJITA Tomonori fujita.tomon...@lab.ntt.co.jp Signed-off-by: FUJITA Tomonori fujita.tomon...@lab.ntt.co.jp Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/Kconfig |3 +++ 1 file changed, 3 insertions(+) diff -puN arch/powerpc/Kconfig~powerpc-enable-arch_dma_addr_t_64bit-with-arch_phys_addr_t_64bit arch/powerpc/Kconfig --- a/arch/powerpc/Kconfig~powerpc-enable-arch_dma_addr_t_64bit-with-arch_phys_addr_t_64bit +++ a/arch/powerpc/Kconfig @@ -16,6 +16,9 @@ config WORD_SIZE config ARCH_PHYS_ADDR_T_64BIT def_bool PPC64 || PHYS_64BIT +config ARCH_DMA_ADDR_T_64BIT + def_bool ARCH_PHYS_ADDR_T_64BIT + config MMU bool default y _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 1/1] powerpc: enable ARCH_DMA_ADDR_T_64BIT with ARCH_PHYS_ADDR_T_64BIT
From: FUJITA Tomonori fujita.tomon...@lab.ntt.co.jp Signed-off-by: FUJITA Tomonori fujita.tomon...@lab.ntt.co.jp Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/Kconfig |3 +++ 1 file changed, 3 insertions(+) diff -puN arch/powerpc/Kconfig~powerpc-enable-arch_dma_addr_t_64bit-with-arch_phys_addr_t_64bit arch/powerpc/Kconfig --- a/arch/powerpc/Kconfig~powerpc-enable-arch_dma_addr_t_64bit-with-arch_phys_addr_t_64bit +++ a/arch/powerpc/Kconfig @@ -16,6 +16,9 @@ config WORD_SIZE config ARCH_PHYS_ADDR_T_64BIT def_bool PPC64 || PHYS_64BIT +config ARCH_DMA_ADDR_T_64BIT + def_bool ARCH_PHYS_ADDR_T_64BIT + config MMU bool default y _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 1/1] powerpc: add rcu_read_lock() to gup_fast() implementation
From: Peter Zijlstra a.p.zijls...@chello.nl The powerpc page table freeing relies on the fact that IRQs hold off an RCU grace period, this is currently true for all existing RCU implementations but is not an assumption Paul wants to support. Therefore, also take the RCU read lock along with disabling IRQs to ensure the RCU grace period does at least cover these lookups. Signed-off-by: Peter Zijlstra a.p.zijls...@chello.nl Requested-by: Paul E. McKenney paul...@linux.vnet.ibm.com Cc: Nick Piggin npig...@suse.de Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Reviewed-by: Rik van Riel r...@redhat.com Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/mm/gup.c |3 +++ 1 file changed, 3 insertions(+) diff -puN arch/powerpc/mm/gup.c~powerpc-add-rcu_read_lock-to-gup_fast-implementation arch/powerpc/mm/gup.c --- a/arch/powerpc/mm/gup.c~powerpc-add-rcu_read_lock-to-gup_fast-implementation +++ a/arch/powerpc/mm/gup.c @@ -142,6 +142,7 @@ int get_user_pages_fast(unsigned long st * So long as we atomically load page table pointers versus teardown, * we can follow the address down to the the page and take a ref on it. */ + rcu_read_lock(); local_irq_disable(); pgdp = pgd_offset(mm, addr); @@ -162,6 +163,7 @@ int get_user_pages_fast(unsigned long st } while (pgdp++, addr = next, addr != end); local_irq_enable(); + rcu_read_unlock(); VM_BUG_ON(nr != (end - start) PAGE_SHIFT); return nr; @@ -171,6 +173,7 @@ int get_user_pages_fast(unsigned long st slow: local_irq_enable(); + rcu_read_unlock(); slow_irqon: pr_devel( slow path ! nr = %d\n, nr); _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 1/2] powerpc: Sky CPU: redundant or incorrect tests on unsigned
From: Roel Kluin roel.kl...@gmail.com count is unsigned and cannot be less than 0. Signed-off-by: Roel Kluin roel.kl...@gmail.com Acked-by: Cyrill Gorcunov gorcu...@gmail.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Cc: Kumar Gala ga...@gate.crashing.org Cc: Brian Waite wa...@skycomputers.com Signed-off-by: Andrew Morton a...@linux-foundation.org --- drivers/misc/hdpuftrs/hdpu_cpustate.c |5 - 1 file changed, 5 deletions(-) diff -puN drivers/misc/hdpuftrs/hdpu_cpustate.c~powerpc-sky-cpu-redundant-or-incorrect-tests-on-unsigned drivers/misc/hdpuftrs/hdpu_cpustate.c --- a/drivers/misc/hdpuftrs/hdpu_cpustate.c~powerpc-sky-cpu-redundant-or-incorrect-tests-on-unsigned +++ a/drivers/misc/hdpuftrs/hdpu_cpustate.c @@ -121,8 +121,6 @@ static ssize_t cpustate_read(struct file { unsigned char data; - if (count 0) - return -EFAULT; if (count == 0) return 0; @@ -137,9 +135,6 @@ static ssize_t cpustate_write(struct fil { unsigned char data; - if (count 0) - return -EFAULT; - if (count == 0) return 0; _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 2/2] kbuild: move -fno-dwarf2-cfi-asm to powerpc only
From: Andi Kleen a...@firstfloor.org Better dwarf2 unwind information is a good thing, it allows better debugging with kgdb and crash and helps systemtap. Commit 003086497f07f7f1e67c0c295e261740f822b377 (Build with -fno-dwarf2-cfi-asm) disabled some CFI information globally to work around a module loader bug on powerpc. But this disables the better unwind tables for all architectures, not just powerpc. Move the workaround to powerpc and also add a suitable comment that's it really a workaround. This improves dwarf2 unwind tables on x86 at least. Signed-off-by: Andi Kleen a...@linux.intel.com Cc: Kyle McMartin k...@mcmartin.ca Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Cc: Michal Marek mma...@suse.cz Signed-off-by: Andrew Morton a...@linux-foundation.org --- Makefile |3 --- arch/powerpc/Makefile |5 + 2 files changed, 5 insertions(+), 3 deletions(-) diff -puN Makefile~kbuild-move-fno-dwarf2-cfi-asm-to-powerpc-only Makefile --- a/Makefile~kbuild-move-fno-dwarf2-cfi-asm-to-powerpc-only +++ a/Makefile @@ -579,9 +579,6 @@ KBUILD_CFLAGS += $(call cc-option,-Wno-p # disable invalid can't wrap optimizations for signed / pointers KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow) -# revert to pre-gcc-4.4 behaviour of .eh_frame -KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm) - # conserve stack if available KBUILD_CFLAGS += $(call cc-option,-fconserve-stack) diff -puN arch/powerpc/Makefile~kbuild-move-fno-dwarf2-cfi-asm-to-powerpc-only arch/powerpc/Makefile --- a/arch/powerpc/Makefile~kbuild-move-fno-dwarf2-cfi-asm-to-powerpc-only +++ a/arch/powerpc/Makefile @@ -112,6 +112,11 @@ KBUILD_CFLAGS += $(call cc-option,-mspe= # kernel considerably. KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time) +# FIXME: the module load should be taught about the additional relocs +# generated by this. +# revert to pre-gcc-4.4 behaviour of .eh_frame +KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm) + # Never use string load/store instructions as they are # often slow when they are implemented at all KBUILD_CFLAGS += -mno-string _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 1/5] powerpc: Sky CPU: redundant or incorrect tests on unsigned
From: Roel Kluin roel.kl...@gmail.com count is unsigned and cannot be less than 0. Signed-off-by: Roel Kluin roel.kl...@gmail.com Acked-by: Cyrill Gorcunov gorcu...@gmail.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Cc: Kumar Gala ga...@gate.crashing.org Cc: Brian Waite wa...@skycomputers.com Signed-off-by: Andrew Morton a...@linux-foundation.org --- drivers/misc/hdpuftrs/hdpu_cpustate.c |5 - 1 file changed, 5 deletions(-) diff -puN drivers/misc/hdpuftrs/hdpu_cpustate.c~powerpc-sky-cpu-redundant-or-incorrect-tests-on-unsigned drivers/misc/hdpuftrs/hdpu_cpustate.c --- a/drivers/misc/hdpuftrs/hdpu_cpustate.c~powerpc-sky-cpu-redundant-or-incorrect-tests-on-unsigned +++ a/drivers/misc/hdpuftrs/hdpu_cpustate.c @@ -121,8 +121,6 @@ static ssize_t cpustate_read(struct file { unsigned char data; - if (count 0) - return -EFAULT; if (count == 0) return 0; @@ -137,9 +135,6 @@ static ssize_t cpustate_write(struct fil { unsigned char data; - if (count 0) - return -EFAULT; - if (count == 0) return 0; _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 4/5] iseries: convert to proc_fops
From: Alexey Dobriyan adobri...@gmail.com Signed-off-by: Alexey Dobriyan adobri...@gmail.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Cc: Michael Ellerman mich...@ellerman.id.au Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/platforms/iseries/mf.c | 147 ++ 1 file changed, 83 insertions(+), 64 deletions(-) diff -puN arch/powerpc/platforms/iseries/mf.c~iseries-convert-to-proc_fops arch/powerpc/platforms/iseries/mf.c --- a/arch/powerpc/platforms/iseries/mf.c~iseries-convert-to-proc_fops +++ a/arch/powerpc/platforms/iseries/mf.c @@ -855,59 +855,58 @@ static int mf_get_boot_rtc(struct rtc_ti } #ifdef CONFIG_PROC_FS - -static int proc_mf_dump_cmdline(char *page, char **start, off_t off, - int count, int *eof, void *data) +static int mf_cmdline_proc_show(struct seq_file *m, void *v) { - int len; - char *p; + char *page, *p; struct vsp_cmd_data vsp_cmd; int rc; dma_addr_t dma_addr; /* The HV appears to return no more than 256 bytes of command line */ - if (off = 256) - return 0; - if ((off + count) 256) - count = 256 - off; + page = kmalloc(256, GFP_KERNEL); + if (!page) + return -ENOMEM; - dma_addr = iseries_hv_map(page, off + count, DMA_FROM_DEVICE); - if (dma_addr == DMA_ERROR_CODE) + dma_addr = iseries_hv_map(page, 256, DMA_FROM_DEVICE); + if (dma_addr == DMA_ERROR_CODE) { + kfree(page); return -ENOMEM; - memset(page, 0, off + count); + } + memset(page, 0, 256); memset(vsp_cmd, 0, sizeof(vsp_cmd)); vsp_cmd.cmd = 33; vsp_cmd.sub_data.kern.token = dma_addr; vsp_cmd.sub_data.kern.address_type = HvLpDma_AddressType_TceIndex; - vsp_cmd.sub_data.kern.side = (u64)data; - vsp_cmd.sub_data.kern.length = off + count; + vsp_cmd.sub_data.kern.side = (u64)m-private; + vsp_cmd.sub_data.kern.length = 256; mb(); rc = signal_vsp_instruction(vsp_cmd); - iseries_hv_unmap(dma_addr, off + count, DMA_FROM_DEVICE); - if (rc) + iseries_hv_unmap(dma_addr, 256, DMA_FROM_DEVICE); + if (rc) { + kfree(page); return rc; - if (vsp_cmd.result_code != 0) + } + if (vsp_cmd.result_code != 0) { + kfree(page); return -ENOMEM; + } p = page; - len = 0; - while (len (off + count)) { - if ((*p == '\0') || (*p == '\n')) { - if (*p == '\0') - *p = '\n'; - p++; - len++; - *eof = 1; + while (p - page 256) { + if (*p == '\0' || *p == '\n') { + *p = '\n'; break; } p++; - len++; - } - if (len off) { - *eof = 1; - len = 0; } - return len; + seq_write(m, page, p - page); + kfree(page); + return 0; +} + +static int mf_cmdline_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, mf_cmdline_proc_show, PDE(inode)-data); } #if 0 @@ -962,10 +961,8 @@ static int proc_mf_dump_vmlinux(char *pa } #endif -static int proc_mf_dump_side(char *page, char **start, off_t off, - int count, int *eof, void *data) +static int mf_side_proc_show(struct seq_file *m, void *v) { - int len; char mf_current_side = ' '; struct vsp_cmd_data vsp_cmd; @@ -989,21 +986,17 @@ static int proc_mf_dump_side(char *page, } } - len = sprintf(page, %c\n, mf_current_side); + seq_printf(m, %c\n, mf_current_side); + return 0; +} - if (len = (off + count)) - *eof = 1; - *start = page + off; - len -= off; - if (len count) - len = count; - if (len 0) - len = 0; - return len; +static int mf_side_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, mf_side_proc_show, NULL); } -static int proc_mf_change_side(struct file *file, const char __user *buffer, - unsigned long count, void *data) +static ssize_t mf_side_proc_write(struct file *file, const char __user *buffer, + size_t count, loff_t *pos) { char side; u64 newSide; @@ -1041,6 +1034,15 @@ static int proc_mf_change_side(struct fi return count; } +static const struct file_operations mf_side_proc_fops = { + .owner = THIS_MODULE, + .open = mf_side_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release= single_release, + .write = mf_side_proc_write, +}; + #if 0
[patch 5/5] powerpc/85xx: wrong variable returned on error
From: Roel Kluin roel.kl...@gmail.com The wrong variable was returned in the case of an error. Signed-off-by: Roel Kluin roel.kl...@gmail.com Cc: Kumar Gala ga...@kernel.crashing.org Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/platforms/85xx/mpc85xx_mds.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN arch/powerpc/platforms/85xx/mpc85xx_mds.c~powerpc-85xx-wrong-variable-returned-on-error arch/powerpc/platforms/85xx/mpc85xx_mds.c --- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c~powerpc-85xx-wrong-variable-returned-on-error +++ a/arch/powerpc/platforms/85xx/mpc85xx_mds.c @@ -86,7 +86,7 @@ static int mpc8568_fixup_125_clock(struc scr = phy_read(phydev, MV88E_SCR); if (scr 0) - return err; + return scr; err = phy_write(phydev, MV88E_SCR, scr | 0x0008); _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 3/5] powerpc: make the CMM memory hotplug aware
From: Robert Jennings r...@linux.vnet.ibm.com The Collaborative Memory Manager (CMM) module allocates individual pages over time that are not migratable. On a long running system this can severely impact the ability to find enough pages to support a hotplug memory remove operation. This patch adds a memory isolation notifier and a memory hotplug notifier. The memory isolation notifier will return the number of pages found in the range specified. This is used to determine if all of the used pages in a pageblock are owned by the balloon (or other entities in the notifier chain). The hotplug notifier will free pages in the range which is to be removed. The priority of this hotplug notifier is low so that it will be called near last, this helps avoids removing loaned pages in operations that fail due to other handlers. CMM activity will be halted when hotplug remove operations are active and resume activity after a delay period to allow the hypervisor time to adjust. Signed-off-by: Robert Jennings r...@linux.vnet.ibm.com Cc: Mel Gorman m...@csn.ul.ie Cc: Ingo Molnar mi...@elte.hu Cc: Brian King brk...@linux.vnet.ibm.com Cc: Paul Mackerras pau...@samba.org Cc: Martin Schwidefsky schwidef...@de.ibm.com Cc: Gerald Schaefer gera...@linux.vnet.ibm.com Cc: KAMEZAWA Hiroyuki kamezawa.hir...@jp.fujitsu.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/platforms/pseries/cmm.c | 254 - 1 file changed, 248 insertions(+), 6 deletions(-) diff -puN arch/powerpc/platforms/pseries/cmm.c~powerpc-make-the-cmm-memory-hotplug-aware arch/powerpc/platforms/pseries/cmm.c --- a/arch/powerpc/platforms/pseries/cmm.c~powerpc-make-the-cmm-memory-hotplug-aware +++ a/arch/powerpc/platforms/pseries/cmm.c @@ -38,19 +38,28 @@ #include asm/mmu.h #include asm/pgalloc.h #include asm/uaccess.h +#include linux/memory.h #include plpar_wrappers.h #define CMM_DRIVER_VERSION 1.0.0 #define CMM_DEFAULT_DELAY 1 +#define CMM_HOTPLUG_DELAY 5 #define CMM_DEBUG 0 #define CMM_DISABLE0 #define CMM_OOM_KB 1024 #define CMM_MIN_MEM_MB 256 #define KB2PAGES(_p) ((_p)(PAGE_SHIFT-10)) #define PAGES2KB(_p) ((_p)(PAGE_SHIFT-10)) +/* + * The priority level tries to ensure that this notifier is called as + * late as possible to reduce thrashing in the shared memory pool. + */ +#define CMM_MEM_HOTPLUG_PRI1 +#define CMM_MEM_ISOLATE_PRI15 static unsigned int delay = CMM_DEFAULT_DELAY; +static unsigned int hotplug_delay = CMM_HOTPLUG_DELAY; static unsigned int oom_kb = CMM_OOM_KB; static unsigned int cmm_debug = CMM_DEBUG; static unsigned int cmm_disabled = CMM_DISABLE; @@ -65,6 +74,10 @@ MODULE_VERSION(CMM_DRIVER_VERSION); module_param_named(delay, delay, uint, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(delay, Delay (in seconds) between polls to query hypervisor paging requests. [Default= __stringify(CMM_DEFAULT_DELAY) ]); +module_param_named(hotplug_delay, hotplug_delay, uint, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(delay, Delay (in seconds) after memory hotplug remove +before loaning resumes. +[Default= __stringify(CMM_HOTPLUG_DELAY) ]); module_param_named(oom_kb, oom_kb, uint, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(oom_kb, Amount of memory in kb to free on OOM. [Default= __stringify(CMM_OOM_KB) ]); @@ -92,6 +105,9 @@ static unsigned long oom_freed_pages; static struct cmm_page_array *cmm_page_list; static DEFINE_SPINLOCK(cmm_lock); +static DEFINE_MUTEX(hotplug_mutex); +static int hotplug_occurred; /* protected by the hotplug mutex */ + static struct task_struct *cmm_thread_ptr; /** @@ -110,6 +126,17 @@ static long cmm_alloc_pages(long nr) cmm_dbg(Begin request for %ld pages\n, nr); while (nr) { + /* Exit if a hotplug operation is in progress or occurred */ + if (mutex_trylock(hotplug_mutex)) { + if (hotplug_occurred) { + mutex_unlock(hotplug_mutex); + break; + } + mutex_unlock(hotplug_mutex); + } else { + break; + } + addr = __get_free_page(GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY | __GFP_NOMEMALLOC); if (!addr) @@ -119,8 +146,9 @@ static long cmm_alloc_pages(long nr) if (!pa || pa-index = CMM_NR_PAGES) { /* Need a new page for the page list. */ spin_unlock(cmm_lock); - npa = (struct cmm_page_array *)__get_free_page(GFP_NOIO | __GFP_NOWARN | - __GFP_NORETRY | __GFP_NOMEMALLOC); + npa = (struct
[patch 2/5] mm: add notifier in pageblock isolation for balloon drivers
From: Robert Jennings r...@linux.vnet.ibm.com Memory balloon drivers can allocate a large amount of memory which is not movable but could be freed to accomodate memory hotplug remove. Prior to calling the memory hotplug notifier chain the memory in the pageblock is isolated. Currently, if the migrate type is not MIGRATE_MOVABLE the isolation will not proceed, causing the memory removal for that page range to fail. Rather than failing pageblock isolation if the migrateteype is not MIGRATE_MOVABLE, this patch checks if all of the pages in the pageblock, and not on the LRU, are owned by a registered balloon driver (or other entity) using a notifier chain. If all of the non-movable pages are owned by a balloon, they can be freed later through the memory notifier chain and the range can still be isolated in set_migratetype_isolate(). Signed-off-by: Robert Jennings r...@linux.vnet.ibm.com Cc: Mel Gorman m...@csn.ul.ie Cc: Ingo Molnar mi...@elte.hu Cc: Brian King brk...@linux.vnet.ibm.com Cc: Paul Mackerras pau...@samba.org Cc: Martin Schwidefsky schwidef...@de.ibm.com Cc: Gerald Schaefer gera...@linux.vnet.ibm.com Cc: KAMEZAWA Hiroyuki kamezawa.hir...@jp.fujitsu.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- drivers/base/memory.c | 19 + include/linux/memory.h | 27 ++ mm/page_alloc.c| 57 ++- 3 files changed, 96 insertions(+), 7 deletions(-) diff -puN drivers/base/memory.c~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers drivers/base/memory.c --- a/drivers/base/memory.c~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers +++ a/drivers/base/memory.c @@ -63,6 +63,20 @@ void unregister_memory_notifier(struct n } EXPORT_SYMBOL(unregister_memory_notifier); +static ATOMIC_NOTIFIER_HEAD(memory_isolate_chain); + +int register_memory_isolate_notifier(struct notifier_block *nb) +{ + return atomic_notifier_chain_register(memory_isolate_chain, nb); +} +EXPORT_SYMBOL(register_memory_isolate_notifier); + +void unregister_memory_isolate_notifier(struct notifier_block *nb) +{ + atomic_notifier_chain_unregister(memory_isolate_chain, nb); +} +EXPORT_SYMBOL(unregister_memory_isolate_notifier); + /* * register_memory - Setup a sysfs device for a memory block */ @@ -157,6 +171,11 @@ int memory_notify(unsigned long val, voi return blocking_notifier_call_chain(memory_chain, val, v); } +int memory_isolate_notify(unsigned long val, void *v) +{ + return atomic_notifier_call_chain(memory_isolate_chain, val, v); +} + /* * MEMORY_HOTPLUG depends on SPARSEMEM in mm/Kconfig, so it is * OK to have direct references to sparsemem variables in here. diff -puN include/linux/memory.h~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers include/linux/memory.h --- a/include/linux/memory.h~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers +++ a/include/linux/memory.h @@ -50,6 +50,19 @@ struct memory_notify { int status_change_nid; }; +/* + * During pageblock isolation, count the number of pages within the + * range [start_pfn, start_pfn + nr_pages) which are owned by code + * in the notifier chain. + */ +#define MEM_ISOLATE_COUNT (10) + +struct memory_isolate_notify { + unsigned long start_pfn;/* Start of range to check */ + unsigned int nr_pages; /* # pages in range to check */ + unsigned int pages_found; /* # pages owned found by callbacks */ +}; + struct notifier_block; struct mem_section; @@ -76,14 +89,28 @@ static inline int memory_notify(unsigned { return 0; } +static inline int register_memory_isolate_notifier(struct notifier_block *nb) +{ + return 0; +} +static inline void unregister_memory_isolate_notifier(struct notifier_block *nb) +{ +} +static inline int memory_isolate_notify(unsigned long val, void *v) +{ + return 0; +} #else extern int register_memory_notifier(struct notifier_block *nb); extern void unregister_memory_notifier(struct notifier_block *nb); +extern int register_memory_isolate_notifier(struct notifier_block *nb); +extern void unregister_memory_isolate_notifier(struct notifier_block *nb); extern int register_new_memory(int, struct mem_section *); extern int unregister_memory_section(struct mem_section *); extern int memory_dev_init(void); extern int remove_memory_block(unsigned long, struct mem_section *, int); extern int memory_notify(unsigned long val, void *v); +extern int memory_isolate_notify(unsigned long val, void *v); extern struct memory_block *find_memory_block(struct mem_section *); #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTIONPAGE_SHIFT) enum mem_add_context { BOOT, HOTPLUG }; diff -puN mm/page_alloc.c~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers mm/page_alloc.c --- a/mm/page_alloc.c~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers +++ a/mm/page_alloc.c @@
[patch 3/3] powerpc: make the CMM memory hotplug aware
From: Robert Jennings r...@linux.vnet.ibm.com The Collaborative Memory Manager (CMM) module allocates individual pages over time that are not migratable. On a long running system this can severely impact the ability to find enough pages to support a hotplug memory remove operation. This patch adds a memory isolation notifier and a memory hotplug notifier. The memory isolation notifier will return the number of pages found in the range specified. This is used to determine if all of the used pages in a pageblock are owned by the balloon (or other entities in the notifier chain). The hotplug notifier will free pages in the range which is to be removed. The priority of this hotplug notifier is low so that it will be called near last, this helps avoids removing loaned pages in operations that fail due to other handlers. CMM activity will be halted when hotplug remove operations are active and resume activity after a delay period to allow the hypervisor time to adjust. Signed-off-by: Robert Jennings r...@linux.vnet.ibm.com Cc: Mel Gorman m...@csn.ul.ie Cc: Ingo Molnar mi...@elte.hu Cc: Brian King brk...@linux.vnet.ibm.com Cc: Paul Mackerras pau...@samba.org Cc: Martin Schwidefsky schwidef...@de.ibm.com Cc: Gerald Schaefer gera...@linux.vnet.ibm.com Cc: KAMEZAWA Hiroyuki kamezawa.hir...@jp.fujitsu.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/platforms/pseries/cmm.c | 221 - 1 file changed, 215 insertions(+), 6 deletions(-) diff -puN arch/powerpc/platforms/pseries/cmm.c~powerpc-make-the-cmm-memory-hotplug-aware arch/powerpc/platforms/pseries/cmm.c --- a/arch/powerpc/platforms/pseries/cmm.c~powerpc-make-the-cmm-memory-hotplug-aware +++ a/arch/powerpc/platforms/pseries/cmm.c @@ -38,19 +38,28 @@ #include asm/mmu.h #include asm/pgalloc.h #include asm/uaccess.h +#include linux/memory.h #include plpar_wrappers.h #define CMM_DRIVER_VERSION 1.0.0 #define CMM_DEFAULT_DELAY 1 +#define CMM_HOTPLUG_DELAY 5 #define CMM_DEBUG 0 #define CMM_DISABLE0 #define CMM_OOM_KB 1024 #define CMM_MIN_MEM_MB 256 #define KB2PAGES(_p) ((_p)(PAGE_SHIFT-10)) #define PAGES2KB(_p) ((_p)(PAGE_SHIFT-10)) +/* + * The priority level tries to ensure that this notifier is called as + * late as possible to reduce thrashing in the shared memory pool. + */ +#define CMM_MEM_HOTPLUG_PRI1 +#define CMM_MEM_ISOLATE_PRI15 static unsigned int delay = CMM_DEFAULT_DELAY; +static unsigned int hotplug_delay = CMM_HOTPLUG_DELAY; static unsigned int oom_kb = CMM_OOM_KB; static unsigned int cmm_debug = CMM_DEBUG; static unsigned int cmm_disabled = CMM_DISABLE; @@ -65,6 +74,10 @@ MODULE_VERSION(CMM_DRIVER_VERSION); module_param_named(delay, delay, uint, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(delay, Delay (in seconds) between polls to query hypervisor paging requests. [Default= __stringify(CMM_DEFAULT_DELAY) ]); +module_param_named(hotplug_delay, hotplug_delay, uint, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(delay, Delay (in seconds) after memory hotplug remove +before loaning resumes. +[Default= __stringify(CMM_HOTPLUG_DELAY) ]); module_param_named(oom_kb, oom_kb, uint, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(oom_kb, Amount of memory in kb to free on OOM. [Default= __stringify(CMM_OOM_KB) ]); @@ -92,6 +105,9 @@ static unsigned long oom_freed_pages; static struct cmm_page_array *cmm_page_list; static DEFINE_SPINLOCK(cmm_lock); +static DEFINE_MUTEX(hotplug_mutex); +static int hotplug_occurred; /* protected by the hotplug mutex */ + static struct task_struct *cmm_thread_ptr; /** @@ -110,6 +126,17 @@ static long cmm_alloc_pages(long nr) cmm_dbg(Begin request for %ld pages\n, nr); while (nr) { + /* Exit if a hotplug operation is in progress or occurred */ + if (mutex_trylock(hotplug_mutex)) { + if (hotplug_occurred) { + mutex_unlock(hotplug_mutex); + break; + } + mutex_unlock(hotplug_mutex); + } else { + break; + } + addr = __get_free_page(GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY | __GFP_NOMEMALLOC); if (!addr) @@ -119,8 +146,10 @@ static long cmm_alloc_pages(long nr) if (!pa || pa-index = CMM_NR_PAGES) { /* Need a new page for the page list. */ spin_unlock(cmm_lock); - npa = (struct cmm_page_array *)__get_free_page(GFP_NOIO | __GFP_NOWARN | - __GFP_NORETRY | __GFP_NOMEMALLOC); + npa = (struct
[patch 1/3] powerpc: Sky CPU: redundant or incorrect tests on unsigned
From: Roel Kluin roel.kl...@gmail.com count is unsigned and cannot be less than 0. Signed-off-by: Roel Kluin roel.kl...@gmail.com Acked-by: Cyrill Gorcunov gorcu...@gmail.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Cc: Kumar Gala ga...@gate.crashing.org Cc: Brian Waite wa...@skycomputers.com Signed-off-by: Andrew Morton a...@linux-foundation.org --- drivers/misc/hdpuftrs/hdpu_cpustate.c |5 - 1 file changed, 5 deletions(-) diff -puN drivers/misc/hdpuftrs/hdpu_cpustate.c~powerpc-sky-cpu-redundant-or-incorrect-tests-on-unsigned drivers/misc/hdpuftrs/hdpu_cpustate.c --- a/drivers/misc/hdpuftrs/hdpu_cpustate.c~powerpc-sky-cpu-redundant-or-incorrect-tests-on-unsigned +++ a/drivers/misc/hdpuftrs/hdpu_cpustate.c @@ -121,8 +121,6 @@ static ssize_t cpustate_read(struct file { unsigned char data; - if (count 0) - return -EFAULT; if (count == 0) return 0; @@ -137,9 +135,6 @@ static ssize_t cpustate_write(struct fil { unsigned char data; - if (count 0) - return -EFAULT; - if (count == 0) return 0; _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 2/3] mm: add notifier in pageblock isolation for balloon drivers
From: Robert Jennings r...@linux.vnet.ibm.com Memory balloon drivers can allocate a large amount of memory which is not movable but could be freed to accomodate memory hotplug remove. Prior to calling the memory hotplug notifier chain the memory in the pageblock is isolated. Currently, if the migrate type is not MIGRATE_MOVABLE the isolation will not proceed, causing the memory removal for that page range to fail. Rather than failing pageblock isolation if the migrateteype is not MIGRATE_MOVABLE, this patch checks if all of the pages in the pageblock, and not on the LRU, are owned by a registered balloon driver (or other entity) using a notifier chain. If all of the non-movable pages are owned by a balloon, they can be freed later through the memory notifier chain and the range can still be isolated in set_migratetype_isolate(). Signed-off-by: Robert Jennings r...@linux.vnet.ibm.com Cc: Mel Gorman m...@csn.ul.ie Cc: Ingo Molnar mi...@elte.hu Cc: Brian King brk...@linux.vnet.ibm.com Cc: Paul Mackerras pau...@samba.org Cc: Martin Schwidefsky schwidef...@de.ibm.com Cc: Gerald Schaefer gera...@linux.vnet.ibm.com Cc: KAMEZAWA Hiroyuki kamezawa.hir...@jp.fujitsu.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- drivers/base/memory.c | 19 + include/linux/memory.h | 27 ++ mm/page_alloc.c| 57 ++- 3 files changed, 96 insertions(+), 7 deletions(-) diff -puN drivers/base/memory.c~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers drivers/base/memory.c --- a/drivers/base/memory.c~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers +++ a/drivers/base/memory.c @@ -63,6 +63,20 @@ void unregister_memory_notifier(struct n } EXPORT_SYMBOL(unregister_memory_notifier); +static ATOMIC_NOTIFIER_HEAD(memory_isolate_chain); + +int register_memory_isolate_notifier(struct notifier_block *nb) +{ + return atomic_notifier_chain_register(memory_isolate_chain, nb); +} +EXPORT_SYMBOL(register_memory_isolate_notifier); + +void unregister_memory_isolate_notifier(struct notifier_block *nb) +{ + atomic_notifier_chain_unregister(memory_isolate_chain, nb); +} +EXPORT_SYMBOL(unregister_memory_isolate_notifier); + /* * register_memory - Setup a sysfs device for a memory block */ @@ -157,6 +171,11 @@ int memory_notify(unsigned long val, voi return blocking_notifier_call_chain(memory_chain, val, v); } +int memory_isolate_notify(unsigned long val, void *v) +{ + return atomic_notifier_call_chain(memory_isolate_chain, val, v); +} + /* * MEMORY_HOTPLUG depends on SPARSEMEM in mm/Kconfig, so it is * OK to have direct references to sparsemem variables in here. diff -puN include/linux/memory.h~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers include/linux/memory.h --- a/include/linux/memory.h~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers +++ a/include/linux/memory.h @@ -50,6 +50,19 @@ struct memory_notify { int status_change_nid; }; +/* + * During pageblock isolation, count the number of pages within the + * range [start_pfn, start_pfn + nr_pages) which are owned by code + * in the notifier chain. + */ +#define MEM_ISOLATE_COUNT (10) + +struct memory_isolate_notify { + unsigned long start_pfn;/* Start of range to check */ + unsigned int nr_pages; /* # pages in range to check */ + unsigned int pages_found; /* # pages owned found by callbacks */ +}; + struct notifier_block; struct mem_section; @@ -76,14 +89,28 @@ static inline int memory_notify(unsigned { return 0; } +static inline int register_memory_isolate_notifier(struct notifier_block *nb) +{ + return 0; +} +static inline void unregister_memory_isolate_notifier(struct notifier_block *nb) +{ +} +static inline int memory_isolate_notify(unsigned long val, void *v) +{ + return 0; +} #else extern int register_memory_notifier(struct notifier_block *nb); extern void unregister_memory_notifier(struct notifier_block *nb); +extern int register_memory_isolate_notifier(struct notifier_block *nb); +extern void unregister_memory_isolate_notifier(struct notifier_block *nb); extern int register_new_memory(int, struct mem_section *); extern int unregister_memory_section(struct mem_section *); extern int memory_dev_init(void); extern int remove_memory_block(unsigned long, struct mem_section *, int); extern int memory_notify(unsigned long val, void *v); +extern int memory_isolate_notify(unsigned long val, void *v); extern struct memory_block *find_memory_block(struct mem_section *); #define CONFIG_MEM_BLOCK_SIZE (PAGES_PER_SECTIONPAGE_SHIFT) enum mem_add_context { BOOT, HOTPLUG }; diff -puN mm/page_alloc.c~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers mm/page_alloc.c --- a/mm/page_alloc.c~mm-add-notifier-in-pageblock-isolation-for-balloon-drivers +++ a/mm/page_alloc.c @@
[patch 2/3] powerpc/fsl-booke: read buffer overflow
From: Roel Kluin roel.kl...@gmail.com cam[tlbcam_index] is checked before tlbcam_index ARRAY_SIZE(cam) Signed-off-by: Roel Kluin roel.kl...@gmail.com Signed-off-by: Andrew Morton a...@linux-foundation.org --- arch/powerpc/mm/fsl_booke_mmu.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN arch/powerpc/mm/fsl_booke_mmu.c~powerpc-fsl-booke-read-buffer-overflow arch/powerpc/mm/fsl_booke_mmu.c --- a/arch/powerpc/mm/fsl_booke_mmu.c~powerpc-fsl-booke-read-buffer-overflow +++ a/arch/powerpc/mm/fsl_booke_mmu.c @@ -161,7 +161,7 @@ unsigned long __init mmu_mapin_ram(void) unsigned long virt = PAGE_OFFSET; phys_addr_t phys = memstart_addr; - while (cam[tlbcam_index] tlbcam_index ARRAY_SIZE(cam)) { + while (tlbcam_index ARRAY_SIZE(cam) cam[tlbcam_index]) { settlbcam(tlbcam_index, virt, phys, cam[tlbcam_index], PAGE_KERNEL_X, 0); virt += cam[tlbcam_index]; phys += cam[tlbcam_index]; _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 1/3] powerpc: Sky CPU: redundant or incorrect tests on unsigned
From: Roel Kluin roel.kl...@gmail.com count is unsigned and cannot be less than 0. Signed-off-by: Roel Kluin roel.kl...@gmail.com Cc: Cyrill Gorcunov gorcu...@gmail.com Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Cc: Kumar Gala ga...@gate.crashing.org Cc: Brian Waite wa...@skycomputers.com Signed-off-by: Andrew Morton a...@linux-foundation.org --- drivers/misc/hdpuftrs/hdpu_cpustate.c |5 - 1 file changed, 5 deletions(-) diff -puN drivers/misc/hdpuftrs/hdpu_cpustate.c~powerpc-sky-cpu-redundant-or-incorrect-tests-on-unsigned drivers/misc/hdpuftrs/hdpu_cpustate.c --- a/drivers/misc/hdpuftrs/hdpu_cpustate.c~powerpc-sky-cpu-redundant-or-incorrect-tests-on-unsigned +++ a/drivers/misc/hdpuftrs/hdpu_cpustate.c @@ -121,8 +121,6 @@ static ssize_t cpustate_read(struct file { unsigned char data; - if (count 0) - return -EFAULT; if (count == 0) return 0; @@ -137,9 +135,6 @@ static ssize_t cpustate_write(struct fil { unsigned char data; - if (count 0) - return -EFAULT; - if (count == 0) return 0; _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 3/3] powerpc: avoid calculating possibly-invalid address
From: Roel Kluin roel.kl...@gmail.com Check whether index is within bounds prior to calculating a possibly-invalid address. Signed-off-by: Roel Kluin roel.kl...@gmail.com Cc: Bernd Petrovitsch be...@firmix.at Cc: Benjamin Herrenschmidt b...@kernel.crashing.org Signed-off-by: Andrew Morton a...@linux-foundation.org --- drivers/char/hvsi.c |3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff -puN drivers/char/hvsi.c~powerpc-avoid-calculating-possibly-invalid-address drivers/char/hvsi.c --- a/drivers/char/hvsi.c~powerpc-avoid-calculating-possibly-invalid-address +++ a/drivers/char/hvsi.c @@ -1230,11 +1230,12 @@ static struct tty_driver *hvsi_console_d static int __init hvsi_console_setup(struct console *console, char *options) { - struct hvsi_struct *hp = hvsi_ports[console-index]; + struct hvsi_struct *hp; int ret; if (console-index 0 || console-index = hvsi_count) return -1; + hp = hvsi_ports[console-index]; /* give the FSP a chance to change the baud rate when we re-open */ hvsi_close_protocol(hp); _ ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[patch 1/1] arch/powerpc: eliminate NULL test and memset after alloc_bootmem
From: Julia Lawall [EMAIL PROTECTED] As noted by Akinobu Mita in patch b1fceac2b9e04d278316b2faddf276015fc06e3b, alloc_bootmem and related functions never return NULL and always return a zeroed region of memory. Thus a NULL test or memset after calls to these functions is unnecessary. This was fixed using the following semantic patch. (http://www.emn.fr/x-info/coccinelle/) // smpl @@ expression E; statement S; @@ E = \(alloc_bootmem\|alloc_bootmem_low\|alloc_bootmem_pages\|alloc_bootmem_low_pages\|alloc_bootmem_node\|alloc_bootmem_low_pages_node\|alloc_bootmem_pages_node\)(...) ... when != E ( - BUG_ON (E == NULL); | - if (E == NULL) S ) @@ expression E,E1; @@ E = \(alloc_bootmem\|alloc_bootmem_low\|alloc_bootmem_pages\|alloc_bootmem_low_pages\|alloc_bootmem_node\|alloc_bootmem_low_pages_node\|alloc_bootmem_pages_node\)(...) ... when != E - memset(E,0,E1); // /smpl Signed-off-by: Julia Lawall [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/kernel/setup_64.c |2 -- 1 file changed, 2 deletions(-) diff -puN arch/powerpc/kernel/setup_64.c~arch-powerpc-eliminate-null-test-and-memset-after-alloc_bootmem arch/powerpc/kernel/setup_64.c --- a/arch/powerpc/kernel/setup_64.c~arch-powerpc-eliminate-null-test-and-memset-after-alloc_bootmem +++ a/arch/powerpc/kernel/setup_64.c @@ -606,8 +606,6 @@ void __init setup_per_cpu_areas(void) for_each_possible_cpu(i) { ptr = alloc_bootmem_pages_node(NODE_DATA(cpu_to_node(i)), size); - if (!ptr) - panic(Cannot allocate cpu data for CPU %d\n, i); paca[i].data_offset = ptr - __per_cpu_start; memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 1/1] powerpc: hugetlb pgtable cache access cleanup
From: Jon Tollefson [EMAIL PROTECTED] Cleaned up use of macro. We now reference the pgtable_cache array directly instead of using a macro. Signed-off-by: Jon Tollefson [EMAIL PROTECTED] Cc: Nick Piggin [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/mm/hugetlbpage.c | 22 +++--- 1 file changed, 11 insertions(+), 11 deletions(-) diff -puN arch/powerpc/mm/hugetlbpage.c~powerpc-hugetlb-pgtable-cache-access-cleanup arch/powerpc/mm/hugetlbpage.c --- a/arch/powerpc/mm/hugetlbpage.c~powerpc-hugetlb-pgtable-cache-access-cleanup +++ a/arch/powerpc/mm/hugetlbpage.c @@ -53,8 +53,7 @@ unsigned int mmu_huge_psizes[MMU_PAGE_CO /* Subtract one from array size because we don't need a cache for 4K since * is not a huge page size */ -#define huge_pgtable_cache(psize) (pgtable_cache[HUGEPTE_CACHE_NUM \ - + psize-1]) +#define HUGE_PGTABLE_INDEX(psize) (HUGEPTE_CACHE_NUM + psize - 1) #define HUGEPTE_CACHE_NAME(psize) (huge_pgtable_cache_name[psize]) static const char *huge_pgtable_cache_name[MMU_PAGE_COUNT] = { @@ -113,7 +112,7 @@ static inline pte_t *hugepte_offset(huge static int __hugepte_alloc(struct mm_struct *mm, hugepd_t *hpdp, unsigned long address, unsigned int psize) { - pte_t *new = kmem_cache_zalloc(huge_pgtable_cache(psize), + pte_t *new = kmem_cache_zalloc(pgtable_cache[HUGE_PGTABLE_INDEX(psize)], GFP_KERNEL|__GFP_REPEAT); if (! new) @@ -121,7 +120,7 @@ static int __hugepte_alloc(struct mm_str spin_lock(mm-page_table_lock); if (!hugepd_none(*hpdp)) - kmem_cache_free(huge_pgtable_cache(psize), new); + kmem_cache_free(pgtable_cache[HUGE_PGTABLE_INDEX(psize)], new); else hpdp-pd = (unsigned long)new | HUGEPD_OK; spin_unlock(mm-page_table_lock); @@ -760,13 +759,14 @@ static int __init hugetlbpage_init(void) for (psize = 0; psize MMU_PAGE_COUNT; ++psize) { if (mmu_huge_psizes[psize]) { - huge_pgtable_cache(psize) = kmem_cache_create( - HUGEPTE_CACHE_NAME(psize), - HUGEPTE_TABLE_SIZE(psize), - HUGEPTE_TABLE_SIZE(psize), - 0, - NULL); - if (!huge_pgtable_cache(psize)) + pgtable_cache[HUGE_PGTABLE_INDEX(psize)] = + kmem_cache_create( + HUGEPTE_CACHE_NAME(psize), + HUGEPTE_TABLE_SIZE(psize), + HUGEPTE_TABLE_SIZE(psize), + 0, + NULL); + if (!pgtable_cache[HUGE_PGTABLE_INDEX(psize)]) panic(hugetlbpage_init(): could not create %s\ \n, HUGEPTE_CACHE_NAME(psize)); } _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 1/1] powerpc: convert CONFIG_PPC_MERGE to CONFIG_PPC for legacy io checks
From: Kumar Gala [EMAIL PROTECTED] Now that arch/ppc is dead CONFIG_PPC_MERGE is always defined for all powerpc platforms and we want to get rid of CONFIG_PPC_MERGE use CONFIG_PPC instead. Signed-off-by: Kumar Gala [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- drivers/block/floppy.c |2 +- drivers/char/ipmi/ipmi_si_intf.c |2 +- drivers/i2c/busses/i2c-pca-isa.c |2 +- drivers/input/serio/i8042-io.h |2 +- drivers/pnp/isapnp/core.c|2 +- drivers/pnp/pnpbios/core.c |4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff -puN drivers/block/floppy.c~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks drivers/block/floppy.c --- a/drivers/block/floppy.c~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks +++ a/drivers/block/floppy.c @@ -4165,7 +4165,7 @@ static int __init floppy_init(void) int i, unit, drive; int err, dr; -#if defined(CONFIG_PPC_MERGE) +#if defined(CONFIG_PPC) if (check_legacy_ioport(FDC1)) return -ENODEV; #endif diff -puN drivers/char/ipmi/ipmi_si_intf.c~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks drivers/char/ipmi/ipmi_si_intf.c --- a/drivers/char/ipmi/ipmi_si_intf.c~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks +++ a/drivers/char/ipmi/ipmi_si_intf.c @@ -2695,7 +2695,7 @@ static __devinit void default_find_bmc(v for (i = 0; ; i++) { if (!ipmi_defaults[i].port) break; -#ifdef CONFIG_PPC_MERGE +#ifdef CONFIG_PPC if (check_legacy_ioport(ipmi_defaults[i].port)) continue; #endif diff -puN drivers/i2c/busses/i2c-pca-isa.c~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks drivers/i2c/busses/i2c-pca-isa.c --- a/drivers/i2c/busses/i2c-pca-isa.c~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks +++ a/drivers/i2c/busses/i2c-pca-isa.c @@ -126,7 +126,7 @@ static int __devinit pca_isa_probe(struc dev_info(dev, i/o base %#08lx. irq %d\n, base, irq); -#ifdef CONFIG_PPC_MERGE +#ifdef CONFIG_PPC if (check_legacy_ioport(base)) { dev_err(dev, I/O address %#08lx is not available\n, base); goto out; diff -puN drivers/input/serio/i8042-io.h~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks drivers/input/serio/i8042-io.h --- a/drivers/input/serio/i8042-io.h~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks +++ a/drivers/input/serio/i8042-io.h @@ -67,7 +67,7 @@ static inline int i8042_platform_init(vo * On some platforms touching the i8042 data register region can do really * bad things. Because of this the region is always reserved on such boxes. */ -#if defined(CONFIG_PPC_MERGE) +#if defined(CONFIG_PPC) if (check_legacy_ioport(I8042_DATA_REG)) return -ENODEV; #endif diff -puN drivers/pnp/isapnp/core.c~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks drivers/pnp/isapnp/core.c --- a/drivers/pnp/isapnp/core.c~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks +++ a/drivers/pnp/isapnp/core.c @@ -1012,7 +1012,7 @@ static int __init isapnp_init(void) printk(KERN_INFO isapnp: ISA Plug Play support disabled\n); return 0; } -#ifdef CONFIG_PPC_MERGE +#ifdef CONFIG_PPC if (check_legacy_ioport(_PIDXR) || check_legacy_ioport(_PNPWRP)) return -EINVAL; #endif diff -puN drivers/pnp/pnpbios/core.c~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks drivers/pnp/pnpbios/core.c --- a/drivers/pnp/pnpbios/core.c~powerpc-convert-config_ppc_merge-to-config_ppc-for-legacy-io-checks +++ a/drivers/pnp/pnpbios/core.c @@ -519,7 +519,7 @@ static int __init pnpbios_init(void) { int ret; -#if defined(CONFIG_PPC_MERGE) +#if defined(CONFIG_PPC) if (check_legacy_ioport(PNPBIOS_BASE)) return -ENODEV; #endif @@ -577,7 +577,7 @@ static int __init pnpbios_thread_init(vo { struct task_struct *task; -#if defined(CONFIG_PPC_MERGE) +#if defined(CONFIG_PPC) if (check_legacy_ioport(PNPBIOS_BASE)) return 0; #endif _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 2/2] powerpc: replace __FUNCTION__ with __func__
From: Harvey Harrison [EMAIL PROTECTED] __FUNCTION__ is gcc-specific, use __func__ [EMAIL PROTECTED]: coding-style fixes] Signed-off-by: Harvey Harrison [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/kernel/lparcfg.c|8 arch/powerpc/platforms/pseries/cmm.c |4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff -puN arch/powerpc/kernel/lparcfg.c~powerpc-replace-__function__-with-__func__ arch/powerpc/kernel/lparcfg.c --- a/arch/powerpc/kernel/lparcfg.c~powerpc-replace-__function__-with-__func__ +++ a/arch/powerpc/kernel/lparcfg.c @@ -505,10 +505,10 @@ static ssize_t update_ppp(u64 *entitleme return -EINVAL; pr_debug(%s: current_entitled = %lu, current_weight = %u\n, -__FUNCTION__, ppp_data.entitlement, ppp_data.weight); +__func__, ppp_data.entitlement, ppp_data.weight); pr_debug(%s: new_entitled = %lu, new_weight = %u\n, -__FUNCTION__, new_entitled, new_weight); +__func__, new_entitled, new_weight); retval = plpar_hcall_norets(H_SET_PPP, new_entitled, new_weight); return retval; @@ -551,10 +551,10 @@ static ssize_t update_mpp(u64 *entitleme return -EINVAL; pr_debug(%s: current_entitled = %lu, current_weight = %u\n, -__FUNCTION__, mpp_data.entitled_mem, mpp_data.mem_weight); +__func__, mpp_data.entitled_mem, mpp_data.mem_weight); pr_debug(%s: new_entitled = %lu, new_weight = %u\n, -__FUNCTION__, new_entitled, new_weight); +__func__, new_entitled, new_weight); rc = plpar_hcall_norets(H_SET_MPP, new_entitled, new_weight); return rc; diff -puN arch/powerpc/platforms/pseries/cmm.c~powerpc-replace-__function__-with-__func__ arch/powerpc/platforms/pseries/cmm.c --- a/arch/powerpc/platforms/pseries/cmm.c~powerpc-replace-__function__-with-__func__ +++ a/arch/powerpc/platforms/pseries/cmm.c @@ -121,7 +121,7 @@ static long cmm_alloc_pages(long nr) npa = (struct cmm_page_array *)__get_free_page(GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY | __GFP_NOMEMALLOC); if (!npa) { - pr_info(%s: Can not allocate new page list\n, __FUNCTION__); + pr_info(%s: Can not allocate new page list\n, __func__); free_page(addr); break; } @@ -138,7 +138,7 @@ static long cmm_alloc_pages(long nr) } if ((rc = plpar_page_set_loaned(__pa(addr { - pr_err(%s: Can not set page to loaned. rc=%ld\n, __FUNCTION__, rc); + pr_err(%s: Can not set page to loaned. rc=%ld\n, __func__, rc); spin_unlock(cmm_lock); free_page(addr); break; _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 1/2] ppc: use the common ascii hex helpers
From: Harvey Harrison [EMAIL PROTECTED] [EMAIL PROTECTED]: exclude prom_init.c] Signed-off-by: Harvey Harrison [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/kernel/btext.c | 34 -- powerpc/kernel/prom_init.c |0 2 files changed, 16 insertions(+), 18 deletions(-) diff -puN arch/powerpc/kernel/btext.c~ppc-use-the-common-ascii-hex-helpers arch/powerpc/kernel/btext.c --- a/arch/powerpc/kernel/btext.c~ppc-use-the-common-ascii-hex-helpers +++ a/arch/powerpc/kernel/btext.c @@ -442,28 +442,26 @@ void btext_drawtext(const char *c, unsig void btext_drawhex(unsigned long v) { - char *hex_table = 0123456789abcdef; - if (!boot_text_mapped) return; #ifdef CONFIG_PPC64 - btext_drawchar(hex_table[(v 60) 0x000FUL]); - btext_drawchar(hex_table[(v 56) 0x000FUL]); - btext_drawchar(hex_table[(v 52) 0x000FUL]); - btext_drawchar(hex_table[(v 48) 0x000FUL]); - btext_drawchar(hex_table[(v 44) 0x000FUL]); - btext_drawchar(hex_table[(v 40) 0x000FUL]); - btext_drawchar(hex_table[(v 36) 0x000FUL]); - btext_drawchar(hex_table[(v 32) 0x000FUL]); + btext_drawchar(hex_asc_hi(v 56)); + btext_drawchar(hex_asc_lo(v 56)); + btext_drawchar(hex_asc_hi(v 48)); + btext_drawchar(hex_asc_lo(v 48)); + btext_drawchar(hex_asc_hi(v 40)); + btext_drawchar(hex_asc_lo(v 40)); + btext_drawchar(hex_asc_hi(v 32)); + btext_drawchar(hex_asc_lo(v 32)); #endif - btext_drawchar(hex_table[(v 28) 0x000FUL]); - btext_drawchar(hex_table[(v 24) 0x000FUL]); - btext_drawchar(hex_table[(v 20) 0x000FUL]); - btext_drawchar(hex_table[(v 16) 0x000FUL]); - btext_drawchar(hex_table[(v 12) 0x000FUL]); - btext_drawchar(hex_table[(v 8) 0x000FUL]); - btext_drawchar(hex_table[(v 4) 0x000FUL]); - btext_drawchar(hex_table[(v 0) 0x000FUL]); + btext_drawchar(hex_asc_hi(v 24)); + btext_drawchar(hex_asc_lo(v 24)); + btext_drawchar(hex_asc_hi(v 16)); + btext_drawchar(hex_asc_lo(v 16)); + btext_drawchar(hex_asc_hi(v 8)); + btext_drawchar(hex_asc_lo(v 8)); + btext_drawchar(hex_asc_hi(v)); + btext_drawchar(hex_asc_lo(v)); btext_drawchar(' '); } diff -puN arch/powerpc/kernel/prom_init.c~ppc-use-the-common-ascii-hex-helpers arch/powerpc/kernel/prom_init.c _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 2/5] spufs: convert nopfn to fault
From: Nick Piggin [EMAIL PROTECTED] spufs: convert nopfn to fault Signed-off-by: Nick Piggin [EMAIL PROTECTED] Acked-by: Jeremy Kerr [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/platforms/cell/spufs/file.c | 98 - arch/powerpc/platforms/cell/spufs/sputrace.c |8 - 2 files changed, 54 insertions(+), 52 deletions(-) diff -puN arch/powerpc/platforms/cell/spufs/file.c~spufs-convert-nopfn-to-fault arch/powerpc/platforms/cell/spufs/file.c --- a/arch/powerpc/platforms/cell/spufs/file.c~spufs-convert-nopfn-to-fault +++ a/arch/powerpc/platforms/cell/spufs/file.c @@ -238,11 +238,13 @@ spufs_mem_write(struct file *file, const return size; } -static unsigned long spufs_mem_mmap_nopfn(struct vm_area_struct *vma, - unsigned long address) +static int +spufs_mem_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { struct spu_context *ctx = vma-vm_file-private_data; - unsigned long pfn, offset, addr0 = address; + unsigned long address = (unsigned long)vmf-virtual_address; + unsigned long pfn, offset; + #ifdef CONFIG_SPU_FS_64K_LS struct spu_state *csa = ctx-csa; int psize; @@ -260,15 +262,15 @@ static unsigned long spufs_mem_mmap_nopf } #endif /* CONFIG_SPU_FS_64K_LS */ - offset = (address - vma-vm_start) + (vma-vm_pgoff PAGE_SHIFT); + offset = vmf-pgoff PAGE_SHIFT; if (offset = LS_SIZE) - return NOPFN_SIGBUS; + return VM_FAULT_SIGBUS; - pr_debug(spufs_mem_mmap_nopfn address=0x%lx - 0x%lx, offset=0x%lx\n, -addr0, address, offset); + pr_debug(spufs_mem_mmap_fault address=0x%lx, offset=0x%lx\n, + address, offset); if (spu_acquire(ctx)) - return NOPFN_REFAULT; + return VM_FAULT_NOPAGE; if (ctx-state == SPU_STATE_SAVED) { vma-vm_page_prot = __pgprot(pgprot_val(vma-vm_page_prot) @@ -283,12 +285,12 @@ static unsigned long spufs_mem_mmap_nopf spu_release(ctx); - return NOPFN_REFAULT; + return VM_FAULT_NOPAGE; } static struct vm_operations_struct spufs_mem_mmap_vmops = { - .nopfn = spufs_mem_mmap_nopfn, + .fault = spufs_mem_mmap_fault, }; static int spufs_mem_mmap(struct file *file, struct vm_area_struct *vma) @@ -351,20 +353,19 @@ static const struct file_operations spuf #endif }; -static unsigned long spufs_ps_nopfn(struct vm_area_struct *vma, - unsigned long address, +static int spufs_ps_fault(struct vm_area_struct *vma, + struct vm_fault *vmf, unsigned long ps_offs, unsigned long ps_size) { struct spu_context *ctx = vma-vm_file-private_data; - unsigned long area, offset = address - vma-vm_start; + unsigned long area, offset = vmf-pgoff PAGE_SHIFT; int ret = 0; - spu_context_nospu_trace(spufs_ps_nopfn__enter, ctx); + spu_context_nospu_trace(spufs_ps_fault__enter, ctx); - offset += vma-vm_pgoff PAGE_SHIFT; if (offset = ps_size) - return NOPFN_SIGBUS; + return VM_FAULT_SIGBUS; /* * Because we release the mmap_sem, the context may be destroyed while @@ -378,7 +379,7 @@ static unsigned long spufs_ps_nopfn(stru * pages to hand out to the user, but we don't want to wait * with the mmap_sem held. * It is possible to drop the mmap_sem here, but then we need -* to return NOPFN_REFAULT because the mappings may have +* to return VM_FAULT_NOPAGE because the mappings may have * hanged. */ if (spu_acquire(ctx)) @@ -386,14 +387,15 @@ static unsigned long spufs_ps_nopfn(stru if (ctx-state == SPU_STATE_SAVED) { up_read(current-mm-mmap_sem); - spu_context_nospu_trace(spufs_ps_nopfn__sleep, ctx); + spu_context_nospu_trace(spufs_ps_fault__sleep, ctx); ret = spufs_wait(ctx-run_wq, ctx-state == SPU_STATE_RUNNABLE); - spu_context_trace(spufs_ps_nopfn__wake, ctx, ctx-spu); + spu_context_trace(spufs_ps_fault__wake, ctx, ctx-spu); down_read(current-mm-mmap_sem); } else { area = ctx-spu-problem_phys + ps_offs; - vm_insert_pfn(vma, address, (area + offset) PAGE_SHIFT); - spu_context_trace(spufs_ps_nopfn__insert, ctx, ctx-spu); + vm_insert_pfn(vma, (unsigned long)vmf-virtual_address, + (area + offset) PAGE_SHIFT); + spu_context_trace(spufs_ps_fault__insert, ctx, ctx-spu); } if (!ret) @@ -401,18 +403,18 @@ static unsigned
[patch 1/5] powerpc: fix for OProfile callgraph for Power 64 bit user apps
From: Carl Love [EMAIL PROTECTED] Fix the 64 bit user code backtrace which currently may hang the system. Signed-off-by: Carl Love [EMAIL PROTECTED] Cc: Maynard Johnson [EMAIL PROTECTED] On Thu, 15 May 2008 10:20:44 +1000 Michael Ellerman [EMAIL PROTECTED] wrote: __copy_from_user_inatomic() accepts any value for n, it just has a special case for 1, 2, 4 and 8 - but it should still work for other values. The old code copied 24 bytes from sp, and the new code copies 8 bytes from sp and 8 bytes from sp + 16 - so I don't see where the 48 bytes comes in to it? \ufeffAlso the comment is a little hard to parse, I think you mean Issue: the .., but I read Issue as a verb in that sentence. And Don't read more then should be than. Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/oprofile/backtrace.c | 33 ++-- 1 file changed, 27 insertions(+), 6 deletions(-) diff -puN arch/powerpc/oprofile/backtrace.c~powerpc-fix-for-oprofile-callgraph-for-power-64-bit-user-apps arch/powerpc/oprofile/backtrace.c --- a/arch/powerpc/oprofile/backtrace.c~powerpc-fix-for-oprofile-callgraph-for-power-64-bit-user-apps +++ a/arch/powerpc/oprofile/backtrace.c @@ -53,19 +53,40 @@ static unsigned int user_getsp32(unsigne #ifdef CONFIG_PPC64 static unsigned long user_getsp64(unsigned long sp, int is_first) { - unsigned long stack_frame[3]; + unsigned long stk_frm_lr; + unsigned long stk_frm_sp; + unsigned long size; + + /* Issue the __copy_from_user_inatomic() third argument currently +* only takes sizes 1, 2, 4 or 8 bytes. Don't read more then the +* first 48 bytes of the stack frame. That is all that is +* guaranteed to exist. Reading more may cause the system to hang. +* +* 64 bit stack frame layout: +* 0-7 bytes is the pointer to previous stack +* 8-15 bytes condition register save area +* 16-23 bytes link register save area +*/ + size = sizeof(unsigned long); + if (!access_ok(VERIFY_READ, (void __user *)sp, size)) + return 0; - if (!access_ok(VERIFY_READ, (void __user *)sp, sizeof(stack_frame))) + if (__copy_from_user_inatomic(stk_frm_sp, (void __user *)sp, + size)) return 0; - if (__copy_from_user_inatomic(stack_frame, (void __user *)sp, - sizeof(stack_frame))) + /* get the LR from the user stack */ + if (!access_ok(VERIFY_READ, (void __user *)(sp+16), size)) + return 0; + + if (__copy_from_user_inatomic(stk_frm_lr, (void __user *)(sp+16), + size)) return 0; if (!is_first) - oprofile_add_trace(STACK_LR64(stack_frame)); + oprofile_add_trace(stk_frm_lr); - return STACK_SP(stack_frame); + return stk_frm_sp; } #endif _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 5/5] arch/powerpc/platforms/pseries/eeh_driver.c: fix warning
From: Andrew Morton [EMAIL PROTECTED] Fix this: /usr/src/devel/arch/powerpc/platforms/pseries/eeh_driver.c: In function 'print_device_node_tree': /usr/src/devel/arch/powerpc/platforms/pseries/eeh_driver.c:55: warning: ISO C90 forbids mixed declarations and code also make that function look like it's part of Linux. I mean, wtf are you guys up to down there?? [EMAIL PROTECTED]: coding-style fixes] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/platforms/pseries/eeh_driver.c | 11 +++ 1 file changed, 7 insertions(+), 4 deletions(-) diff -puN arch/powerpc/platforms/pseries/eeh_driver.c~arch-powerpc-platforms-pseries-eeh_driverc-fix-warning arch/powerpc/platforms/pseries/eeh_driver.c --- a/arch/powerpc/platforms/pseries/eeh_driver.c~arch-powerpc-platforms-pseries-eeh_driverc-fix-warning +++ a/arch/powerpc/platforms/pseries/eeh_driver.c @@ -42,17 +42,20 @@ static inline const char * pcid_name (st } #ifdef DEBUG -static void print_device_node_tree (struct pci_dn *pdn, int dent) +static void print_device_node_tree(struct pci_dn *pdn, int dent) { int i; - if (!pdn) return; - for (i=0;ident; i++) + struct device_node *pc; + + if (!pdn) + return; + for (i = 0; i dent; i++) printk( ); printk(dn=%s mode=%x \tcfg_addr=%x pe_addr=%x \tfull=%s\n, pdn-node-name, pdn-eeh_mode, pdn-eeh_config_addr, pdn-eeh_pe_config_addr, pdn-node-full_name); dent += 3; - struct device_node *pc = pdn-node-child; + pc = pdn-node-child; while (pc) { print_device_node_tree(PCI_DN(pc), dent); pc = pc-sibling; _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 1/1] fsldma: the MPC8377MDS board device tree node for fsldma driver
From: Zhang Wei [EMAIL PROTECTED] The fsldma driver is tested on MPC8377MDS board. The patch adds fsldma driver support into MPC8377MDS device tree. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Cc: Nelson, Shannon [EMAIL PROTECTED] Cc: Dan Williams [EMAIL PROTECTED] Cc: Kumar Gala [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Cc: Scott Wood [EMAIL PROTECTED] Cc: Li Yang [EMAIL PROTECTED] On Wed, 14 May 2008 18:28:08 -0500 Scott Wood [EMAIL PROTECTED] wrote: [EMAIL PROTECTED] wrote: From: Zhang Wei [EMAIL PROTECTED] According to booting-without-of.txt, the interrupts property should be repeated in each channel. The driver also needs to be fixed to remember whether it registered a DMA-block-level interrupt handler already, and not try to register a channel interrupt. Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/boot/dts/mpc8377_mds.dts | 27 1 file changed, 27 insertions(+) diff -puN arch/powerpc/boot/dts/mpc8377_mds.dts~fsldma-the-mpc8377mds-board-device-tree-node-for-fsldma-driver arch/powerpc/boot/dts/mpc8377_mds.dts --- a/arch/powerpc/boot/dts/mpc8377_mds.dts~fsldma-the-mpc8377mds-board-device-tree-node-for-fsldma-driver +++ a/arch/powerpc/boot/dts/mpc8377_mds.dts @@ -303,6 +303,33 @@ }; }; + [EMAIL PROTECTED] { + #address-cells = 1; + #size-cells = 1; + compatible = fsl,mpc8349-dma; + reg = 0x82a8 4; + ranges = 0 0x8100 0x1a8; + interrupt-parent = ipic; + interrupts = 0x47 8; + cell-index = 0; + [EMAIL PROTECTED] { + compatible = fsl,mpc8349-dma-channel; + reg = 0 0x80; + }; + [EMAIL PROTECTED] { + compatible = fsl,mpc8349-dma-channel; + reg = 0x80 0x80; + }; + [EMAIL PROTECTED] { + compatible = fsl,mpc8349-dma-channel; + reg = 0x100 0x80; + }; + [EMAIL PROTECTED] { + compatible = fsl,mpc8349-dma-channel; + reg = 0x180 0x28; + }; + }; + /* IPIC * interrupts cell = intr #, sense * sense values match linux IORESOURCE_IRQ_* defines: _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 4/5] macintosh: media bay: semaphore to mutex
From: Daniel Walker [EMAIL PROTECTED] Signed-off-by: Daniel Walker [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- drivers/macintosh/mediabay.c | 27 ++- 1 file changed, 14 insertions(+), 13 deletions(-) diff -puN drivers/macintosh/mediabay.c~macintosh-media-bay-semaphore-to-mutex drivers/macintosh/mediabay.c --- a/drivers/macintosh/mediabay.c~macintosh-media-bay-semaphore-to-mutex +++ a/drivers/macintosh/mediabay.c @@ -21,6 +21,7 @@ #include linux/init.h #include linux/ide.h #include linux/kthread.h +#include linux/mutex.h #include asm/prom.h #include asm/pgtable.h #include asm/io.h @@ -77,7 +78,7 @@ struct media_bay_info { int index; int cached_gpio; int sleeping; - struct semaphorelock; + struct mutexlock; #ifdef CONFIG_BLK_DEV_IDE_PMAC ide_hwif_t *cd_port; void __iomem*cd_base; @@ -459,27 +460,27 @@ int media_bay_set_ide_infos(struct devic if (bay-mdev which_bay == bay-mdev-ofdev.node) { int timeout = 5000, index = hwif-index; - down(bay-lock); + mutex_lock(bay-lock); bay-cd_port= hwif; bay-cd_base= (void __iomem *) base; bay-cd_irq = irq; if ((MB_CD != bay-content_id) || bay-state != mb_up) { - up(bay-lock); + mutex_unlock(bay-lock); return 0; } printk(KERN_DEBUG Registered ide%d for media bay %d\n, index, i); do { if (MB_IDE_READY(i)) { bay-cd_index = index; - up(bay-lock); + mutex_unlock(bay-lock); return 0; } mdelay(1); } while(--timeout); printk(KERN_DEBUG Timeount waiting IDE in bay %d\n, i); - up(bay-lock); + mutex_unlock(bay-lock); return -ENODEV; } } @@ -616,10 +617,10 @@ static int media_bay_task(void *x) while (!kthread_should_stop()) { for (i = 0; i media_bay_count; ++i) { - down(media_bays[i].lock); + mutex_lock(media_bays[i].lock); if (!media_bays[i].sleeping) media_bay_step(i); - up(media_bays[i].lock); + mutex_unlock(media_bays[i].lock); } msleep_interruptible(MB_POLL_DELAY); @@ -659,7 +660,7 @@ static int __devinit media_bay_attach(st bay-index = i; bay-ops = match-data; bay-sleeping = 0; - init_MUTEX(bay-lock); + mutex_init(bay-lock); /* Init HW probing */ if (bay-ops-init) @@ -697,10 +698,10 @@ static int media_bay_suspend(struct maci if (state.event != mdev-ofdev.dev.power.power_state.event (state.event PM_EVENT_SLEEP)) { - down(bay-lock); + mutex_lock(bay-lock); bay-sleeping = 1; set_mb_power(bay, 0); - up(bay-lock); + mutex_unlock(bay-lock); msleep(MB_POLL_DELAY); mdev-ofdev.dev.power.power_state = state; } @@ -719,12 +720,12 @@ static int media_bay_resume(struct macio they seem to help the 3400 get it right. */ /* Force MB power to 0 */ - down(bay-lock); + mutex_lock(bay-lock); set_mb_power(bay, 0); msleep(MB_POWER_DELAY); if (bay-ops-content(bay) != bay-content_id) { printk(mediabay%d: content changed during sleep...\n, bay-index); - up(bay-lock); + mutex_unlock(bay-lock); return 0; } set_mb_power(bay, 1); @@ -740,7 +741,7 @@ static int media_bay_resume(struct macio } while((bay-state != mb_empty) (bay-state != mb_up)); bay-sleeping = 0; - up(bay-lock); + mutex_unlock(bay-lock); } return 0; } _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 3/5] macintosh: therm_windtunnel: semaphore to mutex
From: Daniel Walker [EMAIL PROTECTED] Signed-off-by: Daniel Walker [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- drivers/macintosh/therm_windtunnel.c | 16 1 file changed, 8 insertions(+), 8 deletions(-) diff -puN drivers/macintosh/therm_windtunnel.c~macintosh-therm_windtunnel-semaphore-to-mutex drivers/macintosh/therm_windtunnel.c --- a/drivers/macintosh/therm_windtunnel.c~macintosh-therm_windtunnel-semaphore-to-mutex +++ a/drivers/macintosh/therm_windtunnel.c @@ -62,7 +62,7 @@ static struct { volatile intrunning; struct task_struct *poll_task; - struct semaphorelock; + struct mutexlock; struct of_device*of_dev; struct i2c_client *thermostat; @@ -286,23 +286,23 @@ restore_regs( void ) static int control_loop(void *dummy) { - down(x.lock); + mutex_lock(x.lock); setup_hardware(); - up(x.lock); + mutex_unlock(x.lock); for (;;) { msleep_interruptible(8000); if (kthread_should_stop()) break; - down(x.lock); + mutex_lock(x.lock); poll_temp(); - up(x.lock); + mutex_unlock(x.lock); } - down(x.lock); + mutex_lock(x.lock); restore_regs(); - up(x.lock); + mutex_unlock(x.lock); return 0; } @@ -489,7 +489,7 @@ g4fan_init( void ) const struct apple_thermal_info *info; struct device_node *np; - init_MUTEX( x.lock ); + mutex_init(x.lock); if( !(np=of_find_node_by_name(NULL, power-mgt)) ) return -ENODEV; _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 2/4] powerpc: add i2c pins to dts and board setup
From: Jochen Friedrich [EMAIL PROTECTED] Initialize I2C pins on boards with CPM1/CPM2 controllers. Signed-off-by: Jochen Friedrich [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/boot/dts/mpc8272ads.dts | 10 ++ arch/powerpc/boot/dts/mpc866ads.dts | 10 ++ arch/powerpc/boot/dts/mpc885ads.dts | 10 ++ arch/powerpc/platforms/82xx/mpc8272_ads.c|4 arch/powerpc/platforms/8xx/mpc86xads_setup.c |4 arch/powerpc/platforms/8xx/mpc885ads_setup.c |3 +++ 6 files changed, 41 insertions(+) diff -puN arch/powerpc/boot/dts/mpc8272ads.dts~powerpc-add-i2c-pins-to-dts-and-board-setup arch/powerpc/boot/dts/mpc8272ads.dts --- a/arch/powerpc/boot/dts/mpc8272ads.dts~powerpc-add-i2c-pins-to-dts-and-board-setup +++ a/arch/powerpc/boot/dts/mpc8272ads.dts @@ -217,6 +217,16 @@ linux,network-index = 1; fsl,cpm-command = 0x16200300; }; + + [EMAIL PROTECTED] { + compatible = fsl,mpc8272-i2c, +fsl,cpm2-i2c, +fsl,cpm-i2c; + reg = 11860 20 8afc 2; + interrupts = 1 8; + interrupt-parent = PIC; + fsl,cpm-command = 2960; + }; }; PIC: [EMAIL PROTECTED] { diff -puN arch/powerpc/boot/dts/mpc866ads.dts~powerpc-add-i2c-pins-to-dts-and-board-setup arch/powerpc/boot/dts/mpc866ads.dts --- a/arch/powerpc/boot/dts/mpc866ads.dts~powerpc-add-i2c-pins-to-dts-and-board-setup +++ a/arch/powerpc/boot/dts/mpc866ads.dts @@ -171,6 +171,16 @@ fsl,cpm-command = ; linux,network-index = 1; }; + + [EMAIL PROTECTED] { + compatible = fsl,mpc866-i2c, +fsl,cpm1-i2c, +fsl,cpm-i2c; + reg = 860 20 3c80 30; + interrupts = 10; + interrupt-parent = CPM_PIC; + fsl,cpm-command = 0010; + }; }; }; diff -puN arch/powerpc/boot/dts/mpc885ads.dts~powerpc-add-i2c-pins-to-dts-and-board-setup arch/powerpc/boot/dts/mpc885ads.dts --- a/arch/powerpc/boot/dts/mpc885ads.dts~powerpc-add-i2c-pins-to-dts-and-board-setup +++ a/arch/powerpc/boot/dts/mpc885ads.dts @@ -215,6 +215,16 @@ fsl,cpm-command = 0x80; linux,network-index = 2; }; + + [EMAIL PROTECTED] { + compatible = fsl,mpc885-i2c, +fsl,cpm1-i2c, +fsl,cpm-i2c; + reg = 860 20 3c80 30; + interrupts = 10; + interrupt-parent = CPM_PIC; + fsl,cpm-command = 0010; + }; }; }; diff -puN arch/powerpc/platforms/82xx/mpc8272_ads.c~powerpc-add-i2c-pins-to-dts-and-board-setup arch/powerpc/platforms/82xx/mpc8272_ads.c --- a/arch/powerpc/platforms/82xx/mpc8272_ads.c~powerpc-add-i2c-pins-to-dts-and-board-setup +++ a/arch/powerpc/platforms/82xx/mpc8272_ads.c @@ -96,6 +96,10 @@ static struct cpm_pin mpc8272_ads_pins[] {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY}, {2, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, {2, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, + + /* I2C */ + {3, 14, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_OPENDRAIN}, + {3, 15, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_OPENDRAIN}, }; static void __init init_ioports(void) diff -puN arch/powerpc/platforms/8xx/mpc86xads_setup.c~powerpc-add-i2c-pins-to-dts-and-board-setup arch/powerpc/platforms/8xx/mpc86xads_setup.c --- a/arch/powerpc/platforms/8xx/mpc86xads_setup.c~powerpc-add-i2c-pins-to-dts-and-board-setup +++ a/arch/powerpc/platforms/8xx/mpc86xads_setup.c @@ -65,6 +65,10 @@ static struct cpm_pin mpc866ads_pins[] = {CPM_PORTD, 13, CPM_PIN_OUTPUT}, {CPM_PORTD, 14, CPM_PIN_OUTPUT}, {CPM_PORTD, 15, CPM_PIN_OUTPUT}, + + /* I2C */ + {CPM_PORTB, 26, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN}, + {CPM_PORTB, 27, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN}, }; static void __init init_ioports(void) diff -puN arch/powerpc/platforms/8xx/mpc885ads_setup.c~powerpc-add-i2c-pins-to-dts-and-board-setup arch/powerpc/platforms/8xx/mpc885ads_setup.c ---
[patch 1/4] powerpc: fix for OProfile callgraph for Power 64 bit user apps
From: Carl Love [EMAIL PROTECTED] Fix the 64 bit user code backtrace which currently may hang the system. Signed-off-by: Carl Love [EMAIL PROTECTED] Cc: Maynard Johnson [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/oprofile/backtrace.c | 33 ++-- 1 file changed, 27 insertions(+), 6 deletions(-) diff -puN arch/powerpc/oprofile/backtrace.c~powerpc-fix-for-oprofile-callgraph-for-power-64-bit-user-apps arch/powerpc/oprofile/backtrace.c --- a/arch/powerpc/oprofile/backtrace.c~powerpc-fix-for-oprofile-callgraph-for-power-64-bit-user-apps +++ a/arch/powerpc/oprofile/backtrace.c @@ -53,19 +53,40 @@ static unsigned int user_getsp32(unsigne #ifdef CONFIG_PPC64 static unsigned long user_getsp64(unsigned long sp, int is_first) { - unsigned long stack_frame[3]; + unsigned long stk_frm_lr; + unsigned long stk_frm_sp; + unsigned long size; + + /* Issue the __copy_from_user_inatomic() third argument currently +* only takes sizes 1, 2, 4 or 8 bytes. Don't read more then the +* first 48 bytes of the stack frame. That is all that is +* guaranteed to exist. Reading more may cause the system to hang. +* +* 64 bit stack frame layout: +* 0-7 bytes is the pointer to previous stack +* 8-15 bytes condition register save area +* 16-23 bytes link register save area +*/ + size = sizeof(unsigned long); + if (!access_ok(VERIFY_READ, (void __user *)sp, size)) + return 0; - if (!access_ok(VERIFY_READ, (void __user *)sp, sizeof(stack_frame))) + if (__copy_from_user_inatomic(stk_frm_sp, (void __user *)sp, + size)) return 0; - if (__copy_from_user_inatomic(stack_frame, (void __user *)sp, - sizeof(stack_frame))) + /* get the LR from the user stack */ + if (!access_ok(VERIFY_READ, (void __user *)(sp+16), size)) + return 0; + + if (__copy_from_user_inatomic(stk_frm_lr, (void __user *)(sp+16), + size)) return 0; if (!is_first) - oprofile_add_trace(STACK_LR64(stack_frame)); + oprofile_add_trace(stk_frm_lr); - return STACK_SP(stack_frame); + return stk_frm_sp; } #endif _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 4/4] spufs: convert nopfn to fault
From: Nick Piggin [EMAIL PROTECTED] spufs: convert nopfn to fault Signed-off-by: Nick Piggin [EMAIL PROTECTED] Acked-by: Jeremy Kerr [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/platforms/cell/spufs/file.c | 98 - arch/powerpc/platforms/cell/spufs/sputrace.c |8 - 2 files changed, 54 insertions(+), 52 deletions(-) diff -puN arch/powerpc/platforms/cell/spufs/file.c~spufs-convert-nopfn-to-fault arch/powerpc/platforms/cell/spufs/file.c --- a/arch/powerpc/platforms/cell/spufs/file.c~spufs-convert-nopfn-to-fault +++ a/arch/powerpc/platforms/cell/spufs/file.c @@ -237,11 +237,13 @@ spufs_mem_write(struct file *file, const return size; } -static unsigned long spufs_mem_mmap_nopfn(struct vm_area_struct *vma, - unsigned long address) +static int +spufs_mem_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { struct spu_context *ctx = vma-vm_file-private_data; - unsigned long pfn, offset, addr0 = address; + unsigned long address = (unsigned long)vmf-virtual_address; + unsigned long pfn, offset; + #ifdef CONFIG_SPU_FS_64K_LS struct spu_state *csa = ctx-csa; int psize; @@ -259,15 +261,15 @@ static unsigned long spufs_mem_mmap_nopf } #endif /* CONFIG_SPU_FS_64K_LS */ - offset = (address - vma-vm_start) + (vma-vm_pgoff PAGE_SHIFT); + offset = vmf-pgoff PAGE_SHIFT; if (offset = LS_SIZE) - return NOPFN_SIGBUS; + return VM_FAULT_SIGBUS; - pr_debug(spufs_mem_mmap_nopfn address=0x%lx - 0x%lx, offset=0x%lx\n, -addr0, address, offset); + pr_debug(spufs_mem_mmap_fault address=0x%lx, offset=0x%lx\n, + address, offset); if (spu_acquire(ctx)) - return NOPFN_REFAULT; + return VM_FAULT_NOPAGE; if (ctx-state == SPU_STATE_SAVED) { vma-vm_page_prot = __pgprot(pgprot_val(vma-vm_page_prot) @@ -282,12 +284,12 @@ static unsigned long spufs_mem_mmap_nopf spu_release(ctx); - return NOPFN_REFAULT; + return VM_FAULT_NOPAGE; } static struct vm_operations_struct spufs_mem_mmap_vmops = { - .nopfn = spufs_mem_mmap_nopfn, + .fault = spufs_mem_mmap_fault, }; static int spufs_mem_mmap(struct file *file, struct vm_area_struct *vma) @@ -350,20 +352,19 @@ static const struct file_operations spuf #endif }; -static unsigned long spufs_ps_nopfn(struct vm_area_struct *vma, - unsigned long address, +static int spufs_ps_fault(struct vm_area_struct *vma, + struct vm_fault *vmf, unsigned long ps_offs, unsigned long ps_size) { struct spu_context *ctx = vma-vm_file-private_data; - unsigned long area, offset = address - vma-vm_start; + unsigned long area, offset = vmf-pgoff PAGE_SHIFT; int ret = 0; - spu_context_nospu_trace(spufs_ps_nopfn__enter, ctx); + spu_context_nospu_trace(spufs_ps_fault__enter, ctx); - offset += vma-vm_pgoff PAGE_SHIFT; if (offset = ps_size) - return NOPFN_SIGBUS; + return VM_FAULT_SIGBUS; /* * Because we release the mmap_sem, the context may be destroyed while @@ -377,7 +378,7 @@ static unsigned long spufs_ps_nopfn(stru * pages to hand out to the user, but we don't want to wait * with the mmap_sem held. * It is possible to drop the mmap_sem here, but then we need -* to return NOPFN_REFAULT because the mappings may have +* to return VM_FAULT_NOPAGE because the mappings may have * hanged. */ if (spu_acquire(ctx)) @@ -385,14 +386,15 @@ static unsigned long spufs_ps_nopfn(stru if (ctx-state == SPU_STATE_SAVED) { up_read(current-mm-mmap_sem); - spu_context_nospu_trace(spufs_ps_nopfn__sleep, ctx); + spu_context_nospu_trace(spufs_ps_fault__sleep, ctx); ret = spufs_wait(ctx-run_wq, ctx-state == SPU_STATE_RUNNABLE); - spu_context_trace(spufs_ps_nopfn__wake, ctx, ctx-spu); + spu_context_trace(spufs_ps_fault__wake, ctx, ctx-spu); down_read(current-mm-mmap_sem); } else { area = ctx-spu-problem_phys + ps_offs; - vm_insert_pfn(vma, address, (area + offset) PAGE_SHIFT); - spu_context_trace(spufs_ps_nopfn__insert, ctx, ctx-spu); + vm_insert_pfn(vma, (unsigned long)vmf-virtual_address, + (area + offset) PAGE_SHIFT); + spu_context_trace(spufs_ps_fault__insert, ctx, ctx-spu); } if (!ret) @@ -400,18 +402,18 @@ static unsigned
[patch 3/4] macintosh: replace deprecated __initcall with device_initcall
From: Robert P. J. Day [EMAIL PROTECTED] Signed-off-by: Robert P. J. Day [EMAIL PROTECTED] Acked-by: Benjamin Herrenschmidt [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- drivers/macintosh/adb.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN drivers/macintosh/adb.c~macintosh-replace-deprecated-__initcall-with-device_initcall drivers/macintosh/adb.c --- a/drivers/macintosh/adb.c~macintosh-replace-deprecated-__initcall-with-device_initcall +++ a/drivers/macintosh/adb.c @@ -334,7 +334,7 @@ int __init adb_init(void) return 0; } -__initcall(adb_init); +device_initcall(adb_init); static int do_adb_reset_bus(void) _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 1/1] fsldma: the MPC8377MDS board device tree node for fsldma driver
From: Zhang Wei [EMAIL PROTECTED] The fsldma driver is tested on MPC8377MDS board. The patch adds fsldma driver support into MPC8377MDS device tree. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Cc: Nelson, Shannon [EMAIL PROTECTED] Cc: Dan Williams [EMAIL PROTECTED] Cc: Kumar Gala [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/boot/dts/mpc8377_mds.dts | 27 1 file changed, 27 insertions(+) diff -puN arch/powerpc/boot/dts/mpc8377_mds.dts~fsldma-the-mpc8377mds-board-device-tree-node-for-fsldma-driver arch/powerpc/boot/dts/mpc8377_mds.dts --- a/arch/powerpc/boot/dts/mpc8377_mds.dts~fsldma-the-mpc8377mds-board-device-tree-node-for-fsldma-driver +++ a/arch/powerpc/boot/dts/mpc8377_mds.dts @@ -295,6 +295,33 @@ }; }; + [EMAIL PROTECTED] { + #address-cells = 1; + #size-cells = 1; + compatible = fsl,mpc8349-dma; + reg = 0x82a8 4; + ranges = 0 0x8100 0x1a8; + interrupt-parent = ipic; + interrupts = 0x47 8; + cell-index = 0; + [EMAIL PROTECTED] { + compatible = fsl,mpc8349-dma-channel; + reg = 0 0x80; + }; + [EMAIL PROTECTED] { + compatible = fsl,mpc8349-dma-channel; + reg = 0x80 0x80; + }; + [EMAIL PROTECTED] { + compatible = fsl,mpc8349-dma-channel; + reg = 0x100 0x80; + }; + [EMAIL PROTECTED] { + compatible = fsl,mpc8349-dma-channel; + reg = 0x180 0x28; + }; + }; + /* IPIC * interrupts cell = intr #, sense * sense values match linux IORESOURCE_IRQ_* defines: _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 1/5] macintosh: therm_pm72: driver_lock semaphore to mutex
From: Daniel Walker [EMAIL PROTECTED] Signed-off-by: Daniel Walker [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- drivers/macintosh/therm_pm72.c | 31 --- 1 file changed, 16 insertions(+), 15 deletions(-) diff -puN drivers/macintosh/therm_pm72.c~macintosh-therm_pm72-driver_lock-semaphore-to-mutex drivers/macintosh/therm_pm72.c --- a/drivers/macintosh/therm_pm72.c~macintosh-therm_pm72-driver_lock-semaphore-to-mutex +++ a/drivers/macintosh/therm_pm72.c @@ -122,6 +122,7 @@ #include linux/kmod.h #include linux/i2c.h #include linux/kthread.h +#include linux/mutex.h #include asm/prom.h #include asm/machdep.h #include asm/io.h @@ -169,7 +170,7 @@ static int rackmac; static s32 dimm_output_clamp; static int fcu_rpm_shift; static int fcu_tickle_ticks; -static DECLARE_MUTEX(driver_lock); +static DEFINE_MUTEX(driver_lock); /* * We have 3 types of CPU PID control. One is split old style control @@ -729,9 +730,9 @@ static void fetch_cpu_pumps_minmax(void) static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf) \ { \ ssize_t r; \ - down(driver_lock); \ + mutex_lock(driver_lock); \ r = sprintf(buf, %d.%03d, FIX32TOPRINT(data));\ - up(driver_lock); \ + mutex_unlock(driver_lock); \ return r; \ } #define BUILD_SHOW_FUNC_INT(name, data)\ @@ -1803,11 +1804,11 @@ static int main_control_loop(void *x) { DBG(main_control_loop started\n); - down(driver_lock); + mutex_lock(driver_lock); if (start_fcu() 0) { printk(KERN_ERR kfand: failed to start FCU\n); - up(driver_lock); + mutex_unlock(driver_lock); goto out; } @@ -1822,14 +1823,14 @@ static int main_control_loop(void *x) fcu_tickle_ticks = FCU_TICKLE_TICKS; - up(driver_lock); + mutex_unlock(driver_lock); while (state == state_attached) { unsigned long elapsed, start; start = jiffies; - down(driver_lock); + mutex_lock(driver_lock); /* Tickle the FCU just in case */ if (--fcu_tickle_ticks 0) { @@ -1861,7 +1862,7 @@ static int main_control_loop(void *x) do_monitor_slots(slots_state); else do_monitor_drives(drives_state); - up(driver_lock); + mutex_unlock(driver_lock); if (critical_state == 1) { printk(KERN_WARNING Temperature control detected a critical condition\n); @@ -2019,13 +2020,13 @@ static void detach_fcu(void) */ static int therm_pm72_attach(struct i2c_adapter *adapter) { - down(driver_lock); + mutex_lock(driver_lock); /* Check state */ if (state == state_detached) state = state_attaching; if (state != state_attaching) { - up(driver_lock); + mutex_unlock(driver_lock); return 0; } @@ -2054,7 +2055,7 @@ static int therm_pm72_attach(struct i2c_ state = state_attached; start_control_loops(); } - up(driver_lock); + mutex_unlock(driver_lock); return 0; } @@ -2065,16 +2066,16 @@ static int therm_pm72_attach(struct i2c_ */ static int therm_pm72_detach(struct i2c_adapter *adapter) { - down(driver_lock); + mutex_lock(driver_lock); if (state != state_detached) state = state_detaching; /* Stop control loops if any */ DBG(stopping control loops\n); - up(driver_lock); + mutex_unlock(driver_lock); stop_control_loops(); - down(driver_lock); + mutex_lock(driver_lock); if (u3_0 != NULL !strcmp(adapter-name, u3 0)) { DBG(lost U3-0, disposing control loops\n); @@ -2090,7 +2091,7 @@ static int therm_pm72_detach(struct i2c_ if (u3_0 == NULL u3_1 == NULL) state = state_detached; - up(driver_lock); + mutex_unlock(driver_lock); return 0; } _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 2/5] macintosh: qindfarm_smu_sat: semaphore to mutex
From: Daniel Walker [EMAIL PROTECTED] Signed-off-by: Daniel Walker [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- drivers/macintosh/windfarm_smu_sat.c | 10 +- 1 file changed, 5 insertions(+), 5 deletions(-) diff -puN drivers/macintosh/windfarm_smu_sat.c~macintosh-qindfarm_smu_sat-semaphore-to-mutex drivers/macintosh/windfarm_smu_sat.c --- a/drivers/macintosh/windfarm_smu_sat.c~macintosh-qindfarm_smu_sat-semaphore-to-mutex +++ a/drivers/macintosh/windfarm_smu_sat.c @@ -13,7 +13,7 @@ #include linux/init.h #include linux/wait.h #include linux/i2c.h -#include linux/semaphore.h +#include linux/mutex.h #include asm/prom.h #include asm/smu.h #include asm/pmac_low_i2c.h @@ -36,7 +36,7 @@ struct wf_sat { int nr; atomic_trefcnt; - struct semaphoremutex; + struct mutexmutex; unsigned long last_read; /* jiffies when cache last updated */ u8 cache[16]; struct i2c_client i2c; @@ -163,7 +163,7 @@ static int wf_sat_get(struct wf_sensor * if (sat-i2c.adapter == NULL) return -ENODEV; - down(sat-mutex); + mutex_lock(sat-mutex); if (time_after(jiffies, (sat-last_read + MAX_AGE))) { err = wf_sat_read_cache(sat); if (err) @@ -182,7 +182,7 @@ static int wf_sat_get(struct wf_sensor * err = 0; fail: - up(sat-mutex); + mutex_unlock(sat-mutex); return err; } @@ -233,7 +233,7 @@ static void wf_sat_create(struct i2c_ada sat-nr = -1; sat-node = of_node_get(dev); atomic_set(sat-refcnt, 0); - init_MUTEX(sat-mutex); + mutex_init(sat-mutex); sat-i2c.addr = (addr 1) 0x7f; sat-i2c.adapter = adapter; sat-i2c.driver = wf_sat_driver; _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 4/5] powerpc: devres: Add devm_ioremap_prot()
From: Emil Medve [EMAIL PROTECTED] We provide an ioremap_flags so provide a corresponding devm_ioremap_prot. The slight name difference is at Ben Herrenschmidt request as he plans on changing ioremap_flags to ioremap_prot in the future. Signed-off-by: Emil Medve [EMAIL PROTECTED] Signed-off-by: Kumar Gala [EMAIL PROTECTED] Acked-by: Tejun Heo [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/lib/Makefile |1 arch/powerpc/lib/devres.c | 42 include/asm-powerpc/io.h |8 ++ include/linux/io.h|1 lib/devres.c |2 - 5 files changed, 52 insertions(+), 2 deletions(-) diff -puN arch/powerpc/lib/Makefile~devres-add-devm_ioremap_prot arch/powerpc/lib/Makefile --- a/arch/powerpc/lib/Makefile~devres-add-devm_ioremap_prot +++ a/arch/powerpc/lib/Makefile @@ -23,3 +23,4 @@ obj-$(CONFIG_SMP) += locks.o endif obj-$(CONFIG_PPC_LIB_RHEAP) += rheap.o +obj-$(CONFIG_HAS_IOMEM)+= devres.o diff -puN /dev/null arch/powerpc/lib/devres.c --- /dev/null +++ a/arch/powerpc/lib/devres.c @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2008 Freescale Semiconductor, Inc. + * + * This program 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. + */ + +#include linux/device.h /* devres_*(), devm_ioremap_release() */ +#include linux/io.h /* ioremap_flags() */ +#include linux/module.h /* EXPORT_SYMBOL() */ + +/** + * devm_ioremap_prot - Managed ioremap_flags() + * @dev: Generic device to remap IO address for + * @offset: BUS offset to map + * @size: Size of map + * @flags: Page flags + * + * Managed ioremap_prot(). Map is automatically unmapped on driver + * detach. + */ +void __iomem *devm_ioremap_prot(struct device *dev, resource_size_t offset, +size_t size, unsigned long flags) +{ + void __iomem **ptr, *addr; + + ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL); + if (!ptr) + return NULL; + + addr = ioremap_flags(offset, size, flags); + if (addr) { + *ptr = addr; + devres_add(dev, ptr); + } else + devres_free(ptr); + + return addr; +} +EXPORT_SYMBOL(devm_ioremap_prot); diff -puN include/asm-powerpc/io.h~devres-add-devm_ioremap_prot include/asm-powerpc/io.h --- a/include/asm-powerpc/io.h~devres-add-devm_ioremap_prot +++ a/include/asm-powerpc/io.h @@ -2,7 +2,7 @@ #define _ASM_POWERPC_IO_H #ifdef __KERNEL__ -/* +/* * This program 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 @@ -18,6 +18,9 @@ extern int check_legacy_ioport(unsigned #define _PNPWRP0xa79 #define PNPBIOS_BASE 0xf000 +#include linux/device.h +#include linux/io.h + #include linux/compiler.h #include asm/page.h #include asm/byteorder.h @@ -744,6 +747,9 @@ static inline void * bus_to_virt(unsigne #define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set) +void __iomem *devm_ioremap_prot(struct device *dev, resource_size_t offset, + size_t size, unsigned long flags); + #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_IO_H */ diff -puN include/linux/io.h~devres-add-devm_ioremap_prot include/linux/io.h --- a/include/linux/io.h~devres-add-devm_ioremap_prot +++ a/include/linux/io.h @@ -65,5 +65,6 @@ void __iomem *devm_ioremap_nocache(struc void devm_iounmap(struct device *dev, void __iomem *addr); int check_signature(const volatile void __iomem *io_addr, const unsigned char *signature, int length); +void devm_ioremap_release(struct device *dev, void *res); #endif /* _LINUX_IO_H */ diff -puN lib/devres.c~devres-add-devm_ioremap_prot lib/devres.c --- a/lib/devres.c~devres-add-devm_ioremap_prot +++ a/lib/devres.c @@ -2,7 +2,7 @@ #include linux/io.h #include linux/module.h -static void devm_ioremap_release(struct device *dev, void *res) +void devm_ioremap_release(struct device *dev, void *res) { iounmap(*(void __iomem **)res); } _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 5/5] powerpc: assign PDE-data before gluing PDE into /proc tree
From: Denis V. Lunev [EMAIL PROTECTED] Simply replace proc_create and further data assigned with proc_create_data. No need to check for data!=NULL after that. Signed-off-by: Denis V. Lunev [EMAIL PROTECTED] Cc: Alexey Dobriyan [EMAIL PROTECTED] Cc: Eric W. Biederman [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/platforms/pseries/scanlog.c | 19 ++- 1 file changed, 2 insertions(+), 17 deletions(-) diff -puN arch/powerpc/platforms/pseries/scanlog.c~powerpc-assign-pde-data-before-gluing-pde-into-proc-tree arch/powerpc/platforms/pseries/scanlog.c --- a/arch/powerpc/platforms/pseries/scanlog.c~powerpc-assign-pde-data-before-gluing-pde-into-proc-tree +++ a/arch/powerpc/platforms/pseries/scanlog.c @@ -55,11 +55,6 @@ static ssize_t scanlog_read(struct file dp = PDE(inode); data = (unsigned int *)dp-data; - if (!data) { - printk(KERN_ERR scanlog: read failed no data\n); - return -EIO; - } - if (count RTAS_DATA_BUF_SIZE) count = RTAS_DATA_BUF_SIZE; @@ -146,11 +141,6 @@ static int scanlog_open(struct inode * i struct proc_dir_entry *dp = PDE(inode); unsigned int *data = (unsigned int *)dp-data; - if (!data) { - printk(KERN_ERR scanlog: open failed no data\n); - return -EIO; - } - if (data[0] != 0) { /* This imperfect test stops a second copy of the * data (or a reset while data is being copied) @@ -168,10 +158,6 @@ static int scanlog_release(struct inode struct proc_dir_entry *dp = PDE(inode); unsigned int *data = (unsigned int *)dp-data; - if (!data) { - printk(KERN_ERR scanlog: release failed no data\n); - return -EIO; - } data[0] = 0; return 0; @@ -200,12 +186,11 @@ static int __init scanlog_init(void) if (!data) goto err; - ent = proc_create(ppc64/rtas/scan-log-dump, S_IRUSR, NULL, - scanlog_fops); + ent = proc_create_data(ppc64/rtas/scan-log-dump, S_IRUSR, NULL, + scanlog_fops, data); if (!ent) goto err; - ent-data = data; proc_ppc64_scan_log_dump = ent; return 0; _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 3/5] machintosh: ADB driver: adb_handler_sem semaphore to mutex
From: Daniel Walker [EMAIL PROTECTED] Signed-off-by: Daniel Walker [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- drivers/macintosh/adb.c | 30 +++--- 1 file changed, 15 insertions(+), 15 deletions(-) diff -puN drivers/macintosh/adb.c~machintosh-adb-driver-adb_handler_sem-semaphore-to-mutex drivers/macintosh/adb.c --- a/drivers/macintosh/adb.c~machintosh-adb-driver-adb_handler_sem-semaphore-to-mutex +++ a/drivers/macintosh/adb.c @@ -37,7 +37,7 @@ #include linux/device.h #include linux/kthread.h #include linux/platform_device.h -#include linux/semaphore.h +#include linux/mutex.h #include asm/uaccess.h #ifdef CONFIG_PPC @@ -102,7 +102,7 @@ static struct adb_handler { } adb_handler[16]; /* - * The adb_handler_sem mutex protects all accesses to the original_address + * The adb_handler_mutex mutex protects all accesses to the original_address * and handler_id fields of adb_handler[i] for all i, and changes to the * handler field. * Accesses to the handler field are protected by the adb_handler_lock @@ -110,7 +110,7 @@ static struct adb_handler { * time adb_unregister returns, we know that the old handler isn't being * called. */ -static DECLARE_MUTEX(adb_handler_sem); +static DEFINE_MUTEX(adb_handler_mutex); static DEFINE_RWLOCK(adb_handler_lock); #if 0 @@ -355,7 +355,7 @@ do_adb_reset_bus(void) msleep(500); } - down(adb_handler_sem); + mutex_lock(adb_handler_mutex); write_lock_irq(adb_handler_lock); memset(adb_handler, 0, sizeof(adb_handler)); write_unlock_irq(adb_handler_lock); @@ -376,7 +376,7 @@ do_adb_reset_bus(void) if (adb_controller-autopoll) adb_controller-autopoll(autopoll_devs); } - up(adb_handler_sem); + mutex_unlock(adb_handler_mutex); blocking_notifier_call_chain(adb_client_list, ADB_MSG_POST_RESET, NULL); @@ -454,7 +454,7 @@ adb_register(int default_id, int handler { int i; - down(adb_handler_sem); + mutex_lock(adb_handler_mutex); ids-nids = 0; for (i = 1; i 16; i++) { if ((adb_handler[i].original_address == default_id) @@ -472,7 +472,7 @@ adb_register(int default_id, int handler ids-id[ids-nids++] = i; } } - up(adb_handler_sem); + mutex_unlock(adb_handler_mutex); return ids-nids; } @@ -481,7 +481,7 @@ adb_unregister(int index) { int ret = -ENODEV; - down(adb_handler_sem); + mutex_lock(adb_handler_mutex); write_lock_irq(adb_handler_lock); if (adb_handler[index].handler) { while(adb_handler[index].busy) { @@ -493,7 +493,7 @@ adb_unregister(int index) adb_handler[index].handler = NULL; } write_unlock_irq(adb_handler_lock); - up(adb_handler_sem); + mutex_unlock(adb_handler_mutex); return ret; } @@ -557,19 +557,19 @@ adb_try_handler_change(int address, int { int ret; - down(adb_handler_sem); + mutex_lock(adb_handler_mutex); ret = try_handler_change(address, new_id); - up(adb_handler_sem); + mutex_unlock(adb_handler_mutex); return ret; } int adb_get_infos(int address, int *original_address, int *handler_id) { - down(adb_handler_sem); + mutex_lock(adb_handler_mutex); *original_address = adb_handler[address].original_address; *handler_id = adb_handler[address].handler_id; - up(adb_handler_sem); + mutex_unlock(adb_handler_mutex); return (*original_address != 0); } @@ -628,10 +628,10 @@ do_adb_query(struct adb_request *req) case ADB_QUERY_GETDEVINFO: if (req-nbytes 3) break; - down(adb_handler_sem); + mutex_lock(adb_handler_mutex); req-reply[0] = adb_handler[req-data[2]].original_address; req-reply[1] = adb_handler[req-data[2]].handler_id; - up(adb_handler_sem); + mutex_unlock(adb_handler_mutex); req-complete = 1; req-reply_len = 2; adb_write_done(req); _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 02/24] ppc: replace remaining __FUNCTION__ occurrences
From: Harvey Harrison [EMAIL PROTECTED] __FUNCTION__ is gcc-specific, use __func__ Signed-off-by: Harvey Harrison [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/ppc/8xx_io/fec.c |4 ++-- arch/ppc/platforms/radstone_ppc7d.c |8 2 files changed, 6 insertions(+), 6 deletions(-) diff -puN arch/ppc/8xx_io/fec.c~ppc-replace-remaining-__function__-occurences arch/ppc/8xx_io/fec.c --- a/arch/ppc/8xx_io/fec.c~ppc-replace-remaining-__function__-occurences +++ a/arch/ppc/8xx_io/fec.c @@ -520,7 +520,7 @@ fec_enet_interrupt(int irq, void * dev_i #ifdef CONFIG_USE_MDIO fec_enet_mii(dev); #else -printk(%s[%d] %s: unexpected FEC_ENET_MII event\n, __FILE__,__LINE__,__FUNCTION__); +printk(%s[%d] %s: unexpected FEC_ENET_MII event\n, __FILE__, __LINE__, __func__); #endif /* CONFIG_USE_MDIO */ } @@ -1441,7 +1441,7 @@ irqreturn_t mii_link_interrupt(int irq, fecp-fec_ecntrl = ecntrl; /* restore old settings */ } #else -printk(%s[%d] %s: unexpected Link interrupt\n, __FILE__,__LINE__,__FUNCTION__); +printk(%s[%d] %s: unexpected Link interrupt\n, __FILE__, __LINE__, __func__); #endif /* CONFIG_USE_MDIO */ #ifndef CONFIG_RPXCLASSIC diff -puN arch/ppc/platforms/radstone_ppc7d.c~ppc-replace-remaining-__function__-occurences arch/ppc/platforms/radstone_ppc7d.c --- a/arch/ppc/platforms/radstone_ppc7d.c~ppc-replace-remaining-__function__-occurences +++ a/arch/ppc/platforms/radstone_ppc7d.c @@ -512,7 +512,7 @@ static void __init ppc7d_init_irq(void) { int irq; - pr_debug(%s\n, __FUNCTION__); + pr_debug(%s\n, __func__); i8259_init(0, 0); mv64360_init_irq(); @@ -569,7 +569,7 @@ static int __init ppc7d_map_irq(struct p }; const long min_idsel = 10, max_idsel = 14, irqs_per_slot = 4; - pr_debug(%s: %04x/%04x/%x: idsel=%hx pin=%hu\n, __FUNCTION__, + pr_debug(%s: %04x/%04x/%x: idsel=%hx pin=%hu\n, __func__, dev-vendor, dev-device, PCI_FUNC(dev-devfn), idsel, pin); return PCI_IRQ_TABLE_LOOKUP; @@ -1300,7 +1300,7 @@ static void ppc7d_init2(void) u32 data; u8 data8; - pr_debug(%s: enter\n, __FUNCTION__); + pr_debug(%s: enter\n, __func__); /* Wait for debugger? */ if (ppc7d_wait_debugger) { @@ -1333,7 +1333,7 @@ static void ppc7d_init2(void) ppc_md.set_rtc_time = ppc7d_set_rtc_time; ppc_md.get_rtc_time = ppc7d_get_rtc_time; - pr_debug(%s: exit\n, __FUNCTION__); + pr_debug(%s: exit\n, __func__); } /* Called from machine_init(), early, before any of the __init functions _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 14/24] rapidio: add RapidIO node probing into MPC86xx_HPCN board id table
From: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/platforms/86xx/mpc86xx_hpcn.c |1 + 1 file changed, 1 insertion(+) diff -puN arch/powerpc/platforms/86xx/mpc86xx_hpcn.c~rapidio-add-rapidio-node-probing-into-mpc86xx_hpcn-board-id-table arch/powerpc/platforms/86xx/mpc86xx_hpcn.c --- a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c~rapidio-add-rapidio-node-probing-into-mpc86xx_hpcn-board-id-table +++ a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c @@ -215,6 +215,7 @@ mpc86xx_time_init(void) static __initdata struct of_device_id of_bus_ids[] = { { .compatible = simple-bus, }, + { .compatible = fsl,rapidio-delta, }, {}, }; _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 13/24] rapidio: add RapidIO node into MPC8641HPCN dts file
From: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/boot/dts/mpc8641_hpcn.dts | 12 1 file changed, 12 insertions(+) diff -puN arch/powerpc/boot/dts/mpc8641_hpcn.dts~rapidio-add-rapidio-node-into-mpc8641hpcn-dts-file arch/powerpc/boot/dts/mpc8641_hpcn.dts --- a/arch/powerpc/boot/dts/mpc8641_hpcn.dts~rapidio-add-rapidio-node-into-mpc8641hpcn-dts-file +++ a/arch/powerpc/boot/dts/mpc8641_hpcn.dts @@ -26,6 +26,7 @@ serial1 = serial1; pci0 = pci0; pci1 = pci1; + rapidio0 = rapidio0; }; cpus { @@ -500,4 +501,15 @@ 0x0 0x0010; }; }; + rapidio0: [EMAIL PROTECTED] { + #address-cells = 2; + #size-cells = 2; + compatible = fsl,rapidio-delta; + reg = 0xf80c 0x2; + ranges = 0 0 0xc000 0 0x2000; + interrupt-parent = mpic; + /* err_irq bell_outb_irq bell_inb_irq + msg1_tx_irq msg1_rx_irq msg2_tx_irq msg2_rx_irq */ + interrupts = 48 2 49 2 50 2 53 2 54 2 55 2 56 2; + }; }; _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 16/24] rapidio: add RapidIO connection info print out and re-training for break connection
From: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/sysdev/fsl_rio.c | 71 1 file changed, 71 insertions(+) diff -puN arch/powerpc/sysdev/fsl_rio.c~rapidio-add-rapidio-connection-info-print-out-and-re-training-for-break-connection arch/powerpc/sysdev/fsl_rio.c --- a/arch/powerpc/sysdev/fsl_rio.c~rapidio-add-rapidio-connection-info-print-out-and-re-training-for-break-connection +++ a/arch/powerpc/sysdev/fsl_rio.c @@ -942,6 +942,48 @@ static int fsl_rio_get_cmdline(char *s) __setup(riohdid=, fsl_rio_get_cmdline); +static inline void fsl_rio_info(struct device *dev, u32 ccsr) +{ + const char *str; + if (ccsr 1) { + /* Serial phy */ + switch (ccsr 30) { + case 0: + str = 1; + break; + case 1: + str = 4; + break; + default: + str = Unknown; + break;; + } + dev_info(dev, Hardware port width: %s\n, str); + + switch ((ccsr 27) 7) { + case 0: + str = Single-lane 0; + break; + case 1: + str = Single-lane 2; + break; + case 2: + str = Four-lane; + break; + default: + str = Unknown; + break; + } + dev_info(dev, Training connection status: %s\n, str); + } else { + /* Parallel phy */ + if (!(ccsr 0x8000)) + dev_info(dev, Output port operating in 8-bit mode\n); + if (!(ccsr 0x0800)) + dev_info(dev, Input port operating in 8-bit mode\n); + } +} + /** * fsl_rio_setup - Setup MPC85xx RapidIO interface * @fsl_rio_setup - Setup Freescale PowerPC RapidIO interface @@ -1055,6 +1097,35 @@ int fsl_rio_setup(struct of_device *dev) (port-phy_type == RIO_PHY_PARALLEL) ? parallel : ((port-phy_type == RIO_PHY_SERIAL) ? serial : unknown)); + /* Checking the port training status */ + if (in_be32((priv-regs_win + RIO_ESCSR)) 1) { + dev_err(dev-dev, Port is not ready. + Try to restart connection...\n); + switch (port-phy_type) { + case RIO_PHY_SERIAL: + /* Disable ports */ + out_be32(priv-regs_win + RIO_CCSR, 0); + /* Set 1x lane */ + setbits32(priv-regs_win + RIO_CCSR, 0x0200); + /* Enable ports */ + setbits32(priv-regs_win + RIO_CCSR, 0x0060); + break; + case RIO_PHY_PARALLEL: + /* Disable ports */ + out_be32(priv-regs_win + RIO_CCSR, 0x2200); + /* Enable ports */ + out_be32(priv-regs_win + RIO_CCSR, 0x4400); + break; + } + msleep(100); + if (in_be32((priv-regs_win + RIO_ESCSR)) 1) { + dev_err(dev-dev, Port restart failed.\n); + rc = -ENOLINK; + goto err; + } + dev_info(dev-dev, Port restart success!\n); + } + fsl_rio_info(dev-dev, ccsr); port-sys_size = (in_be32((priv-regs_win + RIO_PEF_CAR)) RIO_PEF_CTLS) 4; _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 15/24] rapidio: add serial RapidIO controller support, which includes MPC8548, MPC8641
From: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/sysdev/fsl_rio.c | 75 +++- include/linux/rio.h |6 ++ 2 files changed, 70 insertions(+), 11 deletions(-) diff -puN arch/powerpc/sysdev/fsl_rio.c~rapidio-add-serial-rapidio-controller-support-which-includes-mpc8548-mpc8641 arch/powerpc/sysdev/fsl_rio.c --- a/arch/powerpc/sysdev/fsl_rio.c~rapidio-add-serial-rapidio-controller-support-which-includes-mpc8548-mpc8641 +++ a/arch/powerpc/sysdev/fsl_rio.c @@ -21,6 +21,7 @@ #include linux/rio.h #include linux/rio_drv.h #include linux/of_platform.h +#include linux/delay.h #include asm/io.h @@ -30,7 +31,12 @@ #define IRQ_RIO_RX(m) (((struct rio_priv *)(m-priv))-rxirq) #define RIO_ATMU_REGS_OFFSET 0x10c00 -#define RIO_MSG_REGS_OFFSET0x11000 +#define RIO_P_MSG_REGS_OFFSET 0x11000 +#define RIO_S_MSG_REGS_OFFSET 0x13000 +#define RIO_ESCSR 0x158 +#define RIO_CCSR 0x15c +#define RIO_ISR_AACR 0x10120 +#define RIO_ISR_AACR_AA0x1 /* Accept All ID */ #define RIO_MAINT_WIN_SIZE 0x40 #define RIO_DBELL_WIN_SIZE 0x1000 @@ -69,7 +75,7 @@ struct rio_atmu_regs { u32 rowtar; - u32 pad1; + u32 rowtear; u32 rowbar; u32 pad2; u32 rowar; @@ -95,7 +101,15 @@ struct rio_msg_regs { u32 ifqdpar; u32 pad6; u32 ifqepar; - u32 pad7[250]; + u32 pad7[226]; + u32 odmr; + u32 odsr; + u32 res0[4]; + u32 oddpr; + u32 oddatr; + u32 res1[3]; + u32 odretcr; + u32 res2[12]; u32 dmr; u32 dsr; u32 pad8; @@ -175,8 +189,22 @@ static int fsl_rio_doorbell_send(struct struct rio_priv *priv = mport-priv; pr_debug(fsl_doorbell_send: index %d destid %4.4x data %4.4x\n, index, destid, data); - out_be32(priv-dbell_atmu_regs-rowtar, destid 22); - out_be16(priv-dbell_win, data); + switch (mport-phy_type) { + case RIO_PHY_PARALLEL: + out_be32(priv-dbell_atmu_regs-rowtar, destid 22); + out_be16(priv-dbell_win, data); + break; + case RIO_PHY_SERIAL: + /* In the serial version silicons, such as MPC8548, MPC8641, +* below operations is must be. +*/ + out_be32(priv-msg_regs-odmr, 0x); + out_be32(priv-msg_regs-odretcr, 0x0004); + out_be32(priv-msg_regs-oddpr, destid 16); + out_be32(priv-msg_regs-oddatr, data); + out_be32(priv-msg_regs-odmr, 0x0001); + break; + } return 0; } @@ -342,11 +370,22 @@ rio_hw_add_outb_message(struct rio_mport memset(priv-msg_tx_ring.virt_buffer[priv-msg_tx_ring.tx_slot] + len, 0, RIO_MAX_MSG_SIZE - len); - /* Set mbox field for message */ - desc-dport = mbox 0x3; + switch (mport-phy_type) { + case RIO_PHY_PARALLEL: + /* Set mbox field for message */ + desc-dport = mbox 0x3; - /* Enable EOMI interrupt, set priority, and set destid */ - desc-dattr = 0x2800 | (rdev-destid 2); + /* Enable EOMI interrupt, set priority, and set destid */ + desc-dattr = 0x2800 | (rdev-destid 2); + break; + case RIO_PHY_SERIAL: + /* Set mbox field for message, and set destid */ + desc-dport = (rdev-destid 16) | (mbox 0x3); + + /* Enable EOMI interrupt and priority */ + desc-dattr = 0x2800; + break; + } /* Set transfer size aligned to next power of 2 (in double words) */ desc-dwcnt = is_power_of_2(len) ? len : 1 get_bitmask_order(len); @@ -920,6 +959,7 @@ int fsl_rio_setup(struct of_device *dev) const u32 *dt_range, *cell; struct resource regs; int rlen; + u32 ccsr; u64 law_start, law_size; int paw, aw, sw; @@ -1008,6 +1048,14 @@ int fsl_rio_setup(struct of_device *dev) priv-regs_win = ioremap(regs.start, regs.end - regs.start + 1); + /* Probe the master port phy type */ + ccsr = in_be32(priv-regs_win + RIO_CCSR); + port-phy_type = (ccsr 1) ? RIO_PHY_SERIAL : RIO_PHY_PARALLEL; + dev_info(dev-dev, RapidIO PHY type: %s\n, + (port-phy_type == RIO_PHY_PARALLEL) ? parallel : + ((port-phy_type == RIO_PHY_SERIAL) ? serial : +unknown)); + port-sys_size = (in_be32((priv-regs_win + RIO_PEF_CAR)) RIO_PEF_CTLS) 4; dev_info(dev-dev, RapidIO Common Transport System size: %d\n, @@ -1017,8 +1065,13 @@ int fsl_rio_setup(struct of_device *dev)
[patch 12/24] rapidio: change the kernel configurated RapidIO system size to auto-probing
From: Zhang Wei [EMAIL PROTECTED] The RapidIO system size will auto probe in RIO setup. The route table and rionet_active in rionet.c are changed to be allocated dynamically according the system size. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/sysdev/fsl_rio.c |6 +++ drivers/net/rionet.c | 16 - drivers/rapidio/Kconfig |8 drivers/rapidio/rio-scan.c| 55 ++-- drivers/rapidio/rio-sysfs.c |3 + drivers/rapidio/rio.c |2 - drivers/rapidio/rio.h |9 + include/linux/rio.h | 14 8 files changed, 71 insertions(+), 42 deletions(-) diff -puN arch/powerpc/sysdev/fsl_rio.c~rapidio-change-the-kernel-configurated-rapidio-system-size-to-auto-probing arch/powerpc/sysdev/fsl_rio.c --- a/arch/powerpc/sysdev/fsl_rio.c~rapidio-change-the-kernel-configurated-rapidio-system-size-to-auto-probing +++ a/arch/powerpc/sysdev/fsl_rio.c @@ -1007,6 +1007,12 @@ int fsl_rio_setup(struct of_device *dev) rio_register_mport(port); priv-regs_win = ioremap(regs.start, regs.end - regs.start + 1); + + port-sys_size = (in_be32((priv-regs_win + RIO_PEF_CAR)) +RIO_PEF_CTLS) 4; + dev_info(dev-dev, RapidIO Common Transport System size: %d\n, + port-sys_size ? 65536 : 256); + priv-atmu_regs = (struct rio_atmu_regs *)(priv-regs_win + RIO_ATMU_REGS_OFFSET); priv-maint_atmu_regs = priv-atmu_regs + 1; diff -puN drivers/net/rionet.c~rapidio-change-the-kernel-configurated-rapidio-system-size-to-auto-probing drivers/net/rionet.c --- a/drivers/net/rionet.c~rapidio-change-the-kernel-configurated-rapidio-system-size-to-auto-probing +++ a/drivers/net/rionet.c @@ -77,7 +77,7 @@ static int rionet_capable = 1; * could be made into a hash table to save memory depending * on system trade-offs. */ -static struct rio_dev *rionet_active[RIO_MAX_ROUTE_ENTRIES]; +static struct rio_dev **rionet_active; #define is_rionet_capable(pef, src_ops, dst_ops) \ ((pef RIO_PEF_INB_MBOX) \ @@ -195,7 +195,8 @@ static int rionet_start_xmit(struct sk_b } if (eth-h_dest[0] 0x01) { - for (i = 0; i RIO_MAX_ROUTE_ENTRIES; i++) + for (i = 0; i RIO_MAX_ROUTE_ENTRIES(rnet-mport-sys_size); + i++) if (rionet_active[i]) rionet_queue_tx_msg(skb, ndev, rionet_active[i]); @@ -385,6 +386,8 @@ static void rionet_remove(struct rio_dev struct net_device *ndev = NULL; struct rionet_peer *peer, *tmp; + free_pages((unsigned long)rionet_active, rdev-net-hport-sys_size ? + __ilog2(sizeof(void *)) + 4 : 0); unregister_netdev(ndev); kfree(ndev); @@ -443,6 +446,15 @@ static int rionet_setup_netdev(struct ri goto out; } + rionet_active = (struct rio_dev **)__get_free_pages(GFP_KERNEL, + mport-sys_size ? __ilog2(sizeof(void *)) + 4 : 0); + if (!rionet_active) { + rc = -ENOMEM; + goto out; + } + memset((void *)rionet_active, 0, sizeof(void *) * + RIO_MAX_ROUTE_ENTRIES(mport-sys_size)); + /* Set up private area */ rnet = (struct rionet_private *)ndev-priv; rnet-mport = mport; diff -puN drivers/rapidio/Kconfig~rapidio-change-the-kernel-configurated-rapidio-system-size-to-auto-probing drivers/rapidio/Kconfig --- a/drivers/rapidio/Kconfig~rapidio-change-the-kernel-configurated-rapidio-system-size-to-auto-probing +++ a/drivers/rapidio/Kconfig @@ -1,14 +1,6 @@ # # RapidIO configuration # -config RAPIDIO_8_BIT_TRANSPORT - bool 8-bit transport addressing - depends on RAPIDIO - ---help--- - By default, the kernel assumes a 16-bit addressed RapidIO - network. By selecting this option, the kernel will support - an 8-bit addressed network. - config RAPIDIO_DISC_TIMEOUT int Discovery timeout duration (seconds) depends on RAPIDIO diff -puN drivers/rapidio/rio-scan.c~rapidio-change-the-kernel-configurated-rapidio-system-size-to-auto-probing drivers/rapidio/rio-scan.c --- a/drivers/rapidio/rio-scan.c~rapidio-change-the-kernel-configurated-rapidio-system-size-to-auto-probing +++ a/drivers/rapidio/rio-scan.c @@ -73,7 +73,7 @@ static u16 rio_get_device_id(struct rio_ rio_mport_read_config_32(port, destid, hopcount, RIO_DID_CSR, result); - return RIO_GET_DID(result); + return RIO_GET_DID(port-sys_size, result); } /** @@ -88,7 +88,7 @@ static u16 rio_get_device_id(struct rio_ static void rio_set_device_id(struct
[patch 03/24] drivers/block/viodasd.c: Use FIELD_SIZEOF
From: Julia Lawall [EMAIL PROTECTED] Robert P.J. Day proposed to use the macro FIELD_SIZEOF in replace of code that matches its definition. The modification was made using the following semantic patch (http://www.emn.fr/x-info/coccinelle/) // smpl @haskernel@ @@ #include linux/kernel.h @depends on haskernel@ type t; identifier f; @@ - (sizeof(((t*)0)-f)) + FIELD_SIZEOF(t, f) @depends on haskernel@ type t; identifier f; @@ - sizeof(((t*)0)-f) + FIELD_SIZEOF(t, f) // /smpl Signed-off-by: Julia Lawall [EMAIL PROTECTED] Cc: Jens Axboe [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Acked-by: Stephen Rothwell [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- drivers/block/viodasd.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff -puN drivers/block/viodasd.c~drivers-block-viodasdc-use-field_sizeof drivers/block/viodasd.c --- a/drivers/block/viodasd.c~drivers-block-viodasdc-use-field_sizeof +++ a/drivers/block/viodasd.c @@ -69,7 +69,7 @@ MODULE_LICENSE(GPL); enum { PARTITION_SHIFT = 3, MAX_DISKNO = HVMAXARCHITECTEDVIRTUALDISKS, - MAX_DISK_NAME = sizeof(((struct gendisk *)0)-disk_name) + MAX_DISK_NAME = FIELD_SIZEOF(struct gendisk, disk_name) }; static DEFINE_SPINLOCK(viodasd_spinlock); _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 05/24] ppc: remove redundant display of free swap space in show_mem()
From: Johannes Weiner [EMAIL PROTECTED] show_mem() has no need to print the amount of free swap space manually because show_free_areas() does this already and is called by the former. The two outputs only differ in text formatting: printk(Free swap = %lukB\n, ...); printk(Free swap: %6ldkB\n, ...); Signed-off-by: Johannes Weiner [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/ppc/mm/init.c |1 - 1 file changed, 1 deletion(-) diff -puN arch/ppc/mm/init.c~ppc-remove-redundant-display-of-free-swap-space-in-show_mem arch/ppc/mm/init.c --- a/arch/ppc/mm/init.c~ppc-remove-redundant-display-of-free-swap-space-in-show_mem +++ a/arch/ppc/mm/init.c @@ -109,7 +109,6 @@ void show_mem(void) printk(Mem-info:\n); show_free_areas(); - printk(Free swap: %6ldkB\n, nr_swap_pages(PAGE_SHIFT-10)); i = max_mapnr; while (i-- 0) { total++; _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 04/24] powerpc: remove redundant display of free swap space in show_mem()
From: Johannes Weiner [EMAIL PROTECTED] show_mem() has no need to print the amount of free swap space manually because show_free_areas() does this already and is called by the former. The two outputs only differ in text formatting: printk(Free swap = %lukB\n, ...); printk(Free swap: %6ldkB\n, ...); Signed-off-by: Johannes Weiner [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/mm/mem.c |1 - 1 file changed, 1 deletion(-) diff -puN arch/powerpc/mm/mem.c~powerpc-remove-redundant-display-of-free-swap-space-in-show_mem arch/powerpc/mm/mem.c --- a/arch/powerpc/mm/mem.c~powerpc-remove-redundant-display-of-free-swap-space-in-show_mem +++ a/arch/powerpc/mm/mem.c @@ -175,7 +175,6 @@ void show_mem(void) printk(Mem-info:\n); show_free_areas(); - printk(Free swap: %6ldkB\n, nr_swap_pages(PAGE_SHIFT-10)); for_each_online_pgdat(pgdat) { unsigned long flags; pgdat_resize_lock(pgdat, flags); _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 22/24] rapidio: change RapidIO doorbell source and target ID field to 16-bit
From: Zhang Wei [EMAIL PROTECTED] Change RapidIO doorbell source and target ID field to 16-bit for support large system size, which max rio devid is 65535. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/sysdev/fsl_rio.c |8 1 file changed, 4 insertions(+), 4 deletions(-) diff -puN arch/powerpc/sysdev/fsl_rio.c~rapidio-change-rapidio-doorbell-source-and-target-id-field-to-16-bit arch/powerpc/sysdev/fsl_rio.c --- a/arch/powerpc/sysdev/fsl_rio.c~rapidio-change-rapidio-doorbell-source-and-target-id-field-to-16-bit +++ a/arch/powerpc/sysdev/fsl_rio.c @@ -75,13 +75,13 @@ #define DOORBELL_DSR_TE0x0080 #define DOORBELL_DSR_QFI 0x0010 #define DOORBELL_DSR_DIQI 0x0001 -#define DOORBELL_TID_OFFSET0x03 -#define DOORBELL_SID_OFFSET0x05 +#define DOORBELL_TID_OFFSET0x02 +#define DOORBELL_SID_OFFSET0x04 #define DOORBELL_INFO_OFFSET 0x06 #define DOORBELL_MESSAGE_SIZE 0x08 -#define DBELL_SID(x) (*(u8 *)(x + DOORBELL_SID_OFFSET)) -#define DBELL_TID(x) (*(u8 *)(x + DOORBELL_TID_OFFSET)) +#define DBELL_SID(x) (*(u16 *)(x + DOORBELL_SID_OFFSET)) +#define DBELL_TID(x) (*(u16 *)(x + DOORBELL_TID_OFFSET)) #define DBELL_INF(x) (*(u16 *)(x + DOORBELL_INFO_OFFSET)) struct rio_atmu_regs { _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 08/24] rapidio: add RapidIO option to kernel configuration
From: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/Kconfig| 13 + arch/powerpc/platforms/86xx/Kconfig |1 + 2 files changed, 14 insertions(+) diff -puN arch/powerpc/Kconfig~rapidio-add-rapidio-option-to-kernel-configuration arch/powerpc/Kconfig --- a/arch/powerpc/Kconfig~rapidio-add-rapidio-option-to-kernel-configuration +++ a/arch/powerpc/Kconfig @@ -571,6 +571,19 @@ source drivers/pcmcia/Kconfig source drivers/pci/hotplug/Kconfig +config HAS_RAPIDIO + bool + default n + +config RAPIDIO + bool RapidIO support + depends on HAS_RAPIDIO + help + If you say Y here, the kernel will include drivers and + infrastructure code to support RapidIO interconnect devices. + +source drivers/rapidio/Kconfig + endmenu menu Advanced setup diff -puN arch/powerpc/platforms/86xx/Kconfig~rapidio-add-rapidio-option-to-kernel-configuration arch/powerpc/platforms/86xx/Kconfig --- a/arch/powerpc/platforms/86xx/Kconfig~rapidio-add-rapidio-option-to-kernel-configuration +++ a/arch/powerpc/platforms/86xx/Kconfig @@ -8,6 +8,7 @@ config MPC8641_HPCN select PPC_I8259 select DEFAULT_UIMAGE select FSL_ULI1575 + select HAS_RAPIDIO help This option enables support for the MPC8641 HPCN board. _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 09/24] rapidio: move include/asm-ppc/rio.h to include/asm-powerpc/rio.h
From: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- include/asm-powerpc/rio.h | 18 ++ include/asm-ppc/rio.h | 18 -- 2 files changed, 18 insertions(+), 18 deletions(-) diff -puN /dev/null include/asm-powerpc/rio.h --- /dev/null +++ a/include/asm-powerpc/rio.h @@ -0,0 +1,18 @@ +/* + * RapidIO architecture support + * + * Copyright 2005 MontaVista Software, Inc. + * Matt Porter [EMAIL PROTECTED] + * + * This program 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. + */ + +#ifndef ASM_PPC_RIO_H +#define ASM_PPC_RIO_H + +extern void platform_rio_init(void); + +#endif /* ASM_PPC_RIO_H */ diff -puN include/asm-ppc/rio.h~rapidio-move-include-asm-ppc-rioh-to-include-asm-powerpc-rioh /dev/null --- a/include/asm-ppc/rio.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * RapidIO architecture support - * - * Copyright 2005 MontaVista Software, Inc. - * Matt Porter [EMAIL PROTECTED] - * - * This program 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. - */ - -#ifndef ASM_PPC_RIO_H -#define ASM_PPC_RIO_H - -extern void platform_rio_init(void); - -#endif /* ASM_PPC_RIO_H */ _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 19/24] rapidio: add FSL RapidIO controller memory ops functions
From: Zhang Wei [EMAIL PROTECTED] Add FSL RapidIO controller (MPC85xx, MPC86xx) memory operation functions, which include map inbound/outbound window and unmap incound/outbound window. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/sysdev/fsl_rio.c | 204 1 file changed, 204 insertions(+) diff -puN arch/powerpc/sysdev/fsl_rio.c~rapidio-add-fsl-rapidio-controller-memory-ops-functions arch/powerpc/sysdev/fsl_rio.c --- a/arch/powerpc/sysdev/fsl_rio.c~rapidio-add-fsl-rapidio-controller-memory-ops-functions +++ a/arch/powerpc/sysdev/fsl_rio.c @@ -30,6 +30,8 @@ #define IRQ_RIO_TX(m) (((struct rio_priv *)(m-priv))-txirq) #define IRQ_RIO_RX(m) (((struct rio_priv *)(m-priv))-rxirq) +#define IS_64BIT_RES ((sizeof(resource_size_t) == 8) ? 1 : 0) + #define RIO_ATMU_REGS_OFFSET 0x10c00 #define RIO_P_MSG_REGS_OFFSET 0x11000 #define RIO_S_MSG_REGS_OFFSET 0x13000 @@ -39,6 +41,15 @@ #define RIO_ISR_AACR_AA0x1 /* Accept All ID */ #define RIO_MAINT_WIN_SIZE 0x40 #define RIO_DBELL_WIN_SIZE 0x1000 +#define RIO_MAX_INB_ATMU 4 +#define RIO_MAX_OUTB_ATMU 8 +#define RIO_INB_ATMU_REGS_OFFSET 0x10de0 +#define RIO_ATMU_EN_MASK 0x8000 + +#define RIO_NREAD 0x4 +#define RIO_NWRITE 0x4 +#define RIO_NWRITE_R 0x5 +#define RIO_NREAD_R0x5 #define RIO_MSG_OMR_MUI0x0002 #define RIO_MSG_OSR_TE 0x0080 @@ -82,6 +93,15 @@ struct rio_atmu_regs { u32 pad3[3]; }; +struct rio_inb_atmu_regs { + u32 riwtar; + u32 pad1; + u32 riwbar; + u32 pad2; + u32 riwar; + u32 pad3[3]; +}; + struct rio_msg_regs { u32 omr; u32 osr; @@ -334,6 +354,182 @@ fsl_rio_config_write(struct rio_mport *m } /** + * fsl_rio_map_inb_mem -- Mapping inbound memory region. + * @lstart: Local memory space start address. + * @rstart: RapidIO space start address. + * @size: The mapping region size. + * @flags: Flags for mapping. 0 for using default flags. + * + * Return: 0 -- Success. + * + * This function will create the inbound mapping + * from rstart to lstart. + */ +static int fsl_rio_map_inb_mem(struct rio_mport *mport, resource_size_t lstart, + resource_size_t rstart, resource_size_t size, u32 flags) +{ + int i; + struct rio_priv *priv = mport-priv; + struct rio_inb_atmu_regs __iomem *inbatmu = (struct rio_inb_atmu_regs *) + (priv-regs_win + RIO_INB_ATMU_REGS_OFFSET) - 1; + int size_ffs; + resource_size_t align; + + if (flags == 0) + flags = (RIO_NREAD_R 4) | RIO_NWRITE_R; + + align = (size 0x1000) ? 0x1000 : 1 (__ilog2(size - 1) + 1); + + /* Align the size */ + if ((lstart + size) (_ALIGN_DOWN(lstart, align) + align)) { + size_ffs = __ffs(_ALIGN_DOWN(lstart + size - 1, align)); + size = 1 (size_ffs + (((_ALIGN_DOWN(lstart, 1 size_ffs) + + (1 size_ffs)) (lstart + size)) ? 1 : 0)); + } else + size = align; + + if ((lstart (size - 1)) != (rstart (size - 1))) { + dev_err(mport-dev, The local address 0x%x can not be aligned + to the same size 0x%x with the RapidIO space + address 0x%x!\n, lstart, size, rstart); + return -EINVAL; + } + + /* Search for free inbound ATMU */ + for (i = 1; + (i = RIO_MAX_INB_ATMU) (inbatmu-riwar RIO_ATMU_EN_MASK); + i++, inbatmu--) + ; + + if (i RIO_MAX_INB_ATMU) { + dev_err(mport-dev, No free inbound ATMU!\n); + return -EBUSY; + } + out_be32(inbatmu-riwtar, ((IS_64BIT_RES ? (lstart 32) +0xf : 0) 20) | ((lstart 12) 0xf)); + out_be32(inbatmu-riwbar, ((IS_64BIT_RES ? (rstart 32) +0x3 : 0) 20) | ((rstart 12) 0xf)); + out_be32(inbatmu-riwar, 0x8000 | (0xf 20) + | ((flags 0xff) 12) + | (__ilog2(size) - 1)); + return 0; +} + +/** + * fsl_rio_map_outb_mem -- Mapping outbound memory region. + * @lstart: Local memory space start address. + * @rstart: RapidIO space start address. + * @size: The mapping region size. + * @tid: The target RapidIO device id. + * @flags: Flags for mapping. 0 for using default flags. + * + * Return: 0 -- Success. + * + * This function will create the outbound mapping + * from lstart to rstart. + */ +static int fsl_rio_map_outb_mem(struct rio_mport *mport, resource_size_t lstart, + resource_size_t rstart, resource_size_t size, + u16 tid, u32 flags) +{ + int i; + struct rio_priv *priv = mport-priv; + struct
[patch 20/24] rapidio: add the RapidIO master port maintance and doorbell window to space resources
From: Zhang Wei [EMAIL PROTECTED] Add the RapidIO master port maintance and doorbell IO windows to RIO space resources. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/sysdev/fsl_rio.c | 26 +- include/linux/rio.h |1 + 2 files changed, 22 insertions(+), 5 deletions(-) diff -puN arch/powerpc/sysdev/fsl_rio.c~rapidio-add-the-rapidio-master-port-maintance-and-doorbell-window-to-space-resources arch/powerpc/sysdev/fsl_rio.c --- a/arch/powerpc/sysdev/fsl_rio.c~rapidio-add-the-rapidio-master-port-maintance-and-doorbell-window-to-space-resources +++ a/arch/powerpc/sysdev/fsl_rio.c @@ -192,6 +192,8 @@ struct rio_priv { int bellirq; int txirq; int rxirq; + struct resource maint_res; + struct resource dbell_res; }; /** @@ -1362,15 +1364,29 @@ int fsl_rio_setup(struct of_device *dev) out_be32((priv-regs_win + RIO_ISR_AACR), RIO_ISR_AACR_AA); /* Configure maintenance transaction window */ - out_be32(priv-maint_atmu_regs-rowbar, 0x000c); - out_be32(priv-maint_atmu_regs-rowar, 0x80077015); + rio_init_io_res(priv-maint_res, law_start, RIO_MAINT_WIN_SIZE, + maint_win, RIO_RESOURCE_MAINT); + rc = rio_request_io_region(port, priv-maint_res); + if (rc) { + dev_err(dev-dev, request maint window error!\n); + goto err; + } + out_be32(priv-maint_atmu_regs-rowbar, (law_start 12) 0xff); + out_be32(priv-maint_atmu_regs-rowar, 0x80077000 + | (__ilog2(RIO_MAINT_WIN_SIZE) - 1)); priv-maint_win = ioremap(law_start, RIO_MAINT_WIN_SIZE); /* Configure outbound doorbell window */ - out_be32(priv-dbell_atmu_regs-rowbar, 0x000c0400); - out_be32(priv-dbell_atmu_regs-rowar, 0x8004200b); - fsl_rio_doorbell_init(port); + rio_init_io_res(priv-dbell_res, law_start + RIO_MAINT_WIN_SIZE, + RIO_DBELL_WIN_SIZE, dbell_win, RIO_RESOURCE_DOORBELL); + out_be32(priv-dbell_atmu_regs-rowbar, (priv-dbell_res.start 12) +0xff); + out_be32(priv-dbell_atmu_regs-rowar, 0x80042000 + | (__ilog2(RIO_DBELL_WIN_SIZE) - 1)); + rc = fsl_rio_doorbell_init(port); + if (rc) + goto err; return 0; err: diff -puN include/linux/rio.h~rapidio-add-the-rapidio-master-port-maintance-and-doorbell-window-to-space-resources include/linux/rio.h --- a/include/linux/rio.h~rapidio-add-the-rapidio-master-port-maintance-and-doorbell-window-to-space-resources +++ a/include/linux/rio.h @@ -257,6 +257,7 @@ struct rio_ops { #define RIO_RESOURCE_MEM 0x0100 #define RIO_RESOURCE_DOORBELL 0x0200 #define RIO_RESOURCE_MAILBOX 0x0400 +#define RIO_RESOURCE_MAINT 0x0800 #define RIO_RESOURCE_CACHEABLE 0x0001 #define RIO_RESOURCE_PCI 0x0002 _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 07/24] rapidio: change RIO function mpc85xx_ to fsl_
From: Zhang Wei [EMAIL PROTECTED] The driver is also fit for Freescale MPC8641 processor. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/sysdev/fsl_rio.c | 80 1 file changed, 40 insertions(+), 40 deletions(-) diff -puN arch/powerpc/sysdev/fsl_rio.c~rapidio-change-rio-function-mpc85xx_-to-fsl_ arch/powerpc/sysdev/fsl_rio.c --- a/arch/powerpc/sysdev/fsl_rio.c~rapidio-change-rio-function-mpc85xx_-to-fsl_ +++ a/arch/powerpc/sysdev/fsl_rio.c @@ -1,5 +1,5 @@ /* - * MPC85xx RapidIO support + * Freescale MPC85xx/MPC86xx RapidIO support * * Copyright 2005 MontaVista Software, Inc. * Matt Porter [EMAIL PROTECTED] @@ -145,7 +145,7 @@ static struct rio_msg_rx_ring { } msg_rx_ring; /** - * mpc85xx_rio_doorbell_send - Send a MPC85xx doorbell message + * fsl_rio_doorbell_send - Send a MPC85xx doorbell message * @index: ID of RapidIO interface * @destid: Destination ID of target device * @data: 16-bit info field of RapidIO doorbell message @@ -153,9 +153,9 @@ static struct rio_msg_rx_ring { * Sends a MPC85xx doorbell message. Returns %0 on success or * %-EINVAL on failure. */ -static int mpc85xx_rio_doorbell_send(int index, u16 destid, u16 data) +static int fsl_rio_doorbell_send(int index, u16 destid, u16 data) { - pr_debug(mpc85xx_doorbell_send: index %d destid %4.4x data %4.4x\n, + pr_debug(fsl_doorbell_send: index %d destid %4.4x data %4.4x\n, index, destid, data); out_be32((void *)dbell_atmu_regs-rowtar, destid 22); out_be16((void *)(dbell_win), data); @@ -164,7 +164,7 @@ static int mpc85xx_rio_doorbell_send(int } /** - * mpc85xx_local_config_read - Generate a MPC85xx local config space read + * fsl_local_config_read - Generate a MPC85xx local config space read * @index: ID of RapdiIO interface * @offset: Offset into configuration space * @len: Length (in bytes) of the maintenance transaction @@ -173,9 +173,9 @@ static int mpc85xx_rio_doorbell_send(int * Generates a MPC85xx local configuration space read. Returns %0 on * success or %-EINVAL on failure. */ -static int mpc85xx_local_config_read(int index, u32 offset, int len, u32 * data) +static int fsl_local_config_read(int index, u32 offset, int len, u32 *data) { - pr_debug(mpc85xx_local_config_read: index %d offset %8.8x\n, index, + pr_debug(fsl_local_config_read: index %d offset %8.8x\n, index, offset); *data = in_be32((void *)(regs_win + offset)); @@ -183,7 +183,7 @@ static int mpc85xx_local_config_read(int } /** - * mpc85xx_local_config_write - Generate a MPC85xx local config space write + * fsl_local_config_write - Generate a MPC85xx local config space write * @index: ID of RapdiIO interface * @offset: Offset into configuration space * @len: Length (in bytes) of the maintenance transaction @@ -192,10 +192,10 @@ static int mpc85xx_local_config_read(int * Generates a MPC85xx local configuration space write. Returns %0 on * success or %-EINVAL on failure. */ -static int mpc85xx_local_config_write(int index, u32 offset, int len, u32 data) +static int fsl_local_config_write(int index, u32 offset, int len, u32 data) { pr_debug - (mpc85xx_local_config_write: index %d offset %8.8x data %8.8x\n, + (fsl_local_config_write: index %d offset %8.8x data %8.8x\n, index, offset, data); out_be32((void *)(regs_win + offset), data); @@ -203,7 +203,7 @@ static int mpc85xx_local_config_write(in } /** - * mpc85xx_rio_config_read - Generate a MPC85xx read maintenance transaction + * fsl_rio_config_read - Generate a MPC85xx read maintenance transaction * @index: ID of RapdiIO interface * @destid: Destination ID of transaction * @hopcount: Number of hops to target device @@ -215,13 +215,13 @@ static int mpc85xx_local_config_write(in * success or %-EINVAL on failure. */ static int -mpc85xx_rio_config_read(int index, u16 destid, u8 hopcount, u32 offset, int len, +fsl_rio_config_read(int index, u16 destid, u8 hopcount, u32 offset, int len, u32 * val) { u8 *data; pr_debug - (mpc85xx_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n, + (fsl_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n, index, destid, hopcount, offset, len); out_be32((void *)maint_atmu_regs-rowtar, (destid 22) | (hopcount 12) | ((offset ~0x3) 9)); @@ -243,7 +243,7 @@ mpc85xx_rio_config_read(int index, u16 d } /** - * mpc85xx_rio_config_write - Generate a MPC85xx write maintenance transaction + * fsl_rio_config_write - Generate a MPC85xx write maintenance transaction * @index: ID of RapdiIO interface * @destid: Destination ID of transaction * @hopcount: Number of hops to target device @@ -255,12 +255,12 @@ mpc85xx_rio_config_read(int index, u16 d * success
[patch 21/24] rapidio: add RapidIO proc fs for memory mapping debugging
From: Zhang Wei [EMAIL PROTECTED] Get RapidIO space resource by catting /proc/riores. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- drivers/rapidio/Kconfig |8 ++ drivers/rapidio/rio.c | 121 ++ 2 files changed, 129 insertions(+) diff -puN drivers/rapidio/Kconfig~rapidio-add-rapidio-proc-fs-for-memory-mapping-debugging drivers/rapidio/Kconfig --- a/drivers/rapidio/Kconfig~rapidio-add-rapidio-proc-fs-for-memory-mapping-debugging +++ a/drivers/rapidio/Kconfig @@ -9,4 +9,12 @@ config RAPIDIO_DISC_TIMEOUT Amount of time a discovery node waits for a host to complete enumeration before giving up. +config RAPIDIO_PROC_FS + bool I/O and Memory resource debug + depends on RAPIDIO PROC_FS + default y + ---help--- + Enable this option, it will create a /proc/riores node for + monitoring the RapidIO I/O and Memory resource. + source drivers/rapidio/sallocator/Kconfig diff -puN drivers/rapidio/rio.c~rapidio-add-rapidio-proc-fs-for-memory-mapping-debugging drivers/rapidio/rio.c --- a/drivers/rapidio/rio.c~rapidio-add-rapidio-proc-fs-for-memory-mapping-debugging +++ a/drivers/rapidio/rio.c @@ -31,6 +31,9 @@ #include linux/spinlock.h #include linux/slab.h #include linux/interrupt.h +#include linux/seq_file.h +#include linux/fs.h +#include linux/proc_fs.h #include linux/dma-mapping.h #include linux/hardirq.h @@ -872,3 +875,121 @@ EXPORT_SYMBOL_GPL(rio_request_inb_mbox); EXPORT_SYMBOL_GPL(rio_release_inb_mbox); EXPORT_SYMBOL_GPL(rio_request_outb_mbox); EXPORT_SYMBOL_GPL(rio_release_outb_mbox); + +#ifdef CONFIG_RAPIDIO_PROC_FS +enum { MAX_IORES_LEVEL = 5 }; + +struct riors { + struct rio_mport *mp; + int res; + struct resource *p; +} riomres; + +static void *r_next(struct seq_file *m, void *v, loff_t *pos) +{ + struct resource *p = v; + struct riors *rs = m-private; + + (*pos)++; + if (p-child) + return p-child; + while (!p-sibling p-parent) + p = p-parent; + if (p-sibling) + return p-sibling; + else { + rs-res++; + if (rs-res = RIO_MAX_MPORT_RESOURCES) { + rs-mp = list_entry(rs-mp-node.next, struct rio_mport, + node); + rs-res = 0; + if (rs-mp-node == rio_mports) + return NULL; + } + seq_printf(m, %2d: , rs-res); + rs-p = rs-mp-riores[rs-res]; + p = rs-p; + + return p; + } +} + +static void *r_start(struct seq_file *m, loff_t *pos) +{ + struct riors *rs = m-private; + struct resource *p; + + if (*pos) { + *pos = 0; + return NULL; + } + + rs-mp = list_entry(rio_mports.next, struct rio_mport, node); + rs-res = -1; + rs-p = rs-mp-iores; + p = rs-p; + + seq_printf(m, IO: ); + + return p; +} + +static void r_stop(struct seq_file *m, void *v) +{ +} + +static int r_show(struct seq_file *m, void *v) +{ + struct riors *rs = m-private; + struct resource *root = rs-p; + struct resource *r = v, *p; + int width = root-end 0x1 ? 4 : 8; + int depth; + + for (depth = 0, p = r; p-parent depth MAX_IORES_LEVEL; depth++, + p = p-parent) + if (p == root) + break; + seq_printf(m, %*s%0*llx-%0*llx : %s\n, + depth * 2, , + width, (unsigned long long) r-start, + width, (unsigned long long) r-end, + r-name ? r-name : BAD); + return 0; +} + +static const struct seq_operations resource_op = { + .start = r_start, + .next = r_next, + .stop = r_stop, + .show = r_show, +}; + +static int riores_open(struct inode *inode, struct file *file) +{ + int res = seq_open(file, resource_op); + if (!res) { + struct seq_file *m = file-private_data; + m-private = riomres; + } + return res; +} + +static const struct file_operations proc_riores_operations = { + .open = riores_open, + .read = seq_read, + .llseek = seq_lseek, + .release= seq_release, +}; + +static int __init rioresources_init(void) +{ + struct proc_dir_entry *entry; + + entry = create_proc_entry(riores, 0, NULL); + if (entry) + entry-proc_fops = proc_riores_operations; + return 0; +} +__initcall(rioresources_init); +#endif _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 23/24] rapidio: add the memory mapping support in rionet driver
From: Zhang Wei [EMAIL PROTECTED] The user can select memory mapping mode or message mode in CONFIG. It is also an example to how-to use memory mapping driver for RapidIO. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- drivers/net/Kconfig | 10 + drivers/net/rionet.c | 324 + 2 files changed, 334 insertions(+) diff -puN drivers/net/Kconfig~rapidio-add-the-memory-mapping-support-in-rionet-driver drivers/net/Kconfig --- a/drivers/net/Kconfig~rapidio-add-the-memory-mapping-support-in-rionet-driver +++ a/drivers/net/Kconfig @@ -2719,6 +2719,16 @@ config RIONET_RX_SIZE depends on RIONET default 128 +config RIONET_MEMMAP + bool Use memory map instead of message + depends on RIONET + default n + +config RIONET_DMA + bool Use DMA for memory mapping data transfer + depends on RIONET_MEMMAP FSL_DMA + default y + config FDDI bool FDDI driver support depends on (PCI || EISA || TC) diff -puN drivers/net/rionet.c~rapidio-add-the-memory-mapping-support-in-rionet-driver drivers/net/rionet.c --- a/drivers/net/rionet.c~rapidio-add-the-memory-mapping-support-in-rionet-driver +++ a/drivers/net/rionet.c @@ -1,6 +1,13 @@ /* * rionet - Ethernet driver over RapidIO messaging services * + * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved. + * Author: Zhang Wei, [EMAIL PROTECTED], Jun 2007 + * + * Changelog: + * Jun 2007 Zhang Wei [EMAIL PROTECTED] + * - Added the support to RapidIO memory driver. 2007. + * * Copyright 2005 MontaVista Software, Inc. * Matt Porter [EMAIL PROTECTED] * @@ -8,6 +15,7 @@ * 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. + * */ #include linux/module.h @@ -23,6 +31,7 @@ #include linux/skbuff.h #include linux/crc32.h #include linux/ethtool.h +#include linux/dmaengine.h #define DRV_NAMErionet #define DRV_VERSION 0.2 @@ -40,13 +49,47 @@ MODULE_LICENSE(GPL); NETIF_MSG_TX_ERR) #define RIONET_DOORBELL_JOIN 0x1000 +#ifdef CONFIG_RIONET_MEMMAP +#define RIONET_DOORBELL_SEND 0x1001 +#define RIONET_DOORBELL_LEAVE 0x1002 +#else #define RIONET_DOORBELL_LEAVE 0x1001 +#endif #define RIONET_MAILBOX 0 #define RIONET_TX_RING_SIZECONFIG_RIONET_TX_SIZE #define RIONET_RX_RING_SIZECONFIG_RIONET_RX_SIZE +#define ERR(fmt, arg...) \ + printk(KERN_ERR ERROR %s - %s: fmt, __FILE__, __func__, ## arg) + +#ifdef CONFIG_RIONET_MEMMAP +/* Definitions for rionet memory map driver */ +#define RIONET_DRVID 0x101 +#define RIONET_MAX_SK_DATA_SIZE0x1000 +#define RIONET_TX_RX_BUFF_SIZE (0x1000 * (128 + 128)) +#define RIONET_QUEUE_NEXT(x) (((x) 127) ? ((x) + 1) : 0) +#define RIONET_QUEUE_INC(x)(x = RIONET_QUEUE_NEXT(x)) + +struct sk_data { + u8 data[0x1000]; +}; + +#define RIONET_SKDATA_EN 0x8000 +struct rionet_tx_rx_buff { + int enqueue;/* enqueue point */ + int dequeue;/* dequeue point */ + u32 size[128]; /* size[i] is skdata[i] size +* the most high bit [31] is +* enable bit. The +* max size is 4096. +*/ + u8 rev1[3576]; + struct sk_data skdata[128];/* all size are 0x1000 * 128 */ +}; +#endif /* CONFIG_RIONET_MEMMAP */ + static LIST_HEAD(rionet_peers); struct rionet_private { @@ -60,6 +103,18 @@ struct rionet_private { spinlock_t lock; spinlock_t tx_lock; u32 msg_enable; +#ifdef CONFIG_RIONET_MEMMAP + struct rionet_tx_rx_buff *rxbuff; + struct rionet_tx_rx_buff __iomem *txbuff; + struct rio_mem *rxmem; + struct rio_mem *txmem; +#ifdef CONFIG_RIONET_DMA + struct dma_chan *txdmachan; + struct dma_chan *rxdmachan; + struct dma_client rio_dma_client; + spinlock_t rio_dma_event_lock; +#endif +#endif }; struct rionet_peer { @@ -90,6 +145,7 @@ static struct rio_dev **rionet_active; #define RIONET_MAC_MATCH(x)(*(u32 *)x == 0x00010001) #define RIONET_GET_DESTID(x) (*(u16 *)(x + 4)) +#ifndef CONFIG_RIONET_MEMMAP static int rionet_rx_clean(struct net_device *ndev) { int i; @@ -108,9 +164,11 @@ static int rionet_rx_clean(struct net_de rnet-rx_skb[i]-data = data; skb_put(rnet-rx_skb[i], RIO_MAX_MSG_SIZE); + rnet-rx_skb[i]-dev = ndev; rnet-rx_skb[i]-protocol = eth_type_trans(rnet-rx_skb[i], ndev); error = netif_rx(rnet-rx_skb[i]); + rnet-rx_skb[i] =
[patch 11/24] rapidio: add OF-tree support to RapidIO controller driver
From: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/kernel/Makefile |1 arch/powerpc/kernel/rio.c | 52 --- arch/powerpc/sysdev/fsl_rio.c | 110 +--- arch/powerpc/sysdev/fsl_rio.h | 20 - 4 files changed, 102 insertions(+), 81 deletions(-) diff -puN arch/powerpc/kernel/Makefile~rapidio-add-of-tree-support-to-rapidio-controller-driver arch/powerpc/kernel/Makefile --- a/arch/powerpc/kernel/Makefile~rapidio-add-of-tree-support-to-rapidio-controller-driver +++ a/arch/powerpc/kernel/Makefile @@ -72,7 +72,6 @@ pci64-$(CONFIG_PPC64) += pci_dn.o isa-b obj-$(CONFIG_PCI) += pci_$(CONFIG_WORD_SIZE).o $(pci64-y) \ pci-common.o obj-$(CONFIG_PCI_MSI) += msi.o -obj-$(CONFIG_RAPIDIO) += rio.o obj-$(CONFIG_KEXEC)+= machine_kexec.o crash.o \ machine_kexec_$(CONFIG_WORD_SIZE).o obj-$(CONFIG_AUDIT)+= audit.o diff -puN arch/powerpc/kernel/rio.c~rapidio-add-of-tree-support-to-rapidio-controller-driver /dev/null --- a/arch/powerpc/kernel/rio.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * RapidIO PPC32 support - * - * Copyright 2005 MontaVista Software, Inc. - * Matt Porter [EMAIL PROTECTED] - * - * This program 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. - */ - -#include linux/init.h -#include linux/kernel.h -#include linux/rio.h - -#include asm/rio.h - -/** - * platform_rio_init - Do platform specific RIO init - * - * Any platform specific initialization of RapdIO - * hardware is done here as well as registration - * of any active master ports in the system. - */ -void __attribute__ ((weak)) -platform_rio_init(void) -{ - printk(KERN_WARNING RIO: No platform_rio_init() present\n); -} - -/** - * ppc_rio_init - Do PPC32 RIO init - * - * Calls platform-specific RIO init code and then calls - * rio_init_mports() to initialize any master ports that - * have been registered with the RIO subsystem. - */ -static int __init ppc_rio_init(void) -{ - printk(KERN_INFO RIO: RapidIO init\n); - - /* Platform specific initialization */ - platform_rio_init(); - - /* Enumerate all registered ports */ - rio_init_mports(); - - return 0; -} - -subsys_initcall(ppc_rio_init); diff -puN arch/powerpc/sysdev/fsl_rio.c~rapidio-add-of-tree-support-to-rapidio-controller-driver arch/powerpc/sysdev/fsl_rio.c --- a/arch/powerpc/sysdev/fsl_rio.c~rapidio-add-of-tree-support-to-rapidio-controller-driver +++ a/arch/powerpc/sysdev/fsl_rio.c @@ -20,6 +20,7 @@ #include linux/interrupt.h #include linux/rio.h #include linux/rio_drv.h +#include linux/of_platform.h #include asm/io.h @@ -28,7 +29,6 @@ #define IRQ_RIO_TX(m) (((struct rio_priv *)(m-priv))-txirq) #define IRQ_RIO_RX(m) (((struct rio_priv *)(m-priv))-rxirq) -#define RIO_REGS_BASE (CCSRBAR + 0xc) #define RIO_ATMU_REGS_OFFSET 0x10c00 #define RIO_MSG_REGS_OFFSET0x11000 #define RIO_MAINT_WIN_SIZE 0x40 @@ -905,19 +905,66 @@ __setup(riohdid=, fsl_rio_get_cmdline) /** * fsl_rio_setup - Setup MPC85xx RapidIO interface - * @law_start: Starting physical address of RapidIO LAW - * @law_size: Size of RapidIO LAW + * @fsl_rio_setup - Setup Freescale PowerPC RapidIO interface * * Initializes MPC85xx RapidIO hardware interface, configures * master port with system-specific info, and registers the * master port with the RapidIO subsystem. */ -void fsl_rio_setup(int law_start, int law_size) +int fsl_rio_setup(struct of_device *dev) { struct rio_ops *ops; struct rio_mport *port; - struct rio_priv *priv = NULL; - int rc; + struct rio_priv *priv; + int rc = 0; + const u32 *dt_range, *cell; + struct resource regs; + int rlen; + u64 law_start, law_size; + int paw, aw, sw; + + if (!dev-node) { + dev_err(dev-dev, Device OF-Node is NULL); + return -EFAULT; + } + + rc = of_address_to_resource(dev-node, 0, regs); + if (rc) { + dev_err(dev-dev, Can't get %s property 'reg'\n, + dev-node-full_name); + return -EFAULT; + } + dev_info(dev-dev, Of-device full name %s\n, dev-node-full_name); + dev_info(dev-dev, Regs start 0x%08x size 0x%08x\n, regs.start, + regs.end - regs.start + 1); + + dt_range = of_get_property(dev-node, ranges, rlen); + if (!dt_range) { + dev_err(dev-dev, Can't get %s property 'ranges'\n, + dev-node-full_name); +
[patch 18/24] rapidio: add RapidIO space allocation bitmap arithmetic
From: Zhang Wei [EMAIL PROTECTED] The bitmap is the simplest RapidIO space allocation arithmetic. It uses the fixed size space for each RapidIO device in the inter-connection network. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/sysdev/fsl_rio.c | 11 drivers/rapidio/Kconfig |2 drivers/rapidio/Makefile|1 drivers/rapidio/rio.c |1 drivers/rapidio/sallocator/Kconfig |9 drivers/rapidio/sallocator/Makefile | 12 drivers/rapidio/sallocator/bitmap.c | 384 ++ include/linux/rio.h |6 8 files changed, 425 insertions(+), 1 deletion(-) diff -puN arch/powerpc/sysdev/fsl_rio.c~rapidio-add-rapidio-space-allocation-bitmap-arithmetic arch/powerpc/sysdev/fsl_rio.c --- a/arch/powerpc/sysdev/fsl_rio.c~rapidio-add-rapidio-space-allocation-bitmap-arithmetic +++ a/arch/powerpc/sysdev/fsl_rio.c @@ -920,6 +920,17 @@ static int fsl_rio_doorbell_init(struct return rc; } +u32 rio_get_mport_id(struct rio_mport *mport) +{ + u32 mport_id; + + rio_local_read_config_32(mport, 0x60, mport_id); + mport_id = mport-sys_size ? (mport_id 0x) : + ((mport_id 16) 0xff); + return mport_id; + +} + static char *cmdline = NULL; static int fsl_rio_get_hdid(int index) diff -puN drivers/rapidio/Kconfig~rapidio-add-rapidio-space-allocation-bitmap-arithmetic drivers/rapidio/Kconfig --- a/drivers/rapidio/Kconfig~rapidio-add-rapidio-space-allocation-bitmap-arithmetic +++ a/drivers/rapidio/Kconfig @@ -8,3 +8,5 @@ config RAPIDIO_DISC_TIMEOUT ---help--- Amount of time a discovery node waits for a host to complete enumeration before giving up. + +source drivers/rapidio/sallocator/Kconfig diff -puN drivers/rapidio/Makefile~rapidio-add-rapidio-space-allocation-bitmap-arithmetic drivers/rapidio/Makefile --- a/drivers/rapidio/Makefile~rapidio-add-rapidio-space-allocation-bitmap-arithmetic +++ a/drivers/rapidio/Makefile @@ -4,3 +4,4 @@ obj-y += rio.o rio-access.o rio-driver.o rio-scan.o rio-sysfs.o obj-$(CONFIG_RAPIDIO) += switches/ +obj-$(CONFIG_RAPIDIO) += sallocator/ diff -puN drivers/rapidio/rio.c~rapidio-add-rapidio-space-allocation-bitmap-arithmetic drivers/rapidio/rio.c --- a/drivers/rapidio/rio.c~rapidio-add-rapidio-space-allocation-bitmap-arithmetic +++ a/drivers/rapidio/rio.c @@ -849,6 +849,7 @@ int rio_init_mports(void) rio_enum_mport(port); else rio_disc_mport(port); + rio_space_init(port); } out: diff -puN /dev/null drivers/rapidio/sallocator/Kconfig --- /dev/null +++ a/drivers/rapidio/sallocator/Kconfig @@ -0,0 +1,9 @@ +choice + prompt Default RapidIO Space Allocator + depends on RAPIDIO + default RIO_SA_DEFAULT_BITMAP + + config RIO_SA_DEFAULT_BITMAP + bool Bitmap + +endchoice diff -puN /dev/null drivers/rapidio/sallocator/Makefile --- /dev/null +++ a/drivers/rapidio/sallocator/Makefile @@ -0,0 +1,12 @@ +# +# Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved. +# +# Author: Zhang Wei, [EMAIL PROTECTED], Jun 2007 +# +# This 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. +# + +obj-$(CONFIG_RIO_SA_DEFAULT_BITMAP) += bitmap.o diff -puN /dev/null drivers/rapidio/sallocator/bitmap.c --- /dev/null +++ a/drivers/rapidio/sallocator/bitmap.c @@ -0,0 +1,384 @@ +/* + * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved. + * Author: Zhang Wei, [EMAIL PROTECTED], Jun 2007 + * + * Description: + * RapidIO space allocator bitmap arithmetic. + * + * The Bitmap allocator make the whole RapidIO device have the same fixed + * inbound memory window. And on the top of each device inbound window, + * there is a sect0 area, which will use for recording the individual + * driver owned memory space in device. + * + * This program 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. + * + */ + +#include linux/types.h +#include linux/kernel.h + +#include linux/delay.h +#include linux/init.h +#include linux/rio.h +#include linux/rio_drv.h +#include linux/rio_ids.h +#include linux/rio_regs.h +#include linux/module.h +#include linux/spinlock.h +#include linux/slab.h +#include linux/seq_file.h +#include linux/fs.h +#include linux/proc_fs.h +#include linux/dma-mapping.h + +#include ../rio.h + +#undef DEBUG + +#define RIO_SBLOCK_SIZE4096 + +#define ERR(fmt, arg...) \ + printk(KERN_ERR ERROR %s - %s:
[patch 10/24] rapidio: add RapidIO multi mport support
From: Zhang Wei [EMAIL PROTECTED] The original RapidIO driver suppose there is only one mpc85xx RIO controller in system. So, some data structures are defined as mpc85xx_rio global, such as 'regs_win', 'dbell_ring', 'msg_tx_ring'. Now, I changed them to mport's private members. And you can define multi RIO OF-nodes in dts file for multi RapidIO controller in one processor, such as PCI/PCI-Ex host controllers in Freescale's silicon. And the mport operation function declaration should be changed to know which RapidIO controller is target. Signed-off-by: Zhang Wei [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/sysdev/fsl_rio.c | 393 +--- drivers/rapidio/rio-access.c | 10 include/linux/rio.h | 18 - 3 files changed, 237 insertions(+), 184 deletions(-) diff -puN arch/powerpc/sysdev/fsl_rio.c~rapidio-add-rapidio-multi-mport-support arch/powerpc/sysdev/fsl_rio.c --- a/arch/powerpc/sysdev/fsl_rio.c~rapidio-add-rapidio-multi-mport-support +++ a/arch/powerpc/sysdev/fsl_rio.c @@ -1,6 +1,9 @@ /* * Freescale MPC85xx/MPC86xx RapidIO support * + * Copyright (C) 2007, 2008 Freescale Semiconductor, Inc. + * Zhang Wei [EMAIL PROTECTED] + * * Copyright 2005 MontaVista Software, Inc. * Matt Porter [EMAIL PROTECTED] * @@ -20,6 +23,11 @@ #include asm/io.h +/* RapidIO definition irq, which read from OF-tree */ +#define IRQ_RIO_BELL(m)(((struct rio_priv *)(m-priv))-bellirq) +#define IRQ_RIO_TX(m) (((struct rio_priv *)(m-priv))-txirq) +#define IRQ_RIO_RX(m) (((struct rio_priv *)(m-priv))-rxirq) + #define RIO_REGS_BASE (CCSRBAR + 0xc) #define RIO_ATMU_REGS_OFFSET 0x10c00 #define RIO_MSG_REGS_OFFSET0x11000 @@ -112,20 +120,12 @@ struct rio_tx_desc { u32 res4; }; -static u32 regs_win; -static struct rio_atmu_regs *atmu_regs; -static struct rio_atmu_regs *maint_atmu_regs; -static struct rio_atmu_regs *dbell_atmu_regs; -static u32 dbell_win; -static u32 maint_win; -static struct rio_msg_regs *msg_regs; - -static struct rio_dbell_ring { +struct rio_dbell_ring { void *virt; dma_addr_t phys; -} dbell_ring; +}; -static struct rio_msg_tx_ring { +struct rio_msg_tx_ring { void *virt; dma_addr_t phys; void *virt_buffer[RIO_MAX_TX_RING_SIZE]; @@ -133,16 +133,32 @@ static struct rio_msg_tx_ring { int tx_slot; int size; void *dev_id; -} msg_tx_ring; +}; -static struct rio_msg_rx_ring { +struct rio_msg_rx_ring { void *virt; dma_addr_t phys; void *virt_buffer[RIO_MAX_RX_RING_SIZE]; int rx_slot; int size; void *dev_id; -} msg_rx_ring; +}; + +struct rio_priv { + void __iomem *regs_win; + struct rio_atmu_regs __iomem *atmu_regs; + struct rio_atmu_regs __iomem *maint_atmu_regs; + struct rio_atmu_regs __iomem *dbell_atmu_regs; + void __iomem *dbell_win; + void __iomem *maint_win; + struct rio_msg_regs __iomem *msg_regs; + struct rio_dbell_ring dbell_ring; + struct rio_msg_tx_ring msg_tx_ring; + struct rio_msg_rx_ring msg_rx_ring; + int bellirq; + int txirq; + int rxirq; +}; /** * fsl_rio_doorbell_send - Send a MPC85xx doorbell message @@ -153,12 +169,14 @@ static struct rio_msg_rx_ring { * Sends a MPC85xx doorbell message. Returns %0 on success or * %-EINVAL on failure. */ -static int fsl_rio_doorbell_send(int index, u16 destid, u16 data) +static int fsl_rio_doorbell_send(struct rio_mport *mport, + int index, u16 destid, u16 data) { + struct rio_priv *priv = mport-priv; pr_debug(fsl_doorbell_send: index %d destid %4.4x data %4.4x\n, index, destid, data); - out_be32((void *)dbell_atmu_regs-rowtar, destid 22); - out_be16((void *)(dbell_win), data); + out_be32(priv-dbell_atmu_regs-rowtar, destid 22); + out_be16(priv-dbell_win, data); return 0; } @@ -173,11 +191,13 @@ static int fsl_rio_doorbell_send(int ind * Generates a MPC85xx local configuration space read. Returns %0 on * success or %-EINVAL on failure. */ -static int fsl_local_config_read(int index, u32 offset, int len, u32 *data) +static int fsl_local_config_read(struct rio_mport *mport, + int index, u32 offset, int len, u32 *data) { + struct rio_priv *priv = mport-priv; pr_debug(fsl_local_config_read: index %d offset %8.8x\n, index, offset); - *data = in_be32((void *)(regs_win + offset)); + *data = in_be32(priv-regs_win + offset); return 0; } @@ -192,12 +212,14 @@ static int fsl_local_config_read(int ind * Generates a MPC85xx local configuration space write. Returns %0 on * success or %-EINVAL on failure. */ -static int fsl_local_config_write(int index, u32 offset, int len, u32 data) +static int fsl_local_config_write(struct
[patch 24/24] rapidio: fix docbook references
From: Randy Dunlap [EMAIL PROTECTED] Fix rapidio docbook (file was removed) and fix header file kernel-doc. Signed-off-by: Randy Dunlap [EMAIL PROTECTED] Acked-by: Zhang Wei [EMAIL PROTECTED] Cc: Matt Porter [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- Documentation/DocBook/rapidio.tmpl |1 - include/linux/rio.h|4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff -puN Documentation/DocBook/rapidio.tmpl~rapidio-fix-docbook-references Documentation/DocBook/rapidio.tmpl --- a/Documentation/DocBook/rapidio.tmpl~rapidio-fix-docbook-references +++ a/Documentation/DocBook/rapidio.tmpl @@ -133,7 +133,6 @@ !Idrivers/rapidio/rio-sysfs.c /sect1 sect1 id=PPC32_supporttitlePPC32 support/title -!Iarch/powerpc/kernel/rio.c !Earch/powerpc/sysdev/fsl_rio.c !Iarch/powerpc/sysdev/fsl_rio.c /sect1 diff -puN include/linux/rio.h~rapidio-fix-docbook-references include/linux/rio.h --- a/include/linux/rio.h~rapidio-fix-docbook-references +++ a/include/linux/rio.h @@ -327,7 +327,7 @@ struct rio_route_ops { }; /** - * Struct for RIO memory definition. + * struct rio_mem - struct for RIO memory definition. * @node: Node in list of memories * @virt: The virtual address for mapped memory accessing. * @owner: The owner id of this memory. @@ -346,7 +346,7 @@ struct rio_mem { }; /** - * Struct for RIO memory definition. + * struct rio_mem_ops - Struct for RIO memory operations definition. * @map_inb: The function for mapping inbound memory window. * @map_outb: The function for mapping outbound memory window. * @unmap_inb: The function for unmapping inbound memory window. _ ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[patch 06/24] lmb: add lmb_alloc_nid()
From: David Miller [EMAIL PROTECTED] A variant of lmb_alloc() that tries to allocate memory on a specified NUMA node 'nid' but falls back to normal lmb_alloc() if that fails. The caller provides a 'nid_range' function pointer which assists the allocator. It is given args 'start', 'end', and pointer to integer 'this_nid'. It places at 'this_nid' the NUMA node id that corresponds to 'start', and returns the end address within 'start' to 'end' at which memory assosciated with 'nid' ends. This callback allows a platform to use lmb_alloc_nid() in just about any context, even ones in which early_pfn_to_nid() might not be working yet. This function will be used by the NUMA setup code on sparc64, and also it can be used by powerpc, replacing it's hand crafted careful_allocation() function in arch/powerpc/mm/numa.c If x86 ever converts its NUMA support over to using the LMB helpers, it can use this too as it has something entirely similar. Signed-off-by: David S. Miller [EMAIL PROTECTED] Cc: Paul Mackerras [EMAIL PROTECTED] Cc: Benjamin Herrenschmidt [EMAIL PROTECTED] Cc: Thomas Gleixner [EMAIL PROTECTED] Cc: Ingo Molnar [EMAIL PROTECTED] Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- include/linux/lmb.h |2 lib/lmb.c | 86 +- 2 files changed, 78 insertions(+), 10 deletions(-) diff -puN include/linux/lmb.h~lmb-add-lmb_alloc_nid include/linux/lmb.h --- a/include/linux/lmb.h~lmb-add-lmb_alloc_nid +++ a/include/linux/lmb.h @@ -42,6 +42,8 @@ extern void __init lmb_init(void); extern void __init lmb_analyze(void); extern long __init lmb_add(u64 base, u64 size); extern long __init lmb_reserve(u64 base, u64 size); +extern u64 __init lmb_alloc_nid(u64 size, u64 align, int nid, + u64 (*nid_range)(u64, u64, int *)); extern u64 __init lmb_alloc(u64 size, u64 align); extern u64 __init lmb_alloc_base(u64 size, u64, u64 max_addr); diff -puN lib/lmb.c~lmb-add-lmb_alloc_nid lib/lmb.c --- a/lib/lmb.c~lmb-add-lmb_alloc_nid +++ a/lib/lmb.c @@ -232,6 +232,82 @@ long __init lmb_overlaps_region(struct l return (i rgn-cnt) ? i : -1; } +static u64 lmb_align_down(u64 addr, u64 size) +{ + return addr ~(size - 1); +} + +static u64 lmb_align_up(u64 addr, u64 size) +{ + return (addr + (size - 1)) ~(size - 1); +} + +static u64 __init lmb_alloc_nid_unreserved(u64 start, u64 end, + u64 size, u64 align) +{ + u64 base; + long j; + + base = lmb_align_down((end - size), align); + while (start = base + ((j = lmb_overlaps_region(lmb.reserved, base, size)) = 0)) + base = lmb_align_down(lmb.reserved.region[j].base - size, + align); + + if (base != 0 start = base) { + if (lmb_add_region(lmb.reserved, base, + lmb_align_up(size, align)) 0) + base = ~(u64)0; + return base; + } + + return ~(u64)0; +} + +static u64 __init lmb_alloc_nid_region(struct lmb_property *mp, + u64 (*nid_range)(u64, u64, int *), + u64 size, u64 align, int nid) +{ + u64 start, end; + + start = mp-base; + end = start + mp-size; + + start = lmb_align_up(start, align); + while (start end) { + u64 this_end; + int this_nid; + + this_end = nid_range(start, end, this_nid); + if (this_nid == nid) { + u64 ret = lmb_alloc_nid_unreserved(start, this_end, + size, align); + if (ret != ~(u64)0) + return ret; + } + start = this_end; + } + + return ~(u64)0; +} + +u64 __init lmb_alloc_nid(u64 size, u64 align, int nid, +u64 (*nid_range)(u64 start, u64 end, int *nid)) +{ + struct lmb_region *mem = lmb.memory; + int i; + + for (i = 0; i mem-cnt; i++) { + u64 ret = lmb_alloc_nid_region(mem-region[i], + nid_range, + size, align, nid); + if (ret != ~(u64)0) + return ret; + } + + return lmb_alloc(size, align); +} + u64 __init lmb_alloc(u64 size, u64 align) { return lmb_alloc_base(size, align, LMB_ALLOC_ANYWHERE); @@ -250,16 +326,6 @@ u64 __init lmb_alloc_base(u64 size, u64 return alloc; } -static u64 lmb_align_down(u64 addr, u64 size) -{ - return addr ~(size - 1); -} - -static u64 lmb_align_up(u64 addr, u64 size) -{ - return (addr + (size - 1)) ~(size - 1); -} - u64 __init __lmb_alloc_base(u64 size, u64 align, u64 max_addr) { long i, j; _
- add-missing-data_data-in-powerpc.patch removed from -mm tree
The patch titled powerpc: add missing DATA_DATA has been removed from the -mm tree. Its filename was add-missing-data_data-in-powerpc.patch This patch was dropped because it was merged into mainline or a subsystem tree -- Subject: powerpc: add missing DATA_DATA From: Mathieu Desnoyers [EMAIL PROTECTED] Signed-off-by: Mathieu Desnoyers [EMAIL PROTECTED] Cc: [EMAIL PROTECTED] Cc: linuxppc-dev@ozlabs.org Signed-off-by: Andrew Morton [EMAIL PROTECTED] --- arch/powerpc/kernel/vmlinux.lds.S |4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) diff -puN arch/powerpc/kernel/vmlinux.lds.S~add-missing-data_data-in-powerpc arch/powerpc/kernel/vmlinux.lds.S --- a/arch/powerpc/kernel/vmlinux.lds.S~add-missing-data_data-in-powerpc +++ a/arch/powerpc/kernel/vmlinux.lds.S @@ -174,7 +174,9 @@ SECTIONS } #else .data : { - *(.data .data.rel* .toc1) + DATA_DATA + *(.data.rel*) + *(.toc1) *(.branch_lt) } _ Patches currently in -mm which might be from [EMAIL PROTECTED] are origin.patch git-kbuild.patch ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev