2019-05-27 14:55:01 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
2005-10-06 10:06:20 +08:00
|
|
|
#ifndef _POWERPC_RTAS_H
|
|
|
|
#define _POWERPC_RTAS_H
|
2005-12-17 05:43:46 +08:00
|
|
|
#ifdef __KERNEL__
|
2005-10-06 10:06:20 +08:00
|
|
|
|
|
|
|
#include <linux/spinlock.h>
|
|
|
|
#include <asm/page.h>
|
2020-05-19 07:42:44 +08:00
|
|
|
#include <asm/rtas-types.h>
|
2015-02-06 03:37:17 +08:00
|
|
|
#include <linux/time.h>
|
2018-10-23 09:32:12 +08:00
|
|
|
#include <linux/cpumask.h>
|
2005-10-06 10:06:20 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Definitions for talking to the RTAS on CHRP machines.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2001 Peter Bergner
|
|
|
|
* Copyright (C) 2001 PPC 64 Team, IBM Corp
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define RTAS_UNKNOWN_SERVICE (-1)
|
2009-01-06 22:26:03 +08:00
|
|
|
#define RTAS_INSTANTIATE_MAX (1ULL<<30) /* Don't instantiate rtas at/above this value */
|
2005-10-06 10:06:20 +08:00
|
|
|
|
|
|
|
/* Buffer size for ppc_rtas system call. */
|
|
|
|
#define RTAS_RMOBUF_MAX (64 * 1024)
|
|
|
|
|
|
|
|
/* RTAS return status codes */
|
2006-06-13 08:49:20 +08:00
|
|
|
#define RTAS_NOT_SUSPENDABLE -9004
|
2005-10-06 10:06:20 +08:00
|
|
|
#define RTAS_BUSY -2 /* RTAS Busy */
|
|
|
|
#define RTAS_EXTENDED_DELAY_MIN 9900
|
|
|
|
#define RTAS_EXTENDED_DELAY_MAX 9905
|
|
|
|
|
|
|
|
/*
|
|
|
|
* In general to call RTAS use rtas_token("string") to lookup
|
|
|
|
* an RTAS token for the given string (e.g. "event-scan").
|
|
|
|
* To actually perform the call use
|
|
|
|
* ret = rtas_call(token, n_in, n_out, ...)
|
|
|
|
* Where n_in is the number of input parameters and
|
|
|
|
* n_out is the number of output parameters
|
|
|
|
*
|
|
|
|
* If the "string" is invalid on this system, RTAS_UNKNOWN_SERVICE
|
|
|
|
* will be returned as a token. rtas_call() does look for this
|
|
|
|
* token and error out gracefully so rtas_call(rtas_token("str"), ...)
|
|
|
|
* may be safely used for one-shot calls to RTAS.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* RTAS event classes */
|
|
|
|
#define RTAS_INTERNAL_ERROR 0x80000000 /* set bit 0 */
|
|
|
|
#define RTAS_EPOW_WARNING 0x40000000 /* set bit 1 */
|
|
|
|
#define RTAS_HOTPLUG_EVENTS 0x10000000 /* set bit 3 */
|
2009-04-01 04:13:27 +08:00
|
|
|
#define RTAS_IO_EVENTS 0x08000000 /* set bit 4 */
|
|
|
|
#define RTAS_EVENT_SCAN_ALL_EVENTS 0xffffffff
|
2005-10-06 10:06:20 +08:00
|
|
|
|
|
|
|
/* RTAS event severity */
|
|
|
|
#define RTAS_SEVERITY_FATAL 0x5
|
|
|
|
#define RTAS_SEVERITY_ERROR 0x4
|
|
|
|
#define RTAS_SEVERITY_ERROR_SYNC 0x3
|
|
|
|
#define RTAS_SEVERITY_WARNING 0x2
|
|
|
|
#define RTAS_SEVERITY_EVENT 0x1
|
|
|
|
#define RTAS_SEVERITY_NO_ERROR 0x0
|
|
|
|
|
|
|
|
/* RTAS event disposition */
|
|
|
|
#define RTAS_DISP_FULLY_RECOVERED 0x0
|
|
|
|
#define RTAS_DISP_LIMITED_RECOVERY 0x1
|
|
|
|
#define RTAS_DISP_NOT_RECOVERED 0x2
|
|
|
|
|
|
|
|
/* RTAS event initiator */
|
|
|
|
#define RTAS_INITIATOR_UNKNOWN 0x0
|
|
|
|
#define RTAS_INITIATOR_CPU 0x1
|
|
|
|
#define RTAS_INITIATOR_PCI 0x2
|
|
|
|
#define RTAS_INITIATOR_ISA 0x3
|
|
|
|
#define RTAS_INITIATOR_MEMORY 0x4
|
|
|
|
#define RTAS_INITIATOR_POWERMGM 0x5
|
|
|
|
|
|
|
|
/* RTAS event target */
|
|
|
|
#define RTAS_TARGET_UNKNOWN 0x0
|
|
|
|
#define RTAS_TARGET_CPU 0x1
|
|
|
|
#define RTAS_TARGET_PCI 0x2
|
|
|
|
#define RTAS_TARGET_ISA 0x3
|
|
|
|
#define RTAS_TARGET_MEMORY 0x4
|
|
|
|
#define RTAS_TARGET_POWERMGM 0x5
|
|
|
|
|
|
|
|
/* RTAS event type */
|
|
|
|
#define RTAS_TYPE_RETRY 0x01
|
|
|
|
#define RTAS_TYPE_TCE_ERR 0x02
|
|
|
|
#define RTAS_TYPE_INTERN_DEV_FAIL 0x03
|
|
|
|
#define RTAS_TYPE_TIMEOUT 0x04
|
|
|
|
#define RTAS_TYPE_DATA_PARITY 0x05
|
|
|
|
#define RTAS_TYPE_ADDR_PARITY 0x06
|
|
|
|
#define RTAS_TYPE_CACHE_PARITY 0x07
|
|
|
|
#define RTAS_TYPE_ADDR_INVALID 0x08
|
|
|
|
#define RTAS_TYPE_ECC_UNCORR 0x09
|
|
|
|
#define RTAS_TYPE_ECC_CORR 0x0a
|
|
|
|
#define RTAS_TYPE_EPOW 0x40
|
|
|
|
#define RTAS_TYPE_PLATFORM 0xE0
|
|
|
|
#define RTAS_TYPE_IO 0xE1
|
|
|
|
#define RTAS_TYPE_INFO 0xE2
|
|
|
|
#define RTAS_TYPE_DEALLOC 0xE3
|
|
|
|
#define RTAS_TYPE_DUMP 0xE4
|
2018-10-15 07:18:27 +08:00
|
|
|
#define RTAS_TYPE_HOTPLUG 0xE5
|
2005-10-06 10:06:20 +08:00
|
|
|
/* I don't add PowerMGM events right now, this is a different topic */
|
|
|
|
#define RTAS_TYPE_PMGM_POWER_SW_ON 0x60
|
|
|
|
#define RTAS_TYPE_PMGM_POWER_SW_OFF 0x61
|
|
|
|
#define RTAS_TYPE_PMGM_LID_OPEN 0x62
|
|
|
|
#define RTAS_TYPE_PMGM_LID_CLOSE 0x63
|
|
|
|
#define RTAS_TYPE_PMGM_SLEEP_BTN 0x64
|
|
|
|
#define RTAS_TYPE_PMGM_WAKE_BTN 0x65
|
|
|
|
#define RTAS_TYPE_PMGM_BATTERY_WARN 0x66
|
|
|
|
#define RTAS_TYPE_PMGM_BATTERY_CRIT 0x67
|
|
|
|
#define RTAS_TYPE_PMGM_SWITCH_TO_BAT 0x68
|
|
|
|
#define RTAS_TYPE_PMGM_SWITCH_TO_AC 0x69
|
|
|
|
#define RTAS_TYPE_PMGM_KBD_OR_MOUSE 0x6a
|
|
|
|
#define RTAS_TYPE_PMGM_ENCLOS_OPEN 0x6b
|
|
|
|
#define RTAS_TYPE_PMGM_ENCLOS_CLOSED 0x6c
|
|
|
|
#define RTAS_TYPE_PMGM_RING_INDICATE 0x6d
|
|
|
|
#define RTAS_TYPE_PMGM_LAN_ATTENTION 0x6e
|
|
|
|
#define RTAS_TYPE_PMGM_TIME_ALARM 0x6f
|
|
|
|
#define RTAS_TYPE_PMGM_CONFIG_CHANGE 0x70
|
|
|
|
#define RTAS_TYPE_PMGM_SERVICE_PROC 0x71
|
2013-04-24 13:51:33 +08:00
|
|
|
/* Platform Resource Reassignment Notification */
|
|
|
|
#define RTAS_TYPE_PRRN 0xA0
|
2005-10-06 10:06:20 +08:00
|
|
|
|
2010-05-27 05:40:39 +08:00
|
|
|
/* RTAS check-exception vector offset */
|
|
|
|
#define RTAS_VECTOR_EXTERNAL_INTERRUPT 0x500
|
|
|
|
|
2014-04-04 15:35:13 +08:00
|
|
|
static inline uint8_t rtas_error_severity(const struct rtas_error_log *elog)
|
|
|
|
{
|
|
|
|
return (elog->byte1 & 0xE0) >> 5;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline uint8_t rtas_error_disposition(const struct rtas_error_log *elog)
|
|
|
|
{
|
|
|
|
return (elog->byte1 & 0x18) >> 3;
|
|
|
|
}
|
|
|
|
|
2018-09-11 22:26:52 +08:00
|
|
|
static inline
|
|
|
|
void rtas_set_disposition_recovered(struct rtas_error_log *elog)
|
|
|
|
{
|
|
|
|
elog->byte1 &= ~0x18;
|
|
|
|
elog->byte1 |= (RTAS_DISP_FULLY_RECOVERED << 3);
|
|
|
|
}
|
|
|
|
|
2014-04-04 15:35:13 +08:00
|
|
|
static inline uint8_t rtas_error_extended(const struct rtas_error_log *elog)
|
|
|
|
{
|
|
|
|
return (elog->byte1 & 0x04) >> 2;
|
|
|
|
}
|
|
|
|
|
2018-09-11 22:27:07 +08:00
|
|
|
static inline uint8_t rtas_error_initiator(const struct rtas_error_log *elog)
|
|
|
|
{
|
|
|
|
return (elog->byte2 & 0xf0) >> 4;
|
|
|
|
}
|
|
|
|
|
2014-04-04 15:35:13 +08:00
|
|
|
#define rtas_error_type(x) ((x)->byte3)
|
|
|
|
|
|
|
|
static inline
|
|
|
|
uint32_t rtas_error_extended_log_length(const struct rtas_error_log *elog)
|
|
|
|
{
|
|
|
|
return be32_to_cpu(elog->extended_log_length);
|
|
|
|
}
|
|
|
|
|
2011-05-04 02:28:43 +08:00
|
|
|
#define RTAS_V6EXT_LOG_FORMAT_EVENT_LOG 14
|
|
|
|
|
|
|
|
#define RTAS_V6EXT_COMPANY_ID_IBM (('I' << 24) | ('B' << 16) | ('M' << 8))
|
|
|
|
|
2014-04-04 15:35:13 +08:00
|
|
|
static
|
|
|
|
inline uint8_t rtas_ext_event_log_format(struct rtas_ext_event_log_v6 *ext_log)
|
|
|
|
{
|
|
|
|
return ext_log->byte2 & 0x0F;
|
|
|
|
}
|
|
|
|
|
|
|
|
static
|
|
|
|
inline uint32_t rtas_ext_event_company_id(struct rtas_ext_event_log_v6 *ext_log)
|
|
|
|
{
|
|
|
|
return be32_to_cpu(ext_log->company_id);
|
|
|
|
}
|
|
|
|
|
2012-03-21 23:47:07 +08:00
|
|
|
/* pSeries event log format */
|
|
|
|
|
|
|
|
/* Two bytes ASCII section IDs */
|
|
|
|
#define PSERIES_ELOG_SECT_ID_PRIV_HDR (('P' << 8) | 'H')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_USER_HDR (('U' << 8) | 'H')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_PRIMARY_SRC (('P' << 8) | 'S')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_EXTENDED_UH (('E' << 8) | 'H')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_FAILING_MTMS (('M' << 8) | 'T')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_SECONDARY_SRC (('S' << 8) | 'S')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_DUMP_LOCATOR (('D' << 8) | 'H')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_FW_ERROR (('S' << 8) | 'W')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_IMPACT_PART_ID (('L' << 8) | 'P')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_LOGIC_RESOURCE_ID (('L' << 8) | 'R')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_HMC_ID (('H' << 8) | 'M')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_EPOW (('E' << 8) | 'P')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_IO_EVENT (('I' << 8) | 'E')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_MANUFACT_INFO (('M' << 8) | 'I')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_CALL_HOME (('C' << 8) | 'H')
|
|
|
|
#define PSERIES_ELOG_SECT_ID_USER_DEF (('U' << 8) | 'D')
|
2015-02-11 03:43:24 +08:00
|
|
|
#define PSERIES_ELOG_SECT_ID_HOTPLUG (('H' << 8) | 'P')
|
2018-09-11 22:26:52 +08:00
|
|
|
#define PSERIES_ELOG_SECT_ID_MCE (('M' << 8) | 'C')
|
2012-03-21 23:47:07 +08:00
|
|
|
|
2014-04-04 15:35:13 +08:00
|
|
|
static
|
|
|
|
inline uint16_t pseries_errorlog_id(struct pseries_errorlog *sect)
|
|
|
|
{
|
|
|
|
return be16_to_cpu(sect->id);
|
|
|
|
}
|
|
|
|
|
|
|
|
static
|
|
|
|
inline uint16_t pseries_errorlog_length(struct pseries_errorlog *sect)
|
|
|
|
{
|
|
|
|
return be16_to_cpu(sect->length);
|
|
|
|
}
|
|
|
|
|
2015-02-11 03:43:24 +08:00
|
|
|
#define PSERIES_HP_ELOG_RESOURCE_CPU 1
|
|
|
|
#define PSERIES_HP_ELOG_RESOURCE_MEM 2
|
|
|
|
#define PSERIES_HP_ELOG_RESOURCE_SLOT 3
|
|
|
|
#define PSERIES_HP_ELOG_RESOURCE_PHB 4
|
2018-10-15 07:18:27 +08:00
|
|
|
#define PSERIES_HP_ELOG_RESOURCE_PMEM 6
|
2015-02-11 03:43:24 +08:00
|
|
|
|
|
|
|
#define PSERIES_HP_ELOG_ACTION_ADD 1
|
|
|
|
#define PSERIES_HP_ELOG_ACTION_REMOVE 2
|
2017-01-07 03:27:26 +08:00
|
|
|
#define PSERIES_HP_ELOG_ACTION_READD 3
|
2015-02-11 03:43:24 +08:00
|
|
|
|
|
|
|
#define PSERIES_HP_ELOG_ID_DRC_NAME 1
|
|
|
|
#define PSERIES_HP_ELOG_ID_DRC_INDEX 2
|
|
|
|
#define PSERIES_HP_ELOG_ID_DRC_COUNT 3
|
2017-02-16 02:45:56 +08:00
|
|
|
#define PSERIES_HP_ELOG_ID_DRC_IC 4
|
2015-02-11 03:43:24 +08:00
|
|
|
|
2012-03-21 23:47:07 +08:00
|
|
|
struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log,
|
|
|
|
uint16_t section_id);
|
|
|
|
|
2005-11-03 11:41:19 +08:00
|
|
|
/*
|
|
|
|
* This can be set by the rtas_flash module so that it can get called
|
|
|
|
* as the absolutely last thing before the kernel terminates.
|
2005-10-06 10:06:20 +08:00
|
|
|
*/
|
2005-11-03 11:41:19 +08:00
|
|
|
extern void (*rtas_flash_term_hook)(int);
|
2005-10-06 10:06:20 +08:00
|
|
|
|
|
|
|
extern struct rtas_t rtas;
|
|
|
|
|
|
|
|
extern int rtas_token(const char *service);
|
2006-12-07 08:50:45 +08:00
|
|
|
extern int rtas_service_present(const char *service);
|
2005-10-06 10:06:20 +08:00
|
|
|
extern int rtas_call(int token, int, int, int *, ...);
|
powerpc/rtas: Implement reentrant rtas call
Implement rtas_call_reentrant() for reentrant rtas-calls:
"ibm,int-on", "ibm,int-off",ibm,get-xive" and "ibm,set-xive".
On LoPAPR Version 1.1 (March 24, 2016), from 7.3.10.1 to 7.3.10.4,
items 2 and 3 say:
2 - For the PowerPC External Interrupt option: The * call must be
reentrant to the number of processors on the platform.
3 - For the PowerPC External Interrupt option: The * argument call
buffer for each simultaneous call must be physically unique.
So, these rtas-calls can be called in a lockless way, if using
a different buffer for each cpu doing such rtas call.
For this, it was suggested to add the buffer (struct rtas_args)
in the PACA struct, so each cpu can have it's own buffer.
The PACA struct received a pointer to rtas buffer, which is
allocated in the memory range available to rtas 32-bit.
Reentrant rtas calls are useful to avoid deadlocks in crashing,
where rtas-calls are needed, but some other thread crashed holding
the rtas.lock.
This is a backtrace of a deadlock from a kdump testing environment:
#0 arch_spin_lock
#1 lock_rtas ()
#2 rtas_call (token=8204, nargs=1, nret=1, outputs=0x0)
#3 ics_rtas_mask_real_irq (hw_irq=4100)
#4 machine_kexec_mask_interrupts
#5 default_machine_crash_shutdown
#6 machine_crash_shutdown
#7 __crash_kexec
#8 crash_kexec
#9 oops_end
Signed-off-by: Leonardo Bras <leobras.c@gmail.com>
[mpe: Move under #ifdef PSERIES to avoid build breakage]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20200518234245.200672-3-leobras.c@gmail.com
2020-05-19 07:42:45 +08:00
|
|
|
int rtas_call_reentrant(int token, int nargs, int nret, int *outputs, ...);
|
2015-12-16 18:01:42 +08:00
|
|
|
void rtas_call_unlocked(struct rtas_args *args, int token, int nargs,
|
|
|
|
int nret, ...);
|
2016-07-12 08:54:52 +08:00
|
|
|
extern void __noreturn rtas_restart(char *cmd);
|
2005-10-06 10:06:20 +08:00
|
|
|
extern void rtas_power_off(void);
|
2016-07-12 08:54:52 +08:00
|
|
|
extern void __noreturn rtas_halt(void);
|
2007-12-03 06:30:04 +08:00
|
|
|
extern void rtas_os_term(char *str);
|
2005-10-06 10:06:20 +08:00
|
|
|
extern int rtas_get_sensor(int sensor, int index, int *state);
|
2015-07-17 18:46:58 +08:00
|
|
|
extern int rtas_get_sensor_fast(int sensor, int index, int *state);
|
2005-10-06 10:06:20 +08:00
|
|
|
extern int rtas_get_power_level(int powerdomain, int *level);
|
|
|
|
extern int rtas_set_power_level(int powerdomain, int level, int *setlevel);
|
2008-12-11 17:14:25 +08:00
|
|
|
extern bool rtas_indicator_present(int token, int *maxindex);
|
2005-10-06 10:06:20 +08:00
|
|
|
extern int rtas_set_indicator(int indicator, int index, int new_value);
|
2006-07-28 05:29:00 +08:00
|
|
|
extern int rtas_set_indicator_fast(int indicator, int index, int new_value);
|
2005-10-06 10:06:20 +08:00
|
|
|
extern void rtas_progress(char *s, unsigned short hex);
|
2010-07-07 20:31:01 +08:00
|
|
|
extern int rtas_suspend_cpu(struct rtas_suspend_me_data *data);
|
|
|
|
extern int rtas_suspend_last_cpu(struct rtas_suspend_me_data *data);
|
2013-05-07 12:34:11 +08:00
|
|
|
extern int rtas_online_cpus_mask(cpumask_var_t cpus);
|
|
|
|
extern int rtas_offline_cpus_mask(cpumask_var_t cpus);
|
2015-03-28 03:47:25 +08:00
|
|
|
extern int rtas_ibm_suspend_me(u64 handle);
|
2005-10-06 10:06:20 +08:00
|
|
|
|
|
|
|
struct rtc_time;
|
2018-04-23 16:36:40 +08:00
|
|
|
extern time64_t rtas_get_boot_time(void);
|
2005-10-06 10:06:20 +08:00
|
|
|
extern void rtas_get_rtc_time(struct rtc_time *rtc_time);
|
|
|
|
extern int rtas_set_rtc_time(struct rtc_time *rtc_time);
|
|
|
|
|
2006-06-06 05:31:48 +08:00
|
|
|
extern unsigned int rtas_busy_delay_time(int status);
|
|
|
|
extern unsigned int rtas_busy_delay(int status);
|
2005-10-06 10:06:20 +08:00
|
|
|
|
2006-06-23 16:20:13 +08:00
|
|
|
extern int early_init_dt_scan_rtas(unsigned long node,
|
|
|
|
const char *uname, int depth, void *data);
|
|
|
|
|
2005-10-06 10:06:20 +08:00
|
|
|
extern void pSeries_log_error(char *buf, unsigned int err_type, int fatal);
|
|
|
|
|
powerpc/pseries: Expose pseries devicetree_update()
Newer firmware on Power systems can transparently reassign platform resources
(CPU and Memory) in use. For instance, if a processor or memory unit is
predicted to fail, the platform may transparently move the processing to an
equivalent unused processor or the memory state to an equivalent unused
memory unit. However, reassigning resources across NUMA boundaries may alter
the performance of the partition. When such reassignment is necessary, the
Platform Resource Reassignment Notification (PRRN) option provides a
mechanism to inform the Linux kernel of changes to the NUMA affinity of
its platform resources.
When rtasd receives a PRRN event, it needs to make a series of RTAS
calls (ibm,update-nodes and ibm,update-properties) to retrieve the
updated device tree information. These calls are already handled in the
pseries_devicetree_update() routine used in partition migration.
This patch exposes pseries_devicetree_update() to make it accessible
to other pseries routines, this patch also updates pseries_devicetree_update()
to take a 32-bit scope parameter. The scope value, which was previously hard
coded to 1 for partition migration, is used for the RTAS calls
ibm,update-nodes/properties to update the device tree.
Signed-off-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
2013-04-24 13:47:11 +08:00
|
|
|
#ifdef CONFIG_PPC_PSERIES
|
2015-02-06 03:37:17 +08:00
|
|
|
extern time64_t last_rtas_event;
|
2015-02-06 03:36:04 +08:00
|
|
|
extern int clobbering_unread_rtas_event(void);
|
powerpc/pseries: Expose pseries devicetree_update()
Newer firmware on Power systems can transparently reassign platform resources
(CPU and Memory) in use. For instance, if a processor or memory unit is
predicted to fail, the platform may transparently move the processing to an
equivalent unused processor or the memory state to an equivalent unused
memory unit. However, reassigning resources across NUMA boundaries may alter
the performance of the partition. When such reassignment is necessary, the
Platform Resource Reassignment Notification (PRRN) option provides a
mechanism to inform the Linux kernel of changes to the NUMA affinity of
its platform resources.
When rtasd receives a PRRN event, it needs to make a series of RTAS
calls (ibm,update-nodes and ibm,update-properties) to retrieve the
updated device tree information. These calls are already handled in the
pseries_devicetree_update() routine used in partition migration.
This patch exposes pseries_devicetree_update() to make it accessible
to other pseries routines, this patch also updates pseries_devicetree_update()
to take a 32-bit scope parameter. The scope value, which was previously hard
coded to 1 for partition migration, is used for the RTAS calls
ibm,update-nodes/properties to update the device tree.
Signed-off-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
2013-04-24 13:47:11 +08:00
|
|
|
extern int pseries_devicetree_update(s32 scope);
|
2014-02-26 12:02:18 +08:00
|
|
|
extern void post_mobility_fixup(void);
|
2015-02-06 03:36:04 +08:00
|
|
|
#else
|
|
|
|
static inline int clobbering_unread_rtas_event(void) { return 0; }
|
powerpc/pseries: Expose pseries devicetree_update()
Newer firmware on Power systems can transparently reassign platform resources
(CPU and Memory) in use. For instance, if a processor or memory unit is
predicted to fail, the platform may transparently move the processing to an
equivalent unused processor or the memory state to an equivalent unused
memory unit. However, reassigning resources across NUMA boundaries may alter
the performance of the partition. When such reassignment is necessary, the
Platform Resource Reassignment Notification (PRRN) option provides a
mechanism to inform the Linux kernel of changes to the NUMA affinity of
its platform resources.
When rtasd receives a PRRN event, it needs to make a series of RTAS
calls (ibm,update-nodes and ibm,update-properties) to retrieve the
updated device tree information. These calls are already handled in the
pseries_devicetree_update() routine used in partition migration.
This patch exposes pseries_devicetree_update() to make it accessible
to other pseries routines, this patch also updates pseries_devicetree_update()
to take a 32-bit scope parameter. The scope value, which was previously hard
coded to 1 for partition migration, is used for the RTAS calls
ibm,update-nodes/properties to update the device tree.
Signed-off-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
2013-04-24 13:47:11 +08:00
|
|
|
#endif
|
|
|
|
|
2011-10-04 05:49:53 +08:00
|
|
|
#ifdef CONFIG_PPC_RTAS_DAEMON
|
|
|
|
extern void rtas_cancel_event_scan(void);
|
|
|
|
#else
|
|
|
|
static inline void rtas_cancel_event_scan(void) { }
|
|
|
|
#endif
|
|
|
|
|
2005-10-06 10:06:20 +08:00
|
|
|
/* Error types logged. */
|
|
|
|
#define ERR_FLAG_ALREADY_LOGGED 0x0
|
|
|
|
#define ERR_FLAG_BOOT 0x1 /* log was pulled from NVRAM on boot */
|
|
|
|
#define ERR_TYPE_RTAS_LOG 0x2 /* from rtas event-scan */
|
2011-07-25 15:54:50 +08:00
|
|
|
#define ERR_TYPE_KERNEL_PANIC 0x4 /* from die()/panic() */
|
|
|
|
#define ERR_TYPE_KERNEL_PANIC_GZ 0x8 /* ditto, compressed */
|
2005-10-06 10:06:20 +08:00
|
|
|
|
|
|
|
/* All the types and not flags */
|
2011-07-25 15:54:50 +08:00
|
|
|
#define ERR_TYPE_MASK \
|
|
|
|
(ERR_TYPE_RTAS_LOG | ERR_TYPE_KERNEL_PANIC | ERR_TYPE_KERNEL_PANIC_GZ)
|
2005-10-06 10:06:20 +08:00
|
|
|
|
|
|
|
#define RTAS_DEBUG KERN_DEBUG "RTAS: "
|
|
|
|
|
|
|
|
#define RTAS_ERROR_LOG_MAX 2048
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Return the firmware-specified size of the error log buffer
|
|
|
|
* for all rtas calls that require an error buffer argument.
|
|
|
|
* This includes 'check-exception' and 'rtas-last-error'.
|
|
|
|
*/
|
|
|
|
extern int rtas_get_error_log_max(void);
|
|
|
|
|
|
|
|
/* Event Scan Parameters */
|
|
|
|
#define EVENT_SCAN_ALL_EVENTS 0xf0000000
|
|
|
|
#define SURVEILLANCE_TOKEN 9000
|
|
|
|
#define LOG_NUMBER 64 /* must be a power of two */
|
|
|
|
#define LOG_NUMBER_MASK (LOG_NUMBER-1)
|
|
|
|
|
|
|
|
/* Some RTAS ops require a data buffer and that buffer must be < 4G.
|
|
|
|
* Rather than having a memory allocator, just use this buffer
|
|
|
|
* (get the lock first), make the RTAS call. Copy the data instead
|
|
|
|
* of holding the buffer for long.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define RTAS_DATA_BUF_SIZE 4096
|
|
|
|
extern spinlock_t rtas_data_buf_lock;
|
|
|
|
extern char rtas_data_buf[RTAS_DATA_BUF_SIZE];
|
|
|
|
|
|
|
|
/* RMO buffer reserved for user-space RTAS use */
|
|
|
|
extern unsigned long rtas_rmo_buf;
|
|
|
|
|
|
|
|
#define GLOBAL_INTERRUPT_QUEUE 9005
|
|
|
|
|
2006-08-16 20:04:14 +08:00
|
|
|
/**
|
|
|
|
* rtas_config_addr - Format a busno, devfn and reg for RTAS.
|
|
|
|
* @busno: The bus number.
|
|
|
|
* @devfn: The device and function number as encoded by PCI_DEVFN().
|
|
|
|
* @reg: The register number.
|
|
|
|
*
|
|
|
|
* This function encodes the given busno, devfn and register number as
|
|
|
|
* required for RTAS calls that take a "config_addr" parameter.
|
|
|
|
* See PAPR requirement 7.3.4-1 for more info.
|
|
|
|
*/
|
|
|
|
static inline u32 rtas_config_addr(int busno, int devfn, int reg)
|
|
|
|
{
|
|
|
|
return ((reg & 0xf00) << 20) | ((busno & 0xff) << 16) |
|
|
|
|
(devfn << 8) | (reg & 0xff);
|
|
|
|
}
|
|
|
|
|
2013-06-25 03:30:09 +08:00
|
|
|
extern void rtas_give_timebase(void);
|
|
|
|
extern void rtas_take_timebase(void);
|
2009-06-17 00:42:50 +08:00
|
|
|
|
2011-12-02 20:26:23 +08:00
|
|
|
#ifdef CONFIG_PPC_RTAS
|
|
|
|
static inline int page_is_rtas_user_buf(unsigned long pfn)
|
|
|
|
{
|
|
|
|
unsigned long paddr = (pfn << PAGE_SHIFT);
|
|
|
|
if (paddr >= rtas_rmo_buf && paddr < (rtas_rmo_buf + RTAS_RMOBUF_MAX))
|
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
2012-10-03 00:59:39 +08:00
|
|
|
|
|
|
|
/* Not the best place to put pSeries_coalesce_init, will be fixed when we
|
|
|
|
* move some of the rtas suspend-me stuff to pseries */
|
|
|
|
extern void pSeries_coalesce_init(void);
|
2016-07-05 13:07:51 +08:00
|
|
|
void rtas_initialize(void);
|
2011-12-02 20:26:23 +08:00
|
|
|
#else
|
|
|
|
static inline int page_is_rtas_user_buf(unsigned long pfn) { return 0;}
|
2012-10-03 00:59:39 +08:00
|
|
|
static inline void pSeries_coalesce_init(void) { }
|
2016-07-05 13:07:51 +08:00
|
|
|
static inline void rtas_initialize(void) { };
|
2011-12-02 20:26:23 +08:00
|
|
|
#endif
|
|
|
|
|
2012-03-29 01:30:02 +08:00
|
|
|
extern int call_rtas(const char *, int, int, unsigned long *, ...);
|
|
|
|
|
2020-05-25 18:43:04 +08:00
|
|
|
#ifdef CONFIG_HV_PERF_CTRS
|
|
|
|
void read_24x7_sys_info(void);
|
|
|
|
#else
|
|
|
|
static inline void read_24x7_sys_info(void) { }
|
|
|
|
#endif
|
|
|
|
|
2005-12-17 05:43:46 +08:00
|
|
|
#endif /* __KERNEL__ */
|
2005-10-06 10:06:20 +08:00
|
|
|
#endif /* _POWERPC_RTAS_H */
|