void detect_memory(void);
 void store_ipl_parmblock(void);
 void setup_boot_command_line(void);
+void parse_boot_command_line(void);
 void setup_memory_end(void);
 
 #endif /* BOOT_BOOT_H */
 
 #include <asm/sclp.h>
 #include <asm/sections.h>
 #include <asm/boot_data.h>
+#include <asm/facility.h>
 #include "boot.h"
 
 char __bootdata(early_command_line)[COMMAND_LINE_SIZE];
                append_ipl_block_parm();
 }
 
+static void modify_facility(unsigned long nr, bool clear)
+{
+       if (clear)
+               __clear_facility(nr, S390_lowcore.stfle_fac_list);
+       else
+               __set_facility(nr, S390_lowcore.stfle_fac_list);
+}
+
+static void modify_fac_list(char *str)
+{
+       unsigned long val, endval;
+       char *endp;
+       bool clear;
+
+       while (*str) {
+               clear = false;
+               if (*str == '!') {
+                       clear = true;
+                       str++;
+               }
+               val = simple_strtoull(str, &endp, 0);
+               if (str == endp)
+                       break;
+               str = endp;
+               if (*str == '-') {
+                       str++;
+                       endval = simple_strtoull(str, &endp, 0);
+                       if (str == endp)
+                               break;
+                       str = endp;
+                       while (val <= endval) {
+                               modify_facility(val, clear);
+                               val++;
+                       }
+               } else {
+                       modify_facility(val, clear);
+               }
+               if (*str != ',')
+                       break;
+               str++;
+       }
+}
+
 static char command_line_buf[COMMAND_LINE_SIZE] __section(.data);
-static void parse_mem_opt(void)
+void parse_boot_command_line(void)
 {
        char *param, *val;
        bool enabled;
                        if (!rc && !enabled)
                                noexec_disabled = 1;
                }
+
+               if (!strcmp(param, "facilities"))
+                       modify_fac_list(val);
        }
 }
 
 void setup_memory_end(void)
 {
-       parse_mem_opt();
 #ifdef CONFIG_CRASH_DUMP
        if (!OLDMEM_BASE && early_ipl_block_valid &&
            early_ipl_block.hdr.pbt == DIAG308_IPL_TYPE_FCP &&