On Sat, 2022-11-05 at 04:27 +1100, Andrew Donnellan wrote: > A number of OPAL calls take addresses as arguments (e.g. buffers with > strings to print, etc). These addresses need to be physical > addresses, as > OPAL runs in real mode. > > Since the hardware ignores the top two bits of the address in real > mode, > passing addresses in the kernel's linear map works fine even if we > don't > wrap them in __pa(). > > With VMAP_STACK, however, we're going to have to use > vmalloc_to_phys() to > convert addresses from the stack into an address that OPAL can use. > > Introduce a new macro, stack_pa(), that uses vmalloc_to_phys() for > addresses in the vmalloc area, and __pa() for linear map addresses. > Add it > to all the existing callsites where we pass pointers to OPAL. > > Signed-off-by: Andrew Donnellan <a...@linux.ibm.com> > --- > arch/powerpc/kvm/book3s_hv_builtin.c | 2 +- > arch/powerpc/platforms/powernv/eeh-powernv.c | 20 ++++++----- > arch/powerpc/platforms/powernv/ocxl.c | 3 +- > arch/powerpc/platforms/powernv/opal-core.c | 4 +-- > arch/powerpc/platforms/powernv/opal-dump.c | 6 ++-- > arch/powerpc/platforms/powernv/opal-elog.c | 10 +++--- > arch/powerpc/platforms/powernv/opal-fadump.c | 12 +++---- > arch/powerpc/platforms/powernv/opal-flash.c | 5 +-- > arch/powerpc/platforms/powernv/opal-hmi.c | 3 +- > arch/powerpc/platforms/powernv/opal-irqchip.c | 4 +-- > arch/powerpc/platforms/powernv/opal-lpc.c | 8 ++--- > arch/powerpc/platforms/powernv/opal-nvram.c | 4 +-- > arch/powerpc/platforms/powernv/opal-power.c | 4 +-- > .../powerpc/platforms/powernv/opal-powercap.c | 2 +- > arch/powerpc/platforms/powernv/opal-prd.c | 6 ++-- > arch/powerpc/platforms/powernv/opal-psr.c | 2 +- > arch/powerpc/platforms/powernv/opal-rtc.c | 2 +- > arch/powerpc/platforms/powernv/opal-secvar.c | 9 +++-- > arch/powerpc/platforms/powernv/opal-sensor.c | 4 +-- > .../powerpc/platforms/powernv/opal-sysparam.c | 4 +-- > arch/powerpc/platforms/powernv/opal-xscom.c | 2 +- > arch/powerpc/platforms/powernv/opal.c | 16 ++++----- > arch/powerpc/platforms/powernv/pci-ioda.c | 14 ++++---- > arch/powerpc/platforms/powernv/pci.c | 25 +++++++------- > arch/powerpc/platforms/powernv/setup.c | 2 +- > arch/powerpc/platforms/powernv/smp.c | 2 +- > arch/powerpc/sysdev/xics/icp-opal.c | 2 +- > arch/powerpc/sysdev/xics/ics-opal.c | 8 ++--- > arch/powerpc/sysdev/xive/native.c | 33 ++++++++++++----- > -- > drivers/char/ipmi/ipmi_powernv.c | 6 ++-- > drivers/char/powernv-op-panel.c | 2 +- > drivers/i2c/busses/i2c-opal.c | 2 +- > drivers/leds/leds-powernv.c | 6 ++-- > drivers/mtd/devices/powernv_flash.c | 4 +-- > drivers/rtc/rtc-opal.c | 4 +-- > 35 files changed, 135 insertions(+), 107 deletions(-) > > diff --git a/arch/powerpc/kvm/book3s_hv_builtin.c > b/arch/powerpc/kvm/book3s_hv_builtin.c > index da85f046377a..dba041d659d2 100644 > --- a/arch/powerpc/kvm/book3s_hv_builtin.c > +++ b/arch/powerpc/kvm/book3s_hv_builtin.c > @@ -414,7 +414,7 @@ static long kvmppc_read_one_intr(bool *again) > xics_phys = local_paca->kvm_hstate.xics_phys; > rc = 0; > if (!xics_phys) > - rc = opal_int_get_xirr(&xirr, false); > + rc = opal_int_get_xirr(stack_pa(&xirr), false); > else > xirr = __raw_rm_readl(xics_phys + XICS_XIRR); > if (rc < 0) > diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c > b/arch/powerpc/platforms/powernv/eeh-powernv.c > index a83cb679dd59..f069aa28f969 100644 > --- a/arch/powerpc/platforms/powernv/eeh-powernv.c > +++ b/arch/powerpc/platforms/powernv/eeh-powernv.c > @@ -517,7 +517,7 @@ static void pnv_eeh_get_phb_diag(struct eeh_pe > *pe) > struct pnv_phb *phb = pe->phb->private_data; > s64 rc; > > - rc = opal_pci_get_phb_diag_data2(phb->opal_id, pe->data, > + rc = opal_pci_get_phb_diag_data2(phb->opal_id, stack_pa(pe- > >data), > phb->diag_data_size); > if (rc != OPAL_SUCCESS) > pr_warn("%s: Failure %lld getting PHB#%x diag- > data\n", > @@ -534,8 +534,8 @@ static int pnv_eeh_get_phb_state(struct eeh_pe > *pe) > > rc = opal_pci_eeh_freeze_status(phb->opal_id, > pe->addr, > - &fstate, > - &pcierr, > + stack_pa(&fstate), > + stack_pa(&pcierr), > NULL); > if (rc != OPAL_SUCCESS) { > pr_warn("%s: Failure %lld getting PHB#%x state\n", > @@ -594,8 +594,8 @@ static int pnv_eeh_get_pe_state(struct eeh_pe > *pe) > } else { > rc = opal_pci_eeh_freeze_status(phb->opal_id, > pe->addr, > - &fstate, > - &pcierr, > + stack_pa(&fstate), > + stack_pa(&pcierr), > NULL); > if (rc != OPAL_SUCCESS) { > pr_warn("%s: Failure %lld getting PHB#%x-PE%x > state\n", > @@ -1287,7 +1287,8 @@ static void > pnv_eeh_get_and_dump_hub_diag(struct pci_controller *hose) > (struct OpalIoP7IOCErrorData*)phb->diag_data; > long rc; > > - rc = opal_pci_get_hub_diag_data(phb->hub_id, data, > sizeof(*data)); > + rc = opal_pci_get_hub_diag_data(phb->hub_id, stack_pa(data), > + sizeof(*data)); > if (rc != OPAL_SUCCESS) { > pr_warn("%s: Failed to get HUB#%llx diag-data > (%ld)\n", > __func__, phb->hub_id, rc); > @@ -1432,7 +1433,9 @@ static int pnv_eeh_next_error(struct eeh_pe > **pe) > continue; > > rc = opal_pci_next_error(phb->opal_id, > - &frozen_pe_no, &err_type, > &severity); > + stack_pa(&frozen_pe_no), > + stack_pa(&err_type), > + stack_pa(&severity)); > if (rc != OPAL_SUCCESS) { > pr_devel("%s: Invalid return value on " > "PHB#%x (0x%lx) from > opal_pci_next_error", > @@ -1511,7 +1514,8 @@ static int pnv_eeh_next_error(struct eeh_pe > **pe) > > /* Dump PHB diag-data */ > rc = opal_pci_get_phb_diag_data2(phb- > >opal_id, > - phb->diag_data, phb- > >diag_data_size); > + > stack_pa(phb->diag_data), > + phb- > >diag_data_size); > if (rc == OPAL_SUCCESS) > pnv_pci_dump_phb_diag_data(ho > se, > phb- > >diag_data); > diff --git a/arch/powerpc/platforms/powernv/ocxl.c > b/arch/powerpc/platforms/powernv/ocxl.c > index 629067781cec..33d5b85df078 100644 > --- a/arch/powerpc/platforms/powernv/ocxl.c > +++ b/arch/powerpc/platforms/powernv/ocxl.c > @@ -450,7 +450,8 @@ int pnv_ocxl_spa_setup(struct pci_dev *dev, void > *spa_mem, int PE_mask, > return -ENOMEM; > > bdfn = (dev->bus->number << 8) | dev->devfn; > - rc = opal_npu_spa_setup(phb->opal_id, bdfn, > virt_to_phys(spa_mem), > + rc = opal_npu_spa_setup(phb->opal_id, bdfn, > + (uint64_t)stack_pa(spa_mem), > PE_mask); > if (rc) { > dev_err(&dev->dev, "Can't setup Shared Process Area: > %d\n", rc); > diff --git a/arch/powerpc/platforms/powernv/opal-core.c > b/arch/powerpc/platforms/powernv/opal-core.c > index bb7657115f1d..6a4a1fd9ec33 100644 > --- a/arch/powerpc/platforms/powernv/opal-core.c > +++ b/arch/powerpc/platforms/powernv/opal-core.c > @@ -475,7 +475,7 @@ static void __init opalcore_config_init(void) > } > > /* Get OPAL metadata */ > - ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_OPAL, &addr); > + ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_OPAL, > stack_pa(&addr)); > if ((ret != OPAL_SUCCESS) || !addr) { > pr_err("Failed to get OPAL metadata (%d)\n", ret); > goto error_out; > @@ -486,7 +486,7 @@ static void __init opalcore_config_init(void) > opalc_metadata = __va(addr); > > /* Get OPAL CPU metadata */ > - ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_CPU, &addr); > + ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_CPU, > stack_pa(&addr)); > if ((ret != OPAL_SUCCESS) || !addr) { > pr_err("Failed to get OPAL CPU metadata (%d)\n", > ret); > goto error_out; > diff --git a/arch/powerpc/platforms/powernv/opal-dump.c > b/arch/powerpc/platforms/powernv/opal-dump.c > index 16c5860f1372..9d48257988bc 100644 > --- a/arch/powerpc/platforms/powernv/opal-dump.c > +++ b/arch/powerpc/platforms/powernv/opal-dump.c > @@ -223,9 +223,9 @@ static int64_t dump_read_info(uint32_t *dump_id, > uint32_t *dump_size, uint32_t * > > type = cpu_to_be32(0xffffffff); > > - rc = opal_dump_info2(&id, &size, &type); > + rc = opal_dump_info2(stack_pa(&id), stack_pa(&size), > stack_pa(&type)); > if (rc == OPAL_PARAMETER) > - rc = opal_dump_info(&id, &size); > + rc = opal_dump_info(stack_pa(&id), stack_pa(&size)); > > if (rc) { > pr_warn("%s: Failed to get dump info (%d)\n", > @@ -262,7 +262,7 @@ static int64_t dump_read_data(struct dump_obj > *dump) > } > > /* First entry address */ > - addr = __pa(list); > + addr = (uint64_t)stack_pa(list); > > /* Fetch data */ > rc = OPAL_BUSY_EVENT; > diff --git a/arch/powerpc/platforms/powernv/opal-elog.c > b/arch/powerpc/platforms/powernv/opal-elog.c > index 554fdd7f88b8..8750d7729e7c 100644 > --- a/arch/powerpc/platforms/powernv/opal-elog.c > +++ b/arch/powerpc/platforms/powernv/opal-elog.c > @@ -169,7 +169,7 @@ static ssize_t raw_attr_read(struct file *filep, > struct kobject *kobj, > if (!elog->buffer) > return -EIO; > > - opal_rc = opal_read_elog(__pa(elog->buffer), > + opal_rc = opal_read_elog((uint64_t)stack_pa(elog- > >buffer), > elog->size, elog->id); > if (opal_rc != OPAL_SUCCESS) { > pr_err_ratelimited("ELOG: log read failed for > log-id=%llx\n", > @@ -212,8 +212,8 @@ static void create_elog_obj(uint64_t id, size_t > size, uint64_t type) > elog->buffer = kzalloc(elog->size, GFP_KERNEL); > > if (elog->buffer) { > - rc = opal_read_elog(__pa(elog->buffer), > - elog->size, elog->id); > + rc = opal_read_elog((uint64_t)stack_pa(elog->buffer), > + elog->size, elog->id); > if (rc != OPAL_SUCCESS) { > pr_err("ELOG: log read failed for log- > id=%llx\n", > elog->id); > @@ -270,7 +270,9 @@ static irqreturn_t elog_event(int irq, void > *data) > char name[2+16+1]; > struct kobject *kobj; > > - rc = opal_get_elog_size(&id, &size, &type); > + rc = opal_get_elog_size(stack_pa(&id), > + stack_pa(&size), > + stack_pa(&type)); > if (rc != OPAL_SUCCESS) { > pr_err("ELOG: OPAL log info read failed\n"); > return IRQ_HANDLED; > diff --git a/arch/powerpc/platforms/powernv/opal-fadump.c > b/arch/powerpc/platforms/powernv/opal-fadump.c > index 964f464b1b0e..d4bdf4540c1f 100644 > --- a/arch/powerpc/platforms/powernv/opal-fadump.c > +++ b/arch/powerpc/platforms/powernv/opal-fadump.c > @@ -47,7 +47,7 @@ void __init opal_fadump_dt_scan(struct fw_dump > *fadump_conf, u64 node) > if (!prop) > return; > > - ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_KERNEL, &addr); > + ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_KERNEL, > stack_pa(&addr)); > if ((ret != OPAL_SUCCESS) || !addr) { > pr_debug("Could not get Kernel metadata (%lld)\n", > ret); > return; > @@ -63,7 +63,7 @@ void __init opal_fadump_dt_scan(struct fw_dump > *fadump_conf, u64 node) > if (be16_to_cpu(opal_fdm_active->registered_regions) == 0) > return; > > - ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_BOOT_MEM, &addr); > + ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_BOOT_MEM, > stack_pa(&addr)); > if ((ret != OPAL_SUCCESS) || !addr) { > pr_err("Failed to get boot memory tag (%lld)\n", > ret); > return; > @@ -607,7 +607,7 @@ static void opal_fadump_trigger(struct > fadump_crash_info_header *fdh, > */ > fdh->crashing_cpu = (u32)mfspr(SPRN_PIR); > > - rc = opal_cec_reboot2(OPAL_REBOOT_MPIPL, msg); > + rc = opal_cec_reboot2(OPAL_REBOOT_MPIPL, stack_pa(msg));
Hi Andrew, some compilers cranky here: /linux/arch/powerpc/platforms/powernv/opal-fadump.c:610:52: error: passing 'const char *' to parameter of type 'void *' discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers] rc = opal_cec_reboot2(OPAL_REBOOT_MPIPL, stack_pa(msg)); ^~~ /linux/arch/powerpc/include/asm/book3s/64/stack.h:56:45: note: passing argument to parameter 'ptr' here static __always_inline void *stack_pa(void *ptr) > if (rc == OPAL_UNSUPPORTED) { > pr_emerg("Reboot type %d not supported.\n", > OPAL_REBOOT_MPIPL); > @@ -690,7 +690,7 @@ void __init opal_fadump_dt_scan(struct fw_dump > *fadump_conf, u64 node) > if (!prop) > return; > > - ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_KERNEL, &be_addr); > + ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_KERNEL, > stack_pa(&be_addr)); > if ((ret != OPAL_SUCCESS) || !be_addr) { > pr_err("Failed to get Kernel metadata (%lld)\n", > ret); > return; > @@ -712,8 +712,8 @@ void __init opal_fadump_dt_scan(struct fw_dump > *fadump_conf, u64 node) > return; > } > > - ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_CPU, &be_addr); > - if (be_addr) { > + ret = opal_mpipl_query_tag(OPAL_MPIPL_TAG_CPU, > stack_pa(&be_addr)); > + if (addr) { > addr = be64_to_cpu(be_addr); > pr_debug("CPU metadata addr: %llx\n", addr); > opal_cpu_metadata = __va(addr); > diff --git a/arch/powerpc/platforms/powernv/opal-flash.c > b/arch/powerpc/platforms/powernv/opal-flash.c > index d5ea04e8e4c5..fb989707ce94 100644 > --- a/arch/powerpc/platforms/powernv/opal-flash.c > +++ b/arch/powerpc/platforms/powernv/opal-flash.c > @@ -134,7 +134,8 @@ static inline void opal_flash_validate(void) > __be32 size = cpu_to_be32(validate_flash_data.buf_size); > __be32 result; > > - ret = opal_validate_flash(__pa(buf), &size, &result); > + ret = opal_validate_flash((uint64_t)stack_pa(buf), > stack_pa(&size), > + stack_pa(&result)); > > validate_flash_data.status = ret; > validate_flash_data.buf_size = be32_to_cpu(size); > @@ -290,7 +291,7 @@ static int opal_flash_update(int op) > goto invalid_img; > > /* First entry address */ > - addr = __pa(list); > + addr = (unsigned long)stack_pa(list); > > flash: > rc = opal_update_flash(addr); > diff --git a/arch/powerpc/platforms/powernv/opal-hmi.c > b/arch/powerpc/platforms/powernv/opal-hmi.c > index f0c1830deb51..a7df32dfd090 100644 > --- a/arch/powerpc/platforms/powernv/opal-hmi.c > +++ b/arch/powerpc/platforms/powernv/opal-hmi.c > @@ -303,7 +303,8 @@ static void hmi_event_handler(struct work_struct > *work) > > if (unrecoverable) { > /* Pull all HMI events from OPAL before we panic. */ > - while (opal_get_msg(__pa(&msg), sizeof(msg)) == > OPAL_SUCCESS) { > + while (opal_get_msg((uint64_t)stack_pa(&msg), > + sizeof(msg)) == OPAL_SUCCESS) { > u32 type; > > type = be32_to_cpu(msg.msg_type); > diff --git a/arch/powerpc/platforms/powernv/opal-irqchip.c > b/arch/powerpc/platforms/powernv/opal-irqchip.c > index d55652b5f6fa..0af8e517884c 100644 > --- a/arch/powerpc/platforms/powernv/opal-irqchip.c > +++ b/arch/powerpc/platforms/powernv/opal-irqchip.c > @@ -60,7 +60,7 @@ void opal_handle_events(void) > cond_resched(); > } > last_outstanding_events = 0; > - if (opal_poll_events(&events) != OPAL_SUCCESS) > + if (opal_poll_events(stack_pa(&events)) != OPAL_SUCCESS) > return; > e = be64_to_cpu(events) & opal_event_irqchip.mask; > if (e) > @@ -123,7 +123,7 @@ static irqreturn_t opal_interrupt(int irq, void > *data) > { > __be64 events; > > - opal_handle_interrupt(virq_to_hw(irq), &events); > + opal_handle_interrupt(virq_to_hw(irq), stack_pa(&events)); > last_outstanding_events = be64_to_cpu(events); > if (opal_have_pending_events()) > opal_wake_poller(); > diff --git a/arch/powerpc/platforms/powernv/opal-lpc.c > b/arch/powerpc/platforms/powernv/opal-lpc.c > index d129d6d45a50..01114ab629dc 100644 > --- a/arch/powerpc/platforms/powernv/opal-lpc.c > +++ b/arch/powerpc/platforms/powernv/opal-lpc.c > @@ -28,7 +28,7 @@ static u8 opal_lpc_inb(unsigned long port) > > if (opal_lpc_chip_id < 0 || port > 0xffff) > return 0xff; > - rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, > &data, 1); > + rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, > stack_pa(&data), 1); > return rc ? 0xff : be32_to_cpu(data); > } > > @@ -41,7 +41,7 @@ static __le16 __opal_lpc_inw(unsigned long port) > return 0xffff; > if (port & 1) > return (__le16)opal_lpc_inb(port) << 8 | > opal_lpc_inb(port + 1); > - rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, > &data, 2); > + rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, > stack_pa(&data), 2); > return rc ? 0xffff : be32_to_cpu(data); > } > static u16 opal_lpc_inw(unsigned long port) > @@ -61,7 +61,7 @@ static __le32 __opal_lpc_inl(unsigned long port) > (__le32)opal_lpc_inb(port + 1) << 16 | > (__le32)opal_lpc_inb(port + 2) << 8 | > opal_lpc_inb(port + 3); > - rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, > &data, 4); > + rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, > stack_pa(&data), 4); > return rc ? 0xffffffff : be32_to_cpu(data); > } > > @@ -208,7 +208,7 @@ static ssize_t lpc_debug_read(struct file *filp, > char __user *ubuf, > len = 2; > } > rc = opal_lpc_read(opal_lpc_chip_id, lpc->lpc_type, > pos, > - &data, len); > + stack_pa(&data), len); > if (rc) > return -ENXIO; > > diff --git a/arch/powerpc/platforms/powernv/opal-nvram.c > b/arch/powerpc/platforms/powernv/opal-nvram.c > index 380bc2d7ebbf..d92e5070baf2 100644 > --- a/arch/powerpc/platforms/powernv/opal-nvram.c > +++ b/arch/powerpc/platforms/powernv/opal-nvram.c > @@ -33,7 +33,7 @@ static ssize_t opal_nvram_read(char *buf, size_t > count, loff_t *index) > off = *index; > if ((off + count) > nvram_size) > count = nvram_size - off; > - rc = opal_read_nvram(__pa(buf), count, off); > + rc = opal_read_nvram((uint64_t)stack_pa(buf), count, off); > if (rc != OPAL_SUCCESS) > return -EIO; > *index += count; > @@ -56,7 +56,7 @@ static ssize_t opal_nvram_write(char *buf, size_t > count, loff_t *index) > count = nvram_size - off; > > while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { > - rc = opal_write_nvram(__pa(buf), count, off); > + rc = opal_write_nvram((uint64_t)stack_pa(buf), count, > off); > if (rc == OPAL_BUSY_EVENT) { > if (in_interrupt() || irqs_disabled()) > mdelay(OPAL_BUSY_DELAY_MS); > diff --git a/arch/powerpc/platforms/powernv/opal-power.c > b/arch/powerpc/platforms/powernv/opal-power.c > index db99ffcb7b82..6927bcd3630e 100644 > --- a/arch/powerpc/platforms/powernv/opal-power.c > +++ b/arch/powerpc/platforms/powernv/opal-power.c > @@ -31,7 +31,7 @@ static bool detect_epow(void) > * to OPAL. OPAL returns EPOW info along with classes present. > */ > epow_classes = cpu_to_be16(OPAL_SYSEPOW_MAX); > - rc = opal_get_epow_status(opal_epow_status, &epow_classes); > + rc = opal_get_epow_status(stack_pa(opal_epow_status), > stack_pa(&epow_classes)); > if (rc != OPAL_SUCCESS) { > pr_err("Failed to get EPOW event information\n"); > return false; > @@ -59,7 +59,7 @@ static bool __init poweroff_pending(void) > __be64 opal_dpo_timeout; > > /* Check for DPO event */ > - rc = opal_get_dpo_status(&opal_dpo_timeout); > + rc = opal_get_dpo_status(stack_pa(&opal_dpo_timeout)); > if (rc == OPAL_SUCCESS) { > pr_info("Existing DPO event detected.\n"); > return true; > diff --git a/arch/powerpc/platforms/powernv/opal-powercap.c > b/arch/powerpc/platforms/powernv/opal-powercap.c > index 7bfe4cbeb35a..63e0e4427aea 100644 > --- a/arch/powerpc/platforms/powernv/opal-powercap.c > +++ b/arch/powerpc/platforms/powernv/opal-powercap.c > @@ -46,7 +46,7 @@ static ssize_t powercap_show(struct kobject *kobj, > struct kobj_attribute *attr, > if (ret) > goto out_token; > > - ret = opal_get_powercap(pcap_attr->handle, token, (u32 > *)__pa(&pcap)); > + ret = opal_get_powercap(pcap_attr->handle, token, (u32 > *)stack_pa(&pcap)); > switch (ret) { > case OPAL_ASYNC_COMPLETION: > ret = opal_async_wait_response(token, &msg); > diff --git a/arch/powerpc/platforms/powernv/opal-prd.c > b/arch/powerpc/platforms/powernv/opal-prd.c > index 113bdb151f68..649e8510ec00 100644 > --- a/arch/powerpc/platforms/powernv/opal-prd.c > +++ b/arch/powerpc/platforms/powernv/opal-prd.c > @@ -234,7 +234,7 @@ static ssize_t opal_prd_write(struct file *file, > const char __user *buf, > if (IS_ERR(msg)) > return PTR_ERR(msg); > > - rc = opal_prd_msg(msg); > + rc = opal_prd_msg(stack_pa(msg)); > if (rc) { > pr_warn("write: opal_prd_msg returned %d\n", rc); > size = -EIO; > @@ -252,7 +252,7 @@ static int opal_prd_release(struct inode *inode, > struct file *file) > msg.size = cpu_to_be16(sizeof(msg)); > msg.type = OPAL_PRD_MSG_TYPE_FINI; > > - opal_prd_msg((struct opal_prd_msg *)&msg); > + opal_prd_msg((struct opal_prd_msg *)stack_pa(&msg)); > > atomic_xchg(&prd_usage, 0); > > @@ -281,7 +281,7 @@ static long opal_prd_ioctl(struct file *file, > unsigned int cmd, > return -EFAULT; > > scom.rc = opal_xscom_read(scom.chip, scom.addr, > - (__be64 *)&scom.data); > + (__be64 > *)stack_pa(&scom.data)); > scom.data = be64_to_cpu(scom.data); > pr_devel("ioctl SCOM_READ: chip %llx addr %016llx > data %016llx rc %lld\n", > scom.chip, scom.addr, scom.data, > scom.rc); > diff --git a/arch/powerpc/platforms/powernv/opal-psr.c > b/arch/powerpc/platforms/powernv/opal-psr.c > index 6441e17b6996..c37257b1ffe4 100644 > --- a/arch/powerpc/platforms/powernv/opal-psr.c > +++ b/arch/powerpc/platforms/powernv/opal-psr.c > @@ -40,7 +40,7 @@ static ssize_t psr_show(struct kobject *kobj, > struct kobj_attribute *attr, > goto out_token; > > ret = opal_get_power_shift_ratio(psr_attr->handle, token, > - (u32 *)__pa(&psr)); > + (u32 *)stack_pa(&psr)); > switch (ret) { > case OPAL_ASYNC_COMPLETION: > ret = opal_async_wait_response(token, &msg); > diff --git a/arch/powerpc/platforms/powernv/opal-rtc.c > b/arch/powerpc/platforms/powernv/opal-rtc.c > index a9bcf9217e64..891651455066 100644 > --- a/arch/powerpc/platforms/powernv/opal-rtc.c > +++ b/arch/powerpc/platforms/powernv/opal-rtc.c > @@ -43,7 +43,7 @@ time64_t __init opal_get_boot_time(void) > return 0; > > while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { > - rc = opal_rtc_read(&__y_m_d, &__h_m_s_ms); > + rc = opal_rtc_read(stack_pa(&__y_m_d), > stack_pa(&__h_m_s_ms)); > if (rc == OPAL_BUSY_EVENT) { > mdelay(OPAL_BUSY_DELAY_MS); > opal_poll_events(NULL); > diff --git a/arch/powerpc/platforms/powernv/opal-secvar.c > b/arch/powerpc/platforms/powernv/opal-secvar.c > index 14133e120bdd..a44df58d565d 100644 > --- a/arch/powerpc/platforms/powernv/opal-secvar.c > +++ b/arch/powerpc/platforms/powernv/opal-secvar.c > @@ -64,7 +64,8 @@ static int opal_get_variable(const char *key, > uint64_t ksize, > > *dsize = cpu_to_be64(*dsize); > > - rc = opal_secvar_get(key, ksize, data, dsize); > + rc = opal_secvar_get(stack_pa(key), ksize, stack_pa(data), > + stack_pa(dsize)); > > *dsize = be64_to_cpu(*dsize); > > @@ -81,7 +82,8 @@ static int opal_get_next_variable(const char *key, > uint64_t *keylen, > > *keylen = cpu_to_be64(*keylen); > > - rc = opal_secvar_get_next(key, keylen, keybufsize); > + rc = opal_secvar_get_next(stack_pa(key), stack_pa(keylen), > + keybufsize); > > *keylen = be64_to_cpu(*keylen); > > @@ -96,7 +98,8 @@ static int opal_set_variable(const char *key, > uint64_t ksize, u8 *data, > if (!key || !data) > return -EINVAL; > > - rc = opal_secvar_enqueue_update(key, ksize, data, dsize); > + rc = opal_secvar_enqueue_update(stack_pa(key), ksize, > stack_pa(data), > + dsize); > > return opal_status_to_err(rc); > } > diff --git a/arch/powerpc/platforms/powernv/opal-sensor.c > b/arch/powerpc/platforms/powernv/opal-sensor.c > index 3192c614a1e1..ff5f78bb419b 100644 > --- a/arch/powerpc/platforms/powernv/opal-sensor.c > +++ b/arch/powerpc/platforms/powernv/opal-sensor.c > @@ -25,7 +25,7 @@ int opal_get_sensor_data(u32 sensor_hndl, u32 > *sensor_data) > if (token < 0) > return token; > > - ret = opal_sensor_read(sensor_hndl, token, &data); > + ret = opal_sensor_read(sensor_hndl, token, stack_pa(&data)); > switch (ret) { > case OPAL_ASYNC_COMPLETION: > ret = opal_async_wait_response(token, &msg); > @@ -78,7 +78,7 @@ int opal_get_sensor_data_u64(u32 sensor_hndl, u64 > *sensor_data) > if (token < 0) > return token; > > - ret = opal_sensor_read_u64(sensor_hndl, token, &data); > + ret = opal_sensor_read_u64(sensor_hndl, token, > stack_pa(&data)); > switch (ret) { > case OPAL_ASYNC_COMPLETION: > ret = opal_async_wait_response(token, &msg); > diff --git a/arch/powerpc/platforms/powernv/opal-sysparam.c > b/arch/powerpc/platforms/powernv/opal-sysparam.c > index a12312afe4ef..3882b31a9e61 100644 > --- a/arch/powerpc/platforms/powernv/opal-sysparam.c > +++ b/arch/powerpc/platforms/powernv/opal-sysparam.c > @@ -41,7 +41,7 @@ static ssize_t opal_get_sys_param(u32 param_id, u32 > length, void *buffer) > goto out; > } > > - ret = opal_get_param(token, param_id, (u64)buffer, length); > + ret = opal_get_param(token, param_id, (u64)stack_pa(buffer), > length); > if (ret != OPAL_ASYNC_COMPLETION) { > ret = opal_error_code(ret); > goto out_token; > @@ -76,7 +76,7 @@ static int opal_set_sys_param(u32 param_id, u32 > length, void *buffer) > goto out; > } > > - ret = opal_set_param(token, param_id, (u64)buffer, length); > + ret = opal_set_param(token, param_id, (u64)stack_pa(buffer), > length); > > if (ret != OPAL_ASYNC_COMPLETION) { > ret = opal_error_code(ret); > diff --git a/arch/powerpc/platforms/powernv/opal-xscom.c > b/arch/powerpc/platforms/powernv/opal-xscom.c > index 6b4eed2ef4fa..b318e2ef4ba2 100644 > --- a/arch/powerpc/platforms/powernv/opal-xscom.c > +++ b/arch/powerpc/platforms/powernv/opal-xscom.c > @@ -58,7 +58,7 @@ static int opal_scom_read(uint32_t chip, uint64_t > addr, u64 reg, u64 *value) > __be64 v; > > reg = opal_scom_unmangle(addr + reg); > - rc = opal_xscom_read(chip, reg, (__be64 *)__pa(&v)); > + rc = opal_xscom_read(chip, reg, (__be64 *)stack_pa(&v)); > if (rc) { > *value = 0xfffffffffffffffful; > return -EIO; > diff --git a/arch/powerpc/platforms/powernv/opal.c > b/arch/powerpc/platforms/powernv/opal.c > index cdf3838f08d3..ada336d77e64 100644 > --- a/arch/powerpc/platforms/powernv/opal.c > +++ b/arch/powerpc/platforms/powernv/opal.c > @@ -357,7 +357,7 @@ static void opal_handle_message(void) > s64 ret; > u32 type; > > - ret = opal_get_msg(__pa(opal_msg), opal_msg_size); > + ret = opal_get_msg((uint64_t)stack_pa(opal_msg), > opal_msg_size); > /* No opal message pending. */ > if (ret == OPAL_RESOURCE) > return; > @@ -431,11 +431,11 @@ int opal_get_chars(uint32_t vtermno, char *buf, > int count) > > if (!opal.entry) > return -ENODEV; > - opal_poll_events(&evt); > + opal_poll_events(stack_pa(&evt)); > if ((be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_INPUT) == 0) > return 0; > len = cpu_to_be64(count); > - rc = opal_console_read(vtermno, &len, buf); > + rc = opal_console_read(vtermno, stack_pa(&len), > stack_pa(buf)); > if (rc == OPAL_SUCCESS) > return be64_to_cpu(len); > return 0; > @@ -453,7 +453,7 @@ static int __opal_put_chars(uint32_t vtermno, > const char *data, int total_len, b > > if (atomic) > spin_lock_irqsave(&opal_write_lock, flags); > - rc = opal_console_write_buffer_space(vtermno, &olen); > + rc = opal_console_write_buffer_space(vtermno, > stack_pa(&olen)); > if (rc || be64_to_cpu(olen) < total_len) { > /* Closed -> drop characters */ > if (rc) > @@ -465,7 +465,7 @@ static int __opal_put_chars(uint32_t vtermno, > const char *data, int total_len, b > > /* Should not get a partial write here because space is > available. */ > olen = cpu_to_be64(total_len); > - rc = opal_console_write(vtermno, &olen, data); > + rc = opal_console_write(vtermno, stack_pa(&olen), > stack_pa((void *)data)); > if (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { > if (rc == OPAL_BUSY_EVENT) > opal_poll_events(NULL); > @@ -527,7 +527,7 @@ static s64 __opal_flush_console(uint32_t vtermno) > */ > WARN_ONCE(1, "opal: OPAL_CONSOLE_FLUSH missing.\n"); > > - opal_poll_events(&evt); > + opal_poll_events(stack_pa(&evt)); > if (!(be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_OUTPUT)) > return OPAL_SUCCESS; > return OPAL_BUSY; > @@ -647,7 +647,7 @@ void __noreturn pnv_platform_error_reboot(struct > pt_regs *regs, const char *msg) > * Don't bother to shut things down because this will > * xstop the system. > */ > - if (opal_cec_reboot2(OPAL_REBOOT_PLATFORM_ERROR, msg) > + if (opal_cec_reboot2(OPAL_REBOOT_PLATFORM_ERROR, > stack_pa((void *)msg)) > == OPAL_UNSUPPORTED) > { > pr_emerg("Reboot type %d not supported for %s\n", > OPAL_REBOOT_PLATFORM_ERROR, msg); > @@ -720,7 +720,7 @@ int opal_hmi_exception_early2(struct pt_regs > *regs) > * Check 64-bit flag mask to find out if an event was > generated, > * and whether TB is still valid or not etc. > */ > - rc = opal_handle_hmi2(&out_flags); > + rc = opal_handle_hmi2(stack_pa(&out_flags)); > if (rc != OPAL_SUCCESS) > return 0; > > diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c > b/arch/powerpc/platforms/powernv/pci-ioda.c > index 5c144c05cbfd..4d85e8253f94 100644 > --- a/arch/powerpc/platforms/powernv/pci-ioda.c > +++ b/arch/powerpc/platforms/powernv/pci-ioda.c > @@ -628,7 +628,8 @@ static int pnv_ioda_get_pe_state(struct pnv_phb > *phb, int pe_no) > > /* Check the master PE */ > rc = opal_pci_eeh_freeze_status(phb->opal_id, pe_no, > - &state, &pcierr, NULL); > + stack_pa(&state), > + stack_pa(&pcierr), NULL); > if (rc != OPAL_SUCCESS) { > pr_warn("%s: Failure %lld getting " > "PHB#%x-PE#%x state\n", > @@ -644,8 +645,8 @@ static int pnv_ioda_get_pe_state(struct pnv_phb > *phb, int pe_no) > list_for_each_entry(slave, &pe->slaves, list) { > rc = opal_pci_eeh_freeze_status(phb->opal_id, > slave->pe_number, > - &fstate, > - &pcierr, > + stack_pa(&fstate), > + stack_pa(&pcierr), > NULL); > if (rc != OPAL_SUCCESS) { > pr_warn("%s: Failure %lld getting " > @@ -2061,7 +2062,7 @@ static int __pnv_pci_ioda_msi_setup(struct > pnv_phb *phb, struct pci_dev *dev, > __be64 addr64; > > rc = opal_get_msi_64(phb->opal_id, pe->mve_number, > xive_num, 1, > - &addr64, &data); > + stack_pa(&addr64), > stack_pa(&data)); > if (rc) { > pr_warn("%s: OPAL error %d getting 64-bit MSI > data\n", > pci_name(dev), rc); > @@ -2073,7 +2074,7 @@ static int __pnv_pci_ioda_msi_setup(struct > pnv_phb *phb, struct pci_dev *dev, > __be32 addr32; > > rc = opal_get_msi_32(phb->opal_id, pe->mve_number, > xive_num, 1, > - &addr32, &data); > + stack_pa(&addr32), > stack_pa(&data)); > if (rc) { > pr_warn("%s: OPAL error %d getting 32-bit MSI > data\n", > pci_name(dev), rc); > @@ -2415,7 +2416,8 @@ static int pnv_pci_diag_data_set(void *data, > u64 val) > s64 ret; > > /* Retrieve the diag data from firmware */ > - ret = opal_pci_get_phb_diag_data2(phb->opal_id, phb- > >diag_data, > + ret = opal_pci_get_phb_diag_data2(phb->opal_id, > + stack_pa(phb->diag_data), > phb->diag_data_size); > if (ret != OPAL_SUCCESS) > return -EIO; > diff --git a/arch/powerpc/platforms/powernv/pci.c > b/arch/powerpc/platforms/powernv/pci.c > index 233a50e65fce..0c21b5aa24f5 100644 > --- a/arch/powerpc/platforms/powernv/pci.c > +++ b/arch/powerpc/platforms/powernv/pci.c > @@ -84,7 +84,7 @@ int pnv_pci_get_device_tree(uint32_t phandle, void > *buf, uint64_t len) > if (!opal_check_token(OPAL_GET_DEVICE_TREE)) > return -ENXIO; > > - rc = opal_get_device_tree(phandle, (uint64_t)buf, len); > + rc = opal_get_device_tree(phandle, (uint64_t)stack_pa(buf), > len); > if (rc < OPAL_SUCCESS) > return -EIO; > > @@ -99,7 +99,7 @@ int pnv_pci_get_presence_state(uint64_t id, uint8_t > *state) > if (!opal_check_token(OPAL_PCI_GET_PRESENCE_STATE)) > return -ENXIO; > > - rc = opal_pci_get_presence_state(id, (uint64_t)state); > + rc = opal_pci_get_presence_state(id, > (uint64_t)stack_pa(state)); > if (rc != OPAL_SUCCESS) > return -EIO; > > @@ -114,7 +114,7 @@ int pnv_pci_get_power_state(uint64_t id, uint8_t > *state) > if (!opal_check_token(OPAL_PCI_GET_POWER_STATE)) > return -ENXIO; > > - rc = opal_pci_get_power_state(id, (uint64_t)state); > + rc = opal_pci_get_power_state(id, (uint64_t)stack_pa(state)); > if (rc != OPAL_SUCCESS) > return -EIO; > > @@ -135,7 +135,7 @@ int pnv_pci_set_power_state(uint64_t id, uint8_t > state, struct opal_msg *msg) > if (unlikely(token < 0)) > return token; > > - rc = opal_pci_set_power_state(token, id, (uint64_t)&state); > + rc = opal_pci_set_power_state(token, id, > (uint64_t)stack_pa(&state)); > if (rc == OPAL_SUCCESS) { > ret = 0; > goto exit; > @@ -493,7 +493,8 @@ static void pnv_pci_handle_eeh_config(struct > pnv_phb *phb, u32 pe_no) > spin_lock_irqsave(&phb->lock, flags); > > /* Fetch PHB diag-data */ > - rc = opal_pci_get_phb_diag_data2(phb->opal_id, phb- > >diag_data, > + rc = opal_pci_get_phb_diag_data2(phb->opal_id, > + stack_pa(phb->diag_data), > phb->diag_data_size); > has_diag = (rc == OPAL_SUCCESS); > > @@ -554,8 +555,8 @@ static void pnv_pci_config_check_eeh(struct > pci_dn *pdn) > } else { > rc = opal_pci_eeh_freeze_status(phb->opal_id, > pe_no, > - &fstate, > - &pcierr, > + stack_pa(&fstate), > + stack_pa(&pcierr), > NULL); > if (rc) { > pr_warn("%s: Failure %lld getting PHB#%x- > PE#%x state\n", > @@ -592,20 +593,22 @@ int pnv_pci_cfg_read(struct pci_dn *pdn, > switch (size) { > case 1: { > u8 v8; > - rc = opal_pci_config_read_byte(phb->opal_id, bdfn, > where, &v8); > + rc = opal_pci_config_read_byte(phb->opal_id, bdfn, > where, > + stack_pa(&v8)); > *val = (rc == OPAL_SUCCESS) ? v8 : 0xff; > break; > } > case 2: { > __be16 v16; > rc = opal_pci_config_read_half_word(phb->opal_id, > bdfn, where, > - &v16); > + stack_pa(&v16)); > *val = (rc == OPAL_SUCCESS) ? be16_to_cpu(v16) : > 0xffff; > break; > } > case 4: { > __be32 v32; > - rc = opal_pci_config_read_word(phb->opal_id, bdfn, > where, &v32); > + rc = opal_pci_config_read_word(phb->opal_id, bdfn, > where, > + stack_pa(&v32)); > *val = (rc == OPAL_SUCCESS) ? be32_to_cpu(v32) : > 0xffffffff; > break; > } > @@ -765,7 +768,7 @@ int pnv_pci_set_tunnel_bar(struct pci_dev *dev, > u64 addr, int enable) > return -ENXIO; > > mutex_lock(&tunnel_mutex); > - rc = opal_pci_get_pbcq_tunnel_bar(phb->opal_id, &val); > + rc = opal_pci_get_pbcq_tunnel_bar(phb->opal_id, > stack_pa(&val)); > if (rc != OPAL_SUCCESS) { > rc = -EIO; > goto out; > diff --git a/arch/powerpc/platforms/powernv/setup.c > b/arch/powerpc/platforms/powernv/setup.c > index 61ab2d38ff4b..aae6ad04c65f 100644 > --- a/arch/powerpc/platforms/powernv/setup.c > +++ b/arch/powerpc/platforms/powernv/setup.c > @@ -407,7 +407,7 @@ static void pnv_kexec_wait_secondaries_down(void) > > for (;;) { > rc = > opal_query_cpu_status(get_hard_smp_processor_id(i), > - &status); > + > stack_pa(&status)); > if (rc != OPAL_SUCCESS || status != > OPAL_THREAD_STARTED) > break; > barrier(); > diff --git a/arch/powerpc/platforms/powernv/smp.c > b/arch/powerpc/platforms/powernv/smp.c > index 9e1a25398f98..2f70e0bf9873 100644 > --- a/arch/powerpc/platforms/powernv/smp.c > +++ b/arch/powerpc/platforms/powernv/smp.c > @@ -86,7 +86,7 @@ static int pnv_smp_kick_cpu(int nr) > * first time. OPAL v3 allows us to query OPAL to know if it > * has the CPUs, so we do that > */ > - rc = opal_query_cpu_status(pcpu, &status); > + rc = opal_query_cpu_status(pcpu, stack_pa(&status)); > if (rc != OPAL_SUCCESS) { > pr_warn("OPAL Error %ld querying CPU %d state\n", rc, > nr); > return -ENODEV; > diff --git a/arch/powerpc/sysdev/xics/icp-opal.c > b/arch/powerpc/sysdev/xics/icp-opal.c > index 4dae624b9f2f..a79b98349a1e 100644 > --- a/arch/powerpc/sysdev/xics/icp-opal.c > +++ b/arch/powerpc/sysdev/xics/icp-opal.c > @@ -53,7 +53,7 @@ static unsigned int icp_opal_get_xirr(void) > return kvm_xirr; > > /* Then ask OPAL */ > - rc = opal_int_get_xirr(&hw_xirr, false); > + rc = opal_int_get_xirr(stack_pa(&hw_xirr), false); > if (rc < 0) > return 0; > return be32_to_cpu(hw_xirr); > diff --git a/arch/powerpc/sysdev/xics/ics-opal.c > b/arch/powerpc/sysdev/xics/ics-opal.c > index 6cfbb4fac7fb..5bf54470b35d 100644 > --- a/arch/powerpc/sysdev/xics/ics-opal.c > +++ b/arch/powerpc/sysdev/xics/ics-opal.c > @@ -105,7 +105,7 @@ static int ics_opal_set_affinity(struct irq_data > *d, > if (hw_irq == XICS_IPI || hw_irq == XICS_IRQ_SPURIOUS) > return -1; > > - rc = opal_get_xive(hw_irq, &oserver, &priority); > + rc = opal_get_xive(hw_irq, stack_pa(&oserver), > stack_pa(&priority)); > if (rc != OPAL_SUCCESS) { > pr_err("%s: opal_get_xive(irq=%d [hw 0x%x]) error > %lld\n", > __func__, d->irq, hw_irq, rc); > @@ -160,7 +160,7 @@ static int ics_opal_check(struct ics *ics, > unsigned int hw_irq) > return -EINVAL; > > /* Check if HAL knows about this interrupt */ > - rc = opal_get_xive(hw_irq, &server, &priority); > + rc = opal_get_xive(hw_irq, stack_pa(&server), > stack_pa(&priority)); > if (rc != OPAL_SUCCESS) > return -ENXIO; > > @@ -174,7 +174,7 @@ static void ics_opal_mask_unknown(struct ics > *ics, unsigned long vec) > int8_t priority; > > /* Check if HAL knows about this interrupt */ > - rc = opal_get_xive(vec, &server, &priority); > + rc = opal_get_xive(vec, stack_pa(&server), > stack_pa(&priority)); > if (rc != OPAL_SUCCESS) > return; > > @@ -188,7 +188,7 @@ static long ics_opal_get_server(struct ics *ics, > unsigned long vec) > int8_t priority; > > /* Check if HAL knows about this interrupt */ > - rc = opal_get_xive(vec, &server, &priority); > + rc = opal_get_xive(vec, stack_pa(&server), > stack_pa(&priority)); > if (rc != OPAL_SUCCESS) > return -1; > return ics_opal_unmangle_server(be16_to_cpu(server)); > diff --git a/arch/powerpc/sysdev/xive/native.c > b/arch/powerpc/sysdev/xive/native.c > index 3925825954bc..a2082ee866ca 100644 > --- a/arch/powerpc/sysdev/xive/native.c > +++ b/arch/powerpc/sysdev/xive/native.c > @@ -52,8 +52,11 @@ int xive_native_populate_irq_data(u32 hw_irq, > struct xive_irq_data *data) > > memset(data, 0, sizeof(*data)); > > - rc = opal_xive_get_irq_info(hw_irq, &flags, &eoi_page, > &trig_page, > - &esb_shift, &src_chip); > + rc = opal_xive_get_irq_info(hw_irq, stack_pa(&flags), > + stack_pa(&eoi_page), > + stack_pa(&trig_page), > + stack_pa(&esb_shift), > + stack_pa(&src_chip)); > if (rc) { > pr_err("opal_xive_get_irq_info(0x%x) returned > %lld\n", > hw_irq, rc); > @@ -117,7 +120,8 @@ static int xive_native_get_irq_config(u32 hw_irq, > u32 *target, u8 *prio, > __be64 vp; > __be32 lirq; > > - rc = opal_xive_get_irq_config(hw_irq, &vp, prio, &lirq); > + rc = opal_xive_get_irq_config(hw_irq, stack_pa(&vp), > stack_pa(prio), > + stack_pa(&lirq)); > > *target = be64_to_cpu(vp); > *sw_irq = be32_to_cpu(lirq); > @@ -150,8 +154,8 @@ int xive_native_configure_queue(u32 vp_id, struct > xive_q *q, u8 prio, > q->toggle = 0; > > rc = opal_xive_get_queue_info(vp_id, prio, NULL, NULL, > - &qeoi_page_be, > - &esc_irq_be, > + stack_pa(&qeoi_page_be), > + stack_pa(&esc_irq_be), > NULL); > if (rc) { > vp_err(vp_id, "Failed to get queue %d info : %lld\n", > prio, rc); > @@ -416,7 +420,8 @@ static void xive_native_setup_cpu(unsigned int > cpu, struct xive_cpu *xc) > } > > /* Grab it's CAM value */ > - rc = opal_xive_get_vp_info(vp, NULL, &vp_cam_be, NULL, NULL); > + rc = opal_xive_get_vp_info(vp, NULL, stack_pa(&vp_cam_be), > NULL, > + NULL); > if (rc) { > pr_err("Failed to get pool VP info CPU %d\n", cpu); > return; > @@ -756,7 +761,8 @@ int xive_native_get_vp_info(u32 vp_id, u32 > *out_cam_id, u32 *out_chip_id) > __be32 vp_chip_id_be; > s64 rc; > > - rc = opal_xive_get_vp_info(vp_id, NULL, &vp_cam_be, NULL, > &vp_chip_id_be); > + rc = opal_xive_get_vp_info(vp_id, NULL, stack_pa(&vp_cam_be), > NULL, > + stack_pa(&vp_chip_id_be)); > if (rc) { > vp_err(vp_id, "Failed to get VP info : %lld\n", rc); > return -EIO; > @@ -794,8 +800,11 @@ int xive_native_get_queue_info(u32 vp_id, u32 > prio, > __be64 qflags; > s64 rc; > > - rc = opal_xive_get_queue_info(vp_id, prio, &qpage, &qsize, > - &qeoi_page, &escalate_irq, > &qflags); > + rc = opal_xive_get_queue_info(vp_id, prio, stack_pa(&qpage), > + stack_pa(&qsize), > + stack_pa(&qeoi_page), > + stack_pa(&escalate_irq), > + stack_pa(&qflags)); > if (rc) { > vp_err(vp_id, "failed to get queue %d info : %lld\n", > prio, rc); > return -EIO; > @@ -822,8 +831,8 @@ int xive_native_get_queue_state(u32 vp_id, u32 > prio, u32 *qtoggle, u32 *qindex) > __be32 opal_qindex; > s64 rc; > > - rc = opal_xive_get_queue_state(vp_id, prio, &opal_qtoggle, > - &opal_qindex); > + rc = opal_xive_get_queue_state(vp_id, prio, > stack_pa(&opal_qtoggle), > + stack_pa(&opal_qindex)); > if (rc) { > vp_err(vp_id, "failed to get queue %d state : > %lld\n", prio, rc); > return -EIO; > @@ -864,7 +873,7 @@ int xive_native_get_vp_state(u32 vp_id, u64 > *out_state) > __be64 state; > s64 rc; > > - rc = opal_xive_get_vp_state(vp_id, &state); > + rc = opal_xive_get_vp_state(vp_id, stack_pa(&state)); > if (rc) { > vp_err(vp_id, "failed to get vp state : %lld\n", rc); > return -EIO; > diff --git a/drivers/char/ipmi/ipmi_powernv.c > b/drivers/char/ipmi/ipmi_powernv.c > index da22a8cbe68e..55032e205e8e 100644 > --- a/drivers/char/ipmi/ipmi_powernv.c > +++ b/drivers/char/ipmi/ipmi_powernv.c > @@ -91,7 +91,7 @@ static void ipmi_powernv_send(void *send_info, > struct ipmi_smi_msg *msg) > > pr_devel("%s: opal_ipmi_send(0x%llx, %p, %ld)\n", __func__, > smi->interface_id, opal_msg, size); > - rc = opal_ipmi_send(smi->interface_id, opal_msg, size); > + rc = opal_ipmi_send(smi->interface_id, stack_pa(opal_msg), > size); > pr_devel("%s: -> %d\n", __func__, rc); > > if (!rc) { > @@ -132,8 +132,8 @@ static int ipmi_powernv_recv(struct > ipmi_smi_powernv *smi) > size = cpu_to_be64(sizeof(*opal_msg) + IPMI_MAX_MSG_LENGTH); > > rc = opal_ipmi_recv(smi->interface_id, > - opal_msg, > - &size); > + stack_pa(opal_msg), > + stack_pa(&size)); > size = be64_to_cpu(size); > pr_devel("%s: -> %d (size %lld)\n", __func__, > rc, rc == 0 ? size : 0); > diff --git a/drivers/char/powernv-op-panel.c b/drivers/char/powernv- > op-panel.c > index 3c99696b145e..10588093e2e2 100644 > --- a/drivers/char/powernv-op-panel.c > +++ b/drivers/char/powernv-op-panel.c > @@ -60,7 +60,7 @@ static int __op_panel_update_display(void) > return token; > } > > - rc = opal_write_oppanel_async(token, oppanel_lines, > num_lines); > + rc = opal_write_oppanel_async(token, stack_pa(oppanel_lines), > num_lines); > switch (rc) { > case OPAL_ASYNC_COMPLETION: > rc = opal_async_wait_response(token, &msg); > diff --git a/drivers/i2c/busses/i2c-opal.c b/drivers/i2c/busses/i2c- > opal.c > index 9f773b4f5ed8..d1d1fb3a55ba 100644 > --- a/drivers/i2c/busses/i2c-opal.c > +++ b/drivers/i2c/busses/i2c-opal.c > @@ -49,7 +49,7 @@ static int i2c_opal_send_request(u32 bus_id, struct > opal_i2c_request *req) > return token; > } > > - rc = opal_i2c_request(token, bus_id, req); > + rc = opal_i2c_request(token, bus_id, stack_pa(req)); > if (rc != OPAL_ASYNC_COMPLETION) { > rc = i2c_opal_translate_error(rc); > goto exit; > diff --git a/drivers/leds/leds-powernv.c b/drivers/leds/leds- > powernv.c > index 743e2cdd0891..b65bfdf6fa18 100644 > --- a/drivers/leds/leds-powernv.c > +++ b/drivers/leds/leds-powernv.c > @@ -99,7 +99,7 @@ static int powernv_led_set(struct powernv_led_data > *powernv_led, > } > > rc = opal_leds_set_ind(token, powernv_led->loc_code, > - led_mask, led_value, &max_type); > + led_mask, led_value, > stack_pa(&max_type)); > if (rc != OPAL_ASYNC_COMPLETION) { > dev_err(dev, "%s: OPAL set LED call failed for %s > [rc=%d]\n", > __func__, powernv_led->loc_code, rc); > @@ -142,7 +142,9 @@ static enum led_brightness powernv_led_get(struct > powernv_led_data *powernv_led) > max_type = powernv_led_common->max_led_type; > > rc = opal_leds_get_ind(powernv_led->loc_code, > - &mask, &value, &max_type); > + stack_pa(&mask), > + stack_pa(&value), > + stack_pa(&max_type)); > if (rc != OPAL_SUCCESS && rc != OPAL_PARTIAL) { > dev_err(dev, "%s: OPAL get led call failed > [rc=%d]\n", > __func__, rc); > diff --git a/drivers/mtd/devices/powernv_flash.c > b/drivers/mtd/devices/powernv_flash.c > index 36e060386e59..a2d0e61d0afe 100644 > --- a/drivers/mtd/devices/powernv_flash.c > +++ b/drivers/mtd/devices/powernv_flash.c > @@ -66,10 +66,10 @@ static int powernv_flash_async_op(struct mtd_info > *mtd, enum flash_op op, > > switch (op) { > case FLASH_OP_READ: > - rc = opal_flash_read(info->id, offset, __pa(buf), > len, token); > + rc = opal_flash_read(info->id, offset, > (uint64_t)stack_pa(buf), len, token); > break; > case FLASH_OP_WRITE: > - rc = opal_flash_write(info->id, offset, __pa(buf), > len, token); > + rc = opal_flash_write(info->id, offset, > (uint64_t)stack_pa(buf), len, token); > break; > case FLASH_OP_ERASE: > rc = opal_flash_erase(info->id, offset, len, token); > diff --git a/drivers/rtc/rtc-opal.c b/drivers/rtc/rtc-opal.c > index ad41aaf8a17f..9e627fb7115a 100644 > --- a/drivers/rtc/rtc-opal.c > +++ b/drivers/rtc/rtc-opal.c > @@ -53,7 +53,7 @@ static int opal_get_rtc_time(struct device *dev, > struct rtc_time *tm) > __be64 __h_m_s_ms; > > while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { > - rc = opal_rtc_read(&__y_m_d, &__h_m_s_ms); > + rc = opal_rtc_read(stack_pa(&__y_m_d), > stack_pa(&__h_m_s_ms)); > if (rc == OPAL_BUSY_EVENT) { > msleep(OPAL_BUSY_DELAY_MS); > opal_poll_events(NULL); > @@ -127,7 +127,7 @@ static int opal_get_tpo_time(struct device *dev, > struct rtc_wkalrm *alarm) > return token; > } > > - rc = opal_tpo_read(token, &__y_m_d, &__h_m); > + rc = opal_tpo_read(token, stack_pa(&__y_m_d), > stack_pa(&__h_m)); > if (rc != OPAL_ASYNC_COMPLETION) { > rc = -EIO; > goto exit;