Merge tag 'powerpc-4.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc updates from Michael Ellerman: - support "hybrid" iommu/direct DMA ops for coherent_mask < dma_mask from Benjamin Herrenschmidt - EEH fixes for SRIOV from Gavin - introduce rtas_get_sensor_fast() for IRQ handlers from Thomas Huth - use hardware RNG for arch_get_random_seed_* not arch_get_random_* from Paul Mackerras - seccomp filter support from Michael Ellerman - opal_cec_reboot2() handling for HMIs & machine checks from Mahesh Salgaonkar - add powerpc timebase as a trace clock source from Naveen N. Rao - misc cleanups in the xmon, signal & SLB code from Anshuman Khandual - add an inline function to update POWER8 HID0 from Gautham R. Shenoy - fix pte_pagesize_index() crash on 4K w/64K hash from Michael Ellerman - drop support for 64K local store on 4K kernels from Michael Ellerman - move dma_get_required_mask() from pnv_phb to pci_controller_ops from Andrew Donnellan - initialize distance lookup table from drconf path from Nikunj A Dadhania - enable RTC class support from Vaibhav Jain - disable automatically blocked PCI config from Gavin Shan - add LEDs driver for PowerNV platform from Vasant Hegde - fix endianness issues in the HVSI driver from Laurent Dufour - kexec endian fixes from Samuel Mendoza-Jonas - fix corrupted pdn list from Gavin Shan - fix fenced PHB caused by eeh_slot_error_detail() from Gavin Shan - Freescale updates from Scott: Highlights include 32-bit memcpy/memset optimizations, checksum optimizations, 85xx config fragments and updates, device tree updates, e6500 fixes for non-SMP, and misc cleanup and minor fixes. - a ton of cxl updates & fixes: - add explicit precision specifiers from Rasmus Villemoes - use more common format specifier from Rasmus Villemoes - destroy cxl_adapter_idr on module_exit from Johannes Thumshirn - destroy afu->contexts_idr on release of an afu from Johannes Thumshirn - compile with -Werror from Daniel Axtens - EEH support from Daniel Axtens - plug irq_bitmap getting leaked in cxl_context from Vaibhav Jain - add alternate MMIO error handling from Ian Munsie - allow release of contexts which have been OPENED but not STARTED from Andrew Donnellan - remove use of macro DEFINE_PCI_DEVICE_TABLE from Vaishali Thakkar - release irqs if memory allocation fails from Vaibhav Jain - remove racy attempt to force EEH invocation in reset from Daniel Axtens - fix + cleanup error paths in cxl_dev_context_init from Ian Munsie - fix force unmapping mmaps of contexts allocated through the kernel api from Ian Munsie - set up and enable PSL Timebase from Philippe Bergheaud * tag 'powerpc-4.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: (140 commits) cxl: Set up and enable PSL Timebase cxl: Fix force unmapping mmaps of contexts allocated through the kernel api cxl: Fix + cleanup error paths in cxl_dev_context_init powerpc/eeh: Fix fenced PHB caused by eeh_slot_error_detail() powerpc/pseries: Cleanup on pci_dn_reconfig_notifier() powerpc/pseries: Fix corrupted pdn list powerpc/powernv: Enable LEDS support powerpc/iommu: Set default DMA offset in dma_dev_setup cxl: Remove racy attempt to force EEH invocation in reset cxl: Release irqs if memory allocation fails cxl: Remove use of macro DEFINE_PCI_DEVICE_TABLE powerpc/powernv: Fix mis-merge of OPAL support for LEDS driver powerpc/powernv: Reset HILE before kexec_sequence() powerpc/kexec: Reset secondary cpu endianness before kexec powerpc/hvsi: Fix endianness issues in the HVSI driver leds/powernv: Add driver for PowerNV platform powerpc/powernv: Create LED platform device powerpc/powernv: Add OPAL interfaces for accessing and modifying system LED states powerpc/powernv: Fix the log message when disabling VF cxl: Allow release of contexts which have been OPENED but not STARTED ...
このコミットが含まれているのは:
@@ -6,5 +6,4 @@ generic-y += local64.h
|
||||
generic-y += mcs_spinlock.h
|
||||
generic-y += preempt.h
|
||||
generic-y += rwsem.h
|
||||
generic-y += trace_clock.h
|
||||
generic-y += vtime.h
|
||||
|
@@ -7,13 +7,22 @@
|
||||
|
||||
static inline int arch_get_random_long(unsigned long *v)
|
||||
{
|
||||
if (ppc_md.get_random_long)
|
||||
return ppc_md.get_random_long(v);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int arch_get_random_int(unsigned int *v)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int arch_get_random_seed_long(unsigned long *v)
|
||||
{
|
||||
if (ppc_md.get_random_seed)
|
||||
return ppc_md.get_random_seed(v);
|
||||
|
||||
return 0;
|
||||
}
|
||||
static inline int arch_get_random_seed_int(unsigned int *v)
|
||||
{
|
||||
unsigned long val;
|
||||
int rc;
|
||||
@@ -27,22 +36,13 @@ static inline int arch_get_random_int(unsigned int *v)
|
||||
|
||||
static inline int arch_has_random(void)
|
||||
{
|
||||
return !!ppc_md.get_random_long;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int arch_get_random_seed_long(unsigned long *v)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int arch_get_random_seed_int(unsigned int *v)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int arch_has_random_seed(void)
|
||||
{
|
||||
return 0;
|
||||
return !!ppc_md.get_random_seed;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_ARCH_RANDOM */
|
||||
|
||||
#ifdef CONFIG_PPC_POWERNV
|
||||
|
@@ -40,7 +40,12 @@ extern void __flush_dcache_icache(void *page_va);
|
||||
extern void flush_dcache_icache_page(struct page *page);
|
||||
#if defined(CONFIG_PPC32) && !defined(CONFIG_BOOKE)
|
||||
extern void __flush_dcache_icache_phys(unsigned long physaddr);
|
||||
#endif /* CONFIG_PPC32 && !CONFIG_BOOKE */
|
||||
#else
|
||||
static inline void __flush_dcache_icache_phys(unsigned long physaddr)
|
||||
{
|
||||
BUG();
|
||||
}
|
||||
#endif
|
||||
|
||||
extern void flush_dcache_range(unsigned long start, unsigned long stop);
|
||||
#ifdef CONFIG_PPC32
|
||||
|
@@ -19,15 +19,6 @@
|
||||
#else
|
||||
extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
|
||||
|
||||
/*
|
||||
* computes the checksum of the TCP/UDP pseudo-header
|
||||
* returns a 16-bit checksum, already complemented
|
||||
*/
|
||||
extern __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
|
||||
unsigned short len,
|
||||
unsigned short proto,
|
||||
__wsum sum);
|
||||
|
||||
/*
|
||||
* computes the checksum of a memory block at buff, length len,
|
||||
* and adds in "sum" (32-bit)
|
||||
@@ -127,6 +118,34 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* computes the checksum of the TCP/UDP pseudo-header
|
||||
* returns a 16-bit checksum, already complemented
|
||||
*/
|
||||
static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr,
|
||||
unsigned short len,
|
||||
unsigned short proto,
|
||||
__wsum sum)
|
||||
{
|
||||
return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
|
||||
}
|
||||
|
||||
#define HAVE_ARCH_CSUM_ADD
|
||||
static inline __wsum csum_add(__wsum csum, __wsum addend)
|
||||
{
|
||||
#ifdef __powerpc64__
|
||||
u64 res = (__force u64)csum;
|
||||
|
||||
res += (__force u64)addend;
|
||||
return (__force __wsum)((u32)res + (res >> 32));
|
||||
#else
|
||||
asm("addc %0,%0,%1;"
|
||||
"addze %0,%0;"
|
||||
: "+r" (csum) : "r" (addend));
|
||||
return csum;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* __KERNEL__ */
|
||||
#endif
|
||||
|
@@ -174,6 +174,13 @@ typedef struct compat_siginfo {
|
||||
int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
|
||||
int _fd;
|
||||
} _sigpoll;
|
||||
|
||||
/* SIGSYS */
|
||||
struct {
|
||||
unsigned int _call_addr; /* calling insn */
|
||||
int _syscall; /* triggering system call number */
|
||||
unsigned int _arch; /* AUDIT_ARCH_* of syscall */
|
||||
} _sigsys;
|
||||
} _sifields;
|
||||
} compat_siginfo_t;
|
||||
|
||||
|
@@ -10,6 +10,7 @@ struct dma_map_ops;
|
||||
struct device_node;
|
||||
#ifdef CONFIG_PPC64
|
||||
struct pci_dn;
|
||||
struct iommu_table;
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -23,13 +24,15 @@ struct dev_archdata {
|
||||
struct dma_map_ops *dma_ops;
|
||||
|
||||
/*
|
||||
* When an iommu is in use, dma_data is used as a ptr to the base of the
|
||||
* iommu_table. Otherwise, it is a simple numerical offset.
|
||||
* These two used to be a union. However, with the hybrid ops we need
|
||||
* both so here we store both a DMA offset for direct mappings and
|
||||
* an iommu_table for remapped DMA.
|
||||
*/
|
||||
union {
|
||||
dma_addr_t dma_offset;
|
||||
void *iommu_table_base;
|
||||
} dma_data;
|
||||
dma_addr_t dma_offset;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
struct iommu_table *iommu_table_base;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IOMMU_API
|
||||
void *iommu_domain;
|
||||
|
@@ -21,12 +21,12 @@
|
||||
#define DMA_ERROR_CODE (~(dma_addr_t)0x0)
|
||||
|
||||
/* Some dma direct funcs must be visible for use in other dma_ops */
|
||||
extern void *dma_direct_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag,
|
||||
extern void *__dma_direct_alloc_coherent(struct device *dev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag,
|
||||
struct dma_attrs *attrs);
|
||||
extern void __dma_direct_free_coherent(struct device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle,
|
||||
struct dma_attrs *attrs);
|
||||
extern void dma_direct_free_coherent(struct device *dev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle,
|
||||
struct dma_attrs *attrs);
|
||||
extern int dma_direct_mmap_coherent(struct device *dev,
|
||||
struct vm_area_struct *vma,
|
||||
void *cpu_addr, dma_addr_t handle,
|
||||
@@ -106,7 +106,7 @@ static inline void set_dma_ops(struct device *dev, struct dma_map_ops *ops)
|
||||
static inline dma_addr_t get_dma_offset(struct device *dev)
|
||||
{
|
||||
if (dev)
|
||||
return dev->archdata.dma_data.dma_offset;
|
||||
return dev->archdata.dma_offset;
|
||||
|
||||
return PCI_DRAM_OFFSET;
|
||||
}
|
||||
@@ -114,7 +114,7 @@ static inline dma_addr_t get_dma_offset(struct device *dev)
|
||||
static inline void set_dma_offset(struct device *dev, dma_addr_t off)
|
||||
{
|
||||
if (dev)
|
||||
dev->archdata.dma_data.dma_offset = off;
|
||||
dev->archdata.dma_offset = off;
|
||||
}
|
||||
|
||||
/* this will be removed soon */
|
||||
|
@@ -2,17 +2,17 @@
|
||||
* Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation
|
||||
* Rewrite, cleanup:
|
||||
* Copyright (C) 2004 Olof Johansson <olof@lixom.net>, 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
|
||||
@@ -131,16 +131,21 @@ int get_iommu_order(unsigned long size, struct iommu_table *tbl)
|
||||
|
||||
struct scatterlist;
|
||||
|
||||
static inline void set_iommu_table_base(struct device *dev, void *base)
|
||||
#ifdef CONFIG_PPC64
|
||||
|
||||
static inline void set_iommu_table_base(struct device *dev,
|
||||
struct iommu_table *base)
|
||||
{
|
||||
dev->archdata.dma_data.iommu_table_base = base;
|
||||
dev->archdata.iommu_table_base = base;
|
||||
}
|
||||
|
||||
static inline void *get_iommu_table_base(struct device *dev)
|
||||
{
|
||||
return dev->archdata.dma_data.iommu_table_base;
|
||||
return dev->archdata.iommu_table_base;
|
||||
}
|
||||
|
||||
extern int dma_iommu_dma_supported(struct device *dev, u64 mask);
|
||||
|
||||
/* Frees table for an individual device node */
|
||||
extern void iommu_free_table(struct iommu_table *tbl, const char *node_name);
|
||||
|
||||
@@ -225,6 +230,20 @@ static inline int __init tce_iommu_bus_notifier_init(void)
|
||||
}
|
||||
#endif /* !CONFIG_IOMMU_API */
|
||||
|
||||
#else
|
||||
|
||||
static inline void *get_iommu_table_base(struct device *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int dma_iommu_dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
extern int ppc_iommu_map_sg(struct device *dev, struct iommu_table *tbl,
|
||||
struct scatterlist *sglist, int nelems,
|
||||
unsigned long mask,
|
||||
|
@@ -249,7 +249,7 @@ struct machdep_calls {
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_RANDOM
|
||||
int (*get_random_long)(unsigned long *v);
|
||||
int (*get_random_seed)(unsigned long *v);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@@ -154,7 +154,10 @@
|
||||
#define OPAL_FLASH_WRITE 111
|
||||
#define OPAL_FLASH_ERASE 112
|
||||
#define OPAL_PRD_MSG 113
|
||||
#define OPAL_LAST 113
|
||||
#define OPAL_LEDS_GET_INDICATOR 114
|
||||
#define OPAL_LEDS_SET_INDICATOR 115
|
||||
#define OPAL_CEC_REBOOT2 116
|
||||
#define OPAL_LAST 116
|
||||
|
||||
/* Device tree flags */
|
||||
|
||||
@@ -340,6 +343,18 @@ enum OpalPciResetState {
|
||||
OPAL_ASSERT_RESET = 1
|
||||
};
|
||||
|
||||
enum OpalSlotLedType {
|
||||
OPAL_SLOT_LED_TYPE_ID = 0, /* IDENTIFY LED */
|
||||
OPAL_SLOT_LED_TYPE_FAULT = 1, /* FAULT LED */
|
||||
OPAL_SLOT_LED_TYPE_ATTN = 2, /* System Attention LED */
|
||||
OPAL_SLOT_LED_TYPE_MAX = 3
|
||||
};
|
||||
|
||||
enum OpalSlotLedState {
|
||||
OPAL_SLOT_LED_STATE_OFF = 0, /* LED is OFF */
|
||||
OPAL_SLOT_LED_STATE_ON = 1 /* LED is ON */
|
||||
};
|
||||
|
||||
/*
|
||||
* Address cycle types for LPC accesses. These also correspond
|
||||
* to the content of the first cell of the "reg" property for
|
||||
@@ -438,6 +453,7 @@ struct OpalMemoryErrorData {
|
||||
/* HMI interrupt event */
|
||||
enum OpalHMI_Version {
|
||||
OpalHMIEvt_V1 = 1,
|
||||
OpalHMIEvt_V2 = 2,
|
||||
};
|
||||
|
||||
enum OpalHMI_Severity {
|
||||
@@ -468,6 +484,49 @@ enum OpalHMI_ErrType {
|
||||
OpalHMI_ERROR_CAPP_RECOVERY,
|
||||
};
|
||||
|
||||
enum OpalHMI_XstopType {
|
||||
CHECKSTOP_TYPE_UNKNOWN = 0,
|
||||
CHECKSTOP_TYPE_CORE = 1,
|
||||
CHECKSTOP_TYPE_NX = 2,
|
||||
};
|
||||
|
||||
enum OpalHMI_CoreXstopReason {
|
||||
CORE_CHECKSTOP_IFU_REGFILE = 0x00000001,
|
||||
CORE_CHECKSTOP_IFU_LOGIC = 0x00000002,
|
||||
CORE_CHECKSTOP_PC_DURING_RECOV = 0x00000004,
|
||||
CORE_CHECKSTOP_ISU_REGFILE = 0x00000008,
|
||||
CORE_CHECKSTOP_ISU_LOGIC = 0x00000010,
|
||||
CORE_CHECKSTOP_FXU_LOGIC = 0x00000020,
|
||||
CORE_CHECKSTOP_VSU_LOGIC = 0x00000040,
|
||||
CORE_CHECKSTOP_PC_RECOV_IN_MAINT_MODE = 0x00000080,
|
||||
CORE_CHECKSTOP_LSU_REGFILE = 0x00000100,
|
||||
CORE_CHECKSTOP_PC_FWD_PROGRESS = 0x00000200,
|
||||
CORE_CHECKSTOP_LSU_LOGIC = 0x00000400,
|
||||
CORE_CHECKSTOP_PC_LOGIC = 0x00000800,
|
||||
CORE_CHECKSTOP_PC_HYP_RESOURCE = 0x00001000,
|
||||
CORE_CHECKSTOP_PC_HANG_RECOV_FAILED = 0x00002000,
|
||||
CORE_CHECKSTOP_PC_AMBI_HANG_DETECTED = 0x00004000,
|
||||
CORE_CHECKSTOP_PC_DEBUG_TRIG_ERR_INJ = 0x00008000,
|
||||
CORE_CHECKSTOP_PC_SPRD_HYP_ERR_INJ = 0x00010000,
|
||||
};
|
||||
|
||||
enum OpalHMI_NestAccelXstopReason {
|
||||
NX_CHECKSTOP_SHM_INVAL_STATE_ERR = 0x00000001,
|
||||
NX_CHECKSTOP_DMA_INVAL_STATE_ERR_1 = 0x00000002,
|
||||
NX_CHECKSTOP_DMA_INVAL_STATE_ERR_2 = 0x00000004,
|
||||
NX_CHECKSTOP_DMA_CH0_INVAL_STATE_ERR = 0x00000008,
|
||||
NX_CHECKSTOP_DMA_CH1_INVAL_STATE_ERR = 0x00000010,
|
||||
NX_CHECKSTOP_DMA_CH2_INVAL_STATE_ERR = 0x00000020,
|
||||
NX_CHECKSTOP_DMA_CH3_INVAL_STATE_ERR = 0x00000040,
|
||||
NX_CHECKSTOP_DMA_CH4_INVAL_STATE_ERR = 0x00000080,
|
||||
NX_CHECKSTOP_DMA_CH5_INVAL_STATE_ERR = 0x00000100,
|
||||
NX_CHECKSTOP_DMA_CH6_INVAL_STATE_ERR = 0x00000200,
|
||||
NX_CHECKSTOP_DMA_CH7_INVAL_STATE_ERR = 0x00000400,
|
||||
NX_CHECKSTOP_DMA_CRB_UE = 0x00000800,
|
||||
NX_CHECKSTOP_DMA_CRB_SUE = 0x00001000,
|
||||
NX_CHECKSTOP_PBI_ISN_UE = 0x00002000,
|
||||
};
|
||||
|
||||
struct OpalHMIEvent {
|
||||
uint8_t version; /* 0x00 */
|
||||
uint8_t severity; /* 0x01 */
|
||||
@@ -478,6 +537,23 @@ struct OpalHMIEvent {
|
||||
__be64 hmer;
|
||||
/* TFMR register. Valid only for TFAC and TFMR_PARITY error type. */
|
||||
__be64 tfmr;
|
||||
|
||||
/* version 2 and later */
|
||||
union {
|
||||
/*
|
||||
* checkstop info (Core/NX).
|
||||
* Valid for OpalHMI_ERROR_MALFUNC_ALERT.
|
||||
*/
|
||||
struct {
|
||||
uint8_t xstop_type; /* enum OpalHMI_XstopType */
|
||||
uint8_t reserved_1[3];
|
||||
__be32 xstop_reason;
|
||||
union {
|
||||
__be32 pir; /* for CHECKSTOP_TYPE_CORE */
|
||||
__be32 chip_id; /* for CHECKSTOP_TYPE_NX */
|
||||
} u;
|
||||
} xstop_error;
|
||||
} u;
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -768,6 +844,52 @@ struct opal_i2c_request {
|
||||
__be64 buffer_ra; /* Buffer real address */
|
||||
};
|
||||
|
||||
/*
|
||||
* EPOW status sharing (OPAL and the host)
|
||||
*
|
||||
* The host will pass on OPAL, a buffer of length OPAL_SYSEPOW_MAX
|
||||
* with individual elements being 16 bits wide to fetch the system
|
||||
* wide EPOW status. Each element in the buffer will contain the
|
||||
* EPOW status in it's bit representation for a particular EPOW sub
|
||||
* class as defiend here. So multiple detailed EPOW status bits
|
||||
* specific for any sub class can be represented in a single buffer
|
||||
* element as it's bit representation.
|
||||
*/
|
||||
|
||||
/* System EPOW type */
|
||||
enum OpalSysEpow {
|
||||
OPAL_SYSEPOW_POWER = 0, /* Power EPOW */
|
||||
OPAL_SYSEPOW_TEMP = 1, /* Temperature EPOW */
|
||||
OPAL_SYSEPOW_COOLING = 2, /* Cooling EPOW */
|
||||
OPAL_SYSEPOW_MAX = 3, /* Max EPOW categories */
|
||||
};
|
||||
|
||||
/* Power EPOW */
|
||||
enum OpalSysPower {
|
||||
OPAL_SYSPOWER_UPS = 0x0001, /* System on UPS power */
|
||||
OPAL_SYSPOWER_CHNG = 0x0002, /* System power config change */
|
||||
OPAL_SYSPOWER_FAIL = 0x0004, /* System impending power failure */
|
||||
OPAL_SYSPOWER_INCL = 0x0008, /* System incomplete power */
|
||||
};
|
||||
|
||||
/* Temperature EPOW */
|
||||
enum OpalSysTemp {
|
||||
OPAL_SYSTEMP_AMB = 0x0001, /* System over ambient temperature */
|
||||
OPAL_SYSTEMP_INT = 0x0002, /* System over internal temperature */
|
||||
OPAL_SYSTEMP_HMD = 0x0004, /* System over ambient humidity */
|
||||
};
|
||||
|
||||
/* Cooling EPOW */
|
||||
enum OpalSysCooling {
|
||||
OPAL_SYSCOOL_INSF = 0x0001, /* System insufficient cooling */
|
||||
};
|
||||
|
||||
/* Argument to OPAL_CEC_REBOOT2() */
|
||||
enum {
|
||||
OPAL_REBOOT_NORMAL = 0,
|
||||
OPAL_REBOOT_PLATFORM_ERROR = 1,
|
||||
};
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __OPAL_API_H */
|
||||
|
@@ -44,6 +44,7 @@ int64_t opal_tpo_write(uint64_t token, uint32_t year_mon_day,
|
||||
uint32_t hour_min);
|
||||
int64_t opal_cec_power_down(uint64_t request);
|
||||
int64_t opal_cec_reboot(void);
|
||||
int64_t opal_cec_reboot2(uint32_t reboot_type, char *diag);
|
||||
int64_t opal_read_nvram(uint64_t buffer, uint64_t size, uint64_t offset);
|
||||
int64_t opal_write_nvram(uint64_t buffer, uint64_t size, uint64_t offset);
|
||||
int64_t opal_handle_interrupt(uint64_t isn, __be64 *outstanding_event_mask);
|
||||
@@ -141,7 +142,8 @@ int64_t opal_pci_fence_phb(uint64_t phb_id);
|
||||
int64_t opal_pci_reinit(uint64_t phb_id, uint64_t reinit_scope, uint64_t data);
|
||||
int64_t opal_pci_mask_pe_error(uint64_t phb_id, uint16_t pe_number, uint8_t error_type, uint8_t mask_action);
|
||||
int64_t opal_set_slot_led_status(uint64_t phb_id, uint64_t slot_id, uint8_t led_type, uint8_t led_action);
|
||||
int64_t opal_get_epow_status(__be64 *status);
|
||||
int64_t opal_get_epow_status(__be16 *epow_status, __be16 *num_epow_classes);
|
||||
int64_t opal_get_dpo_status(__be64 *dpo_timeout);
|
||||
int64_t opal_set_system_attention_led(uint8_t led_action);
|
||||
int64_t opal_pci_next_error(uint64_t phb_id, __be64 *first_frozen_pe,
|
||||
__be16 *pci_error_type, __be16 *severity);
|
||||
@@ -195,6 +197,10 @@ int64_t opal_ipmi_recv(uint64_t interface, struct opal_ipmi_msg *msg,
|
||||
int64_t opal_i2c_request(uint64_t async_token, uint32_t bus_id,
|
||||
struct opal_i2c_request *oreq);
|
||||
int64_t opal_prd_msg(struct opal_prd_msg *msg);
|
||||
int64_t opal_leds_get_ind(char *loc_code, __be64 *led_mask,
|
||||
__be64 *led_value, __be64 *max_led_type);
|
||||
int64_t opal_leds_set_ind(uint64_t token, char *loc_code, const u64 led_mask,
|
||||
const u64 led_value, __be64 *max_led_type);
|
||||
|
||||
int64_t opal_flash_read(uint64_t id, uint64_t offset, uint64_t buf,
|
||||
uint64_t size, uint64_t token);
|
||||
|
@@ -42,6 +42,7 @@ struct pci_controller_ops {
|
||||
#endif
|
||||
|
||||
int (*dma_set_mask)(struct pci_dev *dev, u64 dma_mask);
|
||||
u64 (*dma_get_required_mask)(struct pci_dev *dev);
|
||||
|
||||
void (*shutdown)(struct pci_controller *);
|
||||
};
|
||||
|
@@ -134,11 +134,11 @@
|
||||
|
||||
#define pte_iterate_hashed_end() } while(0)
|
||||
|
||||
#ifdef CONFIG_PPC_HAS_HASH_64K
|
||||
#define pte_pagesize_index(mm, addr, pte) get_slice_psize(mm, addr)
|
||||
#else
|
||||
/*
|
||||
* We expect this to be called only for user addresses or kernel virtual
|
||||
* addresses other than the linear mapping.
|
||||
*/
|
||||
#define pte_pagesize_index(mm, addr, pte) MMU_PAGE_4K
|
||||
#endif
|
||||
|
||||
#endif /* __real_pte */
|
||||
|
||||
|
@@ -169,6 +169,17 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
|
||||
* cases, and 32-bit non-hash with 32-bit PTEs.
|
||||
*/
|
||||
*ptep = pte;
|
||||
|
||||
#ifdef CONFIG_PPC_BOOK3E_64
|
||||
/*
|
||||
* With hardware tablewalk, a sync is needed to ensure that
|
||||
* subsequent accesses see the PTE we just wrote. Unlike userspace
|
||||
* mappings, we can't tolerate spurious faults, so make sure
|
||||
* the new PTE will be seen the first time.
|
||||
*/
|
||||
if (is_kernel_addr(addr))
|
||||
mb();
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -61,6 +61,7 @@ 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);
|
||||
void eeh_pe_state_mark(struct eeh_pe *pe, int state);
|
||||
void eeh_pe_state_clear(struct eeh_pe *pe, int state);
|
||||
void eeh_pe_state_mark_with_cfg(struct eeh_pe *pe, int state);
|
||||
void eeh_pe_dev_mode_mark(struct eeh_pe *pe, int mode);
|
||||
|
||||
void eeh_sysfs_add_device(struct pci_dev *pdev);
|
||||
|
@@ -264,7 +264,6 @@ struct thread_struct {
|
||||
u64 tm_tfhar; /* Transaction fail handler addr */
|
||||
u64 tm_texasr; /* Transaction exception & summary */
|
||||
u64 tm_tfiar; /* Transaction fail instr address reg */
|
||||
unsigned long tm_orig_msr; /* Thread's MSR on ctx switch */
|
||||
struct pt_regs ckpt_regs; /* Checkpointed registers */
|
||||
|
||||
unsigned long tm_tar;
|
||||
|
@@ -109,7 +109,8 @@ extern unsigned long bad_call_to_PMD_PAGE_SIZE(void);
|
||||
* the processor might need it for DMA coherency.
|
||||
*/
|
||||
#define _PAGE_BASE_NC (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_PSIZE)
|
||||
#if defined(CONFIG_SMP) || defined(CONFIG_PPC_STD_MMU)
|
||||
#if defined(CONFIG_SMP) || defined(CONFIG_PPC_STD_MMU) || \
|
||||
defined(CONFIG_PPC_E500MC)
|
||||
#define _PAGE_BASE (_PAGE_BASE_NC | _PAGE_COHERENT)
|
||||
#else
|
||||
#define _PAGE_BASE (_PAGE_BASE_NC)
|
||||
|
@@ -1193,8 +1193,7 @@
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
#define __mtmsrd(v, l) asm volatile("mtmsrd %0," __stringify(l) \
|
||||
: : "r" (v) : "memory")
|
||||
#define mtmsrd(v) __mtmsrd((v), 0)
|
||||
#define mtmsr(v) mtmsrd(v)
|
||||
#define mtmsr(v) __mtmsrd((v), 0)
|
||||
#else
|
||||
#define mtmsr(v) asm volatile("mtmsr %0" : \
|
||||
: "r" ((unsigned long)(v)) \
|
||||
@@ -1281,6 +1280,15 @@ struct pt_regs;
|
||||
|
||||
extern void ppc_save_regs(struct pt_regs *regs);
|
||||
|
||||
static inline void update_power8_hid0(unsigned long hid0)
|
||||
{
|
||||
/*
|
||||
* The HID0 update on Power8 should at the very least be
|
||||
* preceded by a a SYNC instruction followed by an ISYNC
|
||||
* instruction
|
||||
*/
|
||||
asm volatile("sync; mtspr %0,%1; isync":: "i"(SPRN_HID0), "r"(hid0));
|
||||
}
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_REG_H */
|
||||
|
@@ -343,6 +343,7 @@ extern void rtas_power_off(void);
|
||||
extern void rtas_halt(void);
|
||||
extern void rtas_os_term(char *str);
|
||||
extern int rtas_get_sensor(int sensor, int index, int *state);
|
||||
extern int rtas_get_sensor_fast(int sensor, int index, int *state);
|
||||
extern int rtas_get_power_level(int powerdomain, int *level);
|
||||
extern int rtas_set_power_level(int powerdomain, int level, int *setlevel);
|
||||
extern bool rtas_indicator_present(int token, int *maxindex);
|
||||
|
@@ -241,12 +241,6 @@ struct spu_priv2_collapsed {
|
||||
*/
|
||||
struct spu_state {
|
||||
struct spu_lscsa *lscsa;
|
||||
#ifdef CONFIG_SPU_FS_64K_LS
|
||||
int use_big_pages;
|
||||
/* One struct page per 64k page */
|
||||
#define SPU_LSCSA_NUM_BIG_PAGES (sizeof(struct spu_lscsa) / 0x10000)
|
||||
struct page *lscsa_pages[SPU_LSCSA_NUM_BIG_PAGES];
|
||||
#endif
|
||||
struct spu_problem_collapsed prob;
|
||||
struct spu_priv1_collapsed priv1;
|
||||
struct spu_priv2_collapsed priv2;
|
||||
|
@@ -22,10 +22,15 @@
|
||||
extern const unsigned long sys_call_table[];
|
||||
#endif /* CONFIG_FTRACE_SYSCALLS */
|
||||
|
||||
static inline long syscall_get_nr(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
|
||||
{
|
||||
return TRAP(regs) == 0xc00 ? regs->gpr[0] : -1L;
|
||||
/*
|
||||
* Note that we are returning an int here. That means 0xffffffff, ie.
|
||||
* 32-bit negative 1, will be interpreted as -1 on a 64-bit kernel.
|
||||
* This is important for seccomp so that compat tasks can set r0 = -1
|
||||
* to reject the syscall.
|
||||
*/
|
||||
return TRAP(regs) == 0xc00 ? regs->gpr[0] : -1;
|
||||
}
|
||||
|
||||
static inline void syscall_rollback(struct task_struct *task,
|
||||
@@ -34,12 +39,6 @@ static inline void syscall_rollback(struct task_struct *task,
|
||||
regs->gpr[3] = regs->orig_gpr3;
|
||||
}
|
||||
|
||||
static inline long syscall_get_error(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
return (regs->ccr & 0x10000000) ? -regs->gpr[3] : 0;
|
||||
}
|
||||
|
||||
static inline long syscall_get_return_value(struct task_struct *task,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
@@ -50,9 +49,15 @@ static inline void syscall_set_return_value(struct task_struct *task,
|
||||
struct pt_regs *regs,
|
||||
int error, long val)
|
||||
{
|
||||
/*
|
||||
* In the general case it's not obvious that we must deal with CCR
|
||||
* here, as the syscall exit path will also do that for us. However
|
||||
* there are some places, eg. the signal code, which check ccr to
|
||||
* decide if the value in r3 is actually an error.
|
||||
*/
|
||||
if (error) {
|
||||
regs->ccr |= 0x10000000L;
|
||||
regs->gpr[3] = -error;
|
||||
regs->gpr[3] = error;
|
||||
} else {
|
||||
regs->ccr &= ~0x10000000L;
|
||||
regs->gpr[3] = val;
|
||||
@@ -64,19 +69,22 @@ static inline void syscall_get_arguments(struct task_struct *task,
|
||||
unsigned int i, unsigned int n,
|
||||
unsigned long *args)
|
||||
{
|
||||
unsigned long val, mask = -1UL;
|
||||
|
||||
BUG_ON(i + n > 6);
|
||||
#ifdef CONFIG_PPC64
|
||||
if (test_tsk_thread_flag(task, TIF_32BIT)) {
|
||||
/*
|
||||
* Zero-extend 32-bit argument values. The high bits are
|
||||
* garbage ignored by the actual syscall dispatch.
|
||||
*/
|
||||
while (n-- > 0)
|
||||
args[n] = (u32) regs->gpr[3 + i + n];
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
if (test_tsk_thread_flag(task, TIF_32BIT))
|
||||
mask = 0xffffffff;
|
||||
#endif
|
||||
memcpy(args, ®s->gpr[3 + i], n * sizeof(args[0]));
|
||||
while (n--) {
|
||||
if (n == 0 && i == 0)
|
||||
val = regs->orig_gpr3;
|
||||
else
|
||||
val = regs->gpr[3 + i + n];
|
||||
|
||||
args[n] = val & mask;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void syscall_set_arguments(struct task_struct *task,
|
||||
@@ -86,6 +94,10 @@ static inline void syscall_set_arguments(struct task_struct *task,
|
||||
{
|
||||
BUG_ON(i + n > 6);
|
||||
memcpy(®s->gpr[3 + i], args, n * sizeof(args[0]));
|
||||
|
||||
/* Also copy the first argument into orig_gpr3 */
|
||||
if (i == 0 && n > 0)
|
||||
regs->orig_gpr3 = args[0];
|
||||
}
|
||||
|
||||
static inline int syscall_get_arch(void)
|
||||
|
19
arch/powerpc/include/asm/trace_clock.h
ノーマルファイル
19
arch/powerpc/include/asm/trace_clock.h
ノーマルファイル
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License, version 2, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Copyright (C) 2015 Naveen N. Rao, IBM Corporation
|
||||
*/
|
||||
|
||||
#ifndef _ASM_PPC_TRACE_CLOCK_H
|
||||
#define _ASM_PPC_TRACE_CLOCK_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
extern u64 notrace trace_clock_ppc_tb(void);
|
||||
|
||||
#define ARCH_TRACE_CLOCKS { trace_clock_ppc_tb, "ppc-tb", 0 },
|
||||
|
||||
#endif /* _ASM_PPC_TRACE_CLOCK_H */
|
新しいイシューから参照
ユーザーをブロックする