Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
Pull powerpc merge from Benjamin Herrenschmidt:
"Here's the powerpc batch for this merge window. It is going to be a
bit more nasty than usual as in touching things outside of
arch/powerpc mostly due to the big iSeriesectomy :-) We finally got
rid of the bugger (legacy iSeries support) which was a PITA to
maintain and that nobody really used anymore.
Here are some of the highlights:
- Legacy iSeries is gone. Thanks Stephen ! There's still some bits
and pieces remaining if you do a grep -ir series arch/powerpc but
they are harmless and will be removed in the next few weeks
hopefully.
- The 'fadump' functionality (Firmware Assisted Dump) replaces the
previous (equivalent) "pHyp assisted dump"... it's a rewrite of a
mechanism to get the hypervisor to do crash dumps on pSeries, the
new implementation hopefully being much more reliable. Thanks
Mahesh Salgaonkar.
- The "EEH" code (pSeries PCI error handling & recovery) got a big
spring cleaning, motivated by the need to be able to implement a
new backend for it on top of some new different type of firwmare.
The work isn't complete yet, but a good chunk of the cleanups is
there. Note that this adds a field to struct device_node which is
not very nice and which Grant objects to. I will have a patch soon
that moves that to a powerpc private data structure (hopefully
before rc1) and we'll improve things further later on (hopefully
getting rid of the need for that pointer completely). Thanks Gavin
Shan.
- I dug into our exception & interrupt handling code to improve the
way we do lazy interrupt handling (and make it work properly with
"edge" triggered interrupt sources), and while at it found & fixed
a wagon of issues in those areas, including adding support for page
fault retry & fatal signals on page faults.
- Your usual random batch of small fixes & updates, including a bunch
of new embedded boards, both Freescale and APM based ones, etc..."
I fixed up some conflicts with the generalized irq-domain changes from
Grant Likely, hopefully correctly.
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (141 commits)
powerpc/ps3: Do not adjust the wrapper load address
powerpc: Remove the rest of the legacy iSeries include files
powerpc: Remove the remaining CONFIG_PPC_ISERIES pieces
init: Remove CONFIG_PPC_ISERIES
powerpc: Remove FW_FEATURE ISERIES from arch code
tty/hvc_vio: FW_FEATURE_ISERIES is no longer selectable
powerpc/spufs: Fix double unlocks
powerpc/5200: convert mpc5200 to use of_platform_populate()
powerpc/mpc5200: add options to mpc5200_defconfig
powerpc/mpc52xx: add a4m072 board support
powerpc/mpc5200: update mpc5200_defconfig to fit for charon board
Documentation/powerpc/mpc52xx.txt: Checkpatch cleanup
powerpc/44x: Add additional device support for APM821xx SoC and Bluestone board
powerpc/44x: Add support PCI-E for APM821xx SoC and Bluestone board
MAINTAINERS: Update PowerPC 4xx tree
powerpc/44x: The bug fixed support for APM821xx SoC and Bluestone board
powerpc: document the FSL MPIC message register binding
powerpc: add support for MPIC message register API
powerpc/fsl: Added aliased MSIIR register address to MSI node in dts
powerpc/85xx: mpc8548cds - add 36-bit dts
...
This commit is contained in:
@@ -17,7 +17,6 @@
|
||||
#include <asm/types.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/firmware.h>
|
||||
|
||||
struct mschunks_map {
|
||||
unsigned long num_chunks;
|
||||
@@ -46,30 +45,12 @@ static inline unsigned long addr_to_chunk(unsigned long addr)
|
||||
|
||||
static inline unsigned long phys_to_abs(unsigned long pa)
|
||||
{
|
||||
unsigned long chunk;
|
||||
|
||||
/* This is a no-op on non-iSeries */
|
||||
if (!firmware_has_feature(FW_FEATURE_ISERIES))
|
||||
return pa;
|
||||
|
||||
chunk = addr_to_chunk(pa);
|
||||
|
||||
if (chunk < mschunks_map.num_chunks)
|
||||
chunk = mschunks_map.mapping[chunk];
|
||||
|
||||
return chunk_to_addr(chunk) + (pa & MSCHUNKS_OFFSET_MASK);
|
||||
return pa;
|
||||
}
|
||||
|
||||
/* Convenience macros */
|
||||
#define virt_to_abs(va) phys_to_abs(__pa(va))
|
||||
#define abs_to_virt(aa) __va(aa)
|
||||
|
||||
/*
|
||||
* Converts Virtual Address to Real Address for
|
||||
* Legacy iSeries Hypervisor calls
|
||||
*/
|
||||
#define iseries_hv_addr(virtaddr) \
|
||||
(0x8000000000000000UL | virt_to_abs(virtaddr))
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_ABS_ADDR_H */
|
||||
|
||||
@@ -212,6 +212,36 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u)
|
||||
return t;
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_inc_not_zero - increment unless the number is zero
|
||||
* @v: pointer of type atomic_t
|
||||
*
|
||||
* Atomically increments @v by 1, so long as @v is non-zero.
|
||||
* Returns non-zero if @v was non-zero, and zero otherwise.
|
||||
*/
|
||||
static __inline__ int atomic_inc_not_zero(atomic_t *v)
|
||||
{
|
||||
int t1, t2;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
PPC_ATOMIC_ENTRY_BARRIER
|
||||
"1: lwarx %0,0,%2 # atomic_inc_not_zero\n\
|
||||
cmpwi 0,%0,0\n\
|
||||
beq- 2f\n\
|
||||
addic %1,%0,1\n"
|
||||
PPC405_ERR77(0,%2)
|
||||
" stwcx. %1,0,%2\n\
|
||||
bne- 1b\n"
|
||||
PPC_ATOMIC_EXIT_BARRIER
|
||||
"\n\
|
||||
2:"
|
||||
: "=&r" (t1), "=&r" (t2)
|
||||
: "r" (&v->counter)
|
||||
: "cc", "xer", "memory");
|
||||
|
||||
return t1;
|
||||
}
|
||||
#define atomic_inc_not_zero(v) atomic_inc_not_zero((v))
|
||||
|
||||
#define atomic_sub_and_test(a, v) (atomic_sub_return((a), (v)) == 0)
|
||||
#define atomic_dec_and_test(v) (atomic_dec_return((v)) == 0)
|
||||
@@ -467,7 +497,34 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
|
||||
return t != u;
|
||||
}
|
||||
|
||||
#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
|
||||
/**
|
||||
* atomic_inc64_not_zero - increment unless the number is zero
|
||||
* @v: pointer of type atomic64_t
|
||||
*
|
||||
* Atomically increments @v by 1, so long as @v is non-zero.
|
||||
* Returns non-zero if @v was non-zero, and zero otherwise.
|
||||
*/
|
||||
static __inline__ long atomic64_inc_not_zero(atomic64_t *v)
|
||||
{
|
||||
long t1, t2;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
PPC_ATOMIC_ENTRY_BARRIER
|
||||
"1: ldarx %0,0,%2 # atomic64_inc_not_zero\n\
|
||||
cmpdi 0,%0,0\n\
|
||||
beq- 2f\n\
|
||||
addic %1,%0,1\n\
|
||||
stdcx. %1,0,%2\n\
|
||||
bne- 1b\n"
|
||||
PPC_ATOMIC_EXIT_BARRIER
|
||||
"\n\
|
||||
2:"
|
||||
: "=&r" (t1), "=&r" (t2)
|
||||
: "r" (&v->counter)
|
||||
: "cc", "xer", "memory");
|
||||
|
||||
return t1;
|
||||
}
|
||||
|
||||
#endif /* __powerpc64__ */
|
||||
|
||||
|
||||
@@ -390,6 +390,10 @@ extern const char *powerpc_base_platform;
|
||||
CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \
|
||||
CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
|
||||
CPU_FTR_DEBUG_LVL_EXC)
|
||||
#define CPU_FTRS_E6500 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \
|
||||
CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \
|
||||
CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
|
||||
CPU_FTR_DEBUG_LVL_EXC)
|
||||
#define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN)
|
||||
|
||||
/* 64-bit CPUs */
|
||||
@@ -442,7 +446,7 @@ extern const char *powerpc_base_platform;
|
||||
|
||||
#ifdef __powerpc64__
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
#define CPU_FTRS_POSSIBLE (CPU_FTRS_E5500 | CPU_FTRS_A2)
|
||||
#define CPU_FTRS_POSSIBLE (CPU_FTRS_E6500 | CPU_FTRS_E5500 | CPU_FTRS_A2)
|
||||
#else
|
||||
#define CPU_FTRS_POSSIBLE \
|
||||
(CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 | \
|
||||
@@ -483,7 +487,7 @@ enum {
|
||||
#endif
|
||||
#ifdef CONFIG_E500
|
||||
CPU_FTRS_E500 | CPU_FTRS_E500_2 | CPU_FTRS_E500MC |
|
||||
CPU_FTRS_E5500 |
|
||||
CPU_FTRS_E5500 | CPU_FTRS_E6500 |
|
||||
#endif
|
||||
0,
|
||||
};
|
||||
@@ -491,7 +495,7 @@ enum {
|
||||
|
||||
#ifdef __powerpc64__
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
#define CPU_FTRS_ALWAYS (CPU_FTRS_E5500 & CPU_FTRS_A2)
|
||||
#define CPU_FTRS_ALWAYS (CPU_FTRS_E6500 & CPU_FTRS_E5500 & CPU_FTRS_A2)
|
||||
#else
|
||||
#define CPU_FTRS_ALWAYS \
|
||||
(CPU_FTRS_POWER3 & CPU_FTRS_RS64 & CPU_FTRS_POWER4 & \
|
||||
@@ -528,7 +532,7 @@ enum {
|
||||
#endif
|
||||
#ifdef CONFIG_E500
|
||||
CPU_FTRS_E500 & CPU_FTRS_E500_2 & CPU_FTRS_E500MC &
|
||||
CPU_FTRS_E5500 &
|
||||
CPU_FTRS_E5500 & CPU_FTRS_E6500 &
|
||||
#endif
|
||||
CPU_FTRS_POSSIBLE,
|
||||
};
|
||||
|
||||
@@ -31,6 +31,9 @@ struct dev_archdata {
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
dma_addr_t max_direct_dma_addr;
|
||||
#endif
|
||||
#ifdef CONFIG_EEH
|
||||
struct eeh_dev *edev;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct pdev_archdata {
|
||||
|
||||
@@ -34,8 +34,6 @@
|
||||
/* Doesn't really apply... */
|
||||
#define MAX_DMA_ADDRESS (~0UL)
|
||||
|
||||
#if !defined(CONFIG_PPC_ISERIES) || defined(CONFIG_PCI)
|
||||
|
||||
#ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
|
||||
#define dma_outb outb_p
|
||||
#else
|
||||
@@ -354,7 +352,5 @@ extern int isa_dma_bridge_buggy;
|
||||
#define isa_dma_bridge_buggy (0)
|
||||
#endif
|
||||
|
||||
#endif /* !defined(CONFIG_PPC_ISERIES) || defined(CONFIG_PCI) */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_DMA_H */
|
||||
|
||||
+106
-28
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* eeh.h
|
||||
* Copyright (C) 2001 Dave Engebretsen & Todd Inglett IBM Corporation.
|
||||
* Copyright 2001-2012 IBM Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -31,44 +31,105 @@ struct device_node;
|
||||
|
||||
#ifdef CONFIG_EEH
|
||||
|
||||
/*
|
||||
* The struct is used to trace EEH state for the associated
|
||||
* PCI device node or PCI device. In future, it might
|
||||
* represent PE as well so that the EEH device to form
|
||||
* another tree except the currently existing tree of PCI
|
||||
* buses and PCI devices
|
||||
*/
|
||||
#define EEH_MODE_SUPPORTED (1<<0) /* EEH supported on the device */
|
||||
#define EEH_MODE_NOCHECK (1<<1) /* EEH check should be skipped */
|
||||
#define EEH_MODE_ISOLATED (1<<2) /* The device has been isolated */
|
||||
#define EEH_MODE_RECOVERING (1<<3) /* Recovering the device */
|
||||
#define EEH_MODE_IRQ_DISABLED (1<<4) /* Interrupt disabled */
|
||||
|
||||
struct eeh_dev {
|
||||
int mode; /* EEH mode */
|
||||
int class_code; /* Class code of the device */
|
||||
int config_addr; /* Config address */
|
||||
int pe_config_addr; /* PE config address */
|
||||
int check_count; /* Times of ignored error */
|
||||
int freeze_count; /* Times of froze up */
|
||||
int false_positives; /* Times of reported #ff's */
|
||||
u32 config_space[16]; /* Saved PCI config space */
|
||||
struct pci_controller *phb; /* Associated PHB */
|
||||
struct device_node *dn; /* Associated device node */
|
||||
struct pci_dev *pdev; /* Associated PCI device */
|
||||
};
|
||||
|
||||
static inline struct device_node *eeh_dev_to_of_node(struct eeh_dev *edev)
|
||||
{
|
||||
return edev->dn;
|
||||
}
|
||||
|
||||
static inline struct pci_dev *eeh_dev_to_pci_dev(struct eeh_dev *edev)
|
||||
{
|
||||
return edev->pdev;
|
||||
}
|
||||
|
||||
/*
|
||||
* The struct is used to trace the registered EEH operation
|
||||
* callback functions. Actually, those operation callback
|
||||
* functions are heavily platform dependent. That means the
|
||||
* platform should register its own EEH operation callback
|
||||
* functions before any EEH further operations.
|
||||
*/
|
||||
#define EEH_OPT_DISABLE 0 /* EEH disable */
|
||||
#define EEH_OPT_ENABLE 1 /* EEH enable */
|
||||
#define EEH_OPT_THAW_MMIO 2 /* MMIO enable */
|
||||
#define EEH_OPT_THAW_DMA 3 /* DMA enable */
|
||||
#define EEH_STATE_UNAVAILABLE (1 << 0) /* State unavailable */
|
||||
#define EEH_STATE_NOT_SUPPORT (1 << 1) /* EEH not supported */
|
||||
#define EEH_STATE_RESET_ACTIVE (1 << 2) /* Active reset */
|
||||
#define EEH_STATE_MMIO_ACTIVE (1 << 3) /* Active MMIO */
|
||||
#define EEH_STATE_DMA_ACTIVE (1 << 4) /* Active DMA */
|
||||
#define EEH_STATE_MMIO_ENABLED (1 << 5) /* MMIO enabled */
|
||||
#define EEH_STATE_DMA_ENABLED (1 << 6) /* DMA enabled */
|
||||
#define EEH_RESET_DEACTIVATE 0 /* Deactivate the PE reset */
|
||||
#define EEH_RESET_HOT 1 /* Hot reset */
|
||||
#define EEH_RESET_FUNDAMENTAL 3 /* Fundamental reset */
|
||||
#define EEH_LOG_TEMP 1 /* EEH temporary error log */
|
||||
#define EEH_LOG_PERM 2 /* EEH permanent error log */
|
||||
|
||||
struct eeh_ops {
|
||||
char *name;
|
||||
int (*init)(void);
|
||||
int (*set_option)(struct device_node *dn, int option);
|
||||
int (*get_pe_addr)(struct device_node *dn);
|
||||
int (*get_state)(struct device_node *dn, int *state);
|
||||
int (*reset)(struct device_node *dn, int option);
|
||||
int (*wait_state)(struct device_node *dn, int max_wait);
|
||||
int (*get_log)(struct device_node *dn, int severity, char *drv_log, unsigned long len);
|
||||
int (*configure_bridge)(struct device_node *dn);
|
||||
int (*read_config)(struct device_node *dn, int where, int size, u32 *val);
|
||||
int (*write_config)(struct device_node *dn, int where, int size, u32 val);
|
||||
};
|
||||
|
||||
extern struct eeh_ops *eeh_ops;
|
||||
extern int eeh_subsystem_enabled;
|
||||
|
||||
/* Values for eeh_mode bits in device_node */
|
||||
#define EEH_MODE_SUPPORTED (1<<0)
|
||||
#define EEH_MODE_NOCHECK (1<<1)
|
||||
#define EEH_MODE_ISOLATED (1<<2)
|
||||
#define EEH_MODE_RECOVERING (1<<3)
|
||||
#define EEH_MODE_IRQ_DISABLED (1<<4)
|
||||
|
||||
/* Max number of EEH freezes allowed before we consider the device
|
||||
* to be permanently disabled. */
|
||||
/*
|
||||
* Max number of EEH freezes allowed before we consider the device
|
||||
* to be permanently disabled.
|
||||
*/
|
||||
#define EEH_MAX_ALLOWED_FREEZES 5
|
||||
|
||||
void * __devinit eeh_dev_init(struct device_node *dn, void *data);
|
||||
void __devinit eeh_dev_phb_init_dynamic(struct pci_controller *phb);
|
||||
void __init eeh_dev_phb_init(void);
|
||||
void __init eeh_init(void);
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
int __init eeh_pseries_init(void);
|
||||
#endif
|
||||
int __init eeh_ops_register(struct eeh_ops *ops);
|
||||
int __exit eeh_ops_unregister(const char *name);
|
||||
unsigned long eeh_check_failure(const volatile void __iomem *token,
|
||||
unsigned long val);
|
||||
int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev);
|
||||
void __init pci_addr_cache_build(void);
|
||||
|
||||
/**
|
||||
* eeh_add_device_early
|
||||
* eeh_add_device_late
|
||||
*
|
||||
* Perform eeh initialization for devices added after boot.
|
||||
* Call eeh_add_device_early before doing any i/o to the
|
||||
* device (including config space i/o). Call eeh_add_device_late
|
||||
* to finish the eeh setup for this device.
|
||||
*/
|
||||
void eeh_add_device_tree_early(struct device_node *);
|
||||
void eeh_add_device_tree_late(struct pci_bus *);
|
||||
|
||||
/**
|
||||
* eeh_remove_device_recursive - undo EEH for device & children.
|
||||
* @dev: pci device to be removed
|
||||
*
|
||||
* As above, this removes the device; it also removes child
|
||||
* pci devices as well.
|
||||
*/
|
||||
void eeh_remove_bus_device(struct pci_dev *);
|
||||
|
||||
/**
|
||||
@@ -87,8 +148,25 @@ void eeh_remove_bus_device(struct pci_dev *);
|
||||
#define EEH_IO_ERROR_VALUE(size) (~0U >> ((4 - (size)) * 8))
|
||||
|
||||
#else /* !CONFIG_EEH */
|
||||
|
||||
static inline void *eeh_dev_init(struct device_node *dn, void *data)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void eeh_dev_phb_init_dynamic(struct pci_controller *phb) { }
|
||||
|
||||
static inline void eeh_dev_phb_init(void) { }
|
||||
|
||||
static inline void eeh_init(void) { }
|
||||
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
static inline int eeh_pseries_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_PPC_PSERIES */
|
||||
|
||||
static inline unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val)
|
||||
{
|
||||
return val;
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* eeh_event.h
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
@@ -22,32 +20,19 @@
|
||||
#define ASM_POWERPC_EEH_EVENT_H
|
||||
#ifdef __KERNEL__
|
||||
|
||||
/** EEH event -- structure holding pci controller data that describes
|
||||
* a change in the isolation status of a PCI slot. A pointer
|
||||
* to this struct is passed as the data pointer in a notify callback.
|
||||
/*
|
||||
* structure holding pci controller data that describes a
|
||||
* change in the isolation status of a PCI slot. A pointer
|
||||
* to this struct is passed as the data pointer in a notify
|
||||
* callback.
|
||||
*/
|
||||
struct eeh_event {
|
||||
struct list_head list;
|
||||
struct device_node *dn; /* struct device node */
|
||||
struct pci_dev *dev; /* affected device */
|
||||
struct list_head list; /* to form event queue */
|
||||
struct eeh_dev *edev; /* EEH device */
|
||||
};
|
||||
|
||||
/**
|
||||
* eeh_send_failure_event - generate a PCI error event
|
||||
* @dev pci device
|
||||
*
|
||||
* This routine builds a PCI error event which will be delivered
|
||||
* to all listeners on the eeh_notifier_chain.
|
||||
*
|
||||
* This routine can be called within an interrupt context;
|
||||
* the actual event will be delivered in a normal context
|
||||
* (from a workqueue).
|
||||
*/
|
||||
int eeh_send_failure_event (struct device_node *dn,
|
||||
struct pci_dev *dev);
|
||||
|
||||
/* Main recovery function */
|
||||
struct pci_dn * handle_eeh_events (struct eeh_event *);
|
||||
int eeh_send_failure_event(struct eeh_dev *edev);
|
||||
struct eeh_dev *handle_eeh_events(struct eeh_event *);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* ASM_POWERPC_EEH_EVENT_H */
|
||||
|
||||
@@ -232,23 +232,30 @@ label##_hv: \
|
||||
EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \
|
||||
EXC_HV, KVMTEST, vec)
|
||||
|
||||
#define __SOFTEN_TEST(h) \
|
||||
/* This associate vector numbers with bits in paca->irq_happened */
|
||||
#define SOFTEN_VALUE_0x500 PACA_IRQ_EE
|
||||
#define SOFTEN_VALUE_0x502 PACA_IRQ_EE
|
||||
#define SOFTEN_VALUE_0x900 PACA_IRQ_DEC
|
||||
#define SOFTEN_VALUE_0x982 PACA_IRQ_DEC
|
||||
|
||||
#define __SOFTEN_TEST(h, vec) \
|
||||
lbz r10,PACASOFTIRQEN(r13); \
|
||||
cmpwi r10,0; \
|
||||
li r10,SOFTEN_VALUE_##vec; \
|
||||
beq masked_##h##interrupt
|
||||
#define _SOFTEN_TEST(h) __SOFTEN_TEST(h)
|
||||
#define _SOFTEN_TEST(h, vec) __SOFTEN_TEST(h, vec)
|
||||
|
||||
#define SOFTEN_TEST_PR(vec) \
|
||||
KVMTEST_PR(vec); \
|
||||
_SOFTEN_TEST(EXC_STD)
|
||||
_SOFTEN_TEST(EXC_STD, vec)
|
||||
|
||||
#define SOFTEN_TEST_HV(vec) \
|
||||
KVMTEST(vec); \
|
||||
_SOFTEN_TEST(EXC_HV)
|
||||
_SOFTEN_TEST(EXC_HV, vec)
|
||||
|
||||
#define SOFTEN_TEST_HV_201(vec) \
|
||||
KVMTEST(vec); \
|
||||
_SOFTEN_TEST(EXC_STD)
|
||||
_SOFTEN_TEST(EXC_STD, vec)
|
||||
|
||||
#define __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \
|
||||
HMT_MEDIUM; \
|
||||
@@ -272,73 +279,55 @@ label##_hv: \
|
||||
_MASKABLE_EXCEPTION_PSERIES(vec, label, \
|
||||
EXC_HV, SOFTEN_TEST_HV)
|
||||
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
#define DISABLE_INTS \
|
||||
li r11,0; \
|
||||
stb r11,PACASOFTIRQEN(r13); \
|
||||
BEGIN_FW_FTR_SECTION; \
|
||||
stb r11,PACAHARDIRQEN(r13); \
|
||||
END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES); \
|
||||
TRACE_DISABLE_INTS; \
|
||||
BEGIN_FW_FTR_SECTION; \
|
||||
mfmsr r10; \
|
||||
ori r10,r10,MSR_EE; \
|
||||
mtmsrd r10,1; \
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
|
||||
#else
|
||||
#define DISABLE_INTS \
|
||||
li r11,0; \
|
||||
stb r11,PACASOFTIRQEN(r13); \
|
||||
stb r11,PACAHARDIRQEN(r13); \
|
||||
TRACE_DISABLE_INTS
|
||||
#endif /* CONFIG_PPC_ISERIES */
|
||||
/*
|
||||
* Our exception common code can be passed various "additions"
|
||||
* to specify the behaviour of interrupts, whether to kick the
|
||||
* runlatch, etc...
|
||||
*/
|
||||
|
||||
/* Exception addition: Hard disable interrupts */
|
||||
#define DISABLE_INTS SOFT_DISABLE_INTS(r10,r11)
|
||||
|
||||
/* Exception addition: Keep interrupt state */
|
||||
#define ENABLE_INTS \
|
||||
ld r11,PACAKMSR(r13); \
|
||||
ld r12,_MSR(r1); \
|
||||
mfmsr r11; \
|
||||
rlwimi r11,r12,0,MSR_EE; \
|
||||
mtmsrd r11,1
|
||||
|
||||
#define STD_EXCEPTION_COMMON(trap, label, hdlr) \
|
||||
.align 7; \
|
||||
.globl label##_common; \
|
||||
label##_common: \
|
||||
EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \
|
||||
DISABLE_INTS; \
|
||||
bl .save_nvgprs; \
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||
bl hdlr; \
|
||||
b .ret_from_except
|
||||
#define ADD_NVGPRS \
|
||||
bl .save_nvgprs
|
||||
|
||||
#define RUNLATCH_ON \
|
||||
BEGIN_FTR_SECTION \
|
||||
clrrdi r3,r1,THREAD_SHIFT; \
|
||||
ld r4,TI_LOCAL_FLAGS(r3); \
|
||||
andi. r0,r4,_TLF_RUNLATCH; \
|
||||
beql ppc64_runlatch_on_trampoline; \
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
|
||||
|
||||
#define EXCEPTION_COMMON(trap, label, hdlr, ret, additions) \
|
||||
.align 7; \
|
||||
.globl label##_common; \
|
||||
label##_common: \
|
||||
EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \
|
||||
additions; \
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||
bl hdlr; \
|
||||
b ret
|
||||
|
||||
#define STD_EXCEPTION_COMMON(trap, label, hdlr) \
|
||||
EXCEPTION_COMMON(trap, label, hdlr, ret_from_except, \
|
||||
ADD_NVGPRS;DISABLE_INTS)
|
||||
|
||||
/*
|
||||
* Like STD_EXCEPTION_COMMON, but for exceptions that can occur
|
||||
* in the idle task and therefore need the special idle handling.
|
||||
* in the idle task and therefore need the special idle handling
|
||||
* (finish nap and runlatch)
|
||||
*/
|
||||
#define STD_EXCEPTION_COMMON_IDLE(trap, label, hdlr) \
|
||||
.align 7; \
|
||||
.globl label##_common; \
|
||||
label##_common: \
|
||||
EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \
|
||||
FINISH_NAP; \
|
||||
DISABLE_INTS; \
|
||||
bl .save_nvgprs; \
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||
bl hdlr; \
|
||||
b .ret_from_except
|
||||
|
||||
#define STD_EXCEPTION_COMMON_LITE(trap, label, hdlr) \
|
||||
.align 7; \
|
||||
.globl label##_common; \
|
||||
label##_common: \
|
||||
EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \
|
||||
FINISH_NAP; \
|
||||
DISABLE_INTS; \
|
||||
BEGIN_FTR_SECTION \
|
||||
bl .ppc64_runlatch_on; \
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_CTRL) \
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||
bl hdlr; \
|
||||
b .ret_from_except_lite
|
||||
#define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr) \
|
||||
EXCEPTION_COMMON(trap, label, hdlr, ret_from_except_lite, \
|
||||
FINISH_NAP;RUNLATCH_ON;DISABLE_INTS)
|
||||
|
||||
/*
|
||||
* When the idle code in power4_idle puts the CPU into NAP mode,
|
||||
|
||||
@@ -0,0 +1,218 @@
|
||||
/*
|
||||
* Firmware Assisted dump header file.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Copyright 2011 IBM Corporation
|
||||
* Author: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef __PPC64_FA_DUMP_H__
|
||||
#define __PPC64_FA_DUMP_H__
|
||||
|
||||
#ifdef CONFIG_FA_DUMP
|
||||
|
||||
/*
|
||||
* The RMA region will be saved for later dumping when kernel crashes.
|
||||
* RMA is Real Mode Area, the first block of logical memory address owned
|
||||
* by logical partition, containing the storage that may be accessed with
|
||||
* translate off.
|
||||
*/
|
||||
#define RMA_START 0x0
|
||||
#define RMA_END (ppc64_rma_size)
|
||||
|
||||
/*
|
||||
* On some Power systems where RMO is 128MB, it still requires minimum of
|
||||
* 256MB for kernel to boot successfully. When kdump infrastructure is
|
||||
* configured to save vmcore over network, we run into OOM issue while
|
||||
* loading modules related to network setup. Hence we need aditional 64M
|
||||
* of memory to avoid OOM issue.
|
||||
*/
|
||||
#define MIN_BOOT_MEM (((RMA_END < (0x1UL << 28)) ? (0x1UL << 28) : RMA_END) \
|
||||
+ (0x1UL << 26))
|
||||
|
||||
#define memblock_num_regions(memblock_type) (memblock.memblock_type.cnt)
|
||||
|
||||
#ifndef ELF_CORE_EFLAGS
|
||||
#define ELF_CORE_EFLAGS 0
|
||||
#endif
|
||||
|
||||
/* Firmware provided dump sections */
|
||||
#define FADUMP_CPU_STATE_DATA 0x0001
|
||||
#define FADUMP_HPTE_REGION 0x0002
|
||||
#define FADUMP_REAL_MODE_REGION 0x0011
|
||||
|
||||
/* Dump request flag */
|
||||
#define FADUMP_REQUEST_FLAG 0x00000001
|
||||
|
||||
/* FAD commands */
|
||||
#define FADUMP_REGISTER 1
|
||||
#define FADUMP_UNREGISTER 2
|
||||
#define FADUMP_INVALIDATE 3
|
||||
|
||||
/* Dump status flag */
|
||||
#define FADUMP_ERROR_FLAG 0x2000
|
||||
|
||||
#define FADUMP_CPU_ID_MASK ((1UL << 32) - 1)
|
||||
|
||||
#define CPU_UNKNOWN (~((u32)0))
|
||||
|
||||
/* Utility macros */
|
||||
#define SKIP_TO_NEXT_CPU(reg_entry) \
|
||||
({ \
|
||||
while (reg_entry->reg_id != REG_ID("CPUEND")) \
|
||||
reg_entry++; \
|
||||
reg_entry++; \
|
||||
})
|
||||
|
||||
/* Kernel Dump section info */
|
||||
struct fadump_section {
|
||||
u32 request_flag;
|
||||
u16 source_data_type;
|
||||
u16 error_flags;
|
||||
u64 source_address;
|
||||
u64 source_len;
|
||||
u64 bytes_dumped;
|
||||
u64 destination_address;
|
||||
};
|
||||
|
||||
/* ibm,configure-kernel-dump header. */
|
||||
struct fadump_section_header {
|
||||
u32 dump_format_version;
|
||||
u16 dump_num_sections;
|
||||
u16 dump_status_flag;
|
||||
u32 offset_first_dump_section;
|
||||
|
||||
/* Fields for disk dump option. */
|
||||
u32 dd_block_size;
|
||||
u64 dd_block_offset;
|
||||
u64 dd_num_blocks;
|
||||
u32 dd_offset_disk_path;
|
||||
|
||||
/* Maximum time allowed to prevent an automatic dump-reboot. */
|
||||
u32 max_time_auto;
|
||||
};
|
||||
|
||||
/*
|
||||
* Firmware Assisted dump memory structure. This structure is required for
|
||||
* registering future kernel dump with power firmware through rtas call.
|
||||
*
|
||||
* No disk dump option. Hence disk dump path string section is not included.
|
||||
*/
|
||||
struct fadump_mem_struct {
|
||||
struct fadump_section_header header;
|
||||
|
||||
/* Kernel dump sections */
|
||||
struct fadump_section cpu_state_data;
|
||||
struct fadump_section hpte_region;
|
||||
struct fadump_section rmr_region;
|
||||
};
|
||||
|
||||
/* Firmware-assisted dump configuration details. */
|
||||
struct fw_dump {
|
||||
unsigned long cpu_state_data_size;
|
||||
unsigned long hpte_region_size;
|
||||
unsigned long boot_memory_size;
|
||||
unsigned long reserve_dump_area_start;
|
||||
unsigned long reserve_dump_area_size;
|
||||
/* cmd line option during boot */
|
||||
unsigned long reserve_bootvar;
|
||||
|
||||
unsigned long fadumphdr_addr;
|
||||
unsigned long cpu_notes_buf;
|
||||
unsigned long cpu_notes_buf_size;
|
||||
|
||||
int ibm_configure_kernel_dump;
|
||||
|
||||
unsigned long fadump_enabled:1;
|
||||
unsigned long fadump_supported:1;
|
||||
unsigned long dump_active:1;
|
||||
unsigned long dump_registered:1;
|
||||
};
|
||||
|
||||
/*
|
||||
* Copy the ascii values for first 8 characters from a string into u64
|
||||
* variable at their respective indexes.
|
||||
* e.g.
|
||||
* The string "FADMPINF" will be converted into 0x4641444d50494e46
|
||||
*/
|
||||
static inline u64 str_to_u64(const char *str)
|
||||
{
|
||||
u64 val = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < sizeof(val); i++)
|
||||
val = (*str) ? (val << 8) | *str++ : val << 8;
|
||||
return val;
|
||||
}
|
||||
#define STR_TO_HEX(x) str_to_u64(x)
|
||||
#define REG_ID(x) str_to_u64(x)
|
||||
|
||||
#define FADUMP_CRASH_INFO_MAGIC STR_TO_HEX("FADMPINF")
|
||||
#define REGSAVE_AREA_MAGIC STR_TO_HEX("REGSAVE")
|
||||
|
||||
/* The firmware-assisted dump format.
|
||||
*
|
||||
* The register save area is an area in the partition's memory used to preserve
|
||||
* the register contents (CPU state data) for the active CPUs during a firmware
|
||||
* assisted dump. The dump format contains register save area header followed
|
||||
* by register entries. Each list of registers for a CPU starts with
|
||||
* "CPUSTRT" and ends with "CPUEND".
|
||||
*/
|
||||
|
||||
/* Register save area header. */
|
||||
struct fadump_reg_save_area_header {
|
||||
u64 magic_number;
|
||||
u32 version;
|
||||
u32 num_cpu_offset;
|
||||
};
|
||||
|
||||
/* Register entry. */
|
||||
struct fadump_reg_entry {
|
||||
u64 reg_id;
|
||||
u64 reg_value;
|
||||
};
|
||||
|
||||
/* fadump crash info structure */
|
||||
struct fadump_crash_info_header {
|
||||
u64 magic_number;
|
||||
u64 elfcorehdr_addr;
|
||||
u32 crashing_cpu;
|
||||
struct pt_regs regs;
|
||||
struct cpumask cpu_online_mask;
|
||||
};
|
||||
|
||||
/* Crash memory ranges */
|
||||
#define INIT_CRASHMEM_RANGES (INIT_MEMBLOCK_REGIONS + 2)
|
||||
|
||||
struct fad_crash_memory_ranges {
|
||||
unsigned long long base;
|
||||
unsigned long long size;
|
||||
};
|
||||
|
||||
extern int early_init_dt_scan_fw_dump(unsigned long node,
|
||||
const char *uname, int depth, void *data);
|
||||
extern int fadump_reserve_mem(void);
|
||||
extern int setup_fadump(void);
|
||||
extern int is_fadump_active(void);
|
||||
extern void crash_fadump(struct pt_regs *, const char *);
|
||||
extern void fadump_cleanup(void);
|
||||
|
||||
extern void vmcore_cleanup(void);
|
||||
#else /* CONFIG_FA_DUMP */
|
||||
static inline int is_fadump_active(void) { return 0; }
|
||||
static inline void crash_fadump(struct pt_regs *regs, const char *str) { }
|
||||
#endif
|
||||
#endif
|
||||
@@ -41,7 +41,6 @@
|
||||
#define FW_FEATURE_XDABR ASM_CONST(0x0000000000040000)
|
||||
#define FW_FEATURE_MULTITCE ASM_CONST(0x0000000000080000)
|
||||
#define FW_FEATURE_SPLPAR ASM_CONST(0x0000000000100000)
|
||||
#define FW_FEATURE_ISERIES ASM_CONST(0x0000000000200000)
|
||||
#define FW_FEATURE_LPAR ASM_CONST(0x0000000000400000)
|
||||
#define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000)
|
||||
#define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000)
|
||||
@@ -65,8 +64,6 @@ enum {
|
||||
FW_FEATURE_MULTITCE | FW_FEATURE_SPLPAR | FW_FEATURE_LPAR |
|
||||
FW_FEATURE_CMO | FW_FEATURE_VPHN | FW_FEATURE_XCMO,
|
||||
FW_FEATURE_PSERIES_ALWAYS = 0,
|
||||
FW_FEATURE_ISERIES_POSSIBLE = FW_FEATURE_ISERIES | FW_FEATURE_LPAR,
|
||||
FW_FEATURE_ISERIES_ALWAYS = FW_FEATURE_ISERIES | FW_FEATURE_LPAR,
|
||||
FW_FEATURE_POWERNV_POSSIBLE = FW_FEATURE_OPAL | FW_FEATURE_OPALv2,
|
||||
FW_FEATURE_POWERNV_ALWAYS = 0,
|
||||
FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
|
||||
@@ -79,9 +76,6 @@ enum {
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
FW_FEATURE_PSERIES_POSSIBLE |
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
FW_FEATURE_ISERIES_POSSIBLE |
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
FW_FEATURE_POWERNV_POSSIBLE |
|
||||
#endif
|
||||
@@ -99,9 +93,6 @@ enum {
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
FW_FEATURE_PSERIES_ALWAYS &
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
FW_FEATURE_ISERIES_ALWAYS &
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
FW_FEATURE_POWERNV_ALWAYS &
|
||||
#endif
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Authors: Jeff Brown
|
||||
* Timur Tabi <timur@freescale.com>
|
||||
*
|
||||
* Copyright 2004,2007 Freescale Semiconductor, Inc
|
||||
* Copyright 2004,2007,2012 Freescale Semiconductor, Inc
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
@@ -114,6 +114,10 @@ struct ccsr_guts_86xx {
|
||||
__be32 srds2cr1; /* 0x.0f44 - SerDes2 Control Register 0 */
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
/* Alternate function signal multiplex control */
|
||||
#define MPC85xx_PMUXCR_QE(x) (0x8000 >> (x))
|
||||
|
||||
#ifdef CONFIG_PPC_86xx
|
||||
|
||||
#define CCSR_GUTS_DMACR_DEV_SSI 0 /* DMA controller/channel set to SSI */
|
||||
|
||||
@@ -11,6 +11,27 @@
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
|
||||
/*
|
||||
* PACA flags in paca->irq_happened.
|
||||
*
|
||||
* This bits are set when interrupts occur while soft-disabled
|
||||
* and allow a proper replay. Additionally, PACA_IRQ_HARD_DIS
|
||||
* is set whenever we manually hard disable.
|
||||
*/
|
||||
#define PACA_IRQ_HARD_DIS 0x01
|
||||
#define PACA_IRQ_DBELL 0x02
|
||||
#define PACA_IRQ_EE 0x04
|
||||
#define PACA_IRQ_DEC 0x08 /* Or FIT */
|
||||
#define PACA_IRQ_EE_EDGE 0x10 /* BookE only */
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
extern void __replay_interrupt(unsigned int vector);
|
||||
|
||||
extern void timer_interrupt(struct pt_regs *);
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
@@ -42,7 +63,6 @@ static inline unsigned long arch_local_irq_disable(void)
|
||||
}
|
||||
|
||||
extern void arch_local_irq_restore(unsigned long);
|
||||
extern void iseries_handle_interrupts(void);
|
||||
|
||||
static inline void arch_local_irq_enable(void)
|
||||
{
|
||||
@@ -68,16 +88,33 @@ static inline bool arch_irqs_disabled(void)
|
||||
#define __hard_irq_enable() asm volatile("wrteei 1" : : : "memory");
|
||||
#define __hard_irq_disable() asm volatile("wrteei 0" : : : "memory");
|
||||
#else
|
||||
#define __hard_irq_enable() __mtmsrd(mfmsr() | MSR_EE, 1)
|
||||
#define __hard_irq_disable() __mtmsrd(mfmsr() & ~MSR_EE, 1)
|
||||
#define __hard_irq_enable() __mtmsrd(local_paca->kernel_msr | MSR_EE, 1)
|
||||
#define __hard_irq_disable() __mtmsrd(local_paca->kernel_msr, 1)
|
||||
#endif
|
||||
|
||||
#define hard_irq_disable() \
|
||||
do { \
|
||||
__hard_irq_disable(); \
|
||||
get_paca()->soft_enabled = 0; \
|
||||
get_paca()->hard_enabled = 0; \
|
||||
} while(0)
|
||||
static inline void hard_irq_disable(void)
|
||||
{
|
||||
__hard_irq_disable();
|
||||
get_paca()->soft_enabled = 0;
|
||||
get_paca()->irq_happened |= PACA_IRQ_HARD_DIS;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is called by asynchronous interrupts to conditionally
|
||||
* re-enable hard interrupts when soft-disabled after having
|
||||
* cleared the source of the interrupt
|
||||
*/
|
||||
static inline void may_hard_irq_enable(void)
|
||||
{
|
||||
get_paca()->irq_happened &= ~PACA_IRQ_HARD_DIS;
|
||||
if (!(get_paca()->irq_happened & PACA_IRQ_EE))
|
||||
__hard_irq_enable();
|
||||
}
|
||||
|
||||
static inline bool arch_irq_disabled_regs(struct pt_regs *regs)
|
||||
{
|
||||
return !regs->softe;
|
||||
}
|
||||
|
||||
#else /* CONFIG_PPC64 */
|
||||
|
||||
@@ -139,6 +176,13 @@ static inline bool arch_irqs_disabled(void)
|
||||
|
||||
#define hard_irq_disable() arch_local_irq_disable()
|
||||
|
||||
static inline bool arch_irq_disabled_regs(struct pt_regs *regs)
|
||||
{
|
||||
return !(regs->msr & MSR_EE);
|
||||
}
|
||||
|
||||
static inline void may_hard_irq_enable(void) { }
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
#define ARCH_IRQ_INIT_FLAGS IRQ_NOREQUEST
|
||||
@@ -149,5 +193,6 @@ static inline bool arch_irqs_disabled(void)
|
||||
*/
|
||||
struct irq_chip;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_HW_IRQ_H */
|
||||
|
||||
@@ -39,24 +39,31 @@
|
||||
#define TRACE_ENABLE_INTS TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_on)
|
||||
#define TRACE_DISABLE_INTS TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_off)
|
||||
|
||||
#define TRACE_AND_RESTORE_IRQ_PARTIAL(en,skip) \
|
||||
cmpdi en,0; \
|
||||
bne 95f; \
|
||||
stb en,PACASOFTIRQEN(r13); \
|
||||
TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_off) \
|
||||
b skip; \
|
||||
95: TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_on) \
|
||||
li en,1;
|
||||
#define TRACE_AND_RESTORE_IRQ(en) \
|
||||
TRACE_AND_RESTORE_IRQ_PARTIAL(en,96f); \
|
||||
stb en,PACASOFTIRQEN(r13); \
|
||||
96:
|
||||
/*
|
||||
* This is used by assembly code to soft-disable interrupts
|
||||
*/
|
||||
#define SOFT_DISABLE_INTS(__rA, __rB) \
|
||||
lbz __rA,PACASOFTIRQEN(r13); \
|
||||
lbz __rB,PACAIRQHAPPENED(r13); \
|
||||
cmpwi cr0,__rA,0; \
|
||||
li __rA,0; \
|
||||
ori __rB,__rB,PACA_IRQ_HARD_DIS; \
|
||||
stb __rB,PACAIRQHAPPENED(r13); \
|
||||
beq 44f; \
|
||||
stb __rA,PACASOFTIRQEN(r13); \
|
||||
TRACE_DISABLE_INTS; \
|
||||
44:
|
||||
|
||||
#else
|
||||
#define TRACE_ENABLE_INTS
|
||||
#define TRACE_DISABLE_INTS
|
||||
#define TRACE_AND_RESTORE_IRQ_PARTIAL(en,skip)
|
||||
#define TRACE_AND_RESTORE_IRQ(en) \
|
||||
stb en,PACASOFTIRQEN(r13)
|
||||
|
||||
#define SOFT_DISABLE_INTS(__rA, __rB) \
|
||||
lbz __rA,PACAIRQHAPPENED(r13); \
|
||||
li __rB,0; \
|
||||
ori __rA,__rA,PACA_IRQ_HARD_DIS; \
|
||||
stb __rB,PACASOFTIRQEN(r13); \
|
||||
stb __rA,PACAIRQHAPPENED(r13)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2008 Stephen Rothwell IBM Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_ALPACA_H
|
||||
#define _ASM_POWERPC_ISERIES_ALPACA_H
|
||||
|
||||
/*
|
||||
* This is the part of the paca that the iSeries hypervisor
|
||||
* needs to be statically initialised. Immediately after boot
|
||||
* we switch to the normal Linux paca.
|
||||
*/
|
||||
struct alpaca {
|
||||
struct lppaca *lppaca_ptr; /* Pointer to LpPaca for PLIC */
|
||||
const void *reg_save_ptr; /* Pointer to LpRegSave for PLIC */
|
||||
};
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_ALPACA_H */
|
||||
@@ -1,111 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2001 Mike Corrigan IBM Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* This file contains the "hypervisor call" interface which is used to
|
||||
* drive the hypervisor from the OS.
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_HV_CALL_H
|
||||
#define _ASM_POWERPC_ISERIES_HV_CALL_H
|
||||
|
||||
#include <asm/iseries/hv_call_sc.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
#include <asm/paca.h>
|
||||
|
||||
/* Type of yield for HvCallBaseYieldProcessor */
|
||||
#define HvCall_YieldTimed 0 /* Yield until specified time (tb) */
|
||||
#define HvCall_YieldToActive 1 /* Yield until all active procs have run */
|
||||
#define HvCall_YieldToProc 2 /* Yield until the specified processor has run */
|
||||
|
||||
/* interrupt masks for setEnabledInterrupts */
|
||||
#define HvCall_MaskIPI 0x00000001
|
||||
#define HvCall_MaskLpEvent 0x00000002
|
||||
#define HvCall_MaskLpProd 0x00000004
|
||||
#define HvCall_MaskTimeout 0x00000008
|
||||
|
||||
/* Log buffer formats */
|
||||
#define HvCall_LogBuffer_ASCII 0
|
||||
#define HvCall_LogBuffer_EBCDIC 1
|
||||
|
||||
#define HvCallBaseAckDeferredInts HvCallBase + 0
|
||||
#define HvCallBaseCpmPowerOff HvCallBase + 1
|
||||
#define HvCallBaseGetHwPatch HvCallBase + 2
|
||||
#define HvCallBaseReIplSpAttn HvCallBase + 3
|
||||
#define HvCallBaseSetASR HvCallBase + 4
|
||||
#define HvCallBaseSetASRAndRfi HvCallBase + 5
|
||||
#define HvCallBaseSetIMR HvCallBase + 6
|
||||
#define HvCallBaseSendIPI HvCallBase + 7
|
||||
#define HvCallBaseTerminateMachine HvCallBase + 8
|
||||
#define HvCallBaseTerminateMachineSrc HvCallBase + 9
|
||||
#define HvCallBaseProcessPlicInterrupts HvCallBase + 10
|
||||
#define HvCallBaseIsPrimaryCpmOrMsdIpl HvCallBase + 11
|
||||
#define HvCallBaseSetVirtualSIT HvCallBase + 12
|
||||
#define HvCallBaseVaryOffThisProcessor HvCallBase + 13
|
||||
#define HvCallBaseVaryOffMemoryChunk HvCallBase + 14
|
||||
#define HvCallBaseVaryOffInteractivePercentage HvCallBase + 15
|
||||
#define HvCallBaseSendLpProd HvCallBase + 16
|
||||
#define HvCallBaseSetEnabledInterrupts HvCallBase + 17
|
||||
#define HvCallBaseYieldProcessor HvCallBase + 18
|
||||
#define HvCallBaseVaryOffSharedProcUnits HvCallBase + 19
|
||||
#define HvCallBaseSetVirtualDecr HvCallBase + 20
|
||||
#define HvCallBaseClearLogBuffer HvCallBase + 21
|
||||
#define HvCallBaseGetLogBufferCodePage HvCallBase + 22
|
||||
#define HvCallBaseGetLogBufferFormat HvCallBase + 23
|
||||
#define HvCallBaseGetLogBufferLength HvCallBase + 24
|
||||
#define HvCallBaseReadLogBuffer HvCallBase + 25
|
||||
#define HvCallBaseSetLogBufferFormatAndCodePage HvCallBase + 26
|
||||
#define HvCallBaseWriteLogBuffer HvCallBase + 27
|
||||
#define HvCallBaseRouter28 HvCallBase + 28
|
||||
#define HvCallBaseRouter29 HvCallBase + 29
|
||||
#define HvCallBaseRouter30 HvCallBase + 30
|
||||
#define HvCallBaseSetDebugBus HvCallBase + 31
|
||||
|
||||
#define HvCallCcSetDABR HvCallCc + 7
|
||||
|
||||
static inline void HvCall_setVirtualDecr(void)
|
||||
{
|
||||
/*
|
||||
* Ignore any error return codes - most likely means that the
|
||||
* target value for the LP has been increased and this vary off
|
||||
* would bring us below the new target.
|
||||
*/
|
||||
HvCall0(HvCallBaseSetVirtualDecr);
|
||||
}
|
||||
|
||||
static inline void HvCall_yieldProcessor(unsigned typeOfYield, u64 yieldParm)
|
||||
{
|
||||
HvCall2(HvCallBaseYieldProcessor, typeOfYield, yieldParm);
|
||||
}
|
||||
|
||||
static inline void HvCall_setEnabledInterrupts(u64 enabledInterrupts)
|
||||
{
|
||||
HvCall1(HvCallBaseSetEnabledInterrupts, enabledInterrupts);
|
||||
}
|
||||
|
||||
static inline void HvCall_setLogBufferFormatAndCodepage(int format,
|
||||
u32 codePage)
|
||||
{
|
||||
HvCall2(HvCallBaseSetLogBufferFormatAndCodePage, format, codePage);
|
||||
}
|
||||
|
||||
extern void HvCall_writeLogBuffer(const void *buffer, u64 bufLen);
|
||||
|
||||
static inline void HvCall_sendIPI(struct paca_struct *targetPaca)
|
||||
{
|
||||
HvCall1(HvCallBaseSendIPI, targetPaca->paca_index);
|
||||
}
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_HV_CALL_H */
|
||||
@@ -1,201 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2001 Mike Corrigan IBM Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* This file contains the "hypervisor call" interface which is used to
|
||||
* drive the hypervisor from the OS.
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H
|
||||
#define _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/iseries/hv_call_sc.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
#include <asm/abs_addr.h>
|
||||
|
||||
struct HvLpEvent;
|
||||
|
||||
typedef u8 HvLpEvent_Type;
|
||||
typedef u8 HvLpEvent_AckInd;
|
||||
typedef u8 HvLpEvent_AckType;
|
||||
|
||||
typedef u8 HvLpDma_Direction;
|
||||
typedef u8 HvLpDma_AddressType;
|
||||
|
||||
typedef u64 HvLpEvent_Rc;
|
||||
typedef u64 HvLpDma_Rc;
|
||||
|
||||
#define HvCallEventAckLpEvent HvCallEvent + 0
|
||||
#define HvCallEventCancelLpEvent HvCallEvent + 1
|
||||
#define HvCallEventCloseLpEventPath HvCallEvent + 2
|
||||
#define HvCallEventDmaBufList HvCallEvent + 3
|
||||
#define HvCallEventDmaSingle HvCallEvent + 4
|
||||
#define HvCallEventDmaToSp HvCallEvent + 5
|
||||
#define HvCallEventGetOverflowLpEvents HvCallEvent + 6
|
||||
#define HvCallEventGetSourceLpInstanceId HvCallEvent + 7
|
||||
#define HvCallEventGetTargetLpInstanceId HvCallEvent + 8
|
||||
#define HvCallEventOpenLpEventPath HvCallEvent + 9
|
||||
#define HvCallEventSetLpEventStack HvCallEvent + 10
|
||||
#define HvCallEventSignalLpEvent HvCallEvent + 11
|
||||
#define HvCallEventSignalLpEventParms HvCallEvent + 12
|
||||
#define HvCallEventSetInterLpQueueIndex HvCallEvent + 13
|
||||
#define HvCallEventSetLpEventQueueInterruptProc HvCallEvent + 14
|
||||
#define HvCallEventRouter15 HvCallEvent + 15
|
||||
|
||||
static inline void HvCallEvent_getOverflowLpEvents(u8 queueIndex)
|
||||
{
|
||||
HvCall1(HvCallEventGetOverflowLpEvents, queueIndex);
|
||||
}
|
||||
|
||||
static inline void HvCallEvent_setInterLpQueueIndex(u8 queueIndex)
|
||||
{
|
||||
HvCall1(HvCallEventSetInterLpQueueIndex, queueIndex);
|
||||
}
|
||||
|
||||
static inline void HvCallEvent_setLpEventStack(u8 queueIndex,
|
||||
char *eventStackAddr, u32 eventStackSize)
|
||||
{
|
||||
HvCall3(HvCallEventSetLpEventStack, queueIndex,
|
||||
virt_to_abs(eventStackAddr), eventStackSize);
|
||||
}
|
||||
|
||||
static inline void HvCallEvent_setLpEventQueueInterruptProc(u8 queueIndex,
|
||||
u16 lpLogicalProcIndex)
|
||||
{
|
||||
HvCall2(HvCallEventSetLpEventQueueInterruptProc, queueIndex,
|
||||
lpLogicalProcIndex);
|
||||
}
|
||||
|
||||
static inline HvLpEvent_Rc HvCallEvent_signalLpEvent(struct HvLpEvent *event)
|
||||
{
|
||||
return HvCall1(HvCallEventSignalLpEvent, virt_to_abs(event));
|
||||
}
|
||||
|
||||
static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp,
|
||||
HvLpEvent_Type type, u16 subtype, HvLpEvent_AckInd ackInd,
|
||||
HvLpEvent_AckType ackType, HvLpInstanceId sourceInstanceId,
|
||||
HvLpInstanceId targetInstanceId, u64 correlationToken,
|
||||
u64 eventData1, u64 eventData2, u64 eventData3,
|
||||
u64 eventData4, u64 eventData5)
|
||||
{
|
||||
/* Pack the misc bits into a single Dword to pass to PLIC */
|
||||
union {
|
||||
struct {
|
||||
u8 ack_and_target;
|
||||
u8 type;
|
||||
u16 subtype;
|
||||
HvLpInstanceId src_inst;
|
||||
HvLpInstanceId target_inst;
|
||||
} parms;
|
||||
u64 dword;
|
||||
} packed;
|
||||
|
||||
packed.parms.ack_and_target = (ackType << 7) | (ackInd << 6) | targetLp;
|
||||
packed.parms.type = type;
|
||||
packed.parms.subtype = subtype;
|
||||
packed.parms.src_inst = sourceInstanceId;
|
||||
packed.parms.target_inst = targetInstanceId;
|
||||
|
||||
return HvCall7(HvCallEventSignalLpEventParms, packed.dword,
|
||||
correlationToken, eventData1, eventData2,
|
||||
eventData3, eventData4, eventData5);
|
||||
}
|
||||
|
||||
extern void *iseries_hv_alloc(size_t size, dma_addr_t *dma_handle, gfp_t flag);
|
||||
extern void iseries_hv_free(size_t size, void *vaddr, dma_addr_t dma_handle);
|
||||
extern dma_addr_t iseries_hv_map(void *vaddr, size_t size,
|
||||
enum dma_data_direction direction);
|
||||
extern void iseries_hv_unmap(dma_addr_t dma_handle, size_t size,
|
||||
enum dma_data_direction direction);
|
||||
|
||||
static inline HvLpEvent_Rc HvCallEvent_ackLpEvent(struct HvLpEvent *event)
|
||||
{
|
||||
return HvCall1(HvCallEventAckLpEvent, virt_to_abs(event));
|
||||
}
|
||||
|
||||
static inline HvLpEvent_Rc HvCallEvent_cancelLpEvent(struct HvLpEvent *event)
|
||||
{
|
||||
return HvCall1(HvCallEventCancelLpEvent, virt_to_abs(event));
|
||||
}
|
||||
|
||||
static inline HvLpInstanceId HvCallEvent_getSourceLpInstanceId(
|
||||
HvLpIndex targetLp, HvLpEvent_Type type)
|
||||
{
|
||||
return HvCall2(HvCallEventGetSourceLpInstanceId, targetLp, type);
|
||||
}
|
||||
|
||||
static inline HvLpInstanceId HvCallEvent_getTargetLpInstanceId(
|
||||
HvLpIndex targetLp, HvLpEvent_Type type)
|
||||
{
|
||||
return HvCall2(HvCallEventGetTargetLpInstanceId, targetLp, type);
|
||||
}
|
||||
|
||||
static inline void HvCallEvent_openLpEventPath(HvLpIndex targetLp,
|
||||
HvLpEvent_Type type)
|
||||
{
|
||||
HvCall2(HvCallEventOpenLpEventPath, targetLp, type);
|
||||
}
|
||||
|
||||
static inline void HvCallEvent_closeLpEventPath(HvLpIndex targetLp,
|
||||
HvLpEvent_Type type)
|
||||
{
|
||||
HvCall2(HvCallEventCloseLpEventPath, targetLp, type);
|
||||
}
|
||||
|
||||
static inline HvLpDma_Rc HvCallEvent_dmaBufList(HvLpEvent_Type type,
|
||||
HvLpIndex remoteLp, HvLpDma_Direction direction,
|
||||
HvLpInstanceId localInstanceId,
|
||||
HvLpInstanceId remoteInstanceId,
|
||||
HvLpDma_AddressType localAddressType,
|
||||
HvLpDma_AddressType remoteAddressType,
|
||||
/* Do these need to be converted to absolute addresses? */
|
||||
u64 localBufList, u64 remoteBufList, u32 transferLength)
|
||||
{
|
||||
/* Pack the misc bits into a single Dword to pass to PLIC */
|
||||
union {
|
||||
struct {
|
||||
u8 flags;
|
||||
HvLpIndex remote;
|
||||
u8 type;
|
||||
u8 reserved;
|
||||
HvLpInstanceId local_inst;
|
||||
HvLpInstanceId remote_inst;
|
||||
} parms;
|
||||
u64 dword;
|
||||
} packed;
|
||||
|
||||
packed.parms.flags = (direction << 7) |
|
||||
(localAddressType << 6) | (remoteAddressType << 5);
|
||||
packed.parms.remote = remoteLp;
|
||||
packed.parms.type = type;
|
||||
packed.parms.reserved = 0;
|
||||
packed.parms.local_inst = localInstanceId;
|
||||
packed.parms.remote_inst = remoteInstanceId;
|
||||
|
||||
return HvCall4(HvCallEventDmaBufList, packed.dword, localBufList,
|
||||
remoteBufList, transferLength);
|
||||
}
|
||||
|
||||
static inline HvLpDma_Rc HvCallEvent_dmaToSp(void *local, u32 remote,
|
||||
u32 length, HvLpDma_Direction dir)
|
||||
{
|
||||
return HvCall4(HvCallEventDmaToSp, virt_to_abs(local), remote,
|
||||
length, dir);
|
||||
}
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H */
|
||||
@@ -1,50 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2001 Mike Corrigan IBM Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_HV_CALL_SC_H
|
||||
#define _ASM_POWERPC_ISERIES_HV_CALL_SC_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define HvCallBase 0x8000000000000000ul
|
||||
#define HvCallCc 0x8001000000000000ul
|
||||
#define HvCallCfg 0x8002000000000000ul
|
||||
#define HvCallEvent 0x8003000000000000ul
|
||||
#define HvCallHpt 0x8004000000000000ul
|
||||
#define HvCallPci 0x8005000000000000ul
|
||||
#define HvCallSm 0x8007000000000000ul
|
||||
#define HvCallXm 0x8009000000000000ul
|
||||
|
||||
extern u64 HvCall0(u64);
|
||||
extern u64 HvCall1(u64, u64);
|
||||
extern u64 HvCall2(u64, u64, u64);
|
||||
extern u64 HvCall3(u64, u64, u64, u64);
|
||||
extern u64 HvCall4(u64, u64, u64, u64, u64);
|
||||
extern u64 HvCall5(u64, u64, u64, u64, u64, u64);
|
||||
extern u64 HvCall6(u64, u64, u64, u64, u64, u64, u64);
|
||||
extern u64 HvCall7(u64, u64, u64, u64, u64, u64, u64, u64);
|
||||
|
||||
extern u64 HvCall0Ret16(u64, void *);
|
||||
extern u64 HvCall1Ret16(u64, void *, u64);
|
||||
extern u64 HvCall2Ret16(u64, void *, u64, u64);
|
||||
extern u64 HvCall3Ret16(u64, void *, u64, u64, u64);
|
||||
extern u64 HvCall4Ret16(u64, void *, u64, u64, u64, u64);
|
||||
extern u64 HvCall5Ret16(u64, void *, u64, u64, u64, u64, u64);
|
||||
extern u64 HvCall6Ret16(u64, void *, u64, u64, u64, u64, u64, u64);
|
||||
extern u64 HvCall7Ret16(u64, void *, u64, u64 ,u64 ,u64 ,u64 ,u64 ,u64);
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_HV_CALL_SC_H */
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
* This file contains the "hypervisor call" interface which is used to
|
||||
* drive the hypervisor from SLIC.
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_HV_CALL_XM_H
|
||||
#define _ASM_POWERPC_ISERIES_HV_CALL_XM_H
|
||||
|
||||
#include <asm/iseries/hv_call_sc.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
|
||||
#define HvCallXmGetTceTableParms HvCallXm + 0
|
||||
#define HvCallXmTestBus HvCallXm + 1
|
||||
#define HvCallXmConnectBusUnit HvCallXm + 2
|
||||
#define HvCallXmLoadTod HvCallXm + 8
|
||||
#define HvCallXmTestBusUnit HvCallXm + 9
|
||||
#define HvCallXmSetTce HvCallXm + 11
|
||||
#define HvCallXmSetTces HvCallXm + 13
|
||||
|
||||
static inline void HvCallXm_getTceTableParms(u64 cb)
|
||||
{
|
||||
HvCall1(HvCallXmGetTceTableParms, cb);
|
||||
}
|
||||
|
||||
static inline u64 HvCallXm_setTce(u64 tceTableToken, u64 tceOffset, u64 tce)
|
||||
{
|
||||
return HvCall3(HvCallXmSetTce, tceTableToken, tceOffset, tce);
|
||||
}
|
||||
|
||||
static inline u64 HvCallXm_setTces(u64 tceTableToken, u64 tceOffset,
|
||||
u64 numTces, u64 tce1, u64 tce2, u64 tce3, u64 tce4)
|
||||
{
|
||||
return HvCall7(HvCallXmSetTces, tceTableToken, tceOffset, numTces,
|
||||
tce1, tce2, tce3, tce4);
|
||||
}
|
||||
|
||||
static inline u64 HvCallXm_testBus(u16 busNumber)
|
||||
{
|
||||
return HvCall1(HvCallXmTestBus, busNumber);
|
||||
}
|
||||
|
||||
static inline u64 HvCallXm_testBusUnit(u16 busNumber, u8 subBusNumber,
|
||||
u8 deviceId)
|
||||
{
|
||||
return HvCall2(HvCallXmTestBusUnit, busNumber,
|
||||
(subBusNumber << 8) | deviceId);
|
||||
}
|
||||
|
||||
static inline u64 HvCallXm_connectBusUnit(u16 busNumber, u8 subBusNumber,
|
||||
u8 deviceId, u64 interruptToken)
|
||||
{
|
||||
return HvCall5(HvCallXmConnectBusUnit, busNumber,
|
||||
(subBusNumber << 8) | deviceId, interruptToken, 0,
|
||||
0 /* HvLpConfig::mapDsaToQueueIndex(HvLpDSA(busNumber, xBoard, xCard)) */);
|
||||
}
|
||||
|
||||
static inline u64 HvCallXm_loadTod(void)
|
||||
{
|
||||
return HvCall0(HvCallXmLoadTod);
|
||||
}
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_HV_CALL_XM_H */
|
||||
@@ -1,128 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2001 Mike Corrigan IBM Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_HV_LP_CONFIG_H
|
||||
#define _ASM_POWERPC_ISERIES_HV_LP_CONFIG_H
|
||||
|
||||
/*
|
||||
* This file contains the interface to the LPAR configuration data
|
||||
* to determine which resources should be allocated to each partition.
|
||||
*/
|
||||
|
||||
#include <asm/iseries/hv_call_sc.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
|
||||
enum {
|
||||
HvCallCfg_Cur = 0,
|
||||
HvCallCfg_Init = 1,
|
||||
HvCallCfg_Max = 2,
|
||||
HvCallCfg_Min = 3
|
||||
};
|
||||
|
||||
#define HvCallCfgGetSystemPhysicalProcessors HvCallCfg + 6
|
||||
#define HvCallCfgGetPhysicalProcessors HvCallCfg + 7
|
||||
#define HvCallCfgGetMsChunks HvCallCfg + 9
|
||||
#define HvCallCfgGetSharedPoolIndex HvCallCfg + 20
|
||||
#define HvCallCfgGetSharedProcUnits HvCallCfg + 21
|
||||
#define HvCallCfgGetNumProcsInSharedPool HvCallCfg + 22
|
||||
#define HvCallCfgGetVirtualLanIndexMap HvCallCfg + 30
|
||||
#define HvCallCfgGetHostingLpIndex HvCallCfg + 32
|
||||
|
||||
extern HvLpIndex HvLpConfig_getLpIndex_outline(void);
|
||||
extern HvLpIndex HvLpConfig_getLpIndex(void);
|
||||
extern HvLpIndex HvLpConfig_getPrimaryLpIndex(void);
|
||||
|
||||
static inline u64 HvLpConfig_getMsChunks(void)
|
||||
{
|
||||
return HvCall2(HvCallCfgGetMsChunks, HvLpConfig_getLpIndex(),
|
||||
HvCallCfg_Cur);
|
||||
}
|
||||
|
||||
static inline u64 HvLpConfig_getSystemPhysicalProcessors(void)
|
||||
{
|
||||
return HvCall0(HvCallCfgGetSystemPhysicalProcessors);
|
||||
}
|
||||
|
||||
static inline u64 HvLpConfig_getNumProcsInSharedPool(HvLpSharedPoolIndex sPI)
|
||||
{
|
||||
return (u16)HvCall1(HvCallCfgGetNumProcsInSharedPool, sPI);
|
||||
}
|
||||
|
||||
static inline u64 HvLpConfig_getPhysicalProcessors(void)
|
||||
{
|
||||
return HvCall2(HvCallCfgGetPhysicalProcessors, HvLpConfig_getLpIndex(),
|
||||
HvCallCfg_Cur);
|
||||
}
|
||||
|
||||
static inline HvLpSharedPoolIndex HvLpConfig_getSharedPoolIndex(void)
|
||||
{
|
||||
return HvCall1(HvCallCfgGetSharedPoolIndex, HvLpConfig_getLpIndex());
|
||||
}
|
||||
|
||||
static inline u64 HvLpConfig_getSharedProcUnits(void)
|
||||
{
|
||||
return HvCall2(HvCallCfgGetSharedProcUnits, HvLpConfig_getLpIndex(),
|
||||
HvCallCfg_Cur);
|
||||
}
|
||||
|
||||
static inline u64 HvLpConfig_getMaxSharedProcUnits(void)
|
||||
{
|
||||
return HvCall2(HvCallCfgGetSharedProcUnits, HvLpConfig_getLpIndex(),
|
||||
HvCallCfg_Max);
|
||||
}
|
||||
|
||||
static inline u64 HvLpConfig_getMaxPhysicalProcessors(void)
|
||||
{
|
||||
return HvCall2(HvCallCfgGetPhysicalProcessors, HvLpConfig_getLpIndex(),
|
||||
HvCallCfg_Max);
|
||||
}
|
||||
|
||||
static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMapForLp(
|
||||
HvLpIndex lp)
|
||||
{
|
||||
/*
|
||||
* This is a new function in V5R1 so calls to this on older
|
||||
* hypervisors will return -1
|
||||
*/
|
||||
u64 retVal = HvCall1(HvCallCfgGetVirtualLanIndexMap, lp);
|
||||
if (retVal == -1)
|
||||
retVal = 0;
|
||||
return retVal;
|
||||
}
|
||||
|
||||
static inline HvLpVirtualLanIndexMap HvLpConfig_getVirtualLanIndexMap(void)
|
||||
{
|
||||
return HvLpConfig_getVirtualLanIndexMapForLp(
|
||||
HvLpConfig_getLpIndex_outline());
|
||||
}
|
||||
|
||||
static inline int HvLpConfig_doLpsCommunicateOnVirtualLan(HvLpIndex lp1,
|
||||
HvLpIndex lp2)
|
||||
{
|
||||
HvLpVirtualLanIndexMap virtualLanIndexMap1 =
|
||||
HvLpConfig_getVirtualLanIndexMapForLp(lp1);
|
||||
HvLpVirtualLanIndexMap virtualLanIndexMap2 =
|
||||
HvLpConfig_getVirtualLanIndexMapForLp(lp2);
|
||||
return ((virtualLanIndexMap1 & virtualLanIndexMap2) != 0);
|
||||
}
|
||||
|
||||
static inline HvLpIndex HvLpConfig_getHostingLpIndex(HvLpIndex lp)
|
||||
{
|
||||
return HvCall1(HvCallCfgGetHostingLpIndex, lp);
|
||||
}
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_HV_LP_CONFIG_H */
|
||||
@@ -1,162 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2001 Mike Corrigan IBM Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* This file contains the class for HV events in the system. */
|
||||
|
||||
#ifndef _ASM_POWERPC_ISERIES_HV_LP_EVENT_H
|
||||
#define _ASM_POWERPC_ISERIES_HV_LP_EVENT_H
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
#include <asm/iseries/hv_call_event.h>
|
||||
|
||||
/*
|
||||
* HvLpEvent is the structure for Lp Event messages passed between
|
||||
* partitions through PLIC.
|
||||
*/
|
||||
|
||||
struct HvLpEvent {
|
||||
u8 flags; /* Event flags x00-x00 */
|
||||
u8 xType; /* Type of message x01-x01 */
|
||||
u16 xSubtype; /* Subtype for event x02-x03 */
|
||||
u8 xSourceLp; /* Source LP x04-x04 */
|
||||
u8 xTargetLp; /* Target LP x05-x05 */
|
||||
u8 xSizeMinus1; /* Size of Derived class - 1 x06-x06 */
|
||||
u8 xRc; /* RC for Ack flows x07-x07 */
|
||||
u16 xSourceInstanceId; /* Source sides instance id x08-x09 */
|
||||
u16 xTargetInstanceId; /* Target sides instance id x0A-x0B */
|
||||
union {
|
||||
u32 xSubtypeData; /* Data usable by the subtype x0C-x0F */
|
||||
u16 xSubtypeDataShort[2]; /* Data as 2 shorts */
|
||||
u8 xSubtypeDataChar[4]; /* Data as 4 chars */
|
||||
} x;
|
||||
|
||||
u64 xCorrelationToken; /* Unique value for source/type x10-x17 */
|
||||
};
|
||||
|
||||
typedef void (*LpEventHandler)(struct HvLpEvent *);
|
||||
|
||||
/* Register a handler for an event type - returns 0 on success */
|
||||
extern int HvLpEvent_registerHandler(HvLpEvent_Type eventType,
|
||||
LpEventHandler hdlr);
|
||||
|
||||
/*
|
||||
* Unregister a handler for an event type
|
||||
*
|
||||
* This call will sleep until the handler being removed is guaranteed to
|
||||
* be no longer executing on any CPU. Do not call with locks held.
|
||||
*
|
||||
* returns 0 on success
|
||||
* Unregister will fail if there are any paths open for the type
|
||||
*/
|
||||
extern int HvLpEvent_unregisterHandler(HvLpEvent_Type eventType);
|
||||
|
||||
/*
|
||||
* Open an Lp Event Path for an event type
|
||||
* returns 0 on success
|
||||
* openPath will fail if there is no handler registered for the event type.
|
||||
* The lpIndex specified is the partition index for the target partition
|
||||
* (for VirtualIo, VirtualLan and SessionMgr) other types specify zero)
|
||||
*/
|
||||
extern int HvLpEvent_openPath(HvLpEvent_Type eventType, HvLpIndex lpIndex);
|
||||
|
||||
/*
|
||||
* Close an Lp Event Path for a type and partition
|
||||
* returns 0 on success
|
||||
*/
|
||||
extern int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex);
|
||||
|
||||
#define HvLpEvent_Type_Hypervisor 0
|
||||
#define HvLpEvent_Type_MachineFac 1
|
||||
#define HvLpEvent_Type_SessionMgr 2
|
||||
#define HvLpEvent_Type_SpdIo 3
|
||||
#define HvLpEvent_Type_VirtualBus 4
|
||||
#define HvLpEvent_Type_PciIo 5
|
||||
#define HvLpEvent_Type_RioIo 6
|
||||
#define HvLpEvent_Type_VirtualLan 7
|
||||
#define HvLpEvent_Type_VirtualIo 8
|
||||
#define HvLpEvent_Type_NumTypes 9
|
||||
|
||||
#define HvLpEvent_Rc_Good 0
|
||||
#define HvLpEvent_Rc_BufferNotAvailable 1
|
||||
#define HvLpEvent_Rc_Cancelled 2
|
||||
#define HvLpEvent_Rc_GenericError 3
|
||||
#define HvLpEvent_Rc_InvalidAddress 4
|
||||
#define HvLpEvent_Rc_InvalidPartition 5
|
||||
#define HvLpEvent_Rc_InvalidSize 6
|
||||
#define HvLpEvent_Rc_InvalidSubtype 7
|
||||
#define HvLpEvent_Rc_InvalidSubtypeData 8
|
||||
#define HvLpEvent_Rc_InvalidType 9
|
||||
#define HvLpEvent_Rc_PartitionDead 10
|
||||
#define HvLpEvent_Rc_PathClosed 11
|
||||
#define HvLpEvent_Rc_SubtypeError 12
|
||||
|
||||
#define HvLpEvent_Function_Ack 0
|
||||
#define HvLpEvent_Function_Int 1
|
||||
|
||||
#define HvLpEvent_AckInd_NoAck 0
|
||||
#define HvLpEvent_AckInd_DoAck 1
|
||||
|
||||
#define HvLpEvent_AckType_ImmediateAck 0
|
||||
#define HvLpEvent_AckType_DeferredAck 1
|
||||
|
||||
#define HV_LP_EVENT_INT 0x01
|
||||
#define HV_LP_EVENT_DO_ACK 0x02
|
||||
#define HV_LP_EVENT_DEFERRED_ACK 0x04
|
||||
#define HV_LP_EVENT_VALID 0x80
|
||||
|
||||
#define HvLpDma_Direction_LocalToRemote 0
|
||||
#define HvLpDma_Direction_RemoteToLocal 1
|
||||
|
||||
#define HvLpDma_AddressType_TceIndex 0
|
||||
#define HvLpDma_AddressType_RealAddress 1
|
||||
|
||||
#define HvLpDma_Rc_Good 0
|
||||
#define HvLpDma_Rc_Error 1
|
||||
#define HvLpDma_Rc_PartitionDead 2
|
||||
#define HvLpDma_Rc_PathClosed 3
|
||||
#define HvLpDma_Rc_InvalidAddress 4
|
||||
#define HvLpDma_Rc_InvalidLength 5
|
||||
|
||||
static inline int hvlpevent_is_valid(struct HvLpEvent *h)
|
||||
{
|
||||
return h->flags & HV_LP_EVENT_VALID;
|
||||
}
|
||||
|
||||
static inline void hvlpevent_invalidate(struct HvLpEvent *h)
|
||||
{
|
||||
h->flags &= ~ HV_LP_EVENT_VALID;
|
||||
}
|
||||
|
||||
static inline int hvlpevent_is_int(struct HvLpEvent *h)
|
||||
{
|
||||
return h->flags & HV_LP_EVENT_INT;
|
||||
}
|
||||
|
||||
static inline int hvlpevent_is_ack(struct HvLpEvent *h)
|
||||
{
|
||||
return !hvlpevent_is_int(h);
|
||||
}
|
||||
|
||||
static inline int hvlpevent_need_ack(struct HvLpEvent *h)
|
||||
{
|
||||
return h->flags & HV_LP_EVENT_DO_ACK;
|
||||
}
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_HV_LP_EVENT_H */
|
||||
@@ -1,112 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2001 Mike Corrigan IBM Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_HV_TYPES_H
|
||||
#define _ASM_POWERPC_ISERIES_HV_TYPES_H
|
||||
|
||||
/*
|
||||
* General typedefs for the hypervisor.
|
||||
*/
|
||||
|
||||
#include <asm/types.h>
|
||||
|
||||
typedef u8 HvLpIndex;
|
||||
typedef u16 HvLpInstanceId;
|
||||
typedef u64 HvLpTOD;
|
||||
typedef u64 HvLpSystemSerialNum;
|
||||
typedef u8 HvLpDeviceSerialNum[12];
|
||||
typedef u16 HvLpSanHwSet;
|
||||
typedef u16 HvLpBus;
|
||||
typedef u16 HvLpBoard;
|
||||
typedef u16 HvLpCard;
|
||||
typedef u8 HvLpDeviceType[4];
|
||||
typedef u8 HvLpDeviceModel[3];
|
||||
typedef u64 HvIoToken;
|
||||
typedef u8 HvLpName[8];
|
||||
typedef u32 HvIoId;
|
||||
typedef u64 HvRealMemoryIndex;
|
||||
typedef u32 HvLpIndexMap; /* Must hold HVMAXARCHITECTEDLPS bits!!! */
|
||||
typedef u16 HvLpVrmIndex;
|
||||
typedef u32 HvXmGenerationId;
|
||||
typedef u8 HvLpBusPool;
|
||||
typedef u8 HvLpSharedPoolIndex;
|
||||
typedef u16 HvLpSharedProcUnitsX100;
|
||||
typedef u8 HvLpVirtualLanIndex;
|
||||
typedef u16 HvLpVirtualLanIndexMap; /* Must hold HVMAXARCHITECTEDVIRTUALLANS bits!!! */
|
||||
typedef u16 HvBusNumber; /* Hypervisor Bus Number */
|
||||
typedef u8 HvSubBusNumber; /* Hypervisor SubBus Number */
|
||||
typedef u8 HvAgentId; /* Hypervisor DevFn */
|
||||
|
||||
|
||||
#define HVMAXARCHITECTEDLPS 32
|
||||
#define HVMAXARCHITECTEDVIRTUALLANS 16
|
||||
#define HVMAXARCHITECTEDVIRTUALDISKS 32
|
||||
#define HVMAXARCHITECTEDVIRTUALCDROMS 8
|
||||
#define HVMAXARCHITECTEDVIRTUALTAPES 8
|
||||
#define HVCHUNKSIZE (256 * 1024)
|
||||
#define HVPAGESIZE (4 * 1024)
|
||||
#define HVLPMINMEGSPRIMARY 256
|
||||
#define HVLPMINMEGSSECONDARY 64
|
||||
#define HVCHUNKSPERMEG 4
|
||||
#define HVPAGESPERMEG 256
|
||||
#define HVPAGESPERCHUNK 64
|
||||
|
||||
#define HvLpIndexInvalid ((HvLpIndex)0xff)
|
||||
|
||||
/*
|
||||
* Enums for the sub-components under PLIC
|
||||
* Used in HvCall and HvPrimaryCall
|
||||
*/
|
||||
enum {
|
||||
HvCallCompId = 0,
|
||||
HvCallCpuCtlsCompId = 1,
|
||||
HvCallCfgCompId = 2,
|
||||
HvCallEventCompId = 3,
|
||||
HvCallHptCompId = 4,
|
||||
HvCallPciCompId = 5,
|
||||
HvCallSlmCompId = 6,
|
||||
HvCallSmCompId = 7,
|
||||
HvCallSpdCompId = 8,
|
||||
HvCallXmCompId = 9,
|
||||
HvCallRioCompId = 10,
|
||||
HvCallRsvd3CompId = 11,
|
||||
HvCallRsvd2CompId = 12,
|
||||
HvCallRsvd1CompId = 13,
|
||||
HvCallMaxCompId = 14,
|
||||
HvPrimaryCallCompId = 0,
|
||||
HvPrimaryCallCfgCompId = 1,
|
||||
HvPrimaryCallPciCompId = 2,
|
||||
HvPrimaryCallSmCompId = 3,
|
||||
HvPrimaryCallSpdCompId = 4,
|
||||
HvPrimaryCallXmCompId = 5,
|
||||
HvPrimaryCallRioCompId = 6,
|
||||
HvPrimaryCallRsvd7CompId = 7,
|
||||
HvPrimaryCallRsvd6CompId = 8,
|
||||
HvPrimaryCallRsvd5CompId = 9,
|
||||
HvPrimaryCallRsvd4CompId = 10,
|
||||
HvPrimaryCallRsvd3CompId = 11,
|
||||
HvPrimaryCallRsvd2CompId = 12,
|
||||
HvPrimaryCallRsvd1CompId = 13,
|
||||
HvPrimaryCallMaxCompId = HvCallMaxCompId
|
||||
};
|
||||
|
||||
struct HvLpBufferList {
|
||||
u64 addr;
|
||||
u64 len;
|
||||
};
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_HV_TYPES_H */
|
||||
@@ -1,37 +0,0 @@
|
||||
#ifndef _ASM_POWERPC_ISERIES_IOMMU_H
|
||||
#define _ASM_POWERPC_ISERIES_IOMMU_H
|
||||
|
||||
/*
|
||||
* Copyright (C) 2005 Stephen Rothwell, IBM Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the:
|
||||
* Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
struct pci_dev;
|
||||
struct vio_dev;
|
||||
struct device_node;
|
||||
struct iommu_table;
|
||||
|
||||
/* Get table parameters from HV */
|
||||
extern void iommu_table_getparms_iSeries(unsigned long busno,
|
||||
unsigned char slotno, unsigned char virtbus,
|
||||
struct iommu_table *tbl);
|
||||
|
||||
extern struct iommu_table *vio_build_iommu_table_iseries(struct vio_dev *dev);
|
||||
extern void iommu_vio_init(void);
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_IOMMU_H */
|
||||
@@ -1,78 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2001 Mike Corrigan IBM Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_IT_LP_QUEUE_H
|
||||
#define _ASM_POWERPC_ISERIES_IT_LP_QUEUE_H
|
||||
|
||||
/*
|
||||
* This control block defines the simple LP queue structure that is
|
||||
* shared between the hypervisor (PLIC) and the OS in order to send
|
||||
* events to an LP.
|
||||
*/
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
#define IT_LP_MAX_QUEUES 8
|
||||
|
||||
#define IT_LP_NOT_USED 0 /* Queue will not be used by PLIC */
|
||||
#define IT_LP_DEDICATED_IO 1 /* Queue dedicated to IO processor specified */
|
||||
#define IT_LP_DEDICATED_LP 2 /* Queue dedicated to LP specified */
|
||||
#define IT_LP_SHARED 3 /* Queue shared for both IO and LP */
|
||||
|
||||
#define IT_LP_EVENT_STACK_SIZE 4096
|
||||
#define IT_LP_EVENT_MAX_SIZE 256
|
||||
#define IT_LP_EVENT_ALIGN 64
|
||||
|
||||
struct hvlpevent_queue {
|
||||
/*
|
||||
* The hq_current_event is the pointer to the next event stack entry
|
||||
* that will become valid. The OS must peek at this entry to determine
|
||||
* if it is valid. PLIC will set the valid indicator as the very last
|
||||
* store into that entry.
|
||||
*
|
||||
* When the OS has completed processing of the event then it will mark
|
||||
* the event as invalid so that PLIC knows it can store into that event
|
||||
* location again.
|
||||
*
|
||||
* If the event stack fills and there are overflow events, then PLIC
|
||||
* will set the hq_overflow_pending flag in which case the OS will
|
||||
* have to fetch the additional LP events once they have drained the
|
||||
* event stack.
|
||||
*
|
||||
* The first 16-bytes are known by both the OS and PLIC. The remainder
|
||||
* of the cache line is for use by the OS.
|
||||
*/
|
||||
u8 hq_overflow_pending; /* 0x00 Overflow events are pending */
|
||||
u8 hq_status; /* 0x01 DedicatedIo or DedicatedLp or NotUsed */
|
||||
u16 hq_proc_index; /* 0x02 Logical Proc Index for correlation */
|
||||
u8 hq_reserved1[12]; /* 0x04 */
|
||||
char *hq_current_event; /* 0x10 */
|
||||
char *hq_last_event; /* 0x18 */
|
||||
char *hq_event_stack; /* 0x20 */
|
||||
u8 hq_index; /* 0x28 unique sequential index. */
|
||||
u8 hq_reserved2[3]; /* 0x29-2b */
|
||||
spinlock_t hq_lock;
|
||||
};
|
||||
|
||||
extern struct hvlpevent_queue hvlpevent_queue;
|
||||
|
||||
extern int hvlpevent_is_pending(void);
|
||||
extern void process_hvlpevents(void);
|
||||
extern void setup_hvlpevent_queue(void);
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_IT_LP_QUEUE_H */
|
||||
@@ -1,85 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2001 Mike Corrigan IBM Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_LPAR_MAP_H
|
||||
#define _ASM_POWERPC_ISERIES_LPAR_MAP_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <asm/types.h>
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The iSeries hypervisor will set up mapping for one or more
|
||||
* ESID/VSID pairs (in SLB/segment registers) and will set up
|
||||
* mappings of one or more ranges of pages to VAs.
|
||||
* We will have the hypervisor set up the ESID->VSID mapping
|
||||
* for the four kernel segments (C-F). With shared processors,
|
||||
* the hypervisor will clear all segment registers and reload
|
||||
* these four whenever the processor is switched from one
|
||||
* partition to another.
|
||||
*/
|
||||
|
||||
/* The Vsid and Esid identified below will be used by the hypervisor
|
||||
* to set up a memory mapping for part of the load area before giving
|
||||
* control to the Linux kernel. The load area is 64 MB, but this must
|
||||
* not attempt to map the whole load area. The Hashed Page Table may
|
||||
* need to be located within the load area (if the total partition size
|
||||
* is 64 MB), but cannot be mapped. Typically, this should specify
|
||||
* to map half (32 MB) of the load area.
|
||||
*
|
||||
* The hypervisor will set up page table entries for the number of
|
||||
* pages specified.
|
||||
*
|
||||
* In 32-bit mode, the hypervisor will load all four of the
|
||||
* segment registers (identified by the low-order four bits of the
|
||||
* Esid field. In 64-bit mode, the hypervisor will load one SLB
|
||||
* entry to map the Esid to the Vsid.
|
||||
*/
|
||||
|
||||
#define HvEsidsToMap 2
|
||||
#define HvRangesToMap 1
|
||||
|
||||
/* Hypervisor initially maps 32MB of the load area */
|
||||
#define HvPagesToMap 8192
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
struct LparMap {
|
||||
u64 xNumberEsids; // Number of ESID/VSID pairs
|
||||
u64 xNumberRanges; // Number of VA ranges to map
|
||||
u64 xSegmentTableOffs; // Page number within load area of seg table
|
||||
u64 xRsvd[5];
|
||||
struct {
|
||||
u64 xKernelEsid; // Esid used to map kernel load
|
||||
u64 xKernelVsid; // Vsid used to map kernel load
|
||||
} xEsids[HvEsidsToMap];
|
||||
struct {
|
||||
u64 xPages; // Number of pages to be mapped
|
||||
u64 xOffset; // Offset from start of load area
|
||||
u64 xVPN; // Virtual Page Number
|
||||
} xRanges[HvRangesToMap];
|
||||
};
|
||||
|
||||
extern const struct LparMap xLparMap;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/* the fixed address where the LparMap exists */
|
||||
#define LPARMAP_PHYS 0x7000
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_LPAR_MAP_H */
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2001 Troy D. Armstrong IBM Corporation
|
||||
* Copyright (C) 2004 Stephen Rothwell IBM Corporation
|
||||
*
|
||||
* This modules exists as an interface between a Linux secondary partition
|
||||
* running on an iSeries and the primary partition's Virtual Service
|
||||
* Processor (VSP) object. The VSP has final authority over powering on/off
|
||||
* all partitions in the iSeries. It also provides miscellaneous low-level
|
||||
* machine facility type operations.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_MF_H
|
||||
#define _ASM_POWERPC_ISERIES_MF_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm/iseries/hv_types.h>
|
||||
#include <asm/iseries/hv_call_event.h>
|
||||
|
||||
struct rtc_time;
|
||||
|
||||
typedef void (*MFCompleteHandler)(void *clientToken, int returnCode);
|
||||
|
||||
extern void mf_allocate_lp_events(HvLpIndex targetLp, HvLpEvent_Type type,
|
||||
unsigned size, unsigned amount, MFCompleteHandler hdlr,
|
||||
void *userToken);
|
||||
extern void mf_deallocate_lp_events(HvLpIndex targetLp, HvLpEvent_Type type,
|
||||
unsigned count, MFCompleteHandler hdlr, void *userToken);
|
||||
|
||||
extern void mf_power_off(void);
|
||||
extern void mf_reboot(char *cmd);
|
||||
|
||||
extern void mf_display_src(u32 word);
|
||||
extern void mf_display_progress(u16 value);
|
||||
|
||||
extern void mf_init(void);
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_MF_H */
|
||||
@@ -1,265 +0,0 @@
|
||||
/* -*- linux-c -*-
|
||||
*
|
||||
* iSeries Virtual I/O Message Path header
|
||||
*
|
||||
* Authors: Dave Boutcher <boutcher@us.ibm.com>
|
||||
* Ryan Arnold <ryanarn@us.ibm.com>
|
||||
* Colin Devilbiss <devilbis@us.ibm.com>
|
||||
*
|
||||
* (C) Copyright 2000 IBM Corporation
|
||||
*
|
||||
* This header file is used by the iSeries virtual I/O device
|
||||
* drivers. It defines the interfaces to the common functions
|
||||
* (implemented in drivers/char/viopath.h) as well as defining
|
||||
* common functions and structures. Currently (at the time I
|
||||
* wrote this comment) the iSeries virtual I/O device drivers
|
||||
* that use this are
|
||||
* drivers/block/viodasd.c
|
||||
* drivers/char/viocons.c
|
||||
* drivers/char/viotape.c
|
||||
* drivers/cdrom/viocd.c
|
||||
*
|
||||
* The iSeries virtual ethernet support (veth.c) uses a whole
|
||||
* different set of functions.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) anyu later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_ISERIES_VIO_H
|
||||
#define _ASM_POWERPC_ISERIES_VIO_H
|
||||
|
||||
#include <asm/iseries/hv_types.h>
|
||||
#include <asm/iseries/hv_lp_event.h>
|
||||
|
||||
/*
|
||||
* iSeries virtual I/O events use the subtype field in
|
||||
* HvLpEvent to figure out what kind of vio event is coming
|
||||
* in. We use a table to route these, and this defines
|
||||
* the maximum number of distinct subtypes
|
||||
*/
|
||||
#define VIO_MAX_SUBTYPES 8
|
||||
|
||||
#define VIOMAXBLOCKDMA 12
|
||||
|
||||
struct open_data {
|
||||
u64 disk_size;
|
||||
u16 max_disk;
|
||||
u16 cylinders;
|
||||
u16 tracks;
|
||||
u16 sectors;
|
||||
u16 bytes_per_sector;
|
||||
};
|
||||
|
||||
struct rw_data {
|
||||
u64 offset;
|
||||
struct {
|
||||
u32 token;
|
||||
u32 reserved;
|
||||
u64 len;
|
||||
} dma_info[VIOMAXBLOCKDMA];
|
||||
};
|
||||
|
||||
struct vioblocklpevent {
|
||||
struct HvLpEvent event;
|
||||
u32 reserved;
|
||||
u16 version;
|
||||
u16 sub_result;
|
||||
u16 disk;
|
||||
u16 flags;
|
||||
union {
|
||||
struct open_data open_data;
|
||||
struct rw_data rw_data;
|
||||
u64 changed;
|
||||
} u;
|
||||
};
|
||||
|
||||
#define vioblockflags_ro 0x0001
|
||||
|
||||
enum vioblocksubtype {
|
||||
vioblockopen = 0x0001,
|
||||
vioblockclose = 0x0002,
|
||||
vioblockread = 0x0003,
|
||||
vioblockwrite = 0x0004,
|
||||
vioblockflush = 0x0005,
|
||||
vioblockcheck = 0x0007
|
||||
};
|
||||
|
||||
struct viocdlpevent {
|
||||
struct HvLpEvent event;
|
||||
u32 reserved;
|
||||
u16 version;
|
||||
u16 sub_result;
|
||||
u16 disk;
|
||||
u16 flags;
|
||||
u32 token;
|
||||
u64 offset; /* On open, max number of disks */
|
||||
u64 len; /* On open, size of the disk */
|
||||
u32 block_size; /* Only set on open */
|
||||
u32 media_size; /* Only set on open */
|
||||
};
|
||||
|
||||
enum viocdsubtype {
|
||||
viocdopen = 0x0001,
|
||||
viocdclose = 0x0002,
|
||||
viocdread = 0x0003,
|
||||
viocdwrite = 0x0004,
|
||||
viocdlockdoor = 0x0005,
|
||||
viocdgetinfo = 0x0006,
|
||||
viocdcheck = 0x0007
|
||||
};
|
||||
|
||||
struct viotapelpevent {
|
||||
struct HvLpEvent event;
|
||||
u32 reserved;
|
||||
u16 version;
|
||||
u16 sub_type_result;
|
||||
u16 tape;
|
||||
u16 flags;
|
||||
u32 token;
|
||||
u64 len;
|
||||
union {
|
||||
struct {
|
||||
u32 tape_op;
|
||||
u32 count;
|
||||
} op;
|
||||
struct {
|
||||
u32 type;
|
||||
u32 resid;
|
||||
u32 dsreg;
|
||||
u32 gstat;
|
||||
u32 erreg;
|
||||
u32 file_no;
|
||||
u32 block_no;
|
||||
} get_status;
|
||||
struct {
|
||||
u32 block_no;
|
||||
} get_pos;
|
||||
} u;
|
||||
};
|
||||
|
||||
enum viotapesubtype {
|
||||
viotapeopen = 0x0001,
|
||||
viotapeclose = 0x0002,
|
||||
viotaperead = 0x0003,
|
||||
viotapewrite = 0x0004,
|
||||
viotapegetinfo = 0x0005,
|
||||
viotapeop = 0x0006,
|
||||
viotapegetpos = 0x0007,
|
||||
viotapesetpos = 0x0008,
|
||||
viotapegetstatus = 0x0009
|
||||
};
|
||||
|
||||
/*
|
||||
* Each subtype can register a handler to process their events.
|
||||
* The handler must have this interface.
|
||||
*/
|
||||
typedef void (vio_event_handler_t) (struct HvLpEvent * event);
|
||||
|
||||
extern int viopath_open(HvLpIndex remoteLp, int subtype, int numReq);
|
||||
extern int viopath_close(HvLpIndex remoteLp, int subtype, int numReq);
|
||||
extern int vio_setHandler(int subtype, vio_event_handler_t * beh);
|
||||
extern int vio_clearHandler(int subtype);
|
||||
extern int viopath_isactive(HvLpIndex lp);
|
||||
extern HvLpInstanceId viopath_sourceinst(HvLpIndex lp);
|
||||
extern HvLpInstanceId viopath_targetinst(HvLpIndex lp);
|
||||
extern void vio_set_hostlp(void);
|
||||
extern void *vio_get_event_buffer(int subtype);
|
||||
extern void vio_free_event_buffer(int subtype, void *buffer);
|
||||
|
||||
extern struct vio_dev *vio_create_viodasd(u32 unit);
|
||||
|
||||
extern HvLpIndex viopath_hostLp;
|
||||
extern HvLpIndex viopath_ourLp;
|
||||
|
||||
#define VIOCHAR_MAX_DATA 200
|
||||
|
||||
#define VIOMAJOR_SUBTYPE_MASK 0xff00
|
||||
#define VIOMINOR_SUBTYPE_MASK 0x00ff
|
||||
#define VIOMAJOR_SUBTYPE_SHIFT 8
|
||||
|
||||
#define VIOVERSION 0x0101
|
||||
|
||||
/*
|
||||
* This is the general structure for VIO errors; each module should have
|
||||
* a table of them, and each table should be terminated by an entry of
|
||||
* { 0, 0, NULL }. Then, to find a specific error message, a module
|
||||
* should pass its local table and the return code.
|
||||
*/
|
||||
struct vio_error_entry {
|
||||
u16 rc;
|
||||
int errno;
|
||||
const char *msg;
|
||||
};
|
||||
extern const struct vio_error_entry *vio_lookup_rc(
|
||||
const struct vio_error_entry *local_table, u16 rc);
|
||||
|
||||
enum viosubtypes {
|
||||
viomajorsubtype_monitor = 0x0100,
|
||||
viomajorsubtype_blockio = 0x0200,
|
||||
viomajorsubtype_chario = 0x0300,
|
||||
viomajorsubtype_config = 0x0400,
|
||||
viomajorsubtype_cdio = 0x0500,
|
||||
viomajorsubtype_tape = 0x0600,
|
||||
viomajorsubtype_scsi = 0x0700
|
||||
};
|
||||
|
||||
enum vioconfigsubtype {
|
||||
vioconfigget = 0x0001,
|
||||
};
|
||||
|
||||
enum viorc {
|
||||
viorc_good = 0x0000,
|
||||
viorc_noConnection = 0x0001,
|
||||
viorc_noReceiver = 0x0002,
|
||||
viorc_noBufferAvailable = 0x0003,
|
||||
viorc_invalidMessageType = 0x0004,
|
||||
viorc_invalidRange = 0x0201,
|
||||
viorc_invalidToken = 0x0202,
|
||||
viorc_DMAError = 0x0203,
|
||||
viorc_useError = 0x0204,
|
||||
viorc_releaseError = 0x0205,
|
||||
viorc_invalidDisk = 0x0206,
|
||||
viorc_openRejected = 0x0301
|
||||
};
|
||||
|
||||
/*
|
||||
* The structure of the events that flow between us and OS/400 for chario
|
||||
* events. You can't mess with this unless the OS/400 side changes too.
|
||||
*/
|
||||
struct viocharlpevent {
|
||||
struct HvLpEvent event;
|
||||
u32 reserved;
|
||||
u16 version;
|
||||
u16 subtype_result_code;
|
||||
u8 virtual_device;
|
||||
u8 len;
|
||||
u8 data[VIOCHAR_MAX_DATA];
|
||||
};
|
||||
|
||||
#define VIOCHAR_WINDOW 10
|
||||
|
||||
enum viocharsubtype {
|
||||
viocharopen = 0x0001,
|
||||
viocharclose = 0x0002,
|
||||
viochardata = 0x0003,
|
||||
viocharack = 0x0004,
|
||||
viocharconfig = 0x0005
|
||||
};
|
||||
|
||||
enum viochar_rc {
|
||||
viochar_rc_ebusy = 1
|
||||
};
|
||||
|
||||
#endif /* _ASM_POWERPC_ISERIES_VIO_H */
|
||||
@@ -41,15 +41,7 @@
|
||||
* We only have to have statically allocated lppaca structs on
|
||||
* legacy iSeries, which supports at most 64 cpus.
|
||||
*/
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
#if NR_CPUS < 64
|
||||
#define NR_LPPACAS NR_CPUS
|
||||
#else
|
||||
#define NR_LPPACAS 64
|
||||
#endif
|
||||
#else /* not iSeries */
|
||||
#define NR_LPPACAS 1
|
||||
#endif
|
||||
|
||||
|
||||
/* The Hypervisor barfs if the lppaca crosses a page boundary. A 1k
|
||||
|
||||
@@ -273,7 +273,6 @@ struct mpic
|
||||
unsigned int isu_size;
|
||||
unsigned int isu_shift;
|
||||
unsigned int isu_mask;
|
||||
unsigned int irq_count;
|
||||
/* Number of sources */
|
||||
unsigned int num_sources;
|
||||
/* default senses array */
|
||||
@@ -349,8 +348,6 @@ struct mpic
|
||||
#define MPIC_U3_HT_IRQS 0x00000004
|
||||
/* Broken IPI registers (autodetected) */
|
||||
#define MPIC_BROKEN_IPI 0x00000008
|
||||
/* MPIC wants a reset */
|
||||
#define MPIC_WANTS_RESET 0x00000010
|
||||
/* Spurious vector requires EOI */
|
||||
#define MPIC_SPV_EOI 0x00000020
|
||||
/* No passthrough disable */
|
||||
@@ -363,15 +360,11 @@ struct mpic
|
||||
#define MPIC_ENABLE_MCK 0x00000200
|
||||
/* Disable bias among target selection, spread interrupts evenly */
|
||||
#define MPIC_NO_BIAS 0x00000400
|
||||
/* Ignore NIRQS as reported by FRR */
|
||||
#define MPIC_BROKEN_FRR_NIRQS 0x00000800
|
||||
/* Destination only supports a single CPU at a time */
|
||||
#define MPIC_SINGLE_DEST_CPU 0x00001000
|
||||
/* Enable CoreInt delivery of interrupts */
|
||||
#define MPIC_ENABLE_COREINT 0x00002000
|
||||
/* Disable resetting of the MPIC.
|
||||
* NOTE: This flag trumps MPIC_WANTS_RESET.
|
||||
*/
|
||||
/* Do not reset the MPIC during initialization */
|
||||
#define MPIC_NO_RESET 0x00004000
|
||||
/* Freescale MPIC (compatible includes "fsl,mpic") */
|
||||
#define MPIC_FSL 0x00008000
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
/*
|
||||
* Copyright 2011-2012, Meador Inge, Mentor Graphics Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; version 2 of the
|
||||
* License.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _ASM_MPIC_MSGR_H
|
||||
#define _ASM_MPIC_MSGR_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
struct mpic_msgr {
|
||||
u32 __iomem *base;
|
||||
u32 __iomem *mer;
|
||||
int irq;
|
||||
unsigned char in_use;
|
||||
raw_spinlock_t lock;
|
||||
int num;
|
||||
};
|
||||
|
||||
/* Get a message register
|
||||
*
|
||||
* @reg_num: the MPIC message register to get
|
||||
*
|
||||
* A pointer to the message register is returned. If
|
||||
* the message register asked for is already in use, then
|
||||
* EBUSY is returned. If the number given is not associated
|
||||
* with an actual message register, then ENODEV is returned.
|
||||
* Successfully getting the register marks it as in use.
|
||||
*/
|
||||
extern struct mpic_msgr *mpic_msgr_get(unsigned int reg_num);
|
||||
|
||||
/* Relinquish a message register
|
||||
*
|
||||
* @msgr: the message register to return
|
||||
*
|
||||
* Disables the given message register and marks it as free.
|
||||
* After this call has completed successully the message
|
||||
* register is available to be acquired by a call to
|
||||
* mpic_msgr_get.
|
||||
*/
|
||||
extern void mpic_msgr_put(struct mpic_msgr *msgr);
|
||||
|
||||
/* Enable a message register
|
||||
*
|
||||
* @msgr: the message register to enable
|
||||
*
|
||||
* The given message register is enabled for sending
|
||||
* messages.
|
||||
*/
|
||||
extern void mpic_msgr_enable(struct mpic_msgr *msgr);
|
||||
|
||||
/* Disable a message register
|
||||
*
|
||||
* @msgr: the message register to disable
|
||||
*
|
||||
* The given message register is disabled for sending
|
||||
* messages.
|
||||
*/
|
||||
extern void mpic_msgr_disable(struct mpic_msgr *msgr);
|
||||
|
||||
/* Write a message to a message register
|
||||
*
|
||||
* @msgr: the message register to write to
|
||||
* @message: the message to write
|
||||
*
|
||||
* The given 32-bit message is written to the given message
|
||||
* register. Writing to an enabled message registers fires
|
||||
* an interrupt.
|
||||
*/
|
||||
static inline void mpic_msgr_write(struct mpic_msgr *msgr, u32 message)
|
||||
{
|
||||
out_be32(msgr->base, message);
|
||||
}
|
||||
|
||||
/* Read a message from a message register
|
||||
*
|
||||
* @msgr: the message register to read from
|
||||
*
|
||||
* Returns the 32-bit value currently in the given message register.
|
||||
* Upon reading the register any interrupts for that register are
|
||||
* cleared.
|
||||
*/
|
||||
static inline u32 mpic_msgr_read(struct mpic_msgr *msgr)
|
||||
{
|
||||
return in_be32(msgr->base);
|
||||
}
|
||||
|
||||
/* Clear a message register
|
||||
*
|
||||
* @msgr: the message register to clear
|
||||
*
|
||||
* Clears any interrupts associated with the given message register.
|
||||
*/
|
||||
static inline void mpic_msgr_clear(struct mpic_msgr *msgr)
|
||||
{
|
||||
(void) mpic_msgr_read(msgr);
|
||||
}
|
||||
|
||||
/* Set the destination CPU for the message register
|
||||
*
|
||||
* @msgr: the message register whose destination is to be set
|
||||
* @cpu_num: the Linux CPU number to bind the message register to
|
||||
*
|
||||
* Note that the CPU number given is the CPU number used by the kernel
|
||||
* and *not* the actual hardware CPU number.
|
||||
*/
|
||||
static inline void mpic_msgr_set_destination(struct mpic_msgr *msgr,
|
||||
u32 cpu_num)
|
||||
{
|
||||
out_be32(msgr->base, 1 << get_hard_smp_processor_id(cpu_num));
|
||||
}
|
||||
|
||||
/* Get the IRQ number for the message register
|
||||
* @msgr: the message register whose IRQ is to be returned
|
||||
*
|
||||
* Returns the IRQ number associated with the given message register.
|
||||
* NO_IRQ is returned if this message register is not capable of
|
||||
* receiving interrupts. What message register can and cannot receive
|
||||
* interrupts is specified in the device tree for the system.
|
||||
*/
|
||||
static inline int mpic_msgr_get_irq(struct mpic_msgr *msgr)
|
||||
{
|
||||
return msgr->irq;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -132,7 +132,7 @@ struct paca_struct {
|
||||
u64 saved_msr; /* MSR saved here by enter_rtas */
|
||||
u16 trap_save; /* Used when bad stack is encountered */
|
||||
u8 soft_enabled; /* irq soft-enable flag */
|
||||
u8 hard_enabled; /* set if irqs are enabled in MSR */
|
||||
u8 irq_happened; /* irq happened while soft-disabled */
|
||||
u8 io_sync; /* writel() needs spin_unlock sync */
|
||||
u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */
|
||||
u8 nap_state_lost; /* NV GPR values lost in power7_idle */
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
* Hypervisor-assisted dump
|
||||
*
|
||||
* Linas Vepstas, Manish Ahuja 2008
|
||||
* Copyright 2008 IBM Corp.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef _PPC64_PHYP_DUMP_H
|
||||
#define _PPC64_PHYP_DUMP_H
|
||||
|
||||
#ifdef CONFIG_PHYP_DUMP
|
||||
|
||||
/* The RMR region will be saved for later dumping
|
||||
* whenever the kernel crashes. Set this to 256MB. */
|
||||
#define PHYP_DUMP_RMR_START 0x0
|
||||
#define PHYP_DUMP_RMR_END (1UL<<28)
|
||||
|
||||
struct phyp_dump {
|
||||
/* Memory that is reserved during very early boot. */
|
||||
unsigned long init_reserve_start;
|
||||
unsigned long init_reserve_size;
|
||||
/* cmd line options during boot */
|
||||
unsigned long reserve_bootvar;
|
||||
unsigned long phyp_dump_at_boot;
|
||||
/* Check status during boot if dump supported, active & present*/
|
||||
unsigned long phyp_dump_configured;
|
||||
unsigned long phyp_dump_is_active;
|
||||
/* store cpu & hpte size */
|
||||
unsigned long cpu_state_size;
|
||||
unsigned long hpte_region_size;
|
||||
/* previous scratch area values */
|
||||
unsigned long reserved_scratch_addr;
|
||||
unsigned long reserved_scratch_size;
|
||||
};
|
||||
|
||||
extern struct phyp_dump *phyp_dump_info;
|
||||
|
||||
int early_init_dt_scan_phyp_dump(unsigned long node,
|
||||
const char *uname, int depth, void *data);
|
||||
|
||||
#endif /* CONFIG_PHYP_DUMP */
|
||||
#endif /* _PPC64_PHYP_DUMP_H */
|
||||
@@ -47,92 +47,21 @@ extern int rtas_setup_phb(struct pci_controller *phb);
|
||||
|
||||
extern unsigned long pci_probe_only;
|
||||
|
||||
/* ---- EEH internal-use-only related routines ---- */
|
||||
#ifdef CONFIG_EEH
|
||||
|
||||
void pci_addr_cache_build(void);
|
||||
void pci_addr_cache_insert_device(struct pci_dev *dev);
|
||||
void pci_addr_cache_remove_device(struct pci_dev *dev);
|
||||
void pci_addr_cache_build(void);
|
||||
struct pci_dev *pci_get_device_by_addr(unsigned long addr);
|
||||
|
||||
/**
|
||||
* eeh_slot_error_detail -- record and EEH error condition to the log
|
||||
* @pdn: pci device node
|
||||
* @severity: EEH_LOG_TEMP_FAILURE or EEH_LOG_PERM_FAILURE
|
||||
*
|
||||
* Obtains the EEH error details from the RTAS subsystem,
|
||||
* and then logs these details with the RTAS error log system.
|
||||
*/
|
||||
#define EEH_LOG_TEMP_FAILURE 1
|
||||
#define EEH_LOG_PERM_FAILURE 2
|
||||
void eeh_slot_error_detail (struct pci_dn *pdn, int severity);
|
||||
|
||||
/**
|
||||
* rtas_pci_enable - enable IO transfers for this slot
|
||||
* @pdn: pci device node
|
||||
* @function: either EEH_THAW_MMIO or EEH_THAW_DMA
|
||||
*
|
||||
* Enable I/O transfers to this slot
|
||||
*/
|
||||
#define EEH_THAW_MMIO 2
|
||||
#define EEH_THAW_DMA 3
|
||||
int rtas_pci_enable(struct pci_dn *pdn, int function);
|
||||
|
||||
/**
|
||||
* rtas_set_slot_reset -- unfreeze a frozen slot
|
||||
* @pdn: pci device node
|
||||
*
|
||||
* Clear the EEH-frozen condition on a slot. This routine
|
||||
* does this by asserting the PCI #RST line for 1/8th of
|
||||
* a second; this routine will sleep while the adapter is
|
||||
* being reset.
|
||||
*
|
||||
* Returns a non-zero value if the reset failed.
|
||||
*/
|
||||
int rtas_set_slot_reset (struct pci_dn *);
|
||||
int eeh_wait_for_slot_status(struct pci_dn *pdn, int max_wait_msecs);
|
||||
|
||||
/**
|
||||
* eeh_restore_bars - Restore device configuration info.
|
||||
* @pdn: pci device node
|
||||
*
|
||||
* A reset of a PCI device will clear out its config space.
|
||||
* This routines will restore the config space for this
|
||||
* device, and is children, to values previously obtained
|
||||
* from the firmware.
|
||||
*/
|
||||
void eeh_restore_bars(struct pci_dn *);
|
||||
|
||||
/**
|
||||
* rtas_configure_bridge -- firmware initialization of pci bridge
|
||||
* @pdn: pci device node
|
||||
*
|
||||
* Ask the firmware to configure all PCI bridges devices
|
||||
* located behind the indicated node. Required after a
|
||||
* pci device reset. Does essentially the same hing as
|
||||
* eeh_restore_bars, but for brdges, and lets firmware
|
||||
* do the work.
|
||||
*/
|
||||
void rtas_configure_bridge(struct pci_dn *);
|
||||
|
||||
struct pci_dev *pci_addr_cache_get_device(unsigned long addr);
|
||||
void eeh_slot_error_detail(struct eeh_dev *edev, int severity);
|
||||
int eeh_pci_enable(struct eeh_dev *edev, int function);
|
||||
int eeh_reset_pe(struct eeh_dev *);
|
||||
void eeh_restore_bars(struct eeh_dev *);
|
||||
int rtas_write_config(struct pci_dn *, int where, int size, u32 val);
|
||||
int rtas_read_config(struct pci_dn *, int where, int size, u32 *val);
|
||||
|
||||
/**
|
||||
* eeh_mark_slot -- set mode flags for pertition endpoint
|
||||
* @pdn: pci device node
|
||||
*
|
||||
* mark and clear slots: find "partition endpoint" PE and set or
|
||||
* clear the flags for each subnode of the PE.
|
||||
*/
|
||||
void eeh_mark_slot (struct device_node *dn, int mode_flag);
|
||||
void eeh_clear_slot (struct device_node *dn, int mode_flag);
|
||||
|
||||
/**
|
||||
* find_device_pe -- Find the associated "Partiationable Endpoint" PE
|
||||
* @pdn: pci device node
|
||||
*/
|
||||
struct device_node * find_device_pe(struct device_node *dn);
|
||||
void eeh_mark_slot(struct device_node *dn, int mode_flag);
|
||||
void eeh_clear_slot(struct device_node *dn, int mode_flag);
|
||||
struct device_node *eeh_find_device_pe(struct device_node *dn);
|
||||
|
||||
void eeh_sysfs_add_device(struct pci_dev *pdev);
|
||||
void eeh_sysfs_remove_device(struct pci_dev *pdev);
|
||||
|
||||
@@ -60,6 +60,8 @@ BEGIN_FW_FTR_SECTION; \
|
||||
cmpd cr1,r11,r10; \
|
||||
beq+ cr1,33f; \
|
||||
bl .accumulate_stolen_time; \
|
||||
ld r12,_MSR(r1); \
|
||||
andi. r10,r12,MSR_PR; /* Restore cr0 (coming from user) */ \
|
||||
33: \
|
||||
END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)
|
||||
|
||||
|
||||
@@ -1079,30 +1079,12 @@
|
||||
|
||||
#define proc_trap() asm volatile("trap")
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
|
||||
extern void ppc64_runlatch_on(void);
|
||||
extern void __ppc64_runlatch_off(void);
|
||||
|
||||
#define ppc64_runlatch_off() \
|
||||
do { \
|
||||
if (cpu_has_feature(CPU_FTR_CTRL) && \
|
||||
test_thread_flag(TIF_RUNLATCH)) \
|
||||
__ppc64_runlatch_off(); \
|
||||
} while (0)
|
||||
#define __get_SP() ({unsigned long sp; \
|
||||
asm volatile("mr %0,1": "=r" (sp)); sp;})
|
||||
|
||||
extern unsigned long scom970_read(unsigned int address);
|
||||
extern void scom970_write(unsigned int address, unsigned long value);
|
||||
|
||||
#else
|
||||
#define ppc64_runlatch_on()
|
||||
#define ppc64_runlatch_off()
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
#define __get_SP() ({unsigned long sp; \
|
||||
asm volatile("mr %0,1": "=r" (sp)); sp;})
|
||||
|
||||
struct pt_regs;
|
||||
|
||||
extern void ppc_save_regs(struct pt_regs *regs);
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
#define SPRN_DVC2 0x13F /* Data Value Compare Register 2 */
|
||||
#define SPRN_MAS8 0x155 /* MMU Assist Register 8 */
|
||||
#define SPRN_TLB0PS 0x158 /* TLB 0 Page Size Register */
|
||||
#define SPRN_TLB1PS 0x159 /* TLB 1 Page Size Register */
|
||||
#define SPRN_MAS5_MAS6 0x15c /* MMU Assist Register 5 || 6 */
|
||||
#define SPRN_MAS8_MAS1 0x15d /* MMU Assist Register 8 || 1 */
|
||||
#define SPRN_EPTCFG 0x15e /* Embedded Page Table Config */
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/paca.h>
|
||||
#include <asm/hvcall.h>
|
||||
#include <asm/iseries/hv_call.h>
|
||||
#endif
|
||||
#include <asm/asm-compat.h>
|
||||
#include <asm/synch.h>
|
||||
@@ -95,12 +94,12 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)
|
||||
* value.
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES)
|
||||
#if defined(CONFIG_PPC_SPLPAR)
|
||||
/* We only yield to the hypervisor if we are in shared processor mode */
|
||||
#define SHARED_PROCESSOR (get_lppaca()->shared_proc)
|
||||
extern void __spin_yield(arch_spinlock_t *lock);
|
||||
extern void __rw_yield(arch_rwlock_t *lock);
|
||||
#else /* SPLPAR || ISERIES */
|
||||
#else /* SPLPAR */
|
||||
#define __spin_yield(x) barrier()
|
||||
#define __rw_yield(x) barrier()
|
||||
#define SHARED_PROCESSOR 0
|
||||
|
||||
@@ -550,5 +550,43 @@ extern void reloc_got2(unsigned long);
|
||||
|
||||
extern struct dentry *powerpc_debugfs_root;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
|
||||
extern void __ppc64_runlatch_on(void);
|
||||
extern void __ppc64_runlatch_off(void);
|
||||
|
||||
/*
|
||||
* We manually hard enable-disable, this is called
|
||||
* in the idle loop and we don't want to mess up
|
||||
* with soft-disable/enable & interrupt replay.
|
||||
*/
|
||||
#define ppc64_runlatch_off() \
|
||||
do { \
|
||||
if (cpu_has_feature(CPU_FTR_CTRL) && \
|
||||
test_thread_local_flags(_TLF_RUNLATCH)) { \
|
||||
unsigned long msr = mfmsr(); \
|
||||
__hard_irq_disable(); \
|
||||
__ppc64_runlatch_off(); \
|
||||
if (msr & MSR_EE) \
|
||||
__hard_irq_enable(); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define ppc64_runlatch_on() \
|
||||
do { \
|
||||
if (cpu_has_feature(CPU_FTR_CTRL) && \
|
||||
!test_thread_local_flags(_TLF_RUNLATCH)) { \
|
||||
unsigned long msr = mfmsr(); \
|
||||
__hard_irq_disable(); \
|
||||
__ppc64_runlatch_on(); \
|
||||
if (msr & MSR_EE) \
|
||||
__hard_irq_enable(); \
|
||||
} \
|
||||
} while (0)
|
||||
#else
|
||||
#define ppc64_runlatch_on()
|
||||
#define ppc64_runlatch_off()
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_SYSTEM_H */
|
||||
|
||||
@@ -110,7 +110,6 @@ static inline struct thread_info *current_thread_info(void)
|
||||
#define TIF_NOERROR 12 /* Force successful syscall return */
|
||||
#define TIF_NOTIFY_RESUME 13 /* callback before returning to user */
|
||||
#define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */
|
||||
#define TIF_RUNLATCH 16 /* Is the runlatch enabled? */
|
||||
|
||||
/* as above, but as bit values */
|
||||
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
|
||||
@@ -141,11 +140,13 @@ static inline struct thread_info *current_thread_info(void)
|
||||
#define TLF_SLEEPING 1 /* suspend code enabled SLEEP mode */
|
||||
#define TLF_RESTORE_SIGMASK 2 /* Restore signal mask in do_signal */
|
||||
#define TLF_LAZY_MMU 3 /* tlb_batch is active */
|
||||
#define TLF_RUNLATCH 4 /* Is the runlatch enabled? */
|
||||
|
||||
#define _TLF_NAPPING (1 << TLF_NAPPING)
|
||||
#define _TLF_SLEEPING (1 << TLF_SLEEPING)
|
||||
#define _TLF_RESTORE_SIGMASK (1 << TLF_RESTORE_SIGMASK)
|
||||
#define _TLF_LAZY_MMU (1 << TLF_LAZY_MMU)
|
||||
#define _TLF_RUNLATCH (1 << TLF_RUNLATCH)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define HAVE_SET_RESTORE_SIGMASK 1
|
||||
@@ -156,6 +157,12 @@ static inline void set_restore_sigmask(void)
|
||||
set_bit(TIF_SIGPENDING, &ti->flags);
|
||||
}
|
||||
|
||||
static inline bool test_thread_local_flags(unsigned int flags)
|
||||
{
|
||||
struct thread_info *ti = current_thread_info();
|
||||
return (ti->local_flags & flags) != 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#define is_32bit_task() (test_thread_flag(TIF_32BIT))
|
||||
#else
|
||||
|
||||
@@ -18,11 +18,6 @@
|
||||
#include <linux/percpu.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
#include <asm/paca.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/iseries/hv_call.h>
|
||||
#endif
|
||||
|
||||
/* time.c */
|
||||
extern unsigned long tb_ticks_per_jiffy;
|
||||
@@ -166,15 +161,6 @@ static inline void set_dec(int val)
|
||||
#else
|
||||
#ifndef CONFIG_BOOKE
|
||||
--val;
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
if (firmware_has_feature(FW_FEATURE_ISERIES) &&
|
||||
get_lppaca()->shared_proc) {
|
||||
get_lppaca()->virtual_decr = val;
|
||||
if (get_dec() > val)
|
||||
HvCall_setVirtualDecr();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
mtspr(SPRN_DEC, val);
|
||||
#endif /* not 40x or 8xx_CPU6 */
|
||||
@@ -217,7 +203,6 @@ DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array);
|
||||
#endif
|
||||
|
||||
extern void secondary_cpu_time_init(void);
|
||||
extern void iSeries_time_init_early(void);
|
||||
|
||||
DECLARE_PER_CPU(u64, decrementers_next_tb);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user