hisax=          [HW,ISDN]
                        See Documentation/isdn/README.HiSax.
 
-       hugepages=      [HW,X86-32,IA-64] Maximal number of HugeTLB pages.
-       hugepagesz=     [HW,IA-64,PPC] The size of the HugeTLB pages.
+       hugepages=      [HW,X86-32,IA-64] HugeTLB pages to allocate at boot.
+       hugepagesz=     [HW,IA-64,PPC,X86-64] The size of the HugeTLB pages.
+                       On x86 this option can be specified multiple times
+                       interleaved with hugepages= to reserve huge pages
+                       of different sizes. Valid pages sizes on x86-64
+                       are 2M (when the CPU supports "pse") and 1G (when the
+                       CPU supports the "pdpe1gb" cpuinfo flag)
+                       Note that 1GB pages can only be allocated at boot time
+                       using hugepages= and not freed afterwards.
 
        i8042.direct    [HW] Put keyboard port into non-translated mode
        i8042.dumbkbd   [HW] Pretend that controller can only read data from
 
 
 #endif /*HAVE_ARCH_HUGETLB_UNMAPPED_AREA*/
 
+#ifdef CONFIG_X86_64
+static __init int setup_hugepagesz(char *opt)
+{
+       unsigned long ps = memparse(opt, &opt);
+       if (ps == PMD_SIZE) {
+               hugetlb_add_hstate(PMD_SHIFT - PAGE_SHIFT);
+       } else if (ps == PUD_SIZE && cpu_has_gbpages) {
+               hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT);
+       } else {
+               printk(KERN_ERR "hugepagesz: Unsupported page size %lu M\n",
+                       ps >> 20);
+               return 0;
+       }
+       return 1;
+}
+__setup("hugepagesz=", setup_hugepagesz);
+#endif
 
 #define HPAGE_MASK             (~(HPAGE_SIZE - 1))
 #define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT - PAGE_SHIFT)
 
+#define HUGE_MAX_HSTATE 2
+
 /* to align the pointer to the (next) page boundary */
 #define PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)