Message ID | 20211206104657.433304-11-alexandre.ghiti@canonical.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Introduce sv48 support without relocatable kernel | expand |
Hi Alex, On 2021/12/6 18:46, Alexandre Ghiti wrote: > With the arrival of sv48 and its large address space, it would be > cumbersome to statically define the unit size to use to print the different > portions of the virtual memory layout: instead, determine it dynamically. > > Signed-off-by: Alexandre Ghiti <alexandre.ghiti@canonical.com> > --- > arch/riscv/mm/init.c | 67 +++++++++++++++++++++++------- > drivers/pci/controller/pci-xgene.c | 2 +- > include/linux/sizes.h | 1 + > 3 files changed, 54 insertions(+), 16 deletions(-) > > diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c > index 6a19a1b1caf8..28de6ea0a720 100644 > --- a/arch/riscv/mm/init.c > +++ b/arch/riscv/mm/init.c > @@ -79,37 +79,74 @@ static void __init zone_sizes_init(void) > } > > #if defined(CONFIG_MMU) && defined(CONFIG_DEBUG_VM) > + > +#define LOG2_SZ_1K ilog2(SZ_1K) > +#define LOG2_SZ_1M ilog2(SZ_1M) > +#define LOG2_SZ_1G ilog2(SZ_1G) > +#define LOG2_SZ_1T ilog2(SZ_1T) > + > static inline void print_mlk(char *name, unsigned long b, unsigned long t) > { > pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld kB)\n", name, b, t, > - (((t) - (b)) >> 10)); > + (((t) - (b)) >> LOG2_SZ_1K)); > } > > static inline void print_mlm(char *name, unsigned long b, unsigned long t) > { > pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld MB)\n", name, b, t, > - (((t) - (b)) >> 20)); > + (((t) - (b)) >> LOG2_SZ_1M)); > +} > + > +static inline void print_mlg(char *name, unsigned long b, unsigned long t) > +{ > + pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld GB)\n", name, b, t, > + (((t) - (b)) >> LOG2_SZ_1G)); > +} > + > +#ifdef CONFIG_64BIT > +static inline void print_mlt(char *name, unsigned long b, unsigned long t) > +{ > + pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld TB)\n", name, b, t, > + (((t) - (b)) >> LOG2_SZ_1T)); > +} > +#endif > + > +static inline void print_ml(char *name, unsigned long b, unsigned long t) > +{ > + unsigned long diff = t - b; > + > +#ifdef CONFIG_64BIT > + if ((diff >> LOG2_SZ_1T) >= 10) > + print_mlt(name, b, t); > + else > +#endif > + if ((diff >> LOG2_SZ_1G) >= 10) > + print_mlg(name, b, t); > + else if ((diff >> LOG2_SZ_1M) >= 10) > + print_mlm(name, b, t); > + else > + print_mlk(name, b, t); > } > > static void __init print_vm_layout(void) > { > pr_notice("Virtual kernel memory layout:\n"); > - print_mlk("fixmap", (unsigned long)FIXADDR_START, > - (unsigned long)FIXADDR_TOP); > - print_mlm("pci io", (unsigned long)PCI_IO_START, > - (unsigned long)PCI_IO_END); > - print_mlm("vmemmap", (unsigned long)VMEMMAP_START, > - (unsigned long)VMEMMAP_END); > - print_mlm("vmalloc", (unsigned long)VMALLOC_START, > - (unsigned long)VMALLOC_END); > - print_mlm("lowmem", (unsigned long)PAGE_OFFSET, > - (unsigned long)high_memory); > + print_ml("fixmap", (unsigned long)FIXADDR_START, > + (unsigned long)FIXADDR_TOP); > + print_ml("pci io", (unsigned long)PCI_IO_START, > + (unsigned long)PCI_IO_END); > + print_ml("vmemmap", (unsigned long)VMEMMAP_START, > + (unsigned long)VMEMMAP_END); > + print_ml("vmalloc", (unsigned long)VMALLOC_START, > + (unsigned long)VMALLOC_END); > + print_ml("lowmem", (unsigned long)PAGE_OFFSET, > + (unsigned long)high_memory); > #ifdef CONFIG_64BIT > #ifdef CONFIG_KASAN > - print_mlm("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END); > + print_ml("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END); > #endif > - print_mlm("kernel", (unsigned long)KERNEL_LINK_ADDR, > - (unsigned long)ADDRESS_SPACE_END); > + print_ml("kernel", (unsigned long)KERNEL_LINK_ADDR, > + (unsigned long)ADDRESS_SPACE_END); > #endif > } > #else > diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c > index e64536047b65..187dcf8a9694 100644 > --- a/drivers/pci/controller/pci-xgene.c > +++ b/drivers/pci/controller/pci-xgene.c > @@ -21,6 +21,7 @@ > #include <linux/pci-ecam.h> > #include <linux/platform_device.h> > #include <linux/slab.h> > +#include <linux/sizes.h> > > #include "../pci.h" > > @@ -50,7 +51,6 @@ > #define OB_LO_IO 0x00000002 > #define XGENE_PCIE_VENDORID 0x10E8 > #define XGENE_PCIE_DEVICEID 0xE004 > -#define SZ_1T (SZ_1G*1024ULL) I am trying to apply your patchset on upstream's master or for-next branch. The git repo is git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git and I get a failure. The commit which I apply on is fa55b7dcdc43c1aa1ba12bca9d2dd4318c2a0dbf I found the code here on that commit is: #define OB_LO_IO 0x00000002 #define XGENE_PCIE_DEVICEID 0xE004 #define SZ_1T (SZ_1G*1024ULL) #define PIPE_PHY_RATE_RD(src) ((0xc000 & (u32)(src)) >> 0xe) I think it may be the reason why the apply is failed. May I get your help to determine the reason? Thanks, Qinglin > > #define PIPE_PHY_RATE_RD(src) ((0xc000 & (u32)(src)) >> 0xe) > > #define XGENE_V1_PCI_EXP_CAP 0x40 > diff --git a/include/linux/sizes.h b/include/linux/sizes.h > index 1ac79bcee2bb..0bc6cf394b08 100644 > --- a/include/linux/sizes.h > +++ b/include/linux/sizes.h > @@ -47,6 +47,7 @@ > #define SZ_8G _AC(0x200000000, ULL) > #define SZ_16G _AC(0x400000000, ULL) > #define SZ_32G _AC(0x800000000, ULL) > +#define SZ_1T _AC(0x10000000000, ULL) > #define SZ_64T _AC(0x400000000000, ULL) > > #endif /* __LINUX_SIZES_H__ */
On 12/9/21 05:18, 潘庆霖 wrote: > Hi Alex, > > > On 2021/12/6 18:46, Alexandre Ghiti wrote: > > With the arrival of sv48 and its large address space, it would be > > cumbersome to statically define the unit size to use to print the > different > > portions of the virtual memory layout: instead, determine it > dynamically. > > > > Signed-off-by: Alexandre Ghiti <alexandre.ghiti@canonical.com> > > --- > > arch/riscv/mm/init.c | 67 +++++++++++++++++++++++------- > > drivers/pci/controller/pci-xgene.c | 2 +- > > include/linux/sizes.h | 1 + > > 3 files changed, 54 insertions(+), 16 deletions(-) > > > > diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c > > index 6a19a1b1caf8..28de6ea0a720 100644 > > --- a/arch/riscv/mm/init.c > > +++ b/arch/riscv/mm/init.c > > @@ -79,37 +79,74 @@ static void __init zone_sizes_init(void) > > } > > > > #if defined(CONFIG_MMU) && defined(CONFIG_DEBUG_VM) > > + > > +#define LOG2_SZ_1K ilog2(SZ_1K) > > +#define LOG2_SZ_1M ilog2(SZ_1M) > > +#define LOG2_SZ_1G ilog2(SZ_1G) > > +#define LOG2_SZ_1T ilog2(SZ_1T) > > + > > static inline void print_mlk(char *name, unsigned long b, unsigned > long t) > > { > > pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld kB)\n", name, b, t, > > - (((t) - (b)) >> 10)); > > + (((t) - (b)) >> LOG2_SZ_1K)); > > } > > > > static inline void print_mlm(char *name, unsigned long b, unsigned > long t) > > { > > pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld MB)\n", name, b, t, > > - (((t) - (b)) >> 20)); > > + (((t) - (b)) >> LOG2_SZ_1M)); > > +} > > + > > +static inline void print_mlg(char *name, unsigned long b, unsigned > long t) > > +{ > > + pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld GB)\n", name, b, t, > > + (((t) - (b)) >> LOG2_SZ_1G)); > > +} > > + > > +#ifdef CONFIG_64BIT > > +static inline void print_mlt(char *name, unsigned long b, unsigned > long t) > > +{ > > + pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld TB)\n", name, b, t, > > + (((t) - (b)) >> LOG2_SZ_1T)); > > +} > > +#endif > > + > > +static inline void print_ml(char *name, unsigned long b, unsigned > long t) > > +{ > > + unsigned long diff = t - b; > > + > > +#ifdef CONFIG_64BIT > > + if ((diff >> LOG2_SZ_1T) >= 10) > > + print_mlt(name, b, t); > > + else > > +#endif > > + if ((diff >> LOG2_SZ_1G) >= 10) > > + print_mlg(name, b, t); > > + else if ((diff >> LOG2_SZ_1M) >= 10) > > + print_mlm(name, b, t); > > + else > > + print_mlk(name, b, t); > > } > > > > static void __init print_vm_layout(void) > > { > > pr_notice("Virtual kernel memory layout:\n"); > > - print_mlk("fixmap", (unsigned long)FIXADDR_START, > > - (unsigned long)FIXADDR_TOP); > > - print_mlm("pci io", (unsigned long)PCI_IO_START, > > - (unsigned long)PCI_IO_END); > > - print_mlm("vmemmap", (unsigned long)VMEMMAP_START, > > - (unsigned long)VMEMMAP_END); > > - print_mlm("vmalloc", (unsigned long)VMALLOC_START, > > - (unsigned long)VMALLOC_END); > > - print_mlm("lowmem", (unsigned long)PAGE_OFFSET, > > - (unsigned long)high_memory); > > + print_ml("fixmap", (unsigned long)FIXADDR_START, > > + (unsigned long)FIXADDR_TOP); > > + print_ml("pci io", (unsigned long)PCI_IO_START, > > + (unsigned long)PCI_IO_END); > > + print_ml("vmemmap", (unsigned long)VMEMMAP_START, > > + (unsigned long)VMEMMAP_END); > > + print_ml("vmalloc", (unsigned long)VMALLOC_START, > > + (unsigned long)VMALLOC_END); > > + print_ml("lowmem", (unsigned long)PAGE_OFFSET, > > + (unsigned long)high_memory); > > #ifdef CONFIG_64BIT > > #ifdef CONFIG_KASAN > > - print_mlm("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END); > > + print_ml("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END); > > #endif > > - print_mlm("kernel", (unsigned long)KERNEL_LINK_ADDR, > > - (unsigned long)ADDRESS_SPACE_END); > > + print_ml("kernel", (unsigned long)KERNEL_LINK_ADDR, > > + (unsigned long)ADDRESS_SPACE_END); > > #endif > > } > > #else > > diff --git a/drivers/pci/controller/pci-xgene.c > b/drivers/pci/controller/pci-xgene.c > > index e64536047b65..187dcf8a9694 100644 > > --- a/drivers/pci/controller/pci-xgene.c > > +++ b/drivers/pci/controller/pci-xgene.c > > @@ -21,6 +21,7 @@ > > #include <linux/pci-ecam.h> > > #include <linux/platform_device.h> > > #include <linux/slab.h> > > +#include <linux/sizes.h> > > > > #include "../pci.h" > > > > @@ -50,7 +51,6 @@ > > #define OB_LO_IO 0x00000002 > > #define XGENE_PCIE_VENDORID 0x10E8 > > #define XGENE_PCIE_DEVICEID 0xE004 > > -#define SZ_1T (SZ_1G*1024ULL) > > I am trying to apply your patchset on upstream's master or for-next > branch. The git repo is > > git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git > > and I get a failure. The commit which I apply on is > fa55b7dcdc43c1aa1ba12bca9d2dd4318c2a0dbf > > I found the code here on that commit is: > > #define OB_LO_IO 0x00000002 > #define XGENE_PCIE_DEVICEID 0xE004 > #define SZ_1T (SZ_1G*1024ULL) > #define PIPE_PHY_RATE_RD(src) ((0xc000 & (u32)(src)) >> 0xe) > > I think it may be the reason why the apply is failed. May I get your > help to determine the reason? I will rebase my patchset on top of v5.16-rc4 shortly, I will fix that, this file changed in the meantime. Thanks, Alex > > Thanks, > Qinglin > > > > > > #define PIPE_PHY_RATE_RD(src) ((0xc000 & (u32)(src)) >> 0xe) > > > > #define XGENE_V1_PCI_EXP_CAP 0x40 > > diff --git a/include/linux/sizes.h b/include/linux/sizes.h > > index 1ac79bcee2bb..0bc6cf394b08 100644 > > --- a/include/linux/sizes.h > > +++ b/include/linux/sizes.h > > @@ -47,6 +47,7 @@ > > #define SZ_8G _AC(0x200000000, ULL) > > #define SZ_16G _AC(0x400000000, ULL) > > #define SZ_32G _AC(0x800000000, ULL) > > +#define SZ_1T _AC(0x10000000000, ULL) > > #define SZ_64T _AC(0x400000000000, ULL) > > > > #endif /* __LINUX_SIZES_H__ */ > > > _______________________________________________ > linux-riscv mailing list > linux-riscv@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-riscv
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 6a19a1b1caf8..28de6ea0a720 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -79,37 +79,74 @@ static void __init zone_sizes_init(void) } #if defined(CONFIG_MMU) && defined(CONFIG_DEBUG_VM) + +#define LOG2_SZ_1K ilog2(SZ_1K) +#define LOG2_SZ_1M ilog2(SZ_1M) +#define LOG2_SZ_1G ilog2(SZ_1G) +#define LOG2_SZ_1T ilog2(SZ_1T) + static inline void print_mlk(char *name, unsigned long b, unsigned long t) { pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld kB)\n", name, b, t, - (((t) - (b)) >> 10)); + (((t) - (b)) >> LOG2_SZ_1K)); } static inline void print_mlm(char *name, unsigned long b, unsigned long t) { pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld MB)\n", name, b, t, - (((t) - (b)) >> 20)); + (((t) - (b)) >> LOG2_SZ_1M)); +} + +static inline void print_mlg(char *name, unsigned long b, unsigned long t) +{ + pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld GB)\n", name, b, t, + (((t) - (b)) >> LOG2_SZ_1G)); +} + +#ifdef CONFIG_64BIT +static inline void print_mlt(char *name, unsigned long b, unsigned long t) +{ + pr_notice("%12s : 0x%08lx - 0x%08lx (%4ld TB)\n", name, b, t, + (((t) - (b)) >> LOG2_SZ_1T)); +} +#endif + +static inline void print_ml(char *name, unsigned long b, unsigned long t) +{ + unsigned long diff = t - b; + +#ifdef CONFIG_64BIT + if ((diff >> LOG2_SZ_1T) >= 10) + print_mlt(name, b, t); + else +#endif + if ((diff >> LOG2_SZ_1G) >= 10) + print_mlg(name, b, t); + else if ((diff >> LOG2_SZ_1M) >= 10) + print_mlm(name, b, t); + else + print_mlk(name, b, t); } static void __init print_vm_layout(void) { pr_notice("Virtual kernel memory layout:\n"); - print_mlk("fixmap", (unsigned long)FIXADDR_START, - (unsigned long)FIXADDR_TOP); - print_mlm("pci io", (unsigned long)PCI_IO_START, - (unsigned long)PCI_IO_END); - print_mlm("vmemmap", (unsigned long)VMEMMAP_START, - (unsigned long)VMEMMAP_END); - print_mlm("vmalloc", (unsigned long)VMALLOC_START, - (unsigned long)VMALLOC_END); - print_mlm("lowmem", (unsigned long)PAGE_OFFSET, - (unsigned long)high_memory); + print_ml("fixmap", (unsigned long)FIXADDR_START, + (unsigned long)FIXADDR_TOP); + print_ml("pci io", (unsigned long)PCI_IO_START, + (unsigned long)PCI_IO_END); + print_ml("vmemmap", (unsigned long)VMEMMAP_START, + (unsigned long)VMEMMAP_END); + print_ml("vmalloc", (unsigned long)VMALLOC_START, + (unsigned long)VMALLOC_END); + print_ml("lowmem", (unsigned long)PAGE_OFFSET, + (unsigned long)high_memory); #ifdef CONFIG_64BIT #ifdef CONFIG_KASAN - print_mlm("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END); + print_ml("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END); #endif - print_mlm("kernel", (unsigned long)KERNEL_LINK_ADDR, - (unsigned long)ADDRESS_SPACE_END); + print_ml("kernel", (unsigned long)KERNEL_LINK_ADDR, + (unsigned long)ADDRESS_SPACE_END); #endif } #else diff --git a/drivers/pci/controller/pci-xgene.c b/drivers/pci/controller/pci-xgene.c index e64536047b65..187dcf8a9694 100644 --- a/drivers/pci/controller/pci-xgene.c +++ b/drivers/pci/controller/pci-xgene.c @@ -21,6 +21,7 @@ #include <linux/pci-ecam.h> #include <linux/platform_device.h> #include <linux/slab.h> +#include <linux/sizes.h> #include "../pci.h" @@ -50,7 +51,6 @@ #define OB_LO_IO 0x00000002 #define XGENE_PCIE_VENDORID 0x10E8 #define XGENE_PCIE_DEVICEID 0xE004 -#define SZ_1T (SZ_1G*1024ULL) #define PIPE_PHY_RATE_RD(src) ((0xc000 & (u32)(src)) >> 0xe) #define XGENE_V1_PCI_EXP_CAP 0x40 diff --git a/include/linux/sizes.h b/include/linux/sizes.h index 1ac79bcee2bb..0bc6cf394b08 100644 --- a/include/linux/sizes.h +++ b/include/linux/sizes.h @@ -47,6 +47,7 @@ #define SZ_8G _AC(0x200000000, ULL) #define SZ_16G _AC(0x400000000, ULL) #define SZ_32G _AC(0x800000000, ULL) +#define SZ_1T _AC(0x10000000000, ULL) #define SZ_64T _AC(0x400000000000, ULL) #endif /* __LINUX_SIZES_H__ */
With the arrival of sv48 and its large address space, it would be cumbersome to statically define the unit size to use to print the different portions of the virtual memory layout: instead, determine it dynamically. Signed-off-by: Alexandre Ghiti <alexandre.ghiti@canonical.com> --- arch/riscv/mm/init.c | 67 +++++++++++++++++++++++------- drivers/pci/controller/pci-xgene.c | 2 +- include/linux/sizes.h | 1 + 3 files changed, 54 insertions(+), 16 deletions(-)