]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - arch/powerpc/kernel/prom_init.c
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
[karo-tx-linux.git] / arch / powerpc / kernel / prom_init.c
index ce68278a5d73108dfb67b9e2a2035da2e172a224..cb6c123722a214691d7c99519a08a5aa27e95577 100644 (file)
@@ -705,6 +705,7 @@ static void __init early_cmdline_parse(void)
 #endif
 #define OV5_TYPE1_AFFINITY     0x80    /* Type 1 NUMA affinity */
 #define OV5_PFO_HW_RNG         0x80    /* PFO Random Number Generator */
+#define OV5_PFO_HW_842         0x40    /* PFO Compression Accelerator */
 #define OV5_PFO_HW_ENCR                0x20    /* PFO Encryption Accelerator */
 
 /* Option Vector 6: IBM PAPR hints */
@@ -774,8 +775,7 @@ static unsigned char ibm_architecture_vec[] = {
        0,
        0,
        0,
-       OV5_PFO_HW_RNG | OV5_PFO_HW_ENCR,
-
+       OV5_PFO_HW_RNG | OV5_PFO_HW_ENCR | OV5_PFO_HW_842,
        /* option vector 6: IBM PAPR hints */
        4 - 2,                          /* length */
        0,
@@ -1623,6 +1623,63 @@ static void __init prom_instantiate_rtas(void)
 }
 
 #ifdef CONFIG_PPC64
+/*
+ * Allocate room for and instantiate Stored Measurement Log (SML)
+ */
+static void __init prom_instantiate_sml(void)
+{
+       phandle ibmvtpm_node;
+       ihandle ibmvtpm_inst;
+       u32 entry = 0, size = 0;
+       u64 base;
+
+       prom_debug("prom_instantiate_sml: start...\n");
+
+       ibmvtpm_node = call_prom("finddevice", 1, 1, ADDR("/ibm,vtpm"));
+       prom_debug("ibmvtpm_node: %x\n", ibmvtpm_node);
+       if (!PHANDLE_VALID(ibmvtpm_node))
+               return;
+
+       ibmvtpm_inst = call_prom("open", 1, 1, ADDR("/ibm,vtpm"));
+       if (!IHANDLE_VALID(ibmvtpm_inst)) {
+               prom_printf("opening vtpm package failed (%x)\n", ibmvtpm_inst);
+               return;
+       }
+
+       if (call_prom_ret("call-method", 2, 2, &size,
+                         ADDR("sml-get-handover-size"),
+                         ibmvtpm_inst) != 0 || size == 0) {
+               prom_printf("SML get handover size failed\n");
+               return;
+       }
+
+       base = alloc_down(size, PAGE_SIZE, 0);
+       if (base == 0)
+               prom_panic("Could not allocate memory for sml\n");
+
+       prom_printf("instantiating sml at 0x%x...", base);
+
+       if (call_prom_ret("call-method", 4, 2, &entry,
+                         ADDR("sml-handover"),
+                         ibmvtpm_inst, size, base) != 0 || entry == 0) {
+               prom_printf("SML handover failed\n");
+               return;
+       }
+       prom_printf(" done\n");
+
+       reserve_mem(base, size);
+
+       prom_setprop(ibmvtpm_node, "/ibm,vtpm", "linux,sml-base",
+                    &base, sizeof(base));
+       prom_setprop(ibmvtpm_node, "/ibm,vtpm", "linux,sml-size",
+                    &size, sizeof(size));
+
+       prom_debug("sml base     = 0x%x\n", base);
+       prom_debug("sml size     = 0x%x\n", (long)size);
+
+       prom_debug("prom_instantiate_sml: end...\n");
+}
+
 /*
  * Allocate room for and initialize TCE tables
  */
@@ -2916,6 +2973,11 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
                prom_instantiate_opal();
 #endif
 
+#ifdef CONFIG_PPC64
+       /* instantiate sml */
+       prom_instantiate_sml();
+#endif
+
        /*
         * On non-powermacs, put all CPUs in spin-loops.
         *