Merge branch 'for-linus' into for-next
[cascardo/linux.git] / arch / powerpc / kernel / prom_init.c
index 15099c4..92dea8d 100644 (file)
@@ -1425,27 +1425,45 @@ static void __init prom_instantiate_sml(void)
 {
        phandle ibmvtpm_node;
        ihandle ibmvtpm_inst;
-       u32 entry = 0, size = 0;
+       u32 entry = 0, size = 0, succ = 0;
        u64 base;
+       __be32 val;
 
        prom_debug("prom_instantiate_sml: start...\n");
 
-       ibmvtpm_node = call_prom("finddevice", 1, 1, ADDR("/ibm,vtpm"));
+       ibmvtpm_node = call_prom("finddevice", 1, 1, ADDR("/vdevice/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"));
+       ibmvtpm_inst = call_prom("open", 1, 1, ADDR("/vdevice/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;
+       if (prom_getprop(ibmvtpm_node, "ibm,sml-efi-reformat-supported",
+                        &val, sizeof(val)) != PROM_ERROR) {
+               if (call_prom_ret("call-method", 2, 2, &succ,
+                                 ADDR("reformat-sml-to-efi-alignment"),
+                                 ibmvtpm_inst) != 0 || succ == 0) {
+                       prom_printf("Reformat SML to EFI alignment failed\n");
+                       return;
+               }
+
+               if (call_prom_ret("call-method", 2, 2, &size,
+                                 ADDR("sml-get-allocated-size"),
+                                 ibmvtpm_inst) != 0 || size == 0) {
+                       prom_printf("SML get allocated size failed\n");
+                       return;
+               }
+       } else {
+               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);
@@ -1454,6 +1472,8 @@ static void __init prom_instantiate_sml(void)
 
        prom_printf("instantiating sml at 0x%x...", base);
 
+       memset((void *)base, 0, size);
+
        if (call_prom_ret("call-method", 4, 2, &entry,
                          ADDR("sml-handover"),
                          ibmvtpm_inst, size, base) != 0 || entry == 0) {
@@ -1464,9 +1484,9 @@ static void __init prom_instantiate_sml(void)
 
        reserve_mem(base, size);
 
-       prom_setprop(ibmvtpm_node, "/ibm,vtpm", "linux,sml-base",
+       prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-base",
                     &base, sizeof(base));
-       prom_setprop(ibmvtpm_node, "/ibm,vtpm", "linux,sml-size",
+       prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-size",
                     &size, sizeof(size));
 
        prom_debug("sml base     = 0x%x\n", base);