#include <asm/cpu_ops.h>
+struct parking_protocol_mailbox {
+ __le32 cpu_id;
+ __le32 reserved;
+ __le64 entry_point;
+};
+
struct cpu_mailbox_entry {
+ struct parking_protocol_mailbox __iomem *mailbox;
phys_addr_t mailbox_addr;
u8 version;
u8 gic_cpu_id;
return 0;
}
-struct parking_protocol_mailbox {
- __le32 cpu_id;
- __le32 reserved;
- __le64 entry_point;
-};
-
static int acpi_parking_protocol_cpu_boot(unsigned int cpu)
{
struct cpu_mailbox_entry *cpu_entry = &cpu_mailbox_entries[cpu];
return -ENXIO;
}
+ /*
+ * stash the mailbox address mapping to use it for further FW
+ * checks in the postboot method
+ */
+ cpu_entry->mailbox = mailbox;
+
/*
* We write the entry point and cpu id as LE regardless of the
* native endianness of the kernel. Therefore, any boot-loaders
arch_send_wakeup_ipi_mask(cpumask_of(cpu));
- iounmap(mailbox);
-
return 0;
}
{
int cpu = smp_processor_id();
struct cpu_mailbox_entry *cpu_entry = &cpu_mailbox_entries[cpu];
- struct parking_protocol_mailbox __iomem *mailbox;
+ struct parking_protocol_mailbox __iomem *mailbox = cpu_entry->mailbox;
__le64 entry_point;
- /*
- * Map mailbox memory with attribute device nGnRE (ie ioremap -
- * this deviates from the parking protocol specifications since
- * the mailboxes are required to be mapped nGnRnE; the attribute
- * discrepancy is harmless insofar as the protocol specification
- * is concerned).
- * If the mailbox is mistakenly allocated in the linear mapping
- * by FW ioremap will fail since the mapping will be prevented
- * by the kernel (it clashes with the linear mapping attributes
- * specifications).
- */
- mailbox = ioremap(cpu_entry->mailbox_addr, sizeof(*mailbox));
- if (!mailbox)
- return;
-
entry_point = readl_relaxed(&mailbox->entry_point);
/*
* Check if firmware has cleared the entry_point as expected
* by the protocol specification.
*/
WARN_ON(entry_point);
-
- iounmap(mailbox);
}
const struct cpu_operations acpi_parking_protocol_ops = {